diff -r 000000000000 -r 876b1a06bc25 src/messaging/modestengine_maemo_p.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/messaging/modestengine_maemo_p.h Wed Aug 25 15:49:42 2010 +0300 @@ -0,0 +1,465 @@ +/**************************************************************************** +** +** 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 MODESTENGINE_MAEMO_H +#define MODESTENGINE_MAEMO_H + +#include "qmessagemanager.h" +#include "qmessagefilter_p.h" +#include "qmessageservice.h" + +#include "gconf/gconf-client.h" +#include "libosso.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +class QDBusInterface; +class QFileSystemWatcher; +class QEventLoop; + +QTM_BEGIN_NAMESPACE + +typedef QMap< QString, QString > ModestStringMap; +typedef QList< ModestStringMap > ModestStringMapList; + +static const int maxCacheSize = 100000; + +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 unreadMessages; +}; + +struct ModestMessage +{ + QString id; + QString subject; + QString folder; + QString sender; + long long size; + bool hasAttachment; + bool isUnread; + long long timeStamp; +}; + +typedef enum { + MessagingModestFolderTypeUnknown, + MessagingModestFolderTypeNormal, + MessagingModestFolderTypeInbox, + MessagingModestFolderTypeOutbox, + MessagingModestFolderTypeTrash, + MessagingModestFolderTypeJunk, + MessagingModestFolderTypeSent, + MessagingModestFolderTypeRoot, + MessagingModestFolderTypeNotes, + MessagingModestFolderTypeDrafts, + MessagingModestFolderTypeContacts, + MessagingModestFolderTypeCalendar, + MessagingModestFolderTypeArchive, + MessagingModestFolderTypeMerge, + MessagingModestFolderTypeNum +} MessagingModestFolderType; + +struct MessagingModestFolder +{ + QString id; + QString modestId; + QString parentAccountId; + QString parentFolderId; + MessagingModestFolderType type; + QString name; + QString localizedName; +}; + +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 { + MessagingModestMessagePriorityNotDefined = 0, + MessagingModestMessageHighPriority = 0<<9|1<<10, + MessagingModestMessageNormalPriority = 0<<9|0<<10, + MessagingModestMessageLowPriority = 1<<9|0<<10, +} MessagingModestMessagePriority; + +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 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 m_files; + QMap 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() 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 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); + + bool retrieveBody(QMessageService& messageService, const QMessageId &id); + bool retrieve(QMessageService& messageService, const QMessageId &messageId, const QMessageContentContainerId &id, QMessage *msg = 0); + + void clearHeaderCache(); + +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; + void foldersFromModest(QList& folders) const; + bool startObservingModestFolder(const QMessageFolderId& folderId) const; + bool stopObservingModestFolder(const QMessageFolderId& folderId) 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); + + bool accountExists(const QMessageAccountId& accountId) const; + +private slots: + void searchMessagesHeadersReceivedSlot(QDBusMessage msg); + void searchMessagesHeadersFetchedSlot(QDBusMessage msg); + void mimePartDownloadFinishedSlot(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(); + void modestFolderContentsChangedSlot(QDBusMessage msg); + +private: //Data + GConfClient *m_gconfclient; + + QDBusInterface *m_ModestDBusInterface; + QDBusInterface *m_QtmPluginDBusInterface; + + INotifyWatcher m_MailFoldersWatcher; + + mutable QHash iAccounts; + mutable QMessageAccountId iDefaultEmailAccountId; + + mutable int m_queryIds; + mutable QList m_pendingMessageQueries; + + QMap m_filters; + QMessageManager::NotificationFilterId m_filterId; + QMessageStorePrivate* m_messageStore; + + QMap accountsLatestTimestamp; + + mutable QStringList m_latestAddOrRemoveNotifications; + + mutable QMap m_folderCache; + mutable QMap m_messageCache; + + mutable QMap m_pending_downloads; + + mutable QMessageFolderIdList m_observed_folders; + + // 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); +Q_DECLARE_METATYPE(QtMobility::MessagingModestFolder); + +#endif // MODESTENGINE_MAEMO_H +