diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2011-09-20 08:25:46 +0000 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2011-09-20 08:25:46 +0000 |
| commit | 1f0b849a8a1d9fd9e5573181215b18ace06435ee (patch) | |
| tree | 65ec374931cfce5559a4481a3d69b0e90cd80c41 /src/QXmppRosterManager.cpp | |
| parent | cf5d934e1be0d85c051583ed6671b4a7a73da46c (diff) | |
| download | qxmpp-1f0b849a8a1d9fd9e5573181215b18ace06435ee.tar.gz | |
hide QXmppRosterManager internals
Diffstat (limited to 'src/QXmppRosterManager.cpp')
| -rw-r--r-- | src/QXmppRosterManager.cpp | 216 |
1 files changed, 120 insertions, 96 deletions
diff --git a/src/QXmppRosterManager.cpp b/src/QXmppRosterManager.cpp index 454bcc0f..6da4ee51 100644 --- a/src/QXmppRosterManager.cpp +++ b/src/QXmppRosterManager.cpp @@ -30,27 +30,60 @@ #include "QXmppRosterManager.h" #include "QXmppUtils.h" +class QXmppRosterManagerPrivate +{ +public: + QXmppRosterManagerPrivate(QXmppRosterManager *qq); + + // map of bareJid and its rosterEntry + QMap<QString, QXmppRosterIq::Item> entries; + + // map of resources of the jid and map of resources and presences + QMap<QString, QMap<QString, QXmppPresence> > presences; + + // flag to store that the roster has been populated + bool isRosterReceived; + + // id of the initial roster request + QString rosterReqId; + +private: + QXmppRosterManager *q; +}; + +QXmppRosterManagerPrivate::QXmppRosterManagerPrivate(QXmppRosterManager *qq) + : isRosterReceived(false), + q(qq) +{ +} + /// Constructs a roster manager. QXmppRosterManager::QXmppRosterManager(QXmppClient* client) - : m_isRosterReceived(false) { bool check; Q_UNUSED(check); + d = new QXmppRosterManagerPrivate(this); + check = connect(client, SIGNAL(connected()), - this, SLOT(connected())); + this, SLOT(_q_connected())); Q_ASSERT(check); check = connect(client, SIGNAL(disconnected()), - this, SLOT(disconnected())); + this, SLOT(_q_disconnected())); Q_ASSERT(check); check = connect(client, SIGNAL(presenceReceived(QXmppPresence)), - this, SLOT(presenceReceived(QXmppPresence))); + this, SLOT(_q_presenceReceived(QXmppPresence))); Q_ASSERT(check); } +QXmppRosterManager::~QXmppRosterManager() +{ + delete d; +} + /// Accepts a subscription request. /// /// You can call this method in reply to the subscriptionRequest() signal. @@ -65,44 +98,96 @@ bool QXmppRosterManager::acceptSubscription(const QString &bareJid) /// Upon XMPP connection, request the roster. /// -void QXmppRosterManager::connected() +void QXmppRosterManager::_q_connected() { QXmppRosterIq roster; roster.setType(QXmppIq::Get); roster.setFrom(client()->configuration().jid()); - m_rosterReqId = roster.id(); + d->rosterReqId = roster.id(); client()->sendPacket(roster); } -void QXmppRosterManager::disconnected() +void QXmppRosterManager::_q_disconnected() { - m_entries.clear(); - m_presences.clear(); - m_isRosterReceived = false; + d->entries.clear(); + d->presences.clear(); + d->isRosterReceived = false; } bool QXmppRosterManager::handleStanza(const QDomElement &element) { - if(element.tagName() == "iq" && QXmppRosterIq::isRosterIq(element)) + if (element.tagName() != "iq" || !QXmppRosterIq::isRosterIq(element)) + return false; + + // Security check: only server should send this iq + // from() should be either empty or bareJid of the user + const QString fromJid = element.attribute("from"); + if (!fromJid.isEmpty() && jidToBareJid(fromJid) != client()->configuration().jidBare()) + return false; + + QXmppRosterIq rosterIq; + rosterIq.parse(element); + + bool isInitial = (d->rosterReqId == rosterIq.id()); + switch(rosterIq.type()) { - QXmppRosterIq rosterIq; - rosterIq.parse(element); - - // Security check: only server should send this iq - // from() should be either empty or bareJid of the user - QString fromJid = rosterIq.from(); - if(fromJid.isEmpty() || - jidToBareJid(fromJid) == client()->configuration().jidBare()) + case QXmppIq::Set: { - rosterIqReceived(rosterIq); - return true; + // send result iq + QXmppIq returnIq(QXmppIq::Result); + returnIq.setId(rosterIq.id()); + client()->sendPacket(returnIq); + + // store updated entries and notify changes + const QList<QXmppRosterIq::Item> items = rosterIq.items(); + foreach (const QXmppRosterIq::Item &item, items) { + const QString bareJid = item.bareJid(); + if (item.subscriptionType() == QXmppRosterIq::Item::Remove) { + if (d->entries.remove(bareJid)) { + // notify the user that the item was removed + emit itemRemoved(bareJid); + } + } else { + const bool added = !d->entries.contains(bareJid); + d->entries.insert(bareJid, item); + if (added) { + // notify the user that the item was added + emit itemAdded(bareJid); + } else { + // notify the user that the item changed + emit itemChanged(bareJid); + } + + // FIXME: remove legacy signal + emit rosterChanged(bareJid); + } + } } + break; + case QXmppIq::Result: + { + const QList<QXmppRosterIq::Item> items = rosterIq.items(); + foreach (const QXmppRosterIq::Item &item, items) { + const QString bareJid = item.bareJid(); + d->entries.insert(bareJid, item); + if (!isInitial) + emit rosterChanged(bareJid); + } + if (isInitial) + { + d->isRosterReceived = true; + emit rosterReceived(); + } + break; + } + default: + break; } - return false; + return true; } -void QXmppRosterManager::presenceReceived(const QXmppPresence& presence) +void QXmppRosterManager::_q_presenceReceived(const QXmppPresence& presence) { const QString jid = presence.from(); const QString bareJid = jidToBareJid(jid); @@ -114,11 +199,11 @@ void QXmppRosterManager::presenceReceived(const QXmppPresence& presence) switch(presence.type()) { case QXmppPresence::Available: - m_presences[bareJid][resource] = presence; + d->presences[bareJid][resource] = presence; emit presenceChanged(bareJid, resource); break; case QXmppPresence::Unavailable: - m_presences[bareJid].remove(resource); + d->presences[bareJid].remove(resource); emit presenceChanged(bareJid, resource); break; case QXmppPresence::Subscribe: @@ -169,67 +254,6 @@ bool QXmppRosterManager::removeItem(const QString &bareJid) return client()->sendPacket(iq); } -void QXmppRosterManager::rosterIqReceived(const QXmppRosterIq& rosterIq) -{ - bool isInitial = (m_rosterReqId == rosterIq.id()); - - switch(rosterIq.type()) - { - case QXmppIq::Set: - { - // send result iq - QXmppIq returnIq(QXmppIq::Result); - returnIq.setId(rosterIq.id()); - client()->sendPacket(returnIq); - - // store updated entries and notify changes - const QList<QXmppRosterIq::Item> items = rosterIq.items(); - foreach (const QXmppRosterIq::Item &item, items) { - const QString bareJid = item.bareJid(); - if (item.subscriptionType() == QXmppRosterIq::Item::Remove) { - if (m_entries.remove(bareJid)) { - // notify the user that the item was removed - emit itemRemoved(bareJid); - } - } else { - const bool added = !m_entries.contains(bareJid); - m_entries.insert(bareJid, item); - if (added) { - // notify the user that the item was added - emit itemAdded(bareJid); - } else { - // notify the user that the item changed - emit itemChanged(bareJid); - } - - // FIXME: remove legacy signal - emit rosterChanged(bareJid); - } - } - } - break; - case QXmppIq::Result: - { - QList<QXmppRosterIq::Item> items = rosterIq.items(); - for(int i = 0; i < items.count(); ++i) - { - QString bareJid = items.at(i).bareJid(); - m_entries[bareJid] = items.at(i); - if (!isInitial) - emit rosterChanged(bareJid); - } - if (isInitial) - { - m_isRosterReceived = true; - emit rosterReceived(); - } - break; - } - default: - break; - } -} - /// Requests a subscription to the given contact. /// /// As a result, the server will initiate a roster push, causing the @@ -263,7 +287,7 @@ bool QXmppRosterManager::unsubscribe(const QString &bareJid) QStringList QXmppRosterManager::getRosterBareJids() const { - return m_entries.keys(); + return d->entries.keys(); } /// Returns the roster entry of the given bareJid. If the bareJid is not in the @@ -276,8 +300,8 @@ QXmppRosterIq::Item QXmppRosterManager::getRosterEntry( const QString& bareJid) const { // will return blank entry if bareJid does'nt exist - if(m_entries.contains(bareJid)) - return m_entries.value(bareJid); + if(d->entries.contains(bareJid)) + return d->entries.value(bareJid); else return QXmppRosterIq::Item(); } @@ -290,8 +314,8 @@ QXmppRosterIq::Item QXmppRosterManager::getRosterEntry( QStringList QXmppRosterManager::getResources(const QString& bareJid) const { - if(m_presences.contains(bareJid)) - return m_presences[bareJid].keys(); + if(d->presences.contains(bareJid)) + return d->presences[bareJid].keys(); else return QStringList(); } @@ -307,8 +331,8 @@ QStringList QXmppRosterManager::getResources(const QString& bareJid) const QMap<QString, QXmppPresence> QXmppRosterManager::getAllPresencesForBareJid( const QString& bareJid) const { - if(m_presences.contains(bareJid)) - return m_presences[bareJid]; + if(d->presences.contains(bareJid)) + return d->presences[bareJid]; else return QMap<QString, QXmppPresence>(); } @@ -323,8 +347,8 @@ QMap<QString, QXmppPresence> QXmppRosterManager::getAllPresencesForBareJid( QXmppPresence QXmppRosterManager::getPresence(const QString& bareJid, const QString& resource) const { - if(m_presences.contains(bareJid) && m_presences[bareJid].contains(resource)) - return m_presences[bareJid][resource]; + if(d->presences.contains(bareJid) && d->presences[bareJid].contains(resource)) + return d->presences[bareJid][resource]; else { QXmppPresence presence; @@ -340,7 +364,7 @@ QXmppPresence QXmppRosterManager::getPresence(const QString& bareJid, bool QXmppRosterManager::isRosterReceived() const { - return m_isRosterReceived; + return d->isRosterReceived; } // deprecated |
