1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $RCSfile$
3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $Revision$
4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $Date$
5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Copyright 2003-2007 Jive Software.
7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * you may not use this file except in compliance with the License.
10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * You may obtain a copy of the License at
11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *     http://www.apache.org/licenses/LICENSE-2.0
13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Unless required by applicable law or agreed to in writing, software
15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * distributed under the License is distributed on an "AS IS" BASIS,
16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * See the License for the specific language governing permissions and
18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * limitations under the License.
19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.jivesoftware.smackx.provider;
22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.packet.*;
24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.provider.*;
25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smackx.packet.*;
26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.xmlpull.v1.XmlPullParser;
27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * The MUCUserProvider parses packets with extended presence information about
30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * roles and affiliations.
31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Gaston Dombiak
33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class MUCUserProvider implements PacketExtensionProvider {
35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Creates a new MUCUserProvider.
38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * ProviderManager requires that every PacketExtensionProvider has a public, no-argument
39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * constructor
40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public MUCUserProvider() {
42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Parses a MUCUser packet (extension sub-packet).
46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param parser the XML parser, positioned at the starting element of the extension.
48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return a PacketExtension.
49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @throws Exception if a parsing error occurs.
50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public PacketExtension parseExtension(XmlPullParser parser) throws Exception {
52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        MUCUser mucUser = new MUCUser();
53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        boolean done = false;
54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        while (!done) {
55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            int eventType = parser.next();
56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (eventType == XmlPullParser.START_TAG) {
57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("invite")) {
58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    mucUser.setInvite(parseInvite(parser));
59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("item")) {
61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    mucUser.setItem(parseItem(parser));
62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("password")) {
64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    mucUser.setPassword(parser.nextText());
65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("status")) {
67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    mucUser.setStatus(new MUCUser.Status(parser.getAttributeValue("", "code")));
68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("decline")) {
70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    mucUser.setDecline(parseDecline(parser));
71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("destroy")) {
73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    mucUser.setDestroy(parseDestroy(parser));
74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            else if (eventType == XmlPullParser.END_TAG) {
77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("x")) {
78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    done = true;
79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return mucUser;
84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private MUCUser.Item parseItem(XmlPullParser parser) throws Exception {
87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        boolean done = false;
88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        MUCUser.Item item =
89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            new MUCUser.Item(
90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                parser.getAttributeValue("", "affiliation"),
91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                parser.getAttributeValue("", "role"));
92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        item.setNick(parser.getAttributeValue("", "nick"));
93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        item.setJid(parser.getAttributeValue("", "jid"));
94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        while (!done) {
95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            int eventType = parser.next();
96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (eventType == XmlPullParser.START_TAG) {
97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("actor")) {
98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    item.setActor(parser.getAttributeValue("", "jid"));
99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("reason")) {
101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    item.setReason(parser.nextText());
102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            else if (eventType == XmlPullParser.END_TAG) {
105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("item")) {
106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    done = true;
107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return item;
111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private MUCUser.Invite parseInvite(XmlPullParser parser) throws Exception {
114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        boolean done = false;
115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        MUCUser.Invite invite = new MUCUser.Invite();
116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        invite.setFrom(parser.getAttributeValue("", "from"));
117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        invite.setTo(parser.getAttributeValue("", "to"));
118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        while (!done) {
119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            int eventType = parser.next();
120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (eventType == XmlPullParser.START_TAG) {
121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("reason")) {
122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    invite.setReason(parser.nextText());
123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            else if (eventType == XmlPullParser.END_TAG) {
126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("invite")) {
127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    done = true;
128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return invite;
132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private MUCUser.Decline parseDecline(XmlPullParser parser) throws Exception {
135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        boolean done = false;
136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        MUCUser.Decline decline = new MUCUser.Decline();
137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        decline.setFrom(parser.getAttributeValue("", "from"));
138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        decline.setTo(parser.getAttributeValue("", "to"));
139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        while (!done) {
140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            int eventType = parser.next();
141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (eventType == XmlPullParser.START_TAG) {
142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("reason")) {
143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    decline.setReason(parser.nextText());
144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            else if (eventType == XmlPullParser.END_TAG) {
147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("decline")) {
148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    done = true;
149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
150d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
151d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
152d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return decline;
153d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
154d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
155d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private MUCUser.Destroy parseDestroy(XmlPullParser parser) throws Exception {
156d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        boolean done = false;
157d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        MUCUser.Destroy destroy = new MUCUser.Destroy();
158d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        destroy.setJid(parser.getAttributeValue("", "jid"));
159d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        while (!done) {
160d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            int eventType = parser.next();
161d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (eventType == XmlPullParser.START_TAG) {
162d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("reason")) {
163d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    destroy.setReason(parser.nextText());
164d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
165d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
166d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            else if (eventType == XmlPullParser.END_TAG) {
167d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("destroy")) {
168d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    done = true;
169d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
170d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
171d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
172d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return destroy;
173d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
174d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
175