From f281e53af318f951c42bd701fc5634cd8aa1b33e Mon Sep 17 00:00:00 2001 From: Manjeet Dahiya Date: Wed, 9 Sep 2009 17:55:25 +0000 Subject: Fix for Issue 4:Cannot repackage message when receiving partial message. vCard cleanups --- source/QXmppStream.cpp | 30 +++++++++++++++++++++++------- source/QXmppStream.h | 4 +++- source/QXmppUtils.cpp | 5 +++-- source/QXmppUtils.h | 2 +- source/QXmppVCard.cpp | 13 ++++++++----- source/QXmppVCard.h | 2 +- source/QXmppVCardManager.cpp | 1 - source/QXmppVCardManager.h | 3 +-- 8 files changed, 40 insertions(+), 20 deletions(-) (limited to 'source') diff --git a/source/QXmppStream.cpp b/source/QXmppStream.cpp index 65a480ae..95cc929a 100644 --- a/source/QXmppStream.cpp +++ b/source/QXmppStream.cpp @@ -82,8 +82,8 @@ QXmppStream::QXmppStream(QXmppClient* client) &m_roster, SLOT(rosterIqReceived(const QXmppRosterIq&))); Q_ASSERT(check); - check = QObject::connect(this, SIGNAL(vCardIqReceived(const QXmppRosterIq&)), - &m_vCardManager, SLOT(vCardIqReceived(const QXmppRosterIq&))); + check = QObject::connect(this, SIGNAL(vCardIqReceived(const QXmppVCard&)), + &m_vCardManager, SLOT(vCardIqReceived(const QXmppVCard&))); Q_ASSERT(check); } @@ -122,6 +122,7 @@ void QXmppStream::socketHostFound() void QXmppStream::socketConnected() { + flushDataBuffer(); log(QString("Connected")); emit connected(); sendStartStream(); @@ -129,6 +130,7 @@ void QXmppStream::socketConnected() void QXmppStream::socketDisconnected() { + flushDataBuffer(); log(QString("Disconnected")); emit disconnected(); } @@ -149,7 +151,7 @@ void QXmppStream::socketError(QAbstractSocket::SocketError ee) void QXmppStream::socketReadReady() { QByteArray data = m_socket.readAll(); - log("SERVER:" + data); + log("SERVER [COULD BE PARTIAL DATA]:" + data); parser(data); } @@ -157,21 +159,26 @@ void QXmppStream::parser(const QByteArray& data) { QDomDocument doc; QByteArray completeXml; - if(hasStartStreamElement(data)) + + m_dataBuffer = m_dataBuffer + data; + + if(hasStartStreamElement(m_dataBuffer)) { - completeXml = data + streamRootElementEnd; + completeXml = m_dataBuffer + streamRootElementEnd; } else if(hasEndStreamElement(data)) { - completeXml = streamRootElementStart + data; + completeXml = streamRootElementStart + m_dataBuffer; } else { - completeXml = streamRootElementStart + data + streamRootElementEnd; + completeXml = streamRootElementStart + m_dataBuffer + streamRootElementEnd; } if(doc.setContent(completeXml, true)) { + log("SERVER:" + m_dataBuffer); + flushDataBuffer(); // data has valid elements and is not a start or end stream QDomElement nodeRecv = doc.documentElement().firstChildElement(); while(!nodeRecv.isNull()) @@ -397,6 +404,10 @@ void QXmppStream::parser(const QByteArray& data) nodeRecv = nodeRecv.nextSiblingElement(); } } + else + { + //wait for complete packet + } } @@ -638,3 +649,8 @@ QXmppVCardManager& QXmppStream::getVCardManager() { return m_vCardManager; } + +void QXmppStream::flushDataBuffer() +{ + m_dataBuffer.clear(); +} diff --git a/source/QXmppStream.h b/source/QXmppStream.h index 037f082d..132fd40b 100644 --- a/source/QXmppStream.h +++ b/source/QXmppStream.h @@ -97,7 +97,7 @@ private: QString m_sessionId; QString m_bindId; QString m_rosterReqId; - + QByteArray m_dataBuffer; QSslSocket m_socket; bool m_sessionAvaliable; QAbstractSocket::SocketError m_socketError; @@ -127,6 +127,8 @@ private: void processIq(const QXmppIq&); void processBindIq(const QXmppBind&); void processRosterIq(const QXmppRosterIq&); + + void flushDataBuffer(); }; #endif // QXMPPSTREAM_H diff --git a/source/QXmppUtils.cpp b/source/QXmppUtils.cpp index 04c2a4ab..b5339985 100644 --- a/source/QXmppUtils.cpp +++ b/source/QXmppUtils.cpp @@ -29,6 +29,7 @@ #include #include #include +#include QString jidToResource(const QString& jid) { @@ -121,9 +122,9 @@ QString getImageType(const QByteArray& image) return "image/unknown"; } -QString getImageHash(const QByteArray& image) +QByteArray getImageHash(const QByteArray& image) { - return ""; + return QCryptographicHash::hash(image, QCryptographicHash::Sha1); } QImage getImageFromByteArray(const QByteArray& image) diff --git a/source/QXmppUtils.h b/source/QXmppUtils.h index cb753003..635b80b8 100644 --- a/source/QXmppUtils.h +++ b/source/QXmppUtils.h @@ -50,7 +50,7 @@ QString escapeString(const QString& str); QString unescapeString(const QString& str); QString getImageType(const QByteArray& image); -QString getImageHash(const QByteArray& image); +QByteArray getImageHash(const QByteArray& image); QImage getImageFromByteArray(const QByteArray& image); #endif // QXMPPUTILS_H diff --git a/source/QXmppVCard.cpp b/source/QXmppVCard.cpp index 35333319..1d4b9509 100644 --- a/source/QXmppVCard.cpp +++ b/source/QXmppVCard.cpp @@ -85,17 +85,20 @@ QByteArray QXmppVCard::toXmlElementFromChild() const stream << ">"; helperToXmlAddElement(stream, "FN", getFullName()); - stream << ""; + if(!getPhoto().isEmpty()) + { + stream << ""; + } stream << ""; return data.toAscii(); } -const QImage& QXmppVCard::getPhotoAsImage() const +QImage QXmppVCard::getPhotoAsImage() const { return getImageFromByteArray(getPhoto()); } diff --git a/source/QXmppVCard.h b/source/QXmppVCard.h index fc8a76c9..b4c7af2c 100644 --- a/source/QXmppVCard.h +++ b/source/QXmppVCard.h @@ -39,7 +39,7 @@ public: QString getFullName() const; void setFullName(const QString&); - const QImage& getPhotoAsImage() const; + QImage getPhotoAsImage() const; const QByteArray& getPhoto() const; void setPhoto(const QByteArray&); diff --git a/source/QXmppVCardManager.cpp b/source/QXmppVCardManager.cpp index aa391477..b97b55b8 100644 --- a/source/QXmppVCardManager.cpp +++ b/source/QXmppVCardManager.cpp @@ -23,7 +23,6 @@ #include "QXmppVCardManager.h" -#include "QXmppVCard.h" #include "QXmppUtils.h" QXmppVCardManager::QXmppVCardManager(QXmppClient* client) : diff --git a/source/QXmppVCardManager.h b/source/QXmppVCardManager.h index 97e37574..9e8adcc4 100644 --- a/source/QXmppVCardManager.h +++ b/source/QXmppVCardManager.h @@ -27,8 +27,7 @@ #include #include "QXmppClient.h" - -class QXmppVCard; +#include "QXmppVCard.h" class QXmppVCardManager : public QObject { -- cgit v1.2.3