public void processPacket(PresencePacket packet, PgpEngine pgp) { final Jid from = packet.getFrom(); if (!from.isBareJid()) { final String name = from.getResourcepart(); String type = packet.getAttribute("type"); if (type == null) { User user = new User(); Element x = packet.findChild("x", "http://jabber.org/protocol/muc#user"); if (x != null) { Element item = x.findChild("item"); if (item != null) { user.setName(name); user.setAffiliation(item.getAttribute("affiliation")); user.setRole(item.getAttribute("role")); user.setJid(item.getAttributeAsJid("jid")); user.setName(name); if (name.equals(this.joinnick)) { this.isOnline = true; this.error = ERROR_NO_ERROR; self = user; if (aboutToRename) { if (renameListener != null) { renameListener.onRename(true); } aboutToRename = false; } } else { addUser(user); } if (pgp != null) { Element signed = packet.findChild("x", "jabber:x:signed"); if (signed != null) { Element status = packet.findChild("status"); String msg; if (status != null) { msg = status.getContent(); } else { msg = ""; } user.setPgpKeyId(pgp.fetchKeyId(account, msg, signed.getContent())); } } } } } else if (type.equals("unavailable") && name.equals(this.joinnick)) { Element x = packet.findChild("x", "http://jabber.org/protocol/muc#user"); if (x != null) { Element status = x.findChild("status"); if (status != null) { String code = status.getAttribute("code"); if (STATUS_CODE_KICKED.equals(code)) { this.isOnline = false; this.error = KICKED_FROM_ROOM; } else if (STATUS_CODE_BANNED.equals(code)) { this.isOnline = false; this.error = ERROR_BANNED; } } } } else if (type.equals("unavailable")) { deleteUser(packet.getAttribute("from").split("/", 2)[1]); } else if (type.equals("error")) { Element error = packet.findChild("error"); if (error != null && error.hasChild("conflict")) { if (aboutToRename) { if (renameListener != null) { renameListener.onRename(false); } aboutToRename = false; this.setJoinNick(getActualNick()); } else { this.error = ERROR_NICK_IN_USE; } } else if (error != null && error.hasChild("not-authorized")) { this.error = ERROR_PASSWORD_REQUIRED; } else if (error != null && error.hasChild("forbidden")) { this.error = ERROR_BANNED; } else if (error != null && error.hasChild("registration-required")) { this.error = ERROR_MEMBERS_ONLY; } } } }
private void processConferencePresence(PresencePacket packet, MucOptions mucOptions) { final Jid from = packet.getFrom(); if (!from.isBareJid()) { final String type = packet.getAttribute("type"); final Element x = packet.findChild("x", "http://jabber.org/protocol/muc#user"); Avatar avatar = Avatar.parsePresence(packet.findChild("x", "vcard-temp:x:update")); final List<String> codes = getStatusCodes(x); if (type == null) { if (x != null) { Element item = x.findChild("item"); if (item != null && !from.isBareJid()) { mucOptions.setError(MucOptions.ERROR_NO_ERROR); MucOptions.User user = new MucOptions.User(mucOptions, from); user.setAffiliation(item.getAttribute("affiliation")); user.setRole(item.getAttribute("role")); user.setJid(item.getAttributeAsJid("jid")); if (codes.contains(MucOptions.STATUS_CODE_SELF_PRESENCE) || packet.getFrom().equals(mucOptions.getConversation().getJid())) { mucOptions.setOnline(); mucOptions.setSelf(user); if (mucOptions.mNickChangingInProgress) { if (mucOptions.onRenameListener != null) { mucOptions.onRenameListener.onSuccess(); } mucOptions.mNickChangingInProgress = false; } } else { mucOptions.addUser(user); } if (mXmppConnectionService.getPgpEngine() != null) { Element signed = packet.findChild("x", "jabber:x:signed"); if (signed != null) { Element status = packet.findChild("status"); String msg = status == null ? "" : status.getContent(); long keyId = mXmppConnectionService .getPgpEngine() .fetchKeyId(mucOptions.getAccount(), msg, signed.getContent()); if (keyId != 0) { user.setPgpKeyId(keyId); } } } if (avatar != null) { avatar.owner = from; if (mXmppConnectionService.getFileBackend().isAvatarCached(avatar)) { if (user.setAvatar(avatar)) { mXmppConnectionService.getAvatarService().clear(user); } } else { mXmppConnectionService.fetchAvatar(mucOptions.getAccount(), avatar); } } } } } else if (type.equals("unavailable")) { if (codes.contains(MucOptions.STATUS_CODE_SELF_PRESENCE) || packet.getFrom().equals(mucOptions.getConversation().getJid())) { if (codes.contains(MucOptions.STATUS_CODE_CHANGED_NICK)) { mucOptions.mNickChangingInProgress = true; } else if (codes.contains(MucOptions.STATUS_CODE_KICKED)) { mucOptions.setError(MucOptions.KICKED_FROM_ROOM); } else if (codes.contains(MucOptions.STATUS_CODE_BANNED)) { mucOptions.setError(MucOptions.ERROR_BANNED); } else if (codes.contains(MucOptions.STATUS_CODE_LOST_MEMBERSHIP)) { mucOptions.setError(MucOptions.ERROR_MEMBERS_ONLY); } else { mucOptions.setError(MucOptions.ERROR_UNKNOWN); Log.d(Config.LOGTAG, "unknown error in conference: " + packet); } } else if (!from.isBareJid()) { MucOptions.User user = mucOptions.deleteUser(from.getResourcepart()); if (user != null) { mXmppConnectionService.getAvatarService().clear(user); } } } else if (type.equals("error")) { Element error = packet.findChild("error"); if (error != null && error.hasChild("conflict")) { if (mucOptions.online()) { if (mucOptions.onRenameListener != null) { mucOptions.onRenameListener.onFailure(); } } else { mucOptions.setError(MucOptions.ERROR_NICK_IN_USE); } } else if (error != null && error.hasChild("not-authorized")) { mucOptions.setError(MucOptions.ERROR_PASSWORD_REQUIRED); } else if (error != null && error.hasChild("forbidden")) { mucOptions.setError(MucOptions.ERROR_BANNED); } else if (error != null && error.hasChild("registration-required")) { mucOptions.setError(MucOptions.ERROR_MEMBERS_ONLY); } } } }