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.packet;
22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.packet.PacketExtension;
24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.text.SimpleDateFormat;
26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.Date;
27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.TimeZone;
28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Represents extended presence information whose sole purpose is to signal the ability of
31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * the occupant to speak the MUC protocol when joining a room. If the room requires a password
32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * then the MUCInitialPresence should include one.<p>
33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * The amount of discussion history provided on entering a room (perhaps because the
35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * user is on a low-bandwidth connection or is using a small-footprint client) could be managed by
36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * setting a configured History instance to the MUCInitialPresence instance.
37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @see MUCInitialPresence#setHistory(MUCInitialPresence.History).
38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Gaston Dombiak
40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class MUCInitialPresence implements PacketExtension {
42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private String password;
44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private History history;
45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String getElementName() {
47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return "x";
48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String getNamespace() {
51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return "http://jabber.org/protocol/muc";
52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String toXML() {
55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        StringBuilder buf = new StringBuilder();
56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        buf.append("<").append(getElementName()).append(" xmlns=\"").append(getNamespace()).append(
57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            "\">");
58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (getPassword() != null) {
59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            buf.append("<password>").append(getPassword()).append("</password>");
60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (getHistory() != null) {
62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            buf.append(getHistory().toXML());
63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        buf.append("</").append(getElementName()).append(">");
65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return buf.toString();
66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns the history that manages the amount of discussion history provided on
70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * entering a room.
71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return the history that manages the amount of discussion history provided on
73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * entering a room.
74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public History getHistory() {
76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return history;
77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns the password to use when the room requires a password.
81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return the password to use when the room requires a password.
83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String getPassword() {
85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return password;
86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Sets the History that manages the amount of discussion history provided on
90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * entering a room.
91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param history that manages the amount of discussion history provided on
93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * entering a room.
94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public void setHistory(History history) {
96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.history = history;
97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Sets the password to use when the room requires a password.
101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param password the password to use when the room requires a password.
103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public void setPassword(String password) {
105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.password = password;
106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * The History class controls the number of characters or messages to receive
110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * when entering a room.
111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @author Gaston Dombiak
113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public static class History {
115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private int maxChars = -1;
117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private int maxStanzas = -1;
118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private int seconds = -1;
119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private Date since;
120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Returns the total number of characters to receive in the history.
123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @return total number of characters to receive in the history.
125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public int getMaxChars() {
127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return maxChars;
128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Returns the total number of messages to receive in the history.
132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @return the total number of messages to receive in the history.
134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public int getMaxStanzas() {
136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return maxStanzas;
137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Returns the number of seconds to use to filter the messages received during that time.
141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * In other words, only the messages received in the last "X" seconds will be included in
142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * the history.
143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @return the number of seconds to use to filter the messages received during that time.
145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public int getSeconds() {
147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return seconds;
148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
150d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
151d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Returns the since date to use to filter the messages received during that time.
152d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * In other words, only the messages received since the datetime specified will be
153d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * included in the history.
154d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
155d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @return the since date to use to filter the messages received during that time.
156d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
157d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public Date getSince() {
158d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return since;
159d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
160d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
161d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
162d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Sets the total number of characters to receive in the history.
163d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
164d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @param maxChars the total number of characters to receive in the history.
165d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
166d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public void setMaxChars(int maxChars) {
167d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.maxChars = maxChars;
168d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
169d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
170d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
171d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Sets the total number of messages to receive in the history.
172d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
173d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @param maxStanzas the total number of messages to receive in the history.
174d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
175d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public void setMaxStanzas(int maxStanzas) {
176d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.maxStanzas = maxStanzas;
177d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
178d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
179d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
180d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Sets the number of seconds to use to filter the messages received during that time.
181d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * In other words, only the messages received in the last "X" seconds will be included in
182d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * the history.
183d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
184d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @param seconds the number of seconds to use to filter the messages received during
185d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * that time.
186d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
187d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public void setSeconds(int seconds) {
188d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.seconds = seconds;
189d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
190d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
191d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
192d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Sets the since date to use to filter the messages received during that time.
193d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * In other words, only the messages received since the datetime specified will be
194d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * included in the history.
195d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
196d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @param since the since date to use to filter the messages received during that time.
197d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
198d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public void setSince(Date since) {
199d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.since = since;
200d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
201d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
202d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public String toXML() {
203d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            StringBuilder buf = new StringBuilder();
204d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            buf.append("<history");
205d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (getMaxChars() != -1) {
206d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                buf.append(" maxchars=\"").append(getMaxChars()).append("\"");
207d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
208d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (getMaxStanzas() != -1) {
209d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                buf.append(" maxstanzas=\"").append(getMaxStanzas()).append("\"");
210d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
211d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (getSeconds() != -1) {
212d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                buf.append(" seconds=\"").append(getSeconds()).append("\"");
213d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
214d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (getSince() != null) {
215d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                SimpleDateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
216d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                utcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
217d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                buf.append(" since=\"").append(utcFormat.format(getSince())).append("\"");
218d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
219d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            buf.append("/>");
220d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return buf.toString();
221d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
222d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
223d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
224