diff -r 90517678cc4f -r 453da2cfceef qtmobility/src/messaging/modestengine_maemo.cpp --- a/qtmobility/src/messaging/modestengine_maemo.cpp Mon May 03 13:18:40 2010 +0300 +++ b/qtmobility/src/messaging/modestengine_maemo.cpp Fri May 14 16:41:33 2010 +0300 @@ -235,6 +235,7 @@ ModestEngine::ModestEngine() : m_queryIds(0) { + qWarning() << "ModestEngine::ModestEngine Starting to initialize"; g_type_init(); m_gconfclient = gconf_client_get_default(); if (!m_gconfclient) { @@ -243,12 +244,18 @@ updateEmailAccounts(); } + qWarning() << "ModestEngine::ModestEngine Connecting to Modest DBus Interface"; // Setup DBus Interface for Modest m_ModestDBusInterface = new QDBusInterface(MODEST_DBUS_SERVICE, MODEST_DBUS_OBJECT, MODEST_DBUS_IFACE, QDBusConnection::sessionBus(), this); + if (m_ModestDBusInterface->isValid()) { + qWarning() << "ModestEngine::ModestEngine Connected to Modest DBus Interface"; + } else { + qWarning() << "ModestEngine::ModestEngine Unable to connect to Modest DBus Interface"; + } // Get notifications of Incoming Messages m_ModestDBusInterface->connection().connect(MODEST_DBUS_SERVICE, @@ -264,6 +271,7 @@ MODEST_DBUS_SIGNAL_MSG_READ_CHANGED, this, SLOT(messageReadChangedSlot(QDBusMessage))); + qWarning() << "ModestEngine::ModestEngine Connecting to Qt Mobility Modest Plugin DBus Interface"; // Setup Qt Mobility Modest Plugin based DBus Interface for Modest m_QtmPluginDBusInterface = new QDBusInterface(MODESTENGINE_QTM_PLUGIN_NAME, MODESTENGINE_QTM_PLUGIN_PATH, @@ -271,6 +279,12 @@ QDBusConnection::sessionBus(), this); + if (m_QtmPluginDBusInterface->isValid()) { + qWarning() << "ModestEngine::ModestEngine Connected to Qt Mobility Modest Plugin DBus Interface"; + } else { + qWarning() << "ModestEngine::ModestEngine Unable to connect to Qt Mobility Modest Plugin DBus Interface"; + } + qDBusRegisterMetaType< ModestStringMap >(); qDBusRegisterMetaType< ModestStringMapList >(); @@ -298,6 +312,7 @@ connect(pendingCallWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(pendingGetUnreadMessagesFinishedSlot(QDBusPendingCallWatcher*))); + qWarning() << "ModestEngine::ModestEngine Initialized successfully"; } ModestEngine::~ModestEngine() @@ -315,6 +330,10 @@ { MessagingModestMessage modestMessage; + if (!m_QtmPluginDBusInterface->isValid() || iAccounts.isEmpty()) { + return modestMessage; + } + QDBusPendingCall pendingCall = m_QtmPluginDBusInterface->asyncCall("GetMessage", accountId, folderId, @@ -350,7 +369,7 @@ modestMessage.dateSent = 0; modestMessage.size = 0; modestMessage.flags = MessagingModestMessageNotDefined; - modestMessage.priority = MessagingModestMessagePriorityDefined; + modestMessage.priority = MessagingModestMessagePriorityNotDefined; } return modestMessage; @@ -483,6 +502,10 @@ QMessageAccountIdList accountIds; + if (!m_QtmPluginDBusInterface->isValid()) { + return accountIds; + } + updateEmailAccounts(); foreach (QMessageAccount value, iAccounts) { accountIds.append(value.id()); @@ -736,9 +759,16 @@ QMessageFolderIdList folderIds; + if (!m_QtmPluginDBusInterface->isValid()) { + return folderIds; + } + updateEmailAccounts(); - //QDBusMessage msg = m_ModestDBusInterface->call(MODEST_DBUS_METHOD_GET_FOLDERS); + if (iAccounts.isEmpty()) { + return folderIds; + } + QFileInfoList localFolders = this->localFolders(); QString localRootFolder = this->localRootFolder(); @@ -848,7 +878,7 @@ int filenameBegin = filePath.lastIndexOf('/')+1; QString fileName = filePath.mid(filenameBegin,filePath.lastIndexOf('.')-filenameBegin); - if (fileName != "summary") { + if (!fileName.endsWith("summary")) { if (events & (IN_MOVED_TO | IN_CREATE)) { if (events != (IN_MOVED_TO | IN_MOVED_FROM)) { notification(messageIdFromModestMessageFilePath(filePath), ModestEngine::Added); @@ -861,6 +891,10 @@ bool ModestEngine::sendEmail(QMessage &message) { + if (!m_QtmPluginDBusInterface->isValid() || iAccounts.isEmpty()) { + return false; + } + ModestStringMap senderInfo; ModestStringMap recipients; ModestStringMap messageData; @@ -1131,7 +1165,7 @@ QMessageContentContainerId existingBodyId(message.bodyId()); if (existingBodyId.isValid()) { - if (existingBodyId == container->bodyContentId()) { + if (existingBodyId == QMessageContentContainerPrivate::bodyContentId()) { // The body content is in the message itself container->_containingMessageId = messageId.toString(); container->_attachmentId = contentId; @@ -1164,7 +1198,7 @@ container->_charset = charset; container->_size = 0; container->_available = true; - privateMessage->_bodyId = container->bodyContentId(); + privateMessage->_bodyId = QMessageContentContainerPrivate::bodyContentId(); } else { // Add the body as the first attachment QMessageContentContainer newBody; @@ -1304,6 +1338,10 @@ bool ModestEngine::addMessage(QMessage &message) { + if (!m_QtmPluginDBusInterface->isValid() || iAccounts.isEmpty()) { + return false; + } + QString modestFolder; ModestStringMap senderInfo; ModestStringMap recipients; @@ -1420,6 +1458,10 @@ { QMessageIdList ids; + if (!m_QtmPluginDBusInterface->isValid() || iAccounts.isEmpty()) { + return ids; + } + QMessageServicePrivate* privateService = QMessageServicePrivate::implementation(m_service); if (privateService->queryMessages(m_service, filter, sortOrder, limit, offset, QMessageServicePrivate::EnginesToCallModest)) { @@ -1444,6 +1486,10 @@ { QMessageIdList ids; + if (!m_QtmPluginDBusInterface->isValid() || iAccounts.isEmpty()) { + return ids; + } + QMessageServicePrivate* privateService = QMessageServicePrivate::implementation(m_service); if (privateService->queryMessages(m_service, filter, body, matchFlags, sortOrder, limit, offset, @@ -1466,6 +1512,10 @@ { int count; + if (!m_QtmPluginDBusInterface->isValid() || iAccounts.isEmpty()) { + return 0; + } + QMessageServicePrivate* privateService = QMessageServicePrivate::implementation(m_service); if (privateService->countMessages(m_service, filter, QMessageServicePrivate::EnginesToCallModest)) { QObject::connect(&m_service, SIGNAL(stateChanged(QMessageService::State)), @@ -1500,6 +1550,10 @@ bool ModestEngine::countMessages(QMessageService& messageService, const QMessageFilter &filter) { + if (!m_QtmPluginDBusInterface->isValid() || iAccounts.isEmpty()) { + return false; + } + m_pendingMessageQueries.append(MessageQueryInfo()); MessageQueryInfo &queryInfo = m_pendingMessageQueries[m_pendingMessageQueries.count()-1]; @@ -1526,6 +1580,10 @@ QMessageDataComparator::MatchFlags matchFlags, const QMessageSortOrder &sortOrder, uint limit, uint offset) const { + if (!m_QtmPluginDBusInterface->isValid() || iAccounts.isEmpty()) { + return false; + } + m_pendingMessageQueries.append(MessageQueryInfo()); MessageQueryInfo &queryInfo = m_pendingMessageQueries[m_pendingMessageQueries.count()-1]; @@ -1543,8 +1601,28 @@ queryInfo.returnWithSingleShot = false; if (!startQueryingAndFilteringMessages(m_pendingMessageQueries[m_pendingMessageQueries.count()-1])) { - QMessageServicePrivate::implementation(messageService)->setFinished(false); m_pendingMessageQueries.removeAt(m_pendingMessageQueries.count()-1); + if (m_pendingMessageQueries.count() == 0) { + // This was last query in pending queries queue + // => Disconnect from "GetHeaders" request related DBus signals + // Note: Disconnecting signals is done to optimize signal handling + // <=> Disconnecting prevents unnecessary handling of signals + // which have been sent from other applications using + // Qt Mobility Messaging API + m_QtmPluginDBusInterface->connection().disconnect(MODESTENGINE_QTM_PLUGIN_NAME, + MODESTENGINE_QTM_PLUGIN_PATH, + MODESTENGINE_QTM_PLUGIN_NAME, + "HeadersReceived", + (ModestEngine*)this, + SLOT(searchMessagesHeadersReceivedSlot(QDBusMessage))); + + m_QtmPluginDBusInterface->connection().disconnect(MODESTENGINE_QTM_PLUGIN_NAME, + MODESTENGINE_QTM_PLUGIN_PATH, + MODESTENGINE_QTM_PLUGIN_NAME, + "HeadersFetched", + (ModestEngine*)this, + SLOT(searchMessagesHeadersFetchedSlot(QDBusMessage))); + } return false; } @@ -1657,7 +1735,9 @@ if (cmp == QMessageDataComparator::Equal) { if (pf->_value.toString().length() > 0) { accountIds.append(modestAccountIdFromAccountId(pf->_value.toString())); - msgQueryInfo.realAccountId = pf->_value.toString(); + // Local folders are not account specific + // => Make sure that account specific messages are searched from local_folders account + accountIds.append("local_folders"); handled = true; } } @@ -1705,10 +1785,23 @@ if (cmp == QMessageDataComparator::Equal) { QMessage::StandardFolder standardFolder = static_cast(pf->_value.toInt()); if (standardFolder == QMessage::SentFolder) { + // Possible "real" accountIds can be ignored in this phase + // because messages are searched from "local_folders" account + // <=> Actual account filtering is done when search from Modest + // has finished + accountIds.clear(); + + accountIds.append("local_folders"); folderUris.append("sent"); - if (accountIds.count() == 0) { - accountIds.append("local_folders"); - } + } else if (standardFolder == QMessage::DraftsFolder) { + // Possible "real" accountIds can be ignored in this phase + // because messages are searched from "local_folders" account + // <=> Actual account filtering is done when search from Modest + // has finished + accountIds.clear(); + + accountIds.append("local_folders"); + folderUris.append("drafts"); } handled = true; } @@ -1864,40 +1957,6 @@ m_messageCache.clear(); msgQueryInfo.queryId = reply.arguments().takeFirst().toInt(); } else { - // Request failed - int index = -1; - for (int i=0; i < m_pendingMessageQueries.count(); i++) { - if (m_pendingMessageQueries[i].queryId == msgQueryInfo.queryId) { - index = i; - break; - } - } - if (index > -1) { - m_pendingMessageQueries.removeAt(index); - } - msgQueryInfo.privateService->setFinished(false); - - if (m_pendingMessageQueries.count() == 0) { - // This was last query in pending queries queue - // => Disconnect from "GetHeaders" request related DBus signals - // Note: Disconnecting signals is done to optimize signal handling - // <=> Disconnecting prevents unnecessary handling of signals - // which have been sent from other applications using - // Qt Mobility Messaging API - m_QtmPluginDBusInterface->connection().disconnect(MODESTENGINE_QTM_PLUGIN_NAME, - MODESTENGINE_QTM_PLUGIN_PATH, - MODESTENGINE_QTM_PLUGIN_NAME, - "HeadersReceived", - (ModestEngine*)this, - SLOT(searchMessagesHeadersReceivedSlot(QDBusMessage))); - - m_QtmPluginDBusInterface->connection().disconnect(MODESTENGINE_QTM_PLUGIN_NAME, - MODESTENGINE_QTM_PLUGIN_PATH, - MODESTENGINE_QTM_PLUGIN_NAME, - "HeadersFetched", - (ModestEngine*)this, - SLOT(searchMessagesHeadersFetchedSlot(QDBusMessage))); - } return false; } @@ -1966,7 +2025,8 @@ modestMessage.dateSent = 0; modestMessage.size = 0; modestMessage.flags = MessagingModestMessageNotDefined; - modestMessage.priority = MessagingModestMessagePriorityDefined; + modestMessage.priority = MessagingModestMessagePriorityNotDefined; + QMapIterator j(messages[i]); while (j.hasNext()) { j.next(); @@ -2271,7 +2331,6 @@ reply.waitForFinished(); if (reply.isError()) { - qWarning () << reply.error(); return result; } @@ -2288,9 +2347,14 @@ QFile file(filePath); - if (file.open(QIODevice::ReadWrite) == false) { + QIODevice::OpenMode openMode = QIODevice::ReadOnly; + if (expunge) { + openMode = QIODevice::ReadWrite; + } + + if (file.open(openMode) == false) { qWarning() << "Failed to open file" << filePath << ": " - << file.error(); + << file.errorString(); return result; } @@ -2308,21 +2372,34 @@ void ModestEngine::notification(const QMessageId& messageId, NotificationType notificationType) const { QMessageId realMessageId = messageId; - - if (notificationType == ModestEngine::Removed) { - // Make sure that there will not be many Removed notifications - // in a row for a same message - QString modestMessageId = modestMessageIdFromMessageId(messageId); - if (!m_latestRemoveNotifications.contains(modestMessageId)) { - if (m_latestRemoveNotifications.count() > 10) { - // Remove oldest notification from the beginning of the list - m_latestRemoveNotifications.removeFirst(); + QString modestAccountId = modestAccountIdFromMessageId(messageId); + QString modestFolderId = modestFolderIdFromMessageId(messageId); + QString modestMessageId = modestMessageIdFromMessageId(messageId); + + // Make sure that there will not be many Added or Removed notifications + // in a row for the same message + // Make also sure that there will not be updated notification for a + // message that has already been notified to be removed. + QString searchId; + if (notificationType == ModestEngine::Added) { + searchId = "A"+modestAccountId+modestFolderId+modestMessageId; + } else { + searchId = "D"+modestAccountId+modestFolderId+modestMessageId; + } + if (!m_latestAddOrRemoveNotifications.contains(searchId)) { + if ((notificationType == ModestEngine::Added) || (notificationType == ModestEngine::Removed)) { + // Only Added & Removed notification will be checked + if (m_latestAddOrRemoveNotifications.count() > 10) { + // Remove the oldest notification from the beginning of the list + m_latestAddOrRemoveNotifications.removeFirst(); } // Append new notification - m_latestRemoveNotifications.append(modestMessageId); - } else { - return; + m_latestAddOrRemoveNotifications.append(searchId); } + } else { + // Add or Remove notification for the message was already handled! + // => Skip unwanted notification + return; } QMessageManager::NotificationFilterIdSet matchingFilters; @@ -2336,10 +2413,6 @@ const QMessageFilter &filter(it.value()); if (!messageRetrieved) { - QString modestAccountId = modestAccountIdFromMessageId(messageId); - QString modestFolderId = modestFolderIdFromMessageId(messageId); - QString modestMessageId = modestMessageIdFromMessageId(messageId); - MessagingModestMessage modestMessage = messageFromModest(modestAccountId, modestFolderId, modestMessageId); @@ -3127,6 +3200,11 @@ return ModestStringMap(); // stub } +void ModestEngine::clearHeaderCache() +{ + m_messageCache.clear(); +} + #include "moc_modestengine_maemo_p.cpp" QTM_END_NAMESPACE