summaryrefslogtreecommitdiffstats
path: root/framework/actions
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2016-05-03 20:24:09 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2016-05-03 20:24:26 +0200
commite06e1dad4a4570e5c1181d05ab6ed7a5d74c6c91 (patch)
treeef606d36ee693eff087292a1950fe122a7376f19 /framework/actions
parent21f7851f044cd8b6e38c821ce12d7e1b291cae27 (diff)
downloadkube-e06e1dad4a4570e5c1181d05ab6ed7a5d74c6c91.tar.gz
kube-e06e1dad4a4570e5c1181d05ab6ed7a5d74c6c91.zip
A save-as-draft action & action results
This patch introduces tracking of actions, so they can be tested. It also provides a save-as-draft action, that looks for the draft folder, and stores the mail accordingly.
Diffstat (limited to 'framework/actions')
-rw-r--r--framework/actions/CMakeLists.txt1
-rw-r--r--framework/actions/action.cpp4
-rw-r--r--framework/actions/action.h3
-rw-r--r--framework/actions/actionbroker.cpp9
-rw-r--r--framework/actions/actionbroker.h3
-rw-r--r--framework/actions/actionhandler.cpp37
-rw-r--r--framework/actions/actionhandler.h14
-rw-r--r--framework/actions/actionresult.cpp20
-rw-r--r--framework/actions/actionresult.h66
9 files changed, 144 insertions, 13 deletions
diff --git a/framework/actions/CMakeLists.txt b/framework/actions/CMakeLists.txt
index a09445b0..d757f654 100644
--- a/framework/actions/CMakeLists.txt
+++ b/framework/actions/CMakeLists.txt
@@ -3,6 +3,7 @@ set(SRCS
3 action.cpp 3 action.cpp
4 actionhandler.cpp 4 actionhandler.cpp
5 actionbroker.cpp 5 actionbroker.cpp
6 actionresult.cpp
6 context.cpp 7 context.cpp
7) 8)
8 9
diff --git a/framework/actions/action.cpp b/framework/actions/action.cpp
index e6ba2daf..28dd5e2a 100644
--- a/framework/actions/action.cpp
+++ b/framework/actions/action.cpp
@@ -85,8 +85,8 @@ bool Action::ready() const
85 return ActionBroker::instance().isActionReady(mActionId, mContext); 85 return ActionBroker::instance().isActionReady(mActionId, mContext);
86} 86}
87 87
88void Action::execute() 88ActionResult Action::execute()
89{ 89{
90 ActionBroker::instance().executeAction(mActionId, mContext); 90 return ActionBroker::instance().executeAction(mActionId, mContext);
91} 91}
92 92
diff --git a/framework/actions/action.h b/framework/actions/action.h
index b820955e..1ad4a47e 100644
--- a/framework/actions/action.h
+++ b/framework/actions/action.h
@@ -20,6 +20,7 @@
20 20
21#include <QObject> 21#include <QObject>
22#include "context.h" 22#include "context.h"
23#include "actionresult.h"
23 24
24namespace Kube { 25namespace Kube {
25 26
@@ -43,7 +44,7 @@ public:
43 44
44 bool ready() const; 45 bool ready() const;
45 46
46 Q_INVOKABLE void execute(); 47 Q_INVOKABLE ActionResult execute();
47 48
48Q_SIGNALS: 49Q_SIGNALS:
49 void readyChanged(); 50 void readyChanged();
diff --git a/framework/actions/actionbroker.cpp b/framework/actions/actionbroker.cpp
index 43a535a1..890a5566 100644
--- a/framework/actions/actionbroker.cpp
+++ b/framework/actions/actionbroker.cpp
@@ -54,17 +54,22 @@ bool ActionBroker::isActionReady(const QByteArray &actionId, Context *context)
54 return false; 54 return false;
55} 55}
56 56
57void ActionBroker::executeAction(const QByteArray &actionId, Context *context) 57ActionResult ActionBroker::executeAction(const QByteArray &actionId, Context *context)
58{ 58{
59 if (context) { 59 if (context) {
60 for (const auto handler : mHandler.values(actionId)) { 60 for (const auto handler : mHandler.values(actionId)) {
61 if (handler) { 61 if (handler) {
62 handler->execute(context); 62 //FIXME All handler together return one result
63 return handler->execute(context);
63 } 64 }
64 } 65 }
65 } else { 66 } else {
66 qWarning() << "Can't execute without context"; 67 qWarning() << "Can't execute without context";
67 } 68 }
69 ActionResult result;
70 result.setDone();
71 result.setError(1);
72 return result;
68} 73}
69 74
70void ActionBroker::registerHandler(const QByteArray &actionId, ActionHandler *handler) 75void ActionBroker::registerHandler(const QByteArray &actionId, ActionHandler *handler)
diff --git a/framework/actions/actionbroker.h b/framework/actions/actionbroker.h
index 08eac742..8f3eaeb2 100644
--- a/framework/actions/actionbroker.h
+++ b/framework/actions/actionbroker.h
@@ -24,6 +24,7 @@
24namespace Kube { 24namespace Kube {
25class Context; 25class Context;
26class ActionHandler; 26class ActionHandler;
27class ActionResult;
27 28
28class ActionBroker : public QObject 29class ActionBroker : public QObject
29{ 30{
@@ -32,7 +33,7 @@ public:
32 static ActionBroker &instance(); 33 static ActionBroker &instance();
33 34
34 bool isActionReady(const QByteArray &actionId, Context *context); 35 bool isActionReady(const QByteArray &actionId, Context *context);
35 void executeAction(const QByteArray &actionId, Context *context); 36 ActionResult executeAction(const QByteArray &actionId, Context *context);
36 37
37 void registerHandler(const QByteArray &actionId, ActionHandler *handler); 38 void registerHandler(const QByteArray &actionId, ActionHandler *handler);
38 39
diff --git a/framework/actions/actionhandler.cpp b/framework/actions/actionhandler.cpp
index d4b01734..4ae8d0a9 100644
--- a/framework/actions/actionhandler.cpp
+++ b/framework/actions/actionhandler.cpp
@@ -45,17 +45,24 @@ bool ActionHandler::isActionReady(Context *context)
45 return false; 45 return false;
46} 46}
47 47
48void ActionHandler::execute(Context *context) 48ActionResult ActionHandler::execute(Context *context)
49{ 49{
50 ActionResult result;
50 QVariant returnedValue; 51 QVariant returnedValue;
51 qWarning() << "Executing the handler"; 52 qWarning() << "Executing the handler";
52 if (context) { 53 if (context) {
54 //The base implementation to call the handler in QML
53 QMetaObject::invokeMethod(this, "handler", 55 QMetaObject::invokeMethod(this, "handler",
54 Q_RETURN_ARG(QVariant, returnedValue), 56 Q_RETURN_ARG(QVariant, returnedValue),
55 Q_ARG(QVariant, QVariant::fromValue(context))); 57 Q_ARG(QVariant, QVariant::fromValue(context)));
58 //TODO: support async handlers in QML
59 result.setDone();
56 } else { 60 } else {
57 qWarning() << "The handler didn't get a context"; 61 qWarning() << "The handler didn't get a context";
62 result.setDone();
63 result.setError(1);
58 } 64 }
65 return result;
59} 66}
60 67
61void ActionHandler::setActionId(const QByteArray &actionId) 68void ActionHandler::setActionId(const QByteArray &actionId)
@@ -79,12 +86,36 @@ ActionHandlerHelper::ActionHandlerHelper(const QByteArray &actionId, const IsRea
79 setActionId(actionId); 86 setActionId(actionId);
80} 87}
81 88
89ActionHandlerHelper::ActionHandlerHelper(const QByteArray &actionId, const IsReadyFunction &isReady, const JobHandler &handler)
90 : ActionHandler(nullptr),
91 isReadyFunction(isReady),
92 jobHandlerFunction(handler)
93{
94 setActionId(actionId);
95}
96
82bool ActionHandlerHelper::isActionReady(Context *context) 97bool ActionHandlerHelper::isActionReady(Context *context)
83{ 98{
84 return isReadyFunction(context); 99 return isReadyFunction(context);
85} 100}
86 101
87void ActionHandlerHelper::execute(Context *context) 102ActionResult ActionHandlerHelper::execute(Context *context)
88{ 103{
89 handlerFunction(context); 104 ActionResult result;
105 if (handlerFunction) {
106 handlerFunction(context);
107 result.setDone();
108 } else {
109 jobHandlerFunction(context).then<void>([=]() {
110 auto modifyableResult = result;
111 modifyableResult.setDone();
112 },
113 [=](int errorCode, const QString &string) {
114 qWarning() << "Job failed: " << errorCode << string;
115 auto modifyableResult = result;
116 modifyableResult.setError(1);
117 modifyableResult.setDone();
118 }).exec();
119 }
120 return result;
90} 121}
diff --git a/framework/actions/actionhandler.h b/framework/actions/actionhandler.h
index 1820bfd4..c8c10dc7 100644
--- a/framework/actions/actionhandler.h
+++ b/framework/actions/actionhandler.h
@@ -21,6 +21,9 @@
21#include <QObject> 21#include <QObject>
22#include <QMultiMap> 22#include <QMultiMap>
23#include <functional> 23#include <functional>
24#include <Async/Async>
25
26#include "actionresult.h"
24 27
25namespace Kube { 28namespace Kube {
26class Context; 29class Context;
@@ -36,7 +39,7 @@ public:
36 virtual bool isActionReady(Context *context); 39 virtual bool isActionReady(Context *context);
37 40
38 // void pre(Context *context); 41 // void pre(Context *context);
39 virtual void execute(Context *context); 42 virtual ActionResult execute(Context *context);
40 // void post(Context *context); 43 // void post(Context *context);
41 44
42 void setActionId(const QByteArray &); 45 void setActionId(const QByteArray &);
@@ -52,14 +55,17 @@ class ActionHandlerHelper : public ActionHandler
52public: 55public:
53 typedef std::function<bool(Context*)> IsReadyFunction; 56 typedef std::function<bool(Context*)> IsReadyFunction;
54 typedef std::function<void(Context*)> Handler; 57 typedef std::function<void(Context*)> Handler;
58 typedef std::function<KAsync::Job<void>(Context*)> JobHandler;
55 59
56 ActionHandlerHelper(const QByteArray &actionId, const IsReadyFunction &, const Handler &); 60 ActionHandlerHelper(const QByteArray &actionId, const IsReadyFunction &, const Handler &);
61 ActionHandlerHelper(const QByteArray &actionId, const IsReadyFunction &, const JobHandler &);
57 62
58 bool isActionReady(Context *context) Q_DECL_OVERRIDE; 63 bool isActionReady(Context *context) Q_DECL_OVERRIDE;
59 void execute(Context *context) Q_DECL_OVERRIDE; 64 ActionResult execute(Context *context) Q_DECL_OVERRIDE;
60private: 65private:
61 const std::function<bool(Context*)> isReadyFunction; 66 const IsReadyFunction isReadyFunction;
62 const std::function<void(Context*)> handlerFunction; 67 const Handler handlerFunction;
68 const JobHandler jobHandlerFunction;
63}; 69};
64 70
65} 71}
diff --git a/framework/actions/actionresult.cpp b/framework/actions/actionresult.cpp
new file mode 100644
index 00000000..631c61c4
--- /dev/null
+++ b/framework/actions/actionresult.cpp
@@ -0,0 +1,20 @@
1/*
2 Copyright (c) 2016 Christian Mollekopf <mollekopf@kolabsys.com>
3
4 This library is free software; you can redistribute it and/or modify it
5 under the terms of the GNU Library General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or (at your
7 option) any later version.
8
9 This library is distributed in the hope that it will be useful, but WITHOUT
10 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
12 License for more details.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to the
16 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17 02110-1301, USA.
18*/
19#include "actionresult.h"
20
diff --git a/framework/actions/actionresult.h b/framework/actions/actionresult.h
new file mode 100644
index 00000000..cdc6a160
--- /dev/null
+++ b/framework/actions/actionresult.h
@@ -0,0 +1,66 @@
1/*
2 Copyright (c) 2016 Christian Mollekopf <mollekopf@kolabsys.com>
3
4 This library is free software; you can redistribute it and/or modify it
5 under the terms of the GNU Library General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or (at your
7 option) any later version.
8
9 This library is distributed in the hope that it will be useful, but WITHOUT
10 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
12 License for more details.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to the
16 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17 02110-1301, USA.
18*/
19#pragma once
20
21#include <QObject>
22#include <QSharedPointer>
23
24namespace Kube {
25
26struct ActionResultData
27{
28 ActionResultData() : mError(0), mDone(false) {}
29 int mError;
30 bool mDone;
31};
32
33class ActionResult : public QObject
34{
35 Q_OBJECT
36public:
37 ActionResult() : QObject(), mData(new ActionResultData()) {}
38 ActionResult(const ActionResult &rhs) : QObject(), mData(rhs.mData) {}
39 ActionResult &operator=(const ActionResult &rhs)
40 {
41 mData = rhs.mData;
42 return *this;
43 }
44 virtual ~ActionResult() {}
45
46 void setDone() {
47 mData->mDone = true;
48 }
49
50 bool isDone() const {
51 return mData->mDone;
52 }
53
54 void setError(int error) {
55 mData->mError = error;
56 }
57
58 int error() const {
59 return mData->mError;
60 }
61
62private:
63 QSharedPointer<ActionResultData> mData;
64};
65
66}