diff options
Diffstat (limited to 'kopete/protocols/jabber/jabberresource.cpp')
-rw-r--r-- | kopete/protocols/jabber/jabberresource.cpp | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/kopete/protocols/jabber/jabberresource.cpp b/kopete/protocols/jabber/jabberresource.cpp new file mode 100644 index 00000000..e74a0fa9 --- /dev/null +++ b/kopete/protocols/jabber/jabberresource.cpp @@ -0,0 +1,171 @@ + /* + * jabberresource.cpp + * + * Copyright (c) 2005-2006 by Michaƫl Larouche <[email protected]> + * Copyright (c) 2004 by Till Gerken <[email protected]> + * + * Kopete (c) 2001-2006 by the Kopete developers <[email protected]> + * + * ************************************************************************* + * * * + * * 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. * + * * * + * ************************************************************************* + */ + +#include "jabberresource.h" + +// Qt includes +#include <qtimer.h> + +// KDE includes +#include <kdebug.h> + +// libiris includes +#include <im.h> +#include <xmpp_tasks.h> + +// Kopete includes +#include "jabberprotocol.h" +#include "jabberaccount.h" +#include "jabbercapabilitiesmanager.h" + +class JabberResource::Private +{ +public: + Private( JabberAccount *t_account, const XMPP::Jid &t_jid, const XMPP::Resource &t_resource ) + : account(t_account), jid(t_jid), resource(t_resource), capsEnabled(false) + { + // Make sure the resource is always set. + jid.setResource(resource.name()); + } + + JabberAccount *account; + XMPP::Jid jid; + XMPP::Resource resource; + + QString clientName, clientSystem; + XMPP::Features supportedFeatures; + bool capsEnabled; +}; + +JabberResource::JabberResource ( JabberAccount *account, const XMPP::Jid &jid, const XMPP::Resource &resource ) + : d( new Private(account, jid, resource) ) +{ + d->capsEnabled = account->protocol()->capabilitiesManager()->capabilitiesEnabled(jid); + + if ( account->isConnected () ) + { + QTimer::singleShot ( account->client()->getPenaltyTime () * 1000, this, SLOT ( slotGetTimedClientVersion () ) ); + if(!d->capsEnabled) + { + QTimer::singleShot ( account->client()->getPenaltyTime () * 1000, this, SLOT ( slotGetDiscoCapabilties () ) ); + } + } +} + +JabberResource::~JabberResource () +{ + delete d; +} + +const XMPP::Jid &JabberResource::jid () const +{ + return d->jid; +} + +const XMPP::Resource &JabberResource::resource () const +{ + return d->resource; +} + +void JabberResource::setResource ( const XMPP::Resource &resource ) +{ + d->resource = resource; + + // Check if the caps are now available. + d->capsEnabled = d->account->protocol()->capabilitiesManager()->capabilitiesEnabled(d->jid); + + emit updated( this ); +} + +const QString &JabberResource::clientName () const +{ + return d->clientName; +} + +const QString &JabberResource::clientSystem () const +{ + return d->clientSystem; +} + +XMPP::Features JabberResource::features() const +{ + if(d->capsEnabled) + { + return d->account->protocol()->capabilitiesManager()->features(d->jid); + } + else + { + return d->supportedFeatures; + } +} + +void JabberResource::slotGetTimedClientVersion () +{ + if ( d->account->isConnected () ) + { + kdDebug ( JABBER_DEBUG_GLOBAL ) << k_funcinfo << "Requesting client version for " << d->jid.full () << endl; + + // request client version + XMPP::JT_ClientVersion *task = new XMPP::JT_ClientVersion ( d->account->client()->rootTask () ); + // signal to ourselves when the vCard data arrived + QObject::connect ( task, SIGNAL ( finished () ), this, SLOT ( slotGotClientVersion () ) ); + task->get ( d->jid ); + task->go ( true ); + } +} + +void JabberResource::slotGotClientVersion () +{ + XMPP::JT_ClientVersion *clientVersion = (XMPP::JT_ClientVersion *) sender (); + + if ( clientVersion->success () ) + { + d->clientName = clientVersion->name () + " " + clientVersion->version (); + d->clientSystem = clientVersion->os (); + + emit updated ( this ); + } +} + +void JabberResource:: slotGetDiscoCapabilties () +{ + if ( d->account->isConnected () ) + { + kdDebug ( JABBER_DEBUG_GLOBAL ) << k_funcinfo << "Requesting Client Features for " << d->jid.full () << endl; + + XMPP:: JT_DiscoInfo *task = new XMPP::JT_DiscoInfo ( d->account->client()->rootTask () ); + // Retrive features when service discovery is done. + QObject::connect ( task, SIGNAL ( finished () ), this, SLOT (slotGotDiscoCapabilities () ) ); + task->get ( d->jid); + task->go ( true ); + } +} + +void JabberResource::slotGotDiscoCapabilities () +{ + XMPP::JT_DiscoInfo *discoInfo = (XMPP::JT_DiscoInfo *) sender (); + + if ( discoInfo->success () ) + { + d->supportedFeatures = discoInfo->item().features(); + + emit updated ( this ); + } +} + +#include "jabberresource.moc" |