📄 updatecontactlistaction.java.svn-base
字号:
/******************************************************************************* Jimm - Mobile Messaging - J2ME ICQ clone Copyright (C) 2003-05 Jimm Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ******************************************************************************** File: src/jimm/comm/UpdateContactListAction.java Version: ###VERSION### Date: ###DATE### Author(s): Manuel Linsmayer, Andreas Rossbacher *******************************************************************************/package jimm.comm;import jimm.ContactItem;import jimm.ContactListGroupItem;import jimm.ContactListItem;import jimm.ContactList;import jimm.JimmException;import jimm.MainThread;import java.io.ByteArrayOutputStream;import java.util.*;public class UpdateContactListAction extends Action{ /* Action states */ private static final int STATE_ERROR = -1; private static final int STATE_CLI_ROSTERMODIFY_SENT = 1; private static final int STATE_COMPLETED = 2; private static final int STATE_MOVE1 = 3; private static final int STATE_MOVE2 = 4; private static final int STATE_REQ_AUTH1 = 5; private static final int STATE_ADD_CONTACT1 = 6; private static final int STATE_ADD_CONTACT2 = 14; private static final int STATE_DELETE_CONTACT1 = 7; private static final int STATE_DELETE_CONTACT2 = 8; private static final int STATE_DELETE_GROUP1 = 9; private static final int STATE_DELETE_GROUP2 = 10; private static final int STATE_ADD_GROUP1 = 11; private static final int STATE_ADD_GROUP2 = 12; /* Action types */ public static final int ACTION_ADD = 1; public static final int ACTION_DEL = 2; public static final int ACTION_RENAME = 3; public static final int ACTION_MOVE = 4; public static final int ACTION_REQ_AUTH = 5; public static final int ACTION_PRIV_LISTS = 6; /* Timeout */ public static final int TIMEOUT = 10 * 1000; // milliseconds /** ************************************************************************* */ /* Contact item */ private ContactItem cItem; /* Group item */ private ContactListGroupItem gItem, newGItem; /* Action state */ private int state; /* Action type */ private int action; /* Type of error happend */ private int errorCode; /* Last activity */ private long lastActivity = System.currentTimeMillis(); /* Constructor (removes or adds given contact item) */ public UpdateContactListAction(ContactListItem cItem, int _action) { super(false, true); this.action = _action; if (cItem instanceof ContactItem) { this.cItem = (ContactItem) cItem; this.gItem = null; } else { this.cItem = null; this.gItem = (ContactListGroupItem) cItem; } } public UpdateContactListAction(ContactItem cItem, ContactListGroupItem oldGroup, ContactListGroupItem newGroup) { super(false, true); this.cItem = cItem; this.gItem = oldGroup; this.newGItem = newGroup; action = ACTION_MOVE; } public UpdateContactListAction(Vector privacyChanges) { super(false, true); } /* Init action */ protected void init() throws JimmException { SnacPacket packet; byte[] buf = null; if (this.action != ACTION_RENAME) { /* Send a CLI_ADDSTART packet */ Icq.sendCLI_ADDSTART(); } switch (action) { /* Send a CLI_ROSTERUPDATE packet */ case ACTION_RENAME: if (cItem != null) buf = packRosterItem(cItem, 0); else if (gItem != null) buf = packRosterItem(gItem); else { this.state = UpdateContactListAction.STATE_ERROR; break; } packet = new SnacPacket(SnacPacket.CLI_ROSTERUPDATE_FAMILY, SnacPacket.CLI_ROSTERUPDATE_COMMAND, Util.getCounter(), new byte[0], buf); Icq.sendPacket(packet); this.state = UpdateContactListAction.STATE_CLI_ROSTERMODIFY_SENT; break; /* Send CLI_ROSTERADDpacket */ case ACTION_ADD: case ACTION_REQ_AUTH: if (cItem != null) { int groupId = cItem.getIntValue(ContactItem.CONTACTITEM_GROUP); gItem = ContactList.getGroupById(groupId); cItem.setIntValue(ContactItem.CONTACTITEM_ID, ContactList.generateNewIdForBuddy()); MainThread.addContact(cItem); buf = packRosterItem(cItem, groupId); if (action == ACTION_REQ_AUTH) state = STATE_REQ_AUTH1; else state = STATE_ADD_CONTACT1; } else if (gItem != null) { buf = packRosterItem(gItem); state = STATE_ADD_GROUP1; } else { this.state = UpdateContactListAction.STATE_ERROR; break; } packet = new SnacPacket(SnacPacket.CLI_ROSTERADD_FAMILY, SnacPacket.CLI_ROSTERADD_COMMAND, Util.getCounter(), new byte[0], buf); Icq.sendPacket(packet); break; /* Send a CLI_ROSTERDELETE packet */ case ACTION_DEL: if (cItem != null) { buf = packRosterItem(cItem, 0); this.state = STATE_DELETE_CONTACT1; } else if (gItem != null) { buf = packRosterItem(gItem); this.state = STATE_DELETE_GROUP1; } else { this.state = UpdateContactListAction.STATE_ERROR; break; } packet = new SnacPacket(SnacPacket.CLI_ROSTERDELETE_FAMILY, SnacPacket.CLI_ROSTERDELETE_COMMAND, Util.getCounter(), new byte[0], buf); Icq.sendPacket(packet); break; case ACTION_MOVE: Icq.sendPacket ( new SnacPacket ( SnacPacket.CLI_ROSTERUPDATE_FAMILY, SnacPacket.CLI_ROSTERDELETE_COMMAND, SnacPacket.CLI_ROSTERDELETE_COMMAND|((ContactList.generateNewIdForBuddy() << 16)&0x7FFF0000), new byte[0], packRosterItem(cItem, gItem.getId()) ) ); cItem.setIntValue(ContactItem.CONTACTITEM_GROUP, newGItem.getId()); cItem.setIntValue(ContactItem.CONTACTITEM_ID, ContactList.generateNewIdForBuddy()); Icq.sendPacket ( new SnacPacket ( SnacPacket.CLI_ROSTERUPDATE_FAMILY, SnacPacket.CLI_ROSTERADD_COMMAND, SnacPacket.CLI_ROSTERADD_COMMAND|((ContactList.generateNewIdForBuddy() << 16)&0x7FFF0000), new byte[0], packRosterItem(cItem, newGItem.getId()) ) ); state = STATE_MOVE1; break; } } private boolean processPaket(Packet packet) throws JimmException { /* Flag indicates whether packet has been consumed or not */ boolean consumed = false; /* Watch out for SRV_UPDATEACK packet type */ if (packet instanceof SnacPacket) { SnacPacket snacPacket = (SnacPacket) packet; if ((snacPacket.getFamily() == SnacPacket.SRV_UPDATEACK_FAMILY) && (snacPacket.getCommand() == SnacPacket.SRV_UPDATEACK_COMMAND)) { // Check error code, see ICQv8 specification int retCode = Util.getWord(snacPacket.getData(), 0); switch (retCode) { case 0x002: errorCode = 154; break; case 0x003: errorCode = 155; break; case 0x00A: errorCode = 156; break; case 0x00C: errorCode = 157; break; case 0x00D: errorCode = 158; break; } if (errorCode != 0) { state = STATE_ERROR; return true; } switch (state) { /* STATE_DELETE_GROUP */ case STATE_DELETE_GROUP1: sendGroupsList(); this.state = STATE_DELETE_GROUP2; break; case STATE_DELETE_GROUP2: ContactList.removeGroup(this.gItem); this.state = STATE_COMPLETED; Icq.sendCLI_ADDEND(); break; /* STATE_ADD_GROUP */ case STATE_ADD_GROUP1: sendGroupsList();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -