Search in sources :

Example 1 with SnacRequestAdapter

use of net.kano.joscar.snac.SnacRequestAdapter in project Openfire by igniterealtime.

the class BasicFlapConnection method handleSnacPacket.

@Override
protected void handleSnacPacket(SnacPacketEvent e) {
    Log.debug("OSCAR snac packet received: " + e);
    SnacCommand cmd = e.getSnacCommand();
    if (cmd instanceof ServerReadyCmd) {
        ServerReadyCmd src = (ServerReadyCmd) cmd;
        setSnacFamilies(src.getSnacFamilies());
        Collection<SnacFamilyInfo> familyInfos = SnacFamilyInfoFactory.getDefaultFamilyInfos(src.getSnacFamilies());
        setSnacFamilyInfos(familyInfos);
        getMainSession().registerSnacFamilies(this);
        request(new ClientVersionsCmd(familyInfos));
        request(new RateInfoRequest());
    } else if (cmd instanceof RecvImIcbm) {
        RecvImIcbm icbm = (RecvImIcbm) cmd;
        String sn = icbm.getSenderInfo().getScreenname();
        InstantMessage message = icbm.getMessage();
        String msg = StringUtils.convertFromHtml(message.getMessage());
        getMainSession().getTransport().sendMessage(getMainSession().getJID(), getMainSession().getTransport().convertIDToJID(sn), msg);
    } else if (cmd instanceof OldIcbm) {
        OldIcbm oicbm = (OldIcbm) cmd;
        if (oicbm.getMessageType() == OldIcbm.MTYPE_PLAIN) {
            String uin = String.valueOf(oicbm.getSender());
            String msg = StringUtils.convertFromHtml(oicbm.getReason());
            Log.debug("Got ICBM message " + uin + " with " + msg + "\n" + oicbm);
            //                InstantMessage message = oicbm.getMessage();
            //                Log.debug("Got ICBM message "+uin+" with "+message+"\n"+oicbm);
            //                String msg = StringUtils.unescapeFromXML(OscarTools.stripHtml(message.getMessage()));
            getMainSession().getTransport().sendMessage(getMainSession().getJID(), getMainSession().getTransport().convertIDToJID(uin), msg);
        }
    } else if (cmd instanceof WarningNotification) {
        WarningNotification wn = (WarningNotification) cmd;
        MiniUserInfo warner = wn.getWarner();
        if (warner == null) {
            getMainSession().getTransport().sendMessage(getMainSession().getJID(), getMainSession().getTransport().getJID(), LocaleUtils.getLocalizedString("gateway.aim.warninganon", "kraken", Arrays.asList(wn.getNewLevel().toString())), Message.Type.headline);
        } else {
            Log.debug("*** " + warner.getScreenname() + " warned you up to " + wn.getNewLevel() + "%");
            getMainSession().getTransport().sendMessage(getMainSession().getJID(), getMainSession().getTransport().getJID(), LocaleUtils.getLocalizedString("gateway.aim.warningdirect", "kraken", Arrays.asList(warner.getScreenname(), wn.getNewLevel().toString())), Message.Type.headline);
        }
    } else if (cmd instanceof ExtraInfoAck) {
        ExtraInfoAck eia = (ExtraInfoAck) cmd;
        List<ExtraInfoBlock> extraInfo = eia.getExtraInfos();
        if (extraInfo != null) {
            for (ExtraInfoBlock i : extraInfo) {
                ExtraInfoData data = i.getExtraData();
                final byte[] pendingAvatar = getMainSession().getSsiHierarchy().getPendingAvatarData();
                if (JiveGlobals.getBooleanProperty("plugin.gateway." + getMainSession().getTransport().getType() + ".avatars", true) && (data.getFlags() & ExtraInfoData.FLAG_UPLOAD_ICON) != 0 && pendingAvatar != null) {
                    Log.debug("OSCAR: Server has indicated that it wants our icon.");
                    request(new UploadIconCmd(ByteBlock.wrap(pendingAvatar)), new SnacRequestAdapter() {

                        @Override
                        public void handleResponse(SnacResponseEvent e) {
                            SnacCommand cmd = e.getSnacCommand();
                            if (cmd instanceof UploadIconAck && pendingAvatar != null) {
                                UploadIconAck iconAck = (UploadIconAck) cmd;
                                if (iconAck.getCode() == UploadIconAck.CODE_DEFAULT || iconAck.getCode() == UploadIconAck.CODE_SUCCESS) {
                                    ExtraInfoBlock iconInfo = iconAck.getIconInfo();
                                    if (iconInfo == null) {
                                        Log.debug("OSCAR: Got icon ack with no iconInfo: " + iconAck);
                                    }
                                    Log.debug("OSCAR: Successfully set icon.");
                                    try {
                                        MessageDigest md = MessageDigest.getInstance("MD5");
                                        md.update(pendingAvatar);
                                        getMainSession().getAvatar().setLegacyIdentifier(org.jivesoftware.util.StringUtils.encodeHex(md.digest()));
                                    } catch (NoSuchAlgorithmException ee) {
                                        Log.error("No algorithm found for MD5!", ee);
                                    }
                                } else if (iconAck.getCode() == UploadIconAck.CODE_BAD_FORMAT) {
                                    Log.debug("OSCAR: Uploaded icon was not in an unaccepted format.");
                                } else if (iconAck.getCode() == UploadIconAck.CODE_TOO_LARGE) {
                                    Log.debug("OSCAR: Uploaded icon was too large to be accepted.");
                                } else {
                                    Log.debug("OSCAR: Got unknown code from UploadIconAck: " + iconAck.getCode());
                                }
                            } else if (cmd instanceof SnacError) {
                                Log.debug("Got SnacError while setting icon: " + cmd);
                            }
                            // Clear the pending binary data from Krakens memory.
                            getMainSession().getSsiHierarchy().clearPendingAvatar();
                        }
                    });
                }
            }
        }
    } else if (cmd instanceof BuddyStatusCmd) {
        BuddyStatusCmd bsc = (BuddyStatusCmd) cmd;
        FullUserInfo info = bsc.getUserInfo();
        PresenceType pType = PresenceType.available;
        String vStatus = "";
        if (info.getAwayStatus()) {
            pType = PresenceType.away;
        }
        if ((info.getFlags() & FullUserInfo.MASK_WIRELESS) != 0) {
            pType = PresenceType.xa;
            vStatus = "Mobile: ";
        }
        if (getMainSession().getTransport().getType().equals(TransportType.icq) && info.getScreenname().matches("/^\\d+$/")) {
            pType = ((OSCARTransport) getMainSession().getTransport()).convertICQStatusToXMPP(info.getIcqStatus());
        }
        List<ExtraInfoBlock> extraInfo = info.getExtraInfoBlocks();
        if (extraInfo != null) {
            for (ExtraInfoBlock i : extraInfo) {
                ExtraInfoData data = i.getExtraData();
                if (i.getType() == ExtraInfoBlock.TYPE_AVAILMSG) {
                    ByteBlock msgBlock = data.getData();
                    int len = BinaryTools.getUShort(msgBlock, 0);
                    if (len >= 0) {
                        byte[] msgBytes = msgBlock.subBlock(2, len).toByteArray();
                        String msg;
                        try {
                            msg = new String(msgBytes, "UTF-8");
                        } catch (UnsupportedEncodingException e1) {
                            continue;
                        }
                        if (msg.length() > 0) {
                            vStatus = vStatus + msg;
                        }
                    }
                } else if (i.getType() == ExtraInfoBlock.TYPE_ICONHASH && JiveGlobals.getBooleanProperty("plugin.gateway." + getMainSession().getTransport().getType() + ".avatars", true)) {
                    try {
                        OSCARBuddy oscarBuddy = getMainSession().getBuddyManager().getBuddy(getMainSession().getTransport().convertIDToJID(info.getScreenname()));
                        Avatar curAvatar = oscarBuddy.getAvatar();
                        if (curAvatar == null || !curAvatar.getLegacyIdentifier().equals(org.jivesoftware.util.StringUtils.encodeHex(i.getExtraData().getData().toByteArray()))) {
                            IconRequest req = new IconRequest(info.getScreenname(), i.getExtraData());
                            request(req, new SnacRequestAdapter() {

                                @Override
                                public void handleResponse(SnacResponseEvent e) {
                                    SnacCommand cmd = e.getSnacCommand();
                                    if (cmd instanceof IconDataCmd) {
                                        IconDataCmd idc = (IconDataCmd) cmd;
                                        if (idc.getIconData().getLength() > 0 && idc.getIconData().getLength() != 90) {
                                            Log.debug("Got icon data: " + idc);
                                            if (getMainSession().getBuddyManager().isActivated()) {
                                                try {
                                                    OSCARBuddy oscarBuddy = getMainSession().getBuddyManager().getBuddy(getMainSession().getTransport().convertIDToJID(idc.getScreenname()));
                                                    oscarBuddy.setAvatar(new Avatar(getMainSession().getTransport().convertIDToJID(idc.getScreenname()), org.jivesoftware.util.StringUtils.encodeHex(idc.getIconInfo().getExtraData().getData().toByteArray()), idc.getIconData().toByteArray()));
                                                } catch (NotFoundException ee) {
                                                // Apparently we don't care about this contact.
                                                } catch (IllegalArgumentException ee) {
                                                    Log.debug("OSCAR: Got null avatar, ignoring.");
                                                }
                                            }
                                        }
                                    }
                                }

                                @Override
                                public void handleTimeout(SnacRequestTimeoutEvent e) {
                                    Log.debug("Time out while waiting for icon data.");
                                }
                            });
                        }
                    } catch (NotFoundException ee) {
                    // Apparently we don't care about this contact.
                    }
                }
            }
        }
        if (getMainSession().getBuddyManager().isActivated()) {
            try {
                OSCARBuddy oscarBuddy = getMainSession().getBuddyManager().getBuddy(getMainSession().getTransport().convertIDToJID(info.getScreenname()));
                oscarBuddy.setPresenceAndStatus(pType, vStatus);
            } catch (NotFoundException ee) {
                // Apparently we don't care about this contact.
                Log.debug("OSCAR: Received presense notification for contact we don't care about: " + info.getScreenname());
            }
        } else {
            getMainSession().getBuddyManager().storePendingStatus(getMainSession().getTransport().convertIDToJID(info.getScreenname()), pType, vStatus);
        }
    } else if (cmd instanceof BuddyOfflineCmd) {
        BuddyOfflineCmd boc = (BuddyOfflineCmd) cmd;
        if (getMainSession().getBuddyManager().isActivated()) {
            try {
                OSCARBuddy oscarBuddy = getMainSession().getBuddyManager().getBuddy(getMainSession().getTransport().convertIDToJID(boc.getScreenname()));
                oscarBuddy.setPresence(PresenceType.unavailable);
            } catch (NotFoundException ee) {
            // Apparently we don't care about this contact.
            }
        } else {
            getMainSession().getBuddyManager().storePendingStatus(getMainSession().getTransport().convertIDToJID(boc.getScreenname()), PresenceType.unavailable, null);
        }
    } else if (cmd instanceof TypingCmd) {
        TypingCmd tc = (TypingCmd) cmd;
        String sn = tc.getScreenname();
        final ChatStateEventSource chatStateEventSource = getMainSession().getTransport().getChatStateEventSource();
        final JID receiver = getMainSession().getJID();
        final JID sender = getMainSession().getTransport().convertIDToJID(sn);
        if (tc.getTypingState() == TypingCmd.STATE_TYPING) {
            chatStateEventSource.isComposing(sender, receiver);
        } else if (tc.getTypingState() == TypingCmd.STATE_PAUSED) {
            chatStateEventSource.sendIsPaused(sender, receiver);
        } else if (tc.getTypingState() == TypingCmd.STATE_NO_TEXT) {
            chatStateEventSource.isInactive(sender, receiver);
        }
    }
}
Also used : SnacRequestAdapter(net.kano.joscar.snac.SnacRequestAdapter) PresenceType(net.sf.kraken.type.PresenceType) NotFoundException(org.jivesoftware.util.NotFoundException) NoSuchAlgorithmException(java.security.NoSuchAlgorithmException) FullUserInfo(net.kano.joscar.snaccmd.FullUserInfo) WarningNotification(net.kano.joscar.snaccmd.conn.WarningNotification) ExtraInfoData(net.kano.joscar.snaccmd.ExtraInfoData) SnacRequestTimeoutEvent(net.kano.joscar.snac.SnacRequestTimeoutEvent) ServerReadyCmd(net.kano.joscar.snaccmd.conn.ServerReadyCmd) ChatStateEventSource(net.sf.kraken.util.chatstate.ChatStateEventSource) ByteBlock(net.kano.joscar.ByteBlock) BuddyOfflineCmd(net.kano.joscar.snaccmd.buddy.BuddyOfflineCmd) List(java.util.List) RateInfoRequest(net.kano.joscar.snaccmd.conn.RateInfoRequest) MessageDigest(java.security.MessageDigest) IconDataCmd(net.kano.joscar.snaccmd.icon.IconDataCmd) RecvImIcbm(net.kano.joscar.snaccmd.icbm.RecvImIcbm) IconRequest(net.kano.joscar.snaccmd.icon.IconRequest) TypingCmd(net.kano.joscar.snaccmd.icbm.TypingCmd) JID(org.xmpp.packet.JID) ClientVersionsCmd(net.kano.joscar.snaccmd.conn.ClientVersionsCmd) InstantMessage(net.kano.joscar.snaccmd.icbm.InstantMessage) UnsupportedEncodingException(java.io.UnsupportedEncodingException) Avatar(net.sf.kraken.avatars.Avatar) BuddyStatusCmd(net.kano.joscar.snaccmd.buddy.BuddyStatusCmd) SnacFamilyInfo(net.kano.joscar.snaccmd.conn.SnacFamilyInfo) ExtraInfoBlock(net.kano.joscar.snaccmd.ExtraInfoBlock) SnacError(net.kano.joscar.snaccmd.error.SnacError) UploadIconCmd(net.kano.joscar.snaccmd.icon.UploadIconCmd) OldIcbm(net.kano.joscar.snaccmd.icbm.OldIcbm) SnacResponseEvent(net.kano.joscar.snac.SnacResponseEvent) UploadIconAck(net.kano.joscar.snaccmd.icon.UploadIconAck) SnacCommand(net.kano.joscar.flapcmd.SnacCommand) MiniUserInfo(net.kano.joscar.snaccmd.MiniUserInfo) ExtraInfoAck(net.kano.joscar.snaccmd.conn.ExtraInfoAck)

Aggregations

UnsupportedEncodingException (java.io.UnsupportedEncodingException)1 MessageDigest (java.security.MessageDigest)1 NoSuchAlgorithmException (java.security.NoSuchAlgorithmException)1 List (java.util.List)1 ByteBlock (net.kano.joscar.ByteBlock)1 SnacCommand (net.kano.joscar.flapcmd.SnacCommand)1 SnacRequestAdapter (net.kano.joscar.snac.SnacRequestAdapter)1 SnacRequestTimeoutEvent (net.kano.joscar.snac.SnacRequestTimeoutEvent)1 SnacResponseEvent (net.kano.joscar.snac.SnacResponseEvent)1 ExtraInfoBlock (net.kano.joscar.snaccmd.ExtraInfoBlock)1 ExtraInfoData (net.kano.joscar.snaccmd.ExtraInfoData)1 FullUserInfo (net.kano.joscar.snaccmd.FullUserInfo)1 MiniUserInfo (net.kano.joscar.snaccmd.MiniUserInfo)1 BuddyOfflineCmd (net.kano.joscar.snaccmd.buddy.BuddyOfflineCmd)1 BuddyStatusCmd (net.kano.joscar.snaccmd.buddy.BuddyStatusCmd)1 ClientVersionsCmd (net.kano.joscar.snaccmd.conn.ClientVersionsCmd)1 ExtraInfoAck (net.kano.joscar.snaccmd.conn.ExtraInfoAck)1 RateInfoRequest (net.kano.joscar.snaccmd.conn.RateInfoRequest)1 ServerReadyCmd (net.kano.joscar.snaccmd.conn.ServerReadyCmd)1 SnacFamilyInfo (net.kano.joscar.snaccmd.conn.SnacFamilyInfo)1