summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDon Sanders <don.sanders@nokia.com>2012-03-23 21:11:20 +0200
committerDon Sanders <don.sanders@nokia.com>2012-03-23 21:11:20 +0200
commitdeb7553a8e13411a66913ad2542b5c062c5b1813 (patch)
treeb73569756fb8c6bd5769d6e9787754bb83680ec0
parentaf4d8b2ba2824a4f2379330494bd2cfaecdb7348 (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.cpp245
-rw-r--r--src/libraries/qmfclient/qmailaction.h52
-rw-r--r--src/libraries/qmfclient/qmailserviceaction.cpp25
-rw-r--r--src/libraries/qmfclient/qmailserviceaction.h2
-rw-r--r--src/libraries/qmfclient/qmailserviceaction_p.h2
-rw-r--r--src/tools/messageserver/servicehandler.cpp30
-rw-r--r--src/tools/messageserver/servicehandler.h4
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;