summaryrefslogtreecommitdiffstats
path: root/src/libwindowmanager.cpp
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 /src/libwindowmanager.cpp
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>
Diffstat (limited to 'src/libwindowmanager.cpp')
-rw-r--r--src/libwindowmanager.cpp87
1 files changed, 87 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;
+}
+