diff --git a/callwidget.cpp b/callwidget.cpp index 4d09fb74b72ecf86f621a3e0dcb3f977130b64e5..7051f26eb7da29de91a3408be4d1c2f922a8e60c 100644 --- a/callwidget.cpp +++ b/callwidget.cpp @@ -27,6 +27,7 @@ #include <QDesktopServices> #include <QScrollBar> #include <QWebEngineScript> +#include <QMimeData> #include <algorithm> #include <memory> @@ -50,7 +51,6 @@ #include "pixbufmanipulator.h" #include "ringthemeutils.h" #include "settingskey.h" -#include "windowscontactbackend.h" CallWidget::CallWidget(QWidget* parent) : NavWidget(parent), diff --git a/callwidget.h b/callwidget.h index ac93342c40b33a36443472bc4fac87a47c2aa721..a2eb2873925f92d5d3a1642900ad0bbee6169a54 100644 --- a/callwidget.h +++ b/callwidget.h @@ -33,12 +33,6 @@ #include "navwidget.h" #include "smartlistmodel.h" -// old LRC -#include "accountmodel.h" -#include "media/textrecording.h" -#include "video/previewmanager.h" -#include "video/renderer.h" - // new LRC #include "api/account.h" #include "api/contact.h" diff --git a/lrcinstance.h b/lrcinstance.h index c4247d151fcc34cf9576a91f0efd450141a28520..7f0c5408956f08cf768b0ef03d2d869210cf534c 100644 --- a/lrcinstance.h +++ b/lrcinstance.h @@ -46,8 +46,6 @@ #include "api/conversationmodel.h" #include "api/peerdiscoverymodel.h" -#include "account.h" - using namespace lrc::api; class LRCInstance : public QObject @@ -61,8 +59,6 @@ public: }; static void init() { instance(); - // TODO: remove when all platforms migrate to avModel - instance().avModel().deactivateOldVideoModels(); }; static Lrc& getAPI() { return *(instance().lrc_); diff --git a/mainwindow.cpp b/mainwindow.cpp index b4a88346c71a19ff71bca798cc0b3125b2ee043c..6ae4a9c85a445802a20ebce21a1450a19daff1ec 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -27,9 +27,6 @@ #include <QTimer> #include <QWindow> -#include "media/text.h" -#include "media/textrecording.h" - #ifdef Q_OS_WIN #include <QWinThumbnailToolBar> #include <QWinThumbnailToolButton> @@ -37,7 +34,6 @@ #endif #include "aboutdialog.h" -#include "callmodel.h" #include "callwidget.h" #include "settingskey.h" #include "utils.h" @@ -140,10 +136,11 @@ MainWindow::MainWindow(QWidget* parent) connect(&GlobalSystemTray::instance(), SIGNAL(messageClicked()), this, SLOT(notificationClicked())); - connect(&netManager_, &QNetworkConfigurationManager::onlineStateChanged, [=](bool online) { - Q_UNUSED(online) - AccountModel::instance().slotConnectivityChanged(); - }); + connect(&netManager_, &QNetworkConfigurationManager::onlineStateChanged, + [=](bool online) { + Q_UNUSED(online); + LRCInstance::connectivityChanged(); + }); auto flags_ = windowFlags(); diff --git a/newwizardwidget.cpp b/newwizardwidget.cpp index c8cea46df04a827ef133434ceaf1750d561c0091..0043a204d719f8605c89322c7708ff48e28e06b4 100644 --- a/newwizardwidget.cpp +++ b/newwizardwidget.cpp @@ -306,7 +306,7 @@ NewWizardWidget::timeoutNameLookupTimer() { if (ui->signUpCheckbox->isChecked() && !ui->usernameEdit->text().isEmpty()) { updateNameRegistrationUi(NameRegistrationUIState::SEARCHING); - NameDirectory::instance().lookupName(nullptr, QString(), registeredName_); + NameDirectory::instance().lookupName(QString(), registeredName_); } } diff --git a/newwizardwidget.h b/newwizardwidget.h index 8651ff23ec2cd6948c1771bdb75ddf52347dc3d1..c759dad608c69354df501192219a0fd28203aa01 100644 --- a/newwizardwidget.h +++ b/newwizardwidget.h @@ -25,6 +25,8 @@ #include "lrcinstance.h" #include "navwidget.h" +#include "namedirectory.h" + namespace Ui { class NewWizardWidget; } diff --git a/pixbufmanipulator.cpp b/pixbufmanipulator.cpp index 2d71554b2fda45fb34eb2014b6315ac0fe05be63..8a49d4ff9c515b6a6a7b2ae2f701442fc551f509 100644 --- a/pixbufmanipulator.cpp +++ b/pixbufmanipulator.cpp @@ -29,9 +29,6 @@ #include <QBuffer> #include <QPainter> -#include "person.h" -#include "call.h" -#include "contactmethod.h" #include "globalinstances.h" // new LRC @@ -44,40 +41,6 @@ #include "ringthemeutils.h" #undef interface -QVariant -PixbufManipulator::callPhoto(Call* c, const QSize& size, bool displayPresence) -{ - if (!c || c->type() == Call::Type::CONFERENCE){ - return QVariant::fromValue(Utils::fallbackAvatar(size, - c->peerContactMethod()->uri().full(), - c->peerContactMethod()->bestName())); - } - return callPhoto(c->peerContactMethod(), size, displayPresence); -} - -QVariant -PixbufManipulator::callPhoto(const ContactMethod* cm, const QSize& size, bool displayPresence) -{ - if (cm && cm->contact()) { - return contactPhoto(cm->contact(), size, displayPresence); - } else { - return QVariant::fromValue(Utils::fallbackAvatar(size, cm)); - } -} - -QVariant -PixbufManipulator::contactPhoto(Person* p, const QSize& size, bool displayPresence) -{ - Q_UNUSED(displayPresence); - QImage photo; - if (p->photo().isValid()) { - photo = p->photo().value<QImage>(); - } else { - photo = Utils::fallbackAvatar(IMAGE_SIZE, p->phoneNumbers().at(0)); - } - return QVariant::fromValue(Utils::scaleAndFrame(photo, size)); -} - QVariant PixbufManipulator::personPhoto(const QByteArray& data, const QString& type) { QImage avatar; @@ -99,13 +62,6 @@ PixbufManipulator::numberCategoryIcon(const QVariant& p, const QSize& size, bool return QVariant(); } -QVariant -PixbufManipulator::securityIssueIcon(const QModelIndex& index) -{ - Q_UNUSED(index) - return QVariant(); -} - QByteArray PixbufManipulator::toByteArray(const QVariant& pxm) { @@ -114,19 +70,6 @@ PixbufManipulator::toByteArray(const QVariant& pxm) return ba; } -QVariant -PixbufManipulator::collectionIcon(const CollectionInterface* colItf, PixmapManipulatorI::CollectionIconHint hint) const -{ - Q_UNUSED(colItf) - Q_UNUSED(hint) - return QVariant(); -} -QVariant -PixbufManipulator::securityLevelIcon(const SecurityEvaluationModel::SecurityLevel level) const -{ - Q_UNUSED(level) - return QVariant(); -} QVariant PixbufManipulator::userActionIcon(const UserActionElement& state) const { @@ -140,48 +83,6 @@ QVariant PixbufManipulator::decorationRole(const QModelIndex& index) return QVariant(); } -QVariant PixbufManipulator::decorationRole(const Call* c) -{ - QImage photo; - if (c && c->peerContactMethod() - && c->peerContactMethod()->contact() - && c->peerContactMethod()->contact()->photo().isValid()) { - photo = c->peerContactMethod()->contact()->photo().value<QImage>(); - } else { - Utils::fallbackAvatar(IMAGE_SIZE, c->peerContactMethod()); - } - return QVariant::fromValue(Utils::scaleAndFrame(photo, IMAGE_SIZE)); -} - -QVariant PixbufManipulator::decorationRole(const ContactMethod* cm) -{ - QImage photo; - if (cm && cm->contact() - && cm->contact()->photo().isValid()) { - photo = cm->contact()->photo().value<QImage>(); - } else { - photo = Utils::fallbackAvatar(IMAGE_SIZE, cm); - } - return QVariant::fromValue(Utils::scaleAndFrame(photo, IMAGE_SIZE)); -} - -QVariant PixbufManipulator::decorationRole(const Person* p) -{ - QImage photo; - if (p && p->photo().isValid()) { - photo = p->photo().value<QImage>(); - } else { - photo = Utils::fallbackAvatar(IMAGE_SIZE, p->phoneNumbers().at(0)); - } - return QVariant::fromValue(Utils::scaleAndFrame(photo, IMAGE_SIZE)); -} - -QVariant PixbufManipulator::decorationRole(const Account* acc) -{ - Q_UNUSED(acc); - return QVariant(); -} - QVariant PixbufManipulator::decorationRole(const lrc::api::conversation::Info & conversationInfo, const lrc::api::account::Info & accountInfo) diff --git a/pixbufmanipulator.h b/pixbufmanipulator.h index 044f8e61212a5bc4d5c9aba44222f03529535a07..1414015f8ec98c056a7d4195106622715697c183 100644 --- a/pixbufmanipulator.h +++ b/pixbufmanipulator.h @@ -31,25 +31,13 @@ QByteArray QImageToByteArray(QImage image); class PixbufManipulator : public Interfaces::PixmapManipulatorI { public: - QVariant callPhoto(Call* c, const QSize& size, bool displayPresence = true) override; - QVariant callPhoto(const ContactMethod* n, const QSize& size, bool displayPresence = true) override; - QVariant contactPhoto(Person* c, const QSize& size, bool displayPresence = true) override; QVariant personPhoto(const QByteArray& data, const QString& type = "PNG") override; /* TODO: the following methods return an empty QVariant/QByteArray */ QVariant numberCategoryIcon(const QVariant& p, const QSize& size, bool displayPresence = false, bool isPresent = false) override; - QVariant securityIssueIcon(const QModelIndex& index) override; QByteArray toByteArray(const QVariant& pxm) override; - QVariant collectionIcon(const CollectionInterface* colItf, - Interfaces::PixmapManipulatorI::CollectionIconHint hint = - Interfaces::PixmapManipulatorI::CollectionIconHint::NONE) const override; - QVariant securityLevelIcon(const SecurityEvaluationModel::SecurityLevel level) const override; QVariant userActionIcon(const UserActionElement& state) const override; QVariant decorationRole(const QModelIndex& index) override; - QVariant decorationRole(const Call* c) override; - QVariant decorationRole(const ContactMethod* cm) override; - QVariant decorationRole(const Person* p) override; - QVariant decorationRole(const Account* acc) override; QVariant decorationRole(const lrc::api::conversation::Info& conversation, const lrc::api::account::Info& accountInfo) override; }; diff --git a/ring-client-windows.vcxproj b/ring-client-windows.vcxproj index 3aec6d09dad6c8f2a13cbc8e0bd328b466b46263..6722e765d99188ef8c8503d24f4450080eea243d 100644 --- a/ring-client-windows.vcxproj +++ b/ring-client-windows.vcxproj @@ -306,7 +306,6 @@ <ClCompile Include="updateconfirmdialog.cpp" /> <ClCompile Include="videowidget.cpp" /> <ClCompile Include="webchathelpers.cpp" /> - <ClCompile Include="windowscontactbackend.cpp" /> </ItemGroup> <ItemGroup> <QtMoc Include="aboutdialog.h"> @@ -502,7 +501,6 @@ </QtMoc> <ClInclude Include="version.h" /> <ClInclude Include="webchathelpers.h" /> - <ClInclude Include="windowscontactbackend.h" /> </ItemGroup> <ItemGroup> <CustomBuild Include="debug\moc_predefs.h.cbt"> diff --git a/ring-client-windows.vcxproj.filters b/ring-client-windows.vcxproj.filters index ab3adb4053b2c6c62c157d3bfd5891c0c868dddb..a3e80917dfd0ae4cd35c368e78ad26cbe656f7dc 100644 --- a/ring-client-windows.vcxproj.filters +++ b/ring-client-windows.vcxproj.filters @@ -108,9 +108,6 @@ <ClCompile Include="videowidget.cpp"> <Filter>Source Files</Filter> </ClCompile> - <ClCompile Include="windowscontactbackend.cpp"> - <Filter>Source Files</Filter> - </ClCompile> <ClCompile Include="smartlistview.cpp"> <Filter>Source Files</Filter> </ClCompile> @@ -266,9 +263,6 @@ <QtMoc Include="videowidget.h"> <Filter>Header Files</Filter> </QtMoc> - <ClInclude Include="windowscontactbackend.h"> - <Filter>Header Files</Filter> - </ClInclude> <QtMoc Include="smartlistmodel.h"> <Filter>Header Files</Filter> </QtMoc> diff --git a/settingswidget.cpp b/settingswidget.cpp index 8ff55500c5aae608f57ecfa902f8e31143651756..1cd2a433f0031731a15c28656c46dd0c1929f79a 100644 --- a/settingswidget.cpp +++ b/settingswidget.cpp @@ -33,8 +33,8 @@ #include "banneditemwidget.h" #include "version.h" +#include "namedirectory.h" #include "api/newdevicemodel.h" -#include "media/recordingmodel.h" #include <QFileDialog> #include <QInputDialog> @@ -389,7 +389,7 @@ void SettingsWidget::receiveRegNameSlot(const std::string& accountID, void SettingsWidget::beforeNameLookup() { - NameDirectory::instance().lookupName(nullptr, QString(), registeredName_); + NameDirectory::instance().lookupName(QString(), registeredName_); } void SettingsWidget::afterNameLookup(lrc::api::account::LookupStatus status, const std::string& regName) @@ -765,8 +765,6 @@ void SettingsWidget::setConnections() connect(ui->downloadButton, &QAbstractButton::clicked, this, &SettingsWidget::openDownloadFolderSlot); - connect(ui->alwaysRecordingCheckBox, &QAbstractButton::clicked, this, &SettingsWidget::slotSetAlwaysRecording); - connect(ui->checkUpdateButton, &QAbstractButton::clicked, this, &SettingsWidget::checkForUpdateSlot); connect(ui->autoUpdateCheckBox, &QAbstractButton::clicked, this, &SettingsWidget::slotSetUpdateAutomatic); @@ -797,14 +795,14 @@ void SettingsWidget::populateGeneralSettings() ui->notificationCheckBox->setChecked(notifs); //recordings - ui->alwaysRecordingCheckBox->setChecked(media::RecordingModel::instance().isAlwaysRecording()); - - if (media::RecordingModel::instance().recordPath().isEmpty()) { - QString recordPath = QDir::toNativeSeparators(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)); - media::RecordingModel::instance().setRecordPath(recordPath); + if (LRCInstance::avModel().getRecordPath().empty()) { + QString recordPath = QDir::toNativeSeparators( + QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)); + LRCInstance::avModel().setRecordPath(recordPath.toStdString()); } - Utils::setElidedText(ui->recordPathButton, media::RecordingModel::instance().recordPath()); + Utils::setElidedText(ui->recordPathButton, + QString::fromStdString(LRCInstance::avModel().getRecordPath())); #ifdef Q_OS_WIN ui->autoUpdateCheckBox->setChecked(settings.value(SettingsKey::autoUpdate).toBool()); @@ -851,19 +849,20 @@ void SettingsWidget::openDownloadFolderSlot() } } -void SettingsWidget::slotSetAlwaysRecording(bool state) -{ - media::RecordingModel::instance().setAlwaysRecording(state); -} - void SettingsWidget::openRecordFolderSlot() { - QString dir = QFileDialog::getExistingDirectory(this, tr("Select A Folder For Your Recordings"), - media::RecordingModel::instance().recordPath(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); + QString dir = QFileDialog::getExistingDirectory( + this, + tr("Select A Folder For Your Recordings"), + QString::fromStdString(LRCInstance::avModel().getRecordPath()), + QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks + ); if (!dir.isEmpty()) { - media::RecordingModel::instance().setRecordPath(dir); - Utils::setElidedText(ui->recordPathButton, media::RecordingModel::instance().recordPath()); + LRCInstance::avModel().setRecordPath(dir.toStdString()); + Utils::setElidedText(ui->recordPathButton, + QString::fromStdString(LRCInstance::avModel().getRecordPath()) + ); } } diff --git a/settingswidget.h b/settingswidget.h index 74560daf687489fec8ecb40e3c2563ea03e53434..43cbd6f181a5e96e9817ba8052b9bf632edbaa86 100644 --- a/settingswidget.h +++ b/settingswidget.h @@ -129,7 +129,6 @@ private slots: void checkForUpdateSlot(); void slotSetClosedOrMin(bool state); void openDownloadFolderSlot(); - void slotSetAlwaysRecording(bool state); void openRecordFolderSlot(); void slotSetUpdateAutomatic(bool state); void outputDevIndexChangedSlot(int index); diff --git a/settingswidget.ui b/settingswidget.ui index 5afad8fd134a925924d7e0a1289355ae4315324a..0dc9b7466f768f882ecaa366c15899a4c96ea5e8 100644 --- a/settingswidget.ui +++ b/settingswidget.ui @@ -376,7 +376,7 @@ </size> </property> <property name="currentIndex"> - <number>3</number> + <number>0</number> </property> <widget class="QWidget" name="generalSettings"> <property name="sizePolicy"> @@ -867,46 +867,6 @@ </item> </layout> </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_30"> - <property name="spacing"> - <number>12</number> - </property> - <property name="leftMargin"> - <number>0</number> - </property> - <property name="topMargin"> - <number>0</number> - </property> - <item> - <widget class="ToggleSwitch" name="alwaysRecordingCheckBox" native="true"> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>0</width> - <height>30</height> - </size> - </property> - <property name="font"> - <font> - <pointsize>10</pointsize> - </font> - </property> - <property name="text" stdset="0"> - <string>Always Recording</string> - </property> - </widget> - </item> - </layout> - </item> </layout> </item> </layout> @@ -1250,7 +1210,7 @@ <rect> <x>0</x> <y>0</y> - <width>749</width> + <width>705</width> <height>1387</height> </rect> </property> @@ -2573,7 +2533,7 @@ <rect> <x>0</x> <y>0</y> - <width>749</width> + <width>683</width> <height>864</height> </rect> </property> @@ -3941,18 +3901,18 @@ </property> </widget> </item> - <item row="0" column="0"> - <widget class="ToggleSwitch" name="hardwareAccelCheckBox" native="false"> - <property name="font"> - <font> - <pointsize>11</pointsize> - </font> - </property> - <property name="text" stdset="0"> - <string>Enable hardware acceleration</string> - </property> - </widget> - </item> + <item> + <widget class="ToggleSwitch" name="hardwareAccelCheckBox" native="true"> + <property name="font"> + <font> + <pointsize>11</pointsize> + </font> + </property> + <property name="text" stdset="0"> + <string>Enable hardware acceleration</string> + </property> + </widget> + </item> <item> <spacer name="verticalSpacer_24"> <property name="orientation"> diff --git a/utils.cpp b/utils.cpp index dd1929b6a1b2429d2af28318dbead417dbef4933..134df0abb933262c3c17e766b28388f099c26ccd 100644 --- a/utils.cpp +++ b/utils.cpp @@ -623,23 +623,6 @@ Utils::fallbackAvatar(const QSize size, const QString& canonicalUriStr, const QS return avatar; } -QImage -Utils::fallbackAvatar(const QSize size, const ContactMethod* cm) -{ - if (cm == nullptr) { - return QImage(); - } - QImage image; - auto letterStr = QString(); - if (cm->uri().userinfo() != cm->bestName()) { - letterStr = cm->bestName(); - } - image = fallbackAvatar(size, - cm->uri().full(), - letterStr); - return image; -} - QImage Utils::fallbackAvatar(const QSize size, const std::string& alias, const std::string& uri) { diff --git a/utils.h b/utils.h index eb5512716028f2e3c19e7ac798488e3976ff3b21..ed4863752b050aef52eba7d905fa870cffed2304 100644 --- a/utils.h +++ b/utils.h @@ -42,11 +42,10 @@ #define LPCWSTR char* #endif -#include <api/conversationmodel.h> -#include <api/account.h> -#include <api/contactmodel.h> -#include <api/contact.h> -#include <contactmethod.h> +#include "api/conversationmodel.h" +#include "api/account.h" +#include "api/contactmodel.h" +#include "api/contact.h" static const QSize IMAGE_SIZE{ 128, 128 }; @@ -96,7 +95,6 @@ QImage getCirclePhoto(const QImage original, int sizePhoto); QImage conversationPhoto(const std::string& convUid, const lrc::api::account::Info& accountInfo); QColor getAvatarColor(const QString& canonicalUri); QImage fallbackAvatar(const QSize size, const QString& canonicalUriStr, const QString& letterStr = QString()); -QImage fallbackAvatar(const QSize size, const ContactMethod* cm); QImage fallbackAvatar(const QSize size, const std::string& alias, const std::string& uri); QByteArray QImageToByteArray(QImage image); QByteArray QByteArrayFromFile(const QString& filename); diff --git a/videooverlay.cpp b/videooverlay.cpp index acfde4745d06d074b7091760f7006f1fbc1e36f5..06a1378dc3a1a63f092d668d3895ab2e0dd48754 100644 --- a/videooverlay.cpp +++ b/videooverlay.cpp @@ -22,11 +22,6 @@ #include <QTime> -// LRC -#include "callmodel.h" -#include "person.h" -#include "account.h" - #include "lrcinstance.h" #include "utils.h" @@ -46,6 +41,8 @@ VideoOverlay::VideoOverlay(QWidget* parent) : ui->noMicButton->setCheckable(true); ui->onHoldLabel->setVisible(false); + + ui->recButton->setVisible(false); } VideoOverlay::~VideoOverlay() diff --git a/videoview.h b/videoview.h index fbcfc36156a22a50218b205e4559b115e3e210de..44e07a189739a4ce42f669cc0ea84c9c6778f3e3 100644 --- a/videoview.h +++ b/videoview.h @@ -23,11 +23,6 @@ #include <QMouseEvent> #include <QPropertyAnimation> -#include "callmodel.h" -#include "video/devicemodel.h" -#include "video/sourcemodel.h" -#include "media/video.h" - #include "videooverlay.h" namespace Ui { diff --git a/windowscontactbackend.cpp b/windowscontactbackend.cpp deleted file mode 100644 index 4dc98e5d18bf2c066a2280c0c2fd320d848a4b98..0000000000000000000000000000000000000000 --- a/windowscontactbackend.cpp +++ /dev/null @@ -1,391 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2015-2017 by Savoir-faire Linux * - * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>* - * * - * 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 <http://www.gnu.org/licenses/>. * - **************************************************************************/ - -#include "windowscontactbackend.h" - -#include <QtXml> -#include <QPainter> - -#include "personmodel.h" - -#include "utils.h" - -WindowsContactEditor::WindowsContactEditor(CollectionMediator<Person> *m - , WindowsContactBackend *parent) - : CollectionEditor<Person>(m),collection_(parent) -{ - -} - -WindowsContactEditor::~WindowsContactEditor() -{ - -} - -bool -WindowsContactEditor::save(const Person *item) -{ - QFile file(QStandardPaths::writableLocation - (QStandardPaths::HomeLocation) + "/Contacts/" - + item->formattedName() + ".contact"); - if (!file.open(QIODevice::ReadWrite)) { - file.close(); - qDebug() << "Cannot open contact file"; - return false; - } - - QDomDocument doc; - doc.setContent(&file); - - auto root = doc.elementsByTagName("c:contact").at(0); - auto nodes = doc.elementsByTagName("c:PhoneNumberCollection"); - - //if PhoneNumberCollection already exists - QVector<QString> nodeNumberVector; - if (nodes.length()) { - auto phoneNumberCollection = nodes.at(0); - auto phoneNumbers = doc.elementsByTagName("c:Number"); - auto virtualPhoneNumber = item->phoneNumbers(); - for (int i = 0; i < phoneNumbers.length(); i++) { - auto node = phoneNumbers.at(i).toElement(); - nodeNumberVector.append(node.text()); - } - for (auto elem : virtualPhoneNumber) { - if (not nodeNumberVector.contains(elem->uri())) { - auto phoneNumber = doc.createElement("c:PhoneNumber"); - phoneNumberCollection.appendChild(phoneNumber); - phoneNumber.setAttribute("c:ElementID", Utils::GenGUID()); - auto numberNode = doc.createElement("c:Number"); - phoneNumber.appendChild(numberNode); - auto numberValue = doc.createTextNode(elem->uri()); - numberNode.appendChild(numberValue); - } - } - } else { - auto phoneNumberCollection = doc.createElement("c:PhoneNumberCollection"); - root.appendChild(phoneNumberCollection); - auto phoneNumber = doc.createElement("c:PhoneNumber"); - phoneNumberCollection.appendChild(phoneNumber); - phoneNumber.setAttribute("c:ElementID", Utils::GenGUID()); - auto numberNode = doc.createElement("c:Number"); - phoneNumber.appendChild(numberNode); - auto numberValue = doc.createTextNode(item->phoneNumbers().at(0)->uri()); - numberNode.appendChild(numberValue); - } - file.resize(0); - file.write(doc.toByteArray()); - file.close(); - return true; -} - -bool -WindowsContactEditor::remove(const Person *item) -{ - items_.removeOne(const_cast<Person*>(item)); - mediator()->removeItem(item); - return true; -} - -bool -WindowsContactEditor::edit(Person *item) -{ - Q_UNUSED(item) - return false; -} - -bool -WindowsContactEditor::addNew(Person *item) -{ - QDomDocument doc; - QFile file(QStandardPaths::writableLocation - (QStandardPaths::HomeLocation) + "/Contacts/" - + item->formattedName()+".contact"); - if (file.exists()) - return false; - if (!file.open(QIODevice::ReadWrite)) { - file.close(); - qDebug() << "Cannot create contact file"; - return false; - } - doc.appendChild( - doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"utf-8\"")); - - //Create root - auto root = doc.createElement("c:contact"); - root.setAttribute("c:Version", "1"); - root.setAttribute("xmlns:c", "http://schemas.microsoft.com/Contact"); - root.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); - root.setAttribute("xmlns:MSP2P","http://schemas.microsoft.com/Contact/Extended/MSP2P"); - doc.appendChild(root); - - auto date = Utils::GetISODate(); - - //Create creation date - auto creationDateNode = doc.createElement("c:CreationDate"); - auto creationDateValue = doc.createTextNode(date); - creationDateNode.appendChild(creationDateValue); - root.appendChild(creationDateNode); - - //Create extended node - auto extendedNode = doc.createElement("c:Extended"); - extendedNode.setAttribute("xsi:nil", "true"); - root.appendChild(extendedNode); - - //Create contactID collection - auto contactIDCol = doc.createElement("c:ContactIDCollection"); - root.appendChild(contactIDCol); - auto contactID = doc.createElement("c:ContactID"); - contactID.setAttribute("c:ElementID", Utils::GenGUID()); - auto contactValue = doc.createElement("c:Value"); - auto value = doc.createTextNode(item->uid()); - contactValue.appendChild(value); - contactID.appendChild(contactValue); - contactIDCol.appendChild(contactID); - - //Create NameCollection - auto nameCollection = doc.createElement("c:NameCollection"); - root.appendChild(nameCollection); - auto name = doc.createElement("c:Name"); - nameCollection.appendChild(name); - name.setAttribute("c:ElementID", Utils::GenGUID()); - auto formattedName = doc.createElement("c:FormattedName"); - name.appendChild(formattedName); - auto formattedNameValue = doc.createTextNode(item->formattedName()); - formattedName.appendChild(formattedNameValue); - - //Create PhoneNumberCollection - auto phoneNumberCollection = doc.createElement("c:PhoneNumberCollection"); - root.appendChild(phoneNumberCollection); - auto phoneNumber = doc.createElement("c:PhoneNumber"); - phoneNumberCollection.appendChild(phoneNumber); - phoneNumber.setAttribute("c:ElementID", Utils::GenGUID()); - auto numberNode = doc.createElement("c:Number"); - phoneNumber.appendChild(numberNode); - auto numberValue = doc.createTextNode(item->phoneNumbers().at(0)->uri()); - numberNode.appendChild(numberValue); - - //Write to file - file.write(doc.toByteArray()); - file.close(); - - return true; -} - -bool -WindowsContactEditor::addExisting(const Person *item) -{ - items_ << const_cast<Person*>(item); - mediator()->addItem(item); - return true; -} - -QVector<Person*> -WindowsContactEditor::items() const -{ - return items_; -} - -WindowsContactBackend::WindowsContactBackend(CollectionMediator<Person>* mediator, - CollectionInterface* parent) - : CollectionInterface(new WindowsContactEditor(mediator,this), parent) - , mediator_(mediator), watcher_(new QFileSystemWatcher()) -{ - -} - -WindowsContactBackend::~WindowsContactBackend() -{ - delete watcher_; -} - -bool -WindowsContactBackend::load() -{ - QtConcurrent::run(this, &WindowsContactBackend::loadRun); - watcher_->addPath(QStandardPaths::writableLocation - (QStandardPaths::HomeLocation) + "/Contacts"); - - QObject::connect(watcher_, &QFileSystemWatcher::directoryChanged, [=](QString path) { - Q_UNUSED(path) - QtConcurrent::run(this, &WindowsContactBackend::loadRun); - }); - return true; -} - -bool -WindowsContactBackend::loadRun() -{ - QDir contactDir(QStandardPaths::writableLocation - (QStandardPaths::HomeLocation) + "/Contacts"); - QStringList filesList = contactDir.entryList(QStringList("*.contact")); - auto ret = true; - for(auto contactFileName : filesList) { - if (not getPersonFromContactFile(contactDir, contactFileName)) - ret = false; - } - return ret; -} - -bool -WindowsContactBackend::getPersonFromContactFile(const QDir& contactDir, - const QString &contactFileName) -{ - QString contactFilePath - (contactDir.absolutePath() + "/" + contactFileName); - QFile contactFile(contactFilePath); - if (contactFile.open(QIODevice::ReadOnly)) { - QXmlStreamReader reader; - Person* p = new Person(this); - QVector<ContactMethod*> contactMethod; - reader.setDevice(&contactFile); - while (!reader.atEnd()) { - reader.readNext(); - if (reader.isStartElement()) { - QString name = reader.name().toString(); - if (name == "FormattedName") - p->setFormattedName(reader.readElementText()); - else if (name == "NickName") - p->setNickName(reader.readElementText()); - else if (name == "GivenName") - p->setFirstName(reader.readElementText()); - else if (name == "FamilyName") - p->setFamilyName(reader.readElementText()); - else if (name == "Company") - p->setOrganization(reader.readElementText()); - else if (name == "Department") - p->setDepartment(reader.readElementText()); - else if (name == "Number") { - QString number = reader.readElementText(); - if (not number.isEmpty()) { - ContactMethod *contact = - PhoneDirectoryModel::instance().getNumber(number,p); - contactMethod.append(contact); - } - } else if (name == "ContactID") { - while (reader.name().toString() != "Value") - reader.readNext(); - p->setUid(reader.readElementText().toUtf8()); - } - else if (name == "Photo") { - //FIXME: It seems to be possible to have multiple photo... - reader.readNext(); - if (reader.name().toString() == "Url") { - QString photoValue = reader.readElementText(); - QImage photo; - photo.load(photoValue); - if (not photo.isNull()) - p->setPhoto(Utils::getCirclePhoto(photo, sizePhoto_)); - } - } - else if (name == "EmailAddress") { - QString address; - bool isPreferred = false; - reader.readNext(); - while (reader.name().toString() != "EmailAddress" - && !reader.atEnd()) { - if (reader.isStartElement()) { - QString tag = reader.name().toString(); - if (tag == "Address") - address = reader.readElementText(); - else if (tag == "Label") - if (reader.readElementText() == "Preferred") - isPreferred = true; - } - reader.readNext(); - } - if (isPreferred) - p->setPreferredEmail(address); - } - } - } - if (reader.hasError()) { - qDebug() << reader.errorString(); - contactFile.close(); - return false; - } else { - Person* existing = PersonModel::instance().getPersonByUid(p->uid()); - if (existing) { - if (contactMethod.size() > 0) - existing->setContactMethods ( contactMethod ); - existing->setNickName ( p->nickName() ); - existing->setFirstName ( p->firstName() ); - existing->setFamilyName ( p->secondName() ); - existing->setFormattedName ( p->formattedName() ); - existing->setOrganization ( p->organization() ); - existing->setPreferredEmail ( p->preferredEmail() ); - existing->setGroup ( p->group() ); - existing->setDepartment ( p->department() ); - existing->setPhoto ( p->photo() ); - delete p; - } else { - p->setContactMethods(contactMethod); - editor<Person>()->addExisting(p); - } - return true; - } - } else { - qDebug() << "Error Opening contact file : " << contactFileName; - return false; - } -} - -bool -WindowsContactBackend::reload() -{ - return false; -} - -bool -WindowsContactBackend::clear() -{ - return false; -} - -QString -WindowsContactBackend::name() const -{ - return "Windows Contact Backend"; -} - -QString -WindowsContactBackend::category() const -{ - return "Contacts"; -} - -bool -WindowsContactBackend::isEnabled() const -{ - return true; -} - -QByteArray -WindowsContactBackend::id() const -{ - return "wincb"; -} - -FlagPack<CollectionInterface::SupportedFeatures> WindowsContactBackend::supportedFeatures() const -{ - return ( - CollectionInterface::SupportedFeatures::NONE | - CollectionInterface::SupportedFeatures::LOAD | - CollectionInterface::SupportedFeatures::SAVE | - CollectionInterface::SupportedFeatures::REMOVE | - CollectionInterface::SupportedFeatures::ADD); -} diff --git a/windowscontactbackend.h b/windowscontactbackend.h deleted file mode 100644 index 5f9916882ff0b4fc8d17085a88ec8b8887bcdb6d..0000000000000000000000000000000000000000 --- a/windowscontactbackend.h +++ /dev/null @@ -1,77 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2015-2017 by Savoir-faire Linux * - * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>* - * * - * 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 <http://www.gnu.org/licenses/>. * - **************************************************************************/ - -#pragma once - -#include <QObject> -#include <QStandardPaths> -#include <QDir> -#include <QXmlStreamReader> -#include <QtConcurrent/QtConcurrent> -#include <QImage> -#include <QFileSystemWatcher> - -#include "person.h" -#include "collectioninterface.h" -#include "contactmethod.h" -#include "phonedirectorymodel.h" - -class WindowsContactBackend : public CollectionInterface -{ -public: - explicit WindowsContactBackend(CollectionMediator<Person>* mediator, CollectionInterface* parent = nullptr); - virtual ~WindowsContactBackend(); - - virtual bool load() override; - virtual bool reload() override; - virtual bool clear() override; - virtual QString name () const override; - virtual QString category () const override; - virtual bool isEnabled() const override; - virtual QByteArray id () const override; - virtual FlagPack<CollectionInterface::SupportedFeatures> supportedFeatures() const override; - -private: - bool loadRun(); -private: - CollectionMediator<Person>* mediator_; - constexpr static int sizePhoto_ = 50; - QFileSystemWatcher* watcher_; - -private: - bool getPersonFromContactFile(const QDir &contactDir, const QString& contactFileName); -}; - -class WindowsContactEditor : public CollectionEditor<Person> -{ -public: - WindowsContactEditor(CollectionMediator<Person>* m, WindowsContactBackend* parent); - ~WindowsContactEditor(); - virtual bool save ( const Person* item ) override; - virtual bool remove ( const Person* item ) override; - virtual bool edit ( Person* item ) override; - virtual bool addNew ( Person* item ) override; - virtual bool addExisting( const Person* item ) override; - -private: - virtual QVector<Person*> items() const override; - - QVector<Person*> items_; - WindowsContactBackend* collection_; -}; -