aboutsummaryrefslogtreecommitdiff
path: root/source/QXmppRoster.cpp
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2010-06-04 11:46:18 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2010-06-04 11:46:18 +0000
commit2919748db0f771bef82f3975df0fd096e62f602a (patch)
tree058707f009e57c1af7806295c4de1d5d9933316a /source/QXmppRoster.cpp
parent5c6987abb84d79be8aeb9b57017c2d439921d83f (diff)
downloadqxmpp-2919748db0f771bef82f3975df0fd096e62f602a.tar.gz
move roster management out of QXmppStream
Diffstat (limited to 'source/QXmppRoster.cpp')
-rw-r--r--source/QXmppRoster.cpp76
1 files changed, 46 insertions, 30 deletions
diff --git a/source/QXmppRoster.cpp b/source/QXmppRoster.cpp
index c150e5b8..4de7cdfd 100644
--- a/source/QXmppRoster.cpp
+++ b/source/QXmppRoster.cpp
@@ -32,6 +32,21 @@
QXmppRoster::QXmppRoster(QXmppStream* stream) : m_stream(stream),
m_isRosterReceived(false)
{
+ bool check = QObject::connect(m_stream, SIGNAL(xmppConnected()),
+ this, SLOT(connected()));
+ Q_ASSERT(check);
+
+ check = QObject::connect(m_stream, SIGNAL(disconnected()),
+ this, SLOT(disconnected()));
+ Q_ASSERT(check);
+
+ check = QObject::connect(m_stream, SIGNAL(presenceReceived(const QXmppPresence&)),
+ this, SLOT(presenceReceived(const QXmppPresence&)));
+ Q_ASSERT(check);
+
+ check = QObject::connect(m_stream, SIGNAL(rosterIqReceived(const QXmppRosterIq&)),
+ this, SLOT(rosterIqReceived(const QXmppRosterIq&)));
+ Q_ASSERT(check);
}
QXmppRoster::~QXmppRoster()
@@ -39,6 +54,17 @@ QXmppRoster::~QXmppRoster()
}
+/// Upon XMPP connection, request the roster.
+///
+void QXmppRoster::connected()
+{
+ QXmppRosterIq roster;
+ roster.setType(QXmppIq::Get);
+ roster.setFrom(m_stream->getConfiguration().jid());
+ m_rosterReqId = roster.id();
+ m_stream->sendPacket(roster);
+}
+
void QXmppRoster::disconnected()
{
m_entries = QMap<QString, QXmppRoster::QXmppRosterEntry>();
@@ -64,36 +90,27 @@ void QXmppRoster::presenceReceived(const QXmppPresence& presence)
void QXmppRoster::rosterIqReceived(const QXmppRosterIq& rosterIq)
{
+ bool isInitial = (m_rosterReqId == rosterIq.id());
+
switch(rosterIq.type())
{
case QXmppIq::Set:
- 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);
- emit rosterChanged(bareJid);
- }
- if(rosterIq.type() == QXmppIq::Set) // send result iq
- {
- QXmppIq returnIq(QXmppIq::Result);
- returnIq.setId(rosterIq.id());
- m_stream->sendPacket(returnIq);
- }
- break;
+ // send result iq
+ QXmppIq returnIq(QXmppIq::Result);
+ returnIq.setId(rosterIq.id());
+ m_stream->sendPacket(returnIq);
+
+ // when contact subscribes user...user sends 'subscribed' presence
+ // then after recieving following iq user requests contact for subscription
+
+ // check the "from" is newly added in the roster...and remove this ask thing...and do this for all items
+ if(rosterIq.items().at(0).subscriptionType() ==
+ QXmppRosterIq::Item::From && rosterIq.items().at(0).
+ subscriptionStatus().isEmpty())
+ sendSubscriptionRequest(rosterIq.items().at(0).bareJid());
}
- default:
break;
- }
-}
-
-void QXmppRoster::rosterRequestIqReceived(const QXmppRosterIq& rosterIq)
-{
- switch(rosterIq.type())
- {
- case QXmppIq::Set:
case QXmppIq::Result:
{
QList<QXmppRosterIq::Item> items = rosterIq.items();
@@ -101,15 +118,14 @@ void QXmppRoster::rosterRequestIqReceived(const QXmppRosterIq& rosterIq)
{
QString bareJid = items.at(i).bareJid();
m_entries[bareJid] = items.at(i);
+ if (!isInitial)
+ emit rosterChanged(bareJid);
}
- if(rosterIq.type() == QXmppIq::Set) // send result iq
+ if (isInitial)
{
- QXmppIq returnIq(QXmppIq::Result);
- returnIq.setId(rosterIq.id());
- m_stream->sendPacket(returnIq);
+ m_isRosterReceived = true;
+ emit rosterReceived();
}
- m_isRosterReceived = true;
- emit rosterReceived();
break;
}
default: