--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/messaging/qmtmengine_symbian_p.h Wed Aug 25 15:49:42 2010 +0300
@@ -0,0 +1,434 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt Mobility Components.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** 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 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QMTMENGINE_SYMBIAN_H
+#define QMTMENGINE_SYMBIAN_H
+
+#include <QMap>
+#include <QSet>
+#include <QList>
+#include <QHash>
+
+#include <e32base.h>
+#include <msvapi.h> // MMsvSessionObserver
+#include "qmessagemanager.h"
+#include "qmessagestore_symbian_p.h"
+#include "qmessagefilter.h"
+#include "qmessagefilter_p.h"
+#include "qmessagefolderfilter.h"
+#include "qmessageservice.h"
+
+
+class CRichText;
+class CCharFormatLayer;
+class CParaFormatLayer;
+class CMsvSession;
+class CClientMtmRegistry;
+class CSmsClientMtm;
+class CMmsClientMtm;
+class CSmtpClientMtm;
+class CImap4ClientMtm;
+class CPop3ClientMtm;
+class CMsvFindOperation;
+
+
+QTM_BEGIN_NAMESPACE
+
+class CMessagesFindOperation;
+class QMessageId;
+class QMessageAccount;
+class CAsynchronousMTMOperation;
+
+struct MessageEvent
+{
+ QMessageStorePrivate::NotificationType notificationType;
+ TMsvId messageId;
+ QMessageManager::NotificationFilterIdSet matchingFilters;
+ bool unfiltered;
+};
+
+struct MessageQueryInfo
+{
+ int operationId;
+ bool isQuery;
+ QString body;
+ QMessageDataComparator::MatchFlags matchFlags;
+ QMessageFilter filter;
+ QMessageSortOrder sortOrder;
+ int offset;
+ int limit;
+ QMessageServicePrivate* privateService;
+ CMessagesFindOperation* findOperation;
+ int currentFilterListIndex;
+ QMessageIdList ids;
+ int count;
+};
+
+class CMTMEngine : public QObject, public CActive, public MMsvSessionObserver
+{
+ Q_OBJECT
+
+public:
+ enum MTMType
+ {
+ MTMTypeSMS,
+ MTMTypeMMS,
+ MTMTypeSMTP,
+ MTMTypeIMAP,
+ MTMTypePOP3
+ };
+
+ static CMTMEngine* instance();
+
+ CMTMEngine();
+ ~CMTMEngine();
+
+ QMessageAccountIdList queryAccounts(const QMessageAccountFilter &filter, const QMessageAccountSortOrder &sortOrder, uint limit, uint offset) const;
+ int countAccounts(const QMessageAccountFilter &filter) const;
+ QMessageAccount account(const QMessageAccountId &id) const;
+ QMessageAccountId defaultAccount(QMessage::Type type) const;
+
+ QMessageFolderIdList queryFolders(const QMessageFolderFilter &filter, const QMessageFolderSortOrder &sortOrder, uint limit, uint offset) const;
+ int countFolders(const QMessageFolderFilter &filter) const;
+ QMessageFolder folder(const QMessageFolderId &id) const;
+
+ bool addMessage(QMessage *m);
+ bool updateMessage(QMessage *m);
+ bool removeMessage(const QMessageId &id, QMessageManager::RemovalOption option);
+ bool removeMessages(const QMessageFilter &filter, QMessageManager::RemovalOption option);
+ bool queryMessages(QMessageServicePrivate& privateService, const QMessageFilter &filter, const QMessageSortOrder &sortOrder, uint limit, uint offset) const;
+ bool queryMessages(QMessageServicePrivate& privateService, const QMessageFilter &filter, const QString &body, QMessageDataComparator::MatchFlags matchFlags, const QMessageSortOrder &sortOrder, uint limit, uint offset) const;
+ bool countMessages(QMessageServicePrivate& privateService, const QMessageFilter &filter);
+ bool showMessage(const QMessageId &id);
+ bool composeMessage(const QMessage &message);
+
+ QMessage message(const QMessageId& id) const;
+
+ bool storeMMS(QMessage &message);
+ bool sendMMS(QMessage &message);
+ bool storeEmail(QMessage &message);
+ bool sendEmail(QMessage &message);
+ bool storeSMS(QMessage &message);
+ bool sendSMS(QMessage &message);
+ bool retrieve(QMessageServicePrivate& privateService, const QMessageId &messageId, const QMessageContentContainerId& id);
+ bool retrieveBody(QMessageServicePrivate& privateService, const QMessageId& id);
+ bool retrieveHeader(QMessageServicePrivate& privateService, const QMessageId& id);
+ bool exportUpdates(QMessageServicePrivate& privateService, const QMessageAccountId &id);
+
+ QByteArray attachmentContent(long int messageId, unsigned int attachmentId);
+ QString attachmentTextContent(long int messageId, unsigned int attachmentId, const QByteArray &charset);
+
+ QMessageManager::NotificationFilterId registerNotificationFilter(QMessageStorePrivate& aPrivateStore,
+ const QMessageFilter& filter);
+ void unregisterNotificationFilter(QMessageManager::NotificationFilterId notificationFilterId);
+
+ void notification(TMsvSessionEvent aEvent, TUid aMsgType, TMsvId aFolderId, TMsvId aMessageId);
+ void filterAndOrderMessagesReady(bool success, int operationId, QMessageIdList ids, int numberOfHandledFilters,
+ bool resultSetOrdered);
+
+ inline RFs& FsSession() const { return((RFs&)iFsSession); }
+
+public slots:
+ void cleanupMTMBackend();
+
+private:
+ void updateEmailAccountsL() const;
+ bool switchToMTMRootEntry(MTMType aMTMType);
+ TMsvId mtmServiceEntryIdL(MTMType aMTMType) const;
+ CBaseMtm* mtmByType(MTMType aMTMType);
+ CBaseMtm* mtmByUid(TUid aMTMUid);
+ TUid mtmUidByType(MTMType aMTMType);
+ TMsvId standardFolderId(QMessage::StandardFolder standardFolder);
+
+ QMessageFolderIdList allFolders() const;
+ QMessageFolderIdList folderIdsByAccountId(const QMessageAccountId& accountId) const;
+ QMessageFolderIdList folderIdsByServiceEntryId(const TMsvId& serviceEntryId, const TMsvId& folderServiceEntryId) const;
+ QMessageFolderId createQMessageFolderId(const TMsvId& serviceEntryId, const TMsvId& folderId) const;
+ TMsvId serviceEntryIdFromQMessageFolderId(const QMessageFolderId& folderId) const;
+ TMsvId folderIdFromQMessageFolderId(const QMessageFolderId& folderId) const;
+
+ QMessageAccountIdList accountsByType(QMessage::Type type) const;
+ QMessageAccountId accountIdByServiceId(TMsvId serviceId) const;
+
+ QMessageFolder folderL(const QMessageFolderId &id) const;
+
+ static bool accountLessThan(const QMessageAccountId accountId1, const QMessageAccountId accountId2);
+ void orderAccounts(QMessageAccountIdList& accountIds, const QMessageAccountSortOrder &sortOrder) const;
+ void applyOffsetAndLimitToAccountIds(QMessageAccountIdList& idList, int offset, int limit) const;
+ static bool folderLessThan(const QMessageFolderId folderId1, const QMessageFolderId folderId2);
+ void orderFolders(QMessageFolderIdList& folderIds, const QMessageFolderSortOrder &sortOrder) const;
+ static bool messageLessThan(const QMessage& message1, const QMessage& message2);
+ void orderMessages(QMessageIdList& messageIds, const QMessageSortOrder &sortOrder) const;
+
+ void handleNestedFiltersFromFolderFilter(QMessageFolderFilter &filter) const;
+ void handleNestedFiltersFromMessageFilter(QMessageFilter &filter) const;
+
+ void queryMessagesL(QMessageServicePrivate& privateService, const QMessageFilter &filter, const QMessageSortOrder &sortOrder, uint limit, uint offset) const;
+ void queryMessagesL(QMessageServicePrivate& privateService, const QMessageFilter &filter, const QString &body, QMessageDataComparator::MatchFlags matchFlags, const QMessageSortOrder &sortOrder, uint limit, uint offset) const;
+ void countMessagesL(QMessageServicePrivate& privateService, const QMessageFilter &filter);
+ void applyOffsetAndLimitToMsgIds(QMessageIdList& idList, int offset, int limit) const;
+
+ QMessageFolderIdList filterMessageFolders(const QMessageFolderFilter& filter, bool& filterHandled) const;
+ QMessageFolderIdList filterMessageFoldersL(const QMessageFolderFilter& filter, bool& filterHandled) const;
+ void applyOffsetAndLimitToMsgFolderIds(QMessageFolderIdList& idList, int offset, int limit) const;
+
+ bool removeMessageL(const QMessageId &id, QMessageManager::RemovalOption option);
+ void copyMessageL(TMsvId aMessageId, TMsvId aFolder);
+ QMessage messageL(const QMessageId& id) const;
+ QMessage smsMessageL(CMsvEntry& receivedEntry, long int messageId) const;
+ QMessage mmsMessageL(CMsvEntry& receivedEntry, long int messageId) const;
+ QMessage emailMessageL(CMsvEntry& receivedEntry, long int messageId) const;
+ QMessage pop3MessageL(CMsvEntry& receivedEntry, long int messageId) const;
+ QMessage imap4MessageL(CMsvEntry& receivedEntry, long int messageId) const;
+ bool composeSMSL(const QMessage &message);
+ bool composeMMSL(const QMessage &message);
+ bool composeEmailL(const QMessage &message);
+ void tryToDeliverMessageNotifications();
+ void updateMMSL(QMessage &message);
+ void updateSMSL(QMessage &message);
+ void updateEmailL(QMessage &message);
+ void showMessageL(const QMessageId &id);
+
+ void storeMMSL(QMessage &message);
+ void sendMMSL(QMessage &message);
+ void storeEmailL(QMessage &message);
+ void sendEmailL(QMessage &message);
+ void storeSMSL(QMessage &message);
+ bool validateSMS();
+ void sendSMSL(QMessage &message);
+ void retrieveL(QMessageServicePrivate& privateService, const QMessageId &messageId, const QMessageContentContainerId& id);
+ void retrieveBodyL(QMessageServicePrivate& privateService, const QMessageId& id);
+ void retrieveHeaderL(QMessageServicePrivate& privateService, const QMessageId& id);
+ void exportUpdatesL(QMessageServicePrivate& privateService, const QMessageAccountId &id);
+ void appendAttachmentToMessage(QMessage& message, QMessageContentContainer& attachment) const;
+ QByteArray attachmentContentL(long int messageId, unsigned int attachmentId);
+
+ QString privateFolderPath();
+
+ QDateTime symbianTTimetoQDateTime(const TTime& time) const;
+ TTime qDateTimeToSymbianTTime(const QDateTime& date) const;
+
+ static void cmsvEntryCleanup(TAny* aCMsvEntry);
+ CMsvEntry* retrieveCMsvEntryAndPushToCleanupStack(TMsvId id = 0) const;
+ void releaseCMsvEntryAndPopFromCleanupStack(CMsvEntry* pEntry) const;
+
+ CAsynchronousMTMOperation* createAsynchronousMTMOperation(QMessageServicePrivate& privateService,
+ CBaseMtm* mtm,
+ TMsvId serviceId);
+ void deleteAsynchronousMTMOperation(CAsynchronousMTMOperation *apOperation);
+ bool checkIfWaitingDiscardClearMessage(TMsvId aMessageId);
+
+private: // from CActive
+ void RunL();
+ void DoCancel();
+
+private: //from MMsvSessionObserver:
+ void HandleSessionEventL(TMsvSessionEvent aEvent, TAny* aArg1,
+ TAny* aArg2, TAny* aArg3);
+
+private:
+ RFs iFsSession;
+ QMessageStorePrivate* ipMessageStorePrivate;
+
+ bool iSessionReady;
+ bool iListenForNotifications;
+
+ mutable CRichText* ipRichText;
+ mutable CCharFormatLayer* ipCharFormatLayer;
+ mutable CParaFormatLayer* ipParaFormatLayer;
+
+ MTMType iMTMType;
+
+ CMsvSession* ipMsvSession;
+ CClientMtmRegistry* ipClientMtmReg;
+ CSmsClientMtm* ipSmsMtm;
+ CMmsClientMtm* ipMmsMtm;
+ CSmtpClientMtm* ipSmtpMtm;
+ CImap4ClientMtm* ipImap4Mtm;
+ CPop3ClientMtm* ipPop3Mtm;
+ TBuf<KMaxPath> iPath;
+
+ QString iSMSAccountidAsString;
+ QString iMMSAccountidAsString;
+
+ mutable RPointerArray<CMsvEntry> iCmsvEntryPoolFree;
+ mutable RPointerArray<CMsvEntry> iCmsvEntryPoolInUse;
+
+ CMsvFindOperation* ipFindOperation;
+
+ QMessageManager::NotificationFilterId _filterId;
+ QMap<QMessageManager::NotificationFilterId, QMessageFilter> _filters;
+
+ mutable QHash<QString, QMessageAccount> iAccounts;
+ mutable QMessageAccountId idefaultEmailAccountId;
+
+ int iDeliveryTriesCounter;
+ QList<MessageEvent> iUndeliveredMessageEvents;
+ RTimer iTimer; // Timer used for delaying delivering of received
+ // messages until messages are ready to be read
+ TMsvId iMessageId;
+ bool iNewMessage;
+
+ mutable int iOperationIds;
+ mutable QList<MessageQueryInfo> iMessageQueries;
+
+ mutable QMessageAccountSortOrder iCurrentAccountOrdering;
+ mutable QMessageFolderSortOrder iCurrentFolderOrdering;
+ mutable QMessageSortOrder iCurrentMessageOrdering;
+
+ friend class QMessageService;
+ friend class CMessagesFindOperation;
+ friend class CAsynchronousMTMOperation;
+};
+
+class CMessagesFindOperation : public CActive
+{
+public:
+ CMessagesFindOperation(CMTMEngine& aOwner, CMsvSession* apMsvSession, int aOperationId);
+ ~CMessagesFindOperation();
+
+ void filterAndOrderMessages(const QMessageFilter& filter,
+ const QMessageSortOrder& sortOrder,
+ const QString body = QString(),
+ QMessageDataComparator::MatchFlags matchFlags = 0);
+ void filterAndOrderMessages(const QMessageFilterPrivate::SortedMessageFilterList& filters,
+ const QMessageSortOrder& sortOrder,
+ const QString body = QString(),
+ QMessageDataComparator::MatchFlags matchFlags = 0);
+
+protected: // From CActive
+ void RunL();
+ void DoCancel();
+
+private:
+ void getAllMessagesL(const TMsvSelectionOrdering sortOrder = TMsvSelectionOrdering());
+ void getAccountSpecificMessagesL(QMessageAccount& messageAccount, const TMsvSelectionOrdering sortOrder, QMessageFilterPrivate* privateFolderFilter = NULL);
+ void getServiceSpecificMessagesL(TMsvId serviceId, const TMsvSelectionOrdering sortOrder, QMessageFilterPrivate* privateFolderFilter = NULL);
+ void getServiceSpecificMessagesFromFolderL(TMsvId serviceId, const TMsvSelectionOrdering sortOrder, TMsvId standardFolderId = NULL);
+
+private: // Data
+ CMTMEngine& iOwner;
+ CMsvSession* ipMsvSession;
+
+ int iNumberOfHandledFilters;
+ int iOperationId;
+ TMsvSelectionOrdering iOrdering;
+ bool iResultCorrectlyOrdered;
+ QMessageIdList iIdList;
+ QMessageFilterPrivate::SortedMessageFilterList iFilterList;
+
+ CMsvEntrySelection* ipEntrySelection;
+ CMsvFindOperation* ipMsvFindOperation;
+
+ mutable RTimer iTimer;
+};
+
+class QMTMWait : public CActive
+{
+public:
+ QMTMWait(TInt aPriority = EPriorityStandard);
+ ~QMTMWait();
+
+ void start();
+
+protected: // From CActive
+ void RunL();
+ void DoCancel();
+
+private: // Data
+ QEventLoop m_eventLoop;
+};
+
+class CAsynchronousMTMOperation : public CActive
+{
+public:
+ enum MTMOperation
+ {
+ MTMOperationRetrieveMessageHeader,
+ MTMOperationRetrieveMessageBody,
+ MTMOperationRetrieveMessageAttachments,
+ MTMOperationFullSync,
+ };
+
+ enum MTMOperationStep
+ {
+ MTMOperationStepConnect,
+ MTMOperationStepDoOperation,
+ MTMOperationStepDisconnect,
+ MTMOperationStepFinished
+ };
+
+ CAsynchronousMTMOperation(CMTMEngine& aParent,
+ QMessageServicePrivate& privateService,
+ CBaseMtm* mtm,
+ TMsvId serviceId,
+ TInt aOperationId);
+ ~CAsynchronousMTMOperation();
+
+ bool retrieveMessageHeader(TMsvId aMessageId);
+ bool retrieveMessageBody(TMsvId aMessageId);
+ bool retrieveMessageAttachments(TMsvId aMessageId);
+ bool doFullSync();
+
+protected: // From CActive
+ void RunL();
+ void DoCancel();
+
+private: // Data
+ CMTMEngine* ipParent;
+
+ TInt iOperationId;
+ TMsvId iServiceId;
+ TMsvId iMessageId;
+ QMessageServicePrivate* ipPrivateService;
+
+ CBaseMtm* ipMTM;
+ MTMOperation iOperation;
+ MTMOperationStep iOperationStep;
+
+ CMsvEntrySelection* ipMsvEntrySelection;
+ CMsvOperation* ipMsvOperation;
+
+ bool isActive;
+};
+
+QTM_END_NAMESPACE
+#endif // QMTMENGINE_SYMBIAN_H