diff options
Diffstat (limited to 'framework/actions')
-rw-r--r-- | framework/actions/CMakeLists.txt | 1 | ||||
-rw-r--r-- | framework/actions/action.cpp | 4 | ||||
-rw-r--r-- | framework/actions/action.h | 3 | ||||
-rw-r--r-- | framework/actions/actionbroker.cpp | 9 | ||||
-rw-r--r-- | framework/actions/actionbroker.h | 3 | ||||
-rw-r--r-- | framework/actions/actionhandler.cpp | 37 | ||||
-rw-r--r-- | framework/actions/actionhandler.h | 14 | ||||
-rw-r--r-- | framework/actions/actionresult.cpp | 20 | ||||
-rw-r--r-- | framework/actions/actionresult.h | 66 |
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 | ||
88 | void Action::execute() | 88 | ActionResult 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 | ||
24 | namespace Kube { | 25 | namespace 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 | ||
48 | Q_SIGNALS: | 49 | Q_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 | ||
57 | void ActionBroker::executeAction(const QByteArray &actionId, Context *context) | 57 | ActionResult 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 | ||
70 | void ActionBroker::registerHandler(const QByteArray &actionId, ActionHandler *handler) | 75 | void 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 @@ | |||
24 | namespace Kube { | 24 | namespace Kube { |
25 | class Context; | 25 | class Context; |
26 | class ActionHandler; | 26 | class ActionHandler; |
27 | class ActionResult; | ||
27 | 28 | ||
28 | class ActionBroker : public QObject | 29 | class 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 | ||
48 | void ActionHandler::execute(Context *context) | 48 | ActionResult 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 | ||
61 | void ActionHandler::setActionId(const QByteArray &actionId) | 68 | void 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 | ||
89 | ActionHandlerHelper::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 | |||
82 | bool ActionHandlerHelper::isActionReady(Context *context) | 97 | bool ActionHandlerHelper::isActionReady(Context *context) |
83 | { | 98 | { |
84 | return isReadyFunction(context); | 99 | return isReadyFunction(context); |
85 | } | 100 | } |
86 | 101 | ||
87 | void ActionHandlerHelper::execute(Context *context) | 102 | ActionResult 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 | ||
25 | namespace Kube { | 28 | namespace Kube { |
26 | class Context; | 29 | class 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 | |||
52 | public: | 55 | public: |
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; |
60 | private: | 65 | private: |
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 | |||
24 | namespace Kube { | ||
25 | |||
26 | struct ActionResultData | ||
27 | { | ||
28 | ActionResultData() : mError(0), mDone(false) {} | ||
29 | int mError; | ||
30 | bool mDone; | ||
31 | }; | ||
32 | |||
33 | class ActionResult : public QObject | ||
34 | { | ||
35 | Q_OBJECT | ||
36 | public: | ||
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 | |||
62 | private: | ||
63 | QSharedPointer<ActionResultData> mData; | ||
64 | }; | ||
65 | |||
66 | } | ||