Search in sources :

Example 1 with Action

use of org.jivesoftware.smackx.commands.AdHocCommand.Action in project ecf by eclipse.

the class AdHocCommandDataProvider method parseIQ.

public IQ parseIQ(XmlPullParser parser) throws Exception {
    boolean done = false;
    AdHocCommandData adHocCommandData = new AdHocCommandData();
    DataFormProvider dataFormProvider = new DataFormProvider();
    int eventType;
    String elementName;
    String namespace;
    adHocCommandData.setSessionID(parser.getAttributeValue("", "sessionid"));
    adHocCommandData.setNode(parser.getAttributeValue("", "node"));
    // Status
    String status = parser.getAttributeValue("", "status");
    if (AdHocCommand.Status.executing.toString().equalsIgnoreCase(status)) {
        adHocCommandData.setStatus(AdHocCommand.Status.executing);
    } else if (AdHocCommand.Status.completed.toString().equalsIgnoreCase(status)) {
        adHocCommandData.setStatus(AdHocCommand.Status.completed);
    } else if (AdHocCommand.Status.canceled.toString().equalsIgnoreCase(status)) {
        adHocCommandData.setStatus(AdHocCommand.Status.canceled);
    }
    // Action
    String action = parser.getAttributeValue("", "action");
    if (action != null) {
        Action realAction = AdHocCommand.Action.valueOf(action);
        if (realAction == null || realAction.equals(Action.unknown)) {
            adHocCommandData.setAction(Action.unknown);
        } else {
            adHocCommandData.setAction(realAction);
        }
    }
    while (!done) {
        eventType = parser.next();
        elementName = parser.getName();
        namespace = parser.getNamespace();
        if (eventType == XmlPullParser.START_TAG) {
            if (parser.getName().equals("actions")) {
                String execute = parser.getAttributeValue("", "execute");
                if (execute != null) {
                    adHocCommandData.setExecuteAction(AdHocCommand.Action.valueOf(execute));
                }
            } else if (parser.getName().equals("next")) {
                adHocCommandData.addAction(AdHocCommand.Action.next);
            } else if (parser.getName().equals("complete")) {
                adHocCommandData.addAction(AdHocCommand.Action.complete);
            } else if (parser.getName().equals("prev")) {
                adHocCommandData.addAction(AdHocCommand.Action.prev);
            } else if (elementName.equals("x") && namespace.equals("jabber:x:data")) {
                adHocCommandData.setForm((DataForm) dataFormProvider.parseExtension(parser));
            } else if (parser.getName().equals("note")) {
                AdHocCommandNote.Type type = AdHocCommandNote.Type.valueOf(parser.getAttributeValue("", "type"));
                String value = parser.nextText();
                adHocCommandData.addNote(new AdHocCommandNote(type, value));
            } else if (parser.getName().equals("error")) {
                XMPPError error = PacketParserUtils.parseError(parser);
                adHocCommandData.setError(error);
            }
        } else if (eventType == XmlPullParser.END_TAG) {
            if (parser.getName().equals("command")) {
                done = true;
            }
        }
    }
    return adHocCommandData;
}
Also used : Action(org.jivesoftware.smackx.commands.AdHocCommand.Action) AdHocCommandNote(org.jivesoftware.smackx.commands.AdHocCommandNote) AdHocCommandData(org.jivesoftware.smackx.packet.AdHocCommandData) XMPPError(org.jivesoftware.smack.packet.XMPPError)

Example 2 with Action

use of org.jivesoftware.smackx.commands.AdHocCommand.Action in project Smack by igniterealtime.

the class AdHocCommandDataProvider method parse.

@Override
public AdHocCommandData parse(XmlPullParser parser, int initialDepth) throws Exception {
    boolean done = false;
    AdHocCommandData adHocCommandData = new AdHocCommandData();
    DataFormProvider dataFormProvider = new DataFormProvider();
    int eventType;
    String elementName;
    String namespace;
    adHocCommandData.setSessionID(parser.getAttributeValue("", "sessionid"));
    adHocCommandData.setNode(parser.getAttributeValue("", "node"));
    // Status
    String status = parser.getAttributeValue("", "status");
    if (AdHocCommand.Status.executing.toString().equalsIgnoreCase(status)) {
        adHocCommandData.setStatus(AdHocCommand.Status.executing);
    } else if (AdHocCommand.Status.completed.toString().equalsIgnoreCase(status)) {
        adHocCommandData.setStatus(AdHocCommand.Status.completed);
    } else if (AdHocCommand.Status.canceled.toString().equalsIgnoreCase(status)) {
        adHocCommandData.setStatus(AdHocCommand.Status.canceled);
    }
    // Action
    String action = parser.getAttributeValue("", "action");
    if (action != null) {
        Action realAction = AdHocCommand.Action.valueOf(action);
        if (realAction == null || realAction.equals(Action.unknown)) {
            adHocCommandData.setAction(Action.unknown);
        } else {
            adHocCommandData.setAction(realAction);
        }
    }
    while (!done) {
        eventType = parser.next();
        elementName = parser.getName();
        namespace = parser.getNamespace();
        if (eventType == XmlPullParser.START_TAG) {
            if (parser.getName().equals("actions")) {
                String execute = parser.getAttributeValue("", "execute");
                if (execute != null) {
                    adHocCommandData.setExecuteAction(AdHocCommand.Action.valueOf(execute));
                }
            } else if (parser.getName().equals("next")) {
                adHocCommandData.addAction(AdHocCommand.Action.next);
            } else if (parser.getName().equals("complete")) {
                adHocCommandData.addAction(AdHocCommand.Action.complete);
            } else if (parser.getName().equals("prev")) {
                adHocCommandData.addAction(AdHocCommand.Action.prev);
            } else if (elementName.equals("x") && namespace.equals("jabber:x:data")) {
                adHocCommandData.setForm(dataFormProvider.parse(parser));
            } else if (parser.getName().equals("note")) {
                String typeString = parser.getAttributeValue("", "type");
                AdHocCommandNote.Type type;
                if (typeString != null) {
                    type = AdHocCommandNote.Type.valueOf(typeString);
                } else {
                    // Type is optional and 'info' if not present.
                    type = AdHocCommandNote.Type.info;
                }
                String value = parser.nextText();
                adHocCommandData.addNote(new AdHocCommandNote(type, value));
            } else if (parser.getName().equals("error")) {
                XMPPError.Builder error = PacketParserUtils.parseError(parser);
                adHocCommandData.setError(error);
            }
        } else if (eventType == XmlPullParser.END_TAG) {
            if (parser.getName().equals("command")) {
                done = true;
            }
        }
    }
    return adHocCommandData;
}
Also used : Action(org.jivesoftware.smackx.commands.AdHocCommand.Action) AdHocCommandNote(org.jivesoftware.smackx.commands.AdHocCommandNote) DataFormProvider(org.jivesoftware.smackx.xdata.provider.DataFormProvider) AdHocCommandData(org.jivesoftware.smackx.commands.packet.AdHocCommandData) XMPPError(org.jivesoftware.smack.packet.XMPPError)

Example 3 with Action

use of org.jivesoftware.smackx.commands.AdHocCommand.Action in project ecf by eclipse.

the class AdHocCommandManager method processAdHocCommand.

/**
 * Process the AdHoc-Command packet that request the execution of some
 * action of a command. If this is the first request, this method checks,
 * before executing the command, if:
 * <ul>
 *  <li>The requested command exists</li>
 *  <li>The requester has permissions to execute it</li>
 *  <li>The command has more than one stage, if so, it saves the command and
 *      session ID for further use</li>
 * </ul>
 *
 * <br>
 * <br>
 * If this is not the first request, this method checks, before executing
 * the command, if:
 * <ul>
 *  <li>The session ID of the request was stored</li>
 *  <li>The session life do not exceed the time out</li>
 *  <li>The action to execute is one of the available actions</li>
 * </ul>
 *
 * @param requestData
 *            the packet to process.
 */
private void processAdHocCommand(AdHocCommandData requestData) {
    // Only process requests of type SET
    if (requestData.getType() != IQ.Type.SET) {
        return;
    }
    // Creates the response with the corresponding data
    AdHocCommandData response = new AdHocCommandData();
    response.setTo(requestData.getFrom());
    response.setPacketID(requestData.getPacketID());
    response.setNode(requestData.getNode());
    response.setId(requestData.getTo());
    String sessionId = requestData.getSessionID();
    String commandNode = requestData.getNode();
    if (sessionId == null) {
        // command exists
        if (!commands.containsKey(commandNode)) {
            // Requested command does not exist so return
            // item_not_found error.
            respondError(response, XMPPError.Condition.item_not_found);
            return;
        }
        // Create new session ID
        sessionId = StringUtils.randomString(15);
        try {
            // Create a new instance of the command with the
            // corresponding sessioid
            LocalCommand command = newInstanceOfCmd(commandNode, sessionId);
            response.setType(IQ.Type.RESULT);
            command.setData(response);
            // enough to execute the requested command
            if (!command.hasPermission(requestData.getFrom())) {
                respondError(response, XMPPError.Condition.forbidden);
                return;
            }
            Action action = requestData.getAction();
            // If the action is unknown then respond an error.
            if (action != null && action.equals(Action.unknown)) {
                respondError(response, XMPPError.Condition.bad_request, AdHocCommand.SpecificErrorCondition.malformedAction);
                return;
            }
            // If the action is not execute, then it is an invalid action.
            if (action != null && !action.equals(Action.execute)) {
                respondError(response, XMPPError.Condition.bad_request, AdHocCommand.SpecificErrorCondition.badAction);
                return;
            }
            // Increase the state number, so the command knows in witch
            // stage it is
            command.incrementStage();
            // Executes the command
            command.execute();
            if (command.isLastStage()) {
                // If there is only one stage then the command is completed
                response.setStatus(Status.completed);
            } else {
                // Else it is still executing, and is registered to be
                // available for the next call
                response.setStatus(Status.executing);
                executingCommands.put(sessionId, command);
                // See if the session reaping thread is started. If not, start it.
                if (sessionsSweeper == null) {
                    sessionsSweeper = new Thread(new Runnable() {

                        public void run() {
                            while (true) {
                                for (String sessionId : executingCommands.keySet()) {
                                    LocalCommand command = executingCommands.get(sessionId);
                                    // map.
                                    if (command != null) {
                                        long creationStamp = command.getCreationDate();
                                        // invalid session error and not a time out error.
                                        if (System.currentTimeMillis() - creationStamp > SESSION_TIMEOUT * 1000 * 2) {
                                            // Remove the expired session
                                            executingCommands.remove(sessionId);
                                        }
                                    }
                                }
                                try {
                                    Thread.sleep(1000);
                                } catch (InterruptedException ie) {
                                // Ignore.
                                }
                            }
                        }
                    });
                    sessionsSweeper.setDaemon(true);
                    sessionsSweeper.start();
                }
            }
            // Sends the response packet
            connection.sendPacket(response);
        } catch (XMPPException e) {
            // If there is an exception caused by the next, complete,
            // prev or cancel method, then that error is returned to the
            // requester.
            XMPPError error = e.getXMPPError();
            // command be removed from the executing list.
            if (XMPPError.Type.CANCEL.equals(error.getType())) {
                response.setStatus(Status.canceled);
                executingCommands.remove(sessionId);
            }
            respondError(response, error);
            e.printStackTrace();
        }
    } else {
        LocalCommand command = executingCommands.get(sessionId);
        // of getting the key and the value of the map.
        if (command == null) {
            respondError(response, XMPPError.Condition.bad_request, AdHocCommand.SpecificErrorCondition.badSessionid);
            return;
        }
        // Check if the Session data has expired (default is 10 minutes)
        long creationStamp = command.getCreationDate();
        if (System.currentTimeMillis() - creationStamp > SESSION_TIMEOUT * 1000) {
            // Remove the expired session
            executingCommands.remove(sessionId);
            // Answer a not_allowed error (session-expired)
            respondError(response, XMPPError.Condition.not_allowed, AdHocCommand.SpecificErrorCondition.sessionExpired);
            return;
        }
        /*
             * Since the requester could send two requests for the same
             * executing command i.e. the same session id, all the execution of
             * the action must be synchronized to avoid inconsistencies.
             */
        synchronized (command) {
            Action action = requestData.getAction();
            // If the action is unknown the respond an error
            if (action != null && action.equals(Action.unknown)) {
                respondError(response, XMPPError.Condition.bad_request, AdHocCommand.SpecificErrorCondition.malformedAction);
                return;
            }
            // action then follow the actual default execute action
            if (action == null || Action.execute.equals(action)) {
                action = command.getExecuteAction();
            }
            // offered
            if (!command.isValidAction(action)) {
                respondError(response, XMPPError.Condition.bad_request, AdHocCommand.SpecificErrorCondition.badAction);
                return;
            }
            try {
                // TODO: Check that all the requierd fields of the form are
                // TODO: filled, if not throw an exception. This will simplify the
                // TODO: construction of new commands
                // Since all errors were passed, the response is now a
                // result
                response.setType(IQ.Type.RESULT);
                // Set the new data to the command.
                command.setData(response);
                if (Action.next.equals(action)) {
                    command.incrementStage();
                    command.next(new Form(requestData.getForm()));
                    if (command.isLastStage()) {
                        // If it is the last stage then the command is
                        // completed
                        response.setStatus(Status.completed);
                    } else {
                        // Otherwise it is still executing
                        response.setStatus(Status.executing);
                    }
                } else if (Action.complete.equals(action)) {
                    command.incrementStage();
                    command.complete(new Form(requestData.getForm()));
                    response.setStatus(Status.completed);
                    // Remove the completed session
                    executingCommands.remove(sessionId);
                } else if (Action.prev.equals(action)) {
                    command.decrementStage();
                    command.prev();
                } else if (Action.cancel.equals(action)) {
                    command.cancel();
                    response.setStatus(Status.canceled);
                    // Remove the canceled session
                    executingCommands.remove(sessionId);
                }
                connection.sendPacket(response);
            } catch (XMPPException e) {
                // If there is an exception caused by the next, complete,
                // prev or cancel method, then that error is returned to the
                // requester.
                XMPPError error = e.getXMPPError();
                // command be removed from the executing list.
                if (XMPPError.Type.CANCEL.equals(error.getType())) {
                    response.setStatus(Status.canceled);
                    executingCommands.remove(sessionId);
                }
                respondError(response, error);
                e.printStackTrace();
            }
        }
    }
}
Also used : Action(org.jivesoftware.smackx.commands.AdHocCommand.Action) Form(org.jivesoftware.smackx.Form) AdHocCommandData(org.jivesoftware.smackx.packet.AdHocCommandData) XMPPError(org.jivesoftware.smack.packet.XMPPError)

Example 4 with Action

use of org.jivesoftware.smackx.commands.AdHocCommand.Action in project ecf by eclipse.

the class AdHocCommandData method getChildElementXML.

@Override
public String getChildElementXML() {
    StringBuilder buf = new StringBuilder();
    buf.append("<command xmlns=\"http://jabber.org/protocol/commands\"");
    buf.append(" node=\"").append(node).append("\"");
    if (sessionID != null) {
        if (!sessionID.equals("")) {
            buf.append(" sessionid=\"").append(sessionID).append("\"");
        }
    }
    if (status != null) {
        buf.append(" status=\"").append(status).append("\"");
    }
    if (action != null) {
        buf.append(" action=\"").append(action).append("\"");
    }
    if (lang != null) {
        if (!lang.equals("")) {
            buf.append(" lang=\"").append(lang).append("\"");
        }
    }
    buf.append(">");
    if (getType() == Type.RESULT) {
        buf.append("<actions");
        if (executeAction != null) {
            buf.append(" execute=\"").append(executeAction).append("\"");
        }
        if (actions.size() == 0) {
            buf.append("/>");
        } else {
            buf.append(">");
            for (AdHocCommand.Action action : actions) {
                buf.append("<").append(action).append("/>");
            }
            buf.append("</actions>");
        }
    }
    if (form != null) {
        buf.append(form.toXML());
    }
    for (AdHocCommandNote note : notes) {
        buf.append("<note type=\"").append(note.getType().toString()).append("\">");
        buf.append(note.getValue());
        buf.append("</note>");
    }
    // TODO ERRORS
    // if (getError() != null) {
    // buf.append(getError().toXML());
    // }
    buf.append("</command>");
    return buf.toString();
}
Also used : Action(org.jivesoftware.smackx.commands.AdHocCommand.Action) AdHocCommandNote(org.jivesoftware.smackx.commands.AdHocCommandNote) AdHocCommand(org.jivesoftware.smackx.commands.AdHocCommand)

Example 5 with Action

use of org.jivesoftware.smackx.commands.AdHocCommand.Action in project Smack by igniterealtime.

the class AdHocCommandManager method processAdHocCommand.

/**
 * Process the AdHoc-Command stanza that request the execution of some
 * action of a command. If this is the first request, this method checks,
 * before executing the command, if:
 * <ul>
 *  <li>The requested command exists</li>
 *  <li>The requester has permissions to execute it</li>
 *  <li>The command has more than one stage, if so, it saves the command and
 *      session ID for further use</li>
 * </ul>
 *
 * <br>
 * <br>
 * If this is not the first request, this method checks, before executing
 * the command, if:
 * <ul>
 *  <li>The session ID of the request was stored</li>
 *  <li>The session life do not exceed the time out</li>
 *  <li>The action to execute is one of the available actions</li>
 * </ul>
 *
 * @param requestData TODO javadoc me please
 *            the stanza to process.
 * @throws NotConnectedException if the XMPP connection is not connected.
 * @throws NoResponseException if there was no response from the remote entity.
 * @throws InterruptedException if the calling thread was interrupted.
 */
private IQ processAdHocCommand(AdHocCommandData requestData) throws NoResponseException, NotConnectedException, InterruptedException {
    // Creates the response with the corresponding data
    AdHocCommandData response = new AdHocCommandData();
    response.setTo(requestData.getFrom());
    response.setStanzaId(requestData.getStanzaId());
    response.setNode(requestData.getNode());
    response.setId(requestData.getTo());
    String sessionId = requestData.getSessionID();
    String commandNode = requestData.getNode();
    if (sessionId == null) {
        // command exists
        if (!commands.containsKey(commandNode)) {
            // item_not_found error.
            return respondError(response, StanzaError.Condition.item_not_found);
        }
        // Create new session ID
        sessionId = StringUtils.randomString(15);
        try {
            // Create a new instance of the command with the
            // corresponding sessionid
            LocalCommand command;
            try {
                command = newInstanceOfCmd(commandNode, sessionId);
            } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
                StanzaError xmppError = StanzaError.getBuilder().setCondition(StanzaError.Condition.internal_server_error).setDescriptiveEnText(e.getMessage()).build();
                return respondError(response, xmppError);
            }
            response.setType(IQ.Type.result);
            command.setData(response);
            // enough to execute the requested command
            if (!command.hasPermission(requestData.getFrom())) {
                return respondError(response, StanzaError.Condition.forbidden);
            }
            Action action = requestData.getAction();
            // If the action is unknown then respond an error.
            if (action != null && action.equals(Action.unknown)) {
                return respondError(response, StanzaError.Condition.bad_request, AdHocCommand.SpecificErrorCondition.malformedAction);
            }
            // If the action is not execute, then it is an invalid action.
            if (action != null && !action.equals(Action.execute)) {
                return respondError(response, StanzaError.Condition.bad_request, AdHocCommand.SpecificErrorCondition.badAction);
            }
            // Increase the state number, so the command knows in witch
            // stage it is
            command.incrementStage();
            // Executes the command
            command.execute();
            if (command.isLastStage()) {
                // If there is only one stage then the command is completed
                response.setStatus(Status.completed);
            } else {
                // Else it is still executing, and is registered to be
                // available for the next call
                response.setStatus(Status.executing);
                executingCommands.put(sessionId, command);
                // See if the session sweeper thread is scheduled. If not, start it.
                maybeWindUpSessionSweeper();
            }
            // Sends the response packet
            return response;
        } catch (XMPPErrorException e) {
            // If there is an exception caused by the next, complete,
            // prev or cancel method, then that error is returned to the
            // requester.
            StanzaError error = e.getStanzaError();
            // command be removed from the executing list.
            if (StanzaError.Type.CANCEL.equals(error.getType())) {
                response.setStatus(Status.canceled);
                executingCommands.remove(sessionId);
            }
            return respondError(response, error);
        }
    } else {
        LocalCommand command = executingCommands.get(sessionId);
        // of getting the key and the value of the map.
        if (command == null) {
            return respondError(response, StanzaError.Condition.bad_request, AdHocCommand.SpecificErrorCondition.badSessionid);
        }
        // Check if the Session data has expired (default is 10 minutes)
        long creationStamp = command.getCreationDate();
        if (System.currentTimeMillis() - creationStamp > SESSION_TIMEOUT * 1000) {
            // Remove the expired session
            executingCommands.remove(sessionId);
            // Answer a not_allowed error (session-expired)
            return respondError(response, StanzaError.Condition.not_allowed, AdHocCommand.SpecificErrorCondition.sessionExpired);
        }
        /*
             * Since the requester could send two requests for the same
             * executing command i.e. the same session id, all the execution of
             * the action must be synchronized to avoid inconsistencies.
             */
        synchronized (command) {
            Action action = requestData.getAction();
            // If the action is unknown the respond an error
            if (action != null && action.equals(Action.unknown)) {
                return respondError(response, StanzaError.Condition.bad_request, AdHocCommand.SpecificErrorCondition.malformedAction);
            }
            // action then follow the actual default execute action
            if (action == null || Action.execute.equals(action)) {
                action = command.getExecuteAction();
            }
            // offered
            if (!command.isValidAction(action)) {
                return respondError(response, StanzaError.Condition.bad_request, AdHocCommand.SpecificErrorCondition.badAction);
            }
            try {
                // TODO: Check that all the required fields of the form are
                // TODO: filled, if not throw an exception. This will simplify the
                // TODO: construction of new commands
                // Since all errors were passed, the response is now a
                // result
                response.setType(IQ.Type.result);
                // Set the new data to the command.
                command.setData(response);
                if (Action.next.equals(action)) {
                    command.incrementStage();
                    DataForm dataForm = requestData.getForm();
                    command.next(new FillableForm(dataForm));
                    if (command.isLastStage()) {
                        // If it is the last stage then the command is
                        // completed
                        response.setStatus(Status.completed);
                    } else {
                        // Otherwise it is still executing
                        response.setStatus(Status.executing);
                    }
                } else if (Action.complete.equals(action)) {
                    command.incrementStage();
                    DataForm dataForm = requestData.getForm();
                    command.complete(new FillableForm(dataForm));
                    response.setStatus(Status.completed);
                    // Remove the completed session
                    executingCommands.remove(sessionId);
                } else if (Action.prev.equals(action)) {
                    command.decrementStage();
                    command.prev();
                } else if (Action.cancel.equals(action)) {
                    command.cancel();
                    response.setStatus(Status.canceled);
                    // Remove the canceled session
                    executingCommands.remove(sessionId);
                }
                return response;
            } catch (XMPPErrorException e) {
                // If there is an exception caused by the next, complete,
                // prev or cancel method, then that error is returned to the
                // requester.
                StanzaError error = e.getStanzaError();
                // command be removed from the executing list.
                if (StanzaError.Type.CANCEL.equals(error.getType())) {
                    response.setStatus(Status.canceled);
                    executingCommands.remove(sessionId);
                }
                return respondError(response, error);
            }
        }
    }
}
Also used : Action(org.jivesoftware.smackx.commands.AdHocCommand.Action) XMPPErrorException(org.jivesoftware.smack.XMPPException.XMPPErrorException) FillableForm(org.jivesoftware.smackx.xdata.form.FillableForm) InvocationTargetException(java.lang.reflect.InvocationTargetException) StanzaError(org.jivesoftware.smack.packet.StanzaError) AdHocCommandData(org.jivesoftware.smackx.commands.packet.AdHocCommandData) DataForm(org.jivesoftware.smackx.xdata.packet.DataForm)

Aggregations

Action (org.jivesoftware.smackx.commands.AdHocCommand.Action)7 AdHocCommandNote (org.jivesoftware.smackx.commands.AdHocCommandNote)5 XMPPError (org.jivesoftware.smack.packet.XMPPError)3 AdHocCommandData (org.jivesoftware.smackx.commands.packet.AdHocCommandData)3 StanzaError (org.jivesoftware.smack.packet.StanzaError)2 AdHocCommand (org.jivesoftware.smackx.commands.AdHocCommand)2 AdHocCommandData (org.jivesoftware.smackx.packet.AdHocCommandData)2 DataFormProvider (org.jivesoftware.smackx.xdata.provider.DataFormProvider)2 InvocationTargetException (java.lang.reflect.InvocationTargetException)1 XMPPErrorException (org.jivesoftware.smack.XMPPException.XMPPErrorException)1 XmlPullParser (org.jivesoftware.smack.xml.XmlPullParser)1 Form (org.jivesoftware.smackx.Form)1 FillableForm (org.jivesoftware.smackx.xdata.form.FillableForm)1 DataForm (org.jivesoftware.smackx.xdata.packet.DataForm)1