diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 085258e..00587e5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,514 +1,515 @@ add_definitions(-DTRANSLATION_DOMAIN=\"libmailcommon\") #add_definitions( -DQT_NO_CAST_FROM_ASCII ) #add_definitions( -DQT_NO_CAST_TO_ASCII ) if(BUILD_TESTING) add_definitions(-DBUILD_TESTING) endif() set(libmailcommon_filter_SRCS filter/kmfilteraccountlist.cpp filter/kmfilterlistbox.cpp filter/filterselectiondialog.cpp filter/filterconverter/filterconverttosieve.cpp filter/filterconverter/filterconverttosieveresultdialog.cpp filter/filterconverter/filterconverttosievepurposemenuwidget.cpp filter/filteractions/filteraction.cpp filter/filteractions/filteractionaddheader.cpp filter/filteractions/filteractionaddtag.cpp filter/filteractions/filteractionaddtoaddressbook.cpp filter/filteractions/filteractioncopy.cpp filter/filteractions/filteractiondecrypt.cpp filter/filteractions/filteractiondelete.cpp filter/filteractions/filteractiondict.cpp filter/filteractions/filteractionencrypt.cpp filter/filteractions/filteractionexec.cpp filter/filteractions/filteractionforward.cpp filter/filteractions/filteractionmove.cpp filter/filteractions/filteractionpipethrough.cpp filter/filteractions/filteractionplaysound.cpp filter/filteractions/filteractionredirect.cpp filter/filteractions/filteractionremoveheader.cpp filter/filteractions/filteractionreplyto.cpp filter/filteractions/filteractionrewriteheader.cpp filter/filteractions/filteractionsendfakedisposition.cpp filter/filteractions/filteractionsendreceipt.cpp filter/filteractions/filteractionsetidentity.cpp filter/filteractions/filteractionsetstatus.cpp filter/filteractions/filteractionstatus.cpp filter/filteractions/filteractionunsetstatus.cpp filter/filteractions/filteractionsettransport.cpp filter/filteractions/filteractionwidget.cpp filter/filteractions/filteractionwithaddress.cpp filter/filteractions/filteractionwithcommand.cpp filter/filteractions/filteractionwithcrypto.cpp filter/filteractions/filteractionwithfolder.cpp filter/filteractions/filteractionwithnone.cpp filter/filteractions/filteractionwithstring.cpp filter/filteractions/filteractionwithstringlist.cpp filter/filteractions/filteractionwithtest.cpp filter/filteractions/filteractionwithuoid.cpp filter/filteractions/filteractionwithurl.cpp filter/filterimporterexporter.cpp filter/filterimporter/filterimporterabstract.cpp filter/filterimporter/filterimporterevolution.cpp filter/filterimporter/filterimportersylpheed.cpp filter/filterimporter/filterimporterthunderbird.cpp filter/filterimporter/filterimporterprocmail.cpp filter/filterimporter/filterimporterbalsa.cpp filter/filterimporter/filterimporterclawsmail.cpp filter/filterimporter/filterimportergmail.cpp filter/filterlog.cpp filter/filtermanager.cpp filter/itemcontext.cpp filter/kmfilterdialog.cpp filter/mailfilter.cpp filter/mdnadvicedialog.cpp filter/filterimporterpathcache.cpp ) set(libmailcommon_filter_dialog filter/dialog/selectthunderbirdfilterfilesdialog.cpp filter/dialog/selectthunderbirdfilterfileswidget.cpp filter/dialog/filteractionmissingfolderdialog.cpp filter/dialog/filteractionmissingsoundurldialog.cpp filter/dialog/filteractionmissingtagdialog.cpp filter/dialog/filteractionmissingaccountdialog.cpp filter/dialog/filteractionmissingtemplatedialog.cpp filter/dialog/filteractionmissingtransportdialog.cpp filter/dialog/filteractionmissingidentitydialog.cpp ) set(libmailcommon_invalidfilters filter/invalidfilters/invalidfilterdialog.cpp filter/invalidfilters/invalidfilterlistview.cpp filter/invalidfilters/invalidfilterwidget.cpp filter/invalidfilters/invalidfilterinfo.cpp filter/invalidfilters/invalidfilterlistitemdelegate.cpp filter/invalidfilters/invalidfilterlistmodel.cpp filter/invalidfilters/invalidfilterinfowidget.cpp ) set(libmailcommon_collection_SRCS collectionpage/attributeregistrar.cpp collectionpage/collectiongeneralpage.cpp collectionpage/collectionexpirypage.cpp collectionpage/attributes/expirecollectionattribute.cpp ) set(libmailcommon_folder_SRCS folder/foldersettings.cpp folder/foldercollectionmonitor.cpp folder/folderrequester.cpp folder/folderselectiondialog.cpp folder/foldertreeview.cpp folder/foldertreewidget.cpp folder/foldertreewidgetproxymodel.cpp folder/entitycollectionorderproxymodel.cpp folder/accountconfigorderdialog.cpp folder/favoritecollectionorderproxymodel.cpp ) set(libmailcommon_job_SRCS job/jobscheduler.cpp job/folderjob.cpp job/expirejob.cpp job/backupjob.cpp ) set(libmailcommon_search_SRCS search/widgethandler/rulewidgethandlermanager.cpp search/searchpattern.cpp search/searchpatternedit.cpp search/widgethandler/encryptionwidgethandler.cpp search/widgethandler/textrulerwidgethandler.cpp search/widgethandler/statusrulewidgethandler.cpp search/widgethandler/messagerulewidgethandler.cpp search/widgethandler/tagrulewidgethandler.cpp search/widgethandler/numericrulewidgethandler.cpp search/widgethandler/daterulewidgethandler.cpp search/widgethandler/numericdoublerulewidgethandler.cpp search/widgethandler/headersrulerwidgethandler.cpp search/searchrule/searchrulenumerical.cpp search/searchrule/searchruledate.cpp search/searchrule/searchrulestring.cpp search/searchrule/searchrulestatus.cpp search/searchrule/searchruleencryption.cpp search/searchrule/searchrule.cpp ) set(libmailcommon_snippets_SRCS snippets/snippetdialog.cpp snippets/snippetsmanager.cpp snippets/snippetsmodel.cpp snippets/snippetvariabledialog.cpp snippets/snippettreeview.cpp snippets/snippetwidget.cpp snippets/snippetattachmentwidget.cpp snippets/snippetselectattachmentwidget.cpp snippets/snippetselectattachmentdialog.cpp snippets/snippetcustomfileattachmentnamewidget.cpp snippets/snippetcustomfileattachmentnamedialog.cpp ) set(libmailcommon_tag_SRCS tag/tagwidget.cpp tag/tag.cpp tag/addtagdialog.cpp ) set(libmailcommon_widget_SRCS widgets/redirectdialog.cpp widgets/redirectwidget.cpp widgets/favoritecollectionwidget.cpp ) set(libmailcommon_mdn_SRCS mdn/sendmdnhandler.cpp mdn/mdnstateattribute.cpp ) set(libmailcommon_util_SRCS util/cryptoutils.cpp util/mailutil.cpp util/resourcereadconfigfile.cpp ) set(libmailcommon_SRCS kernel/mailkernel.cpp ${libmailcommon_filter_dialog} ${libmailcommon_util_SRCS} ${libmailcommon_mdn_SRCS} ${libmailcommon_invalidfilters} ${libmailcommon_widget_SRCS} ${libmailcommon_tag_SRCS} ${libmailcommon_snippets_SRCS} ${libmailcommon_search_SRCS} ${libmailcommon_job_SRCS} ${libmailcommon_collection_SRCS} ${libmailcommon_folder_SRCS} ${libmailcommon_filter_SRCS} ) kconfig_add_kcfg_files(libmailcommon_SRCS settings/mailcommonsettings_base.kcfgc ) ecm_qt_declare_logging_category(libmailcommon_SRCS HEADER mailcommon_debug.h IDENTIFIER MAILCOMMON_LOG CATEGORY_NAME org.kde.pim.mailcommon OLD_CATEGORY_NAMES log_mailcommon DESCRIPTION "mailcommon (mailcommon)" EXPORT MAILCOMMON) set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/dbusinterfaces/org.freedesktop.Akonadi.MailFilterAgent.xml PROPERTIES INCLUDE "dbusoperators.h") qt5_add_dbus_interfaces(libmailcommon_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/dbusinterfaces/org.freedesktop.Akonadi.MailFilterAgent.xml ) ki18n_wrap_ui(libmailcommon_SRCS filter/ui/filterconfigwidget.ui snippets/ui/snippetwidget.ui filter/ui/selectthunderbirdfilterfileswidget.ui) set(libmailcommon_SRCS ${libmailcommon_SRCS} filter/soundtestwidget.cpp) macro(add_resource_iface _kcfgFile _ifaceName _className) kcfg_generate_dbus_interface(${CMAKE_CURRENT_SOURCE_DIR}/${_kcfgFile} ${_ifaceName}) string(TOLOWER ${_className} _codeFile) qt5_add_dbus_interface(libmailcommon_SRCS ${CMAKE_CURRENT_BINARY_DIR}/${_ifaceName}.xml ${_codeFile} ${_className} ) endmacro() add_resource_iface(settings.kcfg org.kde.Akonadi.POP3.Settings Pop3Settings) qt5_add_dbus_interfaces(libmailcommon_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/dbusinterfaces/org.kde.Korganizer.Calendar.xml ) add_library(KF5MailCommon ${libmailcommon_SRCS}) generate_export_header(KF5MailCommon BASE_NAME mailcommon) add_library(KF5::MailCommon ALIAS KF5MailCommon) target_link_libraries(KF5MailCommon PUBLIC KF5::AkonadiCore KF5::AkonadiMime KF5::Libkdepim KF5::MessageComposer KF5::PimCommonAkonadi KF5::Completion PRIVATE + KF5::AkonadiWidgets KF5::TextWidgets KF5::I18n KF5::LibkdepimAkonadi KF5::MessageViewer KF5::MailImporter KF5::MessageCore KF5::TemplateParser KF5::Mime KF5::Codecs KF5::MailTransport Phonon::phonon4qt5 KF5::XmlGui KF5::KIOWidgets KF5::IconThemes KF5::Archive KF5::ItemViews KF5::SyntaxHighlighting Qt5::Xml ) target_include_directories(KF5MailCommon INTERFACE "$") target_include_directories(KF5MailCommon PUBLIC "$") set_target_properties(KF5MailCommon PROPERTIES VERSION ${MAILCOMMON_VERSION_STRING} SOVERSION ${MAILCOMMON_SOVERSION} EXPORT_NAME MailCommon ) install(TARGETS KF5MailCommon EXPORT KF5MailCommonTargets ${KF5_INSTALL_TARGETS_DEFAULT_ARGS} ${LIBRARY_NAMELINK} ) if (BUILD_TESTING) add_subdirectory(filter/filterimporter/autotests) add_subdirectory(collectionpage/autotests) add_subdirectory(filter/autotests) add_subdirectory(snippets/autotests) add_subdirectory(filter/tests) add_subdirectory(search/autotests) add_subdirectory(mdn/autotests/) endif() ecm_generate_headers(MailCommon_CamelCase_HEADERS HEADER_NAMES CryptoUtils MailUtil ResourceReadConfigFile REQUIRED_HEADERS MailCommon_HEADERS PREFIX MailCommon RELATIVE util ) ecm_generate_headers(MailCommon_Camelcasetop_HEADERS HEADER_NAMES DBusOperators REQUIRED_HEADERS MailCommon_top_HEADERS PREFIX MailCommon ) ecm_generate_headers(MailCommon_Camelcasetag_HEADERS HEADER_NAMES TagWidget Tag AddTagDialog REQUIRED_HEADERS MailCommon_tag_HEADERS PREFIX MailCommon RELATIVE tag ) ecm_generate_headers(MailCommon_Camelcasefolder_HEADERS HEADER_NAMES FolderSettings FolderRequester FolderCollectionMonitor AccountConfigOrderDialog FolderTreeView FolderTreeWidget FolderSelectionDialog FolderTreeWidgetProxyModel FavoriteCollectionOrderProxyModel REQUIRED_HEADERS MailCommon_folder_HEADERS PREFIX MailCommon RELATIVE folder ) ecm_generate_headers(MailCommon_Camelcasekernel_HEADERS HEADER_NAMES MailKernel REQUIRED_HEADERS MailCommon_kernel_HEADERS PREFIX MailCommon RELATIVE kernel ) ecm_generate_headers(MailCommon_Camelcaseinterfaces_HEADERS HEADER_NAMES MailInterfaces REQUIRED_HEADERS MailCommon_interfaces_HEADERS PREFIX MailCommon RELATIVE interfaces ) ecm_generate_headers(MailCommon_Camelcasefilter_HEADERS HEADER_NAMES FilterLog MailFilter FilterImporterExporter FilterManager KMFilterDialog FilterImporterPathCache ItemContext REQUIRED_HEADERS MailCommon_filter_HEADERS PREFIX MailCommon RELATIVE filter ) ecm_generate_headers(MailCommon_Camelcasejob_HEADERS HEADER_NAMES BackupJob JobScheduler FolderJob REQUIRED_HEADERS MailCommon_job_HEADERS PREFIX MailCommon RELATIVE job ) ecm_generate_headers(MailCommon_Camelcasefilteraction_HEADERS HEADER_NAMES FilterAction FilterActionDict REQUIRED_HEADERS MailCommon_filteraction_HEADERS PREFIX MailCommon RELATIVE filter/filteractions/ ) ecm_generate_headers(MailCommon_Camelcasemdn_HEADERS HEADER_NAMES SendMdnHandler MDNStateAttribute REQUIRED_HEADERS MailCommon_mdn_HEADERS PREFIX MailCommon RELATIVE mdn ) ecm_generate_headers(MailCommon_Camelcasecollectionpage_HEADERS HEADER_NAMES CollectionGeneralPage CollectionExpiryPage REQUIRED_HEADERS MailCommon_collectionpage_HEADERS PREFIX MailCommon RELATIVE collectionpage ) ecm_generate_headers(MailCommon_Camelcasecollectionpageattributes_HEADERS HEADER_NAMES ExpireCollectionAttribute REQUIRED_HEADERS MailCommon_collectionpageattributes_HEADERS PREFIX MailCommon RELATIVE collectionpage/attributes ) ecm_generate_headers(MailCommon_Camelcasefilterimporter_HEADERS HEADER_NAMES FilterImporterBalsa FilterImporterClawsMail FilterImporterAbstract REQUIRED_HEADERS MailCommon_filterimporter_HEADERS PREFIX MailCommon RELATIVE filter/filterimporter/ ) ecm_generate_headers(MailCommon_Camelcasesnippets_HEADERS HEADER_NAMES SnippetsManager SnippetTreeView SnippetsModel SnippetWidget REQUIRED_HEADERS MailCommon_snippets_HEADERS PREFIX MailCommon RELATIVE snippets ) ecm_generate_headers(MailCommon_Camelcasekernel_HEADERS HEADER_NAMES SearchPattern SearchPatternEdit REQUIRED_HEADERS MailCommon_kernel_HEADERS PREFIX MailCommon RELATIVE search ) ecm_generate_headers(MailCommon_Camelcasewidgets_HEADERS HEADER_NAMES RedirectDialog FavoriteCollectionWidget REQUIRED_HEADERS MailCommon_widgets_HEADERS PREFIX MailCommon RELATIVE widgets ) ecm_generate_headers(MailCommon_Camelcasesearchrule_HEADERS HEADER_NAMES SearchRule SearchRuleStatus REQUIRED_HEADERS MailCommon_searchrule_HEADERS PREFIX MailCommon RELATIVE search/searchrule ) ecm_generate_pri_file(BASE_NAME MailCommon LIB_NAME KF5MailCommon DEPS "AkonadiCore AkonadiMime MessageComposer PimCommon" FILENAME_VAR PRI_FILENAME INCLUDE_INSTALL_DIR ${KDE_INSTALL_INCLUDEDIR_KF5}/MailCommon ) install(FILES ${MailCommon_Camelcasesearchrule_HEADERS} ${MailCommon_CamelCase_HEADERS} ${MailCommon_Camelcasetop_HEADERS} ${MailCommon_Camelcasetag_HEADERS} ${MailCommon_Camelcasefolder_HEADERS} ${MailCommon_Camelcasekernel_HEADERS} ${MailCommon_Camelcaseinterfaces_HEADERS} ${MailCommon_Camelcasefilter_HEADERS} ${MailCommon_Camelcasejob_HEADERS} ${MailCommon_Camelcasefilteraction_HEADERS} ${MailCommon_Camelcasemdn_HEADERS} ${MailCommon_Camelcasecollectionpage_HEADERS} ${MailCommon_Camelcasecollectionpageattributes_HEADERS} ${MailCommon_Camelcasefilterimporter_HEADERS} ${MailCommon_Camelcasesnippets_HEADERS} ${MailCommon_Camelcasewidgets_HEADERS} DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/MailCommon COMPONENT Devel ) install(FILES ${MailCommon_searchrule_HEADERS} ${CMAKE_CURRENT_BINARY_DIR}/mailcommon_export.h ${CMAKE_CURRENT_BINARY_DIR}/pop3settings.h ${CMAKE_CURRENT_BINARY_DIR}/mailcommonsettings_base.h ${MailCommon_HEADERS} ${MailCommon_top_HEADERS} ${MailCommon_tag_HEADERS} ${MailCommon_folder_HEADERS} ${MailCommon_kernel_HEADERS} ${MailCommon_interfaces_HEADERS} ${MailCommon_filter_HEADERS} ${MailCommon_job_HEADERS} ${MailCommon_filteraction_HEADERS} ${MailCommon_mdn_HEADERS} ${MailCommon_collectionpage_HEADERS} ${MailCommon_collectionpageattributes_HEADERS} ${MailCommon_filterimporter_HEADERS} ${MailCommon_snippets_HEADERS} ${MailCommon_widgets_HEADERS} DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/mailcommon COMPONENT Devel ) install(FILES ${PRI_FILENAME} DESTINATION ${ECM_MKSPECS_INSTALL_DIR}) if(BUILD_DESIGNERPLUGIN) add_subdirectory(designer) endif() ecm_qt_install_logging_categories(EXPORT MAILCOMMON FILE mailcommon.categories DESTINATION ${KDE_INSTALL_LOGGINGCATEGORIESDIR}) diff --git a/src/filter/autotests/filteractionaddtoaddressbooktest.cpp b/src/filter/autotests/filteractionaddtoaddressbooktest.cpp index 818abe3..63ef46a 100644 --- a/src/filter/autotests/filteractionaddtoaddressbooktest.cpp +++ b/src/filter/autotests/filteractionaddtoaddressbooktest.cpp @@ -1,96 +1,97 @@ /* Copyright (c) 2015-2020 Laurent Montel This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License, version 2, as published by the Free Software Foundation. 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "filteractionaddtoaddressbooktest.h" #include "../filteractions/filteractionaddtoaddressbook.h" #include #include #include #include #include -#include + #include +#include FilterActionAddToAddressBookTest::FilterActionAddToAddressBookTest(QObject *parent) : QObject(parent) { } FilterActionAddToAddressBookTest::~FilterActionAddToAddressBookTest() { } void FilterActionAddToAddressBookTest::shouldHaveDefaultValue() { MailCommon::FilterActionAddToAddressBook filter; QWidget *w = filter.createParamWidget(nullptr); auto headerCombo = w->findChild(QStringLiteral("HeaderComboBox")); QVERIFY(headerCombo); QLabel *label = w->findChild(QStringLiteral("label_with_category")); QVERIFY(label); - KPIM::TagWidget *categoryEdit = w->findChild(QStringLiteral("CategoryEdit")); + auto categoryEdit = w->findChild(QStringLiteral("CategoryEdit")); QVERIFY(categoryEdit); label = w->findChild(QStringLiteral("label_in_addressbook")); QVERIFY(label); Akonadi::CollectionComboBox *collectionComboBox = w->findChild(QStringLiteral("AddressBookComboBox")); QVERIFY(collectionComboBox); } void FilterActionAddToAddressBookTest::shouldReportErrorWhenArgumentIsEmpty() { MailCommon::FilterActionAddToAddressBook filter; KMime::Message::Ptr msgPtr = KMime::Message::Ptr(new KMime::Message()); Akonadi::Item item; item.setPayload(msgPtr); MailCommon::ItemContext context(item, false); filter.argsFromString(QString()); QVERIFY(filter.isEmpty()); QCOMPARE(filter.process(context, false), MailCommon::FilterAction::ErrorButGoOn); QCOMPARE(context.needsPayloadStore(), false); QCOMPARE(context.needsFlagStore(), false); QCOMPARE(context.needsFullPayload(), false); } void FilterActionAddToAddressBookTest::shouldReportErrorWhenCollectionIsInvalid() { MailCommon::FilterActionAddToAddressBook filter; KMime::Message::Ptr msgPtr = KMime::Message::Ptr(new KMime::Message()); Akonadi::Item item; item.setPayload(msgPtr); MailCommon::ItemContext context(item, false); filter.argsFromString(QStringLiteral("foo\t-1\tddd")); QVERIFY(filter.isEmpty()); QCOMPARE(filter.process(context, false), MailCommon::FilterAction::ErrorButGoOn); QCOMPARE(context.needsPayloadStore(), false); QCOMPARE(context.needsFlagStore(), false); QCOMPARE(context.needsFullPayload(), false); } void FilterActionAddToAddressBookTest::shouldRequiresPart() { MailCommon::FilterActionAddToAddressBook filter; QCOMPARE(filter.requiredPart(), MailCommon::SearchRule::Envelope); } QTEST_MAIN(FilterActionAddToAddressBookTest) diff --git a/src/filter/filteractions/filteractionaddtoaddressbook.cpp b/src/filter/filteractions/filteractionaddtoaddressbook.cpp index 3f6ab9b..a2eac0d 100644 --- a/src/filter/filteractions/filteractionaddtoaddressbook.cpp +++ b/src/filter/filteractions/filteractionaddtoaddressbook.cpp @@ -1,285 +1,308 @@ /* * Copyright (c) 1996-1998 Stefan Taferner * * 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 2 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "filteractionaddtoaddressbook.h" #include -#include + +#include +#include #include #include #include #include #include #include #include using namespace MailCommon; FilterAction *FilterActionAddToAddressBook::newAction() { return new FilterActionAddToAddressBook; } FilterActionAddToAddressBook::FilterActionAddToAddressBook(QObject *parent) : FilterActionWithStringList(QStringLiteral("add to address book"), i18n("Add to Address Book"), parent) , mFromStr(i18nc("Email sender", "From")) , mToStr(i18nc("Email recipient", "To")) , mCCStr(i18n("CC")) , mBCCStr(i18n("BCC")) , mHeaderType(UnknownHeader) , mCollectionId(-1) , mCategory(i18n("KMail Filter")) { } bool FilterActionAddToAddressBook::isEmpty() const { return (mCollectionId == -1) || (mHeaderType == UnknownHeader); } FilterAction::ReturnCode FilterActionAddToAddressBook::process(ItemContext &context, bool) const { if (isEmpty()) { return ErrorButGoOn; } const KMime::Message::Ptr msg = context.item().payload(); QString headerLine; switch (mHeaderType) { case FromHeader: headerLine = msg->from()->asUnicodeString(); break; case ToHeader: headerLine = msg->to()->asUnicodeString(); break; case CcHeader: headerLine = msg->cc()->asUnicodeString(); break; case BccHeader: headerLine = msg->bcc()->asUnicodeString(); break; case UnknownHeader: break; } if (headerLine.isEmpty()) { return ErrorButGoOn; } const QStringList emails = KEmailAddress::splitAddressList(headerLine); for (const QString &singleEmail : emails) { QString name, email; KContacts::Addressee::parseEmailAddress(singleEmail, name, email); KContacts::Addressee contact; contact.setNameFromString(name); contact.insertEmail(email, true); if (!mCategory.isEmpty()) { contact.setCategories(mCategory.split(QLatin1Char(';'))); } KPIM::AddContactJob *job = new KPIM::AddContactJob(contact, Akonadi::Collection(mCollectionId)); job->showMessageBox(false); job->start(); } return GoOn; } SearchRule::RequiredPart FilterActionAddToAddressBook::requiredPart() const { return SearchRule::Envelope; } QWidget *FilterActionAddToAddressBook::createParamWidget(QWidget *parent) const { QWidget *widget = new QWidget(parent); QGridLayout *layout = new QGridLayout(widget); const auto headerCombo = new KComboBox(widget); headerCombo->setMinimumWidth(50); headerCombo->setObjectName(QStringLiteral("HeaderComboBox")); layout->addWidget(headerCombo, 0, 0, 2, 1, Qt::AlignVCenter); QLabel *label = new QLabel(i18n("with category"), widget); label->setObjectName(QStringLiteral("label_with_category")); layout->addWidget(label, 0, 1); - KPIM::TagWidget *categoryEdit = new KPIM::TagWidget(widget); + auto categoryEdit = new Akonadi::TagWidget(widget); categoryEdit->setObjectName(QStringLiteral("CategoryEdit")); layout->addWidget(categoryEdit, 0, 2); label = new QLabel(i18n("in address book"), widget); label->setObjectName(QStringLiteral("label_in_addressbook")); layout->addWidget(label, 1, 1); Akonadi::CollectionComboBox *collectionComboBox = new Akonadi::CollectionComboBox(widget); collectionComboBox->setMimeTypeFilter(QStringList() << KContacts::Addressee::mimeType()); collectionComboBox->setAccessRightsFilter(Akonadi::Collection::CanCreateItem); collectionComboBox->setObjectName(QStringLiteral("AddressBookComboBox")); collectionComboBox->setToolTip(i18n("This defines the preferred address book.\n" "If it is not accessible, the filter will fallback to the default address book.")); layout->addWidget(collectionComboBox, 1, 2); connect(headerCombo, QOverload::of(&KComboBox::currentIndexChanged), this, &FilterActionAddToAddressBook::filterActionModified); connect(collectionComboBox, QOverload::of(&Akonadi::CollectionComboBox::activated), this, &FilterActionAddToAddressBook::filterActionModified); - connect(categoryEdit, SIGNAL(selectionChanged(QStringList)), - this, SIGNAL(filterActionModified())); + connect(categoryEdit, &Akonadi::TagWidget::selectionChanged, this, &FilterActionAddToAddressBook::filterActionModified); setParamWidgetValue(widget); return widget; } +namespace { + +Akonadi::Tag::List namesToTags(const QStringList &names) +{ + Akonadi::Tag::List tags; + tags.reserve(names.size()); + std::transform(names.cbegin(), names.cend(), std::back_inserter(tags), + [](const QString &name) { return Akonadi::Tag{name}; }); + return tags; +} + +QStringList tagsToNames(const Akonadi::Tag::List &tags) +{ + QStringList names; + names.reserve(tags.size()); + std::transform(tags.cbegin(), tags.cend(), std::back_inserter(names), + std::bind(&Akonadi::Tag::name, std::placeholders::_1)); + return names; +} + +} + void FilterActionAddToAddressBook::setParamWidgetValue(QWidget *paramWidget) const { const auto headerCombo = paramWidget->findChild(QStringLiteral("HeaderComboBox")); Q_ASSERT(headerCombo); headerCombo->clear(); headerCombo->addItem(mFromStr, FromHeader); headerCombo->addItem(mToStr, ToHeader); headerCombo->addItem(mCCStr, CcHeader); headerCombo->addItem(mBCCStr, BccHeader); headerCombo->setCurrentIndex(headerCombo->findData(mHeaderType)); - KPIM::TagWidget *categoryEdit = paramWidget->findChild(QStringLiteral("CategoryEdit")); + auto categoryEdit = paramWidget->findChild(QStringLiteral("CategoryEdit")); Q_ASSERT(categoryEdit); - categoryEdit->setSelection(mCategory.split(QLatin1Char(';'))); + categoryEdit->setSelection(namesToTags(mCategory.split(QLatin1Char(';')))); Akonadi::CollectionComboBox *collectionComboBox = paramWidget->findChild(QStringLiteral("AddressBookComboBox")); Q_ASSERT(collectionComboBox); collectionComboBox->setDefaultCollection(Akonadi::Collection(mCollectionId)); collectionComboBox->setProperty("collectionId", mCollectionId); } void FilterActionAddToAddressBook::applyParamWidgetValue(QWidget *paramWidget) { const auto headerCombo = paramWidget->findChild(QStringLiteral("HeaderComboBox")); Q_ASSERT(headerCombo); mHeaderType = static_cast(headerCombo->itemData(headerCombo->currentIndex()).toInt()); - const KPIM::TagWidget *categoryEdit = paramWidget->findChild(QStringLiteral("CategoryEdit")); + const auto categoryEdit = paramWidget->findChild(QStringLiteral("CategoryEdit")); Q_ASSERT(categoryEdit); - mCategory = categoryEdit->selection().join(QLatin1Char(';')); + mCategory = tagsToNames(categoryEdit->selection()).join(QLatin1Char(';')); const Akonadi::CollectionComboBox *collectionComboBox = paramWidget->findChild(QStringLiteral("AddressBookComboBox")); Q_ASSERT(collectionComboBox); const Akonadi::Collection collection = collectionComboBox->currentCollection(); // it might be that the model of collectionComboBox has not finished loading yet, so // we use the previously 'stored' value from the 'collectionId' property if (collection.isValid()) { mCollectionId = collection.id(); connect(collectionComboBox, QOverload::of(&Akonadi::CollectionComboBox::currentIndexChanged), this, &FilterActionAddToAddressBook::filterActionModified); } else { const QVariant value = collectionComboBox->property("collectionId"); if (value.isValid()) { mCollectionId = value.toLongLong(); } } } void FilterActionAddToAddressBook::clearParamWidget(QWidget *paramWidget) const { const auto headerCombo = paramWidget->findChild(QStringLiteral("HeaderComboBox")); Q_ASSERT(headerCombo); headerCombo->setCurrentIndex(0); - KPIM::TagWidget *categoryEdit = paramWidget->findChild(QStringLiteral("CategoryEdit")); + auto categoryEdit = paramWidget->findChild(QStringLiteral("CategoryEdit")); Q_ASSERT(categoryEdit); - categoryEdit->setSelection(mCategory.split(QLatin1Char(';'))); + categoryEdit->setSelection(namesToTags(mCategory.split(QLatin1Char(';')))); } QString FilterActionAddToAddressBook::argsAsString() const { QString result; switch (mHeaderType) { case FromHeader: result = QStringLiteral("From"); break; case ToHeader: result = QStringLiteral("To"); break; case CcHeader: result = QStringLiteral("CC"); break; case BccHeader: result = QStringLiteral("BCC"); break; case UnknownHeader: break; } result += QLatin1Char('\t'); result += QString::number(mCollectionId); result += QLatin1Char('\t'); result += mCategory; return result; } void FilterActionAddToAddressBook::argsFromString(const QString &argsStr) { #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) const QStringList parts = argsStr.split(QLatin1Char('\t'), QString::KeepEmptyParts); #else const QStringList parts = argsStr.split(QLatin1Char('\t'), Qt::KeepEmptyParts); #endif const QString firstElement = parts[ 0 ]; if (firstElement == QLatin1String("From")) { mHeaderType = FromHeader; } else if (firstElement == QLatin1String("To")) { mHeaderType = ToHeader; } else if (firstElement == QLatin1String("CC")) { mHeaderType = CcHeader; } else if (firstElement == QLatin1String("BCC")) { mHeaderType = BccHeader; } else { mHeaderType = UnknownHeader; } if (parts.count() >= 2) { mCollectionId = parts[ 1 ].toLongLong(); } if (parts.count() < 3) { mCategory.clear(); } else { mCategory = parts[ 2 ]; } } QString FilterActionAddToAddressBook::informationAboutNotValidAction() const { QString result; if (mHeaderType == UnknownHeader) { result = i18n("Header type selected is unknown."); } if (mCollectionId == -1) { if (!result.isEmpty()) { result += QLatin1Char('\n'); } result += i18n("No addressbook selected."); } return result; }