aboutsummaryrefslogtreecommitdiffstats
path: root/src/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp85
1 files changed, 59 insertions, 26 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 8e37d10..ac3050b 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -31,10 +31,16 @@ typedef struct WMClientCtxt
{
std::string name;
std::string role;
+ void* lcm_obs_ctx; // POI: LCM
+
WMClientCtxt(const char *appName, const char* appRole)
+ : name(appName), role(appRole), lcm_obs_ctx(nullptr) {};
+ WMClientCtxt() : lcm_obs_ctx(nullptr) {};
+
+ void set_name_role(const char *appName, const char* appRole)
{
- name = appName;
- role = appRole;
+ name = appName;
+ role = appRole;
}
} WMClientCtxt;
@@ -98,28 +104,45 @@ static void cbRemoveClientCtxt(void *data)
{
return;
}
- HMI_DEBUG("remove app %s", ctxt->name.c_str());
- // Policy Manager does not know this app was killed,
- // so notify it by deactivate request.
- g_afb_instance->wmgr.api_deactivate_window(
- ctxt->name.c_str(), ctxt->role.c_str(),
- [](const char *) {});
+ if (!ctxt->name.empty()) {
+ HMI_DEBUG("remove app %s", ctxt->name.c_str());
+
+ // Policy Manager does not know this app was killed,
+ // so notify it by deactivate request.
+ g_afb_instance->wmgr.api_deactivate_window(
+ ctxt->name.c_str(), ctxt->role.c_str(),
+ [](const char *) {});
+
+ g_afb_instance->wmgr.removeClient(ctxt->name);
+ }
+
+ // POI: LCM
+ g_afb_instance->wmgr.amgr.lcm_clear_context(ctxt->lcm_obs_ctx);
- g_afb_instance->wmgr.removeClient(ctxt->name);
delete ctxt;
}
-static void createSecurityContext(afb_req_t req, const char* appid, const char* role)
+static WMClientCtxt* getWMClientContext(afb_req_t req)
{
- WMClientCtxt *ctxt = (WMClientCtxt *)afb_req_context_get(req);
- if (!ctxt)
- {
+ WMClientCtxt *ctx = static_cast<WMClientCtxt *>(afb_req_context_get(req));
+ if (!ctx) {
// Create Security Context at first time
- WMClientCtxt *ctxt = new WMClientCtxt(appid, role);
- HMI_DEBUG("create session for %s", ctxt->name.c_str());
+ ctx = new WMClientCtxt();
+ HMI_DEBUG("create session without name & role");
afb_req_session_set_LOA(req, 1);
- afb_req_context_set(req, ctxt, cbRemoveClientCtxt);
+ afb_req_context_set(req, ctx, cbRemoveClientCtxt);
+ }
+ return ctx;
+}
+
+static void createSecurityContext(afb_req_t req, const char* appid, const char* role)
+{
+ WMClientCtxt *ctx = getWMClientContext(req);
+ if (ctx && ctx->name.empty())
+ {
+ HMI_DEBUG("create session for name=\"%s\" & role=\"role\"", appid, role);
+ ctx->set_name_role(appid, role);
}
}
@@ -499,15 +522,19 @@ static void lcm_register_activity_observer (afb_req_t req)
return;
}
- // register new activity observer
- // {
- // id: "app id of target to observe",
- // type: "type of lifecycle, APP, HMI or GUI to observe",
- // filter: { states which observer wants to know }
- // }
- g_afb_instance->wmgr.amgr.api_register_activity_observer(req);
-
- afb_req_success(req, NULL, "success");
+ WMClientCtxt* wc_ctx = getWMClientContext(req);
+ if (wc_ctx == nullptr) {
+ afb_req_fail(req, "failed", "WMClientCtxt cannot create.");
+ } else {
+ // register new activity observer
+ // {
+ // id: "app id of target to observe",
+ // type: "type of lifecycle, APP, HMI or GUI to observe",
+ // filter: { states which observer wants to know }
+ // }
+ g_afb_instance->wmgr.amgr.api_register_activity_observer(req, wc_ctx->lcm_obs_ctx);
+ afb_req_success(req, NULL, "success");
+ }
}
static void lcm_unregister_activity_observer (afb_req_t req)
@@ -519,11 +546,17 @@ static void lcm_unregister_activity_observer (afb_req_t req)
return;
}
+ WMClientCtxt* wc_ctx = getWMClientContext(req);
+ if (wc_ctx == nullptr) {
+ afb_req_fail(req, "failed", "WMClientCtxt not exsit.");
+ return;
+ }
+
// unregister activity observer
// {
// id: "uniq id of observer"
// }
- g_afb_instance->wmgr.amgr.api_unregister_activity_observer(req);
+ g_afb_instance->wmgr.amgr.api_unregister_activity_observer(req, wc_ctx->lcm_obs_ctx);
afb_req_success(req, NULL, "success");
}