📄 icq.java
字号:
{ if ((dwFP1 != 0) && (dwFP2 != 0) && (dwFP3 != 0)) client = CLI_ICQ2002A2003A; break; } if (((caps & (CAPF_STR20012 + CAPF_AIM_SERVERRELAY)) != 0) && ((caps & CAPF_IS2001) != 0)) { if ((dwFP1 == 0) && (dwFP2 == 0) && (dwFP3 == 0) && (wVersion == 0)) client = CLI_ICQPPC; else client = CLI_ICQ2001B; //FP1: 1068985885; FP2:0; FP3:1068986138 break; } if (wVersion == 7) { if (((caps & CAPF_AIM_SERVERRELAY) != 0) && ((caps & CAPF_DIRECT) != 0)) { if ((dwFP1 == 0) && (dwFP2 == 0) && (dwFP3 == 0)) client = CLI_ANDRQ; else client = CLI_ICQ2000; break; } else if ((caps & CAPF_RICHTEXT) != 0) { client = CLI_GNOMEICQ; break; } } if (dwFP1 > 0x35000000 && dwFP1 < 0x40000000) { switch (wVersion) { case 6: client = CLI_ICQ99; break; case 7: client = CLI_ICQ2000; break; case 8: client = CLI_ICQ2001B; break; case 9: client = CLI_ICQLITE; break; case 10: client = CLI_ICQ2003B; break; } break; } } if (client != CLI_NONE) { item.setIntValue(ContactItem.CONTACTITEM_CLIENT, client); item.setStringValue(ContactItem.CONTACTITEM_CLIVERSION, szVersion); } } item.setIntValue(ContactItem.CONTACTITEM_CAPABILITIES, (int)(caps&0xFFFFFFFF)); //#sijapp cond.if modules_DEBUGLOG is "true"#// System.out.println("uin - " + item.getStringValue(ContactItem.CONTACTITEM_UIN) + " found capabilities count:" + capabilities.length/16);// System.out.println("dwFP1 = " + "0x"+Integer.toHexString(dwFP1) + ", " + "dwFP2 = " + "0x"+Integer.toHexString(dwFP2) + ", " + "dwFP3 = " + "0x"+Integer.toHexString(dwFP3));// System.out.println("wVersion = " + Integer.toHexString(wVersion));// System.out.println("client = " + client + ", " + "szVersion = " + szVersion);// Util.PrintCapabilities("", capabilities); //#sijapp cond.end# } public static String getClientString(int cli) { for (int i = clientIndexes.length-1; i >= 0; i--) if (clientIndexes[i] == cli) return (clientNames[i]); return null; } public static int getClientImageID(int cli) { for (int i = clientIndexes.length-1; i >= 0; i--) if (clientIndexes[i] == cli) return clientImageIndexes[i]; return -1; } private static String detectClientVersion(byte[] buf1, int cli, int tlvNum) { byte[] buf = new byte[16]; System.arraycopy(buf1, tlvNum * 16, buf, 0, 16); String ver = ""; switch (cli) { case CLI_MIRANDA: if ((buf[0xC] == 0) && (buf[0xD] == 0) && (buf[0xE] == 0) && (buf[0xF] == 1)) { ver = "0.1.2.0"; } else if ((buf[0xC] == 0) && (buf[0xD] <= 3) && (buf[0xE] <= 3) && (buf[0xF] <= 1)) { ver = "0." + buf[0xD] + "." + buf[0xE] + "." + buf[0xF]; } else { ver = (buf[0x8] & 0x7F) + "." + buf[0x9] + "." + buf[0xA] + "." + buf[0xB]; } break; case CLI_LICQ: ver = buf[0xC] + "." + (buf[0xD] % 100) + "." + buf[0xE]; break; case CLI_KOPETE: ver = buf[0xC] + "." + buf[0xD] + "." + buf[0xE] + "." + buf[0xF]; break; case CLI_ANDRQ: ver = (char) buf[0xC] + "." + (char) buf[0xB];// + "." +buf[0xA] + "." +buf[9]; break; case CLI_JIMM: ver = Util.byteArrayToString(buf, 5, 11); break; case CLI_QIP: ver = Util.byteArrayToString(buf, 11, 5); break; case CLI_MCHAT: ver = Util.byteArrayToString(buf, 0, 16); break; case CLI_SMAPER: ver = Util.byteArrayToString(buf, CAP_SMAPER.length, 16-CAP_SMAPER.length); break; case CLI_QUTIM: if (buf[6] == 46) { // old qutim id int ver1 = buf[5] - 48; int ver2 = buf[7] - 48; ver = " v" + ver1 + "."+ver2; } else { // new qutim id int ver1 = buf[6]; int ver2 = buf[7]; int ver3 = buf[8]; int svn = Util.getWord(buf, 9, true); ver = " v" + ver1 + "." + ver2 + "." + ver3 + " svn" + svn; switch (buf[5]) { case 'l': ver += " (Linux)"; break; case 'w': ver += " (Windows)"; break; case 'm': ver += " (MacOS)"; break; case 'u': default: ver += " (Unknown OS)"; break; } } break; case CLI_JIMM_DICHAT: ver = Util.byteArrayToString(buf, CAP_JIMM_DICHAT.length, 16-CAP_JIMM_DICHAT.length); break; } return ver; } // Merge two received capabilities into one byte array public static byte[] mergeCapabilities(byte[] capabilities_old, byte[] capabilities_new) { if (capabilities_new == null) return capabilities_old; if (capabilities_old == null) return capabilities_new; // Extend new capabilities to match with old ones byte[] extended_new = new byte[capabilities_new.length * 8]; for (int i = 0; i < capabilities_new.length; i += 2) { System.arraycopy(CAP_OLD_HEAD, 0, extended_new, (i * 8), CAP_OLD_HEAD.length); System.arraycopy(capabilities_new, i, extended_new, ((i * 8) + CAP_OLD_HEAD.length), 2); System.arraycopy(CAP_OLD_TAIL, 0, extended_new, ((i * 8) + CAP_OLD_HEAD.length + 2), CAP_OLD_TAIL.length); } // Check for coexisting capabilities and merge boolean found = false; byte[] tmp_old; byte[] tmp_new; byte[] merged; for (int i = 0; i < capabilities_old.length; i += 16) { tmp_old = new byte[16]; System.arraycopy(capabilities_old, i, tmp_old, 0, 16); for (int j = 0; j < extended_new.length; j += 16) { //System.out.println(j + " " + i + " " + extended_new.length); tmp_new = new byte[16]; System.arraycopy(extended_new, j, tmp_new, 0, 16); if (tmp_old == tmp_new) { found = true; break; } } if (!found) { //System.out.println("Merge capability"); merged = new byte[extended_new.length + 16]; System.arraycopy(extended_new, 0, merged, 0, extended_new.length); System.arraycopy(tmp_old, 0, merged, extended_new.length, tmp_old.length); extended_new = merged; found = false; } } return extended_new; } static public void sendCLI_ADDSTART() throws JimmException { sendPacket(new SnacPacket(SnacPacket.CLI_ADDSTART_FAMILY, SnacPacket.CLI_ADDSTART_COMMAND, SnacPacket.CLI_ADDSTART_COMMAND, new byte[0], new byte[0])); } static public void sendCLI_ADDEND() throws JimmException { sendPacket(new SnacPacket(SnacPacket.CLI_ADDEND_FAMILY, SnacPacket.CLI_ADDEND_COMMAND, SnacPacket.CLI_ADDEND_COMMAND, new byte[0], new byte[0])); } static public final int PROCESS_BUDDY_ADD = 10000; static public final int PROCESS_BUDDY_DELETE = 10001; static public void sendProcessBuddy(int mode, String name, int id, int groupId, int buddyType) throws JimmException { ByteArrayOutputStream buffer = new ByteArrayOutputStream(); /* Name */ Util.writeLenAndString(buffer, name, true); /* Group ID */ Util.writeWord(buffer, groupId, true); /* ID */ Util.writeWord(buffer, id, true); /* Type */ Util.writeWord(buffer, buddyType, true); /* No additional data */ Util.writeWord(buffer, 0, true); int command = -1; switch (mode) { case PROCESS_BUDDY_ADD: command = SnacPacket.CLI_ROSTERADD_COMMAND; break; case PROCESS_BUDDY_DELETE: command = SnacPacket.CLI_ROSTERDELETE_COMMAND; break; default: throw new JimmException(0, 0); } SnacPacket packet = new SnacPacket(0x0013, command, Util.getCounter(), new byte[0], buffer.toByteArray()); sendPacket(packet); } public static boolean runActionAndProcessError(Action act) { try { Icq.requestAction(act); } catch (JimmException e) { JimmException.handleException(e); return false; } SplashCanvas.addTimerTask("wait", act, false); return true; } public static void removeLocalContact(String uin) { byte[] buf = new byte[1 + uin.length()]; Util.putByte(buf, 0, uin.length()); System.arraycopy(uin.getBytes(), 0, buf, 1, uin.length()); try { sendPacket(new SnacPacket(0x0003, 0x0005, 0, new byte[0], buf)); } catch (JimmException e) { JimmException.handleException(e); } } // Adds a ContactItem to the server saved contact list static public synchronized void addToContactList( ContactItem cItem) { // Request contact item adding UpdateContactListAction act = new UpdateContactListAction(cItem, UpdateContactListAction.ACTION_ADD); try { requestAction(act); } catch (JimmException e) { JimmException.handleException(e); if (e.isCritical()) return; } // Start timer SplashCanvas.addTimerTask("wait", act, false); // System.out.println("start addContact"); } // Dels a ContactItem to the server saved contact list static public synchronized boolean delFromContactList( ContactItem cItem) { // Check whether contact item is temporary if (cItem.getBooleanValue(ContactItem.CONTACTITEM_IS_TEMP) && !cItem.getBooleanValue(ContactItem.CONTACTITEM_IS_PHANTOM)) { // Remove this temporary contact item removeLocalContact(cItem .getStringValue(ContactItem.CONTACTITEM_UIN)); ContactList.removeContactItem(cItem); // Activate contact list ContactList.activateList(); } else { // Request contact item removal UpdateContactListAction act2 = new UpdateContactListAction(cItem, UpdateContactListAction.ACTION_DEL); try { Icq.requestAction(act2); } catch (JimmException e) { JimmException.handleException(e); if (e.isCritical()) return false; } // Start timer SplashCanvas.addTimerTask("wait", act2, false); } return true; } //#sijapp cond.if target isnot "DEFAULT"# public synchronized static void beginTyping(String uin, boolean isTyping) throws JimmException { byte[] uinRaw = Util.stringToByteArray(uin); int tempBuffLen = Icq.MTN_PACKET_BEGIN.length + 1 + uinRaw.length + 2; int marker = 0; byte[] tempBuff = new byte[tempBuffLen]; System.arraycopy(Icq.MTN_PACKET_BEGIN, 0, tempBuff, marker, Icq.MTN_PACKET_BEGIN.length); marker += Icq.MTN_PACKET_BEGIN.length; Util.putByte(tempBuff, marker, uinRaw.length); marker += 1; System.arraycopy(uinRaw, 0, tempBuff, marker, uinRaw.length); marker += uinRaw.length; Util.putWord(tempBuff, marker, ((isTyping) ? (0x0002) : (0x0000))); marker += 2; // Send packet SnacPacket snacPkt = new SnacPacket(0x0004, 0x
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -