aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2012-09-12 15:52:41 +0200
committerJeremy Lainé <jeremy.laine@m4x.org>2012-09-12 15:52:41 +0200
commit07d537a2573f1dd06dd69ba6a5e2fa97357c443b (patch)
treeba452c274480fea96348d14b4653dc481119e7c5
parentf9b26e12f593b185a15674e3ddda0b56d05b43c6 (diff)
downloadqxmpp-07d537a2573f1dd06dd69ba6a5e2fa97357c443b.tar.gz
test stream initiation IQ serialisation / parsing
-rw-r--r--src/base/QXmppStreamInitiationIq.cpp28
-rw-r--r--src/base/QXmppStreamInitiationIq.h9
-rw-r--r--src/client/QXmppTransferManager.cpp44
-rw-r--r--src/client/QXmppTransferManager.h1
-rw-r--r--tests/si.cpp24
-rw-r--r--tests/si.h1
6 files changed, 57 insertions, 50 deletions
diff --git a/src/base/QXmppStreamInitiationIq.cpp b/src/base/QXmppStreamInitiationIq.cpp
index 361701ec..7b1b4b89 100644
--- a/src/base/QXmppStreamInitiationIq.cpp
+++ b/src/base/QXmppStreamInitiationIq.cpp
@@ -37,6 +37,16 @@ void QXmppStreamInitiationIq::setFeatureForm(const QXmppDataForm &form)
m_featureForm = form;
}
+QXmppTransferFileInfo QXmppStreamInitiationIq::fileInfo() const
+{
+ return m_fileInfo;
+}
+
+void QXmppStreamInitiationIq::setFileInfo(const QXmppTransferFileInfo &fileInfo)
+{
+ m_fileInfo = fileInfo;
+}
+
QString QXmppStreamInitiationIq::mimeType() const
{
return m_mimeType;
@@ -57,11 +67,6 @@ void QXmppStreamInitiationIq::setProfile(QXmppStreamInitiationIq::Profile profil
m_profile = profile;
}
-QXmppElementList QXmppStreamInitiationIq::siItems() const
-{
- return m_siItems;
-}
-
QString QXmppStreamInitiationIq::siId() const
{
return m_siId;
@@ -72,11 +77,6 @@ void QXmppStreamInitiationIq::setSiId(const QString &id)
m_siId = id;
}
-void QXmppStreamInitiationIq::setSiItems(const QXmppElementList &items)
-{
- m_siItems = items;
-}
-
/// \cond
bool QXmppStreamInitiationIq::isStreamInitiationIq(const QDomElement &element)
{
@@ -99,8 +99,8 @@ void QXmppStreamInitiationIq::parseElementFromChild(const QDomElement &element)
{
if (itemElement.tagName() == "feature" && itemElement.namespaceURI() == ns_feature_negotiation) {
m_featureForm.parse(itemElement.firstChildElement());
- } else {
- m_siItems.append(QXmppElement(itemElement));
+ } else if (itemElement.tagName() == "file" && itemElement.namespaceURI() == ns_stream_initiation_file_transfer) {
+ m_fileInfo.parse(itemElement);
}
itemElement = itemElement.nextSiblingElement();
}
@@ -114,8 +114,8 @@ void QXmppStreamInitiationIq::toXmlElementFromChild(QXmlStreamWriter *writer) co
helperToXmlAddAttribute(writer, "mime-type", m_mimeType);
if (m_profile == FileTransfer)
helperToXmlAddAttribute(writer, "profile", ns_stream_initiation_file_transfer);
- foreach (const QXmppElement &item, m_siItems)
- item.toXml(writer);
+ if (!m_fileInfo.isNull())
+ m_fileInfo.toXml(writer);
if (!m_featureForm.isNull()) {
writer->writeStartElement("feature");
writer->writeAttribute("xmlns", ns_feature_negotiation);
diff --git a/src/base/QXmppStreamInitiationIq.h b/src/base/QXmppStreamInitiationIq.h
index 2feb5e7e..27e59afd 100644
--- a/src/base/QXmppStreamInitiationIq.h
+++ b/src/base/QXmppStreamInitiationIq.h
@@ -28,6 +28,7 @@
#include "QXmppDataForm.h"
#include "QXmppIq.h"
+#include "QXmppTransferManager.h"
class QDomElement;
class QXmlStreamWriter;
@@ -43,6 +44,9 @@ public:
QXmppDataForm featureForm() const;
void setFeatureForm(const QXmppDataForm &form);
+ QXmppTransferFileInfo fileInfo() const;
+ void setFileInfo(const QXmppTransferFileInfo &info);
+
QString mimeType() const;
void setMimeType(const QString &mimeType);
@@ -52,9 +56,6 @@ public:
QString siId() const;
void setSiId(const QString &id);
- QXmppElementList siItems() const;
- void setSiItems(const QXmppElementList &items);
-
static bool isStreamInitiationIq(const QDomElement &element);
protected:
@@ -65,10 +66,10 @@ protected:
private:
QXmppDataForm m_featureForm;
+ QXmppTransferFileInfo m_fileInfo;
QString m_mimeType;
Profile m_profile;
QString m_siId;
- QXmppElementList m_siItems;
};
#endif
diff --git a/src/client/QXmppTransferManager.cpp b/src/client/QXmppTransferManager.cpp
index 146bd08d..dd23a851 100644
--- a/src/client/QXmppTransferManager.cpp
+++ b/src/client/QXmppTransferManager.cpp
@@ -134,6 +134,15 @@ void QXmppTransferFileInfo::setSize(qint64 size)
d->size = size;
}
+bool QXmppTransferFileInfo::isNull() const
+{
+ return d->date.isNull()
+ && d->description.isEmpty()
+ && d->hash.isEmpty()
+ && d->name.isEmpty()
+ && d->size == 0;
+}
+
QXmppTransferFileInfo& QXmppTransferFileInfo::operator=(const QXmppTransferFileInfo &other)
{
d = other.d;
@@ -1359,26 +1368,7 @@ QXmppTransferJob *QXmppTransferManager::sendFile(const QString &jid, QIODevice *
return job;
}
- // prepare negotiation
- QXmppElementList items;
-
- QXmppElement file;
- file.setTagName("file");
- file.setAttribute("xmlns", ns_stream_initiation_file_transfer);
- file.setAttribute("date", QXmppUtils::datetimeToString(job->fileDate()));
- file.setAttribute("hash", job->fileHash().toHex());
- file.setAttribute("name", job->fileName());
- file.setAttribute("size", QString::number(job->fileSize()));
- if (!fileInfo.description().isEmpty())
- {
- QXmppElement desc;
- desc.setTagName("desc");
- desc.setValue(fileInfo.description());
- file.appendChild(desc);
- }
- items.append(file);
-
- // add supported stream methods
+ // collect supported stream methods
QXmppDataForm form;
form.setType(QXmppDataForm::Form);
@@ -1408,8 +1398,8 @@ QXmppTransferJob *QXmppTransferManager::sendFile(const QString &jid, QIODevice *
request.setType(QXmppIq::Set);
request.setTo(jid);
request.setProfile(QXmppStreamInitiationIq::FileTransfer);
+ request.setFileInfo(job->d->fileInfo);
request.setFeatureForm(form);
- request.setSiItems(items);
request.setSiId(job->d->sid);
job->d->requestId = request.id();
client()->sendPacket(request);
@@ -1594,6 +1584,7 @@ void QXmppTransferManager::streamInitiationSetReceived(const QXmppStreamInitiati
job->d->offerId = iq.id();
job->d->sid = iq.siId();
job->d->mimeType = iq.mimeType();
+ job->d->fileInfo = iq.fileInfo();
foreach (const QXmppDataForm::Field &field, iq.featureForm().fields()) {
if (field.key() == "stream-method") {
QPair<QString, QString> option;
@@ -1605,17 +1596,6 @@ void QXmppTransferManager::streamInitiationSetReceived(const QXmppStreamInitiati
}
}
}
- foreach (const QXmppElement &item, iq.siItems())
- {
- if (item.tagName() == "file" && item.attribute("xmlns") == ns_stream_initiation_file_transfer)
- {
- job->d->fileInfo.setDate(QXmppUtils::datetimeFromString(item.attribute("date")));
- job->d->fileInfo.setHash(QByteArray::fromHex(item.attribute("hash").toAscii()));
- job->d->fileInfo.setName(item.attribute("name"));
- job->d->fileInfo.setSize(item.attribute("size").toLongLong());
- job->d->fileInfo.setDescription(item.firstChildElement("desc").value());
- }
- }
// select a method supported by both parties
int sharedMethods = (offeredMethods & d->supportedMethods);
diff --git a/src/client/QXmppTransferManager.h b/src/client/QXmppTransferManager.h
index a14e075f..71068b27 100644
--- a/src/client/QXmppTransferManager.h
+++ b/src/client/QXmppTransferManager.h
@@ -65,6 +65,7 @@ public:
qint64 size() const;
void setSize(qint64 size);
+ bool isNull() const;
QXmppTransferFileInfo& operator=(const QXmppTransferFileInfo &other);
bool operator==(const QXmppTransferFileInfo &other) const;
diff --git a/tests/si.cpp b/tests/si.cpp
index 09e8cf42..d5bddaad 100644
--- a/tests/si.cpp
+++ b/tests/si.cpp
@@ -98,5 +98,29 @@ void tst_QXmppStreamInitiationIq::testOffer()
QXmppStreamInitiationIq iq;
parsePacket(iq, xml);
+ QVERIFY(!iq.fileInfo().isNull());
+ QCOMPARE(iq.fileInfo().name(), QString("test.txt"));
+ QCOMPARE(iq.fileInfo().size(), qint64(1022));
+ serializePacket(iq, xml);
+}
+
+void tst_QXmppStreamInitiationIq::testResult()
+{
+ QByteArray xml(
+ "<iq id=\"offer1\" to=\"sender@jabber.org/resource\" type=\"result\">"
+ "<si xmlns=\"http://jabber.org/protocol/si\">"
+ "<feature xmlns=\"http://jabber.org/protocol/feature-neg\">"
+ "<x xmlns=\"jabber:x:data\" type=\"submit\">"
+ "<field type=\"list-single\" var=\"stream-method\">"
+ "<value>http://jabber.org/protocol/bytestreams</value>"
+ "</field>"
+ "</x>"
+ "</feature>"
+ "</si>"
+ "</iq>");
+
+ QXmppStreamInitiationIq iq;
+ parsePacket(iq, xml);
+ QVERIFY(iq.fileInfo().isNull());
serializePacket(iq, xml);
}
diff --git a/tests/si.h b/tests/si.h
index 28254ef4..97e325b8 100644
--- a/tests/si.h
+++ b/tests/si.h
@@ -32,5 +32,6 @@ private slots:
void testFileInfo_data();
void testFileInfo();
void testOffer();
+ void testResult();
};