aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/QXmppRosterManager.cpp42
-rw-r--r--src/client/QXmppRosterManager.h4
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.