diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/client/QXmppRosterManager.cpp | 42 | ||||
| -rw-r--r-- | src/client/QXmppRosterManager.h | 4 |
2 files changed, 37 insertions, 9 deletions
diff --git a/src/client/QXmppRosterManager.cpp b/src/client/QXmppRosterManager.cpp index 09f277c1..7cb70ff8 100644 --- a/src/client/QXmppRosterManager.cpp +++ b/src/client/QXmppRosterManager.cpp @@ -36,6 +36,8 @@ class QXmppRosterManagerPrivate public: QXmppRosterManagerPrivate(); + void clear(); + // map of bareJid and its rosterEntry QMap<QString, QXmppRosterIq::Item> entries; @@ -54,6 +56,14 @@ QXmppRosterManagerPrivate::QXmppRosterManagerPrivate() { } +void QXmppRosterManagerPrivate::clear() +{ + entries.clear(); + presences.clear(); + rosterReqId.clear(); + isRosterReceived = false; +} + /// /// Constructs a roster manager. /// @@ -102,19 +112,27 @@ bool QXmppRosterManager::acceptSubscription(const QString &bareJid, const QStrin /// void QXmppRosterManager::_q_connected() { - QXmppRosterIq roster; - roster.setType(QXmppIq::Get); - roster.setFrom(client()->configuration().jid()); - d->rosterReqId = roster.id(); - if (client()->isAuthenticated()) - client()->sendPacket(roster); + // clear cache if stream has not been resumed + if (client()->streamManagementState() != QXmppClient::ResumedStream) { + d->clear(); + } + + if (!d->isRosterReceived) { + QXmppRosterIq roster; + roster.setType(QXmppIq::Get); + roster.setFrom(client()->configuration().jid()); + d->rosterReqId = roster.id(); + if (client()->isAuthenticated()) + client()->sendPacket(roster); + } } void QXmppRosterManager::_q_disconnected() { - d->entries.clear(); - d->presences.clear(); - d->isRosterReceived = false; + // clear cache if stream cannot be resumed + if (client()->streamManagementState() == QXmppClient::NoStreamManagement) { + d->clear(); + } } /// \cond @@ -133,6 +151,9 @@ bool QXmppRosterManager::handleStanza(const QDomElement &element) rosterIq.parse(element); bool isInitial = (d->rosterReqId == rosterIq.id()); + if (isInitial) + d->rosterReqId.clear(); + switch (rosterIq.type()) { case QXmppIq::Set: { // send result iq @@ -407,6 +428,9 @@ QXmppPresence QXmppRosterManager::getPresence(const QString &bareJid, /// /// Function to check whether the roster has been received or not. /// +/// On disconnecting this is reset to false if no stream management is used by +/// the client and so the stream cannot be resumed later. +/// /// \return true if roster received else false /// bool QXmppRosterManager::isRosterReceived() const diff --git a/src/client/QXmppRosterManager.h b/src/client/QXmppRosterManager.h index c91d05f2..90022edb 100644 --- a/src/client/QXmppRosterManager.h +++ b/src/client/QXmppRosterManager.h @@ -101,6 +101,10 @@ Q_SIGNALS: /// connection. That is the roster entries are empty before this signal is emitted. /// One should use getRosterBareJids() and getRosterEntry() only after /// this signal has been emitted. + /// + /// \note If the previous stream could be resumed, this signal is not + /// emitted since QXmpp 1.4. Changes since the last connection are reported + /// via the itemAdded(), itemChanged() and itemRemoved() signals. void rosterReceived(); /// This signal is emitted when the presence of a particular bareJid and resource changes. |
