📄 workgroupiqhandler.java
字号:
}
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 + -