diff options
-rw-r--r-- | src/libwindowmanager.cpp | 87 | ||||
-rw-r--r-- | src/libwindowmanager.h | 25 |
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 |