diff -r 000000000000 -r 876b1a06bc25 src/messaging/qmessageservice_maemo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/messaging/qmessageservice_maemo.cpp Wed Aug 25 15:49:42 2010 +0300 @@ -0,0 +1,623 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ +#include "qmessageservice.h" +#include "qmessageservice_maemo_p.h" + +#include "maemohelpers_p.h" +#include "modestengine_maemo_p.h" +#include "telepathyengine_maemo_p.h" +#include "eventloggerengine_maemo_p.h" +#include +#include "hildon-uri.h" + +QTM_BEGIN_NAMESPACE +#define EVENTLOGGER_THREAD + + +QMessageServicePrivate::QMessageServicePrivate(QMessageService* parent) + : q_ptr(parent), + _state(QMessageService::InactiveState), + _error(QMessageManager::NoError), + _active(false), _actionId(-1), + _pendingRequestCount(0) +{ +#ifdef EVENTLOGGER_THREAD + connect(EventLoggerEngine::instance(),SIGNAL(messagesFound(const QMessageIdList &,bool,bool)),this,SLOT(messagesFound(const QMessageIdList &,bool,bool))); + +#endif +} + +QMessageServicePrivate::~QMessageServicePrivate() +{ +} + +QMessageServicePrivate* QMessageServicePrivate::implementation(const QMessageService &service) +{ + return service.d_ptr; +} + +bool QMessageServicePrivate::queryMessages(QMessageService &messageService, + const QMessageFilter &filter, + const QMessageSortOrder &sortOrder, + uint limit, uint offset, + EnginesToCall enginesToCall) +{ + if (_active) { + return false; + } + + _filter = filter; + MessagingHelper::handleNestedFiltersFromMessageFilter(_filter); + + _ids.clear(); + _sorted = true; + _filtered = true; + + _active = true; + _error = QMessageManager::NoError; + + _pendingRequestCount = 0; + + if (enginesToCall & EnginesToCallTelepathy) { +#ifndef EVENTLOGGER_THREAD + _ids = EventLoggerEngine::instance()->filterAndOrderMessages(filter,sortOrder,QString(),QMessageDataComparator::MatchFlags()); + QMetaObject::invokeMethod(this, "messagesFoundSlot", Qt::QueuedConnection); +#else + EventLoggerEngine::instance()->filterMessages(_filter,sortOrder,QString(),QMessageDataComparator::MatchFlags()); +#endif + _pendingRequestCount++; + } + + if (enginesToCall & EnginesToCallModest) { + if (ModestEngine::instance()->queryMessages(messageService, _filter, sortOrder, limit, offset)) { + _pendingRequestCount++; + } + } + + if (_pendingRequestCount > 0) { + _sortOrder = sortOrder; + _limit = limit; + _offset = offset; + + stateChanged(QMessageService::ActiveState); + } else { + _filter = QMessageFilter(); + setFinished(false); + } + + return _active; +} + +bool QMessageServicePrivate::queryMessages(QMessageService &messageService, + const QMessageFilter &filter, + const QString &body, + QMessageDataComparator::MatchFlags matchFlags, + const QMessageSortOrder &sortOrder, + uint limit, uint offset, + EnginesToCall enginesToCall) +{ + if (_active) { + return false; + } + + _filter = filter; + MessagingHelper::handleNestedFiltersFromMessageFilter(_filter); + + _ids.clear(); + _sorted = true; + _filtered = true; + + _active = true; + _error = QMessageManager::NoError; + + _pendingRequestCount = 0; + + if (enginesToCall & EnginesToCallTelepathy) { +#ifndef EVENTLOGGER_THREAD + _ids= EventLoggerEngine::instance()->filterAndOrderMessages(filter,sortOrder,body,matchFlags); + QMetaObject::invokeMethod(this, "messagesFoundSlot", Qt::QueuedConnection); +#else + EventLoggerEngine::instance()->filterMessages(_filter,sortOrder,body,matchFlags); +#endif + _pendingRequestCount++; + } + + if (enginesToCall & EnginesToCallModest) { + if (ModestEngine::instance()->queryMessages(messageService, _filter, body, matchFlags, + sortOrder, limit, offset)) { + _pendingRequestCount++; + } + } + + if (_pendingRequestCount > 0) { + _sortOrder = sortOrder; + _limit = limit; + _offset = offset; + + stateChanged(QMessageService::ActiveState); + } else { + _filter = QMessageFilter(); + setFinished(false); + } + + return _active; +} + +bool QMessageServicePrivate::countMessages(QMessageService &messageService, + const QMessageFilter &filter, + EnginesToCall enginesToCall) +{ + if (_active) { + return false; + } + + QMessageFilter handledFilter = filter; + MessagingHelper::handleNestedFiltersFromMessageFilter(handledFilter); + + _count = 0; + + _active = true; + _error = QMessageManager::NoError; + + _pendingRequestCount = 0; + + //TODO: SMS count support + //if (enginesToCall & EnginesToCallTelepathy) { + //} + + if (enginesToCall & EnginesToCallModest) { + if (ModestEngine::instance()->countMessages(messageService, handledFilter)) { + _pendingRequestCount++; + } + } + + if (_pendingRequestCount > 0) { + stateChanged(QMessageService::ActiveState); + } else { + setFinished(false); + } + + return _active; +} + + +void QMessageServicePrivate::setFinished(bool successful) +{ + if (!successful && _pendingRequestCount > 0) { + _pendingRequestCount--; + } + + if (_pendingRequestCount == 0) { + if (!successful && (_error == QMessageManager::NoError)) { + // We must report an error of some sort + _error = QMessageManager::RequestIncomplete; + } + + _active = false; + stateChanged(QMessageService::FinishedState); + } +} + +void QMessageServicePrivate::stateChanged(QMessageService::State state) +{ + _state = state; + emit q_ptr->stateChanged(_state); +} + +void QMessageServicePrivate::messagesFound(const QMessageIdList &ids, bool isFiltered, bool isSorted) +{ + _pendingRequestCount--; + + if (!isFiltered) { + _filtered = false; + } + + if (!isSorted) { + _sorted = false; + } else { + if ((ids.count() > 0) && (_ids.count() > 0)) { + _sorted = false; + } + } + + _ids.append(ids); + + if (_pendingRequestCount == 0) { + if (!_filtered) { + MessagingHelper::filterMessages(_ids, _filter); + } + if (!_sorted) { + MessagingHelper::orderMessages(_ids, _sortOrder); + } + MessagingHelper::applyOffsetAndLimitToMessageIdList(_ids, _limit, _offset); + + ModestEngine::instance()->clearHeaderCache(); + + emit q_ptr->messagesFound(_ids); + + setFinished(true); + + _ids.clear(); + _filter = QMessageFilter(); + _sortOrder = QMessageSortOrder(); + } +} + +void QMessageServicePrivate::messagesCounted(int count) +{ + _pendingRequestCount--; + + _count += count; + + if (_pendingRequestCount == 0) { + ModestEngine::instance()->clearHeaderCache(); + + emit q_ptr->messagesCounted(_count); + + setFinished(true); + + _count = 0; + } +} + +void QMessageServicePrivate::progressChanged(uint value, uint total) +{ + emit q_ptr->progressChanged(value, total); +} + +void QMessageServicePrivate::messagesFoundSlot() +{ + messagesFound(QMessageIdList(), true, false); +} + +void QMessageServicePrivate::messagesCountedSlot() +{ + messagesCounted(0); +} + + +QMessageService::QMessageService(QObject *parent) + : QObject(parent), + d_ptr(new QMessageServicePrivate(this)) +{ + EventLoggerEngine::instance(); + TelepathyEngine::instance(); +} + +QMessageService::~QMessageService() +{ +} + +bool QMessageService::queryMessages(const QMessageFilter &filter, const QMessageSortOrder &sortOrder, uint limit, uint offset) +{ + return d_ptr->queryMessages(*this, filter, sortOrder, limit, offset); +} + +bool QMessageService::queryMessages(const QMessageFilter &filter, const QString &body, QMessageDataComparator::MatchFlags matchFlags, const QMessageSortOrder &sortOrder, uint limit, uint offset) +{ + return d_ptr->queryMessages(*this, filter, body, matchFlags, sortOrder, limit, offset); +} + +bool QMessageService::countMessages(const QMessageFilter &filter) +{ + return d_ptr->countMessages(*this, filter); +} + +bool QMessageService::send(QMessage &message) +{ + qDebug() << "QMessageService::send"; + if (d_ptr->_active) { + return false; + } + + d_ptr->_active = true; + d_ptr->_error = QMessageManager::NoError; + + bool retVal = true; + + d_ptr->_state = QMessageService::ActiveState; + emit stateChanged(d_ptr->_state); + + QMessageAccountId accountId = message.parentAccountId(); + QMessage::Type msgType = QMessage::NoType; + + // Check message type + if (message.type() == QMessage::AnyType || message.type() == QMessage::NoType) { + QMessage::TypeFlags types = QMessage::NoType; + if (accountId.isValid()) { + // ParentAccountId was defined => Message type can be read + // from parent account + QMessageAccount account = QMessageAccount(accountId); + QMessage::TypeFlags types = account.messageTypes(); + if (types & QMessage::Sms) { + msgType = QMessage::Sms; + } else if (account.messageTypes() & QMessage::InstantMessage) { + msgType = QMessage::InstantMessage; + } else if (types & QMessage::Mms) { + msgType = QMessage::Mms; + } else if (types & QMessage::Email) { + msgType = QMessage::Email; + } + } + if (msgType == QMessage::NoType) { + d_ptr->_error = QMessageManager::ConstraintFailure; + retVal = false; + } + } + + if (retVal) { + // Check account + if (!accountId.isValid()) { + accountId = QMessageAccount::defaultAccount(message.type()); + if (!accountId.isValid()) { + d_ptr->_error = QMessageManager::InvalidId; + retVal = false; + } + } + } + + QMessageAccount account(accountId); + if (retVal) { + // Check account/message type compatibility + if (!(account.messageTypes() & message.type()) && (msgType == QMessage::NoType)) { + d_ptr->_error = QMessageManager::ConstraintFailure; + retVal = false; + } + } + + if (retVal) { + // Check recipients + QMessageAddressList recipients = message.to() + message.bcc() + message.cc(); + if (recipients.isEmpty()) { + d_ptr->_error = QMessageManager::ConstraintFailure; + retVal = false; + } + } + + if (retVal) { + QMessage outgoing(message); + + // Set default account if unset + if (!outgoing.parentAccountId().isValid()) { + outgoing.setParentAccountId(accountId); + } + + if (account.messageTypes() & QMessage::Sms) { + retVal = TelepathyEngine::instance()->sendMessage(outgoing); + } else if (account.messageTypes() & QMessage::InstantMessage) { + retVal = TelepathyEngine::instance()->sendMessage(outgoing); + } else if (account.messageTypes() & QMessage::Mms) { + d_ptr->_error = QMessageManager::NotYetImplemented; + qWarning() << "QMessageService::send not yet implemented for MMS"; + retVal = false; + } else if (account.messageTypes() & QMessage::Email) { + retVal = ModestEngine::instance()->sendEmail(message); + } + } + + d_ptr->setFinished(retVal); + qDebug() << "send returns=" << retVal; + return retVal; +} + +bool QMessageService::compose(const QMessage &message) +{ + // qDebug() << "qMessageService::compose"; + if (d_ptr->_active) { + return false; + } + + d_ptr->_active = true; + d_ptr->_error = QMessageManager::NoError; + + bool retVal=false; + d_ptr->_state = QMessageService::ActiveState; + emit stateChanged(d_ptr->_state); + qDebug() << "qMessageService::compose stateChanged"; + + if (message.type() == QMessage::Sms && !message.to().isEmpty() && !message.to().first().addressee().isEmpty()) { + QUrl smsUrl((QString("sms:%1").arg(message.to().first().addressee()))); + smsUrl.addQueryItem("body",message.textContent()); + // qDebug() << "compose SMS url=" << smsUrl.toString(); + hildon_uri_open(smsUrl.toString().toStdString().c_str(),NULL,NULL); + retVal = true; + + + } else if (message.type() == QMessage::Mms) { + d_ptr->_error = QMessageManager::NotYetImplemented; //TODO: + qWarning() << "QMessageService::compose not yet implemented for MMS"; + retVal = false; + } else if (message.type() == QMessage::Email) { + retVal = ModestEngine::instance()->composeEmail(message); + } + + d_ptr->setFinished(retVal); + // qDebug() << "compose returns=" << retVal; + return retVal; +} + + + +bool QMessageService::retrieveHeader(const QMessageId& id) +{ + Q_UNUSED(id) + return false; // stub +} + +bool QMessageService::retrieveBody(const QMessageId& id) +{ + if (d_ptr->_active) { + return false; + } + + if (!id.isValid()) { + d_ptr->_error = QMessageManager::InvalidId; + return false; + } + + d_ptr->_active = true; + d_ptr->_error = QMessageManager::NoError; + + bool retVal = true; + d_ptr->stateChanged(QMessageService::ActiveState); + + if (id.toString().startsWith("MO_")) { + retVal = ModestEngine::instance()->retrieveBody(*this, id); + if (retVal == true) { + d_ptr->_pendingRequestCount = 1; + } + } else { + retVal = false; + } + + if (retVal == false) { + d_ptr->setFinished(retVal); + } + + return retVal; +} + +bool QMessageService::retrieve(const QMessageId &messageId, const QMessageContentContainerId& id) +{ + if (d_ptr->_active) { + return false; + } + + if (!id.isValid()) { + d_ptr->_error = QMessageManager::InvalidId; + return false; + } + + d_ptr->_active = true; + d_ptr->_error = QMessageManager::NoError; + + bool retVal = true; + d_ptr->stateChanged(QMessageService::ActiveState); + + if (messageId.toString().startsWith("MO_")) { + retVal = ModestEngine::instance()->retrieve(*this, messageId, id, NULL); + if (retVal == true) { + d_ptr->_pendingRequestCount = 1; + } + } else { + retVal = false; + } + + if (retVal == false) { + d_ptr->setFinished(retVal); + } + + return retVal; +} + +bool QMessageService::show(const QMessageId& id) +{ + if (d_ptr->_active) { + return false; + } + + if (!id.isValid()) { + d_ptr->_error = QMessageManager::InvalidId; + return false; + } + + d_ptr->_active = true; + d_ptr->_error = QMessageManager::NoError; + + bool retVal = true; + d_ptr->_state = QMessageService::ActiveState; + emit stateChanged(d_ptr->_state); + + if (id.toString().startsWith("MO_")) { + retVal = ModestEngine::instance()->showMessage(id); + } else { + retVal = false; + } + + d_ptr->setFinished(retVal); + return retVal; +} + +bool QMessageService::exportUpdates(const QMessageAccountId &id) +{ + if (d_ptr->_active) { + return false; + } + + if (!id.isValid()) { + d_ptr->_error = QMessageManager::InvalidId; + return false; + } + + d_ptr->_active = true; + d_ptr->_error = QMessageManager::NoError; + + bool retVal = true; + d_ptr->_state = QMessageService::ActiveState; + emit stateChanged(d_ptr->_state); + + if (id.toString().startsWith("MO_")) { + retVal = ModestEngine::instance()->exportUpdates(id); + } else { + retVal = false; + } + + d_ptr->setFinished(retVal); + return retVal; +} + +QMessageService::State QMessageService::state() const +{ + return d_ptr->_state; +} + +void QMessageService::cancel() +{ +} + +QMessageManager::Error QMessageService::error() const +{ + return d_ptr->_error; +} + +#include "moc_qmessageservice_maemo_p.cpp" + +QTM_END_NAMESPACE