diff --git a/autotests/emailtest.cpp b/autotests/emailtest.cpp --- a/autotests/emailtest.cpp +++ b/autotests/emailtest.cpp @@ -125,7 +125,7 @@ { QByteArray vcarddata("BEGIN:VCARD\n" "VERSION:3.0\n" - "EMAIL;TYPE=HOME,PREF;X-EVOLUTION-UI-SLOT=2:foo@foo.com\n" + "EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=2:foo@foo.com\n" "EMAIL;TYPE=HOME,PREF;X-EVOLUTION-UI-SLOT=2:bla@bla.com\n" "N:LastName;FirstName;;;\n" "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" @@ -140,8 +140,12 @@ QCOMPARE(lst.at(0).emailList().count(), 2); KContacts::Email email = lst.at(0).emailList().at(0); QCOMPARE(email.mail(), QStringLiteral("bla@bla.com")); + QCOMPARE(email.type(), KContacts::Email::Home | KContacts::Email::Preferred); + QVERIFY(email.isPreferred()); email = lst.at(0).emailList().at(1); QCOMPARE(email.mail(), QStringLiteral("foo@foo.com")); + QCOMPARE(email.type(), KContacts::Email::Work); + QVERIFY(!email.isPreferred()); QCOMPARE(email.parameters().count(), 2); } @@ -170,7 +174,7 @@ addr.setUid(QStringLiteral("testuid")); lst << addr; KContacts::VCardTool vcard; - const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); QByteArray expected("BEGIN:VCARD\r\n" "VERSION:4.0\r\n" "EMAIL:foo@kde.org\r\n" @@ -180,6 +184,25 @@ "END:VCARD\r\n\r\n"); QCOMPARE(ba, expected); + + KContacts::Addressee addr2; + addr2.setUid(QStringLiteral("testuid")); + KContacts::Email email1, email2; + email1.setEmail(QStringLiteral("foo@kde.org")); + email1.setType(KContacts::Email::Work | KContacts::Email::Preferred); + email2.setEmail(QStringLiteral("bla@kde.org")); + email2.setType(KContacts::Email::Home); + addr2.setEmailList({email1, email2}); + ba = vcard.exportVCards({addr2}, KContacts::VCard::v4_0); + QByteArray expected2("BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL;TYPE=WORK,PREF:foo@kde.org\r\n" + "EMAIL;TYPE=HOME:bla@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected2); } QTEST_MAIN(EmailTest) diff --git a/src/email.h b/src/email.h --- a/src/email.h +++ b/src/email.h @@ -41,6 +41,8 @@ Q_GADGET Q_PROPERTY(QString email READ mail WRITE setEmail) Q_PROPERTY(bool isValid READ isValid) + Q_PROPERTY(Type type READ type WRITE setType) + Q_PROPERTY(bool isPreferred) public: /** @@ -54,11 +56,40 @@ typedef QVector List; + /** Email types. */ + enum TypeFlag { + Unknown = 0, /**< No or unknown email type is set. */ + Home = 1, /**< Personal email. */ + Work = 2, /**< Work email. */ + Other = 4, /**< Other email. */ + Preferred = 8 /**< Preferred email address. */ + }; + + Q_DECLARE_FLAGS(Type, TypeFlag) + Q_FLAG(Type) + void setEmail(const QString &mail); Q_REQUIRED_RESULT QString mail() const; Q_REQUIRED_RESULT bool isValid() const; + /** + * Returns the type of the email. + * @since 5.12 + */ + Type type() const; + /** + * Sets the email type. + * @since 5.12 + */ + void setType(Type type); + + /** + * Returns whether this is the preferred email address. + * @since 5.12 + */ + bool isPreferred() const; + void setParameters(const QMap ¶ms); Q_REQUIRED_RESULT QMap parameters() const; @@ -73,6 +104,8 @@ QSharedDataPointer d; }; +Q_DECLARE_OPERATORS_FOR_FLAGS(Email::Type) + KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Email &object); KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Email &object); diff --git a/src/email.cpp b/src/email.cpp --- a/src/email.cpp +++ b/src/email.cpp @@ -126,6 +126,63 @@ return !d->mail.isEmpty(); } +struct email_type_name +{ + const char* name; + Email::Type type; +}; + +static const email_type_name email_type_names[] = { + { "HOME", Email::Home }, + { "WORK", Email::Work }, + { "OTHER", Email::Other }, + { "PREF", Email::Preferred } +}; + +Email::Type KContacts::Email::type() const +{ + const auto it = d->parameters.constFind(QLatin1String("type")); + if (it == d->parameters.end()) { + return Unknown; + } + + Type type = Unknown; + for (const auto &s : it.value()) { + const auto it = std::find_if(std::begin(email_type_names), std::end(email_type_names), [s](const email_type_name &t) { + return QLatin1String(t.name) == s; + }); + if (it != std::end(email_type_names)) { + type |= (*it).type; + } + } + return type; +} + +void Email::setType(Type type) +{ + const auto oldType = this->type(); + + auto types = d->parameters.value(QLatin1String("type")); + for (const auto &t : email_type_names) { + if (((type ^ oldType) & t.type) == 0) { + continue; // no change + } + + if (type & t.type) { + types.push_back(QLatin1String(t.name)); + } else { + types.removeAll(QLatin1String(t.name)); + } + } + + d->parameters.insert(QLatin1String("type"), types); +} + +bool Email::isPreferred() const +{ + return type() & Preferred; +} + QDataStream &KContacts::operator<<(QDataStream &s, const Email &email) { return s << email.d->parameters << email.d->mail;