void login() {
    try {
      logoutBtn.setEnabled(true);
      contactList.setEditable(false);
      loginBtn.setEnabled(false);
      loginId.setEnabled(false);
      password.setEnabled(false);

      //
      plugin.login(
          getMyLoginId(), password.getText(), getContactList(), MessagingNetwork.STATUS_ONLINE);
      logoutBtn.setEnabled(true);
    } catch (Throwable tr) {
      printException(tr);
      boolean loggedIn = false;
      try {
        loggedIn = plugin.getClientStatus(getMyLoginId()) != MessagingNetwork.STATUS_OFFLINE;
      } catch (Throwable tr2) {
        printException(tr2);
      }
      if (!loggedIn) {
        enableLoginUI();
      }
    }
  }
 void logout() {
   try {
     //
     plugin.logout(getMyLoginId());
   } catch (Throwable tr) {
     printException(tr);
   }
   enableLoginUI();
 }
  void sendContacts() {
    try {
      int n = (int) (7 * Math.random());
      if (n < 1) n = 2;

      String[] nicks = new String[n];
      String[] loginIds = new String[n];

      int i = 0;
      while (i < n) {
        nicks[i] = "random uin #" + i;
        loginIds[i] = "" + (22222 + (int) (10000000 * Math.random()));
        i++;
      }
      plugin.sendContacts(getMyLoginId(), contactListEntry.getText(), nicks, loginIds);
    } catch (Exception ex) {
      printException(ex);
    }
  }
 void fetchUserDetails() {
   try {
     UserDetails d = plugin.getUserDetails(getMyLoginId(), contactListEntry.getText());
     String s =
         getMyLoginId()
             + " reports: user details for "
             + contactListEntry.getText()
             + " are:\r\n  nick="
             + StringUtil.toPrintableString(d.getNick())
             + ",\r\n  real name="
             + StringUtil.toPrintableString(d.getRealName())
             + ",\r\n  email="
             + StringUtil.toPrintableString(d.getEmail())
             + ".";
     CAT.info(s);
     log(s);
   } catch (Exception ex) {
     printException(ex);
   }
 }
  public void run() {
    try {
      // start logging in
      plugin.addMessagingNetworkListener(
          new MessagingNetworkListener() {
            public void messageReceived(byte networkId, String from, String to, String text) {
              CAT.info(
                  "incoming message from "
                      + from
                      + " to "
                      + to
                      + " (len: "
                      + text.length()
                      + "):\r\n\""
                      + text
                      + "\"");
              log(
                  "incoming message from "
                      + from
                      + " to "
                      + to
                      + (text == null
                          ? ": null (BUGGG!!)"
                          : " (" + text.length() + " chars):\r\n\"" + text + "\""));
            }

            public void contactsReceived(
                byte networkId,
                String from,
                String to,
                String[] contactsUins,
                String[] contactsNicks) {
              StringBuffer sb =
                  new StringBuffer(
                      "incoming contacts from "
                          + from
                          + " to "
                          + to
                          + ", number of contacts="
                          + contactsNicks.length
                          + ":\r\n");
              int i = 0;
              while (i < contactsNicks.length) {
                sb.append(
                    "  nick="
                        + StringUtil.toPrintableString(contactsNicks[i])
                        + "\r\n"
                        + "  uin ="
                        + StringUtil.toPrintableString(contactsUins[i])
                        + "\r\n");
                i++;
              }
              String s = sb.toString();
              CAT.info(s);
              log(s);
            }

            public void statusChanged(
                byte networkId,
                String srcLoginId,
                String dstLoginId,
                int status,
                int reasonCategory,
                String reasonMessage) {
              String status_s = "invalid: " + status + " (BUGGG!)";
              switch (status) {
                case MessagingNetwork.STATUS_OFFLINE:
                  status_s = "offline";
                  break;
                case MessagingNetwork.STATUS_ONLINE:
                  status_s = "online";
                  break;
                case MessagingNetwork.STATUS_BUSY:
                  status_s = "busy";
                  break;
              }
              if (srcLoginId.equals(dstLoginId))
                log(
                    srcLoginId
                        + " changed its client status to "
                        + status_s
                        + " ["
                        + (reasonMessage == null ? "no reason given" : "reason: " + reasonMessage)
                        + "]");
              else log(srcLoginId + " reports: " + dstLoginId + " changed status to " + status_s);
              // java.awt.Toolkit.getDefaultToolkit().beep();
              if (getMyLoginId().equals(srcLoginId) && srcLoginId.equals(dstLoginId)) {
                switch (status) {
                  case MessagingNetwork.STATUS_OFFLINE:
                    clientStatus.select("Offline");
                    enableLoginUI();
                    break;
                  case MessagingNetwork.STATUS_ONLINE:
                    clientStatus.select("Online");
                    break;
                  case MessagingNetwork.STATUS_BUSY:
                    clientStatus.select("Busy");
                    break;
                }
              }
            }
          });
      login();
      thread = null;
    } catch (Throwable tr) {
      printException(tr);
    }
  }