summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTadao Tanikawa <tanikawa.tadao@jp.panasonic.com>2018-12-02 19:24:05 +0000
committerTadao Tanikawa <tanikawa.tadao@jp.panasonic.com>2018-12-07 00:56:46 +0000
commit0d524e0aa72c629199b5f960fc5b0e2ba390ffd3 (patch)
treea362031ebf02bdb4163d74a87637ada7fd555167
parentf427515b412094b7feb09838793ce2e48118839d (diff)
POI: new API of AGL LifeCycle Managementsandbox/ruke47/lifecycle
This is POI of new API of AGL LifeCycle Management. This patch introduces 2 API and 1 Event of Activity Management. To work on early, quick implementation put into AGL Window Manager and libwindowmanager.so so far. In long term, it would be refactored as independent service, like AGL Activity Manager. Change-Id: Id91dcab856957411230d92371b405da000ec0818 Signed-off-by: Tadao Tanikawa <tanikawa.tadao@jp.panasonic.com>
-rw-r--r--src/libwindowmanager.cpp87
-rw-r--r--src/libwindowmanager.h25
2 files changed, 112 insertions, 0 deletions
diff --git a/src/libwindowmanager.cpp b/src/libwindowmanager.cpp
index 515fea1..353951c 100644
--- a/src/libwindowmanager.cpp
+++ b/src/libwindowmanager.cpp
@@ -24,6 +24,7 @@
#include <queue>
#include <unistd.h>
#include <pthread.h>
+#include <cstring>
extern "C" {
#include <afb/afb-ws-client.h>
@@ -31,6 +32,10 @@ extern "C" {
#include <systemd/sd-event.h>
}
+static LifeCycleObserver g_lc_observer;
+struct afb_wsj1 *g_wsj1;
+struct sd_event *g_loop;
+
#define UNUSED(x) (void)(x)
namespace {
@@ -67,6 +72,7 @@ class LibWindowmanager::Impl {
void set_event_handler(enum EventType et, handler_fun func);
void setEventHandler(const WMHandler &wmh);
+
int api_call(const char *verb, json_object *object,
const std::function<void(bool, json_object *)> &onReply);
void event(char const *et, json_object *object);
@@ -225,6 +231,7 @@ int LibWindowmanager::Impl::init(int port, char const *token) {
rc = -errno;
goto fail;
}
+ g_wsj1 = this->wsj1;
this->runEventLoop();
@@ -764,6 +771,14 @@ void LibWindowmanager::Impl::setEventHandler(const WMHandler &wmh)
void LibWindowmanager::Impl::event(char const *et, json_object *object) {
TRACE();
+
+ if (!strcmp(et, "windowmanager/statusChanged")) {
+ if (g_lc_observer.on_status_changed) {
+ g_lc_observer.on_status_changed(object);
+ }
+ return;
+ }
+
auto oet = make_event_type(et);
if (!oet.first) {
HMI_ERROR("libwm", "Unknown event type string '%s'", et);
@@ -859,6 +874,7 @@ void LibWindowmanager::Impl::event(char const *et, json_object *object) {
static void *event_loop_run(void *args){
struct sd_event* loop = (struct sd_event*)(args);
+ g_loop = loop;
for(;;)
sd_event_run(loop, 30000000);
}
@@ -1044,3 +1060,74 @@ WMHandler::WMHandler()
on_flush_draw(nullptr),
on_screen_updated(nullptr)
{}
+
+void LifeCycleObserver::set_event_handler(handler_fun func) {
+ TRACE();
+ HMI_DEBUG("libwm", "called");
+ g_lc_observer.on_status_changed = std::move(func);
+}
+
+// AGL LifeCycle Management
+int LifeCycleObserver::registerActivityObserver (json_object *object) {
+ TRACE();
+ HMI_DEBUG("libwm", "called");
+ return afb_wsj1_call_j(g_wsj1, wmAPI, "registerActivityObserver", object,
+ _on_reply_static, this);
+}
+
+int LifeCycleObserver::registerActivityObserver (const char* target_id) {
+ json_object *obj = json_object_new_object();
+ json_object_object_add(obj, "target", json_object_new_string(target_id));
+ return this->registerActivityObserver(obj);
+}
+
+int LifeCycleObserver::unregisterActivityObserver (json_object *object) {
+ TRACE();
+ HMI_DEBUG("libwm", "called");
+ return afb_wsj1_call_j(g_wsj1, wmAPI, "unregisterActivityObserver", object,
+ _on_reply_static, this);
+}
+
+int LifeCycleObserver::unregisterActivityObserver (const char *target_id) {
+ json_object *obj = json_object_new_object();
+ json_object_object_add(obj, "target", json_object_new_string(target_id));
+ return this->unregisterActivityObserver(obj);
+}
+
+int LifeCycleObserver::getActivityStatus(json_object *in_obj, lcm_activity_reply on_reply_closure) {
+ TRACE();
+ HMI_DEBUG("libwm", "called");
+
+ if (nullptr == in_obj) {
+ HMI_ERROR("libwm", "Argment is NULL!");
+ return -EINVAL;
+ }
+
+ if ((nullptr == g_loop) || (nullptr == g_wsj1)) {
+ HMI_ERROR("libwm", "LibWindowmanager is not initialized!");
+ return -EPERM;
+ }
+ HMI_DEBUG("libwm", "REPLY: (2) %p", on_reply_closure);
+
+ int rc = afb_wsj1_call_j(g_wsj1, wmAPI, "getActivityStatus", in_obj,
+ [](void *closure, afb_wsj1_msg *msg)
+ {
+ lcm_activity_reply on_reply = reinterpret_cast<lcm_activity_reply>(closure);
+
+ int reply = afb_wsj1_msg_is_reply_ok(msg);
+ json_object *msg_j = afb_wsj1_msg_object_j(msg);
+ on_reply(reply, msg_j);
+ },
+ reinterpret_cast<void *>(on_reply_closure));
+ return rc;
+}
+
+int LifeCycleObserver::getActivityStatus(const char *target, lcm_activity_reply on_reply_closure) {
+ json_object *object = json_object_new_object();
+
+ json_object_object_add(object, "target", json_object_new_string(target));
+ int ret = this->getActivityStatus(object, on_reply_closure);
+
+ return ret;
+}
+
diff --git a/src/libwindowmanager.h b/src/libwindowmanager.h
index cc65136..ce5be1b 100644
--- a/src/libwindowmanager.h
+++ b/src/libwindowmanager.h
@@ -144,4 +144,29 @@ public:
private:
Impl *const d;
};
+
+
+using lcm_activity_reply = void (*)(int reply, json_object *msg_j);
+
+class LifeCycleObserver {
+ public:
+ LifeCycleObserver() : on_status_changed(nullptr) { };
+ ~LifeCycleObserver() = default;
+
+ int registerActivityObserver(const char* target_id); // AGL LifeCycle Management
+ int unregisterActivityObserver(const char* target_id);
+ int getActivityStatus(const char *target_id, lcm_activity_reply on_reply_closure);
+
+ // AGL LifeCycle Management
+ int registerActivityObserver(json_object *object);
+ int unregisterActivityObserver(json_object *object);
+ int getActivityStatus(json_object *in_obj, lcm_activity_reply on_reply_closure);
+
+ // AGL LifeCycle Management
+ using handler_fun = std::function<void(json_object *)>;
+ handler_fun on_status_changed;
+
+ void set_event_handler(handler_fun func);
+};
+
#endif // LIBWINDOWMANAGER_H