update worker lib APIs to encapsulting report sturcture 02/181802/3
authorJeonghoon Park <jh1979.park@samsung.com>
Mon, 18 Jun 2018 10:25:54 +0000 (19:25 +0900)
committerJeonghoon Park <jh1979.park@samsung.com>
Tue, 19 Jun 2018 02:01:20 +0000 (11:01 +0900)
Change-Id: I1218e89196680bb9a64aaf54c3c9f265bc140f32

common/common-worker-inf-dbus.xml
lib/things-service-worker/include/ttd-worker-lib.h
lib/things-service-worker/src/ttd-worker-lib.c

index eb6e2d4..6677eb3 100644 (file)
@@ -10,6 +10,7 @@
                <!-- Method definitions -->
 
                <method name="ttd_worker_submit_report">
+                       <arg type="s" name="cmd_id" direction="in"/>
                        <arg type="s" name="report" direction="in"/>
                        <arg type="i" name="working_state" direction="in"/>
                        <arg type="i" name="ret" direction="out"/>
index 351c060..3b2992c 100644 (file)
 #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__ */
index 2adec26..2cfc86c 100644 (file)
 #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;
 }