Skip to content

Commit

Permalink
vcard4: more templates magic
Browse files Browse the repository at this point in the history
  • Loading branch information
Ri0n committed Jun 12, 2024
1 parent 7d70c41 commit d261894
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 37 deletions.
4 changes: 2 additions & 2 deletions src/xmpp/xmpp-im/xmpp_vcard4.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -825,9 +825,9 @@ void VCard::fromVCardTemp(const XMPP::VCard &tempVCard)

// Birthday
if (!tempVCard.bday().isNull()) {
setBday({ { PDate { Parameters(), tempVCard.bday() } } });
setBday({ { Parameters(), tempVCard.bday() } });
} else {
setBday({ { PDate { Parameters(), QDate::fromString(tempVCard.bdayStr(), Qt::ISODate) } } });
setBday({ { Parameters(), tempVCard.bdayStr() } });
}

// Addresses
Expand Down
79 changes: 44 additions & 35 deletions src/xmpp/xmpp-im/xmpp_vcard4.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,50 +111,36 @@ class UriValue {
QString mediaType;
};

struct ItemBase {
using UriOrText = std::variant<QUrl, QString>;
using TimeZone = std::variant<QUrl, QString, int>;
using Historical = std::variant<QDateTime, QDate, QTime, QString>;

template <typename T> struct ItemBase {
Parameters parameters;
T data;
};

template <typename T> struct Item : public ItemBase {
T data;
operator QString() const { return data; }
operator QDate() const { return {}; }
template <typename T> struct Item : public ItemBase<T> {
operator QString() const { return this->data; } // maybe convertible by Qt means
operator QDate() const { return QDate(this->data); }
operator QUrl() const { return QUrl(this->data); }
};

template <> struct Item<QDate> : public ItemBase {
QDate data;
template <> struct Item<QDate> : public ItemBase<QDate> {
operator QString() const { return data.toString(Qt::ISODate); }
operator QDate() const { return data; }
};

template <> struct Item<QDateTime> : public ItemBase {
QDateTime data;
template <> struct Item<QDateTime> : public ItemBase<QDateTime> {
operator QString() const { return data.toString(Qt::ISODate); }
operator QDate() const { return data.date(); }
};

template <> struct Item<QStringList> : public ItemBase {
QStringList data;
template <> struct Item<QStringList> : public ItemBase<QStringList> {
operator QString() const { return data.value(0); }
};

using UriOrText = std::variant<QUrl, QString>;
using TimeZone = std::variant<QUrl, QString, int>;
using Historical = std::variant<QDateTime, QDate, QTime, QString>;

using PStringList = Item<QStringList>;
using PString = Item<QString>;
using PUri = Item<QUrl>;
using PDate = Item<QDate>;
using PAdvUri = Item<UriValue>;
using PAddress = Item<Address>;
using PNames = Item<Names>;
using PUriOrText = Item<UriOrText>;
using PTimeZone = Item<TimeZone>;
using PHistorical = Item<Historical>;

template <> struct Item<Historical> : public ItemBase {
Historical data;
template <> struct Item<Historical> : public ItemBase<Historical> {
operator QString() const
{
return std::visit(
Expand Down Expand Up @@ -186,6 +172,33 @@ template <> struct Item<Historical> : public ItemBase {
}
};

template <> struct Item<UriOrText> : public ItemBase<UriOrText> {
operator QString() const
{
return std::visit(
[this](auto const &v) {
using Tv = std::decay_t<decltype(v)>;
if constexpr (std::is_same_v<Tv, QString>) {
return v;
} else {
return v.toString();
}
},
data);
}
};

using PStringList = Item<QStringList>;
using PString = Item<QString>;
using PUri = Item<QUrl>;
using PDate = Item<QDate>;
using PAdvUri = Item<UriValue>;
using PAddress = Item<Address>;
using PNames = Item<Names>;
using PUriOrText = Item<UriOrText>;
using PTimeZone = Item<TimeZone>;
using PHistorical = Item<Historical>;

template <typename T> class TaggedList : public QList<T> {
public:
using item_type = T;
Expand All @@ -199,7 +212,8 @@ template <typename T> class TaggedList : public QList<T> {
*this, [](auto const &a, auto const &b) { return a.parameters.pref > b.parameters.pref; });
}

operator QString() const { return preferred().data; }
operator QString() const { return preferred(); }
operator QUrl() const { return preferred(); }
};

template <> class TaggedList<PAdvUri> : public QList<PAdvUri> {
Expand All @@ -221,12 +235,7 @@ template <> class TaggedList<PAdvUri> : public QList<PAdvUri> {
}
};

class TaggedListStringList : public TaggedList<PStringList> {
public:
operator QString() const { return preferred().data.value(0); }
};

using PStringLists = TaggedListStringList;
using PStringLists = TaggedList<PStringList>;
using PStrings = TaggedList<PString>;
using PUris = TaggedList<PUri>;
using PAdvUris = TaggedList<PAdvUri>;
Expand Down

0 comments on commit d261894

Please sign in to comment.