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