diff options
author | Don Sanders <don.sanders@nokia.com> | 2012-03-23 21:11:20 +0200 |
---|---|---|
committer | Don Sanders <don.sanders@nokia.com> | 2012-03-23 21:11:20 +0200 |
commit | deb7553a8e13411a66913ad2542b5c062c5b1813 (patch) | |
tree | b73569756fb8c6bd5769d6e9787754bb83680ec0 | |
parent | af4d8b2ba2824a4f2379330494bd2cfaecdb7348 (diff) |
Fix NB#290380 'ServiceHandler should keep all the info about running actions'
Keep info about QMailServiceAction::Status and progress of
running actions.
Tested by starting serverobserver tool after starting a long sync,
waiting until previewing progress was > 0%, and putting some
judicious qDebugs in.
-rw-r--r-- | src/libraries/qmfclient/qmailaction.cpp | 245 | ||||
-rw-r--r-- | src/libraries/qmfclient/qmailaction.h | 52 | ||||
-rw-r--r-- | src/libraries/qmfclient/qmailserviceaction.cpp | 25 | ||||
-rw-r--r-- | src/libraries/qmfclient/qmailserviceaction.h | 2 | ||||
-rw-r--r-- | src/libraries/qmfclient/qmailserviceaction_p.h | 2 | ||||
-rw-r--r-- | src/tools/messageserver/servicehandler.cpp | 30 | ||||
-rw-r--r-- | src/tools/messageserver/servicehandler.h | 4 |
7 files changed, 337 insertions, 23 deletions
diff --git a/src/libraries/qmfclient/qmailaction.cpp b/src/libraries/qmfclient/qmailaction.cpp index 93d08577..846e3dcc 100644 --- a/src/libraries/qmfclient/qmailaction.cpp +++ b/src/libraries/qmfclient/qmailaction.cpp @@ -40,7 +40,250 @@ ****************************************************************************/ #include "qmailaction.h" +#include "qmailserviceaction.h" + +class QMailActionDataPrivate : public QSharedData +{ +public: + QMailActionDataPrivate(); + QMailActionDataPrivate(QMailActionId id, QMailServerRequestType requestType, uint current, uint total, const QMailServiceAction::Status &status); + QMailActionDataPrivate(const QMailActionDataPrivate& other); + ~QMailActionDataPrivate(); + + bool operator==(const QMailActionDataPrivate& other) const; + + template <typename Stream> + void serialize(Stream &stream) const; + + template <typename Stream> + void deserialize(Stream &stream); + + QMailActionId _id; + QMailServerRequestType _requestType; + uint _current; + uint _total; + QMailServiceAction::Status _status; +}; + +QMailActionDataPrivate::QMailActionDataPrivate() + :_id(0), + _requestType(AcknowledgeNewMessagesRequestType), + _current(0), + _total(0), + _status(QMailServiceAction::Status(QMailServiceAction::Status::ErrNoError, QString(), QMailAccountId(), QMailFolderId(), QMailMessageId())) +{ +} + +QMailActionDataPrivate::QMailActionDataPrivate(QMailActionId id, QMailServerRequestType rt, uint c, uint t, const QMailServiceAction::Status &s) + :_id(id), + _requestType(rt), + _current(c), + _total(t), + _status(s) +{ +} + +QMailActionDataPrivate::QMailActionDataPrivate(const QMailActionDataPrivate& other) + : QSharedData(other) +{ + _id = other._id; + _requestType = other._requestType; + _current = other._current; + _total = other._total; + _status = other._status; +} + +QMailActionDataPrivate::~QMailActionDataPrivate() +{ +} + +bool QMailActionDataPrivate::operator==(const QMailActionDataPrivate& other) const +{ + return (_id == other._id && + _requestType == other._requestType && + _current == other._current && + _total == other._total && + _status.errorCode == other._status.errorCode && + _status.text == other._status.text && + _status.accountId == other._status.accountId && + _status.folderId == other._status.folderId && + _status.messageId == other._status.messageId); +} + +template <typename Stream> +void QMailActionDataPrivate::serialize(Stream &stream) const +{ + stream << _id << _requestType << _current << _total << _status; +} + +template <typename Stream> +void QMailActionDataPrivate::deserialize(Stream &stream) +{ + stream >> _id >> _requestType >> _current >> _total >> _status; +} + +/*! + \class QMailActionData + + \brief The QMailActionData class provides an interface for accessing service action + data + \ingroup messaginglibrary + + \sa QMailActionInfo +*/ + +/*! + Constructs an empty QMailActionData object. +*/ +QMailActionData::QMailActionData() +{ + d = new QMailActionDataPrivate(); +} + +/*! + Constructs a QMailActionData object with the given \a id, \a requestType, + current progress \a progressCurrent, total progress \a progressTotal, + \a errorCode, \a text, \a accountId, \a folderId and \a messageId. +*/ +QMailActionData::QMailActionData(QMailActionId id, + QMailServerRequestType requestType, + uint progressCurrent, + uint progressTotal, + int errorCode, + const QString &text, + const QMailAccountId &accountId, + const QMailFolderId &folderId, + const QMailMessageId &messageId) +{ + const QMailServiceAction::Status status(QMailServiceAction::Status::ErrorCode(errorCode), text, accountId, folderId, messageId); + d = new QMailActionDataPrivate(id, requestType, progressCurrent, progressTotal, status); +} + +/*! \internal */ +QMailActionData::QMailActionData(const QMailActionData& other) +{ + this->operator=(other); +} + +/*! + Returns the action id of the QMailActionData object. +*/ +QMailActionId QMailActionData::id() const +{ + return d->_id; +} + +/*! + Returns the requestType of the QMailActionData object. +*/ +QMailServerRequestType QMailActionData::requestType() const +{ + return d->_requestType; +} + +/*! + Returns the current progress of the QMailActionData object. +*/ +uint QMailActionData::progressCurrent() const +{ + return d->_current; +} + +/*! + Returns the total (maximum) progress of the QMailActionData object. +*/ +uint QMailActionData::progressTotal() const +{ + return d->_total; +} + +/*! + Returns the status error code of the QMailActionData object. +*/ +int QMailActionData::errorCode() const +{ + return d->_status.errorCode; +} + +/*! + Returns the status text of the QMailActionData object. +*/ +QString QMailActionData::text() const +{ + return d->_status.text; +} + +/*! + Returns the account id of the QMailActionData object. +*/ +QMailAccountId QMailActionData::accountId() const +{ + return d->_status.accountId; +} + +/*! + Returns the folder id of the QMailActionData object. +*/ +QMailFolderId QMailActionData::folderId() const +{ + return d->_status.folderId; +} + +/*! + Returns the message id of the QMailActionData object. +*/ +QMailMessageId QMailActionData::messageId() const +{ + return d->_status.messageId; +} + +/*! + Destroys a QMailActionData object. +*/ +QMailActionData::~QMailActionData() +{ +} + +/*! \internal */ +const QMailActionData& QMailActionData::operator= (const QMailActionData& other) +{ + d = other.d; + return *this; +} + +/*! \internal */ +bool QMailActionData::operator== (const QMailActionData& other) const +{ + return d->operator==(*other.d); +} + +/*! \internal */ +bool QMailActionData::operator!= (const QMailActionData& other) const +{ + return !(d->operator==(*other.d)); +} + +/*! + \fn QMailActionData::serialize(Stream&) const + \internal +*/ +template <typename Stream> +void QMailActionData::serialize(Stream &stream) const +{ + d->serialize(stream); +} + +/*! + \fn QMailActionData::deserialize(Stream&) + \internal +*/ +template <typename Stream> +void QMailActionData::deserialize(Stream &stream) +{ + d->deserialize(stream); +} Q_IMPLEMENT_USER_METATYPE_ENUM(QMailServerRequestType) -Q_IMPLEMENT_USER_METATYPE_TYPEDEF(QMailActionData, QMailActionData) +Q_IMPLEMENT_USER_METATYPE(QMailActionData) Q_IMPLEMENT_USER_METATYPE_TYPEDEF(QMailActionDataList, QMailActionDataList) + diff --git a/src/libraries/qmfclient/qmailaction.h b/src/libraries/qmfclient/qmailaction.h index f8ed455f..432be1ea 100644 --- a/src/libraries/qmfclient/qmailaction.h +++ b/src/libraries/qmfclient/qmailaction.h @@ -43,7 +43,10 @@ #define QMAILACTIONFWD_H #include "qmailglobal.h" #include "qmailipc.h" -#include <QPair> +#include "qmailid.h" +#include <QString> +#include <QList> +#include <QSharedDataPointer> enum QMailServerRequestType { @@ -74,14 +77,51 @@ enum QMailServerRequestType }; typedef quint64 QMailActionId; -typedef QPair<QMailActionId, QMailServerRequestType> QMailActionData; -typedef QList<QMailActionData> QMailActionDataList; -Q_DECLARE_USER_METATYPE_ENUM(QMailServerRequestType) +class QMailActionDataPrivate; + +class QMF_EXPORT QMailActionData +{ +public: + QMailActionData(); + QMailActionData(QMailActionId id, + QMailServerRequestType requestType, + uint progressCurrent, + uint progressTotal, + int errorCode, + const QString &text, + const QMailAccountId &accountId, + const QMailFolderId &folderId, + const QMailMessageId &messageId); + QMailActionData(const QMailActionData& other); + ~QMailActionData(); + + QMailActionId id() const; + QMailServerRequestType requestType() const; + uint progressCurrent() const; + uint progressTotal() const; + int errorCode() const; + QString text() const; + QMailAccountId accountId() const; + QMailFolderId folderId() const; + QMailMessageId messageId() const; + + bool operator==(const QMailActionData& other) const; + bool operator!=(const QMailActionData& other) const; -Q_DECLARE_METATYPE(QMailActionData) -Q_DECLARE_USER_METATYPE_TYPEDEF(QMailActionData, QMailActionData) + const QMailActionData& operator=(const QMailActionData& other); + template <typename Stream> void serialize(Stream &stream) const; + template <typename Stream> void deserialize(Stream &stream); + +private: + QSharedDataPointer<QMailActionDataPrivate> d; +}; + +typedef QList<QMailActionData> QMailActionDataList; + +Q_DECLARE_USER_METATYPE_ENUM(QMailServerRequestType) +Q_DECLARE_USER_METATYPE(QMailActionData) Q_DECLARE_METATYPE(QMailActionDataList) Q_DECLARE_USER_METATYPE_TYPEDEF(QMailActionDataList, QMailActionDataList) diff --git a/src/libraries/qmfclient/qmailserviceaction.cpp b/src/libraries/qmfclient/qmailserviceaction.cpp index 9d1817cd..d7b9349e 100644 --- a/src/libraries/qmfclient/qmailserviceaction.cpp +++ b/src/libraries/qmfclient/qmailserviceaction.cpp @@ -2292,9 +2292,9 @@ QMailMessageKey QMailSearchAction::temporaryKey() \sa messagesCount() */ -QMailActionInfoPrivate::QMailActionInfoPrivate(quint64 action, QMailServerRequestType requestType, QMailActionInfo *i) +QMailActionInfoPrivate::QMailActionInfoPrivate(const QMailActionData &data, QMailActionInfo *i) : QMailServiceActionPrivate(this, i), - _requestType(requestType), + _requestType(data.requestType()), _actionCompleted(false) { // Service handler really should be sending the activity, @@ -2309,7 +2309,11 @@ QMailActionInfoPrivate::QMailActionInfoPrivate(quint64 action, QMailServerReques this, SLOT(activityCompleted(quint64))); init(); - setAction(action); + _progress = data.progressCurrent(); + _total = data.progressTotal(); + _status = QMailServiceAction::Status(QMailServiceAction::Status::ErrorCode(data.errorCode()), + data.text(), data.accountId(), data.folderId(), data.messageId()); + setAction(data.id()); } void QMailActionInfoPrivate::activityCompleted(quint64 action) @@ -2445,8 +2449,8 @@ QMailMessageId QMailActionInfoPrivate::statusMessageId() const */ /*! \internal */ -QMailActionInfo::QMailActionInfo(quint64 action, QMailServerRequestType description) - : QMailServiceAction(new QMailActionInfoPrivate(action, description, this), 0) // NB: No qobject parent! +QMailActionInfo::QMailActionInfo(const QMailActionData &data) + : QMailServiceAction(new QMailActionInfoPrivate(data, this), 0) // NB: No qobject parent! { connect(impl(this), SIGNAL(statusAccountIdChanged(QMailAccountId)), this, SIGNAL(statusAccountIdChanged(QMailAccountId))); @@ -2462,7 +2466,6 @@ QMailActionInfo::QMailActionInfo(quint64 action, QMailServerRequestType descript // Hack to get around _interface not being "ready" in the private class connect(this, SIGNAL(progressChanged(uint,uint)), impl(this), SLOT(theProgressChanged(uint,uint))); connect(this, SIGNAL(statusChanged(QMailServiceAction::Status)), impl(this), SLOT(theStatusChanged(QMailServiceAction::Status))); - } /*! @@ -2602,12 +2605,12 @@ void QMailActionObserverPrivate::actionStarted(const QMailActionData &action) QSharedPointer<QMailActionInfo> QMailActionObserverPrivate::addAction(const QMailActionData &action) { - QSharedPointer<QMailActionInfo> actionInfo(new QMailActionInfo(action.first, action.second)); - connect(actionInfo.data(), SIGNAL(activityChanged(QMailServiceAction::Activity)), - this, SLOT(anActionActivityChanged(QMailServiceAction::Activity))); - _runningActions.insert(action.first, actionInfo); + QSharedPointer<QMailActionInfo> actionInfo(new QMailActionInfo(action)); + connect(actionInfo.data(), SIGNAL(activityChanged(QMailServiceAction::Activity)), + this, SLOT(anActionActivityChanged(QMailServiceAction::Activity))); + _runningActions.insert(action.id(), actionInfo); - return actionInfo; + return actionInfo; } void QMailActionObserverPrivate::anActionActivityChanged(QMailServiceAction::Activity activity) diff --git a/src/libraries/qmfclient/qmailserviceaction.h b/src/libraries/qmfclient/qmailserviceaction.h index e38b1986..5ddf9472 100644 --- a/src/libraries/qmfclient/qmailserviceaction.h +++ b/src/libraries/qmfclient/qmailserviceaction.h @@ -322,7 +322,7 @@ signals: void totalProgressChanged(float progress); protected: friend class QMailActionObserverPrivate; - QMailActionInfo(quint64 action, QMailServerRequestType description); + QMailActionInfo(const QMailActionData &data); }; class QMailActionObserverPrivate; diff --git a/src/libraries/qmfclient/qmailserviceaction_p.h b/src/libraries/qmfclient/qmailserviceaction_p.h index 22cc9e3a..8e85a7ea 100644 --- a/src/libraries/qmfclient/qmailserviceaction_p.h +++ b/src/libraries/qmfclient/qmailserviceaction_p.h @@ -366,7 +366,7 @@ class QMailActionInfoPrivate : public QMailServiceActionPrivate { Q_OBJECT public: - QMailActionInfoPrivate(QMailActionId action, QMailServerRequestType description, QMailActionInfo *i); + QMailActionInfoPrivate(const QMailActionData &data, QMailActionInfo *i); quint64 actionId() const; QMailServerRequestType requestType() const; diff --git a/src/tools/messageserver/servicehandler.cpp b/src/tools/messageserver/servicehandler.cpp index e36505bb..bbee7d83 100644 --- a/src/tools/messageserver/servicehandler.cpp +++ b/src/tools/messageserver/servicehandler.cpp @@ -1123,10 +1123,14 @@ void ServiceHandler::dispatchRequest() data.unixTimeExpiry = QDateTime::currentDateTime().toTime_t() + ExpirySeconds; data.reported = false; data.description = request->description; - + data.progressTotal = 0; + data.progressCurrent = 0; + data.status = QMailServiceAction::Status(QMailServiceAction::Status::ErrNoError, QString(), QMailAccountId(), QMailFolderId(), QMailMessageId()); mActiveActions.insert(request->action, data); - emit actionStarted(qMakePair(request->action, request->description)); + emit actionStarted(QMailActionData(request->action, request->description, 0, 0, + data.status.errorCode, data.status.text, + data.status.accountId, data.status.folderId, data.status.messageId)); emit activityChanged(request->action, QMailServiceAction::InProgress); if ((this->*request->servicer)(request->action, request->data)) { @@ -2658,7 +2662,9 @@ void ServiceHandler::listActions() for(QMap<quint64, ActionData>::iterator i(mActiveActions.begin()) ; i != mActiveActions.end(); ++i) { - QMailActionData t = qMakePair(i.key(), i->description); + QMailActionData t(i.key(), i->description, i->progressTotal, i->progressCurrent, + i->status.errorCode, i->status.text, + i->status.accountId, i->status.folderId, i->status.messageId); list.append(t); } @@ -2668,6 +2674,10 @@ void ServiceHandler::listActions() // concurrent actions void ServiceHandler::statusChanged(const QMailServiceAction::Status s, quint64 a) { + QMap<quint64, ActionData>::iterator it = mActiveActions.find(a); + if (it != mActiveActions.end()) { + it->status = s; + } emit statusChanged(a, s); } @@ -2688,6 +2698,11 @@ void ServiceHandler::activityChanged(QMailServiceAction::Activity act, quint64 a void ServiceHandler::progressChanged(uint p, uint t, quint64 a) { + QMap<quint64, ActionData>::iterator it = mActiveActions.find(a); + if (it != mActiveActions.end()) { + it->progressCurrent = p; + it->progressTotal = t; + } emit progressChanged(a, p, t); } @@ -2990,6 +3005,10 @@ void ServiceHandler::statusChanged(const QMailServiceAction::Status status) if (QMailMessageService *service = qobject_cast<QMailMessageService*>(sender())) if (quint64 action = serviceAction(service)) { updateAction(action); + QMap<quint64, ActionData>::iterator it = mActiveActions.find(action); + if (it != mActiveActions.end()) { + it->status = status; + } reportFailure(action, status); } } @@ -2999,6 +3018,11 @@ void ServiceHandler::progressChanged(uint progress, uint total) if (QMailMessageService *service = qobject_cast<QMailMessageService*>(sender())) if (quint64 action = serviceAction(service)) { updateAction(action); + QMap<quint64, ActionData>::iterator it = mActiveActions.find(action); + if (it != mActiveActions.end()) { + it->progressCurrent = progress; + it->progressTotal = total; + } emit progressChanged(action, progress, total); } } diff --git a/src/tools/messageserver/servicehandler.h b/src/tools/messageserver/servicehandler.h index d4472718..b7b9d85d 100644 --- a/src/tools/messageserver/servicehandler.h +++ b/src/tools/messageserver/servicehandler.h @@ -302,6 +302,10 @@ private: CompletionSignal completion; uint unixTimeExpiry; bool reported; + // Fields for QMailActionInfo + uint progressTotal; + uint progressCurrent; + QMailServiceAction::Status status; }; QMap<quint64, ActionData> mActiveActions; |