You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
601 lines
16 KiB
601 lines
16 KiB
|
|
/***************************************************************************
|
|
jabberclient.h - Generic Jabber Client Class
|
|
-------------------
|
|
begin : Sat May 25 2005
|
|
copyright : (C) 2005 by Till Gerken <till@tantalo.net>
|
|
(C) 2006 by Michaël Larouche <michael.larouche@kdemail.net>
|
|
|
|
Kopete (C) 2001-2006 Kopete developers
|
|
<kopete-devel@kde.org>.
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
#ifndef JABBERCLIENT_H
|
|
#define JABBERCLIENT_H
|
|
|
|
#include <qobject.h>
|
|
|
|
// include these because of namespace reasons
|
|
#include <im.h>
|
|
#include <xmpp.h>
|
|
#include <s5b.h>
|
|
|
|
using namespace XMPP;
|
|
|
|
class JabberConnector;
|
|
|
|
/**
|
|
* This class provides an interface to the Iris subsystem. The goal is to
|
|
* abstract the Iris layer and manage it via a single, simple to use class.
|
|
* By default, @ref JabberClient will attempt to establish a connection
|
|
* using XMPP 1.0. This means that apart from the JID and password, no
|
|
* further details are necessary to connect. The server and port will be
|
|
* determined using a SRV lookup. If TLS is possible (meaning, the TLS
|
|
* plugin is available and the server supports TLS) it will automatically
|
|
* be used. Otherwise, a non-encrypted connection will be established.
|
|
* If XMPP 1.0 is not possible, the connection will fall back to the old
|
|
* protocol. By default, this connection is not encrypted. You can, however,
|
|
* use @ref setUseSSL to immediately attempt an SSL connection. This is
|
|
* most useful if you want to establish an SSL connection to a non-standard
|
|
* port, in which case you will also have to use @ref setOverrideHost. In case
|
|
* XMPP 1.0 does not work, an automatic attempt to connect to the standard port
|
|
* 5223 with SSL can be made with @ref setProbeSSL. If the attempt is not
|
|
* sucessful, the connection will fall back to an unencrypted attempt
|
|
* at port 5222.
|
|
* @brief Provides a Jabber client
|
|
* @author Till Gerken
|
|
*/
|
|
class JabberClient : public QObject
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
public:
|
|
/**
|
|
* Error codes indicating problems during operation.
|
|
*/
|
|
enum ErrorCode
|
|
{
|
|
Ok, /** No error. */
|
|
InvalidPassword, /** Password used to connect to the server was incorrect. */
|
|
AlreadyConnected, /** A new connection was attempted while the previous one hasn't been closed. */
|
|
NoTLS, /** Use of TLS has been forced (see @ref forceTLS) but TLS is not available, either server- or client-side. */
|
|
InvalidPasswordForMUC = 401, /** A password is require to enter on this Multi-User Chat */
|
|
NicknameConflict = 409, /** There is already someone with that nick connected to the Multi-User Chat */
|
|
BannedFromThisMUC = 403, /** You can't join this Multi-User Chat because you were bannished */
|
|
MaxUsersReachedForThisMuc = 503 /** You can't join this Multi-User Chat because it is full */
|
|
};
|
|
|
|
JabberClient();
|
|
~JabberClient();
|
|
|
|
/**
|
|
* Connect to a Jabber server.
|
|
* @param jid JID to connect to.
|
|
* @param password Password to authenticate with.
|
|
* @param auth True if authentication should be done, false if not.
|
|
*/
|
|
ErrorCode connect ( const XMPP::Jid &jid, const QString &password, bool auth = true );
|
|
|
|
/**
|
|
* Disconnect from Jabber server.
|
|
*/
|
|
void disconnect ();
|
|
|
|
/**
|
|
* Disconnect from Jabber server with reason
|
|
* @param reason The reason for disconnecting
|
|
*/
|
|
void disconnect (XMPP::Status &reason);
|
|
|
|
/**
|
|
* Returns if this instance is connected to a server.
|
|
*/
|
|
bool isConnected () const;
|
|
|
|
/**
|
|
* Returns the JID associated with this instance.
|
|
*/
|
|
XMPP::Jid jid () const;
|
|
|
|
/**
|
|
* Set flag to ignore TLS warnings. If TLS
|
|
* warnings are not ignored, the class will emit
|
|
* @ref tlsWarning and wait for the user to
|
|
* call @ref continueAfterTLSWarning or
|
|
* @ref disconnect. Default is false.
|
|
*/
|
|
void setIgnoreTLSWarnings ( bool flag );
|
|
/**
|
|
* Return if TLS warnings are being ignored.
|
|
*/
|
|
bool ignoreTLSWarnings ();
|
|
|
|
/**
|
|
* Continue after a @ref tlsWarning signal.
|
|
*/
|
|
void continueAfterTLSWarning ();
|
|
|
|
/**
|
|
* Set the port on which the S5B server should listen.
|
|
* This is only taken into account if @ref setFileTransfersEnabled
|
|
* is set to true.
|
|
* @return True if port could be bound, false if not.
|
|
*/
|
|
bool setS5BServerPort ( int port );
|
|
/**
|
|
* Returns the port the S5B server listens on.
|
|
*/
|
|
int s5bServerPort () const;
|
|
|
|
/**
|
|
* Force the use of TLS. If TLS connections are forced,
|
|
* unencrypted connections will not be established.
|
|
* Default is false.
|
|
*/
|
|
void setForceTLS ( bool flag );
|
|
/**
|
|
* Returns if TLS connections are forced.
|
|
*/
|
|
bool forceTLS () const;
|
|
|
|
/**
|
|
* Force direct SSL connection, also for the
|
|
* handshake. This is only useful if you know
|
|
* the server supports it or you want to use
|
|
* a non-standard port, in which case @ref setOverrideHost
|
|
* will be useful. Default is false.
|
|
*/
|
|
void setUseSSL ( bool flag );
|
|
/**
|
|
* Returns if an SSL connection attempt should be made.
|
|
*/
|
|
bool useSSL () const;
|
|
|
|
/**
|
|
* Use only the old protocol (pre-XMPP 1.0). This should only
|
|
* be used with servers not supporting XMPP 1.0 or with servers
|
|
* that have a broken login procedure. Default is false. If
|
|
* a connection attempt is not possible, Iris will automatically
|
|
* fall back to the old protocol.
|
|
*/
|
|
void setUseXMPP09 ( bool flag );
|
|
/**
|
|
* Returns if the old protocol should be used.
|
|
*/
|
|
bool useXMPP09 () const;
|
|
|
|
/**
|
|
* Probe port 5223 if an SSL connection is possible. If
|
|
* a connection is not possible, an unencrypted connection
|
|
* will be attempted at port 5222. This is only meaningful
|
|
* if @ref useXMPP09 is true. Default is false.
|
|
*/
|
|
void setProbeSSL ( bool flag );
|
|
/**
|
|
* Returns if SSL support will be probed.
|
|
*/
|
|
bool probeSSL () const;
|
|
|
|
/**
|
|
* Override the name and port of the server to connect to.
|
|
* This only has an effect if the old protocol (@ref useXMPP09)
|
|
* has been enabled. Default is false.
|
|
*/
|
|
void setOverrideHost ( bool flag, const QString &server = "", int port = 5222 );
|
|
/**
|
|
* Returns if the server name and port are overridden.
|
|
*/
|
|
bool overrideHost () const;
|
|
|
|
/**
|
|
* Allow the transmission of a plain text password. If digested
|
|
* passwords are supported by the server, they will still be preferred.
|
|
* Defaults to true.
|
|
*/
|
|
void setAllowPlainTextPassword ( bool flag );
|
|
/**
|
|
* Returns if plain text passwords are allowed.
|
|
*/
|
|
bool allowPlainTextPassword () const;
|
|
|
|
/**
|
|
* Enable file transfers. Default is false.
|
|
* @param flag Whether to enable file transfers.
|
|
* @param localAddress Local address to receive file transfers at. Will be determined automatically if not specified.
|
|
*/
|
|
void setFileTransfersEnabled ( bool flag, const QString &localAddress = QString::null );
|
|
|
|
/**
|
|
* Returns the address of the local interface.
|
|
*/
|
|
QString localAddress () const;
|
|
|
|
/**
|
|
* Returns if file transfers are enabled.
|
|
*/
|
|
bool fileTransfersEnabled () const;
|
|
|
|
/**
|
|
* Set client name.
|
|
*/
|
|
void setClientName ( const QString &clientName );
|
|
/**
|
|
* Return client name.
|
|
*/
|
|
QString clientName () const;
|
|
|
|
/**
|
|
* Set client version.
|
|
*/
|
|
void setClientVersion ( const QString &clientVersion );
|
|
/**
|
|
* Return client version.
|
|
*/
|
|
QString clientVersion () const;
|
|
|
|
/**
|
|
* Set operating system name.
|
|
*/
|
|
void setOSName ( const QString &osName );
|
|
/**
|
|
* Return operating system name.
|
|
*/
|
|
QString osName () const;
|
|
|
|
/**
|
|
* Set the caps(JEP-0115: Entity capabilities) node name.
|
|
* @param node Node name.
|
|
*/
|
|
void setCapsNode( const QString &capsNode );
|
|
/**
|
|
* Return the caps node name for this client.
|
|
* @return the caps node name.
|
|
*/
|
|
QString capsNode() const;
|
|
|
|
/**
|
|
* Set the caps(JEP-0115: Entity capabilities) node version.
|
|
* @param capsVersion the node version.
|
|
*/
|
|
void setCapsVersion( const QString &capsVersion );
|
|
/**
|
|
* Return the caps version for this client.
|
|
* @return the caps version.
|
|
*/
|
|
QString capsVersion() const;
|
|
|
|
/**
|
|
* Return the caps extension list for this client.
|
|
* @return A string containing all extensions separated by space.
|
|
*/
|
|
QString capsExt() const;
|
|
|
|
/**
|
|
* Set the disco Identity information for this client.
|
|
* Create a Disco identity like this:
|
|
* @code
|
|
* DiscoItem::Identity identity;
|
|
* identity.category = "client";
|
|
* identity.type = "pc";
|
|
* identity.name = "Kopete";
|
|
* @endcode
|
|
*
|
|
* @param identity DiscoItem::Identity for the client.
|
|
*/
|
|
void setDiscoIdentity(DiscoItem::Identity identity);
|
|
/**
|
|
* Get the disco Identity information for this client.
|
|
* @return the DiscoItem::Identity for this client.
|
|
*/
|
|
DiscoItem::Identity discoIdentity() const;
|
|
|
|
/**
|
|
* Set timezone information. Default is UTC.
|
|
*/
|
|
void setTimeZone ( const QString &timeZoneName, int timeZoneOffset );
|
|
/**
|
|
* Return timezone name.
|
|
*/
|
|
QString timeZoneName () const;
|
|
/**
|
|
* Return timezone offset.
|
|
*/
|
|
int timeZoneOffset () const;
|
|
|
|
/**
|
|
* This method can be used to implement a penalty
|
|
* system when a lot of queries need to be sent to the
|
|
* server. Using the time returned by this method,
|
|
* the caller can determine a delay until the next
|
|
* operation in the queue can be carried out.
|
|
* @brief Return current penalty time in seconds.
|
|
*/
|
|
int getPenaltyTime ();
|
|
|
|
/**
|
|
* Return the XMPP client instance.
|
|
*/
|
|
XMPP::Client *client () const;
|
|
|
|
/**
|
|
* Return client stream instance.
|
|
*/
|
|
XMPP::ClientStream *clientStream () const;
|
|
|
|
/**
|
|
* Return client connector instance.
|
|
*/
|
|
JabberConnector *clientConnector () const;
|
|
|
|
/**
|
|
* Get the root task for this connection.
|
|
* You need this instance for every task
|
|
* you want to start.
|
|
*/
|
|
XMPP::Task *rootTask () const;
|
|
|
|
/**
|
|
* Returns the file transfer manager
|
|
* instance that deals with current file
|
|
* transfers.
|
|
*/
|
|
XMPP::FileTransferManager *fileTransferManager () const;
|
|
|
|
/**
|
|
* Join a group chat.
|
|
* @param host Node to join the room at.
|
|
* @param room Name of room to join.
|
|
* @param nick Nick name you want to join with.
|
|
*/
|
|
void joinGroupChat ( const QString &host, const QString &room, const QString &nick );
|
|
|
|
/**
|
|
* Join a group chat that require a password.
|
|
* @param host Node to join the room at.
|
|
* @param room Name of room to join.
|
|
* @param nick Nick name you want to join with.
|
|
* @param password The password to join the room.
|
|
*/
|
|
void joinGroupChat ( const QString &host, const QString &room, const QString &nick, const QString &password );
|
|
|
|
/**
|
|
* Leave a group chat.
|
|
* @param host Node to leave room at.
|
|
* @param room Name of room to leave.
|
|
*/
|
|
void leaveGroupChat ( const QString &host, const QString &room );
|
|
|
|
/**
|
|
* change the status of a group chat
|
|
*/
|
|
void setGroupChatStatus(const QString &host, const QString &room, const XMPP::Status &);
|
|
/**
|
|
* change the nick in a group chat
|
|
*/
|
|
void changeGroupChatNick(const QString &host, const QString &room, const QString &nick, const XMPP::Status &status =XMPP::Status());
|
|
|
|
/**
|
|
* Send a message.
|
|
*/
|
|
void sendMessage ( const XMPP::Message &message );
|
|
|
|
/**
|
|
* Send raw packet to the server.
|
|
*/
|
|
void send ( const QString &packet );
|
|
|
|
/**
|
|
* Request the roster from the Jabber server.
|
|
*/
|
|
void requestRoster ();
|
|
|
|
signals:
|
|
/**
|
|
* Connected successfully.
|
|
*/
|
|
void connected ();
|
|
|
|
/**
|
|
* Client stream authenticated. This
|
|
* signal is emitted when the socket
|
|
* connection has been successfully
|
|
* established, before sending the login
|
|
* packet.
|
|
*/
|
|
void csAuthenticated ();
|
|
|
|
/**
|
|
* Client stream error.
|
|
*/
|
|
void csError ( int error );
|
|
|
|
/**
|
|
* Client stream was disconnected.
|
|
*/
|
|
void csDisconnected ();
|
|
|
|
/**
|
|
* TLS problem encountered.
|
|
*/
|
|
void tlsWarning ( int validityResult );
|
|
|
|
/**
|
|
* A new file transfer needs to be handled.
|
|
* The file transfer can be dealt with by
|
|
* querying the file transfer manager from
|
|
* @ref client.
|
|
*/
|
|
void incomingFileTransfer ();
|
|
|
|
/**
|
|
* Fatal error has been encountered,
|
|
* further operations are not possible.
|
|
*/
|
|
void error ( JabberClient::ErrorCode code );
|
|
|
|
/**
|
|
* Roster has been transmitted and processed.
|
|
*/
|
|
void rosterRequestFinished ( bool success );
|
|
|
|
/**
|
|
* A new contact appeared on the roster.
|
|
*/
|
|
void newContact ( const XMPP::RosterItem &item );
|
|
|
|
/**
|
|
* A contact has been removed from the roster.
|
|
*/
|
|
void contactDeleted ( const XMPP::RosterItem &item );
|
|
|
|
/**
|
|
* A roster item has changed.
|
|
*/
|
|
void contactUpdated ( const XMPP::RosterItem &item );
|
|
|
|
/**
|
|
* New resource is available for a contact.
|
|
*/
|
|
void resourceAvailable ( const XMPP::Jid &jid, const XMPP::Resource &resource );
|
|
|
|
/**
|
|
* An existing resource has been removed.
|
|
*/
|
|
void resourceUnavailable ( const XMPP::Jid &jid, const XMPP::Resource &resource );
|
|
|
|
/**
|
|
* A new message has been received.
|
|
*/
|
|
void messageReceived ( const XMPP::Message &message );
|
|
|
|
/**
|
|
* Group chat has been joined.
|
|
*/
|
|
void groupChatJoined ( const XMPP::Jid &jid );
|
|
|
|
/**
|
|
* Group chat has been left.
|
|
*/
|
|
void groupChatLeft ( const XMPP::Jid &jid );
|
|
|
|
/**
|
|
* A presence to a group chat has been signalled.
|
|
*/
|
|
void groupChatPresence ( const XMPP::Jid &jid, const XMPP::Status &status );
|
|
|
|
/**
|
|
* An error was encountered joining or processing a group chat.
|
|
*/
|
|
void groupChatError ( const XMPP::Jid &jid, int error, const QString &reason );
|
|
|
|
/**
|
|
* New subscription request.
|
|
*/
|
|
void subscription ( const XMPP::Jid &jid, const QString &type );
|
|
|
|
/**
|
|
* Dispatches a debug message. Debug messages
|
|
* include incoming and outgoing XML packets
|
|
* as well as internal status messages.
|
|
*/
|
|
void debugMessage ( const QString &message );
|
|
|
|
private:
|
|
class Private;
|
|
Private *d;
|
|
|
|
/**
|
|
* Delete all member classes and reset the class to a predefined state.
|
|
*/
|
|
void cleanUp ();
|
|
|
|
/**
|
|
* Return current instance of the S5B server.
|
|
*/
|
|
XMPP::S5BServer *s5bServer ();
|
|
/**
|
|
* Add an address that the S5B server should handle.
|
|
*/
|
|
void addS5BServerAddress ( const QString &address );
|
|
/**
|
|
* Remove an address that the S5B server currently handles.
|
|
*/
|
|
void removeS5BServerAddress ( const QString &address );
|
|
|
|
private slots:
|
|
/* S5B server object has been destroyed. */
|
|
void slotS5BServerGone ();
|
|
|
|
/* update the penalty timer */
|
|
void slotUpdatePenaltyTime ();
|
|
|
|
/* Login if the connection was OK. */
|
|
void slotCSNeedAuthParams (bool user, bool pass, bool realm);
|
|
|
|
/* Called from Psi: tells us when we're logged in OK. */
|
|
void slotCSAuthenticated ();
|
|
|
|
/* Called from Psi: tells us when we've been disconnected from the server. */
|
|
void slotCSDisconnected ();
|
|
|
|
/* Called from Psi: alerts us to a protocol warning. */
|
|
void slotCSWarning (int);
|
|
|
|
/* Called from Psi: alerts us to a protocol error. */
|
|
void slotCSError (int);
|
|
|
|
/* Called from Psi: report certificate status */
|
|
void slotTLSHandshaken ();
|
|
|
|
/* Called from Psi: roster request finished */
|
|
void slotRosterRequestFinished ( bool success, int statusCode, const QString &statusString );
|
|
|
|
/* Called from Psi: incoming file transfer */
|
|
void slotIncomingFileTransfer ();
|
|
|
|
/* A new item appeared in our roster */
|
|
void slotNewContact (const RosterItem &);
|
|
|
|
/* An item has been deleted from our roster. */
|
|
void slotContactDeleted (const RosterItem &);
|
|
|
|
/* Update a contact's details. */
|
|
void slotContactUpdated (const RosterItem &);
|
|
|
|
/* Someone on our contact list had (another) resource come online. */
|
|
void slotResourceAvailable (const Jid &, const Resource &);
|
|
|
|
/* Someone on our contact list had a resource go offline. */
|
|
void slotResourceUnavailable (const Jid &, const Resource &);
|
|
|
|
/* Incoming message. */
|
|
void slotReceivedMessage (const Message &);
|
|
|
|
/* Called from Psi: debug messages from the backend. */
|
|
void slotPsiDebug (const QString & msg);
|
|
void slotIncomingXML (const QString &msg);
|
|
void slotOutgoingXML (const QString &msg);
|
|
|
|
/* Slots for handling group chats. */
|
|
void slotGroupChatJoined (const Jid & jid);
|
|
void slotGroupChatLeft (const Jid & jid);
|
|
void slotGroupChatPresence (const Jid & jid, const Status & status);
|
|
void slotGroupChatError (const Jid & jid, int error, const QString & reason);
|
|
|
|
/* Incoming subscription request. */
|
|
void slotSubscription (const Jid & jid, const QString & type);
|
|
|
|
};
|
|
|
|
#endif
|