diff --git a/messagecomposer/src/CMakeLists.txt b/messagecomposer/src/CMakeLists.txt index 7cf0d463..90cb13e3 100644 --- a/messagecomposer/src/CMakeLists.txt +++ b/messagecomposer/src/CMakeLists.txt @@ -1,507 +1,513 @@ add_definitions(-DTRANSLATION_DOMAIN=\"libmessagecomposer\") if(BUILD_TESTING) add_subdirectory( imagescaling/autotests ) add_subdirectory( imagescaling/tests ) add_subdirectory( composer-ng/autotests ) add_subdirectory( statusbarwidget/autotests ) add_subdirectory( plugineditor/autotests ) add_subdirectory( composer/autotests ) add_subdirectory( snippet/autotests ) endif() include_directories(${CMAKE_CURRENT_SOURCE_DIR}/part) set( messagecomposer_job_src job/jobbase.cpp job/contentjobbase.cpp job/attachmentjob.cpp job/singlepartjob.cpp job/multipartjob.cpp job/maintextjob.cpp job/signjob.cpp job/encryptjob.cpp job/signencryptjob.cpp job/transparentjob.cpp job/inserttextfilejob.cpp job/skeletonmessagejob.cpp job/aliasesexpandjob.cpp job/emailaddressresolvejob.cpp job/attachmentfrompublickeyjob.cpp job/distributionlistexpandjob.cpp job/savecontactpreferencejob.cpp job/attachmentvcardfromaddressbookjob.cpp job/attachmentclipboardjob.cpp job/protectedheaders.cpp ) set( messagecomposer_statusbarwidget_src statusbarwidget/statusbarlabeltoggledstate.cpp ) set( messagecomposer_composer_src composer/composer.cpp composer/signaturecontroller.cpp composer/composerlineedit.cpp composer/composerviewbase.cpp composer/keyresolver.cpp composer/composerviewinterface.cpp composer/composerattachmentinterface.cpp ) set( messagecomposer_recipient_src recipient/recipientspicker.cpp recipient/recipient.cpp recipient/recipientline.cpp recipient/recipientseditor.cpp recipient/recipientseditorsidewidget.cpp recipient/kwindowpositioner.cpp recipient/distributionlistdialog.cpp ) set( messagecomposer_snippet_src snippet/convertsnippetvariablesjob.cpp snippet/convertsnippetvariablesutil.cpp snippet/convertsnippetvariablemenu.cpp ) set( messagecomposer_imagescaling_src imagescaling/imagescaling.cpp imagescaling/imagescalingwidget.cpp imagescaling/imagescalingutils.cpp imagescaling/imagescalingselectformat.cpp ) set( messagecomposer_part_src part/messagepart.cpp part/globalpart.cpp part/infopart.cpp part/textpart.cpp ) set( messagecomposer_attachment_src attachment/attachmentcontrollerbase.cpp attachment/attachmentmodel.cpp ) set( messagecomposer_helper_src helper/messagehelper.cpp helper/messagefactoryng.cpp helper/messagefactoryforwardjob.cpp helper/messagefactoryreplyjob.cpp ) set( messagecomposer_sender_src sender/akonadisender.cpp ) set(messagecomposer_followupreminder_SRCS followupreminder/followupreminderselectdatedialog.cpp followupreminder/followupremindercreatejob.cpp + followupreminder/followupreminder.cpp + ) + +qt5_add_dbus_interface(messagecomposer_followupreminder_SRCS + followupreminder/org.freedesktop.Akonadi.FollowUpReminder.xml + followupreminderinterface ) set(messagecomposer_richtextcomposerng_SRCS composer-ng/richtextcomposerng.cpp composer-ng/richtextcomposersignatures.cpp ) set(messagecomposer_plugineditor_SRCS plugineditor/plugineditormanager.cpp plugineditor/plugineditor.cpp plugineditor/plugineditorinterface.cpp plugineditor/pluginactiontype.cpp plugineditor/plugincomposerinterface.cpp ) set(messagecomposer_plugineditorcheckbeforesend_SRCS plugineditorcheckbeforesend/plugineditorcheckbeforesend.cpp plugineditorcheckbeforesend/plugineditorcheckbeforesendinterface.cpp plugineditorcheckbeforesend/plugineditorcheckbeforesendmanager.cpp plugineditorcheckbeforesend/plugineditorcheckbeforesendconfigurewidget.cpp plugineditorcheckbeforesend/plugineditorcheckbeforesendparams.cpp ) set(messagecomposer_plugineditorinit_SRCS plugineditorinit/plugineditorinitconfigurewidget.cpp plugineditorinit/plugineditorinit.cpp plugineditorinit/plugineditorinitmanager.cpp plugineditorinit/plugineditorinitinterface.cpp ) set(messagecomposer_plugineditorconverttext_SRCS plugineditorconverttext/plugineditorconverttextconfigurewidget.cpp plugineditorconverttext/plugineditorconverttext.cpp plugineditorconverttext/plugineditorconverttextmanager.cpp plugineditorconverttext/plugineditorconverttextinterface.cpp plugineditorconverttext/plugineditorconverterinitialdata.cpp plugineditorconverttext/plugineditorconverterbeforeconvertingdata.cpp ) set(messagecomposer_plugineditorgrammar_SRCS plugineditorgrammar/plugineditorgrammarmanager.cpp plugineditorgrammar/plugineditorgrammarcustomtoolsviewinterface.cpp ) set( messagecomposer_src ${messagecomposer_snippet_src} ${messagecomposer_statusbarwidget_src} ${messagecomposer_plugineditorconverttext_SRCS} ${messagecomposer_plugineditorinit_SRCS} ${messagecomposer_plugineditor_SRCS} ${messagecomposer_richtextcomposerng_SRCS} ${messagecomposer_part_src} ${messagecomposer_imagescaling_src} ${messagecomposer_job_src} ${messagecomposer_composer_src} ${messagecomposer_recipient_src} ${messagecomposer_attachment_src} ${messagecomposer_helper_src} ${messagecomposer_sender_src} ${messagecomposer_followupreminder_SRCS} ${messagecomposer_plugineditorcheckbeforesend_SRCS} ${messagecomposer_plugineditorgrammar_SRCS} utils/util.cpp settings/messagecomposersettings.cpp ) ki18n_wrap_ui(messagecomposer_src imagescaling/ui/imagescalingwidget.ui ) ecm_qt_declare_logging_category(messagecomposer_src HEADER messagecomposer_debug.h IDENTIFIER MESSAGECOMPOSER_LOG CATEGORY_NAME org.kde.pim.messagecomposer DESCRIPTION "messagelib (messagecomposer)" OLD_CATEGORY_NAMES log_messagecomposer EXPORT MESSAGELIB ) if(KDEPIM_ENTERPRISE_BUILD) set(WARN_TOOMANY_RECIPIENTS_DEFAULT true) set(ALLOW_SEMICOLON_AS_ADDRESS_SEPARATOR_DEFAULT true) else() set(WARN_TOOMANY_RECIPIENTS_DEFAULT false) set(ALLOW_SEMICOLON_AS_ADDRESS_SEPARATOR_DEFAULT false) endif() configure_file(settings/messagecomposer.kcfg.cmake ${CMAKE_CURRENT_BINARY_DIR}/messagecomposer.kcfg) kconfig_add_kcfg_files(messagecomposer_src settings/messagecomposersettings_base.kcfgc ) add_library( KF5MessageComposer ${messagecomposer_src} ) generate_export_header(KF5MessageComposer BASE_NAME messagecomposer) add_library(KF5::MessageComposer ALIAS KF5MessageComposer) target_link_libraries(KF5MessageComposer PUBLIC KF5::Mime KF5::MessageCore KF5::PimCommon KF5::AkonadiCore KF5::IdentityManagement KF5::AkonadiMime KF5::Libkleo KF5::MessageViewer PRIVATE KF5::MailTransportAkonadi KF5::PimTextEdit KF5::TemplateParser KF5::AkonadiWidgets KF5::LibkdepimAkonadi KF5::KIOCore KF5::I18n KF5::KIOWidgets # for KIO::JobUiDelegate KF5::KIOFileWidgets # for KEncodingDialog KF5::XmlGui # for KActionCollection KF5::SonnetUi Grantlee5::TextDocument KF5::CalendarCore # for KCalendarCore/Todo KF5::SendLater - KF5::FollowupReminder KF5::Archive KF5::Contacts KF5::SonnetCore ) target_include_directories(KF5MessageComposer INTERFACE "$") set_target_properties(KF5MessageComposer PROPERTIES VERSION ${MESSAGECOMPOSER_VERSION_STRING} SOVERSION ${MESSAGECOMPOSER_SOVERSION} EXPORT_NAME MessageComposer ) install(TARGETS KF5MessageComposer EXPORT KF5MessageComposerTargets ${KF5_INSTALL_TARGETS_DEFAULT_ARGS} ${LIBRARY_NAMELINK} ) ecm_generate_headers(MessageComposer_Camelstatusbarwidget_HEADERS HEADER_NAMES StatusBarLabelToggledState REQUIRED_HEADERS MessageComposer_statusbarwidget_HEADERS PREFIX MessageComposer RELATIVE statusbarwidget ) ecm_generate_headers(MessageComposer_Camelsnippet_HEADERS HEADER_NAMES ConvertSnippetVariablesJob ConvertSnippetVariablesUtil ConvertSnippetVariableMenu REQUIRED_HEADERS MessageComposer_snippet_HEADERS PREFIX MessageComposer RELATIVE snippet ) ecm_generate_headers(MessageComposer_Camelplugineditor_HEADERS HEADER_NAMES PluginEditor PluginActionType PluginEditorInterface PluginComposerInterface PluginEditorManager REQUIRED_HEADERS MessageComposer_plugineditor_HEADERS PREFIX MessageComposer RELATIVE plugineditor ) ecm_generate_headers(MessageComposer_Camelplugineditorinit_HEADERS HEADER_NAMES PluginEditorInitConfigureWidget PluginEditorInit PluginEditorInitManager PluginEditorInitInterface REQUIRED_HEADERS MessageComposer_plugineditorinit_HEADERS PREFIX MessageComposer RELATIVE plugineditorinit ) ecm_generate_headers(MessageComposer_Camelplugineditorconverttext_HEADERS HEADER_NAMES PluginEditorConvertTextConfigureWidget PluginEditorConvertText PluginEditorConvertTextManager PluginEditorConvertTextInterface PluginEditorConverterInitialData PluginEditorConverterBeforeConvertingData REQUIRED_HEADERS MessageComposer_plugineditorconverttext_HEADERS PREFIX MessageComposer RELATIVE plugineditorconverttext ) ecm_generate_headers(MessageComposer_Camelplugineditorgrammar_HEADERS HEADER_NAMES PluginEditorGrammarManager PluginEditorGrammarCustomToolsViewInterface REQUIRED_HEADERS MessageComposer_plugineditorgrammar_HEADERS PREFIX MessageComposer RELATIVE plugineditorgrammar ) ecm_generate_headers(MessageComposer_Camelplugineditorcheckbeforesend_HEADERS HEADER_NAMES PluginEditorCheckBeforeSend PluginEditorCheckBeforeSendInterface PluginEditorCheckBeforeSendManager PluginEditorCheckBeforeSendConfigureWidget PluginEditorCheckBeforeSendParams REQUIRED_HEADERS MessageComposer_plugineditorcheckbeforesend_HEADERS PREFIX MessageComposer RELATIVE plugineditorcheckbeforesend ) ecm_generate_headers(MessageComposer_Camelcaseattachement_HEADERS HEADER_NAMES AttachmentModel AttachmentControllerBase REQUIRED_HEADERS MessageComposer_attachement_HEADERS PREFIX MessageComposer RELATIVE attachment ) ecm_generate_headers(MessageComposer_Camelcasecomposer_HEADERS HEADER_NAMES Composer ComposerLineEdit ComposerViewBase ComposerViewInterface ComposerAttachmentInterface SignatureController REQUIRED_HEADERS MessageComposer_composer_HEADERS PREFIX MessageComposer RELATIVE composer ) ecm_generate_headers(MessageComposer_Camelcasecomposerng_HEADERS HEADER_NAMES RichTextComposerNg RichTextComposerSignatures REQUIRED_HEADERS MessageComposer_composerng_HEADERS PREFIX MessageComposer RELATIVE composer-ng ) ecm_generate_headers(MessageComposer_Camelcasesender_HEADERS HEADER_NAMES AkonadiSender MessageSender REQUIRED_HEADERS MessageComposer_sender_HEADERS PREFIX MessageComposer RELATIVE sender ) ecm_generate_headers(MessageComposer_Camelcaseutils_HEADERS HEADER_NAMES Util Kleo_Util REQUIRED_HEADERS MessageComposer_utils_HEADERS PREFIX MessageComposer RELATIVE utils ) ecm_generate_headers(MessageComposer_Camelcasehelper_HEADERS HEADER_NAMES MessageHelper MessageFactoryNG REQUIRED_HEADERS MessageComposer_helper_HEADERS PREFIX MessageComposer RELATIVE helper ) ecm_generate_headers(MessageComposer_Camelcasesettings_HEADERS HEADER_NAMES MessageComposerSettings REQUIRED_HEADERS MessageComposer_settings_HEADERS PREFIX MessageComposer RELATIVE settings ) ecm_generate_headers(MessageComposer_Camelcasepart_HEADERS HEADER_NAMES TextPart GlobalPart InfoPart MessagePart REQUIRED_HEADERS MessageComposer_part_HEADERS PREFIX MessageComposer RELATIVE part ) ecm_generate_headers(MessageComposer_Camelcasefollowupreminder_HEADERS HEADER_NAMES FollowupReminderCreateJob FollowUpReminderSelectDateDialog + FollowupReminder REQUIRED_HEADERS MessageComposer_followupreminder_HEADERS PREFIX MessageComposer RELATIVE followupreminder ) ecm_generate_headers(MessageComposer_Camelcaserecipient_HEADERS HEADER_NAMES Recipient RecipientsEditor RecipientLine REQUIRED_HEADERS MessageComposer_recipient_HEADERS PREFIX MessageComposer RELATIVE recipient ) ecm_generate_headers(MessageComposer_Camelcaseimagescaling_HEADERS HEADER_NAMES ImageScalingWidget REQUIRED_HEADERS MessageComposer_imagescaling_HEADERS PREFIX MessageComposer RELATIVE imagescaling ) ecm_generate_headers(MessageComposer_Camelcasejob_HEADERS HEADER_NAMES JobBase AbstractEncryptJob ContentJobBase InsertTextFileJob AttachmentJob SinglepartJob MainTextJob AttachmentFromPublicKeyJob MultipartJob EncryptJob AttachmentVcardFromAddressBookJob SignJob SignEncryptJob TransparentJob JobBase AliasesExpandJob SkeletonMessageJob AttachmentClipBoardJob REQUIRED_HEADERS MessageComposer_job_HEADERS PREFIX MessageComposer RELATIVE job ) ecm_generate_pri_file(BASE_NAME MessageComposer LIB_NAME KF5MessageComposer DEPS "Mime MessageCore PimCommon Akonadi IdentityManagement AkonadiMime Libkleo" FILENAME_VAR PRI_FILENAME INCLUDE_INSTALL_DIR ${KDE_INSTALL_INCLUDEDIR_KF5}/MessageComposer ) install(FILES ${MessageComposer_Camelsnippet_HEADERS} ${MessageComposer_Camelplugineditorconverttext_HEADERS} ${MessageComposer_Camelplugineditorinit_HEADERS} ${MessageComposer_Camelplugineditorcheckbeforesend_HEADERS} ${MessageComposer_Camelcasecomposer_HEADERS} ${MessageComposer_Camelcasecomposerng_HEADERS} ${MessageComposer_Camelcasesender_HEADERS} ${MessageComposer_Camelcaseutils_HEADERS} ${MessageComposer_Camelcasehelper_HEADERS} ${MessageComposer_Camelcasesettings_HEADERS} ${MessageComposer_Camelcasepart_HEADERS} ${MessageComposer_Camelcasefollowupreminder_HEADERS} ${MessageComposer_Camelcaserecipient_HEADERS} ${MessageComposer_Camelcaseimagescaling_HEADERS} ${MessageComposer_Camelcasejob_HEADERS} ${MessageComposer_Camelcaseattachement_HEADERS} ${MessageComposer_Camelplugineditor_HEADERS} ${MessageComposer_Camelplugineditorgrammar_HEADERS} ${MessageComposer_Camelstatusbarwidget_HEADERS} DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/MessageComposer COMPONENT Devel ) install(FILES ${MessageComposer_HEADERS} ${MessageComposer_snippet_HEADERS} ${MessageComposer_plugineditorconverttext_HEADERS} ${MessageComposer_plugineditorinit_HEADERS} ${MessageComposer_statusbarwidget_HEADERS} ${CMAKE_CURRENT_BINARY_DIR}/messagecomposer_export.h ${CMAKE_CURRENT_BINARY_DIR}/messagecomposersettings_base.h ${CMAKE_CURRENT_BINARY_DIR}/messagecomposer_debug.h ${MessageComposer_composer_HEADERS} ${MessageComposer_composerng_HEADERS} ${MessageComposer_sender_HEADERS} ${MessageComposer_utils_HEADERS} ${MessageComposer_helper_HEADERS} ${MessageComposer_settings_HEADERS} ${MessageComposer_part_HEADERS} ${MessageComposer_followupreminder_HEADERS} ${MessageComposer_recipient_HEADERS} ${MessageComposer_imagescaling_HEADERS} ${MessageComposer_attachement_HEADERS} ${MessageComposer_job_HEADERS} ${MessageComposer_plugineditor_HEADERS} ${MessageComposer_plugineditorcheckbeforesend_HEADERS} ${MessageComposer_plugineditorgrammar_HEADERS} DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/messagecomposer COMPONENT Devel ) install(FILES ${PRI_FILENAME} DESTINATION ${ECM_MKSPECS_INSTALL_DIR}) diff --git a/messagecomposer/src/followupreminder/followupreminder.cpp b/messagecomposer/src/followupreminder/followupreminder.cpp new file mode 100644 index 00000000..2d3670d9 --- /dev/null +++ b/messagecomposer/src/followupreminder/followupreminder.cpp @@ -0,0 +1,40 @@ +/* + Copyright (C) 2020 Daniel Vrátil + + 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; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "followupreminder.h" +#include "followupreminderinterface.h" + +#include +#include + +using namespace MessageComposer; + + +bool FollowUpReminder::isAvailableAndEnabled() +{ + using Akonadi::ServerManager; + org::freedesktop::Akonadi::FollowUpReminderAgent iface{ + ServerManager::agentServiceName(ServerManager::Agent, QStringLiteral("akonadi_followupreminder_agent")), + QStringLiteral("/FollowUpReminder"), + QDBusConnection::sessionBus() + }; + + return iface.isValid() && iface.enabledAgent(); +} + diff --git a/messagecomposer/src/followupreminder/followupreminder.h b/messagecomposer/src/followupreminder/followupreminder.h new file mode 100644 index 00000000..0d9148bc --- /dev/null +++ b/messagecomposer/src/followupreminder/followupreminder.h @@ -0,0 +1,39 @@ +/* + Copyright (C) 2020 Daniel Vrátil + + 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; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef MESSAGECOMPOSER_FOLLOWUPREMINDER_H_ +#define MESSAGECOMPOSER_FOLLOWUPREMINDER_H_ + +#include "messagecomposer_export.h" + +#include + +namespace MessageComposer +{ + +namespace FollowUpReminder +{ + +Q_REQUIRED_RESULT MESSAGECOMPOSER_EXPORT bool isAvailableAndEnabled(); + +} + +} + +#endif diff --git a/messagecomposer/src/followupreminder/followupremindercreatejob.cpp b/messagecomposer/src/followupreminder/followupremindercreatejob.cpp index e4d742f4..1232c9f2 100644 --- a/messagecomposer/src/followupreminder/followupremindercreatejob.cpp +++ b/messagecomposer/src/followupreminder/followupremindercreatejob.cpp @@ -1,124 +1,153 @@ /* Copyright (C) 2014-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 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; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "followupremindercreatejob.h" +#include "followupreminderinterface.h" #include "messagecomposer_debug.h" -#include + #include #include #include +#include + +#include +#include +#include +#include using namespace MessageComposer; class MessageComposer::FollowupReminderCreateJobPrivate { public: - FollowupReminderCreateJobPrivate() - : mInfo(new FollowUpReminder::FollowUpReminderInfo) - { - } - - ~FollowupReminderCreateJobPrivate() - { - delete mInfo; - } - Akonadi::Collection mCollection; - FollowUpReminder::FollowUpReminderInfo *mInfo = nullptr; + QDate mFollowupDate; + Akonadi::Item::Id mOriginalMessageItemId = -1; + Akonadi::Item::Id mTodoId = -1; + QString mMessageId; + QString mSubject; + QString mTo; }; FollowupReminderCreateJob::FollowupReminderCreateJob(QObject *parent) : KJob(parent) , d(new MessageComposer::FollowupReminderCreateJobPrivate) { } -FollowupReminderCreateJob::~FollowupReminderCreateJob() -{ - delete d; -} +FollowupReminderCreateJob::~FollowupReminderCreateJob() = default; void FollowupReminderCreateJob::setFollowUpReminderDate(const QDate &date) { - d->mInfo->setFollowUpReminderDate(date); + d->mFollowupDate = date; } void FollowupReminderCreateJob::setOriginalMessageItemId(Akonadi::Item::Id value) { - d->mInfo->setOriginalMessageItemId(value); + d->mOriginalMessageItemId = value; } void FollowupReminderCreateJob::setMessageId(const QString &messageId) { - d->mInfo->setMessageId(messageId); + d->mMessageId = messageId; } void FollowupReminderCreateJob::setTo(const QString &to) { - d->mInfo->setTo(to); + d->mTo = to; } void FollowupReminderCreateJob::setSubject(const QString &subject) { - d->mInfo->setSubject(subject); + d->mSubject = subject; } void FollowupReminderCreateJob::setCollectionToDo(const Akonadi::Collection &collection) { d->mCollection = collection; } void FollowupReminderCreateJob::start() { - if (d->mInfo->isValid()) { + if (!d->mMessageId.isEmpty() && d->mFollowupDate.isValid() && !d->mTo.isEmpty()) { if (d->mCollection.isValid()) { KCalendarCore::Todo::Ptr todo(new KCalendarCore::Todo); - todo->setSummary(i18n("Wait answer from \"%1\" send to \"%2\"", d->mInfo->subject(), d->mInfo->to())); - todo->setDtDue(QDateTime(d->mInfo->followUpReminderDate(), QTime(0, 0, 0))); + todo->setSummary(i18n("Wait answer from \"%1\" send to \"%2\"", d->mSubject, d->mTo)); + todo->setDtDue(QDateTime(d->mFollowupDate, QTime(0, 0, 0))); Akonadi::Item newTodoItem; newTodoItem.setMimeType(KCalendarCore::Todo::todoMimeType()); newTodoItem.setPayload(todo); Akonadi::ItemCreateJob *createJob = new Akonadi::ItemCreateJob(newTodoItem, d->mCollection); connect(createJob, &Akonadi::ItemCreateJob::result, this, &FollowupReminderCreateJob::slotCreateNewTodo); } else { writeFollowupReminderInfo(); } } else { - qCDebug(MESSAGECOMPOSER_LOG) << "FollowupReminderCreateJob info not valid " << *d->mInfo; + qCWarning(MESSAGECOMPOSER_LOG) << "FollowupReminderCreateJob info not valid!"; emitResult(); return; } } void FollowupReminderCreateJob::slotCreateNewTodo(KJob *job) { if (job->error()) { - qCDebug(MESSAGECOMPOSER_LOG) << "Error during create new Todo " << job->errorString(); - } else { - Akonadi::ItemCreateJob *createJob = qobject_cast(job); - d->mInfo->setTodoId(createJob->item().id()); + qCWarning(MESSAGECOMPOSER_LOG) << "Error during create new Todo " << job->errorString(); + setError(job->error()); + setErrorText(i18n("Failed to store a new reminder: an error occured while trying to create a new Todo in your calendar: %1", job->errorString())); + emitResult(); + return; } + + Akonadi::ItemCreateJob *createJob = qobject_cast(job); + d->mTodoId = createJob->item().id(); writeFollowupReminderInfo(); } void FollowupReminderCreateJob::writeFollowupReminderInfo() { - FollowUpReminder::FollowUpReminderUtil::writeFollowupReminderInfo(FollowUpReminder::FollowUpReminderUtil::defaultConfig(), d->mInfo, true); - emitResult(); + std::unique_ptr iface{ + new org::freedesktop::Akonadi::FollowUpReminderAgent{ + Akonadi::ServerManager::agentServiceName(Akonadi::ServerManager::Agent, QStringLiteral("akonadi_followupreminder_agent")), + QStringLiteral("/FollowUpReminder"), + QDBusConnection::sessionBus() + }}; + + if (!iface->isValid()) { + qCWarning(MESSAGECOMPOSER_LOG) << "The FollowUpReminder agent is not running!"; + return; + } + + auto call = iface->addReminder(d->mMessageId, d->mOriginalMessageItemId, d->mTo, d->mSubject, d->mFollowupDate, d->mTodoId); + auto wait = new QDBusPendingCallWatcher{call, this}; + connect(wait, &QDBusPendingCallWatcher::finished, + this, [this, iface_ = std::move(iface)](QDBusPendingCallWatcher *watcher) mutable { + auto iface = std::move(iface_); + watcher->deleteLater(); + + const QDBusPendingReply reply = *watcher; + if (reply.isError()) { + qCWarning(MESSAGECOMPOSER_LOG) << "Failed to write the new reminder, agent replied" << reply.error().message(); + setError(KJob::UserDefinedError); + setErrorText(i18n("Failed to store a new reminder: %1", reply.error().message())); + } + + emitResult(); + }); } diff --git a/messagecomposer/src/followupreminder/followupremindercreatejob.h b/messagecomposer/src/followupreminder/followupremindercreatejob.h index 3fb51f65..a552fd0a 100644 --- a/messagecomposer/src/followupreminder/followupremindercreatejob.h +++ b/messagecomposer/src/followupreminder/followupremindercreatejob.h @@ -1,65 +1,70 @@ /* Copyright (C) 2014-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 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; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef MESSAGECOMPOSER_FOLLOWUPREMINDERCREATEJOB_H #define MESSAGECOMPOSER_FOLLOWUPREMINDERCREATEJOB_H #include #include #include #include -#include #include + #include "messagecomposer_export.h" + +#include + namespace MessageComposer { class FollowupReminderCreateJobPrivate; /** * @brief The FollowupReminderCreateJob class * @author Laurent Montel */ class MESSAGECOMPOSER_EXPORT FollowupReminderCreateJob : public KJob { Q_OBJECT public: explicit FollowupReminderCreateJob(QObject *parent = nullptr); ~FollowupReminderCreateJob() override; void setFollowUpReminderDate(const QDate &date); void setOriginalMessageItemId(Akonadi::Item::Id value); void setMessageId(const QString &messageId); void setTo(const QString &to); void setSubject(const QString &subject); void setCollectionToDo(const Akonadi::Collection &collection); void start() override; private Q_SLOTS: void slotCreateNewTodo(KJob *job); + private: void writeFollowupReminderInfo(); - FollowupReminderCreateJobPrivate *const d; + + std::unique_ptr const d; }; } #endif diff --git a/messagecomposer/src/followupreminder/followupreminderselectdatedialog.cpp b/messagecomposer/src/followupreminder/followupreminderselectdatedialog.cpp index 294aed76..24512b64 100644 --- a/messagecomposer/src/followupreminder/followupreminderselectdatedialog.cpp +++ b/messagecomposer/src/followupreminder/followupreminderselectdatedialog.cpp @@ -1,136 +1,129 @@ /* Copyright (C) 2014-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 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; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "followupreminderselectdatedialog.h" #include #include #include #include #include #include #include #include #include #include #include using namespace MessageComposer; class MessageComposer::FollowUpReminderSelectDateDialogPrivate { public: - FollowUpReminderSelectDateDialogPrivate() - { - } - KDateComboBox *mDateComboBox = nullptr; Akonadi::CollectionComboBox *mCollectionCombobox = nullptr; QPushButton *mOkButton = nullptr; }; FollowUpReminderSelectDateDialog::FollowUpReminderSelectDateDialog(QWidget *parent, QAbstractItemModel *model) : QDialog(parent) , d(new MessageComposer::FollowUpReminderSelectDateDialogPrivate) { setWindowTitle(i18nc("@title:window", "Select Date")); QVBoxLayout *topLayout = new QVBoxLayout(this); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); d->mOkButton = buttonBox->button(QDialogButtonBox::Ok); d->mOkButton->setObjectName(QStringLiteral("ok_button")); d->mOkButton->setDefault(true); d->mOkButton->setShortcut(Qt::CTRL | Qt::Key_Return); connect(buttonBox, &QDialogButtonBox::accepted, this, &FollowUpReminderSelectDateDialog::accept); connect(buttonBox, &QDialogButtonBox::rejected, this, &FollowUpReminderSelectDateDialog::reject); setModal(true); QWidget *mainWidget = new QWidget(this); topLayout->addWidget(mainWidget); topLayout->addWidget(buttonBox); QVBoxLayout *mainLayout = new QVBoxLayout(mainWidget); mainLayout->setContentsMargins(0, 0, 0, 0); QFormLayout *formLayout = new QFormLayout; formLayout->setContentsMargins(0, 0, 0, 0); mainLayout->addLayout(formLayout); d->mDateComboBox = new KDateComboBox; QDate currentDate = QDate::currentDate().addDays(1); d->mDateComboBox->setMinimumDate(QDate::currentDate()); d->mDateComboBox->setObjectName(QStringLiteral("datecombobox")); d->mDateComboBox->setDate(currentDate); formLayout->addRow(i18n("Date:"), d->mDateComboBox); d->mCollectionCombobox = new Akonadi::CollectionComboBox(model); d->mCollectionCombobox->setMinimumWidth(250); d->mCollectionCombobox->setAccessRightsFilter(Akonadi::Collection::CanCreateItem); d->mCollectionCombobox->setMimeTypeFilter(QStringList() << KCalendarCore::Todo::todoMimeType()); d->mCollectionCombobox->setObjectName(QStringLiteral("collectioncombobox")); formLayout->addRow(i18n("Store ToDo in:"), d->mCollectionCombobox); connect(d->mDateComboBox->lineEdit(), &QLineEdit::textChanged, this, &FollowUpReminderSelectDateDialog::slotDateChanged); connect(d->mCollectionCombobox, qOverload(&Akonadi::CollectionComboBox::currentIndexChanged), this, &FollowUpReminderSelectDateDialog::updateOkButton); updateOkButton(); } -FollowUpReminderSelectDateDialog::~FollowUpReminderSelectDateDialog() -{ - delete d; -} +FollowUpReminderSelectDateDialog::~FollowUpReminderSelectDateDialog() = default; void FollowUpReminderSelectDateDialog::updateOkButton() { d->mOkButton->setEnabled(!d->mDateComboBox->lineEdit()->text().isEmpty() && d->mDateComboBox->date().isValid() && (d->mCollectionCombobox->count() > 0) && d->mCollectionCombobox->currentCollection().isValid()); } void FollowUpReminderSelectDateDialog::slotDateChanged() { updateOkButton(); } QDate FollowUpReminderSelectDateDialog::selectedDate() const { return d->mDateComboBox->date(); } Akonadi::Collection FollowUpReminderSelectDateDialog::collection() const { return d->mCollectionCombobox->currentCollection(); } void FollowUpReminderSelectDateDialog::accept() { const QDate date = selectedDate(); if (date < QDate::currentDate()) { KMessageBox::error(this, i18n("The selected date must be greater than the current date."), i18n("Invalid date")); return; } if (!d->mCollectionCombobox->currentCollection().isValid()) { KMessageBox::error(this, i18n("The selected folder is not valid."), i18n("Invalid folder")); return; } QDialog::accept(); } diff --git a/messagecomposer/src/followupreminder/followupreminderselectdatedialog.h b/messagecomposer/src/followupreminder/followupreminderselectdatedialog.h index 4943d17d..9fc5dd5c 100644 --- a/messagecomposer/src/followupreminder/followupreminderselectdatedialog.h +++ b/messagecomposer/src/followupreminder/followupreminderselectdatedialog.h @@ -1,55 +1,57 @@ /* Copyright (C) 2014-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 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; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef MESSAGECOMPOSER_FOLLOWUPREMINDERSELECTDATEDIALOG_H #define MESSAGECOMPOSER_FOLLOWUPREMINDERSELECTDATEDIALOG_H #include #include #include #include "messagecomposer_export.h" class QAbstractItemModel; namespace MessageComposer { class FollowUpReminderSelectDateDialogPrivate; /** * @brief The FollowUpReminderSelectDateDialog class * @author Laurent Montel */ class MESSAGECOMPOSER_EXPORT FollowUpReminderSelectDateDialog : public QDialog { Q_OBJECT public: explicit FollowUpReminderSelectDateDialog(QWidget *parent = nullptr, QAbstractItemModel *model = nullptr); ~FollowUpReminderSelectDateDialog() override; Q_REQUIRED_RESULT QDate selectedDate() const; void accept() override; Akonadi::Collection collection() const; + private Q_SLOTS: void slotDateChanged(); void updateOkButton(); + private: - FollowUpReminderSelectDateDialogPrivate *const d; + std::unique_ptr const d; }; } #endif diff --git a/messagecomposer/src/followupreminder/org.freedesktop.Akonadi.FollowUpReminder.xml b/messagecomposer/src/followupreminder/org.freedesktop.Akonadi.FollowUpReminder.xml new file mode 100644 index 00000000..0fde523c --- /dev/null +++ b/messagecomposer/src/followupreminder/org.freedesktop.Akonadi.FollowUpReminder.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + +