qtmobility/src/messaging/modestengine_maemo_p.h
changeset 4 90517678cc4f
parent 1 2b40d63a9c3d
child 5 453da2cfceef
--- a/qtmobility/src/messaging/modestengine_maemo_p.h	Fri Apr 16 15:51:22 2010 +0300
+++ b/qtmobility/src/messaging/modestengine_maemo_p.h	Mon May 03 13:18:40 2010 +0300
@@ -12,7 +12,7 @@
 ** You may use this file in accordance with the terms and conditions
 ** contained in the Technology Preview License Agreement accompanying
 ** this package.
-**file:///home/maminkki/sbox/qtm-messaging/src/messaging/qmtmengine_symbian_p.h
+**
 ** 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
@@ -43,45 +43,377 @@
 #define MODESTENGINE_MAEMO_H
 
 #include "qmessagemanager.h"
+#include "qmessagefilter_p.h"
+#include "qmessageservice.h"
+
 #include "gconf/gconf-client.h"
 #include "libosso.h"
 
+#include <QMap>
+#include <QString>
+#include <QDBusArgument>
+#include <QDBusPendingCallWatcher>
+#include <QFileInfoList>
+#include <QThread>
+#include <QMutex>
+#include <QEventLoop>
+
+class QDBusInterface;
+class QFileSystemWatcher;
+class QEventLoop;
+
 QTM_BEGIN_NAMESPACE
 
+typedef QMap< QString, QString > ModestStringMap;
+typedef QList< ModestStringMap > ModestStringMapList;
+
+static const int maxCacheSize = 1000;
+
 class QMessageService;
+class QMessageServicePrivate;
+class QMessageStorePrivate;
+
+struct MessageQueryInfo
+{
+    int queryId;
+    QString body;
+    QMessageDataComparator::MatchFlags matchFlags;
+    QMessageFilter filter;
+    QMessageSortOrder sortOrder;
+    int limit;
+    int offset;
+    QMessageServicePrivate* privateService;
+    QDBusPendingCallWatcher* pendingCallWatcher;
+    int currentFilterListIndex;
+    int handledFiltersCount;
+    QMessageIdList ids;
+    QString realAccountId;
+    bool isQuery;
+    bool returnWithSingleShot;
+};
+
+struct ModestUnreadMessageDBusStruct
+{
+    qlonglong timeStamp;
+    QString subject;
+};
+
+struct ModestAccountsUnreadMessagesDBusStruct
+{
+    QString accountId;
+    QString accountName;
+    QString accountProtocol;
+    qlonglong unreadCount;
+    QList<ModestUnreadMessageDBusStruct> unreadMessages;
+};
+
+struct ModestMessage
+{
+    QString id;
+    QString subject;
+    QString folder;
+    QString sender;
+    long long size;
+    bool hasAttachment;
+    bool isUnread;
+    long long timeStamp;
+};
+
+typedef enum {
+    MessagingModestMessageNotDefined  = 0,
+    MessagingModestMessageAnswered    = 1<<0,
+    MessagingModestMessageDeleted     = 1<<1,
+    MessagingModestMessageDraft       = 1<<2,
+    MessagingModestMessageFlagged     = 1<<3,
+    MessagingModestMessageSeen        = 1<<4,
+    MessagingModestMessageAttachments = 1<<5,
+    MessagingModestMessageCached      = 1<<6,
+    MessagingModestMessagePartial     = 1<<7,
+    MessagingModestMessageExpunged    = 1<<8,
+    MessagingModestMessageHasPriority = 1<<9|1<<10
+} MessagingModestMessageFlags;
+
+typedef enum {
+    MessagingModestMessagePriorityDefined   = 0,
+    MessagingModestMessageHighPriority      = 1<<9|1<<10,
+    MessagingModestMessageNormalPriority    = 0<<9|0<<10,
+    MessagingModestMessageLowPriority       = 0<<9|1<<10,
+    MessagingModestMessageSuspendedPriority = 1<<9|0<<10
+} MessagingModestMessagePriority;
 
-class ModestEngine
+struct MessagingModestMimePart
+{   
+    QString mimeType;
+    bool isAttachment;
+    QString fileName;
+    QString contentId;
+};
+
+struct MessagingModestMessage
+{
+    QString id;
+    QString url;
+    QString accountId;
+    QString folderId;
+    QString mimeType;
+    QString from;
+    QString to;
+    QString cc;
+    QString bcc;
+    QString replyTo;
+    QString subject;
+    qlonglong dateReceived;
+    qlonglong dateSent;
+    qlonglong size;
+    MessagingModestMessageFlags flags;
+    MessagingModestMessagePriority priority;
+    QList<MessagingModestMimePart> mimeParts;
+};
+
+struct INotifyEvent
+{
+    int watchDescriptor;
+    uint32_t mask;
+    QString fileName;
+};
+
+class INotifyWatcher : public QThread
 {
+    Q_OBJECT
+
 public:
+    enum FileNotification
+    {
+        FileNotificationAdded,
+        FileNotificationUpdated,
+        FileNotificationRemoved
+    };
+
+    INotifyWatcher();
+    ~INotifyWatcher();
+
+    void run();
+    int addFile(const QString& path, uint eventsToWatch = 0);
+    QStringList files() const;
+    int addDirectory(const QString& path, uint eventsToWatch = 0);
+    QStringList directories() const;
+    void clear();
+
+private slots:
+    void notifySlot();
+
+signals:
+   void fileChanged(int watchDescriptor, QString filePath, uint events);
+
+private: //Data
+    int m_inotifyFileDescriptor;
+    QMutex m_mutex;
+    QMap<int, QString> m_files;
+    QMap<int, QString> m_dirs;
+};
+
+class ModestEngine : public QObject
+{
+    Q_OBJECT
+
+public:
+    enum EmailProtocol
+    {
+        EmailProtocolUnknown = -1,
+        EmailProtocolPop3 = 1,
+        EmailProtocolIMAP,
+    };
+
+    enum NotificationType
+    {
+        None = 0,
+        Added,
+        Updated,
+        Removed
+    };
+
     static ModestEngine* instance();
 
     ModestEngine();
     ~ModestEngine();
 
+    bool exportUpdates(const QMessageAccountId &id);
+
     QMessageAccountIdList queryAccounts(const QMessageAccountFilter &filter, const QMessageAccountSortOrder &sortOrder,
                                         uint limit, uint offset, bool &isFiltered, bool &isSorted) const;
     int countAccounts(const QMessageAccountFilter &filter) const;
     QMessageAccount account(const QMessageAccountId &id) const;
-    QMessageAccountId defaultAccount(QMessage::Type type) const;
+    QMessageAccountId defaultAccount() const;
+
+    QMessageFolderIdList queryFolders(const QMessageFolderFilter &filter, const QMessageFolderSortOrder &sortOrder,
+                                      uint limit, uint offset, bool &isFiltered, bool &isSorted) const;
+    int countFolders(const QMessageFolderFilter &filter) const;
+    QMessageFolder folder(const QMessageFolderId &id) const;
+
+    QMessage message(const QMessageId &id, bool useCache = true) const;
+    bool addMessage(QMessage &message);
+    bool updateMessage(QMessage &message);
+    bool removeMessage(const QMessageId &id, QMessageManager::RemovalOption option);
 
-    bool queryMessages(QMessageService& messageService, const QMessageFilter &filter, const QMessageSortOrder &sortOrder, uint limit, uint offset) const;
-    bool queryMessages(QMessageService& messageService, const QMessageFilter &filter, const QString &body, QMessageDataComparator::MatchFlags matchFlags, const QMessageSortOrder &sortOrder, uint limit, uint offset) const;
+    bool queryMessages(QMessageService& messageService, const QMessageFilter &filter,
+                       const QMessageSortOrder &sortOrder, uint limit, uint offset) const;
+    bool queryMessages(QMessageService& messageService, const QMessageFilter &filter,
+                       const QString &body, QMessageDataComparator::MatchFlags matchFlags,
+                       const QMessageSortOrder &sortOrder, uint limit, uint offset) const;
     bool countMessages(QMessageService& messageService, const QMessageFilter &filter);
 
+    QMessageIdList queryMessagesSync(const QMessageFilter &filter, const QMessageSortOrder &sortOrder,
+                                     uint limit, uint offset, bool &isFiltered, bool &isSorted) const;
+    QMessageIdList queryMessagesSync(const QMessageFilter &filter, const QString &body,
+                                     QMessageDataComparator::MatchFlags matchFlags,
+                                     const QMessageSortOrder &sortOrder, uint limit, uint offset,
+                                     bool &isFiltered, bool &isSorted) const;
+    int countMessagesSync(const QMessageFilter &filter) const;
+
     bool sendEmail(QMessage &message);
     bool composeEmail(const QMessage &message);
+    bool showMessage(const QMessageId &id);
+
+    QMessageManager::NotificationFilterId registerNotificationFilter(QMessageStorePrivate& messageStore,
+                                                                     const QMessageFilter& filter,
+                                                                     QMessageManager::NotificationFilterId id = 0);
+    void unregisterNotificationFilter(QMessageManager::NotificationFilterId notificationFilterId);
+    QByteArray getMimePart (const QMessageId &id, const QString &attachmentId);
 
 private:
+    QFileInfoList localFolders() const;
+    void appendLocalSubFolders(QFileInfoList& fileInfoList, int startIndex) const;
+    void appendIMAPSubFolders(QFileInfoList& fileInfoList, int startIndex) const;
+    QFileInfoList accountFolders(QMessageAccountId& accountId) const;
+    QString localRootFolder() const;
+    QString accountRootFolder(QMessageAccountId& accountId) const;
+    EmailProtocol accountEmailProtocol(QMessageAccountId& accountId) const;
+    QString accountEmailProtocolAsString(const QMessageAccountId& accountId) const;
+    QString accountUsername(QMessageAccountId& accountId) const;
+    QString accountHostname(QMessageAccountId& accountId) const;
+
     void updateEmailAccounts() const;
 
+    bool filterMessage(const QMessage& message, QMessageFilterPrivate::SortedMessageFilterList filterList, int start) const;
+    bool queryAndFilterMessages(MessageQueryInfo &msgQueryInfo) const;
+    bool startQueryingAndFilteringMessages(MessageQueryInfo &msgQueryInfo) const;
+    bool searchMessages(MessageQueryInfo &msgQueryInfo, const QStringList& accountIds,
+                        const QStringList& folderUris, const QString& body,
+                        const QDateTime& startTimeStamp, const QDateTime& endTimeStamp,
+                        const QDateTime& startReceptionTimeStamp, const QDateTime& endReceptionTimeStamp) const;
+    void searchNewMessages(const QString& searchString, const QString& folderToSearch,
+                           const QDateTime& startDate, const QDateTime& endDate,
+                           int searchflags, uint minimumMessageSize) const;
+    void handleQueryFinished(int queryIndex) const;
+
+    void watchAllKnownEmailFolders();
+    void notification(const QMessageId& messageId, NotificationType notificationType) const;
+
+    QMessageAccountId accountIdFromModestMessageId(const QString& modestMessageId) const;
+    QMessageFolderId folderIdFromModestMessageId(const QString& modestMessageId,
+                                                 const QMessageAccountId accountId = QMessageAccountId()) const;
+
+    MessagingModestMessage messageFromModest(const QString& accountId,
+                                             const QString &folderId,
+                                             const QString& messageId) const;
+
+    QString modestAccountIdFromAccountId(const QMessageAccountId& accountId) const;
+    QString modestFolderIdFromFolderId(const QMessageFolderId& folderId) const;
+    QString modestFolderUriFromFolderId(const QMessageFolderId& folderId) const;
+    QString modestAccountIdFromMessageId(const QMessageId& messageId, bool checkProtocol = true) const;
+    QString modestAccountIdFromFolderId(const QMessageFolderId& folderId, bool checkProtocol = true) const;
+    QString modestFolderIdFromMessageId(const QMessageId& messageId) const;
+    QString modestMessageIdFromMessageId(const QMessageId& messageId) const;
+    void replaceProtocol(QString& id, const QString& newProtocol) const;
+    QMessageAccountId realAccountId(const MessagingModestMessage& modestMessage) const;
+    QMessageAccountId accountIdFromMessageId(const QMessageId& messageId) const;
+    QMessageAccountId accountIdFromFolderId(const QMessageFolderId& folderId) const;
+    QMessageAccountId accountIdFromModestAccountId(const QString& accountId) const;
+    QMessageFolderId folderIdFromModestFolderId(const QMessageAccountId& accountId,
+                                                bool isLocalFolder,
+                                                const QString& folderId) const;
+    QMessageId messageIdFromModestMessageId(const QString& messageId) const;
+    QMessageId messageIdFromModestMessageFilePath(const QString& messageFilePath) const;
+
+    QMessage messageFromModestMessage(const MessagingModestMessage& modestMessage,
+                                      QMessageAccountId accountId = QMessageAccountId()) const;
+    void appendAttachmentToMessage(QMessage& message, QMessageContentContainer& attachment) const;
+
+    static QString unescapeString(const QString& string);
+    static QString escapeString(const QString& string);
+
+    QMessage::StandardFolder standardFolderFromModestFolderId(const QString& modestFolderId) const;
+    QString modestFolderIdFromStandardFolder(QMessage::StandardFolder standardFolder) const;
+
+    ModestStringMap getModestSenderInfo(QMessage &message);
+    ModestStringMap getModestRecipients(QMessage &message);
+    ModestStringMap getModestMessageData(QMessage &message);
+    ModestStringMapList getModestAttachments(QMessage &message);
+    ModestStringMapList getModestImages(QMessage &message);
+    uint getModestPriority(QMessage &message);
+    ModestStringMap getModestHeaders(QMessage &message);
+
+private slots:
+    void searchMessagesHeadersReceivedSlot(QDBusMessage msg);
+    void searchMessagesHeadersFetchedSlot(QDBusMessage msg);
+    void folderUpdatedSlot(QDBusMessage msg);
+    void messageReadChangedSlot(QDBusMessage msg);
+    void pendingGetUnreadMessagesFinishedSlot(QDBusPendingCallWatcher* pendingCallWatcher);
+    void pendingSearchFinishedSlot(QDBusPendingCallWatcher* pendingCallWatcher);
+    void fileChangedSlot(int watchDescriptor, QString filePath, uint events);
+    void sendEmailCallEnded(QDBusPendingCallWatcher *watcher);
+    void addMessageCallEnded(QDBusPendingCallWatcher *watcher);
+    void stateChanged(QMessageService::State newState);
+    void returnQueryResultsSlot();
+
 private: //Data
-    GConfClient* m_gconfclient;
+    GConfClient *m_gconfclient;
+
+    QDBusInterface *m_ModestDBusInterface;
+    QDBusInterface *m_QtmPluginDBusInterface;
+
+    INotifyWatcher m_MailFoldersWatcher;
 
     mutable QHash<QString, QMessageAccount> iAccounts;
     mutable QMessageAccountId iDefaultEmailAccountId;
+
+    mutable int m_queryIds;
+    mutable QList<MessageQueryInfo> m_pendingMessageQueries;
+
+    QMap<QMessageManager::NotificationFilterId, QMessageFilter> m_filters;
+    QMessageManager::NotificationFilterId m_filterId;
+    QMessageStorePrivate* m_messageStore;
+
+    QMap<QString, QDateTime> accountsLatestTimestamp;
+
+    mutable QStringList m_latestRemoveNotifications;
+
+    mutable QMap<QString, QMessage> m_messageCache;
+
+    // Following variables are used for sync queries
+    mutable QMessageService m_service;
+    mutable QEventLoop      m_eventLoop;
+    mutable QMessageIdList  m_ids;
+    mutable int             m_count;
+    mutable bool            m_isSorted;
+    mutable bool            m_isFiltered;
 };
 
 QTM_END_NAMESPACE
 
+// Marshall the MyStructure data into a D-Bus argument
+QDBusArgument &operator<<(QDBusArgument &argument, const QtMobility::ModestStringMap &map);
+
+// Retrieve the MyStructure data from the D-Bus argument
+const QDBusArgument &operator>>(const QDBusArgument &argument, QtMobility::ModestStringMap &map);
+
+Q_DECLARE_METATYPE(QtMobility::ModestStringMap);
+Q_DECLARE_METATYPE(QtMobility::ModestStringMapList);
+Q_DECLARE_METATYPE(QtMobility::INotifyWatcher::FileNotification);
+Q_DECLARE_METATYPE(QtMobility::ModestUnreadMessageDBusStruct);
+Q_DECLARE_METATYPE(QtMobility::ModestAccountsUnreadMessagesDBusStruct);
+Q_DECLARE_METATYPE(QtMobility::ModestMessage);
+Q_DECLARE_METATYPE(QtMobility::MessagingModestMimePart);
+
 #endif // MODESTENGINE_MAEMO_H