org.jivesoftware.smack.provider.IQProvider Java Examples

The following examples show how to use org.jivesoftware.smack.provider.IQProvider. You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: PacketParserUtils.java    From AndroidPNClient with Apache License 2.0 4 votes vote down vote up
/**
 * Parses an IQ packet.
 *
 * @param parser the XML parser, positioned at the start of an IQ packet.
 * @return an IQ object.
 * @throws Exception if an exception occurs while parsing the packet.
 */
public static IQ parseIQ(XmlPullParser parser, Connection connection) throws Exception {
    IQ iqPacket = null;

    String id = parser.getAttributeValue("", "id");
    String to = parser.getAttributeValue("", "to");
    String from = parser.getAttributeValue("", "from");
    IQ.Type type = IQ.Type.fromString(parser.getAttributeValue("", "type"));
    XMPPError error = null;

    boolean done = false;
    while (!done) {
        int eventType = parser.next();

        if (eventType == XmlPullParser.START_TAG) {
            String elementName = parser.getName();
            String namespace = parser.getNamespace();
            if (elementName.equals("error")) {
                error = PacketParserUtils.parseError(parser);
            }
            else if (elementName.equals("query") && namespace.equals("jabber:iq:auth")) {
                iqPacket = parseAuthentication(parser);
            }
            else if (elementName.equals("query") && namespace.equals("jabber:iq:roster")) {
                iqPacket = parseRoster(parser);
            }
            else if (elementName.equals("query") && namespace.equals("jabber:iq:register")) {
                iqPacket = parseRegistration(parser);
            }
            else if (elementName.equals("bind") &&
                    namespace.equals("urn:ietf:params:xml:ns:xmpp-bind")) {
                iqPacket = parseResourceBinding(parser);
            }
            // Otherwise, see if there is a registered provider for
            // this element name and namespace.
            else {
                Object provider = ProviderManager.getInstance().getIQProvider(elementName, namespace);
                if (provider != null) {
                    if (provider instanceof IQProvider) {
                        iqPacket = ((IQProvider)provider).parseIQ(parser);
                    }
                    else if (provider instanceof Class) {
                        iqPacket = (IQ)PacketParserUtils.parseWithIntrospection(elementName,
                                (Class)provider, parser);
                    }
                }
            }
        }
        else if (eventType == XmlPullParser.END_TAG) {
            if (parser.getName().equals("iq")) {
                done = true;
            }
        }
    }
    // Decide what to do when an IQ packet was not understood
    if (iqPacket == null) {
        if (IQ.Type.GET == type || IQ.Type.SET == type ) {
            // If the IQ stanza is of type "get" or "set" containing a child element
            // qualified by a namespace it does not understand, then answer an IQ of
            // type "error" with code 501 ("feature-not-implemented")
            iqPacket = new IQ() {
                public String getChildElementXML() {
                    return null;
                }
            };
            iqPacket.setPacketID(id);
            iqPacket.setTo(from);
            iqPacket.setFrom(to);
            iqPacket.setType(IQ.Type.ERROR);
            iqPacket.setError(new XMPPError(XMPPError.Condition.feature_not_implemented));
            connection.sendPacket(iqPacket);
            return null;
        }
        else {
            // If an IQ packet wasn't created above, create an empty IQ packet.
            iqPacket = new IQ() {
                public String getChildElementXML() {
                    return null;
                }
            };
        }
    }

    // Set basic values on the iq packet.
    iqPacket.setPacketID(id);
    iqPacket.setTo(to);
    iqPacket.setFrom(from);
    iqPacket.setType(type);
    iqPacket.setError(error);

    return iqPacket;
}