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 | |
| parent | 5c6987abb84d79be8aeb9b57017c2d439921d83f (diff) | |
| download | qxmpp-2919748db0f771bef82f3975df0fd096e62f602a.tar.gz | |
move roster management out of QXmppStream
Diffstat (limited to 'source')
| -rw-r--r-- | source/QXmppRoster.cpp | 76 | ||||
| -rw-r--r-- | source/QXmppRoster.h | 4 | ||||
| -rw-r--r-- | source/QXmppStream.cpp | 61 | ||||
| -rw-r--r-- | source/QXmppStream.h | 6 |
4 files changed, 54 insertions, 93 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: diff --git a/source/QXmppRoster.h b/source/QXmppRoster.h index 0c608432..380a7e1e 100644 --- a/source/QXmppRoster.h +++ b/source/QXmppRoster.h @@ -102,12 +102,14 @@ private: QMap<QString, QMap<QString, QXmppPresence> > m_presences; // flag to store that QXmppRoster has been populated bool m_isRosterReceived; + // id of the initial roster request + QString m_rosterReqId; private slots: + void connected(); void disconnected(); void presenceReceived(const QXmppPresence&); void rosterIqReceived(const QXmppRosterIq&); - void rosterRequestIqReceived(const QXmppRosterIq&); }; #endif // QXMPPROSTER_H diff --git a/source/QXmppStream.cpp b/source/QXmppStream.cpp index 67d46acf..1f99fdfb 100644 --- a/source/QXmppStream.cpp +++ b/source/QXmppStream.cpp @@ -94,26 +94,6 @@ QXmppStream::QXmppStream(QXmppClient* client) SLOT(socketError(QAbstractSocket::SocketError))); Q_ASSERT(check); - check = QObject::connect(this, - SIGNAL(disconnected()), - &m_roster, - SLOT(disconnected())); - Q_ASSERT(check); - - check = QObject::connect(this, - SIGNAL(presenceReceived(const QXmppPresence&)), - &m_roster, - SLOT(presenceReceived(const QXmppPresence&))); - Q_ASSERT(check); - - check = QObject::connect(this, SIGNAL(rosterIqReceived(const QXmppRosterIq&)), - &m_roster, SLOT(rosterIqReceived(const QXmppRosterIq&))); - Q_ASSERT(check); - - check = QObject::connect(this, SIGNAL(rosterRequestIqReceived(const QXmppRosterIq&)), - &m_roster, SLOT(rosterRequestIqReceived(const QXmppRosterIq&))); - Q_ASSERT(check); - check = QObject::connect(this, SIGNAL(vCardIqReceived(const QXmppVCard&)), &m_vCardManager, SLOT(vCardIqReceived(const QXmppVCard&))); Q_ASSERT(check); @@ -535,8 +515,6 @@ void QXmppStream::parser(const QByteArray& data) // xmpp connection made emit xmppConnected(); - sendRosterRequest(); - QXmppBind session(type); session.setId(id); session.setTo(to); @@ -560,7 +538,7 @@ void QXmppStream::parser(const QByteArray& data) { QXmppRosterIq rosterIq; rosterIq.parse(nodeRecv); - processRosterIq(rosterIq); + emit rosterIqReceived(rosterIq); emit iqReceived(rosterIq); } // extensions @@ -632,9 +610,8 @@ void QXmppStream::parser(const QByteArray& data) // successful Non-SASL Authentication debug("Authenticated (Non-SASL)"); + // xmpp connection made emit xmppConnected(); - - sendRosterRequest(); } else if(nodeRecv.firstChildElement("query"). namespaceURI() == ns_auth) @@ -999,15 +976,6 @@ void QXmppStream::sendSubscriptionRequest(const QString& to) sendPacket(presence); } -void QXmppStream::sendRosterRequest() -{ - QXmppRosterIq roster; - roster.setType(QXmppIq::Get); - roster.setFrom(getConfiguration().jid()); - m_rosterReqId = roster.id(); - sendPacket(roster); -} - void QXmppStream::disconnect() { m_authStep = 0; @@ -1037,6 +1005,7 @@ bool QXmppStream::sendPacket(const QXmppPacket& packet) return sendToServer(data); } +// FIXME : should this be moved to QXmppRoster? void QXmppStream::processPresence(const QXmppPresence& presence) { switch(presence.type()) @@ -1087,30 +1056,6 @@ void QXmppStream::processBindIq(const QXmppBind& bind) } } -void QXmppStream::processRosterIq(const QXmppRosterIq& rosterIq) -{ - if(m_rosterReqId == rosterIq.id()) - emit rosterRequestIqReceived(rosterIq); - else - emit rosterIqReceived(rosterIq); - - switch(rosterIq.type()) - { - case QXmppIq::Set: - // when contact subscribes user...user sends 'subscribed' presence - // then after recieving following iq user requests contact for subscription - - // check thet "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()); - break; - default: - break; - } -} - void QXmppStream::pingStart() { const int interval = getConfiguration().keepAliveInterval(); diff --git a/source/QXmppStream.h b/source/QXmppStream.h index c2aaede0..79121812 100644 --- a/source/QXmppStream.h +++ b/source/QXmppStream.h @@ -76,6 +76,8 @@ public: QAbstractSocket::SocketError getSocketError(); QXmppStanza::Error::Condition getXmppStreamError(); + QXmppConfiguration& getConfiguration(); + signals: // socket host found void hostFound(); @@ -95,7 +97,6 @@ signals: void messageReceived(const QXmppMessage&); void iqReceived(const QXmppIq&); void rosterIqReceived(const QXmppRosterIq&); - void rosterRequestIqReceived(const QXmppRosterIq&); void vCardIqReceived(const QXmppVCard&); void rpcCallResponse(const QXmppRpcResponseIq& result ); @@ -132,7 +133,6 @@ private: QXmppRoster m_roster; QString m_sessionId; QString m_bindId; - QString m_rosterReqId; QByteArray m_dataBuffer; QSslSocket m_socket; bool m_sessionAvaliable; @@ -149,7 +149,6 @@ private: QXmppVCardManager m_vCardManager; int m_authStep; - QXmppConfiguration& getConfiguration(); void debug(const QString&); void info(const QString&); void warning(const QString&); @@ -172,7 +171,6 @@ private: void processPresence(const QXmppPresence&); void processBindIq(const QXmppBind&); - void processRosterIq(const QXmppRosterIq&); void flushDataBuffer(); }; |
