/* * Copyright (C) 2008-2011 The QXmpp developers * * Author: * Manjeet Dahiya * * Source: * http://code.google.com/p/qxmpp * * This file is a part of QXmpp library. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * */ #ifndef QXMPPCLIENT_H #define QXMPPCLIENT_H #include #include #include "QXmppConfiguration.h" #include "QXmppLogger.h" #include "QXmppPresence.h" class QXmppClientExtension; class QXmppClientPrivate; class QXmppPresence; class QXmppMessage; class QXmppPacket; class QXmppIq; class QXmppStream; // managers class QXmppDiscoveryIq; class QXmppReconnectionManager; class QXmppRosterManager; class QXmppVCardManager; class QXmppVersionManager; /// \defgroup Core /// \defgroup Managers /// \brief The QXmppClient class is the main class for using QXmpp. /// /// It provides the user all the required functionality to connect to the server /// and perform operations afterwards. /// /// This class will provide the handle/reference to QXmppRosterManager (roster management), /// QXmppVCardManager (vCard manager), QXmppReconnectionManager (reconnection /// mechanism) and QXmppVersionManager (software version information). /// /// By default, a reconnection mechanism exists, which makes sure of reconnecting /// to the server on disconnections due to an error. User can have a custom /// reconnection mechanism as well. /// /// Not all the managers or extensions have been enabled by default. One can /// enable/disable the managers using the funtions addExtension() and /// removeExtension(). findExtension() can be used to find reference/pointer to /// particular instansiated and enabled manager. /// /// List of managers enabled by default: /// - QXmppRosterManager /// - QXmppVCardManager /// - QXmppVersionManager /// - QXmppDiscoveryManager /// - QXmppEntityTimeManager /// /// \ingroup Core class QXmppClient : public QXmppLoggable { Q_OBJECT Q_ENUMS(Error State) Q_PROPERTY(QXmppLogger* logger READ logger WRITE setLogger NOTIFY loggerChanged) Q_PROPERTY(State state READ state NOTIFY stateChanged) public: /// An enumeration for type of error. /// Error could come due a TCP socket or XML stream or due to various stanzas. enum Error { NoError, ///< No error. SocketError, ///< Error due to TCP socket. KeepAliveError, ///< Error due to no response to a keep alive. XmppStreamError, ///< Error due to XML stream. }; /// This enumeration describes a client state. enum State { DisconnectedState, ///< Disconnected from the server. ConnectingState, ///< Trying to connect to the server. ConnectedState, ///< Connected to the server. }; QXmppClient(QObject *parent = 0); ~QXmppClient(); bool addExtension(QXmppClientExtension* extension); bool removeExtension(QXmppClientExtension* extension); QList extensions(); /// \brief Returns the extension which can be cast into type T*, or 0 /// if there is no such extension. /// /// Usage example: /// \code /// QXmppDiscoveryManager* ext = client->findExtension(); /// if(ext) /// { /// //extension found, do stuff... /// } /// \endcode /// template T* findExtension() { QList list = extensions(); for (int i = 0; i < list.size(); ++i) { T* extension = qobject_cast(list.at(i)); if(extension) return extension; } return 0; } void connectToServer(const QXmppConfiguration&, const QXmppPresence& initialPresence = QXmppPresence()); bool isConnected() const; QXmppPresence clientPresence() const; void setClientPresence(const QXmppPresence &presence); QXmppConfiguration &configuration(); QXmppLogger *logger() const; void setLogger(QXmppLogger *logger); QAbstractSocket::SocketError socketError(); State state() const; QXmppStanza::Error::Condition xmppStreamError(); QXmppRosterManager& rosterManager(); QXmppVCardManager& vCardManager(); QXmppVersionManager& versionManager(); QXmppReconnectionManager* reconnectionManager(); bool setReconnectionManager(QXmppReconnectionManager*); signals: /// This signal is emitted when the client connects successfully to the XMPP /// server i.e. when a successful XMPP connection is established. /// XMPP Connection involves following sequential steps: /// - TCP socket connection /// - Client sends start stream /// - Server sends start stream /// - TLS negotiation (encryption) /// - Authentication /// - Resource binding /// - Session establishment /// /// After all these steps a successful XMPP connection is established and /// connected() signal is emitted. /// /// After the connected() signal is emitted QXmpp will send the roster request /// to the server. On receiving the roster, QXmpp will emit /// QXmppRosterManager::rosterReceived(). After this signal, QXmppRosterManager object gets /// populated and you can use rosterManager() to get the handle of QXmppRosterManager object. /// void connected(); /// This signal is emitted when the XMPP connection disconnects. /// void disconnected(); /// This signal is emitted when the XMPP connection encounters any error. /// The QXmppClient::Error parameter specifies the type of error occurred. /// It could be due to TCP socket or the xml stream or the stanza. /// Depending upon the type of error occurred use the respective get function to /// know the error. void error(QXmppClient::Error); /// This signal is emitted when the logger changes. void loggerChanged(QXmppLogger *logger); /// Notifies that an XMPP message stanza is received. The QXmppMessage /// parameter contains the details of the message sent to this client. /// In other words whenever someone sends you a message this signal is /// emitted. void messageReceived(const QXmppMessage &message); /// Notifies that an XMPP presence stanza is received. The QXmppPresence /// parameter contains the details of the presence sent to this client. /// This signal is emitted when someone login/logout or when someone's status /// changes Busy, Idle, Invisible etc. void presenceReceived(const QXmppPresence &presence); /// Notifies that an XMPP iq stanza is received. The QXmppIq /// parameter contains the details of the iq sent to this client. /// IQ stanzas provide a structured request-response mechanism. Roster /// management, setting-getting vCards etc is done using iq stanzas. void iqReceived(const QXmppIq &iq); /// This signal is emitted when the client state changes. void stateChanged(QXmppClient::State state); /// \cond // Deprecated in release 0.3.0 // Use QXmppDiscoveryManager::informationReceived(const QXmppDiscoveryIq&) // Notifies that an XMPP service discovery iq stanza is received. void discoveryIqReceived(const QXmppDiscoveryIq&); /// \endcond public slots: void connectToServer(const QString &jid, const QString &password); void disconnectFromServer(); bool sendPacket(const QXmppPacket&); void sendMessage(const QString& bareJid, const QString& message); private slots: void _q_elementReceived(const QDomElement &element, bool &handled); void _q_socketStateChanged(QAbstractSocket::SocketState state); void _q_streamConnected(); void _q_streamDisconnected(); private: QXmppClientPrivate * const d; }; #endif // QXMPPCLIENT_H