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;
22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.ConnectionCreationListener;
24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.Connection;
25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.XMPPException;
26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.packet.Message;
27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smackx.packet.DiscoverInfo;
28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smackx.packet.XHTMLExtension;
29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.Iterator;
31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Manages XHTML formatted texts within messages. A XHTMLManager provides a high level access to
34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * get and set XHTML bodies to messages, enable and disable XHTML support and check if remote XMPP
35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * clients support XHTML.
36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Gaston Dombiak
38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class XHTMLManager {
40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private final static String namespace = "http://jabber.org/protocol/xhtml-im";
42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    // Enable the XHTML support on every established connection
44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    // The ServiceDiscoveryManager class should have been already initialized
45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    static {
46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        Connection.addConnectionCreationListener(new ConnectionCreationListener() {
47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            public void connectionCreated(Connection connection) {
48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                XHTMLManager.setServiceEnabled(connection, true);
49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        });
51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns an Iterator for the XHTML bodies in the message. Returns null if
55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * the message does not contain an XHTML extension.
56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param message an XHTML message
58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return an Iterator for the bodies in the message or null if none.
59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public static Iterator<String> getBodies(Message message) {
61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        XHTMLExtension xhtmlExtension = (XHTMLExtension) message.getExtension("html", namespace);
62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (xhtmlExtension != null)
63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return xhtmlExtension.getBodies();
64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        else
65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return null;
66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Adds an XHTML body to the message.
70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param message the message that will receive the XHTML body
72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param body the string to add as an XHTML body to the message
73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public static void addBody(Message message, String body) {
75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        XHTMLExtension xhtmlExtension = (XHTMLExtension) message.getExtension("html", namespace);
76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (xhtmlExtension == null) {
77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            // Create an XHTMLExtension and add it to the message
78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            xhtmlExtension = new XHTMLExtension();
79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            message.addExtension(xhtmlExtension);
80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        // Add the required bodies to the message
82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        xhtmlExtension.addBody(body);
83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns true if the message contains an XHTML extension.
87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param message the message to check if contains an XHTML extentsion or not
89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return a boolean indicating whether the message is an XHTML message
90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public static boolean isXHTMLMessage(Message message) {
92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return message.getExtension("html", namespace) != null;
93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Enables or disables the XHTML support on a given connection.<p>
97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Before starting to send XHTML messages to a user, check that the user can handle XHTML
99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * messages. Enable the XHTML support to indicate that this client handles XHTML messages.
100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param connection the connection where the service will be enabled or disabled
102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param enabled indicates if the service will be enabled or disabled
103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public synchronized static void setServiceEnabled(Connection connection, boolean enabled) {
105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (isServiceEnabled(connection) == enabled)
106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return;
107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (enabled) {
109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            ServiceDiscoveryManager.getInstanceFor(connection).addFeature(namespace);
110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        else {
112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            ServiceDiscoveryManager.getInstanceFor(connection).removeFeature(namespace);
113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns true if the XHTML support is enabled for the given connection.
118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param connection the connection to look for XHTML support
120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return a boolean indicating if the XHTML support is enabled for the given connection
121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public static boolean isServiceEnabled(Connection connection) {
123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return ServiceDiscoveryManager.getInstanceFor(connection).includesFeature(namespace);
124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns true if the specified user handles XHTML messages.
128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param connection the connection to use to perform the service discovery
130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param userID the user to check. A fully qualified xmpp ID, e.g. jdoe@example.com
131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return a boolean indicating whether the specified user handles XHTML messages
132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public static boolean isServiceEnabled(Connection connection, String userID) {
134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        try {
135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            DiscoverInfo result =
136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                ServiceDiscoveryManager.getInstanceFor(connection).discoverInfo(userID);
137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return result.containsFeature(namespace);
138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        catch (XMPPException e) {
140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            e.printStackTrace();
141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return false;
142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
145