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