blob: 8f56b788a68f863062e690a156c123084acb2a2f [file] [log] [blame]
Shuyi Chend7955ce2013-05-22 14:51:55 -07001/**
2 * $Revision$
3 * $Date$
4 *
5 * Copyright 2003-2007 Jive Software.
6 *
7 * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19
20package org.jivesoftware.smackx.workgroup.packet;
21
22import org.jivesoftware.smackx.workgroup.MetaData;
23import org.jivesoftware.smackx.workgroup.agent.InvitationRequest;
24import org.jivesoftware.smackx.workgroup.agent.OfferContent;
25import org.jivesoftware.smackx.workgroup.agent.TransferRequest;
26import org.jivesoftware.smackx.workgroup.agent.UserRequest;
27import org.jivesoftware.smackx.workgroup.util.MetaDataUtils;
28import org.jivesoftware.smack.packet.IQ;
29import org.jivesoftware.smack.provider.IQProvider;
30import org.jivesoftware.smack.util.PacketParserUtils;
31import org.xmlpull.v1.XmlPullParser;
32
33import java.util.HashMap;
34import java.util.List;
35import java.util.Map;
36
37/**
38 * An IQProvider for agent offer requests.
39 *
40 * @author loki der quaeler
41 */
42public class OfferRequestProvider implements IQProvider {
43
44 public OfferRequestProvider() {
45 }
46
47 public IQ parseIQ(XmlPullParser parser) throws Exception {
48 int eventType = parser.getEventType();
49 String sessionID = null;
50 int timeout = -1;
51 OfferContent content = null;
52 boolean done = false;
53 Map<String, List<String>> metaData = new HashMap<String, List<String>>();
54
55 if (eventType != XmlPullParser.START_TAG) {
56 // throw exception
57 }
58
59 String userJID = parser.getAttributeValue("", "jid");
60 // Default userID to the JID.
61 String userID = userJID;
62
63 while (!done) {
64 eventType = parser.next();
65
66 if (eventType == XmlPullParser.START_TAG) {
67 String elemName = parser.getName();
68
69 if ("timeout".equals(elemName)) {
70 timeout = Integer.parseInt(parser.nextText());
71 }
72 else if (MetaData.ELEMENT_NAME.equals(elemName)) {
73 metaData = MetaDataUtils.parseMetaData(parser);
74 }
75 else if (SessionID.ELEMENT_NAME.equals(elemName)) {
76 sessionID = parser.getAttributeValue("", "id");
77 }
78 else if (UserID.ELEMENT_NAME.equals(elemName)) {
79 userID = parser.getAttributeValue("", "id");
80 }
81 else if ("user-request".equals(elemName)) {
82 content = UserRequest.getInstance();
83 }
84 else if (RoomInvitation.ELEMENT_NAME.equals(elemName)) {
85 RoomInvitation invitation = (RoomInvitation) PacketParserUtils
86 .parsePacketExtension(RoomInvitation.ELEMENT_NAME, RoomInvitation.NAMESPACE, parser);
87 content = new InvitationRequest(invitation.getInviter(), invitation.getRoom(),
88 invitation.getReason());
89 }
90 else if (RoomTransfer.ELEMENT_NAME.equals(elemName)) {
91 RoomTransfer transfer = (RoomTransfer) PacketParserUtils
92 .parsePacketExtension(RoomTransfer.ELEMENT_NAME, RoomTransfer.NAMESPACE, parser);
93 content = new TransferRequest(transfer.getInviter(), transfer.getRoom(), transfer.getReason());
94 }
95 }
96 else if (eventType == XmlPullParser.END_TAG) {
97 if ("offer".equals(parser.getName())) {
98 done = true;
99 }
100 }
101 }
102
103 OfferRequestPacket offerRequest =
104 new OfferRequestPacket(userJID, userID, timeout, metaData, sessionID, content);
105 offerRequest.setType(IQ.Type.SET);
106
107 return offerRequest;
108 }
109
110 public static class OfferRequestPacket extends IQ {
111
112 private int timeout;
113 private String userID;
114 private String userJID;
115 private Map<String, List<String>> metaData;
116 private String sessionID;
117 private OfferContent content;
118
119 public OfferRequestPacket(String userJID, String userID, int timeout, Map<String, List<String>> metaData,
120 String sessionID, OfferContent content)
121 {
122 this.userJID = userJID;
123 this.userID = userID;
124 this.timeout = timeout;
125 this.metaData = metaData;
126 this.sessionID = sessionID;
127 this.content = content;
128 }
129
130 /**
131 * Returns the userID, which is either the same as the userJID or a special
132 * value that the user provided as part of their "join queue" request.
133 *
134 * @return the user ID.
135 */
136 public String getUserID() {
137 return userID;
138 }
139
140 /**
141 * The JID of the user that made the "join queue" request.
142 *
143 * @return the user JID.
144 */
145 public String getUserJID() {
146 return userJID;
147 }
148
149 /**
150 * Returns the session ID associated with the request and ensuing chat. If the offer
151 * does not contain a session ID, <tt>null</tt> will be returned.
152 *
153 * @return the session id associated with the request.
154 */
155 public String getSessionID() {
156 return sessionID;
157 }
158
159 /**
160 * Returns the number of seconds the agent has to accept the offer before
161 * it times out.
162 *
163 * @return the offer timeout (in seconds).
164 */
165 public int getTimeout() {
166 return this.timeout;
167 }
168
169 public OfferContent getContent() {
170 return content;
171 }
172
173 /**
174 * Returns any meta-data associated with the offer.
175 *
176 * @return meta-data associated with the offer.
177 */
178 public Map<String, List<String>> getMetaData() {
179 return this.metaData;
180 }
181
182 public String getChildElementXML () {
183 StringBuilder buf = new StringBuilder();
184
185 buf.append("<offer xmlns=\"http://jabber.org/protocol/workgroup\" jid=\"").append(userJID).append("\">");
186 buf.append("<timeout>").append(timeout).append("</timeout>");
187
188 if (sessionID != null) {
189 buf.append('<').append(SessionID.ELEMENT_NAME);
190 buf.append(" session=\"");
191 buf.append(getSessionID()).append("\" xmlns=\"");
192 buf.append(SessionID.NAMESPACE).append("\"/>");
193 }
194
195 if (metaData != null) {
196 buf.append(MetaDataUtils.serializeMetaData(metaData));
197 }
198
199 if (userID != null) {
200 buf.append('<').append(UserID.ELEMENT_NAME);
201 buf.append(" id=\"");
202 buf.append(userID).append("\" xmlns=\"");
203 buf.append(UserID.NAMESPACE).append("\"/>");
204 }
205
206 buf.append("</offer>");
207
208 return buf.toString();
209 }
210 }
211}