summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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