From c1c1de1b7bacc9ee9661021fef306fcd027e51c6 Mon Sep 17 00:00:00 2001 From: blue Date: Tue, 5 Nov 2019 21:55:21 +0300 Subject: [PATCH] backend adapter for vCard phones list --- core/CMakeLists.txt | 1 + core/account.cpp | 100 +----------- core/account.h | 2 + core/adapterFuctions.cpp | 269 +++++++++++++++++++++++++++++++ global.h | 5 +- ui/widgets/vcard/emailsmodel.cpp | 2 +- 6 files changed, 281 insertions(+), 98 deletions(-) create mode 100644 core/adapterFuctions.cpp diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 2c0374d..fab36f2 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -17,6 +17,7 @@ set(squawkCORE_SRC conference.cpp storage.cpp networkaccess.cpp + adapterFuctions.cpp ) # Tell CMake to create the helloworld executable diff --git a/core/account.cpp b/core/account.cpp index ed6da44..e3dd29f 100644 --- a/core/account.cpp +++ b/core/account.cpp @@ -1347,36 +1347,7 @@ void Core::Account::onVCardReceived(const QXmppVCardIq& card) } Shared::VCard vCard; - vCard.setFullName(card.fullName()); - vCard.setFirstName(card.firstName()); - vCard.setMiddleName(card.middleName()); - vCard.setLastName(card.lastName()); - vCard.setBirthday(card.birthday()); - vCard.setNickName(card.nickName()); - vCard.setDescription(card.description()); - vCard.setUrl(card.url()); - QXmppVCardOrganization org = card.organization(); - vCard.setOrgName(org.organization()); - vCard.setOrgRole(org.role()); - vCard.setOrgUnit(org.unit()); - vCard.setOrgTitle(org.title()); - - QList emails = card.emails(); - std::deque& myEmails = vCard.getEmails(); - for (const QXmppVCardEmail& em : emails) { - Shared::VCard::Email mEm(em.address()); - QXmppVCardEmail::Type et = em.type(); - if (et & QXmppVCardEmail::Preferred) { - mEm.prefered = true; - } - if (et & QXmppVCardEmail::Home && !(et & QXmppVCardEmail::Work)) { - mEm.role = Shared::VCard::Email::home; - } else if (!(et & QXmppVCardEmail::Home) && et & QXmppVCardEmail::Work) { - mEm.role = Shared::VCard::Email::work; - } - - myEmails.emplace_back(mEm); - } + initializeVCard(vCard, card); if (item->hasAvatar()) { if (!item->isAvatarAutoGenerated()) { @@ -1480,19 +1451,8 @@ void Core::Account::onOwnVCardReceived(const QXmppVCardIq& card) ownVCardRequestInProgress = false; Shared::VCard vCard; - vCard.setFullName(card.fullName()); - vCard.setFirstName(card.firstName()); - vCard.setMiddleName(card.middleName()); - vCard.setLastName(card.lastName()); - vCard.setBirthday(card.birthday()); - vCard.setNickName(card.nickName()); - vCard.setDescription(card.description()); - vCard.setUrl(card.url()); - QXmppVCardOrganization org = card.organization(); - vCard.setOrgName(org.organization()); - vCard.setOrgRole(org.role()); - vCard.setOrgUnit(org.unit()); - vCard.setOrgTitle(org.title()); + initializeVCard(vCard, card); + if (avatarType.size() > 0) { vCard.setAvatarType(Shared::Avatar::valid); vCard.setAvatarPath(path + "avatar." + avatarType); @@ -1500,24 +1460,6 @@ void Core::Account::onOwnVCardReceived(const QXmppVCardIq& card) vCard.setAvatarType(Shared::Avatar::empty); } - - QList emails = card.emails(); - std::deque& myEmails = vCard.getEmails(); - for (const QXmppVCardEmail& em : emails) { - Shared::VCard::Email mEm(em.address()); - QXmppVCardEmail::Type et = em.type(); - if (et & QXmppVCardEmail::Preferred) { - mEm.prefered = true; - } - if (et & QXmppVCardEmail::Home && !(et & QXmppVCardEmail::Work)) { - mEm.role = Shared::VCard::Email::home; - } else if (!(et & QXmppVCardEmail::Home) && et & QXmppVCardEmail::Work) { - mEm.role = Shared::VCard::Email::work; - } - - myEmails.emplace_back(mEm); - } - emit receivedVCard(getLogin() + "@" + getServer(), vCard); } @@ -1555,41 +1497,7 @@ void Core::Account::requestVCard(const QString& jid) void Core::Account::uploadVCard(const Shared::VCard& card) { QXmppVCardIq iq; - iq.setFullName(card.getFullName()); - iq.setFirstName(card.getFirstName()); - iq.setMiddleName(card.getMiddleName()); - iq.setLastName(card.getLastName()); - iq.setNickName(card.getNickName()); - iq.setBirthday(card.getBirthday()); - iq.setDescription(card.getDescription()); - iq.setUrl(card.getUrl()); - QXmppVCardOrganization org; - org.setOrganization(card.getOrgName()); - org.setUnit(card.getOrgUnit()); - org.setRole(card.getOrgRole()); - org.setTitle(card.getOrgTitle()); - iq.setOrganization(org); - - const std::deque& myEmails = card.getEmails(); - QList emails; - for (const Shared::VCard::Email& mEm : myEmails) { - QXmppVCardEmail em; - QXmppVCardEmail::Type t = QXmppVCardEmail::Internet; - if (mEm.prefered) { - t = t | QXmppVCardEmail::Preferred; - } - if (mEm.role == Shared::VCard::Email::home) { - t = t | QXmppVCardEmail::Home; - } else if (mEm.role == Shared::VCard::Email::work) { - t = t | QXmppVCardEmail::Work; - } - em.setType(t); - em.setAddress(mEm.address); - - emails.push_back(em); - } - - iq.setEmails(emails); + initializeQXmppVCard(iq, card); bool avatarChanged = false; if (card.getAvatarType() == Shared::Avatar::empty) { diff --git a/core/account.h b/core/account.h index d6444d3..a5f07bd 100644 --- a/core/account.h +++ b/core/account.h @@ -202,6 +202,8 @@ private: }; +void initializeVCard(Shared::VCard& vCard, const QXmppVCardIq& card); +void initializeQXmppVCard(QXmppVCardIq& card, const Shared::VCard& vCard); } diff --git a/core/adapterFuctions.cpp b/core/adapterFuctions.cpp new file mode 100644 index 0000000..0693c34 --- /dev/null +++ b/core/adapterFuctions.cpp @@ -0,0 +1,269 @@ +/* + * Squawk messenger. + * Copyright (C) 2019 Yury Gubich + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef CORE_ADAPTER_FUNCTIONS_H +#define CORE_ADAPTER_FUNCTIONS_H + +#include "account.h" + +void Core::initializeVCard(Shared::VCard& vCard, const QXmppVCardIq& card) +{ + vCard.setFullName(card.fullName()); + vCard.setFirstName(card.firstName()); + vCard.setMiddleName(card.middleName()); + vCard.setLastName(card.lastName()); + vCard.setBirthday(card.birthday()); + vCard.setNickName(card.nickName()); + vCard.setDescription(card.description()); + vCard.setUrl(card.url()); + QXmppVCardOrganization org = card.organization(); + vCard.setOrgName(org.organization()); + vCard.setOrgRole(org.role()); + vCard.setOrgUnit(org.unit()); + vCard.setOrgTitle(org.title()); + + QList emails = card.emails(); + std::deque& myEmails = vCard.getEmails(); + for (const QXmppVCardEmail& em : emails) { + QXmppVCardEmail::Type et = em.type(); + bool prefered = false; + bool accounted = false; + if (et & QXmppVCardEmail::Preferred) { + prefered = true; + } + if (et & QXmppVCardEmail::Home) { + myEmails.emplace_back(em.address(), Shared::VCard::Email::home, prefered); + accounted = true; + } + if (et & QXmppVCardEmail::Work) { + myEmails.emplace_back(em.address(), Shared::VCard::Email::work, prefered); + accounted = true; + } + if (!accounted) { + myEmails.emplace_back(em.address(), Shared::VCard::Email::none, prefered); + } + + } + + QList phones = card.phones(); + std::deque& myPhones = vCard.getPhones(); + for (const QXmppVCardPhone& ph : phones) { + Shared::VCard::Phone mPh(ph.number()); + QXmppVCardPhone::Type pt = ph.type(); + bool prefered = false; + bool accounted = false; + if (pt & QXmppVCardPhone::Preferred) { + prefered = true; + } + + bool home = false; + bool work = false; + + if (pt & QXmppVCardPhone::Home) { + home = true; + } + if (pt & QXmppVCardPhone::Work) { + work = true; + } + + + if (pt & QXmppVCardPhone::Fax) { + if (home || work) { + if (home) { + myPhones.emplace_back(ph.number(), Shared::VCard::Phone::fax, Shared::VCard::Phone::home, prefered); + } + if (work) { + myPhones.emplace_back(ph.number(), Shared::VCard::Phone::fax, Shared::VCard::Phone::work, prefered); + } + } else { + myPhones.emplace_back(ph.number(), Shared::VCard::Phone::fax, Shared::VCard::Phone::none, prefered); + } + accounted = true; + } + if (pt & QXmppVCardPhone::Voice) { + if (home || work) { + if (home) { + myPhones.emplace_back(ph.number(), Shared::VCard::Phone::voice, Shared::VCard::Phone::home, prefered); + } + if (work) { + myPhones.emplace_back(ph.number(), Shared::VCard::Phone::voice, Shared::VCard::Phone::work, prefered); + } + } else { + myPhones.emplace_back(ph.number(), Shared::VCard::Phone::voice, Shared::VCard::Phone::none, prefered); + } + accounted = true; + } + if (pt & QXmppVCardPhone::Pager) { + if (home || work) { + if (home) { + myPhones.emplace_back(ph.number(), Shared::VCard::Phone::pager, Shared::VCard::Phone::home, prefered); + } + if (work) { + myPhones.emplace_back(ph.number(), Shared::VCard::Phone::pager, Shared::VCard::Phone::work, prefered); + } + } else { + myPhones.emplace_back(ph.number(), Shared::VCard::Phone::pager, Shared::VCard::Phone::none, prefered); + } + accounted = true; + } + if (pt & QXmppVCardPhone::Cell) { + if (home || work) { + if (home) { + myPhones.emplace_back(ph.number(), Shared::VCard::Phone::cell, Shared::VCard::Phone::home, prefered); + } + if (work) { + myPhones.emplace_back(ph.number(), Shared::VCard::Phone::cell, Shared::VCard::Phone::work, prefered); + } + } else { + myPhones.emplace_back(ph.number(), Shared::VCard::Phone::cell, Shared::VCard::Phone::none, prefered); + } + accounted = true; + } + if (pt & QXmppVCardPhone::Video) { + if (home || work) { + if (home) { + myPhones.emplace_back(ph.number(), Shared::VCard::Phone::video, Shared::VCard::Phone::home, prefered); + } + if (work) { + myPhones.emplace_back(ph.number(), Shared::VCard::Phone::video, Shared::VCard::Phone::work, prefered); + } + } else { + myPhones.emplace_back(ph.number(), Shared::VCard::Phone::video, Shared::VCard::Phone::none, prefered); + } + accounted = true; + } + if (pt & QXmppVCardPhone::Modem) { + if (home || work) { + if (home) { + myPhones.emplace_back(ph.number(), Shared::VCard::Phone::modem, Shared::VCard::Phone::home, prefered); + } + if (work) { + myPhones.emplace_back(ph.number(), Shared::VCard::Phone::modem, Shared::VCard::Phone::work, prefered); + } + } else { + myPhones.emplace_back(ph.number(), Shared::VCard::Phone::modem, Shared::VCard::Phone::none, prefered); + } + accounted = true; + } + if (!accounted) { + if (home || work) { + if (home) { + myPhones.emplace_back(ph.number(), Shared::VCard::Phone::other, Shared::VCard::Phone::home, prefered); + } + if (work) { + myPhones.emplace_back(ph.number(), Shared::VCard::Phone::other, Shared::VCard::Phone::work, prefered); + } + } else { + myPhones.emplace_back(ph.number(), Shared::VCard::Phone::other, Shared::VCard::Phone::none, prefered); + } + } + } +} + +void Core::initializeQXmppVCard(QXmppVCardIq& iq, const Shared::VCard& card) { + iq.setFullName(card.getFullName()); + iq.setFirstName(card.getFirstName()); + iq.setMiddleName(card.getMiddleName()); + iq.setLastName(card.getLastName()); + iq.setNickName(card.getNickName()); + iq.setBirthday(card.getBirthday()); + iq.setDescription(card.getDescription()); + iq.setUrl(card.getUrl()); + QXmppVCardOrganization org; + org.setOrganization(card.getOrgName()); + org.setUnit(card.getOrgUnit()); + org.setRole(card.getOrgRole()); + org.setTitle(card.getOrgTitle()); + iq.setOrganization(org); + + const std::deque& myEmails = card.getEmails(); + QList emails; + for (const Shared::VCard::Email& mEm : myEmails) { + QXmppVCardEmail em; + QXmppVCardEmail::Type t = QXmppVCardEmail::Internet; + if (mEm.prefered) { + t = t | QXmppVCardEmail::Preferred; + } + if (mEm.role == Shared::VCard::Email::home) { + t = t | QXmppVCardEmail::Home; + } else if (mEm.role == Shared::VCard::Email::work) { + t = t | QXmppVCardEmail::Work; + } + em.setType(t); + em.setAddress(mEm.address); + + emails.push_back(em); + } + + std::map phones; + QList phs; + const std::deque& myPhones = card.getPhones(); + for (const Shared::VCard::Phone& mPh : myPhones) { + std::map::iterator itr = phones.find(mPh.number); + if (itr == phones.end()) { + itr = phones.emplace(mPh.number, QXmppVCardPhone()).first; + } + QXmppVCardPhone& phone = itr->second; + + switch (mPh.type) { + case Shared::VCard::Phone::fax: + phone.setType(phone.type() | QXmppVCardPhone::Fax); + break; + case Shared::VCard::Phone::pager: + phone.setType(phone.type() | QXmppVCardPhone::Pager); + break; + case Shared::VCard::Phone::voice: + phone.setType(phone.type() | QXmppVCardPhone::Voice); + break; + case Shared::VCard::Phone::cell: + phone.setType(phone.type() | QXmppVCardPhone::Cell); + break; + case Shared::VCard::Phone::video: + phone.setType(phone.type() | QXmppVCardPhone::Video); + break; + case Shared::VCard::Phone::modem: + phone.setType(phone.type() | QXmppVCardPhone::Modem); + break; + case Shared::VCard::Phone::other: + phone.setType(phone.type() | QXmppVCardPhone::PCS); //loss of information, but I don't even know what the heck is this type of phone! + break; + } + + switch (mPh.role) { + case Shared::VCard::Phone::home: + phone.setType(phone.type() | QXmppVCardPhone::Home); + break; + case Shared::VCard::Phone::work: + phone.setType(phone.type() | QXmppVCardPhone::Work); + break; + default: + break; + } + + if (mPh.prefered) { + phone.setType(phone.type() | QXmppVCardPhone::Preferred); + } + } + for (const std::pair& phone : phones) { + phs.push_back(phone.second); + } + + iq.setEmails(emails); + iq.setPhones(phs); +} + +#endif // CORE_ADAPTER_FUNCTIONS_H diff --git a/global.h b/global.h index 34d892c..72c8406 100644 --- a/global.h +++ b/global.h @@ -238,13 +238,15 @@ public: QString address; }; class Phone : public Contact { + public: enum Type { fax, pager, voice, cell, video, - modem + modem, + other }; Phone(const QString& number, Type p_type = voice, Role p_role = none, bool p_prefered = false); @@ -252,6 +254,7 @@ public: Type type; }; class Address : public Contact { + public: Address( const QString& zCode = "", const QString& cntry = "", diff --git a/ui/widgets/vcard/emailsmodel.cpp b/ui/widgets/vcard/emailsmodel.cpp index 2babaad..7e3a646 100644 --- a/ui/widgets/vcard/emailsmodel.cpp +++ b/ui/widgets/vcard/emailsmodel.cpp @@ -108,7 +108,7 @@ bool UI::VCard::EMailsModel::setData(const QModelIndex& index, const QVariant& v bool newDef = value.toBool(); if (newDef != item.prefered) { if (newDef) { - dropPrefered(); + //dropPrefered(); } item.prefered = newDef; return true;