#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__ */
#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");
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;
}