Add fault dead listener for watch_control 26/136326/4 accepted/tizen/3.0/common/20170630.144706 accepted/tizen/3.0/common/20170705.074718 accepted/tizen/3.0/ivi/20170630.083942 accepted/tizen/3.0/ivi/20170703.082340 accepted/tizen/3.0/ivi/20170704.221330 accepted/tizen/3.0/mobile/20170630.083846 accepted/tizen/3.0/mobile/20170703.082238 accepted/tizen/3.0/mobile/20170704.221304 accepted/tizen/3.0/tv/20170630.083904 accepted/tizen/3.0/tv/20170703.082259 accepted/tizen/3.0/tv/20170704.221317 accepted/tizen/3.0/wearable/20170630.083923 accepted/tizen/3.0/wearable/20170703.082320 accepted/tizen/3.0/wearable/20170704.221342 submit/tizen_3.0/20170630.012339 submit/tizen_3.0/20170702.230413
authorHyunho Kang <hhstark.kang@samsung.com>
Thu, 29 Jun 2017 06:08:21 +0000 (15:08 +0900)
committerHyunho Kang <hhstark.kang@samsung.com>
Thu, 29 Jun 2017 08:32:48 +0000 (08:32 +0000)
- watch_manager_add_dead_signal_listener
- watch_manager_remove_dead_signal_listener

https://review.tizen.org/gerrit/#/c/136213/ (appcore-watch)
https://review.tizen.org/gerrit/#/c/136326/ (widget-viewer)
https://review.tizen.org/gerrit/#/c/136327/ (amd)

Change-Id: I4aba3a98b89f0b4f9d699100e936702357ac7c0c
Signed-off-by: Hyunho Kang <hhstark.kang@samsung.com>
watch-control/include/watch_control.h
watch-control/src/control.c

index 0afdcc06f299f92b44a8368490a36256562dfa12..22007fe97b5170dced20dcb58c6ca22aad3743c4 100644 (file)
@@ -41,6 +41,7 @@ typedef enum {
        WATCH_CONTROL_RESUME
 } watch_control_event;
 
+typedef void (*watch_dead_signal_cb)(const char *appid, int pid, bool is_faulted, void *data);
 extern int watch_manager_init(Evas_Object *win);
 extern int watch_manager_fini();
 extern int watch_manager_get_app_control(const char *app_id, app_control_h *app_control);
@@ -48,6 +49,8 @@ extern int watch_manager_send_terminate(Evas_Object *watch);
 extern int watch_policy_set_size_hint(watch_policy_size_hint hint);
 extern int watch_manager_set_resource_id(int resource_id);
 extern int watch_manager_get_resource_id(Evas_Object *watch, int *resource_id);
+extern int watch_manager_add_dead_signal_listener(watch_dead_signal_cb cb, void *data);
+extern int watch_manager_remove_dead_signal_listener(watch_dead_signal_cb cb);
 
 /**
  * @brief Gets the opr of the Evas Object
index 7f8315502dbe5ead2f334ab7dd75ccae6fef776d..2b7f7259015f675d538b0279e8be32edb8f1f1f3 100644 (file)
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+#include <glib.h>
 #include <aul_svc.h>
 #include <bundle_internal.h>
 #include <app_control_internal.h>
@@ -56,6 +57,14 @@ static screen_connector_toolkit_evas_h __toolkit;
 static Evas_Object *__win;
 static char *__watch_appid;
 static char *viewer_appid;
+static int __is_dead_signal_connected;
+static aul_app_com_connection_h __conn_dead_signal;
+
+static GList *__dead_cbs;
+struct dead_cb_s {
+       watch_dead_signal_cb cb;
+       void *data;
+};
 
 static void __win_resized(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
@@ -257,6 +266,12 @@ API int watch_manager_fini()
                viewer_appid = NULL;
        }
 
+       if (__conn_dead_signal) {
+               if (aul_app_com_leave(__conn_dead_signal) < 0)
+                       _E("failed to leave app com endpoint dead signal");
+               __conn_dead_signal = NULL;
+       }
+
        return 0;
 }
 
@@ -498,3 +513,101 @@ API int watch_manager_get_setup_appid(const char *app_id, char **setup_appid)
        pkgmgrinfo_appinfo_destroy_appinfo(handle);
        return ret;
 }
+
+static int __dead_signal_handler(const char *endpoint, aul_app_com_result_e e, bundle *envelope, void *user_data)
+{
+       char *appid = NULL;
+       char *is_faulted = NULL;
+       char *pid_str = NULL;
+       int pid = 0;
+       struct dead_cb_s *cb_info;
+       GList *iter = __dead_cbs;
+       bool faulted = false;
+
+       bundle_get_str(envelope, AUL_K_APPID, &appid);
+       bundle_get_str(envelope, AUL_K_PID, &pid_str);
+       bundle_get_str(envelope, AUL_K_IS_FAULT, &is_faulted);
+
+       _D("appid %s pid %s is_faulted %s", appid, pid_str, is_faulted);
+       if (pid_str)
+               pid = atoi(pid_str);
+       if (is_faulted && (strcmp(is_faulted, "true") == 0))
+               faulted = true;
+
+       while (iter) {
+               cb_info = (struct dead_cb_s *)iter->data;
+               if (cb_info && cb_info->cb)
+                       cb_info->cb(appid, pid, faulted, cb_info->data);
+
+               iter = iter->next;
+       }
+
+       return 0;
+}
+
+static int __connect_dead_signal()
+{
+       if (__is_dead_signal_connected)
+               return 0;
+
+       if (aul_app_com_create("watch.dead", NULL,
+                       __dead_signal_handler, NULL, &__conn_dead_signal) < 0) {
+               _E("failed to create status");
+               return -1;
+       }
+
+       __is_dead_signal_connected = 1;
+
+       return 0;
+}
+
+API int watch_manager_add_dead_signal_listener(watch_dead_signal_cb cb, void *data)
+{
+       int ret = 0;
+       struct dead_cb_s *cb_info;
+
+       cb_info = (struct dead_cb_s *)malloc(sizeof(struct dead_cb_s));
+       if (!cb_info) {
+               _E("out of memory");
+               return -1;
+       }
+
+       cb_info->cb = cb;
+       cb_info->data = data;
+
+       __dead_cbs = g_list_append(__dead_cbs, cb_info);
+       if (!__dead_cbs) {
+               _E("out of memory");
+               free(cb_info);
+               return -1;
+       }
+
+       __connect_dead_signal();
+
+       return ret;
+}
+
+API int watch_manager_remove_dead_signal_listener(watch_dead_signal_cb cb)
+{
+       struct dead_cb_s *cb_info;
+       GList *iter = __dead_cbs;
+
+       if (!cb) {
+               _E("invalid parameter");
+               return -1;
+       }
+
+       while (iter) {
+               cb_info = (struct dead_cb_s *)iter->data;
+               if (cb_info && cb_info->cb == cb) {
+                       __dead_cbs = g_list_remove_link(__dead_cbs, iter);
+                       free(cb_info);
+                       g_list_free(iter);
+                       return 0;
+               }
+               iter = iter->next;
+       }
+
+       _E("wrong argument");
+       return -1;
+}