?? connectaction.java.svn-base
字號:
this.state = ConnectAction.STATE_CLI_DISCONNECT_SENT; } } // Watch out for STATE_CLI_DISCONNECT_SENT else if (this.state == ConnectAction.STATE_CLI_DISCONNECT_SENT) { // Watch out for SRV_HELLO packet if (packet instanceof ConnectPacket) { ConnectPacket connectPacket = (ConnectPacket) packet; if (connectPacket.getType() == ConnectPacket.SRV_CLI_HELLO) { // Send a CLI_COOKIE packet as reply ConnectPacket reply = new ConnectPacket(this.cookie); Icq.c.sendPacket(reply); // Move to next state this.state = ConnectAction.STATE_CLI_COOKIE_SENT; // Packet has been consumed consumed = true; } } } // STATE_CLI_COOKIE_SENT else if (this.state == ConnectAction.STATE_CLI_COOKIE_SENT) { ByteArrayOutputStream stream = new ByteArrayOutputStream(); for (int i = 0; i < FAMILIES_AND_VER_LIST.length; i++) Util.writeWord(stream, FAMILIES_AND_VER_LIST[i], true); Icq.c.sendPacket ( new SnacPacket ( SnacPacket.CLI_FAMILIES_FAMILY, SnacPacket.CLI_FAMILIES_COMMAND, SnacPacket.CLI_FAMILIES_COMMAND, new byte[0], stream.toByteArray() ) ); this.state = ConnectAction.STATE_CLI_WANT_CAPS_SENT; } // Watch out for STATE_CLI_COOKIE_SENT else if (this.state == ConnectAction.STATE_CLI_WANT_CAPS_SENT) { SnacPacket reqp = new SnacPacket(SnacPacket.CLI_REQINFO_FAMILY, SnacPacket.CLI_REQINFO_COMMAND, SnacPacket.CLI_REQINFO_COMMAND, new byte[0], new byte[0]); Icq.c.sendPacket(reqp); byte[] rdata = new byte[6]; Util.putDWord(rdata, 0, 0x000B0002); Util.putWord(rdata, 4, 0x000F); reqp = new SnacPacket(SnacPacket.CLI_REQLISTS_FAMILY, SnacPacket.CLI_REQLISTS_COMMAND, SnacPacket.CLI_REQLISTS_COMMAND, new byte[0], rdata); Icq.c.sendPacket(reqp); reqp = null; // Send a CLI_REQROSTER or // CLI_CHECKROSTER packet long versionId1 = ContactList.getSsiListLastChangeTime(); int versionId2 = ContactList.getSsiNumberOfItems(); if (((versionId1 == -1) && (versionId2 == -1)) || (ContactList.getSize() == 0)) { reqp = new SnacPacket(SnacPacket.CLI_REQROSTER_FAMILY, SnacPacket.CLI_REQROSTER_COMMAND, SnacPacket.CLI_REQROSTER_COMMAND, new byte[0], new byte[0]); Icq.c.sendPacket(reqp); } else { byte[] data = new byte[6]; Util.putDWord(data, 0, versionId1); Util.putWord(data, 4, versionId2); reqp = new SnacPacket(SnacPacket.CLI_CHECKROSTER_FAMILY, SnacPacket.CLI_CHECKROSTER_COMMAND, SnacPacket.CLI_CHECKROSTER_COMMAND, new byte[0], data); Icq.c.sendPacket(reqp); } reqp = null; reqp = new SnacPacket(SnacPacket.CLI_REQLOCATION_FAMILY, SnacPacket.CLI_REQLOCATION_COMMAND, SnacPacket.CLI_REQLOCATION_COMMAND, new byte[0], new byte[0]); Icq.c.sendPacket(reqp); reqp = null; rdata = new byte[6]; Util.putDWord(rdata, 0, 0x00050002); Util.putWord(rdata, 4, 0x0003); reqp = new SnacPacket(SnacPacket.CLI_REQBUDDY_FAMILY, SnacPacket.CLI_REQBUDDY_COMMAND, SnacPacket.CLI_REQBUDDY_COMMAND, new byte[0], rdata); Icq.c.sendPacket(reqp); reqp = null; reqp = new SnacPacket(SnacPacket.CLI_REQICBM_FAMILY, SnacPacket.CLI_REQICBM_COMMAND, SnacPacket.CLI_REQICBM_COMMAND, new byte[0], new byte[0]); Icq.c.sendPacket(reqp); reqp = null; reqp = new SnacPacket(SnacPacket.CLI_REQBOS_FAMILY, SnacPacket.CLI_REQBOS_COMMAND, SnacPacket.CLI_REQBOS_COMMAND, new byte[0], new byte[0]); Icq.c.sendPacket(reqp); reqp = null; // Move to next state this.state = ConnectAction.STATE_CLI_CHECKROSTER_SENT; } // Watch out for STATE_CLI_CHECKROSTER_SENT else if (this.state == ConnectAction.STATE_CLI_CHECKROSTER_SENT) { // Watch out for SNAC packet if (packet instanceof SnacPacket) { SnacPacket snacPacket = (SnacPacket) packet; // Watch out for // SRV_REPLYROSTEROK if ((snacPacket.getFamily() == SnacPacket.SRV_REPLYROSTEROK_FAMILY) && (snacPacket.getCommand() == SnacPacket.SRV_REPLYROSTEROK_COMMAND)) { this.srvReplyRosterRcvd = true; // Packet has been consumed consumed = true; } // watch out for SRV_REPLYROSTER // packet else if ((snacPacket.getFamily() == SnacPacket.SRV_REPLYROSTER_FAMILY) && (snacPacket.getCommand() == SnacPacket.SRV_REPLYROSTER_COMMAND)) { Vector privacyLists = new Vector(); // Initialize vector for // items Vector items = new Vector(); // Get data byte[] buf = snacPacket.getData(); int marker = 0; // Check length if (buf.length < 3) { throw (new JimmException(115, 0)); } // Skip // SRV_REPLYROSTER.UNKNOWN marker += 1; // Iterate through all // items int count = Util.getWord(buf, marker); marker += 2; // System.out.println("elemente in serverlist: "+count); for (int i = 0; i < count; i++) { // Check length if (buf.length < marker + 2) { throw (new JimmException(115, 1)); } // Get name length int nameLen = Util.getWord(buf, marker); marker += 2; // Check length if (buf.length < marker + nameLen + 2 + 2 + 2 + 2) { throw (new JimmException(115, 2)); } // Get name String name = Util.byteArrayToString(buf, marker, nameLen, Util.isDataUTF8(buf, marker, nameLen)); marker += nameLen; // Get group, id and type int group = Util.getWord(buf, marker); int id = Util.getWord(buf, marker + 2); int type = Util.getWord(buf, marker + 4); marker += 6; // Get length of the following TLVs int len = Util.getWord(buf, marker); marker += 2; // Check length if (buf.length < marker + len) { throw (new JimmException(115, 3)); } int privacyMode = -1; // Normal contact // Deleted contact if ( (type == 0x0000) || (Options.getBoolean(Options.OPTION_SHOW_DELETED_CONT) && ((type == 0x0019) || (type == 0x001B))) ) { ByteArrayOutputStream serverData = new ByteArrayOutputStream(); // Get nick String nick = new String(name); //#sijapp cond.if target!="DEFAULT" & modules_AVATARS="true"#
byte[] biHash = new byte[16]; //#sijapp cond.end# boolean noAuth = false; while (len > 0) { byte[] tlvData = Util.getTlv(buf, marker); if (tlvData == null) { throw (new JimmException(115, 4)); } int tlvType = Util.getWord(buf, marker); if (tlvType == 0x0131) { nick = Util.byteArrayToString(tlvData, true); } else if (tlvType == 0x0066) { noAuth = true; } /* Server-side additional data */ else if ((tlvType == 0x006D) || (tlvType == 0x015c) || (tlvType == 0x015d)) { Util.writeWord(serverData, tlvType, true); Util.writeWord(serverData, tlvData.length, true); Util.writeByteArray(serverData, tlvData); } len -= 4; len -= tlvData.length; marker += 4 + tlvData.length; } if (len != 0) { throw (new JimmException(115, 5)); } // Add this contact item to the vector try { ContactItem item = new ContactItem(id, group, name, nick, noAuth, true); if (group == 0) item.setBooleanValue(ContactItem.CONTACTITEM_IS_TEMP|ContactItem.CONTACTITEM_IS_PHANTOM, true); item.setBytesArray(ContactItem.CONTACTITEM_SS_DATA, (serverData.size() != 0) ? serverData.toByteArray() : null); //#sijapp cond.if target!="DEFAULT" & modules_AVATARS="true"#
item.setBytesArray(ContactItem.CONTACTITEM_BUDDYICON_HASH, (biHash.length != 0) ? biHash : null); //#sijapp cond.end# items.addElement(item); } catch (NumberFormatException ne) { // Contact with wrong uin was received } catch (Exception e) { // Contact with wrong uin was received } } // Group of contacts else if (type == 0x0001) { //System.out.println("g "+i+": "+name); // Skip TLVs marker += len; // Add this group item to the vector if (group != 0x0000) { items.addElement(new ContactListGroupItem(group, name)); } else if (Options.getBoolean(Options.OPTION_SHOW_DELETED_CONT)) { items.addElement(new ContactListGroupItem(group, ResourceBundle.getString("phantoms"))); } } // My visibility settings else if (type == 0x0004) { while (len > 0) { byte[] tlvData = Util.getTlv(buf, marker); if (tlvData == null) { throw (new JimmException(115, 110)); } int tlvType = Util.getWord(buf, marker); if (tlvType == 0x00CA) { Options.setInt(Options.OPTION_VISIBILITY_ID, (int)id); Icq.setVisibility (Util.getWord(buf, marker + 4)); } len -= 4; len -= tlvData.length; marker += 4 + tlvData.length; } if (len != 0) { throw (new JimmException(115, 111)); } } // visible. item else if (type == 0x0002) privacyMode = ContactItem.CONTACTITEM_VIS_ID; // invis. else if (type == 0x0003) privacyMode = ContactItem.CONTACTITEM_INV_ID; // ignore else if (type == 0x000E) privacyMode = ContactItem.CONTACTITEM_IGN_ID; // All other item types else { // Skip TLVs marker += len; } if (privacyMode != -1) { privacyLists.addElement(name); privacyLists.addElement(new int[] { privacyMode, id }); marker += len; } } // Check length if (buf.length != marker + 4) { throw (new JimmException(115, 6)); } // Get timestamp int timestamp = (int)Util.getDWord(buf, marker); // Update contact list ContactListItem[] itemsAsArray = new ContactListItem[items.size()]; items.copyInto(itemsAsArray); // Save values into contact list ContactList.update(timestamp, count, itemsAsArray, privacyLists); if (timestamp != 0) this.srvReplyRosterRcvd = true; // Packet has been consumed consumed = true; } // Check if all required packets have been received if (this.srvReplyRosterRcvd) { // Send a CLI_ROSTERACK packet Icq.c.sendPacket(new SnacPacket(SnacPacket.CLI_ROSTERACK_FAMILY, SnacPacket.CLI_ROSTERACK_COMMAND, 0x00000007, new byte[0], new byte[0])); // Send CLI_SETUSERINFO packet Icq.sendUserUnfoPacket(); byte[] tmp_packet; /* TODO: make better :) */ // Send a CLI_SETICBM packet SnacPacket reply; //#sijapp cond.if target isnot "DEFAULT"# if (Options.getInt(Options.OPTION_TYPING_MODE) > 0) { reply = new SnacPacket(SnacPacket.CLI_SETICBM_FAMILY, SnacPacket.CLI_SETICBM_COMMAND, 0x00000000, new byte[0], ConnectAction.CLI_SETICBM_DATA); } else { //#sijapp cond.end# tmp_packet = ConnectAction.CLI_SETICBM_DATA; tmp_packet[5] = 0x03; reply = new SnacPacket(SnacPacket.CLI_SETICBM_FAMILY, SnacPacket.CLI_SETICBM_COMMAND, 0x00000000, new byte[0], tmp_packet); //#sijapp cond.if target isnot "DEFAULT"# } //#sijapp cond.end# Icq.c.sendPacket(reply); // Send a client status packet Icq.setOnlineStatus( (int)Options.getLong(Options.OPTION_ONLINE_STATUS), Icq.XSTATUS_CURRENT, true ); // Move to next state this.state = ConnectAction.STATE_CLI_STATUS_INFO_SENT; MainThread.resetLoginTimer(); } } } // STATE_CLI_STATUS_INFO_SENT else if (this.state == ConnectAction.STATE_CLI_STATUS_INFO_SENT) { // Send a CLI_READY packet SnacPacket reply2 = new SnacPacket(SnacPacket.CLI_READY_FAMILY, SnacPacket.CLI_READY_COMMAND, 0x00000000, new byte[0], ConnectAction.CLI_READY_DATA); Icq.c.sendPacket(reply2); // Send a CLI_TOICQSRV/CLI_REQOFFLINEMSGS packet ToIcqSrvPacket reply3 = new ToIcqSrvPacket(0x00000000, this.uin, ToIcqSrvPacket.CLI_REQOFFLINEMSGS_SUBCMD, new byte[0], new byte[0]); Icq.c.sendPacket(reply3); // Move to STATE_CONNECTED Icq.setConnected(); this.state = ConnectAction.STATE_CONNECTED; } // Update activity timestamp and reset activity flag this.lastActivity = System.currentTimeMillis(); this.active = false; // Return consumption flag return (consumed); } // Catch JimmExceptions catch (JimmException e) { // Update activity timestamp and reset activity flag this.lastActivity = System.currentTimeMillis(); this.active = false; // Set error state if exception is critical if (e.isCritical()) this.state = ConnectAction.STATE_ERROR; // Forward exception throw (e); } } // Returns true if the action is completed public boolean isCompleted() { return (this.state == ConnectAction.STATE_CONNECTED); } // Returns true if an error has occured public boolean isError() { if ( (this.state != ConnectAction.STATE_ERROR) && !this.active && (this.lastActivity + this.TIMEOUT < System.currentTimeMillis()) ) { this.canceled_by_timeout = true; this.state = ConnectAction.STATE_ERROR; } return (this.state == ConnectAction.STATE_ERROR); } // Returns a number between 0 and 100 (inclusive) which indicates the current progress public int getProgress() { return (state > 0) ? 100*state/STATE_MAX : 0; } public void onEvent(int eventType) { switch (eventType) { case ON_COMPLETE: MainThread.resetLoginTimer(); MainThread.activateContactListMT(null); Options.safeSave(); // Save last server break; case ON_CANCEL: Icq.disconnect(false); Icq.reconnect_attempts = 0; MainThread.backToLastScreenMT(); break; case ON_ERROR: if (canceled_by_timeout) { JimmException e = new JimmException(118, 0); JimmException.handleException(e); } break; } }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -