aboutsummaryrefslogtreecommitdiff
path: root/source
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
parent5c6987abb84d79be8aeb9b57017c2d439921d83f (diff)
downloadqxmpp-2919748db0f771bef82f3975df0fd096e62f602a.tar.gz
move roster management out of QXmppStream
Diffstat (limited to 'source')
-rw-r--r--source/QXmppRoster.cpp76
-rw-r--r--source/QXmppRoster.h4
-rw-r--r--source/QXmppStream.cpp61
-rw-r--r--source/QXmppStream.h6
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();
};