From: Jeonghoon Park Date: Mon, 18 Jun 2018 10:25:54 +0000 (+0900) Subject: update worker lib APIs to encapsulting report sturcture X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F02%2F181802%2F3;p=apps%2Fnative%2Ftizen-things-daemon.git update worker lib APIs to encapsulting report sturcture Change-Id: I1218e89196680bb9a64aaf54c3c9f265bc140f32 --- diff --git a/common/common-worker-inf-dbus.xml b/common/common-worker-inf-dbus.xml index eb6e2d4..6677eb3 100644 --- a/common/common-worker-inf-dbus.xml +++ b/common/common-worker-inf-dbus.xml @@ -10,6 +10,7 @@ + diff --git a/lib/things-service-worker/include/ttd-worker-lib.h b/lib/things-service-worker/include/ttd-worker-lib.h index 351c060..3b2992c 100644 --- a/lib/things-service-worker/include/ttd-worker-lib.h +++ b/lib/things-service-worker/include/ttd-worker-lib.h @@ -20,20 +20,47 @@ #define __TTD_WORKER_LIB_H__ typedef enum { - TTD_WORKER_SUBMIT_SUCCESS, - TTD_WORKER_SUBMIT_FAIL, + TTD_WORKER_SUBMIT_SUCCESS = 0, + TTD_WORKER_SUBMIT_FAIL = -1, } ttd_worker_submit_result_e; typedef enum { + TTD_WORKER_STATE_UNKNOWN = -1, TTD_WORKER_WORKING, TTD_WORKER_COMPLETED, TTD_WORKER_FAILED, } ttd_worker_working_state_e; -typedef void(*ttd_worker_submit_report_completed_cb)(ttd_worker_submit_result_e result, void *user_data); +typedef struct _ttd_worker_report_s ttd_worker_report; -int ttd_worker_submit_report(const char *report, ttd_worker_working_state_e working_state, - ttd_worker_submit_report_completed_cb completed_cb, void *completed_cb_data); -int ttd_worker_submit_report_sync(const char *report, ttd_worker_working_state_e working_state); +typedef void (*ttd_worker_submit_report_completed_cb) +(ttd_worker_submit_result_e result, ttd_worker_report *report, void *user_data); + +ttd_worker_report *ttd_worker_report_new(void); +ttd_worker_report *ttd_worker_report_new_by_cmd_id(const char *cmd_id); + +void ttd_worker_report_free(ttd_worker_report *report); + +int ttd_worker_report_set_cmd_id( + ttd_worker_report *report, const char *cmd_id); +int ttd_worker_report_set_working_state( + ttd_worker_report *report, ttd_worker_working_state_e state); +/* report_data should be JSON format */ +int ttd_worker_report_set_report_data( + ttd_worker_report *report, const char *report_data); + +int ttd_worker_report_get_cmd_id( + ttd_worker_report *report, const char **cmd_id); +int ttd_worker_report_get_working_state( + ttd_worker_report *report, ttd_worker_working_state_e *state); +int ttd_worker_report_get_report_data( + ttd_worker_report *report, const char **report_data); + +int ttd_worker_submit_report(ttd_worker_report *report, + ttd_worker_submit_report_completed_cb completed_cb, + void *completed_cb_data); + +int ttd_worker_submit_report_sync( + ttd_worker_report *report, ttd_worker_submit_result_e *result); #endif /* __TTD_WORKER_LIB_H__ */ diff --git a/lib/things-service-worker/src/ttd-worker-lib.c b/lib/things-service-worker/src/ttd-worker-lib.c index 2adec26..2cfc86c 100644 --- a/lib/things-service-worker/src/ttd-worker-lib.c +++ b/lib/things-service-worker/src/ttd-worker-lib.c @@ -24,83 +24,110 @@ #include "common-worker-inf-def.h" #include "common-worker-inf-dbus.h" +struct _ttd_worker_report_s { + ttd_worker_submit_report_completed_cb completed_cb; + void *completed_cb_data; + char *cmd_id; + char *report_json; + ttd_worker_working_state_e state; +}; + typedef struct { GCancellable *cancellable; TtdWorkerDbus *dbus_object; - ttd_worker_submit_report_completed_cb completed_cb; - void *completed_cb_data; -} dbus_h; + unsigned int ref_count; +} worker_dbus_handle; -static dbus_h *__make_dbus_connection(void); -static void __destroy_dbus_connection(dbus_h *h); -static void __submit_completed_cb(GObject *source_object, GAsyncResult *res, gpointer user_data); +static worker_dbus_handle *g_dbus_handle = NULL; -static void __destroy_dbus_connection(dbus_h *h) +static void __free_dbus_handle(worker_dbus_handle *handle) { - _D("Destory the DBus Connection"); - if (!h) + if (!handle) return; - if (h->cancellable) { - g_cancellable_cancel(h->cancellable); - g_object_unref(h->cancellable); + if (handle->cancellable) { + g_cancellable_cancel(handle->cancellable); + g_object_unref(handle->cancellable); } - if (h->dbus_object) - g_object_unref(h->dbus_object); + if (handle->dbus_object) + g_object_unref(handle->dbus_object); + + g_free(handle); +} + +static void __unref_dbus_connection(void) +{ + _D("Destory the DBus Connection"); + + if (!g_dbus_handle) + return; + + g_dbus_handle->ref_count--; - g_free(h); + if (!g_dbus_handle->ref_count) { + __free_dbus_handle(g_dbus_handle); + g_dbus_handle = NULL; + } } -static dbus_h *__make_dbus_connection(void) +static int __ref_dbus_connection(void) { - dbus_h *h = NULL; + worker_dbus_handle *handle = NULL; GError *error = NULL; - _D("Make the DBus Connection"); + if (g_dbus_handle) { + g_dbus_handle->ref_count++; + _D("DBus ref count : %u", g_dbus_handle->ref_count); + return 0; + } - h = g_try_malloc0(sizeof(dbus_h)); - if (!h) - return NULL; + _D("Make a new DBus Connection"); + + handle = g_try_malloc0(sizeof(worker_dbus_handle)); + if (!handle) + return -1; - h->cancellable = g_cancellable_new(); + handle->cancellable = g_cancellable_new(); - h->dbus_object = ttd_worker_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM, + handle->dbus_object = + ttd_worker_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE, TTD_WORKER_DBUS_NAME, TTD_WORKER_DBUS_OBJECT_PATH, - h->cancellable, + handle->cancellable, &error); - if (!h->dbus_object) { + if (!handle->dbus_object) { _E("Fail to create the proxy object because of %s", error->message); g_error_free(error); - __destroy_dbus_connection(h); - return NULL; + error = NULL; + __free_dbus_handle(handle); + return -1; } - return h; + g_dbus_handle = handle; + g_dbus_handle->ref_count = 1; + _D("DBus ref count : %u", g_dbus_handle->ref_count); + + return 0; } -static void __submit_completed_cb(GObject *source_object, GAsyncResult *res, gpointer user_data) +static void __submit_completed_cb( + GObject *source_object, GAsyncResult *res, gpointer user_data) { - GError *g_error = NULL; - dbus_h *h = user_data; + GError *error = NULL; + ttd_worker_report *report = user_data; gint ret_val = -1; gboolean ret = FALSE; ttd_worker_submit_result_e result; _D("Send completed"); - - if (h == NULL) { - _E("There's no user_data for dbus_h"); - return; - } - - ret = ttd_worker_dbus_call_ttd_worker_submit_report_finish(h->dbus_object, &ret_val, res, &g_error); + ret = ttd_worker_dbus_call_ttd_worker_submit_report_finish( + g_dbus_handle->dbus_object, &ret_val, res, &error); if (!ret) { - _E("DBus proxy call is failed[%s]", g_error->message); + _E("DBus proxy call is failed[%s]", error->message); result = TTD_WORKER_SUBMIT_FAIL; - g_error_free(g_error); + g_error_free(error); } else { if (ret_val < 0) { _E("Submit report is failed"); @@ -109,67 +136,199 @@ static void __submit_completed_cb(GObject *source_object, GAsyncResult *res, gpo result = TTD_WORKER_SUBMIT_SUCCESS; } - if (h->completed_cb) - h->completed_cb(result, h->completed_cb_data); + if (report && report->completed_cb) + report->completed_cb(result, report, report->completed_cb_data); +} + +void __free_report(ttd_worker_report *report) +{ + if (!report) + return; - __destroy_dbus_connection(h); + g_free(report->cmd_id); + g_free(report->report_json); + g_free(report); } -int ttd_worker_submit_report(const char *report, ttd_worker_working_state_e working_state, - ttd_worker_submit_report_completed_cb completed_cb, void *user_data) +ttd_worker_report *__alloc_new_report(void) { - dbus_h *h = NULL; + ttd_worker_report *re = NULL; - h = __make_dbus_connection(); - if (!h) { - _E("Failed to make dbus connection"); - return -1; + re = g_try_malloc0(sizeof(ttd_worker_report)); + retvm_if(!re, NULL, "failed to alloc report"); + + re->state = TTD_WORKER_STATE_UNKNOWN; + + if (__ref_dbus_connection()) { + __free_report(re); + return NULL; } - h->completed_cb = completed_cb; - h->completed_cb_data = user_data; + return re; +} + +ttd_worker_report *ttd_worker_report_new(void) +{ + return __alloc_new_report(); +} + +ttd_worker_report *ttd_worker_report_new_by_cmd_id(const char *cmd_id) +{ + ttd_worker_report *report = NULL; + + report = __alloc_new_report(); + if (report) + report->cmd_id = g_strdup(cmd_id); + + return report; +} + +void ttd_worker_report_free(ttd_worker_report *report) +{ + __free_report(report); + __unref_dbus_connection(); +} + +int ttd_worker_report_set_cmd_id(ttd_worker_report *report, const char *cmd_id) +{ + retvm_if(!report, -1, "report is NULL"); + + g_free(report->cmd_id); + + if (cmd_id) + report->cmd_id = g_strdup(cmd_id); + else + _D("unset cmd id"); + + return 0; +} + +int ttd_worker_report_set_working_state( + ttd_worker_report *report, ttd_worker_working_state_e state) +{ + retvm_if(!report, -1, "report is NULL"); + + report->state = state; + + return 0; +} + +/* report_data should be JSON format */ +int ttd_worker_report_set_report_data( + ttd_worker_report *report, const char *report_data) +{ + retvm_if(!report, -1, "report is NULL"); + + g_free(report->report_json); + + if (report_data) + report->report_json = g_strdup(report_data); + else + _D("unset report_json"); + + return 0; +} + +int ttd_worker_report_get_cmd_id( + ttd_worker_report *report, const char **cmd_id) +{ + retvm_if(!report, -1, "report is NULL"); + retvm_if(!cmd_id, -1, "cmd_id is NULL"); - ttd_worker_dbus_call_ttd_worker_submit_report(h->dbus_object, - report, - working_state, - h->cancellable, + *cmd_id = (const char *)report->cmd_id; + + return 0; +} + +int ttd_worker_report_get_working_state( + ttd_worker_report *report, ttd_worker_working_state_e *state) +{ + retvm_if(!report, -1, "report is NULL"); + retvm_if(!state, -1, "state is NULL"); + + *state = report->state; + + return 0; +} + +int ttd_worker_report_get_report_data( + ttd_worker_report *report, const char **report_data) +{ + retvm_if(!report, -1, "report is NULL"); + retvm_if(!report_data, -1, "report_data is NULL"); + + *report_data = (const char *)report->report_json; + + return 0; +} + +int ttd_worker_submit_report(ttd_worker_report *report, + ttd_worker_submit_report_completed_cb completed_cb, + void *completed_cb_data) +{ + ttd_worker_report *rep = NULL; + retvm_if(!g_dbus_handle->dbus_object, -1, "dbus_object is NULL"); + retvm_if(!report, -1, "report is NULL"); + retvm_if(!report->cmd_id, -1, "cmd_id is NULL"); + retvm_if(!report->report_json, -1, "report data is NULL"); + retvm_if(report->state == TTD_WORKER_STATE_UNKNOWN, -1, "state is UNKNOWN"); + + if (completed_cb) + rep = report; + + report->completed_cb = completed_cb; + report->completed_cb_data = completed_cb_data; + + ttd_worker_dbus_call_ttd_worker_submit_report( + g_dbus_handle->dbus_object, + report->cmd_id, + report->report_json, + report->state, + g_dbus_handle->cancellable, (GAsyncReadyCallback) __submit_completed_cb, - h); + rep); return 0; } -int ttd_worker_submit_report_sync(const char *report, ttd_worker_working_state_e working_state) +int ttd_worker_submit_report_sync( + ttd_worker_report *report, ttd_worker_submit_result_e *result) { - dbus_h *h = NULL; GError *error = NULL; gint ret_val = -1; gboolean ret = FALSE; + ttd_worker_submit_result_e res = TTD_WORKER_SUBMIT_SUCCESS; - h = __make_dbus_connection(); - if (!h) { - _E("Failed to make dbus connection"); - return -1; - } + if (result) + *result = TTD_WORKER_SUBMIT_FAIL; + + retvm_if(!g_dbus_handle->dbus_object, -1, "dbus_object is NULL"); + retvm_if(!report, -1, "report is NULL"); + retvm_if(!report->cmd_id, -1, "cmd_id is NULL"); + retvm_if(!report->report_json, -1, "report data is NULL"); + retvm_if(report->state == TTD_WORKER_STATE_UNKNOWN, -1, "state is UNKNOWN"); - ret = ttd_worker_dbus_call_ttd_worker_submit_report_sync(h->dbus_object, - report, - working_state, + ret = ttd_worker_dbus_call_ttd_worker_submit_report_sync( + g_dbus_handle->dbus_object, + report->cmd_id, + report->report_json, + report->state, &ret_val, - h->cancellable, + g_dbus_handle->cancellable, &error); if (!ret) { _E("DBus proxy call is failed[%s]", error->message); g_error_free(error); - return -1; + res = TTD_WORKER_SUBMIT_FAIL; } else { if (ret_val < 0) { _E("Submit report is failed"); - return -1; + res = TTD_WORKER_SUBMIT_FAIL; } } - __destroy_dbus_connection(h); + if (result) + *result = res; return 0; }