/**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the Qt Messaging Framework. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see http://www.qt.io/terms-conditions. For further ** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** As a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef SERVICEHANDLER_H #define SERVICEHANDLER_H #include #include #include #include #include #include #include #include #include #include #include #include class QMailServiceConfiguration; class ServiceHandler : public QObject { Q_OBJECT public: ServiceHandler(QObject* parent); ~ServiceHandler(); public slots: void transmitMessages(quint64 action, const QMailAccountId &accountId); void transmitMessage(quint64, const QMailMessageId &messageId); void retrieveFolderList(quint64, const QMailAccountId &accountId, const QMailFolderId &folderId, bool descending); void retrieveMessageList(quint64, const QMailAccountId &accountId, const QMailFolderId &folderId, uint minimum, const QMailMessageSortKey &sort); void retrieveMessageLists(quint64, const QMailAccountId &accountId, const QMailFolderIdList &folderIds, uint minimum, const QMailMessageSortKey &sort); void retrieveNewMessages(quint64, const QMailAccountId &accountId, const QMailFolderIdList &folderIds); void createStandardFolders(quint64, const QMailAccountId &accountId); void retrieveMessages(quint64, const QMailMessageIdList &messageIds, QMailRetrievalAction::RetrievalSpecification spec); void retrieveMessagePart(quint64, const QMailMessagePart::Location &partLocation); void retrieveMessageRange(quint64, const QMailMessageId &messageId, uint minimum); void retrieveMessagePartRange(quint64, const QMailMessagePart::Location &partLocation, uint minimum); void retrieveAll(quint64, const QMailAccountId &accountId); void exportUpdates(quint64, const QMailAccountId &accountId); void synchronize(quint64, const QMailAccountId &accountId); void onlineDeleteMessages(quint64 action, const QMailMessageIdList& mailList, QMailStore::MessageRemovalOption); void discardMessages(quint64 action, QMailMessageIdList messageIds); void onlineCopyMessages(quint64 action, const QMailMessageIdList& mailList, const QMailFolderId &destination); void onlineMoveMessages(quint64 action, const QMailMessageIdList& mailList, const QMailFolderId &destination); void onlineFlagMessagesAndMoveToStandardFolder(quint64 action, const QMailMessageIdList& mailList, quint64 setMask, quint64 unsetMask); void addMessages(quint64 action, const QMailMessageMetaDataList &messages); void updateMessages(quint64 action, const QMailMessageMetaDataList &messages); void deleteMessages(quint64 action, const QMailMessageIdList &ids); void rollBackUpdates(quint64 action, const QMailAccountId &mailAccountId); void moveToStandardFolder(quint64 action, const QMailMessageIdList& ids, quint64 standardFolder); void moveToFolder(quint64 action, const QMailMessageIdList& ids, const QMailFolderId& folderId); void flagMessages(quint64 action, const QMailMessageIdList& ids, quint64 setMask, quint64 unsetMask); void restoreToPreviousFolder(quint64, const QMailMessageKey& key); void onlineCreateFolder(quint64 action, const QString &name, const QMailAccountId &accountId, const QMailFolderId &parentId); void onlineRenameFolder(quint64 action, const QMailFolderId &folderId, const QString &name); void onlineDeleteFolder(quint64 action, const QMailFolderId &folderId); void onlineMoveFolder(quint64 action, const QMailFolderId &folderId, const QMailFolderId &newParentId); void cancelTransfer(quint64 action); void searchMessages(quint64 action, const QMailMessageKey &filter, const QString &bodyText, QMailSearchAction::SearchSpecification spec, const QMailMessageSortKey &sort); void searchMessages(quint64 action, const QMailMessageKey &filter, const QString &bodyText, QMailSearchAction::SearchSpecification spec, quint64 limit, const QMailMessageSortKey &sort); void countMessages(quint64 action, const QMailMessageKey &filter, const QString &bodyText); void cancelLocalSearch(quint64 action); void shutdown(); void listActions(); void protocolRequest(quint64 action, const QMailAccountId &accountId, const QString &request, const QVariantMap &data); signals: void actionStarted(QMailActionData action); void statusChanged(quint64 action, const QMailServiceAction::Status status); void availabilityChanged(quint64 action, bool available); void connectivityChanged(quint64 action, QMailServiceAction::Connectivity connectivity); void activityChanged(quint64 action, QMailServiceAction::Activity activity); void progressChanged(quint64 action, uint progress, uint total); void retrievalCompleted(quint64 action); void messagesTransmitted(quint64 action, const QMailMessageIdList&); void messagesFailedTransmission(quint64 action, const QMailMessageIdList&, QMailServiceAction::Status::ErrorCode); void transmissionCompleted(quint64 action); void messagesDeleted(quint64 action, const QMailMessageIdList&); void messagesCopied(quint64 action, const QMailMessageIdList&); void messagesMoved(quint64 action, const QMailMessageIdList&); void messagesFlagged(quint64 action, const QMailMessageIdList&); void messagesAdded(quint64 action, const QMailMessageIdList&); void messagesUpdated(quint64 action, const QMailMessageIdList&); void folderCreated(quint64 action, const QMailFolderId&); void folderRenamed(quint64 action, const QMailFolderId&); void folderDeleted(quint64 action, const QMailFolderId&); void folderMoved(quint64 action, const QMailFolderId&); void storageActionCompleted(quint64 action); void matchingMessageIds(quint64 action, const QMailMessageIdList&); void remainingMessagesCount(quint64 action, uint); void messagesCount(quint64 action, uint); void remoteSearchCompleted(quint64 action); void searchCompleted(quint64 action); void actionsListed(const QMailActionDataList &actions); void protocolResponse(quint64 action, const QString &response, const QVariantMap &data); void protocolRequestCompleted(quint64 action); void newMessagesAvailable(); void messageCountUpdated(); void transmissionReady(quint64 action); void retrievalReady(quint64 action); private slots: void onStatusChanged(const QMailServiceAction::Status); void onStatusChanged(const QMailServiceAction::Status, quint64); void onAvailabilityChanged(bool); void emitAvailabilityChanged(bool, quint64); void onConnectivityChanged(QMailServiceAction::Connectivity); void emitConnectivityChanged(QMailServiceAction::Connectivity, quint64); void onActivityChanged(QMailServiceAction::Activity); void emitActivityChanged(QMailServiceAction::Activity, quint64); void onProgressChanged(uint, uint ); void onProgressChanged(uint, uint, quint64); void onActionCompleted(bool); void onActionCompleted(bool, quint64); void onMessagesTransmitted(const QMailMessageIdList&); void emitMessagesTransmitted(const QMailMessageIdList&, quint64); void onMessagesFailedTransmission(const QMailMessageIdList&, QMailServiceAction::Status::ErrorCode); void emitMessagesFailedTransmission(const QMailMessageIdList&, QMailServiceAction::Status::ErrorCode, quint64); void onMessagesDeleted(const QMailMessageIdList&); void emitMessagesDeleted(const QMailMessageIdList& , quint64); void onMessagesCopied(const QMailMessageIdList&); void emitMessagesCopied(const QMailMessageIdList&, quint64); void onMessagesMoved(const QMailMessageIdList&); void emitMessagesMoved(const QMailMessageIdList&, quint64); void onMessagesFlagged(const QMailMessageIdList&); void emitMessagesFlagged(const QMailMessageIdList&, quint64); void onMessagesPrepared(const QMailMessageIdList&); void emitMessagesPrepared(const QMailMessageIdList&, quint64); void onMatchingMessageIds(const QMailMessageIdList&); void emitMatchingMessageIds(const QMailMessageIdList&, quint64); void onRemainingMessagesCount(uint count); void emitRemainingMessagesCount(uint count, quint64); void onMessagesCount(uint count); void emitMessagesCount(uint count, quint64); void onProtocolResponse(const QString &response, const QVariantMap &data); void emitProtocolResponse(const QString &response, const QVariantMap &data, quint64); void onAccountsAdded(const QMailAccountIdList &); void onAccountsUpdated(const QMailAccountIdList &); void onAccountsRemoved(const QMailAccountIdList &); void continueSearch(); void dispatchRequest(); void expireAction(); void reportFailures(); private: enum SearchType { NoLimit = 0, Limit = 1, Count = 2 }; void handleActionCompleted(bool, QMailMessageService *, quint64); void searchMessages(quint64 action, const QMailMessageKey &filter, const QString &bodyText, QMailSearchAction::SearchSpecification spec, quint64 limit, const QMailMessageSortKey &sort, ServiceHandler::SearchType searchType); QMailAccountId transmissionAccountId(const QMailAccountId &accountId) const; void registerAccountServices(const QMailAccountIdList &ids); void deregisterAccountServices(const QMailAccountIdList &ids, QMailServiceAction::Status::ErrorCode code, const QString &text); void deregisterAccountService(const QMailAccountId &id, const QString &serviceName, QMailServiceAction::Status::ErrorCode code, const QString &text); void removeServiceFromActions(QMailMessageService *removeService); void reregisterAccountServices(QMailAccountIdList ids, QMailServiceAction::Status::ErrorCode code, const QString &text); void registerAccountSource(const QMailAccountId &accountId, QMailMessageSource *source, QMailMessageService *service); QMailMessageSource *accountSource(const QMailAccountId &accountId) const; void registerAccountSink(const QMailAccountId &accountId, QMailMessageSink *sink, QMailMessageService *service); QMailMessageSink *accountSink(const QMailAccountId &accountId) const; void registerAccountService(const QMailAccountId &accountId, const QMailServiceConfiguration &svcCfg); QMailMessageService *createService(const QString &service, const QMailAccountId &accountId); struct Request; bool servicesAvailable(const Request &services) const; bool serviceAvailable(QPointer service) const; QSet sourceServiceSet(const QMailAccountId &id) const; QSet sourceServiceSet(const QSet &ids) const; QSet sourceServiceSet(const QMailAccountIdList &ids) const; QSet sinkServiceSet(const QMailAccountId &id) const; QSet sinkServiceSet(const QSet &ids) const; quint64 sourceAction(QMailMessageSource *source) const; quint64 sinkAction(QMailMessageSink *sink) const; quint64 serviceAction(QMailMessageService *service) const; typedef bool (ServiceHandler::*RequestServicer)(quint64, const QByteArray &); typedef void (ServiceHandler::*CompletionSignal)(quint64); void enqueueRequest(quint64 action, const QByteArray &data, const QSet &services, RequestServicer servicer, CompletionSignal completion, QMailServerRequestType description, const QSet &preconditions = QSet()); bool dispatchPrepareMessages(quint64 action, const QByteArray& data); bool dispatchTransmitMessages(quint64 action, const QByteArray& data); bool dispatchTransmitMessage(quint64 action, const QByteArray& data); bool dispatchRetrieveFolderListAccount(quint64, const QByteArray &data); bool dispatchRetrieveFolderList(quint64, const QByteArray &data); bool dispatchRetrieveMessageList(quint64, const QByteArray &data); bool dispatchRetrieveMessageLists(quint64, const QByteArray &data); bool dispatchRetrieveNewMessages(quint64, const QByteArray &data); bool dispatchCreateStandardFolders(quint64, const QByteArray &data); bool dispatchRetrieveMessages(quint64, const QByteArray &data); bool dispatchRetrieveMessagePart(quint64, const QByteArray &data); bool dispatchRetrieveMessageRange(quint64, const QByteArray &data); bool dispatchRetrieveMessagePartRange(quint64, const QByteArray &data); bool dispatchRetrieveAll(quint64, const QByteArray &data); bool dispatchExportUpdates(quint64, const QByteArray &data); bool dispatchSynchronize(quint64, const QByteArray &data); bool dispatchOnlineDeleteMessages(quint64 action, const QByteArray &data); bool dispatchOnlineCopyMessages(quint64 action, const QByteArray &data); bool dispatchCopyToLocal(quint64 action, const QByteArray &data); bool dispatchOnlineMoveMessages(quint64 action, const QByteArray &data); bool dispatchOnlineFlagMessagesAndMoveToStandardFolder(quint64 action, const QByteArray &data); bool dispatchOnlineCreateFolder(quint64 action, const QByteArray &data); bool dispatchOnlineDeleteFolder(quint64 action, const QByteArray &data); bool dispatchOnlineRenameFolder(quint64 action, const QByteArray &data); bool dispatchOnlineMoveFolder(quint64 action, const QByteArray &data); bool dispatchSearchMessages(quint64 action, const QByteArray &data); bool dispatchProtocolRequest(quint64 action, const QByteArray &data); void reportFailure(quint64, QMailServiceAction::Status::ErrorCode, const QString& = QString(), const QMailAccountId& = QMailAccountId(), const QMailFolderId& = QMailFolderId(), const QMailMessageId& = QMailMessageId()); void reportFailure(quint64, const QMailServiceAction::Status); void updateAction(quint64); void setRetrievalInProgress(const QMailAccountId &id, bool inProgress); void setTransmissionInProgress(const QMailAccountId &id, bool inProgress); QMap, QPointer > serviceMap; QMap sourceMap; QMap sinkMap; QMap > sourceService; QMap > sinkService; QMap masterAccount; QSet mUnavailableServices; class ActionData { public: QMailServerRequestType description; QSet > services; CompletionSignal completion; quint64 unixTimeExpiry; bool reported; // Fields for QMailActionInfo uint progressTotal; uint progressCurrent; QMailServiceAction::Status status; }; QMap mActiveActions; QLinkedList mActionExpiry; QMap, quint64> mServiceAction; static const int ExpirySeconds = 120; struct Request { quint64 action; QByteArray data; QSet > services; QSet > preconditions; RequestServicer servicer; CompletionSignal completion; QMailServerRequestType description; }; QList mRequests; class MessageSearch { public: MessageSearch(quint64 action, const QMailMessageIdList &ids, const QString &text); quint64 action() const; const QString &bodyText() const; bool pending() const; void inProgress(); bool isEmpty() const; uint total() const; uint progress() const; QMailMessageIdList takeBatch(); private: quint64 _action; QMailMessageIdList _ids; QString _text; bool _active; uint _total; uint _progress; }; QList mSearches; QMailMessageIdList mMatchingIds; QMailMessageIdList mSentIds; QFile _requestsFile; QSet _outstandingRequests; QList _failedRequests; QSet _retrievalAccountIds; QSet _transmissionAccountIds; }; #endif