导航菜单

页面标题

页面副标题

95爱播免登录版 v3.1.9 - AgentSession.java 源代码

正在查看: 95爱播免登录版 v3.1.9 应用的 AgentSession.java JAVA 源代码文件

本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。


package org.jivesoftware.smackx.workgroup.agent;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.jivesoftware.smack.Connection;
import org.jivesoftware.smack.PacketCollector;
import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.SmackConfiguration;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.AndFilter;
import org.jivesoftware.smack.filter.FromContainsFilter;
import org.jivesoftware.smack.filter.OrFilter;
import org.jivesoftware.smack.filter.PacketFilter;
import org.jivesoftware.smack.filter.PacketIDFilter;
import org.jivesoftware.smack.filter.PacketTypeFilter;
import org.jivesoftware.smack.packet.DefaultPacketExtension;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.util.StringUtils;
import org.jivesoftware.smackx.Form;
import org.jivesoftware.smackx.ReportedData;
import org.jivesoftware.smackx.packet.MUCUser;
import org.jivesoftware.smackx.workgroup.MetaData;
import org.jivesoftware.smackx.workgroup.QueueUser;
import org.jivesoftware.smackx.workgroup.WorkgroupInvitation;
import org.jivesoftware.smackx.workgroup.WorkgroupInvitationListener;
import org.jivesoftware.smackx.workgroup.agent.WorkgroupQueue;
import org.jivesoftware.smackx.workgroup.ext.history.AgentChatHistory;
import org.jivesoftware.smackx.workgroup.ext.history.ChatMetadata;
import org.jivesoftware.smackx.workgroup.ext.macros.MacroGroup;
import org.jivesoftware.smackx.workgroup.ext.macros.Macros;
import org.jivesoftware.smackx.workgroup.ext.notes.ChatNotes;
import org.jivesoftware.smackx.workgroup.packet.AgentStatus;
import org.jivesoftware.smackx.workgroup.packet.DepartQueuePacket;
import org.jivesoftware.smackx.workgroup.packet.MonitorPacket;
import org.jivesoftware.smackx.workgroup.packet.OccupantsInfo;
import org.jivesoftware.smackx.workgroup.packet.OfferRequestProvider;
import org.jivesoftware.smackx.workgroup.packet.OfferRevokeProvider;
import org.jivesoftware.smackx.workgroup.packet.QueueDetails;
import org.jivesoftware.smackx.workgroup.packet.QueueOverview;
import org.jivesoftware.smackx.workgroup.packet.RoomInvitation;
import org.jivesoftware.smackx.workgroup.packet.RoomTransfer;
import org.jivesoftware.smackx.workgroup.packet.SessionID;
import org.jivesoftware.smackx.workgroup.packet.Transcript;
import org.jivesoftware.smackx.workgroup.packet.Transcripts;
import org.jivesoftware.smackx.workgroup.settings.GenericSettings;
import org.jivesoftware.smackx.workgroup.settings.SearchSettings;

public class AgentSession {
    private Agent agent;
    private Connection connection;
    private final List<WorkgroupInvitationListener> invitationListeners;
    private int maxChats;
    private final Map<String, List<String>> metaData;
    private final List<OfferListener> offerListeners;
    private PacketListener packetListener;
    private Presence.Mode presenceMode;
    private final List<QueueUsersListener> queueUsersListeners;
    private Map<String, WorkgroupQueue> queues;
    private TranscriptManager transcriptManager;
    private TranscriptSearchManager transcriptSearchManager;
    private String workgroupJID;
    private boolean online = false;
    private AgentRoster agentRoster = null;

    public AgentSession(String str, Connection connection) {
        if (!connection.isAuthenticated()) {
            throw new IllegalStateException("Must login to server before creating workgroup.");
        }
        this.workgroupJID = str;
        this.connection = connection;
        this.transcriptManager = new TranscriptManager(connection);
        this.transcriptSearchManager = new TranscriptSearchManager(connection);
        this.maxChats = -1;
        this.metaData = new HashMap();
        this.queues = new HashMap();
        this.offerListeners = new ArrayList();
        this.invitationListeners = new ArrayList();
        this.queueUsersListeners = new ArrayList();
        OrFilter orFilter = new OrFilter();
        orFilter.addFilter(new PacketTypeFilter(OfferRequestProvider.OfferRequestPacket.class));
        orFilter.addFilter(new PacketTypeFilter(OfferRevokeProvider.OfferRevokePacket.class));
        orFilter.addFilter(new PacketTypeFilter(Presence.class));
        orFilter.addFilter(new PacketTypeFilter(Message.class));
        PacketListener packetListener = new PacketListener() {
            public void processPacket(Packet packet) {
                try {
                    AgentSession.this.handlePacket(packet);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        this.packetListener = packetListener;
        connection.addPacketListener(packetListener, orFilter);
        this.agent = new Agent(connection, str);
    }

    private void fireInvitationEvent(String str, String str2, String str3, String str4, Map<String, List<String>> map) {
        WorkgroupInvitation workgroupInvitation = new WorkgroupInvitation(this.connection.getUser(), str, this.workgroupJID, str2, str3, str4, map);
        synchronized (this.invitationListeners) {
            Iterator<WorkgroupInvitationListener> it = this.invitationListeners.iterator();
            while (it.hasNext()) {
                it.next().invitationReceived(workgroupInvitation);
            }
        }
    }

    private void fireOfferRequestEvent(OfferRequestProvider.OfferRequestPacket offerRequestPacket) {
        Offer offer = new Offer(this.connection, this, offerRequestPacket.getUserID(), offerRequestPacket.getUserJID(), getWorkgroupJID(), new Date(new Date().getTime() + (offerRequestPacket.getTimeout() * 1000)), offerRequestPacket.getSessionID(), offerRequestPacket.getMetaData(), offerRequestPacket.getContent());
        synchronized (this.offerListeners) {
            Iterator<OfferListener> it = this.offerListeners.iterator();
            while (it.hasNext()) {
                it.next().offerReceived(offer);
            }
        }
    }

    private void fireOfferRevokeEvent(OfferRevokeProvider.OfferRevokePacket offerRevokePacket) {
        RevokedOffer revokedOffer = new RevokedOffer(offerRevokePacket.getUserJID(), offerRevokePacket.getUserID(), getWorkgroupJID(), offerRevokePacket.getSessionID(), offerRevokePacket.getReason(), new Date());
        synchronized (this.offerListeners) {
            Iterator<OfferListener> it = this.offerListeners.iterator();
            while (it.hasNext()) {
                it.next().offerRevoked(revokedOffer);
            }
        }
    }

    private void fireQueueUsersEvent(WorkgroupQueue workgroupQueue, WorkgroupQueue.Status status, int i, Date date, Set<QueueUser> set) {
        synchronized (this.queueUsersListeners) {
            for (QueueUsersListener queueUsersListener : this.queueUsersListeners) {
                if (status != null) {
                    queueUsersListener.statusUpdated(workgroupQueue, status);
                }
                if (i != -1) {
                    queueUsersListener.averageWaitTimeUpdated(workgroupQueue, i);
                }
                if (date != null) {
                    queueUsersListener.oldestEntryUpdated(workgroupQueue, date);
                }
                if (set != null) {
                    queueUsersListener.usersUpdated(workgroupQueue, set);
                }
            }
        }
    }

    public void handlePacket(Packet packet) {
        if (packet instanceof OfferRequestProvider.OfferRequestPacket) {
            IQ iq = new IQ() {
                public String getChildElementXML() {
                    return null;
                }
            };
            iq.setPacketID(packet.getPacketID());
            iq.setTo(packet.getFrom());
            iq.setType(IQ.Type.RESULT);
            this.connection.sendPacket(iq);
            fireOfferRequestEvent((OfferRequestProvider.OfferRequestPacket) packet);
            return;
        }
        if (!(packet instanceof Presence)) {
            if (!(packet instanceof Message)) {
                if (packet instanceof OfferRevokeProvider.OfferRevokePacket) {
                    IQ iq2 = new IQ() {
                        public String getChildElementXML() {
                            return null;
                        }
                    };
                    iq2.setPacketID(packet.getPacketID());
                    iq2.setType(IQ.Type.RESULT);
                    this.connection.sendPacket(iq2);
                    fireOfferRevokeEvent((OfferRevokeProvider.OfferRevokePacket) packet);
                    return;
                }
                return;
            }
            Message message = (Message) packet;
            MUCUser mUCUser = (MUCUser) message.getExtension("x", "http://jabber.org/protocol/muc#user");
            MUCUser.Invite invite = mUCUser != null ? mUCUser.getInvite() : null;
            if (invite == null || !this.workgroupJID.equals(invite.getFrom())) {
                return;
            }
            SessionID sessionID = (SessionID) message.getExtension(SessionID.ELEMENT_NAME, "http://jivesoftware.com/protocol/workgroup");
            String sessionID2 = sessionID != null ? sessionID.getSessionID() : null;
            MetaData metaData = (MetaData) message.getExtension(MetaData.ELEMENT_NAME, "http://jivesoftware.com/protocol/workgroup");
            fireInvitationEvent(message.getFrom(), sessionID2, message.getBody(), message.getFrom(), metaData != null ? metaData.getMetaData() : null);
            return;
        }
        Presence presence = (Presence) packet;
        String parseResource = StringUtils.parseResource(presence.getFrom());
        WorkgroupQueue workgroupQueue = this.queues.get(parseResource);
        if (workgroupQueue == null) {
            workgroupQueue = new WorkgroupQueue(parseResource);
            this.queues.put(parseResource, workgroupQueue);
        }
        WorkgroupQueue workgroupQueue2 = workgroupQueue;
        QueueOverview queueOverview = (QueueOverview) presence.getExtension(QueueOverview.ELEMENT_NAME, QueueOverview.NAMESPACE);
        if (queueOverview != null) {
            if (queueOverview.getStatus() == null) {
                workgroupQueue2.setStatus(WorkgroupQueue.Status.CLOSED);
            } else {
                workgroupQueue2.setStatus(queueOverview.getStatus());
            }
            workgroupQueue2.setAverageWaitTime(queueOverview.getAverageWaitTime());
            workgroupQueue2.setOldestEntry(queueOverview.getOldestEntry());
            fireQueueUsersEvent(workgroupQueue2, queueOverview.getStatus(), queueOverview.getAverageWaitTime(), queueOverview.getOldestEntry(), null);
            return;
        }
        QueueDetails queueDetails = (QueueDetails) packet.getExtension(QueueDetails.ELEMENT_NAME, "http://jabber.org/protocol/workgroup");
        if (queueDetails != null) {
            workgroupQueue2.setUsers(queueDetails.getUsers());
            fireQueueUsersEvent(workgroupQueue2, null, -1, null, queueDetails.getUsers());
            return;
        }
        DefaultPacketExtension extension = presence.getExtension("notify-agents", "http://jabber.org/protocol/workgroup");
        if (extension != null) {
            int parseInt = Integer.parseInt(extension.getValue("current-chats"));
            int parseInt2 = Integer.parseInt(extension.getValue("max-chats"));
            workgroupQueue2.setCurrentChats(parseInt);
            workgroupQueue2.setMaxChats(parseInt2);
        }
    }

    public void addInvitationListener(WorkgroupInvitationListener workgroupInvitationListener) {
        synchronized (this.invitationListeners) {
            if (!this.invitationListeners.contains(workgroupInvitationListener)) {
                this.invitationListeners.add(workgroupInvitationListener);
            }
        }
    }

    public void addOfferListener(OfferListener offerListener) {
        synchronized (this.offerListeners) {
            if (!this.offerListeners.contains(offerListener)) {
                this.offerListeners.add(offerListener);
            }
        }
    }

    public void addQueueUsersListener(QueueUsersListener queueUsersListener) {
        synchronized (this.queueUsersListeners) {
            if (!this.queueUsersListeners.contains(queueUsersListener)) {
                this.queueUsersListeners.add(queueUsersListener);
            }
        }
    }

    public void close() {
        this.connection.removePacketListener(this.packetListener);
    }

    public void dequeueUser(String str) throws XMPPException {
        this.connection.sendPacket(new DepartQueuePacket(this.workgroupJID));
    }

    public Agent getAgent() {
        return this.agent;
    }

    public AgentChatHistory getAgentHistory(String str, int i, Date date) throws XMPPException {
        AgentChatHistory agentChatHistory = date != null ? new AgentChatHistory(str, i, date) : new AgentChatHistory(str, i);
        agentChatHistory.setType(IQ.Type.GET);
        agentChatHistory.setTo(this.workgroupJID);
        PacketCollector createPacketCollector = this.connection.createPacketCollector(new PacketIDFilter(agentChatHistory.getPacketID()));
        this.connection.sendPacket(agentChatHistory);
        AgentChatHistory nextResult = createPacketCollector.nextResult(SmackConfiguration.getPacketReplyTimeout());
        createPacketCollector.cancel();
        if (nextResult == null) {
            throw new XMPPException("No response from server.");
        }
        if (nextResult.getError() == null) {
            return nextResult;
        }
        throw new XMPPException(nextResult.getError());
    }

    public AgentRoster getAgentRoster() {
        AgentRoster agentRoster;
        if (this.agentRoster == null) {
            this.agentRoster = new AgentRoster(this.connection, this.workgroupJID);
        }
        int i = 0;
        while (true) {
            agentRoster = this.agentRoster;
            if (agentRoster.rosterInitialized || i > 2000) {
                break;
            }
            try {
                Thread.sleep(500L);
            } catch (Exception unused) {
            }
            i += 500;
        }
        return agentRoster;
    }

    public Map<String, List<String>> getChatMetadata(String str) throws XMPPException {
        ChatMetadata chatMetadata = new ChatMetadata();
        chatMetadata.setType(IQ.Type.GET);
        chatMetadata.setTo(this.workgroupJID);
        chatMetadata.setSessionID(str);
        PacketCollector createPacketCollector = this.connection.createPacketCollector(new PacketIDFilter(chatMetadata.getPacketID()));
        this.connection.sendPacket(chatMetadata);
        ChatMetadata nextResult = createPacketCollector.nextResult(SmackConfiguration.getPacketReplyTimeout());
        createPacketCollector.cancel();
        if (nextResult == null) {
            throw new XMPPException("No response from server.");
        }
        if (nextResult.getError() == null) {
            return nextResult.getMetadata();
        }
        throw new XMPPException(nextResult.getError());
    }

    public GenericSettings getGenericSettings(Connection connection, String str) throws XMPPException {
        GenericSettings genericSettings = new GenericSettings();
        genericSettings.setType(IQ.Type.GET);
        genericSettings.setTo(this.workgroupJID);
        PacketCollector createPacketCollector = this.connection.createPacketCollector(new PacketIDFilter(genericSettings.getPacketID()));
        this.connection.sendPacket(genericSettings);
        GenericSettings nextResult = createPacketCollector.nextResult(SmackConfiguration.getPacketReplyTimeout());
        createPacketCollector.cancel();
        if (nextResult == null) {
            throw new XMPPException("No response from server on status set.");
        }
        if (nextResult.getError() == null) {
            return nextResult;
        }
        throw new XMPPException(nextResult.getError());
    }

    public MacroGroup getMacros(boolean z) throws XMPPException {
        Macros macros = new Macros();
        macros.setType(IQ.Type.GET);
        macros.setTo(this.workgroupJID);
        macros.setPersonal(!z);
        PacketCollector createPacketCollector = this.connection.createPacketCollector(new PacketIDFilter(macros.getPacketID()));
        this.connection.sendPacket(macros);
        Macros nextResult = createPacketCollector.nextResult(SmackConfiguration.getPacketReplyTimeout());
        createPacketCollector.cancel();
        if (nextResult == null) {
            throw new XMPPException("No response from server.");
        }
        if (nextResult.getError() == null) {
            return nextResult.getRootGroup();
        }
        throw new XMPPException(nextResult.getError());
    }

    public int getMaxChats() {
        return this.maxChats;
    }

    public List<String> getMetaData(String str) {
        return this.metaData.get(str);
    }

    public ChatNotes getNote(String str) throws XMPPException {
        ChatNotes chatNotes = new ChatNotes();
        chatNotes.setType(IQ.Type.GET);
        chatNotes.setTo(this.workgroupJID);
        chatNotes.setSessionID(str);
        PacketCollector createPacketCollector = this.connection.createPacketCollector(new PacketIDFilter(chatNotes.getPacketID()));
        this.connection.sendPacket(chatNotes);
        ChatNotes nextResult = createPacketCollector.nextResult(SmackConfiguration.getPacketReplyTimeout());
        createPacketCollector.cancel();
        if (nextResult == null) {
            throw new XMPPException("No response from server.");
        }
        if (nextResult.getError() == null) {
            return nextResult;
        }
        throw new XMPPException(nextResult.getError());
    }

    public OccupantsInfo getOccupantsInfo(String str) throws XMPPException {
        OccupantsInfo occupantsInfo = new OccupantsInfo(str);
        occupantsInfo.setType(IQ.Type.GET);
        occupantsInfo.setTo(this.workgroupJID);
        PacketCollector createPacketCollector = this.connection.createPacketCollector(new PacketIDFilter(occupantsInfo.getPacketID()));
        this.connection.sendPacket(occupantsInfo);
        OccupantsInfo nextResult = createPacketCollector.nextResult(SmackConfiguration.getPacketReplyTimeout());
        createPacketCollector.cancel();
        if (nextResult == null) {
            throw new XMPPException("No response from server.");
        }
        if (nextResult.getError() == null) {
            return nextResult;
        }
        throw new XMPPException(nextResult.getError());
    }

    public Presence.Mode getPresenceMode() {
        return this.presenceMode;
    }

    public WorkgroupQueue getQueue(String str) {
        return this.queues.get(str);
    }

    public Iterator<WorkgroupQueue> getQueues() {
        return Collections.unmodifiableMap(new HashMap(this.queues)).values().iterator();
    }

    public SearchSettings getSearchSettings() throws XMPPException {
        SearchSettings searchSettings = new SearchSettings();
        searchSettings.setType(IQ.Type.GET);
        searchSettings.setTo(this.workgroupJID);
        PacketCollector createPacketCollector = this.connection.createPacketCollector(new PacketIDFilter(searchSettings.getPacketID()));
        this.connection.sendPacket(searchSettings);
        SearchSettings nextResult = createPacketCollector.nextResult(SmackConfiguration.getPacketReplyTimeout());
        createPacketCollector.cancel();
        if (nextResult == null) {
            throw new XMPPException("No response from server.");
        }
        if (nextResult.getError() == null) {
            return nextResult;
        }
        throw new XMPPException(nextResult.getError());
    }

    public Transcript getTranscript(String str) throws XMPPException {
        return this.transcriptManager.getTranscript(this.workgroupJID, str);
    }

    public Form getTranscriptSearchForm() throws XMPPException {
        return this.transcriptSearchManager.getSearchForm(StringUtils.parseServer(this.workgroupJID));
    }

    public Transcripts getTranscripts(String str) throws XMPPException {
        return this.transcriptManager.getTranscripts(this.workgroupJID, str);
    }

    public String getWorkgroupJID() {
        return this.workgroupJID;
    }

    public boolean hasMonitorPrivileges(Connection connection) throws XMPPException {
        MonitorPacket monitorPacket = new MonitorPacket();
        monitorPacket.setType(IQ.Type.GET);
        monitorPacket.setTo(this.workgroupJID);
        PacketCollector createPacketCollector = this.connection.createPacketCollector(new PacketIDFilter(monitorPacket.getPacketID()));
        this.connection.sendPacket(monitorPacket);
        MonitorPacket nextResult = createPacketCollector.nextResult(SmackConfiguration.getPacketReplyTimeout());
        createPacketCollector.cancel();
        if (nextResult == null) {
            throw new XMPPException("No response from server on status set.");
        }
        if (nextResult.getError() == null) {
            return nextResult.isMonitor();
        }
        throw new XMPPException(nextResult.getError());
    }

    public boolean isOnline() {
        return this.online;
    }

    public void makeRoomOwner(Connection connection, String str) throws XMPPException {
        MonitorPacket monitorPacket = new MonitorPacket();
        monitorPacket.setType(IQ.Type.SET);
        monitorPacket.setTo(this.workgroupJID);
        monitorPacket.setSessionID(str);
        PacketCollector createPacketCollector = this.connection.createPacketCollector(new PacketIDFilter(monitorPacket.getPacketID()));
        this.connection.sendPacket(monitorPacket);
        Packet nextResult = createPacketCollector.nextResult(SmackConfiguration.getPacketReplyTimeout());
        createPacketCollector.cancel();
        if (nextResult == null) {
            throw new XMPPException("No response from server on status set.");
        }
        if (nextResult.getError() != null) {
            throw new XMPPException(nextResult.getError());
        }
    }

    public void removeInvitationListener(WorkgroupInvitationListener workgroupInvitationListener) {
        synchronized (this.invitationListeners) {
            this.invitationListeners.remove(workgroupInvitationListener);
        }
    }

    public void removeMetaData(String str) throws XMPPException {
        synchronized (this.metaData) {
            if (this.metaData.remove(str) != null) {
                setStatus(this.presenceMode, this.maxChats);
            }
        }
    }

    public void removeOfferListener(OfferListener offerListener) {
        synchronized (this.offerListeners) {
            this.offerListeners.remove(offerListener);
        }
    }

    public void removeQueueUsersListener(QueueUsersListener queueUsersListener) {
        synchronized (this.queueUsersListeners) {
            this.queueUsersListeners.remove(queueUsersListener);
        }
    }

    public void saveMacros(MacroGroup macroGroup) throws XMPPException {
        Macros macros = new Macros();
        macros.setType(IQ.Type.SET);
        macros.setTo(this.workgroupJID);
        macros.setPersonal(true);
        macros.setPersonalMacroGroup(macroGroup);
        PacketCollector createPacketCollector = this.connection.createPacketCollector(new PacketIDFilter(macros.getPacketID()));
        this.connection.sendPacket(macros);
        IQ nextResult = createPacketCollector.nextResult(SmackConfiguration.getPacketReplyTimeout());
        createPacketCollector.cancel();
        if (nextResult == null) {
            throw new XMPPException("No response from server on status set.");
        }
        if (nextResult.getError() != null) {
            throw new XMPPException(nextResult.getError());
        }
    }

    public ReportedData searchTranscripts(Form form) throws XMPPException {
        return this.transcriptSearchManager.submitSearch(StringUtils.parseServer(this.workgroupJID), form);
    }

    public void sendRoomInvitation(RoomInvitation.Type type, String str, String str2, String str3) throws XMPPException {
        final RoomInvitation roomInvitation = new RoomInvitation(type, str, str2, str3);
        IQ iq = new IQ() {
            public String getChildElementXML() {
                return roomInvitation.toXML();
            }
        };
        iq.setType(IQ.Type.SET);
        iq.setTo(this.workgroupJID);
        iq.setFrom(this.connection.getUser());
        PacketCollector createPacketCollector = this.connection.createPacketCollector(new PacketIDFilter(iq.getPacketID()));
        this.connection.sendPacket(iq);
        IQ nextResult = createPacketCollector.nextResult(SmackConfiguration.getPacketReplyTimeout());
        createPacketCollector.cancel();
        if (nextResult == null) {
            throw new XMPPException("No response from server.");
        }
        if (nextResult.getError() != null) {
            throw new XMPPException(nextResult.getError());
        }
    }

    public void sendRoomTransfer(RoomTransfer.Type type, String str, String str2, String str3) throws XMPPException {
        final RoomTransfer roomTransfer = new RoomTransfer(type, str, str2, str3);
        IQ iq = new IQ() {
            public String getChildElementXML() {
                return roomTransfer.toXML();
            }
        };
        iq.setType(IQ.Type.SET);
        iq.setTo(this.workgroupJID);
        iq.setFrom(this.connection.getUser());
        PacketCollector createPacketCollector = this.connection.createPacketCollector(new PacketIDFilter(iq.getPacketID()));
        this.connection.sendPacket(iq);
        IQ nextResult = createPacketCollector.nextResult(SmackConfiguration.getPacketReplyTimeout());
        createPacketCollector.cancel();
        if (nextResult == null) {
            throw new XMPPException("No response from server.");
        }
        if (nextResult.getError() != null) {
            throw new XMPPException(nextResult.getError());
        }
    }

    public void setMetaData(String str, String str2) throws XMPPException {
        synchronized (this.metaData) {
            List<String> list = this.metaData.get(str);
            if (list == null || !list.get(0).equals(str2)) {
                list.set(0, str2);
                setStatus(this.presenceMode, this.maxChats);
            }
        }
    }

    public void setNote(String str, String str2) throws XMPPException {
        String escapeForXML = StringUtils.escapeForXML(ChatNotes.replace(str2, "\n", "\\n"));
        ChatNotes chatNotes = new ChatNotes();
        chatNotes.setType(IQ.Type.SET);
        chatNotes.setTo(this.workgroupJID);
        chatNotes.setSessionID(str);
        chatNotes.setNotes(escapeForXML);
        PacketCollector createPacketCollector = this.connection.createPacketCollector(new PacketIDFilter(chatNotes.getPacketID()));
        this.connection.sendPacket(chatNotes);
        IQ nextResult = createPacketCollector.nextResult(SmackConfiguration.getPacketReplyTimeout());
        createPacketCollector.cancel();
        if (nextResult == null) {
            throw new XMPPException("No response from server on status set.");
        }
        if (nextResult.getError() != null) {
            throw new XMPPException(nextResult.getError());
        }
    }

    public void setOnline(boolean z) throws XMPPException {
        if (this.online == z) {
            return;
        }
        if (!z) {
            this.online = z;
            Presence presence = new Presence(Presence.Type.unavailable);
            presence.setTo(this.workgroupJID);
            presence.addExtension(new DefaultPacketExtension(AgentStatus.ELEMENT_NAME, "http://jabber.org/protocol/workgroup"));
            this.connection.sendPacket(presence);
            return;
        }
        Presence presence2 = new Presence(Presence.Type.available);
        presence2.setTo(this.workgroupJID);
        presence2.addExtension(new DefaultPacketExtension(AgentStatus.ELEMENT_NAME, "http://jabber.org/protocol/workgroup"));
        PacketCollector createPacketCollector = this.connection.createPacketCollector(new AndFilter(new PacketFilter[]{new PacketTypeFilter(Presence.class), new FromContainsFilter(this.workgroupJID)}));
        this.connection.sendPacket(presence2);
        Presence nextResult = createPacketCollector.nextResult(5000L);
        createPacketCollector.cancel();
        if (!nextResult.isAvailable()) {
            throw new XMPPException("No response from server on status set.");
        }
        if (nextResult.getError() != null) {
            throw new XMPPException(nextResult.getError());
        }
        this.online = z;
    }

    public void setStatus(Presence.Mode mode, int i) throws XMPPException {
        setStatus(mode, i, null);
    }

    public void setStatus(Presence.Mode mode, int i, String str) throws XMPPException {
        if (!this.online) {
            throw new IllegalStateException("Cannot set status when the agent is not online.");
        }
        if (mode == null) {
            mode = Presence.Mode.available;
        }
        this.presenceMode = mode;
        this.maxChats = i;
        Presence presence = new Presence(Presence.Type.available);
        presence.setMode(mode);
        presence.setTo(getWorkgroupJID());
        if (str != null) {
            presence.setStatus(str);
        }
        DefaultPacketExtension defaultPacketExtension = new DefaultPacketExtension(AgentStatus.ELEMENT_NAME, "http://jabber.org/protocol/workgroup");
        StringBuilder sb = new StringBuilder();
        sb.append(i);
        defaultPacketExtension.setValue("max-chats", sb.toString());
        presence.addExtension(defaultPacketExtension);
        presence.addExtension(new MetaData(this.metaData));
        PacketCollector createPacketCollector = this.connection.createPacketCollector(new AndFilter(new PacketFilter[]{new PacketTypeFilter(Presence.class), new FromContainsFilter(this.workgroupJID)}));
        this.connection.sendPacket(presence);
        Presence nextResult = createPacketCollector.nextResult(5000L);
        createPacketCollector.cancel();
        if (!nextResult.isAvailable()) {
            throw new XMPPException("No response from server on status set.");
        }
        if (nextResult.getError() != null) {
            throw new XMPPException(nextResult.getError());
        }
    }

    public void setStatus(Presence.Mode mode, String str) throws XMPPException {
        if (this.online) {
            if (mode == null) {
                mode = Presence.Mode.available;
            }
            this.presenceMode = mode;
            Presence presence = new Presence(Presence.Type.available);
            presence.setMode(mode);
            presence.setTo(getWorkgroupJID());
            if (str != null) {
                presence.setStatus(str);
            }
            presence.addExtension(new MetaData(this.metaData));
            PacketCollector createPacketCollector = this.connection.createPacketCollector(new AndFilter(new PacketFilter[]{new PacketTypeFilter(Presence.class), new FromContainsFilter(this.workgroupJID)}));
            this.connection.sendPacket(presence);
            Presence nextResult = createPacketCollector.nextResult(5000L);
            createPacketCollector.cancel();
            if (nextResult.isAvailable()) {
                if (nextResult.getError() != null) {
                    throw new XMPPException(nextResult.getError());
                }
                return;
            }
            throw new XMPPException("No response from server on status set.");
        }
        throw new IllegalStateException("Cannot set status when the agent is not online.");
    }
}