aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2012-08-03 16:28:53 +0200
committerJeremy Lainé <jeremy.laine@m4x.org>2012-08-03 16:28:53 +0200
commita8e6bd3e1d435038591b3a16fb31136539c5efec (patch)
treef1e1ac1be12a07f9faa21f59c4e2f7e45ada31f3
parent1268a64bdd1320639cad0d9c8331fb6fd682b30c (diff)
downloadqxmpp-a8e6bd3e1d435038591b3a16fb31136539c5efec.tar.gz
Make it possible to have several addresses in vCards.
-rw-r--r--CHANGELOG1
-rw-r--r--src/base/QXmppVCardIq.cpp93
-rw-r--r--src/base/QXmppVCardIq.h15
-rw-r--r--tests/vcard.cpp34
4 files changed, 140 insertions, 3 deletions
diff --git a/CHANGELOG b/CHANGELOG
index ccd566a0..7d4fbeb8 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,7 @@ QXmpp 0.6.4 (UNRELEASED)
------------------------
- Improve vCard support:
+ * Make it possible to have several addresses.
* Make it possible to have several e-mail addresses.
* Make it possible to have several phone numbers.
- Make it possible to set the client's extended information form (XEP-0128).
diff --git a/src/base/QXmppVCardIq.cpp b/src/base/QXmppVCardIq.cpp
index 9dcd19c8..27bcbc34 100644
--- a/src/base/QXmppVCardIq.cpp
+++ b/src/base/QXmppVCardIq.cpp
@@ -52,6 +52,11 @@ class QXmppVCardAddressPrivate : public QSharedData
{
public:
QXmppVCardAddressPrivate() : type(QXmppVCardAddress::None) {};
+ QString country;
+ QString locality;
+ QString postcode;
+ QString region;
+ QString street;
QXmppVCardAddress::Type type;
};
@@ -81,6 +86,76 @@ QXmppVCardAddress& QXmppVCardAddress::operator=(const QXmppVCardAddress &other)
return *this;
}
+/// Returns the country.
+
+QString QXmppVCardAddress::country() const
+{
+ return d->country;
+}
+
+/// Sets the country.
+
+void QXmppVCardAddress::setCountry(const QString &country)
+{
+ d->country = country;
+}
+
+/// Returns the locality.
+
+QString QXmppVCardAddress::locality() const
+{
+ return d->locality;
+}
+
+/// Sets the locality.
+
+void QXmppVCardAddress::setLocality(const QString &locality)
+{
+ d->locality = locality;
+}
+
+/// Returns the postcode.
+
+QString QXmppVCardAddress::postcode() const
+{
+ return d->postcode;
+}
+
+/// Sets the postcode.
+
+void QXmppVCardAddress::setPostcode(const QString &postcode)
+{
+ d->postcode = postcode;
+}
+
+/// Returns the region.
+
+QString QXmppVCardAddress::region() const
+{
+ return d->region;
+}
+
+/// Sets the region.
+
+void QXmppVCardAddress::setRegion(const QString &region)
+{
+ d->region = region;
+}
+
+/// Returns the street address.
+
+QString QXmppVCardAddress::street() const
+{
+ return d->street;
+}
+
+/// Sets the street address.
+
+void QXmppVCardAddress::setStreet(const QString &street)
+{
+ d->street = street;
+}
+
/// Returns the address type, which is a combination of TypeFlag.
QXmppVCardAddress::Type QXmppVCardAddress::type() const
@@ -105,6 +180,12 @@ void QXmppVCardAddress::parse(const QDomElement &element)
d->type |= Postal;
if (!element.firstChildElement("PREF").isNull())
d->type |= Preferred;
+
+ d->country = element.firstChildElement("CTRY").text();
+ d->locality = element.firstChildElement("LOCALITY").text();
+ d->postcode = element.firstChildElement("PCODE").text();
+ d->region = element.firstChildElement("REGION").text();
+ d->street = element.firstChildElement("STREET").text();
}
void QXmppVCardAddress::toXml(QXmlStreamWriter *writer) const
@@ -118,6 +199,18 @@ void QXmppVCardAddress::toXml(QXmlStreamWriter *writer) const
writer->writeEmptyElement("POSTAL");
if (d->type & Preferred)
writer->writeEmptyElement("PREF");
+
+ if (!d->country.isEmpty())
+ writer->writeTextElement("CTRY", d->country);
+ if (!d->locality.isEmpty())
+ writer->writeTextElement("LOCALITY", d->locality);
+ if (!d->postcode.isEmpty())
+ writer->writeTextElement("PCODE", d->postcode);
+ if (!d->region.isEmpty())
+ writer->writeTextElement("REGION", d->region);
+ if (!d->street.isEmpty())
+ writer->writeTextElement("STREET", d->street);
+
writer->writeEndElement();
}
diff --git a/src/base/QXmppVCardIq.h b/src/base/QXmppVCardIq.h
index 769ca783..ba83eb7c 100644
--- a/src/base/QXmppVCardIq.h
+++ b/src/base/QXmppVCardIq.h
@@ -56,6 +56,21 @@ public:
QXmppVCardAddress& operator=(const QXmppVCardAddress &other);
+ QString country() const;
+ void setCountry(const QString &country);
+
+ QString locality() const;
+ void setLocality(const QString &locality);
+
+ QString postcode() const;
+ void setPostcode(const QString &postcode);
+
+ QString region() const;
+ void setRegion(const QString &region);
+
+ QString street() const;
+ void setStreet(const QString &street);
+
Type type() const;
void setType(Type type);
diff --git a/tests/vcard.cpp b/tests/vcard.cpp
index ccc65199..eacaf938 100644
--- a/tests/vcard.cpp
+++ b/tests/vcard.cpp
@@ -30,19 +30,43 @@ void tst_QXmppVCardIq::testAddress_data()
{
QTest::addColumn<QByteArray>("xml");
QTest::addColumn<int>("type");
-
- QTest::newRow("none") << QByteArray("<ADR/>") << int(QXmppVCardAddress::None);
- QTest::newRow("HOME") << QByteArray("<ADR><HOME/></ADR>") << int(QXmppVCardAddress::Home);
+ QTest::addColumn<QString>("country");
+ QTest::addColumn<QString>("locality");
+ QTest::addColumn<QString>("postcode");
+ QTest::addColumn<QString>("region");
+ QTest::addColumn<QString>("street");
+
+ QTest::newRow("none") << QByteArray("<ADR/>") << int(QXmppVCardAddress::None) << "" << "" << "" << "" << "";
+ QTest::newRow("HOME") << QByteArray("<ADR><HOME/></ADR>") << int(QXmppVCardAddress::Home) << "" << "" << "" << "" << "";
+ QTest::newRow("WORK") << QByteArray("<ADR><WORK/></ADR>") << int(QXmppVCardAddress::Work) << "" << "" << "" << "" << "";
+ QTest::newRow("POSTAL") << QByteArray("<ADR><POSTAL/></ADR>") << int(QXmppVCardAddress::Postal) << "" << "" << "" << "" << "";
+ QTest::newRow("PREF") << QByteArray("<ADR><PREF/></ADR>") << int(QXmppVCardAddress::Preferred) << "" << "" << "" << "" << "";
+
+ QTest::newRow("country") << QByteArray("<ADR><CTRY>France</CTRY></ADR>") << int(QXmppVCardAddress::None) << "France" << "" << "" << "" << "";
+ QTest::newRow("locality") << QByteArray("<ADR><LOCALITY>Paris</LOCALITY></ADR>") << int(QXmppVCardAddress::None) << "" << "Paris" << "" << "" << "";
+ QTest::newRow("postcode") << QByteArray("<ADR><PCODE>75008</PCODE></ADR>") << int(QXmppVCardAddress::None) << "" << "" << "75008" << "" << "";
+ QTest::newRow("region") << QByteArray("<ADR><REGION>Ile de France</REGION></ADR>") << int(QXmppVCardAddress::None) << "" << "" << "" << "Ile de France" << "";
+ QTest::newRow("street") << QByteArray("<ADR><STREET>55 rue du faubourg Saint-Honoré</STREET></ADR>") << int(QXmppVCardAddress::None) << "" << "" << "" << "" << QString::fromUtf8("55 rue du faubourg Saint-Honoré");
}
void tst_QXmppVCardIq::testAddress()
{
QFETCH(QByteArray, xml);
QFETCH(int, type);
+ QFETCH(QString, country);
+ QFETCH(QString, locality);
+ QFETCH(QString, postcode);
+ QFETCH(QString, region);
+ QFETCH(QString, street);
QXmppVCardAddress address;
parsePacket(address, xml);
QCOMPARE(int(address.type()), type);
+ QCOMPARE(address.country(), country);
+ QCOMPARE(address.locality(), locality);
+ QCOMPARE(address.postcode(), postcode);
+ QCOMPARE(address.region(), region);
+ QCOMPARE(address.street(), street);
serializePacket(address, xml);
}
@@ -111,6 +135,7 @@ void tst_QXmppVCardIq::testVCard()
const QByteArray xml(
"<iq id=\"vcard1\" type=\"set\">"
"<vCard xmlns=\"vcard-temp\">"
+ "<ADR><CTRY>France</CTRY></ADR>"
"<BDAY>1983-09-14</BDAY>"
"<EMAIL><INTERNET/><USERID>foo.bar@example.com</USERID></EMAIL>"
"<FN>Foo Bar!</FN>"
@@ -132,6 +157,9 @@ void tst_QXmppVCardIq::testVCard()
QXmppVCardIq vcard;
parsePacket(vcard, xml);
+ QCOMPARE(vcard.addresses().size(), 1);
+ QCOMPARE(vcard.addresses()[0].country(), QLatin1String("France"));
+ QCOMPARE(int(vcard.addresses()[0].type()), int(QXmppVCardEmail::None));
QCOMPARE(vcard.birthday(), QDate(1983, 9, 14));
QCOMPARE(vcard.email(), QLatin1String("foo.bar@example.com"));
QCOMPARE(vcard.emails().size(), 1);