diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-06-04 11:46:18 +0000 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-06-04 11:46:18 +0000 |
| commit | 2919748db0f771bef82f3975df0fd096e62f602a (patch) | |
| tree | 058707f009e57c1af7806295c4de1d5d9933316a /source/QXmppRoster.cpp | |
| parent | 5c6987abb84d79be8aeb9b57017c2d439921d83f (diff) | |
| download | qxmpp-2919748db0f771bef82f3975df0fd096e62f602a.tar.gz | |
move roster management out of QXmppStream
Diffstat (limited to 'source/QXmppRoster.cpp')
| -rw-r--r-- | source/QXmppRoster.cpp | 76 |
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: |
