1/** 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} 212