⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 workgroupiqhandler.java

📁 openfire 服务器源码下载
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
        }
        else if ("jabber:iq:private".equals(queryNamespace)) {
            // IQ private for agents global macro storage
            setIQPrivate(packet);
        }
        else if ("agent-info".equals(queryName)) {
            if (!JiveGlobals.getBooleanProperty("xmpp.live.agent.change-properties", true)) {
                // Answer that agents are not allowed to change their properties (feature disabled)
                reply = IQ.createResultIQ(packet);
                reply.setChildElement(packet.getChildElement().createCopy());
                reply.setError(new PacketError(PacketError.Condition.service_unavailable));
            }
            else {
                try {
                    AgentSession agentSession = agentManager.getAgentSession(packet.getFrom());
                    if (agentSession == null) {
                        reply = IQ.createResultIQ(packet);
                        reply.setChildElement(packet.getChildElement().createCopy());
                        reply.setError(new PacketError(PacketError.Condition.item_not_found));
                    }
                    else {
                        String allowsToChange = agentSession.getAgent().getProperties().getProperty("change-properties");
                        if (!"false".equals(allowsToChange)) {
                            // Set the new agent's info
                            agentSession.getAgent().updateAgentInfo(packet);
                        }
                        else {
                            // Answer that this agent is not allowed to change his properties
                            reply = IQ.createResultIQ(packet);
                            reply.setChildElement(packet.getChildElement().createCopy());
                            reply.setError(new PacketError(PacketError.Condition.service_unavailable));
                        }
                    }
                }
                catch (AgentNotFoundException e) {
                    reply = IQ.createResultIQ(packet);
                    reply.setChildElement(packet.getChildElement().createCopy());
                    reply.setError(new PacketError(PacketError.Condition.item_not_found));
                }
            }
        }
        else {
            // Check all Workgroup Providers for handling this SET request. If
            // none are found, send bad request error.
            for (WorkgroupProvider provider : providerManager.getWorkgroupProviders()) {
                // Handle packet?
                if (provider.handleSet(packet)) {
                    // If provider accepts responsibility, hand off packet.
                    provider.executeSet(packet, workgroup);
                    return;
                }
            }

            dropPacket(packet);
            reply.setChildElement(packet.getChildElement().createCopy());
            reply.setError(new PacketError(PacketError.Condition.bad_request));
        }

        if (reply != null) {
            workgroup.send(reply);
        }
    }

    private void handleIQGet(IQ packet) {
        IQ reply = null;
        // TODO: verify namespace and send error if wrong
        Element iq = packet.getChildElement();
        UserRequest request;

        final WorkgroupStats stats = new WorkgroupStats(workgroup);

        String name = iq.getName();
        String namespace = iq.getNamespaceURI();
        if ("queue-status".equals(name)) {
            try {
                request = UserRequest.getRequest(workgroup, packet.getFrom());
                request.updateQueueStatus(true);
            }
            catch (NotFoundException e) {
                reply = IQ.createResultIQ(packet);
                reply.setChildElement(packet.getChildElement().createCopy());
                reply.setError(new PacketError(PacketError.Condition.item_not_found));
            }
        }
        else if ("transcripts".equals(name)) {
            try {
                // Check if the sender of the packet is a connected Agent to this workgroup.
                // Otherwise return a not_authorized
                if (agentManager.getAgentSession(packet.getFrom()) == null) {
                    reply = IQ.createResultIQ(packet);
                    reply.setChildElement(packet.getChildElement().createCopy());
                    reply.setError(new PacketError(PacketError.Condition.not_authorized));
                }
                else {
                    String userID = iq.attributeValue("userID");
                    stats.getChatTranscripts(packet, userID);
                }
            }
            catch (AgentNotFoundException e) {
                reply = IQ.createResultIQ(packet);
                reply.setChildElement(packet.getChildElement().createCopy());
                reply.setError(new PacketError(PacketError.Condition.not_authorized));
            }
        }
        else if ("transcript".equals(name)) {
            try {
                // Check if the sender of the packet is a connected Agent to this workgroup.
                // Otherwise return a not_authorized
                if (agentManager.getAgentSession(packet.getFrom()) == null) {
                    reply = IQ.createResultIQ(packet);
                    reply.setChildElement(packet.getChildElement().createCopy());
                    reply.setError(new PacketError(PacketError.Condition.not_authorized));
                }
                else {
                    String sessionID = iq.attributeValue("sessionID");
                    stats.getChatTranscript(packet, sessionID);
                }
            }
            catch (AgentNotFoundException e) {
                reply = IQ.createResultIQ(packet);
                reply.setChildElement(packet.getChildElement().createCopy());
                reply.setError(new PacketError(PacketError.Condition.not_authorized));
            }
        }
        else if ("agent-status-request".equals(name)) {
            try {
                AgentSession agentSession = agentManager.getAgentSession(packet.getFrom());
                if (agentSession == null) {
                    reply = IQ.createResultIQ(packet);
                    reply.setChildElement(packet.getChildElement().createCopy());
                    reply.setError(new PacketError(PacketError.Condition.item_not_found));
                }
                else {
                    agentSession.sendAgentsInWorkgroup(packet, workgroup);
                }
            }
            catch (AgentNotFoundException e) {
                reply = IQ.createResultIQ(packet);
                reply.setChildElement(packet.getChildElement().createCopy());
                reply.setError(new PacketError(PacketError.Condition.item_not_found));
            }
        }
        else if ("agent-info".equals(name)) {
            try {
                // Send the agent's info to the session that requested its own information
                AgentSession agentSession = agentManager.getAgentSession(packet.getFrom());
                if (agentSession == null) {
                    reply = IQ.createResultIQ(packet);
                    reply.setChildElement(packet.getChildElement().createCopy());
                    reply.setError(new PacketError(PacketError.Condition.item_not_found));
                }
                else {
                    agentSession.sendAgentInfo(packet);
                }
            }
            catch (AgentNotFoundException e) {
                reply = IQ.createResultIQ(packet);
                reply.setChildElement(packet.getChildElement().createCopy());
                reply.setError(new PacketError(PacketError.Condition.item_not_found));
            }
        }
        else if ("occupants-info".equals(name)) {
            try {
                // Just check that the packet was sent by a logged agent to this workgroup
                AgentSession agentSession = agentManager.getAgentSession(packet.getFrom());
                if (agentSession == null) {
                    reply = IQ.createResultIQ(packet);
                    reply.setChildElement(packet.getChildElement().createCopy());
                    reply.setError(new PacketError(PacketError.Condition.not_authorized));
                }
                else {
                    // Send information about the occupants of the requested room
                    String roomID = iq.attributeValue("roomID");
                    workgroup.sendOccupantsInfo(packet, roomID);
                }
            }
            catch (AgentNotFoundException e) {
                reply = IQ.createResultIQ(packet);
                reply.setChildElement(packet.getChildElement().createCopy());
                reply.setError(new PacketError(PacketError.Condition.not_authorized));
            }
        }
        else if ("chat-settings".equals(name)) {
            ChatSettingsManager chatSettingsManager = ChatSettingsManager.getInstance();
            String key = iq.attributeValue("key");
            String type = iq.attributeValue("type");
            if (ModelUtil.hasLength(key)) {
                chatSettingsManager.getChatSettingByKey(packet, workgroup, key);
            }
            else if (ModelUtil.hasLength(type)) {
                try {
                    int typeInt = Integer.parseInt(type);
                    chatSettingsManager.getChatSettingsByType(packet, workgroup, typeInt);
                }
                catch (NumberFormatException e) {
                  // Bad type.
                }
            }
            else {
                chatSettingsManager.getAllChatSettings(packet, workgroup);
            }
        }
        else if ("jabber:iq:private".equals(namespace)) {
            // IQ private for agents global macro storage
            getIQPrivate(packet);
        }
        else if ("vcard-temp".equals(namespace)) {
            // Return workgroup's VCard
            getVCard(packet);
        }
        else {

            // Check all Workgroup Providers for handling this GET request. If
            // none are found, send bad request error.
            for (WorkgroupProvider provider : providerManager.getWorkgroupProviders()) {
                // Will provider handle the GET
                if (provider.handleGet(packet)) {
                    // Pass off packet
                    provider.executeGet(packet, workgroup);
                    return;
                }
            }

            dropPacket(packet);
            reply = IQ.createResultIQ(packet);
            reply.setChildElement(packet.getChildElement().createCopy());
            reply.setError(new PacketError(PacketError.Condition.bad_request));
        }
        if (reply != null) {
            workgroup.send(reply);
        }
    }

    private void setIQPrivate(IQ packet) {
        Element frag = packet.getChildElement();
        Element dataElement = (Element)frag.elementIterator().next();
        workgroupSettings.add(workgroup.getJID().toBareJID(), dataElement);
    }

    private void getIQPrivate(IQ packet) {
        WorkgroupSettings settings = new WorkgroupSettings();

        IQ replyPacket = null;
        Element child = packet.getChildElement();
        Element dataElement = (Element)child.elementIterator().next();

        if (dataElement != null) {
            if (IQ.Type.get.equals(packet.getType())) {
                replyPacket = IQ.createResultIQ(packet);
                Element dataStored = settings.get(workgroup.getJID().toBareJID(), dataElement);
                dataStored.setParent(null);

                child.remove(dataElement);
                child.setParent(null);
                replyPacket.setChildElement(child);
                child.add(dataStored);
            }
        }
        else {
            replyPacket = IQ.createResultIQ(packet);
            replyPacket.setChildElement("query", "jabber:iq:private");
        }

        workgroup.send(replyPacket);
    }

    private void getVCard(IQ packet) {
        IQ reply = IQ.createResultIQ(packet);
        Element vCard = packet.getChildElement().createCopy();
        reply.setChildElement(vCard);
        vCard.addElement("FN").setText(workgroup.getDisplayName());
        vCard.addElement("NICKNAME").setText(workgroup.getDisplayName());
        vCard.addElement("JABBERID").setText(workgroup.getJID().toString());

        workgroup.send(reply);
    }

    private void handleIQResult(IQ packet) {
        // Do nothing. Workgroups may receive IQ results from Agents after they accepted an offer.
    }

    private void handleIQError(IQ packet) {
        dropPacket(packet);
    }

    private void dropPacket(Packet packet) {
        ComponentManagerFactory.getComponentManager().getLog().info("Dropped packet: " +
                packet.toString());
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -