public CommandWithReplyImpl(XmppConnection con, Packet packet) {

    connection = con;
    packetID = packet.getPacketID();

    // Setup a collector to receive the servers response
    collector = connection.createPacketCollector(new PacketIDFilter(packetID));

    // Get the subscription id if applicable
    subscriptionID = null;
    subidPattern = Pattern.compile("subid=[\"']([\\w-]+?)[\"']");

    // Set the results from the command to null
    result = null;

    if (connection.isConnected()) {
      try {
        connection.sendPacket(packet);
      } catch (IllegalStateException e) {
        // set result to an error
        result = new ArbitraryIQ();
        result.setType(IQ.Type.ERROR);
      }
    }
  }
Ejemplo n.º 2
0
  public boolean execCommand(Protocol protocol, String msg) {
    final String cmd;
    final String param;
    int endCmd = msg.indexOf(' ');
    if (-1 != endCmd) {
      cmd = msg.substring(1, endCmd);
      param = msg.substring(endCmd + 1);
    } else {
      cmd = msg.substring(1);
      param = "";
    }
    String resource = param;
    String newMessage = "";

    int endNick = param.indexOf('\n');
    if (-1 != endNick) {
      resource = param.substring(0, endNick);
      newMessage = param.substring(endNick + 1);
    }
    String xml = null;
    final String on = "o" + "n";
    final String off = "o" + "f" + "f";
    if (on.equals(param) || off.equals(param)) {
      xml = Config.getConfigValue(cmd + ' ' + param, "/jabber-commands.txt");
    }
    if (null == xml) {
      xml = Config.getConfigValue(cmd, "/jabber-commands.txt");
    }
    if (null == xml) {
      return false;
    }

    XmppConnection xmppXml = ((Xmpp) protocol).getConnection();

    String jid = Jid.jimmJidToRealJid(getUserId());
    String fullJid = jid;
    if (isConference()) {
      String nick = ((XmppServiceContact) this).getMyName();
      fullJid = Jid.jimmJidToRealJid(getUserId() + '/' + nick);
    }

    xml = Util.replace(xml, "${jimm.caps}", xmppXml.getCaps());
    xml = Util.replace(xml, "${c.jid}", Util.xmlEscape(jid));
    xml = Util.replace(xml, "${c.fulljid}", Util.xmlEscape(fullJid));
    xml = Util.replace(xml, "${param.full}", Util.xmlEscape(param));
    xml = Util.replace(xml, "${param.res}", Util.xmlEscape(resource));
    xml = Util.replace(xml, "${param.msg}", Util.xmlEscape(newMessage));
    xml = Util.replace(xml, "${param.res.realjid}", Util.xmlEscape(getSubContactRealJid(resource)));
    xml = Util.replace(xml, "${param.full.realjid}", Util.xmlEscape(getSubContactRealJid(param)));

    xmppXml.requestRawXml(xml);
    return true;
  }
  /*
   * (non-Javadoc)
   *
   * @see com.saic.uicds.xmpp.communications.CommandWithReply#waitForSuccessOrFailure()
   */
  public boolean waitForSuccessOrFailure() {

    boolean success = true;

    if (connection.isConnected() && result == null) {
      int seconds = connection.getWaitTimeInSeconds() * 1000;
      // System.out.println("+++++ wait " + connection.getWaitTimeInSeconds() +
      // " seconds +++++");
      // System.out.println("Waiting for "+packetID);

      result = (IQ) collector.nextResult(seconds);

      // Stop queuing results
      collector.cancel();

      if (result == null) {
        errorMessage = "No response from the server.";
        success = false;
      } else if (result.getType() == IQ.Type.ERROR) {
        xmppError = result.getError();
        if (result.getError() != null) {
          errorMessage = result.getError().getMessage();
          errorCondition = result.getError().getCondition();
          errorType = result.getError().getType();
          errorCode = result.getError().getCode();
        } else {
          errorMessage = null;
          errorCondition = "";
          errorCode = 0;
          errorType = XMPPError.Type.CANCEL;
        }
        if (errorMessage == null) {
          errorMessage = "NULL error message";
        }
        if (result.getError() != null) {
          PacketExtension pe = null;
          pe =
              result
                  .getError()
                  .getExtension("unsupported", "http://jabber.org/protocol/pubsub#errors");
          if (pe != null) {
            unsupported = true;
            errorMessage += " - (action is unsupported by the server)";
          }
          pe =
              result
                  .getError()
                  .getExtension("payload-too-big", "http://jabber.org/protocol/pubsub#errors");
          if (pe != null) {
            payloadTooBig = true;
            errorMessage += " - (payload is too big)";
          }
          pe =
              result
                  .getError()
                  .getExtension("invalid-payload", "http://jabber.org/protocol/pubsub#errors");
          if (pe != null) {
            invalidPayload = true;
            errorMessage += " - (invalid payload)";
          }
          pe =
              result
                  .getError()
                  .getExtension("item-required", "http://jabber.org/protocol/pubsub#errors");
          if (pe != null) {
            itemRequired = true;
            errorMessage += " - (item element is required for this node)";
          }
          pe =
              result
                  .getError()
                  .getExtension("payload-required", "http://jabber.org/protocol/pubsub#errors");
          if (pe != null) {
            payloadRequired = true;
            errorMessage += " - (payload is required for this node)";
          }
          pe =
              result
                  .getError()
                  .getExtension("item-forbidden", "http://jabber.org/protocol/pubsub#errors");
          if (pe != null) {
            itemForbidden = true;
            errorMessage += " - (cannot publish item to transient node)";
          }
          pe =
              result
                  .getError()
                  .getExtension("invalid-jid", "http://jabber.org/protocol/pubsub#errors");
          if (pe != null) {
            invalidJID = true;
            errorMessage += " - (the bare JID portions of the JIDs do not match)";
          }
        }

        success = false;
      } else {
        // Pull out the subscription id if applicable
        Matcher m = subidPattern.matcher(result.toXML());
        if (m.find()) {
          subscriptionID = m.group(1);
          // System.out.println("GOT subid " + subscriptionID);
        } else {
          // System.err.println("No subid in " + result.toXML());
        }
        // Collection<String> exts = result.getPropertyNames();
        // System.out.println(exts.size()+" EXTENSIONS in "+result.getType());
        // for (Object o : exts) {
        // String ex = (String)o;
        // if (ex != null) {
        // System.out.println("FOUND "+ex);
        // }
        // }
      }
    } else {
      success = false;
      // Stop queuing results
      collector.cancel();
    }

    return success;
  }