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);
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
* limitations under the License.
*/
+#include <glib.h>
#include <aul_svc.h>
#include <bundle_internal.h>
#include <app_control_internal.h>
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)
{
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;
}
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;
+}