dbus: change edbus/ecore to common dbus api 92/168892/2 submit/tizen/20180202.011501
authorsanghyeok.oh <sanghyeok.oh@samsung.com>
Thu, 1 Feb 2018 02:43:25 +0000 (11:43 +0900)
committerpr.jung <pr.jung@samsung.com>
Thu, 1 Feb 2018 10:04:45 +0000 (19:04 +0900)
Change-Id: I9f2c821acedc7f4bd1466058c6205ff881444d43
Signed-off-by: sanghyeok.oh <sanghyeok.oh@samsung.com>
16 files changed:
CMakeLists.txt [changed mode: 0755->0644]
packaging/feedbackd.spec
src/core/common.h
src/core/dbus.c
src/core/dbus.h
src/core/device-idler.c
src/core/edbus-handler.c
src/core/main.c
src/haptic/circle.c
src/haptic/emulator.c
src/haptic/gpio_haptic.c [changed mode: 0755->0644]
src/haptic/haptic-plugin-intf.h
src/haptic/haptic.c
src/haptic/standard-mix.c
src/haptic/standard-vibcore.c
src/haptic/standard.c

old mode 100755 (executable)
new mode 100644 (file)
index 974f5a7..0900516
@@ -9,7 +9,6 @@ SET(VERSION 0.1.0)
 
 SET(SRCS
        src/core/main.c
-       src/core/edbus-handler.c
        src/core/common.c
        src/core/config-parser.c
        src/core/device-idler.c
@@ -35,13 +34,12 @@ ENDIF()
 INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src)
 
 SET(PKG_MODULES
-       ecore
-       edbus
-       dbus-1
        vconf
        dlog
        capi-base-common
+       glib-2.0
        gio-2.0
+       gio-unix-2.0
        capi-system-info
 )
 
index 8c2985e..1dca668 100644 (file)
@@ -15,14 +15,13 @@ Source0:    %{name}-%{version}.tar.gz
 Source1:    feedbackd.manifest
 
 BuildRequires:  cmake
-BuildRequires:  pkgconfig(ecore)
 BuildRequires:  pkgconfig(vconf)
 BuildRequires:  pkgconfig(dlog)
-BuildRequires:  pkgconfig(edbus)
 BuildRequires:  pkgconfig(capi-base-common)
 BuildRequires:  pkgconfig(dbus-1)
 BuildRequires:  pkgconfig(gio-2.0)
 BuildRequires:  pkgconfig(glib-2.0)
+BuildRequires:  pkgconfig(gio-unix-2.0)
 BuildRequires:  pkgconfig(capi-system-info)
 BuildRequires:  pkgconfig(capi-system-peripheral-io)
 
index 9978bf4..e8086e5 100644 (file)
@@ -20,8 +20,8 @@
 #ifndef __FEEDBACKD_COMMON_H__
 #define __FEEDBACKD_COMMON_H__
 
-#include <Ecore.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <error.h>
 #include <stdbool.h>
 #include <unistd.h>
index c8845f0..2d22d15 100644 (file)
 /* -1 is a default timeout value, it's converted to 25*1000 internally. */
 #define DBUS_REPLY_TIMEOUT     (-1)
 
-int append_variant(DBusMessageIter *iter, const char *sig, char *param[])
+static GBusType g_default_bus_type = G_BUS_TYPE_SYSTEM;
+pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+void dbus_handle_set_default_bus_type(GBusType bus_type)
+{
+       if (bus_type != G_BUS_TYPE_SYSTEM && bus_type != G_BUS_TYPE_SESSION)
+               return ;
+
+       pthread_mutex_lock(&g_mutex);
+       g_default_bus_type = bus_type;
+       pthread_mutex_unlock(&g_mutex);
+}
+
+GBusType dbus_handle_get_default_bus_type(void)
+{
+       GBusType type;
+
+       pthread_mutex_lock(&g_mutex);
+       type = g_default_bus_type;
+       pthread_mutex_unlock(&g_mutex);
+
+       return type;
+}
+
+typedef struct {
+       const char *bus_name;
+       guint id;
+} dbus_name;
+
+/* basic information */
+typedef struct {
+       GDBusConnection *conn;
+       GBusType bus_type;
+       gboolean priv;
+       GList *list_names; // dbus_name
+       GList *list_object; /* dbus_object_handle_s */
+       pthread_mutex_t mutex;// = PTHREAD_MUTEX_INITIALIZER;
+} dbus_handle_s;
+
+/* path + interfaces */
+typedef struct {
+       dbus_handle_s *dh;                              /* dbus handle */
+       const char *path;
+       GList *list_ifaces;                                     /* dbus_interface_s */
+} dbus_object_handle_s;
+
+typedef struct {
+       dbus_object_handle_s *oh;
+       const char *name;
+       GList *list_methods; // const dbus_method_s;
+       guint reg_id;
+       int modified;
+} dbus_interface_s;
+
+#define get_dh_from_oh(oh) ((dbus_object_handle_s*)oh)->dh
+
+static dbus_handle_s g_dh[2];
+
+static dbus_handle_s *_dbus_handle_get_connection(GBusType bus_type);
+
+dbus_handle_s * _dbus_handle_get_default_connection(void)
+{
+       return _dbus_handle_get_connection(dbus_handle_get_default_bus_type());
+}
+
+#define dbus_handle_lock(handle) do {\
+       assert(handle);\
+       pthread_mutex_lock(&((handle)->mutex));\
+} while (0);
+
+#define dbus_handle_unlock(handle) do {\
+       assert(handle);\
+       pthread_mutex_unlock(&(handle)->mutex);\
+} while (0);
+
+#define dcl_dbus_handle() dbus_handle_s *dh = (dbus_handle_s *)handle;
+#define dcl_dbus_handle_null_check() dbus_handle_s *dh = (dbus_handle_s *)handle;\
+       if (!dh) {\
+       _E("dbus handle is null\n");\
+       return 0;\
+       }
+
+dbus_object_handle_s * _dbus_handle_lookup_object(GList *list_obj, const char *obj_path);
+dbus_interface_s * _dbus_handle_lookup_interface(GList *list_iface, const char *iface_name);
+dbus_method_s * _dbus_handle_lookup_method(GList *list_methods, const char *method_name);
+static GVariant* _append_variant(const char *signature, const char *param[]);
+
+dbus_interface_s *_iface_u_to_s(const dbus_interface_u *iface_u)
+{
+       dbus_interface_s *iface = NULL;
+
+       if (!iface_u || !iface_u->methods) {
+               _E("param is null");
+               return NULL;
+       }
+
+       iface = (dbus_interface_s *)calloc(1, sizeof(dbus_interface_s));
+       if (!iface) {
+               _E("failed to calloc");
+               return NULL;
+       }
+
+       iface->name = iface_u->name;
+       iface->modified = TRUE;
+
+       for (int i = 0 ; i < iface_u->nr_methods; ++i) {
+               //_D("attached %s:%p", iface_u->methods[i].member, iface_u->methods[i].func);
+               iface->list_methods = g_list_prepend(iface->list_methods, (void*)(iface_u->methods + i));
+       }
+
+       return iface;
+}
+
+static GDBusConnection * _get_bus(GBusType bus_type)
+{
+       GDBusConnection *conn = NULL;
+       GError *err = NULL;
+
+       if (bus_type != G_BUS_TYPE_SYSTEM && bus_type != G_BUS_TYPE_SESSION) {
+               _E("Wrong bus_type %d", bus_type);
+               return NULL;
+       }
+
+       conn = g_bus_get_sync(bus_type, NULL, &err);
+       if (!conn || err) {
+               _E("failed to get bus:type:%d, %s\n", bus_type, err->message);
+               g_error_free(err);
+               return NULL;
+       }
+
+       return conn;
+}
+
+static GDBusConnection * _get_bus_private(GBusType bus_type)
+{
+       GError *err = NULL;
+       GDBusConnection *conn = NULL;
+       const char * address;
+
+       if (bus_type != G_BUS_TYPE_SYSTEM && bus_type != G_BUS_TYPE_SESSION) {
+               _E("Wrong bus_type %d", bus_type);
+               return NULL;
+       }
+
+       address = g_dbus_address_get_for_bus_sync(bus_type, NULL, &err);
+       if (!address || err) {
+               _E("failed to get bus address\n");
+               g_error_free(err);
+               return NULL;
+       }
+
+       conn = g_dbus_connection_new_for_address_sync(address,
+                                                                               (GDBusConnectionFlags) (G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT |
+                                                                               G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION),
+                                                                               NULL, /* GDBusAuthObserver */
+                                                                               NULL,
+                                                                               &err);
+       if (!conn || err) {
+               _E("failed to get private bus\n");
+               g_error_free(err);
+               return NULL;
+       }
+
+       return conn;
+}
+
+/* ref cout is 1 */
+static dbus_handle_s *_dbus_handle_get_connection(GBusType bus_type)
+{
+       int ibus = bus_type - 1;
+       dbus_handle_s *dh = NULL;
+
+       if (bus_type != G_BUS_TYPE_SYSTEM && bus_type != G_BUS_TYPE_SESSION) {
+               _E("Unknown bus type %d", bus_type);
+               return NULL;
+       }
+       dh = &g_dh[ibus];
+
+       dbus_handle_lock(dh);
+
+       if (!dh->conn) {
+               dh->conn = _get_bus(bus_type);
+               dh->priv = FALSE;
+               dh->bus_type = bus_type;
+               if (!dh->conn)
+                       dh = NULL;
+       }
+
+       dbus_handle_unlock(dh);
+
+       return dh;
+}
+
+/* ref cout is 1 */
+static dbus_handle_s *_dbus_handle_get_connection_private(GBusType bus_type)
+{
+       dbus_handle_s * dh;
+
+       if (bus_type != G_BUS_TYPE_SYSTEM && bus_type != G_BUS_TYPE_SESSION) {
+               _E("Unknown bus type %d", bus_type);
+               return NULL;
+       }
+
+       dh = (dbus_handle_s *)calloc(1, sizeof(dbus_handle_s));
+       if (!dh) {
+               _E("failed to allocate memory for dbus handle");
+               return NULL;
+       }
+
+       dbus_handle_lock(dh);
+
+       if (!dh->conn) {
+               dh->conn = _get_bus_private(bus_type);
+               dh->bus_type = bus_type;
+               if (!dh->conn)
+                       goto err;
+       }
+
+       dbus_handle_unlock(dh);
+
+       return dh;
+err:
+       if (dh) {
+               dbus_handle_unlock(dh);
+               free(dh);
+       }
+       return NULL;
+}
+
+dbus_handle_h dbus_handle_get_connection(GBusType bus_type, gboolean priv)
+{
+       dbus_handle_s *dh = NULL;
+
+       if (bus_type != G_BUS_TYPE_SYSTEM && bus_type != G_BUS_TYPE_SESSION) {
+               _E("Wrong bus_type %d\n", bus_type);
+               return dh;
+       }
+
+       /* private */
+       if (priv)
+               dh = _dbus_handle_get_connection_private(bus_type);
+       /* shared */
+       else
+               dh = _dbus_handle_get_connection(bus_type);
+
+       return dh;
+}
+
+static void _dbus_handle_add_bus_name(dbus_handle_s *handle, const char *name, guint id)
+{
+       dbus_name *dn = NULL;
+       int locked = 0;
+
+       if (!handle || !name || !id)
+               return ;
+
+       dn = (dbus_name*)calloc(1, sizeof(dbus_name));
+       if (!dn) {
+               _E("failed to calloc");
+               assert(0);
+       }
+       dn->bus_name = name;
+       dn->id = id;
+
+       // todo : delete lock ?
+       locked = pthread_mutex_trylock(&handle->mutex);
+       if (locked != 0 && locked != EBUSY) {
+               _E("failed to lock %d\n", locked);
+               assert(0);
+       }
+
+       handle->list_names = g_list_prepend(handle->list_names, dn);
+
+       // todo : delete lock ?
+       if (locked != EBUSY)
+               dbus_handle_unlock(handle);
+}
+
+static gint _compare_dbus_name(gconstpointer a, gconstpointer b)
+{
+       const char *bus_name = ((dbus_name *)a)->bus_name;
+       if (!bus_name || !b)
+               return -1;
+       return strcmp(bus_name, (const char *)b);
+}
+
+dbus_name * _dbus_handle_lookup_dbus_name(GList *list_name, const char *bus_name)
+{
+       if (!list_name || !bus_name)
+               return NULL;
+
+       GList *item = g_list_find_custom(list_name, bus_name, _compare_dbus_name);
+       if (!item)
+               return NULL;
+
+       return (dbus_name *)item->data;
+}
+
+#define dh_to_ds(x) ((dbus_handle_s*)x)
+
+/* remove dbus_name from dbus handle */
+static void _dbus_handle_remove_bus_name(dbus_handle_s *handle, const char *bus_name)
+{
+       dcl_dbus_handle();
+       dbus_name *dn = NULL;
+
+       if (!bus_name) {
+               _E("wrong bus_name %s", bus_name);
+               return ;
+       }
+       if (!dh) {
+               dh = _dbus_handle_get_default_connection();
+               if (!dh) {
+                       _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+                       return ;
+               }
+       }
+
+       dbus_handle_lock(dh);
+       dn = _dbus_handle_lookup_dbus_name(dh->list_names, bus_name);
+       if (!dn) {
+               _E("failed to find dbus name %s", bus_name);
+               goto out;
+       }
+       dh->list_names = g_list_remove(dh->list_names, dn);
+       free(dn);
+out:
+       dbus_handle_unlock(dh);
+}
+
+static void _name_acquired(GDBusConnection *connection, const gchar *name, gpointer user_data)
+{
+       dbus_handle_s *dh = (dbus_handle_s *)user_data;
+
+       _D("name %s", name);
+
+       if (!dh) {
+               _E("%s:%d:dbus handle is null\n", __func__, __LINE__);
+               return ;
+       }
+       // todo: add bus name?
+       //dh->bus_name = name;
+}
+
+static void _name_lost(GDBusConnection *connection, const gchar *name, gpointer user_data)
+{
+       _E("%s:%d:%s\n", __func__, __LINE__, name);
+       dbus_handle_s *dh = (dbus_handle_s *)user_data;
+       if (!dh) {
+               _E("%s:%d:dbus handle is null\n", __func__, __LINE__);
+               return ;
+       }
+       _dbus_handle_remove_bus_name(dh, name);
+}
+
+int dbus_handle_request_bus_name(dbus_handle_h handle, const char *bus_name)
+{
+       dcl_dbus_handle();
+       int id = -1;
+       GList *item = NULL;
+
+       if (!bus_name) {
+               _E("bus_name is NULL");
+               return -1;
+       }
+
+       /* get shared connection */
+       if (!dh) {
+               dh = _dbus_handle_get_default_connection();
+               if (!dh) {
+                       _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+                       return -1;
+               }
+       }
+
+       dbus_handle_lock(dh);
+       if (!dh->conn) {
+               _E("failed to register name: connection is null\n");
+               goto out;
+       }
+
+       /* todo : search name on connection */
+       item = g_list_find_custom(dh->list_names, bus_name, _compare_dbus_name);
+       if (item) {
+               id = ((dbus_name*)(item->data))->id;
+               _E("name already exist:%u", id);
+               goto out;
+       }
+
+       id = g_bus_own_name_on_connection(dh->conn, bus_name, G_BUS_NAME_OWNER_FLAGS_NONE, _name_acquired, _name_lost, dh, NULL);
+       if (!id) {
+               _E("failed to own name:%s\n", bus_name);
+               goto out;
+       }
+
+       _dbus_handle_add_bus_name(dh, bus_name, id);
+
+out:
+       dbus_handle_unlock(dh);
+       return id;
+}
+
+int dbus_handle_release_bus_name(dbus_handle_h handle, const char *bus_name)
+{
+       dcl_dbus_handle();
+       dbus_name *dn = NULL;
+
+       if (!bus_name) {
+               _E("Wrong bus name");
+               return -1;
+       }
+
+       if (!dh) {
+               dh = _dbus_handle_get_default_connection();
+               if (!dh) {
+                       _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+                       return -1;
+               }
+       }
+
+       dn = _dbus_handle_lookup_dbus_name(dh->list_names, bus_name);
+       if (!dn) {
+               _E("failed to find bus_name %s on dbus handle", bus_name);
+               return -1;
+       }
+
+       _E("unown name %d", dn->id);
+       /* _name_lost handler is disabled by g_bus_unown_name : ubuntu */
+       g_bus_unown_name(dn->id);
+
+       dbus_handle_lock(dh);
+       dh->list_names = g_list_remove(dh->list_names, dn);
+       free(dn);
+       dbus_handle_unlock(dh);
+
+       return 0;
+}
+
+int dbus_handle_free_connection(dbus_handle_h handle)
+{
+       dcl_dbus_handle();
+       dbus_handle_s *pdh = NULL;
+       GError *err = NULL;
+       GList *item = NULL;
+
+       if (!dh) {
+               dh = _dbus_handle_get_default_connection();
+               if (!dh) {
+                       _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+                       return -1;
+               }
+       }
+
+       if (!dh->conn) {
+               _E("connection is NULL");
+               return 0;
+       }
+
+       pdh = dh;
+
+       /* disable dbus handler */
+       dbus_handle_lock(dh);
+       if (!pdh->conn) {
+               _E("conn is null");
+               free(pdh);
+               return 0;
+       }
+
+       /* flush everything */
+       if (!g_dbus_connection_flush_sync(pdh->conn, NULL, &err)) {
+               _E("failed to flush %s\n", err->message);
+               g_error_free(err);
+               err = NULL;
+       }
+
+       _D("list_names %u", g_list_length(pdh->list_names));
+
+       /* unown every well-knwon name */
+       if (pdh->list_names) {
+               dbus_name *dn = NULL;
+               for (item = g_list_first(pdh->list_names); item != NULL; item = g_list_next(item)) {
+                       dn = (dbus_name *)item->data;
+                       if (!dn)
+                               continue;
+
+                       /* _name_lost handler is disabled by g_bus_unown_name : ubuntu */
+                       _D("unown name id : %u", dn->id);
+                       g_bus_unown_name(dn->id);
+                       free(dn);
+               }
+               g_list_free(pdh->list_names);
+               pdh->list_names = NULL;
+       }
+
+       _D("list_object %u", g_list_length(pdh->list_object));
+
+       /* unregister every object */
+       if (pdh->list_object) {
+               dbus_object_handle_s * oh = NULL;
+               //g_list_foreach(pdh->list_object, [] (gpointer data, gpointer user_data){}, NULL);
+               for (item = g_list_first(pdh->list_object); item != NULL; item = g_list_next(item)) {
+                       oh = (dbus_object_handle_s *)item->data;
+                       if (!oh || !oh->list_ifaces)
+                               continue;
+
+                       _D("delete object path %s", oh->path);
+
+                       /* unregister every interface, method handles */
+                       for (GList *iface = g_list_first(oh->list_ifaces); iface != NULL; iface = g_list_next(iface)) {
+                               dbus_interface_s *ih = (dbus_interface_s *)iface->data;
+                               if (!ih)
+                                       continue;
+
+                               _D("delete object iface %s", ih->name);
+
+                               if (ih->reg_id)
+                                       g_dbus_connection_unregister_object(pdh->conn, ih->reg_id);
+                       }
+               }
+       }
+
+       /* close connection */
+       if (pdh->priv) {
+               _E("close private connection\n");
+
+               if (!g_dbus_connection_close_sync(pdh->conn, NULL, &err)) {
+                       _E("Error closing connection %s\n", err->message);
+                       g_error_free(err);
+                       err = NULL;
+               }
+       }
+
+       /* _free_func_object callback free the data */
+       //assert(g_list_length(pdh->list_names) == 0);
+       //assert(g_list_length(pdh->list_object) == 0);
+
+       g_object_unref(pdh->conn);
+
+       dbus_handle_unlock(dh);
+
+       if (dh->priv)
+               free(dh);
+
+       return 0;
+
+       // todo: signal ?
+}
+
+#define buf_cal_free_space(size, nwrite) ((size - nwrite - 1) > 0 ? (size - nwrite - 1) : 0)
+#define buf_block_size 8192
+
+#define buf_check_space_realloc(buf, nwrite, buf_len) do {\
+       if ((nwrite >= buf_len - 1024)) {\
+               if (buf_len >= buf_block_size * 10) {\
+                       _E("buf is too big to allocate. %d", buf_len);\
+               } else {\
+                       _E("buf_check_space_realloc");\
+                       char *tmp = NULL;\
+                       buf_len += buf_block_size;\
+                       tmp = (char *)realloc(buf, buf_len);\
+                       if (!tmp) {\
+                               _E("failed to realloc");\
+                       } else\
+                               buf = tmp;\
+               } \
+       } \
+} while (0);
+
+static int _check_brace(const char * expr)
+{
+       int len = 0;
+       char qu[128];
+       int qucnt = 0;
+
+       if (!expr)
+               return -1;
+
+       len = strlen(expr);
+
+       if (expr[0] != '(' && expr[0] != '{')
+               return -1;
+
+       for (int i = 0 ; i < len; ++i) {
+
+               if (expr[i] == '(' || expr[i] == '{') {
+                       qu[qucnt++] = expr[i];
+                       if (qucnt >= sizeof(qu)) {
+                               _E("queue is too large. %s", expr);
+                               return -1;
+                       }
+                       continue;
+               }
+
+               if (expr[i] == ')' || expr[i] == '}') {
+                       char ch;
+
+                       if (qucnt > 0)
+                               ch = qu[qucnt-1];
+                       else
+                               return -1;
+
+                       if (expr[i] == ')') {
+                               if (ch == '(') {
+                                       --qucnt;
+                               } else
+                                       return -1;
+                       } else if (expr[i] == '}') {
+                               if (ch == '{') {
+                                       --qucnt;
+                               } else
+                                       return -1;
+                       } else
+                               return -1;
+
+                       if (qucnt == 0) {
+                               return i + 1;
+                       }
+               }
+       }
+
+       return -1;
+}
+
+static int _get_xml_from_interfaces(char **xml, const dbus_interface_s *interfaces)
+{
+       int nwrite = 0;
+       int len_args;
+       char *buf = NULL;
+       const dbus_method_s *pmethod;
+       int buf_len = buf_block_size;
+
+       if (!interfaces) {
+               _E("interfaces is null");
+               return -1;
+       }
+
+       // todo : check dbus naming rule for interface name. ?
+       if (!interfaces->name) {
+               _E("wrong interface name");
+               return -1;
+       }
+       if (!interfaces->list_methods) {
+               _E("no methods");
+               return -1;
+       }
+
+       buf = (char *)malloc(buf_len);
+       if (!buf) {
+               _E("buf is null. not enough memory\n");
+               return -1;
+       }
+
+       nwrite += snprintf(buf + nwrite, buf_cal_free_space(buf_len, nwrite), "<node>""\n""\t""<interface name='%s'>""\n", interfaces->name);
+
+       /* members */
+       for (GList *item = g_list_first(interfaces->list_methods); item != NULL; item = g_list_next(item)) {
+               pmethod = (const dbus_method_s *)item->data;
+               if (!pmethod)
+                       continue;
+
+               /* check free space of buf */
+               buf_check_space_realloc(buf, nwrite, buf_len);
+
+               if (pmethod->signature_in == NULL && pmethod->signature_out == NULL) {
+                       nwrite += snprintf(buf + nwrite, buf_cal_free_space(buf_len, nwrite), "\t\t""<method name='%s'/>""\n", pmethod->member);
+                       continue;
+               }
+
+               /* <method name='###'> */
+               nwrite += snprintf(buf + nwrite, buf_cal_free_space(buf_len, nwrite), "\t\t""<method name='%s'>""\n", pmethod->member);
+
+               /* in args */
+               len_args = pmethod->signature_in ? strlen(pmethod->signature_in) : 0;
+               for (int m = 0; m < len_args; ++m) {
+                       // todo
+                       // array a(), as, ay ?
+                       if (pmethod->signature_in[m] == 'a') {
+                               int ei; //end index
+                               ei = _check_brace(pmethod->signature_in + m + 1);
+                               if (ei > 0) {
+                                       char tmp[128] = {0,};
+                                       strncpy(tmp, pmethod->signature_in + m, ei + 1);
+                                       nwrite += snprintf(buf + nwrite, buf_cal_free_space(buf_len, nwrite), "\t\t\t""<arg type='%s' name='arg%d' direction='in'/>""\n", tmp, m);
+                                       m += ei;
+                                       continue;
+                               } else {
+                                       nwrite += snprintf(buf + nwrite, buf_cal_free_space(buf_len, nwrite), "\t\t\t""<arg type='%c%c' name='arg%d' direction='in'/>""\n", pmethod->signature_in[m], pmethod->signature_in[m+1], m);
+                                       m += 1;
+                                       continue;
+                               }
+                       }
+                       nwrite += snprintf(buf + nwrite, buf_cal_free_space(buf_len, nwrite), "\t\t\t""<arg type='%c' name='arg%d' direction='in'/>""\n", pmethod->signature_in[m], m);
+               }
+
+               /* out args */
+               len_args = pmethod->signature_out ? strlen(pmethod->signature_out) : 0;
+               for (int m = 0; m < len_args; ++m) {
+                       // array
+                       // todo: container type
+                       if (pmethod->signature_out[m] == 'a') {
+                               int ei; //end index
+                               ei = _check_brace(pmethod->signature_out + m + 1);
+                               if (ei > 0) {
+                                       char tmp[128] = {0,};
+                                       strncpy(tmp, pmethod->signature_out + m, ei + 1);
+                                       nwrite += snprintf(buf + nwrite, buf_cal_free_space(buf_len, nwrite), "\t\t\t""<arg type='%s' name='arg%d' direction='out'/>""\n", tmp, m);
+                                       m += ei;
+                                       continue;
+                               } else {
+                                       nwrite += snprintf(buf + nwrite, buf_cal_free_space(buf_len, nwrite), "\t\t\t""<arg type='%c%c' name='arg%d' direction='out'/>""\n", pmethod->signature_out[m], pmethod->signature_out[m+1], m);
+                                       m += 1;
+                                       continue;
+                               }
+                       }
+                       nwrite += snprintf(buf + nwrite, buf_cal_free_space(buf_len, nwrite), "\t\t\t""<arg type='%c' name='arg%d' direction='out'/>""\n", pmethod->signature_out[m], m);
+               }
+
+               /* </method> */
+               nwrite += snprintf(buf + nwrite, buf_cal_free_space(buf_len, nwrite), "\t\t""</method>""\n");
+       }
+
+       nwrite += snprintf(buf + nwrite, buf_cal_free_space(buf_len, nwrite), "\t""</interface>""\n""</node>""");
+
+       *xml = buf;
+
+       return 0;
+}
+
+static gint _compare_dbus_object(gconstpointer a, gconstpointer b)
+{
+       dbus_object_handle_s * pa = (dbus_object_handle_s *)a;
+       if (!pa->path || !((const char*)b))
+               return -1;
+       return strcmp(pa->path, (const char*)b);
+}
+
+static gint _compare_dbus_interface(gconstpointer a, gconstpointer b)
+{
+       dbus_interface_s * pa = (dbus_interface_s *)a;
+       if (!pa->name || !((const char*)b))
+               return -1;
+       return strcmp(pa->name, (const char*)b);
+}
+
+static gint _compare_dbus_interface_by_id(gconstpointer a, gconstpointer b)
+{
+       dbus_interface_s * pa = (dbus_interface_s *)a;
+       if (!pa->reg_id || !((guint*)b))
+               return -1;
+       return !(pa->reg_id == (guint)b);
+}
+
+static gint _compare_dbus_method(gconstpointer a, gconstpointer b)
+{
+       dbus_method_s *pa = (dbus_method_s*)a;
+       if (!pa->member || !((const char*)b))
+               return -1;
+       return strcmp(pa->member, (const char*)b);
+}
+
+dbus_object_handle_s * _dbus_handle_lookup_object(GList *list_obj, const char *obj_path)
+{
+       if (!list_obj || !obj_path)
+               return NULL;
+
+       GList *item = g_list_find_custom(list_obj, obj_path, _compare_dbus_object);
+       if (!item)
+               return NULL;
+
+       return (dbus_object_handle_s *)item->data;
+}
+
+dbus_interface_s * _dbus_handle_lookup_interface(GList *list_iface, const char *iface_name)
+{
+       if (!list_iface || !iface_name)
+               return NULL;
+
+       GList *item = g_list_find_custom(list_iface, iface_name, _compare_dbus_interface);
+       if (!item)
+               return NULL;
+
+       return (dbus_interface_s *)item->data;
+}
+
+dbus_interface_s * _dbus_handle_lookup_interface_by_id(GList *list_iface, guint id)
+{
+       if (!list_iface || !id)
+               return NULL;
+
+       GList *item = g_list_find_custom(list_iface, &id, _compare_dbus_interface_by_id);
+       if (!item)
+               return NULL;
+
+       return (dbus_interface_s *)item->data;
+}
+
+dbus_method_s * _dbus_handle_lookup_method(GList *list_methods, const char *method_name)
+{
+       if (!list_methods || !method_name)
+               return NULL;
+
+       GList *item = g_list_find_custom(list_methods, method_name, _compare_dbus_method);
+       if (!item)
+               return NULL;
+
+       return (dbus_method_s *)item->data;
+}
+
+static void _free_func_object(gpointer data)
+{
+       dbus_interface_s *ih = (dbus_interface_s *)data;
+       dbus_object_handle_s *oh = NULL;
+
+       if (!ih) {
+               _E("interface handle is null");
+               assert(0); // something wrong
+               return ;
+       }
+
+       /* just free list, not data(static dbus_method_s) */
+       g_list_free(ih->list_methods);
+
+       oh = ih->oh;
+       if (!oh) {
+               _E("object handle is null");
+               assert(0); // something wrong
+               return ;
+       }
+
+       /* remove ih from list_ifaces */
+       oh->list_ifaces = g_list_remove(oh->list_ifaces, ih);
+
+       /* interface_s is copy of interface_u */
+       free(ih);
+
+       /* remove oh from list_object */
+       if (!oh->list_ifaces) {
+               oh->dh->list_object = g_list_remove(oh->dh->list_object, oh);
+               free(oh);
+       }
+}
+
+static int _dbus_handle_attach_object(dbus_handle_s *dh, const char *obj_path, dbus_interface_s *iface)
+{
+       dbus_object_handle_s *oh = NULL;
+
+       if (!dh || !obj_path || !iface) {
+               _E("failed to attache object. wrong parameter");
+               return -1;
+       }
+
+       /* find object handle */
+       if (dh->list_object)
+               oh = _dbus_handle_lookup_object(dh->list_object, obj_path);
+
+       if (!oh) {
+               oh = (dbus_object_handle_s*)calloc(1, sizeof(dbus_object_handle_s));
+               if (!oh) {
+                       _E("failed to calloc");
+                       return -1;
+               }
+               oh->dh = dh;
+               oh->path = obj_path;
+
+               /* attach object */
+               dh->list_object = g_list_prepend(dh->list_object, oh);
+       }
+
+       iface->oh = oh;
+       /* attach interface */
+       oh->list_ifaces = g_list_prepend(oh->list_ifaces, iface);
+
+       return 0;
+}
+
+/* libgio verify path and interface */
+static void _method_call_handler(GDBusConnection *conn,
+       const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
+       GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
+{
+       dbus_interface_s *iface_s = (dbus_interface_s *)user_data;
+       const dbus_method_s *methods;
+       GVariant *result = NULL;
+
+       /* todo: ghash ? */
+       methods = _dbus_handle_lookup_method(iface_s->list_methods, name);
+       if (methods) {
+               result = methods->func(conn, sender, path, iface, name, param, invocation, get_dh_from_oh(iface_s->oh));
+
+               /* async, maybe they will reply...maybe.. */
+               if (!result) {
+                       _E("finish method handle : NULL");
+                       return ;
+               }
+       } else {
+               _E("no methods");
+       }
+
+       g_dbus_method_invocation_return_value(invocation, result);
+       //if (g_variant_is_of_type(result, G_VARIANT_TYPE_TUPLE)) {
+       //      //_E("TUPLE %s", g_variant_get_type_string(result));
+       //      g_dbus_method_invocation_return_value(invocation, result);
+       //}
+       //else if (g_variant_is_container(result)) {
+       //      /* todo: we don't have any plan to using variant type for reply */
+       //      _E("CONTAINER %s", g_variant_get_type_string(result));
+       //      g_dbus_method_invocation_return_value(invocation, result);
+       //      //g_dbus_method_invocation_return_value(invocation, g_variant_new("(v)", result));
+       //} else {
+       //      _E("Type is not Container : %s", g_variant_get_type_string(result));
+       //}
+}
+
+static GDBusInterfaceVTable path_vtable = {_method_call_handler};
+
+
+/*
+before register object, attach object into dbus handle
+_dbus_handle_attach_object()
+*/
+static int _dbus_handle_register_dbus_object(dbus_handle_h handle, const char *obj_path, dbus_interface_s *iface)
+{
+       dcl_dbus_handle();
+       int ret = 0;
+       char *buf = NULL;
+       GError *err = NULL;
+       GDBusNodeInfo * nodeinfo = NULL;
+       GDBusInterfaceInfo *ifaceinfo = NULL;
+
+       if (!obj_path || !iface) {
+               _E("wrong parameter\n");
+               return -1;
+       }
+       if (!dh) {
+               dh = _dbus_handle_get_default_connection();
+               if (!dh) {
+                       _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+                       return -1;
+               }
+       }
+       if (!dh->conn) {
+               _E("connection is null\n");
+               return -1;
+       }
+
+       ret = _get_xml_from_interfaces(&buf, iface);
+       if (ret < 0) {
+               _E("failed to make xml format");
+               goto err;
+       }
+
+       _E("%s", buf);
+
+       nodeinfo = g_dbus_node_info_new_for_xml(buf, &err);
+       if (!nodeinfo || err) {
+               _E("failed to make introspection data:err:%s:xml:%s\n", err->message, buf);
+               ret = -1;
+               goto err;
+       }
+
+       ifaceinfo = g_dbus_node_info_lookup_interface(nodeinfo, iface->name);
+       if (!ifaceinfo) {
+               _E("failed to g_dbus_node_info_lookup_interface");
+               ret = -1;
+               goto err;
+       }
+
+       /*
+               path own single interface
+               if interface is already registered, then failed.
+               g_dbus_connection_register_object ref(ifaceinfo) now, unref if object is unregistered
+       */
+       ret = g_dbus_connection_register_object(dh->conn, obj_path, ifaceinfo/*ref 2*/, &path_vtable, (void*)iface,
+               _free_func_object,
+               &err);
+       if (err) {
+               _E("failed to register object:err:%s:\n", err->message);
+               ret = -1;
+               goto err;
+       }
+
+       iface->reg_id = ret;
+       iface->modified = FALSE;
+
+err:
+       /* todo: detach object */
+       //_dbus_handle_detach_object(dh, obj_path, iface);
+       /* attach interface before register object */
+       /*ret = _dbus_handle_detach_object(dh, obj_path, iface);
+       if (ret < 0) {
+               _E("failed to attach object");
+               goto err;
+       }*/
+
+       if (nodeinfo)
+               g_dbus_node_info_unref(nodeinfo);
+       if (buf)
+               free(buf);
+       if (err)
+               g_error_free(err);
+
+       return ret;
+}
+
+/*
+register same interface at once
+
+if interface is constructed by multiple methods,
+also it is not possible to make methods struct at once,
+
+use dbus_handle_add_dbus_object(), dbus_handle_register_dbus_object_all().
+
+return reg_id
+*/
+int dbus_handle_register_dbus_object(dbus_handle_h handle, const char *obj_path, const dbus_interface_u *iface_u)
+{
+       dcl_dbus_handle();
+       int ret = 0;
+       dbus_interface_s *iface = NULL;
+
+       if (!obj_path || !iface_u) {
+               _E("wrong parameter\n");
+               return -1;
+       }
+       if (!dh) {
+               dh = _dbus_handle_get_default_connection();
+               if (!dh) {
+                       _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+                       return -1;
+               }
+       }
+       if (!dh->conn) {
+               _E("connection is null\n");
+               return -1;
+       }
+
+       /* check registered interface */
+       if (dh->list_object) {
+               dbus_object_handle_s *oh = _dbus_handle_lookup_object(dh->list_object, obj_path);
+               if (oh) {
+                       dbus_interface_s *ih = _dbus_handle_lookup_interface(oh->list_ifaces, iface_u->name);
+                       if (ih) {
+                               _E("path %s, interface %s already registered", obj_path, iface_u->name);
+                               return -1;
+                       }
+               }
+       }
+
+       iface = _iface_u_to_s(iface_u);
+       if (!iface) {
+               _E("failed to _iface_u_to_s");
+               return -1;
+       }
+
+       /* attach interface before register object */
+       ret = _dbus_handle_attach_object(dh, obj_path, iface);
+       if (ret < 0) {
+               _E("failed to attach object");
+               goto err;
+       }
+
+       ret = _dbus_handle_register_dbus_object(dh, obj_path, iface);
+       if (ret <= 0) {
+               _E("failed to register dbus object%d", ret);
+               goto err;
+       }
+err:
+       return ret;
+}
+
+int dbus_handle_unregister_dbus_object(dbus_handle_h handle, const char *obj_path)
+{
+       dcl_dbus_handle();
+       dbus_object_handle_s *oh = NULL;
+       int ret = 0;
+
+       if (!obj_path) {
+               return -1;
+       }
+       if (!dh) {
+               dh = _dbus_handle_get_default_connection();
+               if (!dh) {
+                       _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+                       return -1;
+               }
+       }
+       if (!dh->list_object) {
+               _E("list_object is empty");
+               return 0;
+       }
+
+       oh = _dbus_handle_lookup_object(dh->list_object, obj_path);
+       if (!oh) {
+               _E("no object with name %s", obj_path);
+               return -1;
+       }
+
+       /* unregister every interface of object*/
+       for (GList *item = g_list_first(oh->list_ifaces); item != NULL; item = g_list_next(item)) {
+               dbus_interface_s *ih = item->data;
+               if (!ih) {
+                       _E("this is error");
+                       assert(0);
+               }
+
+               /* remove ih from list_ifaces */
+               if (!ih->reg_id) {
+                       item = g_list_previous(item);
+
+                       /* remove and free link */
+                       oh->list_ifaces = g_list_remove(oh->list_ifaces, ih);
+
+                       /* free list_methods */
+                       g_list_free(ih->list_methods);
+
+                       /* free data */
+                       free(ih);
+                       continue;
+               }
+
+               /* unregister object by id */
+               ret = g_dbus_connection_unregister_object(dh->conn, ih->reg_id);
+               if (!ret)
+                       _E("failed to unregister object %s, interface %s, regid %d", oh->path, ih->name, ih->reg_id);
+       }
+
+       return 0;
+}
+
+/*
+add object temporarily.
+dbus_handle_register_dbus_object_all will register every objects on connection.
+
+return registered method count
+*/
+int dbus_handle_add_dbus_object(dbus_handle_h handle, const char *obj_path, const dbus_interface_u *iface_u)
+{
+       dcl_dbus_handle();
+       dbus_object_handle_s *oh = NULL;
+       dbus_interface_s *ih = NULL;
+       int cnt;
+
+       if (!obj_path || !iface_u) {
+               _E("wrong parameter path %s, iface_u %p\n", obj_path, iface_u);
+               return -1;
+       }
+       if (iface_u && (!iface_u->name || !iface_u->methods)) {
+               _E("wrong parameter path %s, iface_u %p\n", obj_path, iface_u);
+               return -1;
+       }
+
+       cnt = iface_u->nr_methods;
+
+       if (!dh) {
+               dh = _dbus_handle_get_default_connection();
+               if (!dh) {
+                       _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+                       return -1;
+               }
+       }
+
+       if (!dh->conn) {
+               _E("failed to register method. connection is null\n");
+               return -1;
+       }
+
+       /* if there are no object list, just add */
+       if (!dh->list_object) {
+               if (_dbus_handle_attach_object(dh, obj_path, _iface_u_to_s(iface_u))) {
+                       _E("failed to attach object");
+                       return -1;
+               }
+               goto out;
+       }
+
+       oh = _dbus_handle_lookup_object(dh->list_object, obj_path);
+       /* if there are no matched object, just add */
+       if (!oh) {
+               if (_dbus_handle_attach_object(dh, obj_path, _iface_u_to_s(iface_u))) {
+                       _E("failed to attach object");
+                       return -1;
+               }
+               goto out;
+       }
+
+       /* this is an error, interface must have one or more item ? */
+       if (!oh->list_ifaces) {
+               _E("error. list_ifaces is null\n");
+               assert(0);
+               goto out;
+       }
+
+       ih = _dbus_handle_lookup_interface(oh->list_ifaces, iface_u->name);
+       /* if there are no matched interface, just add */
+       if (!ih) {
+               if (_dbus_handle_attach_object(dh, obj_path, _iface_u_to_s(iface_u))) {
+                       _E("failed to attach object");
+                       return -1;
+               }
+               goto out;
+       }
+
+       /*  todo:
+               1. unregister interface
+               2. update interface and methods
+               3. register interface
+       */
+       if (ih->reg_id) {
+               _E("interface already registered, ignore new interface");
+               return -1;
+       }
+
+       /* attach new methods */
+       cnt = 0;
+       for (int i = 0; i < iface_u->nr_methods; ++i) {
+               GList *item = g_list_find_custom(g_list_first(ih->list_methods), iface_u->methods[i].member, _compare_dbus_method);
+               if (!item) {
+                       //_D("attached %s", iface_u->methods[i].member);
+                       ih->list_methods = g_list_prepend(ih->list_methods, (void*)(iface_u->methods + i));
+                       ++cnt;
+               }
+       }
+
+       if (cnt)
+               ih->modified = TRUE;
+
+out:
+       /*todo: delete debugging log */
+       //if (dh && dh->list_object)
+       //      _D("obj list len %d", g_list_length(dh->list_object));
+       //if (oh && oh->list_ifaces)
+       //      _D("iface list len %d", g_list_length(oh->list_ifaces));
+       //if (ih && ih->list_methods)
+       //      _D("method list len %d", g_list_length(ih->list_methods));
+
+       return cnt;
+}
+
+int dbus_handle_register_dbus_object_all(dbus_handle_h handle)
+{
+       dcl_dbus_handle();
+       dbus_object_handle_s *oh = NULL;
+       dbus_interface_s *ih = NULL;
+       int ret = 0;
+
+       if (!dh) {
+               dh = _dbus_handle_get_default_connection();
+               if (!dh) {
+                       _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+                       return -1;
+               }
+       }
+       if (!dh->conn) {
+               _E("connection is null\n");
+               return -1;
+       }
+
+       if (!dh->list_object) {
+               _E("obj list is empty");
+               return -1;
+       }
+
+       /*if (dh && dh->list_object)
+               _D("obj list len %d", g_list_length(dh->list_object));*/
+
+       for (GList *item = g_list_first(dh->list_object); item != NULL; item = g_list_next(item)) {
+               oh = (dbus_object_handle_s *)item->data;
+
+               if (!oh) {
+                       _E("something wrong");
+                       assert(0);
+               }
+               if (!oh->list_ifaces) {
+                       _E("path %s: list_ifaces are null", oh->path);
+                       goto err;
+               }
+
+               //_D("iface list len %d", g_list_length(oh->list_ifaces));
+
+               for (GList *li = g_list_first(oh->list_ifaces); li != NULL; li = g_list_next(li)) {
+                       ih = (dbus_interface_s *)li->data;
+
+                       /* if there are no modification, goto next */
+                       if (!ih->modified)
+                               continue;
+
+                       /* todo: if already registered interface, unregister first */
+
+                       /*_E("interface %s:", ih->name);
+                       if (ih && ih->list_methods)
+                               _D("method list len %d", g_list_length(ih->list_methods));*/
+
+                       ret = _dbus_handle_register_dbus_object(dh, oh->path, ih);
+                       if (ret <= 0)
+                               _E("failed to register dbus object%d", ret);
+
+               }
+       }
+       return 0;
+err:
+
+       // todo: delete all updates
+
+       return -1;
+}
+
+static void _free_func_signal(gpointer data)
+{
+       //_D("free signal subscribe");
+}
+
+guint subscribe_dbus_signal(dbus_handle_h handle, const char *path,
+                                                       const char *iface, const char *name,
+                                                       GDBusSignalCallback cb, void *data,
+                                                       destroy_notified free_func)
+{
+       dcl_dbus_handle();
+
+       if (!dh) {
+               dh = _dbus_handle_get_default_connection();
+               if (!dh) {
+                       _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+                       return 0;
+               }
+       }
+
+       if (!dh->conn) {
+               _E("connection is null. check bus status");
+               return 0;
+       }
+       return g_dbus_connection_signal_subscribe(dh->conn, NULL, iface, name, path, NULL, G_DBUS_SIGNAL_FLAGS_NONE, cb, data, _free_func_signal);
+}
+
+void unsubscribe_dbus_signal(dbus_handle_h handle, guint id)
+{
+       dcl_dbus_handle();
+       if (!dh) {
+               dh = _dbus_handle_get_default_connection();
+               if (!dh) {
+                       _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+                       return;
+               }
+       }
+
+       if (!dh->conn) {
+               _E("connection is null. check bus status");
+               return;
+       }
+
+       g_dbus_connection_signal_unsubscribe(dh->conn, id);
+}
+
+int _check_type_string_is_container(const char *signature)
+{
+       if (!signature)
+               return FALSE;
+
+       switch (signature[0]) {
+       case 'a':
+       case 'm':
+       case 'r':
+       case '(':
+       case '{':
+       case 'v':
+               return TRUE;
+       default:
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
+GVariant *dbus_handle_make_simple_array(const char *sig, int *param)
+{
+       GVariantBuilder *builder = NULL;
+       char format[256];
+       int i = 0;
+
+       builder = g_variant_builder_new(G_VARIANT_TYPE(sig));
+       if (!builder) {
+               _E("failed to g_variant_builder_new");
+               return NULL;
+       }
+
+       while (param[i])
+               g_variant_builder_add(builder, "i", param[i++]);
+
+       snprintf(format, sizeof(format) - 1, "(%s)", sig);
+       return g_variant_new(format, builder);
+}
+
+/* todo: looks like garbage... */
+static GVariant* _append_variant(const char *signature, const char *param[])
+{
+       char *ch;
+       int i;
+       int pi;
+       int int_type;
+       gboolean bool_type;
+       unsigned long long int64_type;
+       GVariant *ret;
+       int len;
+       char container[255];// The maximum length of a signature is 255.
+       const char *sig = signature;
+       GVariantBuilder *builder = NULL;
+
+       if (!signature || !param)
+               return 0;
+
+       /* workaround for user fault "(i) != i" but we treat this as same signature */
+       /* G_VARIANT_TYPE("si") return NULL */
+       /* todo: actually user have to use correct signature */
+       if (!_check_type_string_is_container(signature)) {
+               snprintf(container, sizeof(container) - 1, "(%s)", signature);
+               sig = container;
+       }
+       if (!g_variant_type_is_container(G_VARIANT_TYPE(sig))) {
+               _E("signature (%s) is not container type", signature);
+       }
+
+       builder = g_variant_builder_new(G_VARIANT_TYPE(sig));
+       len = strlen(sig);
+       pi = 0;
+       for (ch = (char *)sig, i = 0; i < len; ++i, ++ch) {
+               switch (*ch) {
+               case '(':
+               case ')':
+                       continue;
+               case 'b':
+                       bool_type = (atoi(param[pi++]) == 0 ? FALSE : TRUE);
+                       g_variant_builder_add(builder, "b", bool_type);
+                       break;
+               case 'i':
+                       int_type = atoi(param[pi++]);
+                       g_variant_builder_add(builder, "i", int_type);
+                       break;
+               case 'u':
+                       int_type = strtoul(param[pi++], NULL, 10);
+                       g_variant_builder_add(builder, "u", int_type);
+                       break;
+               case 't':
+                       int64_type = atoll(param[pi++]);
+                       g_variant_builder_add(builder, "t", int64_type);
+                       break;
+               case 's':
+                       g_variant_builder_add(builder, "s", param[pi++]);
+                       break;
+               case 'a':
+                       ++ch;
+                       switch (*ch) {
+                       case 'y':
+                               g_variant_builder_add(builder, "^ay", param[pi++]);
+                               ++i;
+                               break;
+                       default:
+                               break;
+                       }
+                       break;
+               default:
+                       break;
+               }
+       }
+       ret = g_variant_builder_end(builder);
+       g_variant_builder_clear(builder);
+       g_variant_builder_unref(builder);
+
+       return ret;
+}
+
+int dbus_handle_broadcast_dbus_signal(const char *path,
+                                                               const char *iface, const char *name,
+                                                               const char *signature, const char *param[])
+{
+       dbus_handle_s *dh = NULL;
+       GError *err = NULL;
+       gboolean ret = 0;
+       GVariant *var = NULL;
+
+       dh = _dbus_handle_get_default_connection();
+       if (!dh) {
+               _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+               return -1;
+       }
+
+       if (signature && param)
+               var = _append_variant(signature, param);
+       ret = g_dbus_connection_emit_signal(dh->conn, NULL, path, iface, name, var, &err);
+       if (err) {
+               _E("%d %s\n", ret, err ? err->message : NULL);
+               g_error_free(err);
+       }
+
+       return ret;
+}
+
+int dbus_handle_broadcast_dbus_signal_var(const char *path,
+                                                                                       const char *iface, const char *name,
+                                                                                       GVariant *param)
+{
+       dbus_handle_s *dh = NULL;
+       GError *err = NULL;
+       gboolean ret = 0;
+
+       dh = _dbus_handle_get_default_connection();
+       if (!dh) {
+               _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+               return -1;
+       }
+
+       ret = g_dbus_connection_emit_signal(dh->conn, NULL, path, iface, name, param, &err);
+       if (err) {
+               _E("%d %s\n", ret, err ? err->message : NULL);
+               g_error_free(err);
+       }
+
+       return ret;
+}
+
+GVariant *dbus_method_sync_with_reply(const char *dest, const char *path,
+                                                                               const char *iface, const char *method,
+                                                                               const char *signature, const char *param[])
+{
+       GError *err = NULL;
+       GVariant * var = NULL;
+       GVariant * ret = NULL;
+       dbus_handle_s *dh = NULL;
+
+       if (!dest || !path || !iface || !method) {
+               _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method);
+               return NULL;
+       }
+
+       dh = _dbus_handle_get_default_connection();
+       if (!dh) {
+               _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+               return NULL;
+       }
+
+       if (signature && param)
+               var = _append_variant(signature, param);
+
+       ret = g_dbus_connection_call_sync(dh->conn,
+               dest, path, iface, method,
+               var, NULL, G_DBUS_CALL_FLAGS_NONE, DBUS_REPLY_TIMEOUT, NULL, &err);
+       if (!ret || err) {
+               if (err) {
+                       _E("failed to g_dbus_connection_call_sync:%s", err->message);
+                       g_error_free(err);
+               } else {
+                       _E("failed to g_dbus_connection_call_sync");
+                       g_variant_unref(var);
+               }
+               return NULL;
+       }
+
+       return ret;
+}
+
+GVariant *dbus_method_sync_with_reply_var(const char *dest, const char *path,
+       const char *iface, const char *method, GVariant *var)
+{
+       GError *err = NULL;
+       GVariant * ret = NULL;
+       dbus_handle_s *dh = NULL;
+
+       if (!dest || !path || !iface || !method) {
+               _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method);
+               if (var)
+                       g_variant_unref(var);
+               return NULL;
+       }
+
+       dh = _dbus_handle_get_default_connection();
+       if (!dh) {
+               _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+               if (var)
+                       g_variant_unref(var);
+               return NULL;
+       }
+
+       ret = g_dbus_connection_call_sync(dh->conn,
+                                                                               dest, path, iface, method,
+                                                                               var, NULL, G_DBUS_CALL_FLAGS_NONE, DBUS_REPLY_TIMEOUT, NULL, &err);
+       if (!ret || err) {
+               if (err) {
+                       _E("failed to g_dbus_connection_call_sync:%s", err->message);
+                       g_error_free(err);
+               } else {
+                       _E("failed to g_dbus_connection_call_sync");
+               }
+               return NULL;
+       }
+
+       return ret;
+}
+
+gint* dbus_handle_get_unix_fd_list(GDBusMethodInvocation *invocation, int *size)
+{
+       GUnixFDList *fd_list = NULL;
+       int length = 0;
+
+       fd_list = g_dbus_message_get_unix_fd_list(g_dbus_method_invocation_get_message(invocation));
+
+       if (!fd_list) {
+               _E("failed to g_unix_fd_list_get_length: fd_list is null");
+               return NULL;
+       }
+
+       length = g_unix_fd_list_get_length(fd_list);
+       if (length == 0) {
+               _E("failed to g_unix_fd_list_get_length: list size is 0");
+               return NULL;
+       }
+       if (size)
+               *size = length;
+
+       return g_unix_fd_list_steal_fds(fd_list, NULL);
+}
+
+GVariant *dbus_method_with_unix_fd_list_sync_with_reply(const char *dest, const char *path,
+                                                                                                               const char *iface, const char *method,
+                                                                                                               const char *signature, const char *param[],
+                                                                                                               int *in_fdlist, int in_size,
+                                                                                                               int **out_fdlist, int *out_size)
+{
+       GError *err = NULL;
+       GVariant * var = NULL;
+       GVariant * ret = NULL;
+       dbus_handle_s *dh = NULL;
+       GDBusProxy *proxy = NULL;
+       GUnixFDList *g_infdlist = NULL;
+       GUnixFDList *g_outfdlist = NULL;
+
+       if (!dest || !path || !iface || !method) {
+               _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method);
+               return NULL;
+       }
+       if (in_fdlist && in_size == 0) {
+               _E("wrong in_fdlist is not null but in_size is 0");
+               return NULL;
+       }
+
+       dh = _dbus_handle_get_default_connection();
+       if (!dh) {
+               _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+               return NULL;
+       }
+
+       if (signature && param)
+               var = _append_variant(signature, param);
+
+       proxy = g_dbus_proxy_new_sync(dh->conn, G_DBUS_PROXY_FLAGS_NONE, NULL, dest, path, iface, NULL, &err);
+       if (!proxy) {
+               if (err) {
+                       _E("failed to proxy_new_sync(%s)\n", err->message);
+                       g_error_free(err);
+               } else {
+                       _E("failed to proxy_new_sync\n");
+                       if (var)
+                               g_variant_unref(var);
+               }
+       }
+
+       /* append fd */
+       if (in_fdlist) {
+               g_infdlist = g_unix_fd_list_new_from_array(in_fdlist, in_size);
+               if (!g_infdlist) {
+                       _E("failed to g_unix_fd_list_new_from_array\n");
+                       goto out;
+               }
+               //g_infdlist = g_unix_fd_list_new();
+               //if (g_unix_fd_list_append(g_infdlist, in_fdlist[0], &err) < 0) {
+       }
+
+       ret = g_dbus_proxy_call_with_unix_fd_list_sync(proxy, method, var, G_DBUS_CALL_FLAGS_NONE, -1,
+               g_infdlist, &g_outfdlist, NULL, &err);
+       if (!ret || err) {
+               if (err) {
+                       _E("failed to g_dbus_proxy_call_with_unix_fd_list_sync:%s", err->message);
+                       g_error_free(err);
+               } else {
+                       _E("failed to g_dbus_proxy_call_with_unix_fd_list_sync:");
+                       if (var)
+                               g_variant_unref(var);
+                       if (g_infdlist)
+                               g_object_unref(g_infdlist);
+               }
+               goto out;
+       }
+
+       /* fds to out array */
+       if (g_outfdlist) {
+               *out_size = g_unix_fd_list_get_length(g_outfdlist);
+               if (*out_size == 0)
+                       goto out;
+
+               *out_fdlist = g_unix_fd_list_steal_fds(g_outfdlist, NULL);
+       }
+
+out:
+       if (g_outfdlist)
+               g_object_unref(g_outfdlist);
+       if (proxy)
+               g_object_unref(proxy);
+
+       return ret;
+}
+
+GVariant *dbus_method_with_unix_fd_list_sync_with_reply_var(const char *dest, const char *path,
+                                                                                                                       const char *iface, const char *method,
+                                                                                                                       GVariant *param,
+                                                                                                                       int *in_fdlist, int in_size,
+                                                                                                                       int **out_fdlist, int *out_size)
 {
-       char *ch;
-       int i;
-       int int_type;
-       dbus_bool_t bool_type;
-       uint64_t int64_type;
-       DBusMessageIter arr;
-       struct dbus_byte *byte;
+       GError *err = NULL;
+       GVariant * ret = NULL;
+       dbus_handle_s *dh = NULL;
+       GDBusProxy *proxy = NULL;
+       GUnixFDList *g_infdlist = NULL;
+       GUnixFDList *g_outfdlist = NULL;
 
-       if (!sig || !param)
-               return 0;
+       if (!dest || !path || !iface || !method) {
+               _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method);
+               return NULL;
+       }
+       if (in_fdlist && in_size == 0) {
+               _E("wrong in_fdlist is not null but in_size is 0");
+               return NULL;
+       }
 
-       for (ch = (char *)sig, i = 0; *ch != '\0'; ++i, ++ch) {
-               switch (*ch) {
-               case 'b':
-                       bool_type = (atoi(param[i])) ? TRUE : FALSE;
-                       dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &bool_type);
-                       break;
-               case 'i':
-                       int_type = atoi(param[i]);
-                       dbus_message_iter_append_basic(iter, DBUS_TYPE_INT32, &int_type);
-                       break;
-               case 'u':
-                       int_type = strtoul(param[i], NULL, 10);
-                       dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &int_type);
-                       break;
-               case 't':
-                       int64_type = atoll(param[i]);
-                       dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT64, &int64_type);
-                       break;
-               case 's':
-                       dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &param[i]);
-                       break;
-               case 'a':
-                       ++ch;
-                       switch (*ch) {
-                       case 'y':
-                               ++i;
-                               dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE_AS_STRING, &arr);
-                               byte = (struct dbus_byte *)param[i];
-                               dbus_message_iter_append_fixed_array(&arr, DBUS_TYPE_BYTE, &(byte->data), byte->size);
-                               dbus_message_iter_close_container(iter, &arr);
-                               break;
-                       default:
-                               break;
-                       }
-                       break;
-               default:
-                       return -EINVAL;
+       dh = _dbus_handle_get_default_connection();
+       if (!dh) {
+               _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+               return NULL;
+       }
+
+       proxy = g_dbus_proxy_new_sync(dh->conn, G_DBUS_PROXY_FLAGS_NONE, NULL, dest, path, iface, NULL, &err);
+       if (!proxy) {
+               if (err) {
+                       _E("failed to proxy_new_sync(%s)\n", err->message);
+                       g_error_free(err);
+               } else {
+                       _E("failed to proxy_new_sync\n");
+                       if (param)
+                               g_variant_unref(param);
+               }
+               goto out;
+       }
+
+       /* append fd */
+       if (in_fdlist) {
+               g_infdlist = g_unix_fd_list_new_from_array(in_fdlist, in_size);
+               if (!g_infdlist) {
+                       _E("failed to g_unix_fd_list_new_from_array\n");
+                       goto out;
+               }
+               //g_infdlist = g_unix_fd_list_new();
+               //if (g_unix_fd_list_append(g_infdlist, in_fdlist[0], &err) < 0) {
+       }
+
+       /* send message */
+       ret = g_dbus_proxy_call_with_unix_fd_list_sync(proxy, method, param, G_DBUS_CALL_FLAGS_NONE, -1,
+               g_infdlist, &g_outfdlist, NULL, &err);
+       if (!ret || err) {
+               if (err) {
+                       _E("failed to g_dbus_proxy_call_with_unix_fd_list_sync:%s", err->message);
+                       g_error_free(err);
+               } else {
+                       _E("failed to g_dbus_proxy_call_with_unix_fd_list_sync:");
+                       if (param)
+                               g_variant_unref(param);
+                       if (g_infdlist)
+                               g_object_unref(g_infdlist);
                }
+               goto out;
+       }
+
+       /* copy fds to out array */
+       if (g_outfdlist) {
+               *out_size = g_unix_fd_list_get_length(g_outfdlist);
+               if (*out_size == 0)
+                       goto out;
+               *out_fdlist = g_unix_fd_list_steal_fds(g_outfdlist, NULL);
+       }
+out:
+       if (g_outfdlist)
+               g_object_unref(g_outfdlist);
+       if (proxy)
+               g_object_unref(proxy);
+       return ret;
+}
+
+int dbus_method_sync(const char *dest, const char *path,
+                                               const char *iface, const char *method,
+                                               const char *signature, const char *param[])
+{
+       int result;
+       gboolean result_bool;
+       GVariant *reply = NULL;
+
+       if (!dest || !path || !iface || !method) {
+               _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method);
+               return -1;
+       }
+
+       reply = dbus_method_sync_with_reply(dest, path, iface, method, signature, param);
+       if (!reply)
+               return -ECOMM;
+
+       if (g_strcmp0("(i)", g_variant_get_type_string(reply)) == 0) {
+               g_variant_get(reply, "(i)", &result);
+       } else if (g_strcmp0("(b)", g_variant_get_type_string(reply)) == 0) {
+               g_variant_get(reply, "(b)", &result_bool);
+               result = (int)result_bool;
+       } else {
+               result = -ENOMSG;
+       }
+
+       g_variant_unref(reply);
+
+       return result;
+}
+
+int dbus_method_sync_var(const char *dest, const char *path,
+       const char *iface, const char *method, GVariant *param)
+{
+       int result;
+       gboolean result_bool;
+       GVariant *reply = NULL;
+
+       if (!dest || !path || !iface || !method) {
+               _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method);
+               return -1;
+       }
+
+       reply = dbus_method_sync_with_reply_var(dest, path, iface, method, param);
+       if (!reply)
+               return -ECOMM;
+
+       if (g_strcmp0("(i)", g_variant_get_type_string(reply)) == 0) {
+               g_variant_get(reply, "(i)", &result);
+       } else if (g_strcmp0("(b)", g_variant_get_type_string(reply)) == 0) {
+               g_variant_get(reply, "(b)", &result_bool);
+               result = (int)result_bool;
+       } else {
+               result = -ENOMSG;
+       }
+
+       g_variant_unref(reply);
+
+       return result;
+}
+
+int dbus_method_sync_timeout(const char *dest, const char *path,
+                                                               const char *iface, const char *method,
+                                                               const char *signature, const char *param[], int timeout)
+{
+       dbus_handle_s *dh = NULL;
+       GError *err = NULL;
+       GVariant * var = NULL;
+       GVariant * reply = NULL;
+       int result = 0;
+
+       if (!dest || !path || !iface || !method) {
+               _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method);
+               return -1;
+       }
+
+       dh = _dbus_handle_get_default_connection();
+       if (!dh) {
+               _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+               return -EPERM;
+       }
+
+       if (signature && param)
+               var = _append_variant(signature, param);
+
+       reply = g_dbus_connection_call_sync(dh->conn,
+                                                                               dest, path, iface, method,
+                                                                               var, NULL, G_DBUS_CALL_FLAGS_NONE, timeout, NULL, &err);
+       if (!reply || err) {
+               _E("failed to g_dbus_connection_call_sync:%s", err->message);
+               g_error_free(err);
+               return -1;
+       }
+
+       if (g_strcmp0("(i)", g_variant_get_type_string(reply)) == 0)
+               g_variant_get(reply, "(i)", &result);
+       else
+               result = -ENOMSG;
+
+       g_variant_unref(reply);
+
+       return result;
+}
+
+int dbus_method_sync_pairs(const char *dest, const char *path,
+                                                       const char *iface, const char *method,
+                                                       int num, va_list args)
+{
+       GError *err = NULL;
+       GVariant * reply = NULL;
+       char *key, *value;
+       int ret = 0;
+       GVariant *var;
+       GVariantBuilder *builder;
+       dbus_handle_s *dh = NULL;
+
+       if (!dest || !path || !iface || !method) {
+               _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method);
+               return -1;
+       }
+
+       dh = _dbus_handle_get_default_connection();
+       if (!dh) {
+               _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+               return -1;
+       }
+
+       builder = g_variant_builder_new(G_VARIANT_TYPE("a{ss}"));
+
+       for (int i = 0 ; i < num ; i = i + 2) {
+               key = va_arg(args, char *);
+               value = va_arg(args, char *);
+               _I("key(%s), value(%s)", key, value);
+               g_variant_builder_add(builder, "{ss}", key, value);
+       }
+
+       var = g_variant_new("(a{ss})", builder);
+
+       reply = g_dbus_connection_call_sync(dh->conn,
+               dest, path, iface, method,
+               var, NULL, G_DBUS_CALL_FLAGS_NONE, DBUS_REPLY_TIMEOUT, NULL, &err);
+       if (!reply || err) {
+               _E("failed to g_dbus_connection_call_sync");
+               return -1;
+       }
+
+       if (g_strcmp0("(i)", g_variant_get_type_string(reply)) == 0)
+               g_variant_get(reply, "(i)", &ret);
+       else
+               ret = -ENOMSG;
+
+       g_variant_unref(reply);
+
+       return ret;
+}
+
+int dbus_method_async_pairs(const char *dest, const char *path,
+       const char *iface, const char *method,
+       int num, va_list args)
+{
+       char *key, *value;
+       GVariant *var;
+       GVariantBuilder *builder;
+       dbus_handle_s *dh = NULL;
+
+       if (!dest || !path || !iface || !method) {
+               _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method);
+               return -1;
+       }
+
+       dh = _dbus_handle_get_default_connection();
+       if (!dh) {
+               _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+               return -1;
+       }
+
+       // dict
+       builder = g_variant_builder_new(G_VARIANT_TYPE("a{ss}"));
+
+       for (int i = 0 ; i < num ; i = i + 2) {
+               key = va_arg(args, char *);
+               value = va_arg(args, char *);
+               _I("key(%s), value(%s)", key, value);
+               g_variant_builder_add(builder, "{ss}", key, value);
+       }
+
+       var = g_variant_new("(a{ss})", builder);
+
+       g_dbus_connection_call(dh->conn, dest, path, iface, method,
+               var, NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL,
+               NULL,
+               NULL);
+
+       return 0;
+}
+
+int dbus_method_async(const char *dest, const char *path,
+       const char *iface, const char *method,
+       const char *signature, const char *param[])
+{
+       GVariant * var = NULL;
+       dbus_handle_s *dh = NULL;
+
+       if (!dest || !path || !iface || !method) {
+               _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method);
+               return -1;
+       }
+
+       dh = _dbus_handle_get_default_connection();
+       if (!dh) {
+               _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+               return -1;
+       }
+
+       if (signature && param)
+               var = _append_variant(signature, param);
+
+       g_dbus_connection_call(dh->conn, dest, path, iface, method,
+                                                       var, NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL,
+                                                       NULL,
+                                                       NULL);
+
+       return 0;
+}
+
+int dbus_method_async_var(const char *dest, const char *path,
+       const char *iface, const char *method, GVariant *param)
+{
+       dbus_handle_s *dh = NULL;
+
+       if (!dest || !path || !iface || !method) {
+               _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method);
+               return -1;
+       }
+
+       dh = _dbus_handle_get_default_connection();
+       if (!dh) {
+               _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+               return -1;
        }
 
+       g_dbus_connection_call(dh->conn, dest, path, iface, method,
+               param, NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL,
+               NULL,
+               NULL);
+
        return 0;
 }
 
-DBusMessage *dbus_method_sync_with_reply(const char *dest, const char *path,
-               const char *interface, const char *method,
-               const char *sig, char *param[])
+/* callback should free gvariant */
+static void _cb_pending(GDBusConnection *conn,
+                                               GAsyncResult    *res,
+                                               gpointer         user_data)
+{
+       GVariant *reply = NULL;
+       GError *err = NULL;
+       pending_call_data *data = (pending_call_data *)user_data;
+
+       reply = g_dbus_connection_call_finish(conn, res, &err);
+       if (!reply || err) {
+               if (err) {
+                       _E("no message : [%s]", err->message);
+                       g_error_free(err);
+               } else {
+                       _E("no message");
+               }
+
+               if (data && data->func)
+                       data->func(NULL, data->data, err);
+               goto out;
+       }
+
+       if (data && data->func)
+               data->func(reply, data->data, err);
+out:
+       if (data)
+               free(data);
+}
+
+int dbus_method_async_with_reply(const char *dest,
+                                                                       const char *path,
+                                                                       const char *iface,
+                                                                       const char *method,
+                                                                       const char *signature,
+                                                                       const char *param[],
+                                                                       dbus_pending_cb cb,
+                                                                       int timeout_msec,
+                                                                       void *data)
+{
+       dbus_handle_s *dh = NULL;
+       pending_call_data *pdata = NULL;
+       GVariant * var = NULL;
+       int ret = 0;
+
+       if (!dest || !path || !iface || !method) {
+               _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method);
+               return -1;
+       }
+
+       if (timeout_msec < -1) {
+               _E("wrong timeout %d", timeout_msec);
+               return -1;
+       }
+
+       dh = _dbus_handle_get_default_connection();
+       if (!dh) {
+               _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+               return -EPERM;
+       }
+
+       if (signature && param)
+               var = _append_variant(signature, param);
+
+       if (cb) {
+               pdata = (pending_call_data*)malloc(sizeof(pending_call_data));
+               if (!pdata) {
+                       ret = -ENOMEM;
+                       goto err;
+               }
+
+               pdata->func = cb;
+               pdata->data = data;
+       }
+       g_dbus_connection_call(dh->conn, dest, path, iface, method,
+                                                       var, NULL, G_DBUS_CALL_FLAGS_NONE, timeout_msec, NULL,
+                                                       (GAsyncReadyCallback)_cb_pending,
+                                                       pdata);
+
+       return ret;
+err:
+       if (var)
+               g_variant_unref(var);
+       return ret;
+}
+
+int dbus_method_async_with_reply_var(const char *dest,
+                                                                               const char *path,
+                                                                               const char *iface,
+                                                                               const char *method,
+                                                                               GVariant *param,
+                                                                               dbus_pending_cb cb,
+                                                                               int timeout_msec,
+                                                                               void *data)
 {
-       DBusConnection *conn;
-       DBusMessage *msg;
-       DBusMessageIter iter;
-       DBusMessage *reply;
-       DBusError err;
-       int r;
+       dbus_handle_s *dh = NULL;
+       pending_call_data *pdata = NULL;
+       int ret = 0;
+
+       if (!dest || !path || !iface || !method) {
+               _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method);
+               return -1;
+       }
+
+       if (timeout_msec < -1) {
+               _E("wrong timeout %d", timeout_msec);
+               return -1;
+       }
+
+       dh = _dbus_handle_get_default_connection();
+       if (!dh) {
+               _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+               return -EPERM;
+       }
+
+       if (cb) {
+               pdata = (pending_call_data*)malloc(sizeof(pending_call_data));
+               if (!pdata) {
+                       ret = -ENOMEM;
+                       goto err;
+               }
+
+               pdata->func = cb;
+               pdata->data = data;
+       }
+       g_dbus_connection_call(dh->conn, dest, path, iface, method,
+               param, NULL, G_DBUS_CALL_FLAGS_NONE, timeout_msec, NULL,
+               (GAsyncReadyCallback)_cb_pending,
+               pdata);
+
+       return ret;
+err:
+       if (param)
+               g_variant_unref(param);
+       return ret;
+}
+
+int dbus_connection_get_sender_pid(GDBusConnection *conn, const char * sender)
+{
+       GError *err = NULL;
+       GVariant *vret = NULL;
+       pid_t pid = 0;
 
-       conn = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
        if (!conn) {
-               _E("dbus_bus_get error");
-               return NULL;
+               _E("connection is null");
+               return -1;
+       }
+       if (!sender) {
+               _E("sender is null");
+               return -1;
+       }
+
+       vret = g_dbus_connection_call_sync(conn,
+               "org.freedesktop.DBus", "/", "org.freedesktop.DBus", "GetConnectionUnixProcessID",
+               g_variant_new("(s)", sender),
+               NULL,
+               G_DBUS_CALL_FLAGS_NONE,
+               DBUS_REPLY_TIMEOUT,
+               NULL,
+               &err);
+       if (!vret || err) {
+               _E("failed to g_dbus_connection_call_sync:%s", err->message);
+               g_error_free(err);
+               return -1;
+       }
+
+       g_variant_get(vret, "(u)", &pid);
+       g_variant_unref(vret);
+
+       return pid;
+}
+
+int dbus_handle_get_sender_pid(dbus_handle_h handle, const char * sender)
+{
+       dcl_dbus_handle();
+
+       if (!dh) {
+               dh = _dbus_handle_get_default_connection();
+               if (!dh) {
+                       _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+                       return -1;
+               }
+       }
+       if (!dh->conn) {
+               _E("wrong dbus handle. connection is null");
+               assert(0);
+               return -1;
+       }
+
+       return dbus_connection_get_sender_pid(dh->conn, sender);
+}
+
+int dbus_handle_get_sender_credentials(dbus_handle_h handle, const char *name, GDBusCredentials *creds)
+{
+       dcl_dbus_handle();
+       GVariant *vret = NULL;
+       GError *err = NULL;
+       GVariantIter *iter = NULL;
+       char * item;
+       GVariant *sub;
+
+       if (!dh) {
+               dh = _dbus_handle_get_default_connection();
+               if (!dh) {
+                       _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+                       return -1;
+               }
+       }
+       vret = g_dbus_connection_call_sync(dh->conn, DBUS_BUS_NAME, DBUS_OBJECT_PATH, DBUS_INTERFACE_NAME,
+               "GetConnectionCredentials", g_variant_new("(s)", name), NULL, G_DBUS_CALL_FLAGS_NONE, DBUS_REPLY_TIMEOUT, NULL, &err);
+       if (!vret || err) {
+               _E("failed to g_dbus_connection_call_sync:%s", err->message);
+               return -1;
+       }
+
+       g_variant_get(vret, "(a{sv})", &iter);
+
+       while (g_variant_iter_loop(iter, "{sv}", &item, &sub)) {
+               if (!g_strcmp0(item, "UnixUserID")) {
+                       g_variant_get(sub, "u", &creds->uid);
+                       _D("UnixUserID %u", creds->uid);
+               } else if (!g_strcmp0(item, "ProcessID")) {
+                       g_variant_get(sub, "u", &creds->pid);
+                       _D("ProcessID %u", creds->pid);
+               } else if (!g_strcmp0(item, "LinuxSecurityLabel")) {
+                       g_variant_get(sub, "^ay", &creds->sec_label);
+                       _D("%s", creds->sec_label);
+               }
+       }
+
+       if (iter)
+               g_variant_iter_free(iter);
+       if (vret)
+               g_variant_unref(vret);
+
+       return 0;
+}
+
+void _destroy_notify_watch_name(gpointer data)
+{
+       /*if (data)
+               free(data);*/
+}
+
+int dbus_handle_watch_name(const char *name,
+                                                       GBusNameAppearedCallback  name_appeared_handler,
+                                                       GBusNameVanishedCallback  name_vanished_handler,
+                                                       void *user_data)
+{
+       guint id = 0;
+
+       if (!name) {
+               _E("wrong name name %s", name);
+               return -1;
+       }
+       if (!name_appeared_handler && !name_vanished_handler) {
+               _E("both function pointers are null");
+               return -1;
+       }
+
+       id = g_bus_watch_name(dbus_handle_get_default_bus_type(), name, G_BUS_NAME_WATCHER_FLAGS_NONE, name_appeared_handler, name_vanished_handler, user_data, _destroy_notify_watch_name);
+       if (!id) {
+               _E("failed to g_bus_watch_name");
+               return -1;
+       }
+
+       return id;
+}
+
+void dbus_handle_unwatch_name(guint id)
+{
+       if (id == 0) {
+               _E("wrong id %d", id);
+               return;
+       }
+       g_bus_unwatch_name(id);
+}
+
+int _get_cmdline_name(pid_t pid, char *cmdline, size_t cmdline_size)
+{
+       int fd, ret;
+       char buf[PATH_MAX + 1];
+       char *filename;
+
+       snprintf(buf, sizeof(buf), "/proc/%d/cmdline", pid);
+       fd = open(buf, O_RDONLY);
+       if (fd < 0) {
+               errno = ESRCH;
+               return -1;
+       }
+
+       ret = read(fd, buf, PATH_MAX);
+       close(fd);
+       if (ret < 0)
+               return -1;
+
+       buf[PATH_MAX] = '\0';
+
+       filename = strrchr(buf, '/');
+       if (filename == NULL)
+               filename = buf;
+       else
+               filename = filename + 1;
+
+       if (cmdline_size < strlen(filename) + 1) {
+               errno = EOVERFLOW;
+               return -1;
        }
 
-       msg = dbus_message_new_method_call(dest, path, interface, method);
-       if (!msg) {
-               _E("dbus_message_new_method_call(%s:%s-%s)",
-                       path, interface, method);
+       strncpy(cmdline, filename, cmdline_size - 1);
+       cmdline[cmdline_size - 1] = '\0';
+       return 0;
+}
+
+// g_strfreev(strv)
+char **dbus_handle_get_owner_list(dbus_handle_h handle, const char *bus_name)
+{
+       dcl_dbus_handle();
+       GError *err = NULL;
+       GVariant *vret = NULL;
+       GVariantIter *iter = NULL;
+       gchar **strv = NULL;
+       gchar *str = NULL;
+       int i = 0;
+
+       if (!bus_name) {
+               _E("wrong parameter bus_name(%s)", bus_name);
                return NULL;
        }
 
-       dbus_message_iter_init_append(msg, &iter);
-       r = append_variant(&iter, sig, param);
-       if (r < 0) {
-               _E("append_variant error(%d) %s %s:%s-%s",
-                       r, dest, path, interface, method);
-               dbus_message_unref(msg);
+       if (!dh) {
+               dh = _dbus_handle_get_default_connection();
+               if (!dh) {
+                       _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+                       return NULL;
+               }
+       }
+
+       vret = g_dbus_connection_call_sync(dh->conn,
+               "org.freedesktop.DBus", "/", "org.freedesktop.DBus", "ListQueuedOwners",
+               g_variant_new("(s)", bus_name),
+               NULL,
+               G_DBUS_CALL_FLAGS_NONE,
+               DBUS_REPLY_TIMEOUT,
+               NULL,
+               &err);
+       if (!vret || err) {
+               _E("failed to g_dbus_connection_call_sync:%s", err->message);
+               g_error_free(err);
                return NULL;
        }
 
-       dbus_error_init(&err);
+       g_variant_get(vret, "(as)", &iter);
+       strv = g_new(gchar *, g_variant_iter_n_children(iter) + 1);
+
+       i = 0;
+       while (g_variant_iter_loop(iter, "s", &str))
+               strv[i++] = g_strdup(str);
+       strv[i] = NULL;
+
+       g_variant_iter_free(iter);
+       g_variant_unref(vret);
+
+       return strv;
+}
+
+void dbush_handle_check_owner_name(dbus_handle_h handle, const char *owner_name)
+{
+       dcl_dbus_handle();
+       char exe_name[PATH_MAX];
+       int pid;
+       char **strv = NULL;
+       int i;
+
+       if (!dh) {
+               dh = _dbus_handle_get_default_connection();
+               if (!dh) {
+                       _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type());
+                       return ;
+               }
+       }
 
-       reply = dbus_connection_send_with_reply_and_block(conn, msg, DBUS_REPLY_TIMEOUT, &err);
-       if (!reply) {
-               _E("dbus_connection_send error(No reply) %s %s:%s-%s",
-                       dest, path, interface, method);
+       strv = dbus_handle_get_owner_list(dh, owner_name);
+       if (!strv) {
+               _E("failed to get owner list of %s", owner_name);
+               return ;
        }
 
-       if (dbus_error_is_set(&err)) {
-               _E("dbus_connection_send error(%s:%s) %s %s:%s-%s",
-                       err.name, err.message, dest, path, interface, method);
-               dbus_error_free(&err);
-               reply = NULL;
+       for (i = 0; strv[i] != NULL; ++i) {
+               pid = dbus_handle_get_sender_pid(dh, strv[i]);
+               if (_get_cmdline_name(pid, exe_name, PATH_MAX) != 0)
+                       break;
+               _I("%s(%d)", exe_name, pid);
        }
 
-       dbus_message_unref(msg);
-       return reply;
+       g_strfreev(strv);
 }
 
-static void __CONSTRUCTOR__ dbus_init(void)
+dbus_handle_h dbus_handle_init(GBusType type, const char* bus_name)
 {
-       dbus_threads_init_default();
+       dbus_handle_h handle = NULL;
+       int i, ret = 0;
+
+       if (!bus_name) {
+               _E("Wrong bus name, %s", bus_name);
+               return NULL;
+       }
+
+       // todo: do we need retry ? - booting time
+       for (i = 0 ; i < 3; ++i) {
+               handle = dbus_handle_get_connection(type, FALSE);
+               if (handle)
+                       break;
+               usleep(5000);
+       }
+       ret = dbus_handle_request_bus_name(handle, bus_name);
+       if (ret <= 0)
+               goto out;
+
+       dbush_handle_check_owner_name(NULL, bus_name);
+
+       return handle;
+
+out:
+       return NULL;
 }
index 4fb1436..4d35471 100644 (file)
 #ifndef __DBUS_H__
 #define __DBUS_H__
 
-#include <dbus/dbus.h>
+#include <gio/gio.h>
+#include <glib-unix.h>
+#include <gio/gunixfdlist.h>
 #include <stdarg.h>
+#include <assert.h>
 
 /*
  * Template
 #define VIBRATOR_PATH_HAPTIC                 VIBRATOR_OBJECT_PATH"/Haptic"
 #define VIBRATOR_INTERFACE_HAPTIC            VIBRATOR_INTERFACE_NAME".haptic"
 
-struct dbus_byte {
+typedef struct {
        const unsigned char *data;
        int size;
-};
+} dbus_byte;
 
-int append_variant(DBusMessageIter *iter, const char *sig, char *param[]);
+GVariant *dbus_method_sync_with_reply(const char *dest, const char *path,
+               const char *interface, const char *method,
+               const char *sig, const char *param[]);
+
+GVariant *dbus_method_sync_with_reply_var(const char *dest, const char *path, const char *iface, const char *method, GVariant *var);
+
+/* fd */
+gint* dbus_handle_get_unix_fd_list(GDBusMethodInvocation *invocation, int *size);
+
+GVariant *dbus_method_with_unix_fd_list_sync_with_reply(const char *dest, const char *path,
+               const char *iface, const char *method,
+               const char *signature, const char *param[],
+               int *in_fdlist, int in_size,
+               int **out_fdlist, int *out_size);
+GVariant *dbus_method_with_unix_fd_list_sync_with_reply_var(const char *dest, const char *path,
+               const char *iface, const char *method,
+               GVariant *param,
+               int *in_fdlist, int in_size,
+               int **out_fdlist, int *out_size);
+
+int dbus_method_sync(const char *dest, const char *path,
+               const char *interface, const char *method,
+               const char *sig, const char *param[]);
+
+int dbus_method_sync_var(const char *dest, const char *path, const char *iface, const char *method, GVariant *param);
 
-DBusMessage *dbus_method_sync_with_reply(const char *dest, const char *path,
+int dbus_method_sync_timeout(const char *dest, const char *path,
+               const char *interface, const char *method,
+               const char *sig, const char *param[], int timeout);
+
+int dbus_method_sync_pairs(const char *dest, const char *path,
+               const char *interface, const char *method,
+               int num, va_list args);
+int dbus_method_async_pairs(const char *dest, const char *path,
                const char *interface, const char *method,
-               const char *sig, char *param[]);
+               int num, va_list args);
+int dbus_method_async(const char *dest, const char *path,
+               const char *interface, const char *method,
+               const char *sig, const char *param[]);
+
+int dbus_method_async_var(const char *dest, const char *path, const char *iface, const char *method, GVariant *param);
+
+typedef void (*dbus_pending_cb)(GVariant *var, void *user_data, GError *err);
+
+int dbus_method_async_with_reply(const char *dest,
+               const char *path,
+               const char *iface,
+               const char *method,
+               const char *signature,
+               const char *param[],
+               dbus_pending_cb cb,
+               int timeout_msec,
+               void *data);
+
+
+int dbus_method_async_with_reply_var(const char *dest,
+               const char *path,
+               const char *iface,
+               const char *method,
+               GVariant *param,
+               dbus_pending_cb cb,
+               int timeout_msec,
+               void *data);
+
+int check_systemd_active(void);
+
+/**
+ * @brief   Dbus handler which is used to register and call methods
+
+ * @since_tizen 4.0
+ */
+typedef void *dbus_handle_h;
+
+/**
+ * @brief   Dbus method handler which is used to unregister dbus methods
+ * @since_tizen 4.0
+ */
+typedef void *dbus_object_handle_h;
+
+/**
+ * @brief   Structure which contains the dbus method name and callback function.
+ * @since_tizen 4.0
+ */
+typedef struct {
+       const char *member;
+       const char *signature_in;
+       const char *signature_out;
+       GVariant *(*func)(GDBusConnection *conn,
+               const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
+               GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data);
+} dbus_method_s;
+
+/**
+ * @brief   Structure which contains the dbus interface information and its methods.i
+ * @since_tizen 4.0
+ */
+typedef struct {
+       dbus_object_handle_h oh;
+       const char *name;
+       const dbus_method_s *methods;
+       int nr_methods;
+} dbus_interface_u;
+
+#define dh_get_param_from_var(gvar, signature, ...) ((g_strcmp0(signature, g_variant_get_type_string(gvar)) == 0) ? g_variant_get(gvar, signature, __VA_ARGS__), TRUE : FALSE)
+
+#define dbus_handle_new_g_variant_tuple() g_variant_new_tuple(NULL, 0)
+
+/**
+ * @brief   Callback function which is called when the user data needs to be released.
+ * @since_tizen 4.0
+ */
+typedef void (*destroy_notified)(void *data);
+
+typedef struct {
+       dbus_pending_cb func;
+       void *data;
+} pending_call_data;
+
+int dbus_handle_request_bus_name(dbus_handle_h handle, const char *bus_name);
+
+dbus_handle_h dbus_handle_get_connection(GBusType bus_type, gboolean priv);
+
+int dbus_handle_register_dbus_object(dbus_handle_h handle, const char *obj_path, const dbus_interface_u *iface);
+int dbus_handle_unregister_dbus_object(dbus_handle_h handle, const char *obj_path);
+
+int dbus_handle_add_dbus_object(dbus_handle_h handle, const char *obj_path, const dbus_interface_u *iface_u);
+int dbus_handle_register_dbus_object_all(dbus_handle_h handle);
+
+guint subscribe_dbus_signal(dbus_handle_h handle, const char *path, const char *iface, const char *name, GDBusSignalCallback cb, void *data, destroy_notified free_func);
+void unsubscribe_dbus_signal(dbus_handle_h handle, guint id);
+
+GVariant *dbus_handle_make_simple_array(const char *sig, int *param);
+
+int dbus_handle_broadcast_dbus_signal(const char *path, const char *iface, const char *name, const char *signature, const char *param[]);
+int dbus_handle_broadcast_dbus_signal_var(const char *path, const char *iface, const char *name, GVariant *param);
+
+typedef struct
+{
+       guint   pid;
+       guint   uid;
+       gchar  *unique_name;
+       gchar  *sec_label;
+} GDBusCredentials;
+
+int dbus_connection_get_sender_pid(GDBusConnection *conn, const char * sender);
+int dbus_handle_get_sender_pid(dbus_handle_h handle, const char * sender);
+int dbus_handle_get_sender_credentials(dbus_handle_h handle, const char *name, GDBusCredentials *creds);
+int dbus_handle_watch_name(const char *name, GBusNameAppearedCallback name_appeared_handler, GBusNameVanishedCallback name_vanished_handler, void *user_data);
+void dbus_handle_unwatch_name(guint id);
+dbus_handle_h dbus_handle_init(GBusType type, const char* bus_name);
+char** dbus_handle_get_owner_list(dbus_handle_h handle, const char *bus_name);
+void dbush_handle_check_owner_name(dbus_handle_h handle, const char *owner_name);
 
 #endif
index 2d58b63..d3bbec9 100644 (file)
@@ -17,7 +17,7 @@
  */
 
 
-#include <Ecore.h>
+#include <stdlib.h>
 #include <glib.h>
 #include <errno.h>
 
@@ -29,7 +29,7 @@ struct device_request {
 };
 
 static GQueue req_queue = G_QUEUE_INIT;
-static Ecore_Idler *idler;
+static guint idler;
 
 static int free_request(struct device_request *req)
 {
@@ -40,7 +40,7 @@ static int free_request(struct device_request *req)
        return 0;
 }
 
-static Eina_Bool idler_cb(void *data)
+static gboolean idler_cb(void *data)
 {
        struct device_request *req;
 
@@ -52,11 +52,11 @@ static Eina_Bool idler_cb(void *data)
        }
 
        if (g_queue_is_empty(&req_queue)) {
-               idler = NULL;
-               return ECORE_CALLBACK_CANCEL;
+               idler = 0;
+               return G_SOURCE_REMOVE;
        }
 
-       return ECORE_CALLBACK_RENEW;
+       return G_SOURCE_CONTINUE;
 }
 
 static void process_next_request_in_idle(void)
@@ -67,7 +67,7 @@ static void process_next_request_in_idle(void)
        if (idler)
                return;
 
-       idler = ecore_idler_add(idler_cb, NULL);
+       idler = g_idle_add(idler_cb, NULL);
        /**
         * if idler is null,
         * it means whole system might be an abnormal state.
index b1f62d3..fff5a4c 100644 (file)
@@ -64,7 +64,7 @@ struct watch_info {
 };
 
 static dd_list *edbus_object_list;
-static dd_list *edbus_owner_list;
+//static dd_list *edbus_owner_list;
 static dd_list *edbus_handler_list;
 static dd_list *edbus_watch_list;
 static int edbus_init_val;
@@ -671,82 +671,82 @@ static void request_name_cb(void *data, DBusMessage *msg, DBusError *error)
 
 static void check_owner_name(void)
 {
-       DBusError err;
-       DBusMessage *msg;
-       DBusMessageIter iter;
-       char *pa[1];
-       char exe_name[PATH_MAX];
-       char *entry;
-       dd_list *n;
-       int pid;
-
-       DD_LIST_FOREACH(edbus_owner_list, n, entry) {
-               pa[0] = entry;
-               msg = dbus_method_sync_with_reply(E_DBUS_FDO_BUS,
-                       E_DBUS_FDO_PATH,
-                       E_DBUS_FDO_INTERFACE,
-                       "GetConnectionUnixProcessID", "s", pa);
-
-               if (!msg) {
-                       _E("invalid DBusMessage!");
-                       return;
-               }
-
-               dbus_error_init(&err);
-               dbus_message_iter_init(msg, &iter);
-
-               dbus_message_iter_get_basic(&iter, &pid);
-               if (get_cmdline_name(pid, exe_name, PATH_MAX) != 0)
-                       goto out;
-               _I("%s(%d)", exe_name, pid);
-
-out:
-               dbus_message_unref(msg);
-               dbus_error_free(&err);
-       }
+//     DBusError err;
+//     DBusMessage *msg;
+//     DBusMessageIter iter;
+//     char *pa[1];
+//     char exe_name[PATH_MAX];
+//     char *entry;
+//     dd_list *n;
+//     int pid;
+//
+//     DD_LIST_FOREACH(edbus_owner_list, n, entry) {
+//             pa[0] = entry;
+//             msg = dbus_method_sync_with_reply(E_DBUS_FDO_BUS,
+//                     E_DBUS_FDO_PATH,
+//                     E_DBUS_FDO_INTERFACE,
+//                     "GetConnectionUnixProcessID", "s", pa);
+//
+//             if (!msg) {
+//                     _E("invalid DBusMessage!");
+//                     return;
+//             }
+//
+//             dbus_error_init(&err);
+//             dbus_message_iter_init(msg, &iter);
+//
+//             dbus_message_iter_get_basic(&iter, &pid);
+//             if (get_cmdline_name(pid, exe_name, PATH_MAX) != 0)
+//                     goto out;
+//             _I("%s(%d)", exe_name, pid);
+//
+//out:
+//             dbus_message_unref(msg);
+//             dbus_error_free(&err);
+//     }
 }
 
 static void check_owner_list(void)
 {
-       DBusError err;
-       DBusMessage *msg;
-       DBusMessageIter array, item;
-       char *pa[1];
-       char *name;
-       char *entry;
-
-       pa[0] = VIBRATOR_BUS_NAME;
-       msg = dbus_method_sync_with_reply(E_DBUS_FDO_BUS,
-                       E_DBUS_FDO_PATH,
-                       E_DBUS_FDO_INTERFACE,
-                       "ListQueuedOwners", "s", pa);
-
-       if (!msg) {
-               _E("invalid DBusMessage!");
-               return;
-       }
-
-       dbus_error_init(&err);
-       dbus_message_iter_init(msg, &array);
-
-       if (dbus_message_iter_get_arg_type(&array) != DBUS_TYPE_ARRAY)
-               goto out;
-       dbus_message_iter_recurse(&array, &item);
-       while (dbus_message_iter_get_arg_type(&item) == DBUS_TYPE_STRING) {
-               dbus_message_iter_get_basic(&item, &name);
-               entry = strndup(name, strlen(name));
-               DD_LIST_APPEND(edbus_owner_list, entry);
-               if (!edbus_owner_list) {
-                       _E("append failed");
-                       free(entry);
-                       goto out;
-               }
-               dbus_message_iter_next(&item);
-       }
-
-out:
-       dbus_message_unref(msg);
-       dbus_error_free(&err);
+//     DBusError err;
+//     DBusMessage *msg;
+//     DBusMessageIter array, item;
+//     char *pa[1];
+//     char *name;
+//     char *entry;
+//
+//     pa[0] = VIBRATOR_BUS_NAME;
+//     msg = dbus_method_sync_with_reply(E_DBUS_FDO_BUS,
+//                     E_DBUS_FDO_PATH,
+//                     E_DBUS_FDO_INTERFACE,
+//                     "ListQueuedOwners", "s", pa);
+//
+//     if (!msg) {
+//             _E("invalid DBusMessage!");
+//             return;
+//     }
+//
+//     dbus_error_init(&err);
+//     dbus_message_iter_init(msg, &array);
+//
+//     if (dbus_message_iter_get_arg_type(&array) != DBUS_TYPE_ARRAY)
+//             goto out;
+//     dbus_message_iter_recurse(&array, &item);
+//     while (dbus_message_iter_get_arg_type(&item) == DBUS_TYPE_STRING) {
+//             dbus_message_iter_get_basic(&item, &name);
+//             entry = strndup(name, strlen(name));
+//             DD_LIST_APPEND(edbus_owner_list, entry);
+//             if (!edbus_owner_list) {
+//                     _E("append failed");
+//                     free(entry);
+//                     goto out;
+//             }
+//             dbus_message_iter_next(&item);
+//     }
+//
+//out:
+//     dbus_message_unref(msg);
+//     dbus_error_free(&err);
 }
 
 void edbus_init(void *data)
index 8ae1fb9..f2e39cc 100644 (file)
 #include <stdio.h>
 #include <fcntl.h>
 #include <sys/reboot.h>
+#include <glib.h>
 
 #include "core/log.h"
 #include "core/common.h"
-#include "core/edbus-handler.h"
 #include "core/dbus.h"
 #include "haptic/haptic.h"
 
+static GMainLoop *mainloop = NULL;
+
 static void sig_quit(int signo)
 {
        _D("received SIGTERM signal %d", signo);
@@ -36,15 +38,23 @@ static void sig_usr1(int signo)
 {
        _D("received SIGUSR1 signal %d, feedbackd'll be finished!", signo);
 
-       ecore_main_loop_quit();
+       if (mainloop) {
+               if (g_main_loop_is_running(mainloop))
+                       g_main_loop_quit(mainloop);
+               mainloop = NULL;
+       }
 }
 
 int main(int argc, char **argv)
 {
        int ret;
 
-       ecore_init();
-       edbus_init(NULL);
+       mainloop = g_main_loop_new(NULL, FALSE);
+
+       if (!dbus_handle_init(G_BUS_TYPE_SYSTEM, VIBRATOR_BUS_NAME)) {
+               _E("failed to init dbus connection");
+       }
+
        ret = haptic_probe();
        if (ret != 0) {
                _E("[haptic] probe fail");
@@ -55,11 +65,13 @@ int main(int argc, char **argv)
        signal(SIGTERM, sig_quit);
        signal(SIGUSR1, sig_usr1);
 
-       ecore_main_loop_begin();
+       /* g_main_loop */
+       g_main_loop_run(mainloop);
 
        _D("[haptic] deinitialize");
        haptic_exit();
-       edbus_exit(NULL);
-       ecore_shutdown();
+       g_main_loop_unref(mainloop);
+       mainloop = NULL;
+
        return 0;
 }
index 2d99195..6555d40 100644 (file)
@@ -24,7 +24,6 @@
 #include <errno.h>
 #include <limits.h>
 #include <fcntl.h>
-#include <Ecore.h>
 #include <sys/types.h>
 
 #include "core/log.h"
@@ -39,7 +38,7 @@
 
 static int fd_play = -1, fd_stop = -1;
 static dd_list *handle_list;
-static Ecore_Timer *stop_timer;
+static guint stop_timer;
 static int unique_number;
 static bool state = false;
 
@@ -55,7 +54,7 @@ static bool find_from_list(int handle)
        return false;
 }
 
-static Eina_Bool timer_cb(void *data)
+static gboolean timer_cb(void *data)
 {
        int device_handle = (int)(long)data;
        int ret;
@@ -66,22 +65,22 @@ static Eina_Bool timer_cb(void *data)
 
        found = find_from_list(device_handle);
        if (!found)
-               return ECORE_CALLBACK_CANCEL;
+               return G_SOURCE_REMOVE;
 
        /* stop previous vibration */
        if (fd_stop < 0) {
                fd_stop = open(CIRCLE_OFF_PATH, O_RDONLY);
                if (fd_stop < 0)
-                       return ECORE_CALLBACK_CANCEL;
+                       return G_SOURCE_REMOVE;
        }
        ret = read(fd_stop, buf, BUF_SIZE);
        if (ret < 0) {
                _E("failed to stop");
-               return ECORE_CALLBACK_CANCEL;
+               return G_SOURCE_REMOVE;
        }
-       stop_timer = NULL;
+       stop_timer = 0;
 
-       return ECORE_CALLBACK_CANCEL;
+       return G_SOURCE_REMOVE;
 }
 
 static int get_device_count(int *count)
@@ -163,8 +162,8 @@ static int close_device(int device_handle)
        if (r >= 0) {
                _D("device handle %d is closed and timer deleted", device_handle);
                if (stop_timer) {
-                       ecore_timer_del(stop_timer);
-                       stop_timer = NULL;
+                       g_source_remove(stop_timer);
+                       stop_timer = 0;
                }
        }
 
@@ -221,7 +220,8 @@ static int vibrate_monotone(int device_handle, int duration, int feedback, int p
 
        /* register timer */
        if (duration) {
-               stop_timer = ecore_timer_add(duration/1000.f, timer_cb, (void *)(long)device_handle);
+               stop_timer = g_timeout_add_seconds(duration/1000, timer_cb, (void *)(long)device_handle);
+
                if (!stop_timer)
                        _E("Failed to add timer callback");
        }
@@ -268,8 +268,8 @@ static int stop_device(int device_handle)
                return -errno;
        }
        if (stop_timer) {
-               ecore_timer_del(stop_timer);
-               stop_timer = NULL;
+               g_source_remove(stop_timer);
+               stop_timer = 0;
        }
 
        return 0;
@@ -284,7 +284,7 @@ static int get_device_state(int device_index, int *effect_state)
        return 0;
 }
 
-static int create_effect(unsigned char *vibe_buffer, int max_bufsize, haptic_module_effect_element *elem_arr, int max_elemcnt)
+static int create_effect(unsigned char *vibe_buffer, int max_bufsize, const haptic_module_effect_element *elem_arr, int max_elemcnt)
 {
        _E("Not support feature");
        return -EACCES;
index db5492a..4548952 100644 (file)
@@ -132,7 +132,7 @@ static int get_device_state(int device_index, int *effect_state)
        return 0;
 }
 
-static int create_effect(unsigned char *vibe_buffer, int max_bufsize, haptic_module_effect_element *elem_arr, int max_elemcnt)
+static int create_effect(unsigned char *vibe_buffer, int max_bufsize, const haptic_module_effect_element *elem_arr, int max_elemcnt)
 {
        _E("Not support feature");
        return -EACCES;
old mode 100755 (executable)
new mode 100644 (file)
index 314ca3b..c44e768
@@ -18,7 +18,6 @@
 
 #include <stdlib.h>
 #include <glib.h>
-#include <Ecore.h>
 
 #include "core/log.h"
 #include "haptic.h"
@@ -76,7 +75,7 @@ static int unique_number;
 
 static bool state = false;
 //static bool is_playing = false;
-static Ecore_Timer *stop_timer = NULL;
+static guint stop_timer = 0;
 
 static int gpio_haptic_stop_device(int handle);
 
@@ -92,7 +91,7 @@ static bool find_from_list(int handle)
 }
 
 /* START: Haptic Module APIs */
-static Eina_Bool gpio_haptic_timer_cb(void *data)
+static gboolean gpio_haptic_timer_cb(void *data)
 {
        int handle = (int)(long)data;
        bool found;
@@ -101,7 +100,7 @@ static Eina_Bool gpio_haptic_timer_cb(void *data)
 
        found = find_from_list(handle);
        if (!found)
-               return ECORE_CALLBACK_CANCEL;
+               return G_SOURCE_REMOVE;
 
        if (device_handle == NULL) {
                if (peripheral_i2c_open(GPIO_I2C_BUS_INDEX, DRV2605L_DEFAULT_ADDR, &device_handle) < PERIPHERAL_ERROR_NONE) {
@@ -113,8 +112,8 @@ static Eina_Bool gpio_haptic_timer_cb(void *data)
        /*  stop playing */
        peripheral_i2c_write_register_byte(device_handle, DRV2605L_REGISTER_MODE, MODE_INTERNAL_TRIGGER);
 
-       stop_timer = NULL;
-       return ECORE_CALLBACK_CANCEL;
+       stop_timer = 0;
+       return G_SOURCE_REMOVE;
 }
 
 static int gpio_haptic_get_device_count(int *count)
@@ -192,8 +191,9 @@ static int gpio_haptic_close_device(int handle)
        /* unregister existing timer */
        if (r >= 0) {
                if (stop_timer) {
-                       ecore_timer_del(stop_timer);
-                       stop_timer = NULL;
+                       //ecore_timer_del(stop_timer);
+                       g_source_remove(stop_timer);
+                       stop_timer = 0;
                }
        }
 
@@ -247,7 +247,8 @@ static int gpio_haptic_vibrate_monotone(int handle, int duration, int level, int
 
        /* register timer */
        if (duration) {
-         stop_timer = ecore_timer_add(duration/1000.f, gpio_haptic_timer_cb, (void *)(long)handle);
+         //stop_timer = ecore_timer_add(duration/1000.f, gpio_haptic_timer_cb, (void *)(long)handle);
+         stop_timer = g_timeout_add_seconds(duration/1000, gpio_haptic_timer_cb, (void *)(long)handle);
                if (!stop_timer)
                        _E("Failed to add timer callback");
        }
@@ -286,8 +287,9 @@ static int gpio_haptic_stop_device(int handle)
        peripheral_i2c_write_register_byte(device_handle, DRV2605L_REGISTER_MODE, MODE_INTERNAL_TRIGGER);
 
        if (stop_timer) {
-               ecore_timer_del(stop_timer);
-               stop_timer = NULL;
+               //ecore_timer_del(stop_timer);
+               g_source_remove(stop_timer);
+               stop_timer = 0;
        }
 
        return 0;
@@ -308,7 +310,7 @@ static int gpio_haptic_vibrate_buffer(int handle, const unsigned char *vibe_buff
        return -EACCES;
 }
 
-static int gpio_haptic_create_effect(unsigned char *vibe_buffer, int max_bufsize, haptic_module_effect_element *elem_arr, int max_elemcnt)
+static int gpio_haptic_create_effect(unsigned char *vibe_buffer, int max_bufsize, const haptic_module_effect_element *elem_arr, int max_elemcnt)
 {
        _E("Not support feature");
        return -EACCES;
index c507397..3565d71 100644 (file)
@@ -32,7 +32,7 @@ struct haptic_plugin_ops {
        int (*is_supported) (const char*);
        int (*stop_device) (int);
        int (*get_device_state) (int, int*);
-       int (*create_effect) (unsigned char*, int, haptic_module_effect_element*, int);
+       int (*create_effect) (unsigned char*, int, const haptic_module_effect_element*, int);
        int (*get_buffer_duration) (int, const unsigned char*, int*);
        int (*convert_binary) (const unsigned char*, int, const char*);
 };
index 6741a58..4578fce 100644 (file)
@@ -28,8 +28,8 @@
 #include "core/list.h"
 #include "core/common.h"
 #include "core/device-idler.h"
-#include "core/edbus-handler.h"
 #include "core/config-parser.h"
+#include "core/dbus.h"
 #include "haptic.h"
 
 #define HAPTIC_CONF_PATH                       "/etc/feedbackd/haptic.conf"
@@ -156,10 +156,11 @@ static int convert_magnitude_by_conf(int level)
        return DEFAULT_FEEDBACK_LEVEL * HAPTIC_FEEDBACK_STEP;
 }
 
-static DBusMessage *edbus_get_count(E_DBus_Object *obj, DBusMessage *msg)
+GVariant *hdbus_get_count(GDBusConnection *conn,
+       const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
+       GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
+
 {
-       DBusMessageIter iter;
-       DBusMessage *reply;
        int ret, val;
 
        if (!CHECK_VALID_OPS(h_ops, ret))
@@ -170,19 +171,18 @@ static DBusMessage *edbus_get_count(E_DBus_Object *obj, DBusMessage *msg)
                ret = val;
 
 exit:
-       reply = dbus_message_new_method_return(msg);
-       dbus_message_iter_init_append(reply, &iter);
-       dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &ret);
-       return reply;
+       return g_variant_new("(i)", ret);
 }
 
-static void haptic_name_owner_changed(const char *sender, void *data)
+void haptic_name_owner_changed(GDBusConnection *connection,
+       const gchar     *name,
+       gpointer         user_data)
 {
        dd_list *n;
-       struct haptic_info *info = data;
+       struct haptic_info *info = user_data;
        int handle;
 
-       _I("%s (sender:%s)", __func__, sender);
+       _I("%s (sender:%s)", __func__, name);
 
        if (!info)
                return;
@@ -196,6 +196,7 @@ static void haptic_name_owner_changed(const char *sender, void *data)
        remove_haptic_info(info);
 }
 
+static guint id_name_watch;
 static struct haptic_info *add_haptic_info(const char *sender)
 {
        struct haptic_info *info;
@@ -209,7 +210,7 @@ static struct haptic_info *add_haptic_info(const char *sender)
        info->sender = strdup(sender);
        DD_LIST_APPEND(haptic_handle_list, info);
 
-       register_edbus_watch(sender, haptic_name_owner_changed, info);
+       id_name_watch = dbus_handle_watch_name(sender, NULL, haptic_name_owner_changed, info);
 
        return info;
 }
@@ -218,7 +219,7 @@ static int remove_haptic_info(struct haptic_info *info)
 {
        assert(info);
 
-       unregister_edbus_watch(info->sender, haptic_name_owner_changed);
+       dbus_handle_unwatch_name(id_name_watch);
 
        DD_LIST_REMOVE(haptic_handle_list, info);
        DD_LIST_FREE_LIST(info->handle_list);
@@ -245,13 +246,13 @@ static struct haptic_info *get_matched_haptic_info(const char *sender)
        return NULL;
 }
 
-static DBusMessage *edbus_open_device(E_DBus_Object *obj, DBusMessage *msg)
+GVariant *hdbus_open_device(GDBusConnection *conn,
+                                                       const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
+                                                       GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
+
 {
-       DBusMessageIter iter;
-       DBusMessage *reply;
        int index, handle, ret;
        struct haptic_info *info;
-       const char *sender;
 
        /* Load haptic module before booting done */
        if (!CHECK_VALID_OPS(h_ops, ret)) {
@@ -260,17 +261,12 @@ static DBusMessage *edbus_open_device(E_DBus_Object *obj, DBusMessage *msg)
                        goto exit;
        }
 
-       if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &index, DBUS_TYPE_INVALID)) {
-               ret = -EINVAL;
-               goto exit;
-       }
+       g_variant_get(param, "(i)", &index);
 
        ret = h_ops->open_device(index, &handle);
        if (ret < 0)
                goto exit;
 
-
-       sender = dbus_message_get_sender(msg);
        if (!sender) {
                ret = -EPERM;
                h_ops->close_device(handle);
@@ -293,31 +289,23 @@ static DBusMessage *edbus_open_device(E_DBus_Object *obj, DBusMessage *msg)
        ret = handle;
 
 exit:
-       reply = dbus_message_new_method_return(msg);
-       dbus_message_iter_init_append(reply, &iter);
-       dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &ret);
-       return reply;
+       return g_variant_new("(i)", ret);
 }
 
-static DBusMessage *edbus_close_device(E_DBus_Object *obj, DBusMessage *msg)
+GVariant *hdbus_close_device(GDBusConnection *conn,
+       const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
+       GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
 {
-       DBusMessageIter iter;
-       DBusMessage *reply;
        unsigned int handle;
        int ret;
        struct haptic_info *info;
-       const char *sender;
        int cnt;
 
        if (!CHECK_VALID_OPS(h_ops, ret))
                goto exit;
 
-       if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_UINT32, &handle, DBUS_TYPE_INVALID)) {
-               ret = -EINVAL;
-               goto exit;
-       }
+       g_variant_get(param, "(u)", &handle);
 
-       sender = dbus_message_get_sender(msg);
        if (!sender) {
                _E("fail to get sender from dbus message");
                ret = -EPERM;
@@ -340,16 +328,13 @@ static DBusMessage *edbus_close_device(E_DBus_Object *obj, DBusMessage *msg)
                remove_haptic_info(info);
 
 exit:
-       reply = dbus_message_new_method_return(msg);
-       dbus_message_iter_init_append(reply, &iter);
-       dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &ret);
-       return reply;
+       return g_variant_new("(i)", ret);
 }
 
-static DBusMessage *edbus_vibrate_monotone(E_DBus_Object *obj, DBusMessage *msg)
+GVariant *hdbus_vibrate_monotone(GDBusConnection *conn,
+       const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
+       GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
 {
-       DBusMessageIter iter;
-       DBusMessage *reply;
        unsigned int handle;
        int duration, level, priority, e_handle, ret = 0;
 
@@ -359,13 +344,7 @@ static DBusMessage *edbus_vibrate_monotone(E_DBus_Object *obj, DBusMessage *msg)
        if (haptic_disabled)
                goto exit;
 
-       if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_UINT32, &handle,
-                               DBUS_TYPE_INT32, &duration,
-                               DBUS_TYPE_INT32, &level,
-                               DBUS_TYPE_INT32, &priority, DBUS_TYPE_INVALID)) {
-               ret = -EINVAL;
-               goto exit;
-       }
+       g_variant_get(param, "(uiii)", &handle, &duration, &level, &priority);
 
        /* convert as per conf value */
        level = convert_magnitude_by_conf(level);
@@ -383,20 +362,18 @@ static DBusMessage *edbus_vibrate_monotone(E_DBus_Object *obj, DBusMessage *msg)
                ret = e_handle;
 
 exit:
-       reply = dbus_message_new_method_return(msg);
-       dbus_message_iter_init_append(reply, &iter);
-       dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &ret);
-       return reply;
-
+       return g_variant_new("(i)", ret);
 }
 
-static DBusMessage *edbus_vibrate_buffer(E_DBus_Object *obj, DBusMessage *msg)
+GVariant *hdbus_vibrate_buffer(GDBusConnection *conn,
+       const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
+       GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
 {
-       DBusMessageIter iter;
-       DBusMessage *reply;
        unsigned int handle;
-       unsigned char *data;
-       int size, iteration, level, priority, e_handle, ret = 0;
+       const unsigned char *data = NULL;
+       GVariant *pvar = NULL;
+       gsize size = 0;
+       int iteration, level, priority, e_handle, ret = 0;
 
        if (!CHECK_VALID_OPS(h_ops, ret))
                goto exit;
@@ -404,14 +381,9 @@ static DBusMessage *edbus_vibrate_buffer(E_DBus_Object *obj, DBusMessage *msg)
        if (haptic_disabled)
                goto exit;
 
-       if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_UINT32, &handle,
-                               DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &data, &size,
-                               DBUS_TYPE_INT32, &iteration,
-                               DBUS_TYPE_INT32, &level,
-                               DBUS_TYPE_INT32, &priority, DBUS_TYPE_INVALID)) {
-               ret = -EINVAL;
-               goto exit;
-       }
+       g_variant_get(param, "(u@ayiii)", &handle, &pvar, &iteration, &level, &priority);
+       data = g_variant_get_fixed_array(pvar, &size, sizeof(char));
+       g_variant_unref(pvar);
 
        /* convert as per conf value */
        level = convert_magnitude_by_conf(level);
@@ -425,10 +397,7 @@ static DBusMessage *edbus_vibrate_buffer(E_DBus_Object *obj, DBusMessage *msg)
                ret = e_handle;
 
 exit:
-       reply = dbus_message_new_method_return(msg);
-       dbus_message_iter_init_append(reply, &iter);
-       dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &ret);
-       return reply;
+       return g_variant_new("(i)", ret);
 }
 
 static void vibrate_effect_idler_cb(void *data)
@@ -441,13 +410,13 @@ static void vibrate_effect_idler_cb(void *data)
        free(vibrate_info);
 }
 
-static DBusMessage *edbus_vibrate_effect(E_DBus_Object *obj, DBusMessage *msg)
+GVariant *hdbus_vibrate_effect(GDBusConnection *conn,
+       const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
+       GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
 {
-       DBusMessageIter iter;
-       DBusMessage *reply;
        struct vibrate_effect_info *vibrate_info;
        unsigned int handle;
-       char *pattern;
+       char *pattern = NULL;
        int level, priority, ret = 0;
 
        if (!CHECK_VALID_OPS(h_ops, ret))
@@ -456,13 +425,7 @@ static DBusMessage *edbus_vibrate_effect(E_DBus_Object *obj, DBusMessage *msg)
        if (haptic_disabled)
                goto exit;
 
-       if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_UINT32, &handle,
-                               DBUS_TYPE_STRING, &pattern,
-                               DBUS_TYPE_INT32, &level,
-                               DBUS_TYPE_INT32, &priority, DBUS_TYPE_INVALID)) {
-               ret = -EINVAL;
-               goto exit;
-       }
+       g_variant_get(param, "(usii)",  &handle, &pattern, &level, &priority);
 
        /* convert as per conf value */
        level = convert_magnitude_by_conf(level);
@@ -482,7 +445,8 @@ static DBusMessage *edbus_vibrate_effect(E_DBus_Object *obj, DBusMessage *msg)
                goto exit;
        }
        vibrate_info->handle = handle;
-       vibrate_info->pattern = strdup(pattern);
+       vibrate_info->pattern = pattern;
+       pattern = NULL;
        if (!vibrate_info->pattern) {
                _E("failed to allocate memory for pattern");
                ret = -errno;
@@ -495,16 +459,14 @@ static DBusMessage *edbus_vibrate_effect(E_DBus_Object *obj, DBusMessage *msg)
        ret = add_idle_request(vibrate_effect_idler_cb, (void *)vibrate_info);
 
 exit:
-       reply = dbus_message_new_method_return(msg);
-       dbus_message_iter_init_append(reply, &iter);
-       dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &ret);
-       return reply;
+       g_free(pattern);
+       return g_variant_new("(i)", ret);
 }
 
-static DBusMessage *edbus_stop_device(E_DBus_Object *obj, DBusMessage *msg)
+GVariant *hdbus_stop_device(GDBusConnection *conn,
+       const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
+       GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
 {
-       DBusMessageIter iter;
-       DBusMessage *reply;
        unsigned int handle;
        int ret = 0;
 
@@ -514,63 +476,50 @@ static DBusMessage *edbus_stop_device(E_DBus_Object *obj, DBusMessage *msg)
        if (haptic_disabled)
                goto exit;
 
-       if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_UINT32, &handle, DBUS_TYPE_INVALID)) {
-               ret = -EINVAL;
-               goto exit;
-       }
+       g_variant_get(param, "(u)", &handle);
 
        ret = h_ops->stop_device(handle);
 
 exit:
-       reply = dbus_message_new_method_return(msg);
-       dbus_message_iter_init_append(reply, &iter);
-       dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &ret);
-       return reply;
+       return g_variant_new("(i)", ret);
 }
 
-static DBusMessage *edbus_get_state(E_DBus_Object *obj, DBusMessage *msg)
+GVariant *hdbus_get_state(GDBusConnection *conn,
+       const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
+       GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
 {
-       DBusMessageIter iter;
-       DBusMessage *reply;
        int index, state, ret;
 
        if (!CHECK_VALID_OPS(h_ops, ret))
                goto exit;
 
-       if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &index, DBUS_TYPE_INVALID)) {
-               ret = -EINVAL;
-               goto exit;
-       }
+       g_variant_get(param, "(i)", &index);
 
        ret = h_ops->get_device_state(index, &state);
        if (ret >= 0)
                ret = state;
 
 exit:
-       reply = dbus_message_new_method_return(msg);
-       dbus_message_iter_init_append(reply, &iter);
-       dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &ret);
-       return reply;
+       return g_variant_new("(i)", ret);
 }
 
-static DBusMessage *edbus_create_effect(E_DBus_Object *obj, DBusMessage *msg)
+GVariant *hdbus_create_effect(GDBusConnection *conn,
+       const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
+       GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
 {
        static unsigned char data[MAX_EFFECT_BUFFER];
-       static unsigned char *p = data;
-       DBusMessageIter iter, arr;
-       DBusMessage *reply;
-       haptic_module_effect_element *elem_arr;
-       int i, size, cnt, ret, bufsize = sizeof(data);
+       //static unsigned char *p = data;
+       const haptic_module_effect_element *elem_arr;
+       int i, cnt, ret, bufsize = sizeof(data);
+       GVariant *pvar = NULL;
+       gsize size = 0;
 
        if (!CHECK_VALID_OPS(h_ops, ret))
                goto exit;
 
-       if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &bufsize,
-                               DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &elem_arr, &size,
-                               DBUS_TYPE_INT32, &cnt, DBUS_TYPE_INVALID)) {
-               ret = -EINVAL;
-               goto exit;
-       }
+       g_variant_get(param, "(i@ayi)", &bufsize, &pvar, &cnt);
+       elem_arr = g_variant_get_fixed_array(pvar, &size, sizeof(char));
+       g_variant_unref(pvar);
 
        if (bufsize > MAX_EFFECT_BUFFER) {
                ret = -ENOMEM;
@@ -584,73 +533,64 @@ static DBusMessage *edbus_create_effect(E_DBus_Object *obj, DBusMessage *msg)
        ret = h_ops->create_effect(data, bufsize, elem_arr, cnt);
 
 exit:
-       reply = dbus_message_new_method_return(msg);
-       dbus_message_iter_init_append(reply, &iter);
-       dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE_AS_STRING, &arr);
-       dbus_message_iter_append_fixed_array(&arr, DBUS_TYPE_BYTE, &p, bufsize);
-       dbus_message_iter_close_container(&iter, &arr);
-       dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &ret);
-       return reply;
+       pvar = g_variant_new_fixed_array(G_VARIANT_TYPE_BYTE, data, sizeof(data), sizeof(char));
+       return g_variant_new("(@ayi)", pvar, ret);
 }
 
-static DBusMessage *edbus_get_duration(E_DBus_Object *obj, DBusMessage *msg)
+GVariant *hdbus_get_duration(GDBusConnection *conn,
+       const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
+       GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
 {
-       DBusMessageIter iter;
-       DBusMessage *reply;
        unsigned int handle;
-       unsigned char *data;
-       int size, duration, ret;
+       const unsigned char *data;
+       int duration, ret;
+       GVariant *pvar = NULL;
+       gsize size = 0;
 
        if (!CHECK_VALID_OPS(h_ops, ret))
                goto exit;
 
-       if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_UINT32, &handle,
-                               DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &data, &size,
-                               DBUS_TYPE_INVALID)) {
-               ret = -EINVAL;
-               goto exit;
-       }
+       g_variant_get(param, "(u@ay)", &handle, &pvar);
+       data = g_variant_get_fixed_array(pvar, &size, sizeof(char));
+       g_variant_unref(pvar);
 
        ret = h_ops->get_buffer_duration(handle, data, &duration);
        if (ret >= 0)
                ret = duration;
 
 exit:
-       reply = dbus_message_new_method_return(msg);
-       dbus_message_iter_init_append(reply, &iter);
-       dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &ret);
-       return reply;
+       return g_variant_new("(i)", ret);
 }
 
-static DBusMessage *edbus_save_binary(E_DBus_Object *obj, DBusMessage *msg)
+GVariant *hdbus_save_binary(GDBusConnection *conn,
+       const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
+       GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
+
 {
-       DBusMessageIter iter;
-       DBusMessage *reply;
-       unsigned char *data;
-       char *path;
-       int size, ret;
+       const unsigned char *data = NULL;
+       char *file_path = NULL;
+       int ret;
+       GVariant *pvar;
+       gsize size = 0;
 
        if (!CHECK_VALID_OPS(h_ops, ret))
                goto exit;
 
-       if (!dbus_message_get_args(msg, NULL,
-                               DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &data, &size,
-                               DBUS_TYPE_STRING, &path, DBUS_TYPE_INVALID)) {
-               ret = -EINVAL;
-               goto exit;
-       }
+       g_variant_get(param, "(@ays)", &pvar, &file_path);
+       data = g_variant_get_fixed_array(pvar, &size, sizeof(char));
+       g_variant_unref(pvar);
 
-       _D("file path : %s", path);
-       ret = h_ops->convert_binary(data, size, path);
+       _D("file path : %s", file_path);
+       ret = h_ops->convert_binary(data, size, file_path);
 
 exit:
-       reply = dbus_message_new_method_return(msg);
-       dbus_message_iter_init_append(reply, &iter);
-       dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &ret);
-       return reply;
+       g_free(file_path);
+       return g_variant_new("(i)", ret);
 }
 
-static DBusMessage *edbus_show_handle_list(E_DBus_Object *obj, DBusMessage *msg)
+GVariant *hdbus_show_handle_list(GDBusConnection *conn,
+       const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
+       GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
 {
        dd_list *n;
        dd_list *elem;
@@ -662,14 +602,15 @@ static DBusMessage *edbus_show_handle_list(E_DBus_Object *obj, DBusMessage *msg)
                        _D("%s    %d", info->sender, (int)(long)elem->data);
        }
 
-       return dbus_message_new_method_return(msg);
+       return g_variant_new_tuple(NULL, 0);
 }
 
-static DBusMessage *edbus_pattern_is_supported(E_DBus_Object *obj, DBusMessage *msg)
+GVariant *hdbus_pattern_is_supported(GDBusConnection *conn,
+       const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
+       GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
+
 {
-       DBusMessageIter iter;
-       DBusMessage *reply;
-       char *data;
+       char *data = NULL;
        int ret = 0;
 
        if (!CHECK_VALID_OPS(h_ops, ret))
@@ -678,21 +619,15 @@ static DBusMessage *edbus_pattern_is_supported(E_DBus_Object *obj, DBusMessage *
        if (haptic_disabled)
                goto exit;
 
-       if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &data,
-                               DBUS_TYPE_INVALID)) {
-               ret = -EINVAL;
-               goto exit;
-       }
+       g_variant_get(param, "(s)", &data);
 
        ret = h_ops->is_supported(data);
 
        _I("%s is supported : %d", data, ret);
 
 exit:
-       reply = dbus_message_new_method_return(msg);
-       dbus_message_iter_init_append(reply, &iter);
-       dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &ret);
-       return reply;
+       g_free(data);
+       return g_variant_new("(i)", ret);
 }
 
 static int haptic_internal_init(void)
@@ -711,7 +646,13 @@ static int haptic_internal_exit(void)
        return h_ops->close_device(g_handle);
 }
 
-static void haptic_hardkey_changed_cb(void *data, DBusMessage *msg)
+static void haptic_hardkey_changed_cb(GDBusConnection  *conn,
+       const gchar      *sender,
+       const gchar      *path,
+       const gchar      *iface,
+       const gchar      *name,
+       GVariant         *param,
+       gpointer          data)
 {
        int level, status, e_handle, ret;
 
@@ -751,7 +692,13 @@ static void haptic_hardkey_changed_cb(void *data, DBusMessage *msg)
        return;
 }
 
-static void haptic_poweroff_cb(void *data, DBusMessage *msg)
+static void haptic_poweroff_cb(GDBusConnection  *conn,
+       const gchar      *sender,
+       const gchar      *path,
+       const gchar      *iface,
+       const gchar      *name,
+       GVariant         *param,
+       gpointer          data)
 {
        int e_handle, ret;
        struct timespec time = {0,};
@@ -864,23 +811,30 @@ out:
        return 0;
 }
 
-static const struct edbus_method edbus_methods[] = {
-       { "GetCount",          NULL,   "i", edbus_get_count },
-       { "OpenDevice",         "i",   "i", edbus_open_device },
-       { "CloseDevice",        "u",   "i", edbus_close_device },
-       { "StopDevice",         "u",   "i", edbus_stop_device },
-       { "VibrateMonotone", "uiii",   "i", edbus_vibrate_monotone },
-       { "VibrateBuffer", "uayiii",   "i", edbus_vibrate_buffer },
-       { "VibrateEffect",   "usii",   "i", edbus_vibrate_effect },
-       { "GetState",           "i",   "i", edbus_get_state },
-       { "GetDuration",      "uay",   "i", edbus_get_duration },
-       { "CreateEffect",    "iayi", "ayi", edbus_create_effect },
-       { "SaveBinary",       "ays",   "i", edbus_save_binary },
-       { "ShowHandleList",    NULL,  NULL, edbus_show_handle_list },
-       { "IsSupported",        "s",   "i", edbus_pattern_is_supported },
+static const dbus_method_s hdbus_methods[] = {
+       { "GetCount",          NULL,   "i", hdbus_get_count },
+       { "OpenDevice",         "i",   "i", hdbus_open_device },
+       { "CloseDevice",        "u",   "i", hdbus_close_device },
+       { "StopDevice",         "u",   "i", hdbus_stop_device },
+       { "VibrateMonotone", "uiii",   "i", hdbus_vibrate_monotone },
+       { "VibrateBuffer", "uayiii",   "i", hdbus_vibrate_buffer },
+       { "VibrateEffect",   "usii",   "i", hdbus_vibrate_effect },
+       { "GetState",           "i",   "i", hdbus_get_state },
+       { "GetDuration",      "uay",   "i", hdbus_get_duration },
+       { "CreateEffect",    "iayi", "ayi", hdbus_create_effect },
+       { "SaveBinary",       "ays",   "i", hdbus_save_binary },
+       { "ShowHandleList",    NULL,  NULL, hdbus_show_handle_list },
+       { "IsSupported",        "s",   "i", hdbus_pattern_is_supported },
        /* Add methods here */
 };
 
+static const dbus_interface_u dbus_interface = {
+       .oh = NULL,
+       .name = VIBRATOR_INTERFACE_HAPTIC,
+       .methods = hdbus_methods,
+       .nr_methods = ARRAY_SIZE(hdbus_methods),
+};
+
 int haptic_probe(void)
 {
        /**
@@ -891,6 +845,9 @@ int haptic_probe(void)
        return haptic_module_load();
 }
 
+guint id_sig_change_hardkey;
+guint id_sig_pwr_off_state;
+
 void haptic_init(void)
 {
        int r;
@@ -903,24 +860,24 @@ void haptic_init(void)
        }
 
        /* init dbus interface */
-       r = register_edbus_interface_and_method(VIBRATOR_PATH_HAPTIC,
-                       VIBRATOR_INTERFACE_HAPTIC,
-                       edbus_methods, ARRAY_SIZE(edbus_methods));
+       r = dbus_handle_register_dbus_object(NULL, VIBRATOR_PATH_HAPTIC, &dbus_interface);
        if (r < 0)
-               _E("fail to init edbus interface and method(%d)", r);
+               _E("fail to init hdbus interface and method(%d)", r);
 
        /* register notifier for below each event */
-       register_edbus_signal_handler(DEVICED_PATH_KEY,
-                       DEVICED_INTERFACE_KEY,
-                       SIGNAL_CHANGE_HARDKEY,
-                       haptic_hardkey_changed_cb);
+       id_sig_change_hardkey = subscribe_dbus_signal(NULL, DEVICED_PATH_KEY, DEVICED_INTERFACE_KEY, SIGNAL_CHANGE_HARDKEY, haptic_hardkey_changed_cb, NULL, NULL);
+       if (id_sig_change_hardkey <= 0) {
+               _E("Failed to register signal handler! %d", r);
+               return;
+       }
 
-       register_edbus_signal_handler(DEVICED_PATH_POWEROFF,
-                       DEVICED_INTERFACE_POWEROFF,
-                       SIGNAL_POWEROFF_STATE,
-                       haptic_poweroff_cb);
+       id_sig_pwr_off_state = subscribe_dbus_signal(NULL, DEVICED_PATH_POWEROFF, DEVICED_INTERFACE_POWEROFF, SIGNAL_POWEROFF_STATE, haptic_poweroff_cb, NULL, NULL);
+       if (id_sig_pwr_off_state <= 0) {
+               _E("Failed to register signal handler! %d", r);
+               return;
+       }
 
-       broadcast_edbus_signal(VIBRATOR_PATH_HAPTIC,
+       dbus_handle_broadcast_dbus_signal(VIBRATOR_PATH_HAPTIC,
                        VIBRATOR_INTERFACE_HAPTIC,
                        SIGNAL_VIBRATOR_INITIATED,
                        "", NULL);
@@ -945,13 +902,8 @@ void haptic_exit(void)
                vconf_ignore_key_changed(VCONFKEY_RECORDER_STATE, sound_capturing_cb);
 
        /* unregister notifier for below each event */
-       unregister_edbus_signal_handler(DEVICED_PATH_KEY,
-                       DEVICED_INTERFACE_KEY,
-                       SIGNAL_CHANGE_HARDKEY);
-
-       unregister_edbus_signal_handler(DEVICED_PATH_POWEROFF,
-                       DEVICED_INTERFACE_POWEROFF,
-                       SIGNAL_POWEROFF_STATE);
+       unsubscribe_dbus_signal(NULL, id_sig_change_hardkey);
+       unsubscribe_dbus_signal(NULL, id_sig_pwr_off_state);
 
        /* release haptic data memory */
        safe_free(haptic_conf.level_arr);
index 800bb10..a234ec7 100644 (file)
@@ -28,7 +28,6 @@
 #include <fcntl.h>
 #include <dirent.h>
 #include <linux/input.h>
-#include <Ecore.h>
 
 #include "core/log.h"
 #include "core/list.h"
@@ -74,7 +73,7 @@ struct ff_info_buffer {
 
 struct ff_info {
        int handle;
-       Ecore_Timer *timer;
+       guint timer;
        struct ff_effect effect;
        struct ff_info_buffer *ffinfobuffer;
        int currentindex;
@@ -110,7 +109,7 @@ static dd_list *handle_list;
 static dd_list *vib_conf_list;
 static dd_list *vib_duration_conf_list;
 static dd_list *vib_waiting_conf_list;
-static Ecore_Timer *duration_timer;
+static guint duration_timer;
 static char ff_path[PATH_MAX];
 static int unique_number;
 
@@ -162,10 +161,10 @@ static Eina_Bool timer_cb(void *data)
        struct ff_info *info = (struct ff_info *)data;
 
        if (!info)
-               return ECORE_CALLBACK_CANCEL;
+               return G_SOURCE_REMOVE;
 
        if (!check_valid_handle(info))
-               return ECORE_CALLBACK_CANCEL;
+               return G_SOURCE_REMOVE;
 
        _I("stop vibration by timer : id(%d)", info->effect.id);
 
@@ -175,7 +174,7 @@ static Eina_Bool timer_cb(void *data)
        /* reset timer */
        info->timer = NULL;
 
-       return ECORE_CALLBACK_CANCEL;
+       return G_SOURCE_REMOVE;
 }
 
 static int ff_find_device(void)
@@ -417,7 +416,7 @@ static int close_device(int device_handle)
        /* unregister existing timer */
        if (r >= 0 && info->timer) {
                _D("device handle %d is closed and timer deleted", device_handle);
-               ecore_timer_del(info->timer);
+               g_source_remove(info->timer);
                info->timer = NULL;
        }
 
@@ -466,7 +465,7 @@ static int vibrate_monotone(int device_handle, int duration, int feedback, int p
        /* unregister existing timer */
        if (info->timer) {
                ff_stop(ff_fd, &info->effect);
-               ecore_timer_del(info->timer);
+               g_source_remove(info->timer);
                info->timer = NULL;
        }
 
@@ -489,7 +488,7 @@ static int vibrate_monotone(int device_handle, int duration, int feedback, int p
 
        /* register timer */
        if (duration) {
-               info->timer = ecore_timer_add(duration/1000.f, timer_cb, info);
+               info->timer = g_timeout_add_seconds(duration/1000, timer_cb, info);
                if (!info->timer)
                        _E("Failed to add timer callback");
        }
@@ -501,7 +500,7 @@ static int vibrate_monotone(int device_handle, int duration, int feedback, int p
        return 0;
 }
 
-static Eina_Bool _buffer_play(void *cbdata)
+static gboolean _buffer_play(void *cbdata)
 {
        struct ff_info *info = (struct ff_info *)cbdata;
        struct ff_info_header *header = &info->ffinfobuffer->header;
@@ -526,17 +525,17 @@ static Eina_Bool _buffer_play(void *cbdata)
 
        if (info->currentindex < header->ff_info_data_count) {
                info->currentindex++;
-               info->timer = ecore_timer_add(length/1000.0f, _buffer_play, info);
+               info->timer = g_timeout_add_seconds(length/1000, _buffer_play, info);
        } else {
                --header->iteration;
                if (header->iteration > 0) {
                        info->currentindex = 0;
-                       info->timer = ecore_timer_add(0.0, _buffer_play, info);
+                       info->timer = g_timeout_add_seconds(0, _buffer_play, info);
                } else
                        info->timer = NULL;
        }
 
-       return ECORE_CALLBACK_CANCEL;
+       return G_SOURCE_REMOVE;
 }
 
 static void print_buffer(const unsigned char *vibe_buffer)
@@ -586,7 +585,7 @@ static int vibrate_custom_buffer(int device_handle, const unsigned char *vibe_bu
 
        info->currentindex = 0;
        if (info->timer)
-               ecore_timer_del(info->timer);
+               g_source_remove(info->timer);
 
        if (header->iteration > 0)
                _buffer_play(info);
@@ -594,7 +593,7 @@ static int vibrate_custom_buffer(int device_handle, const unsigned char *vibe_bu
        return 0;
 }
 
-static Eina_Bool haptic_duration_play(void *data)
+static gboolean haptic_duration_play(void *data)
 {
        struct haptic_data *h_data;
        double time;
@@ -607,18 +606,18 @@ static Eina_Bool haptic_duration_play(void *data)
 
 
        if (!data)
-               return ECORE_CALLBACK_CANCEL;
+               return G_SOURCE_REMOVE;
 
        if (duration_timer) {
-               ecore_timer_del(duration_timer);
-               duration_timer = NULL;
+               g_source_remove(duration_timer);
+               duration_timer = 0;
        }
 
        h_data = (struct haptic_data *)data;
        if (h_data->stop) {
                h_data->stop = false;
                free(h_data);
-               return ECORE_CALLBACK_CANCEL;
+               return G_SOURCE_REMOVE;
        }
 
        index = h_data->index;
@@ -628,7 +627,7 @@ static Eina_Bool haptic_duration_play(void *data)
 
        if (!h_data->duration_config[index]) {
                free(h_data);
-               return ECORE_CALLBACK_CANCEL;
+               return G_SOURCE_REMOVE;
        }
 
        duration = h_data->duration_config[index];
@@ -642,7 +641,8 @@ static Eina_Bool haptic_duration_play(void *data)
                else
                        time = duration + h_data->waiting_config[index];
 
-               duration_timer = ecore_timer_add(time/1000.0f, haptic_duration_play, (void *)h_data);
+               /*duration_timer = ecore_timer_add(time/1000.0f, haptic_duration_play, (void *)h_data);*/
+               duration_timer = g_timeout_add_seconds(time/1000, haptic_duration_play, (void *)h_data);
                _D("timer: %d", time);
        }
 
@@ -654,7 +654,7 @@ static Eina_Bool haptic_duration_play(void *data)
                if (h_data)
                        h_data->stop = true;
        }
-       return ECORE_CALLBACK_CANCEL;
+       return G_SOURCE_REMOVE;
 }
 
 static int vibrate_buffer(int device_handle, const unsigned char *vibe_buffer, int iteration, int feedback, int priority, int *effect_handle)
@@ -792,7 +792,7 @@ static int stop_device(int device_handle)
 
        /* unregister existing timer */
        if (r >= 0 && info->timer) {
-               ecore_timer_del(info->timer);
+               g_source_remove(info->timer);
                info->timer = NULL;
        }
 
@@ -820,7 +820,7 @@ static int get_device_state(int device_index, int *effect_state)
        return 0;
 }
 
-static int create_effect(unsigned char *vibe_buffer, int max_bufsize, haptic_module_effect_element *elem_arr, int max_elemcnt)
+static int create_effect(unsigned char *vibe_buffer, int max_bufsize, const haptic_module_effect_element *elem_arr, int max_elemcnt)
 {
        _E("Not supported feature");
        return -EACCES;
index 09ce668..7361bb2 100644 (file)
@@ -19,7 +19,6 @@
 
 #include <stdlib.h>
 #include <stdbool.h>
-#include <Ecore.h>
 
 #include "core/log.h"
 #include "core/list.h"
@@ -40,7 +39,7 @@ struct duration_data {
 };
 
 static dd_list *vib_conf_list;
-static Ecore_Timer *duration_timer;
+static guint duration_timer;
 
 static t_vibrate_monotone real_vibrate_monotone;
 
@@ -161,7 +160,7 @@ int standard_is_supported(const char *pattern)
        return ret;
 }
 
-static Eina_Bool haptic_duration_play(void *data)
+static gboolean haptic_duration_play(void *data)
 {
        dd_list *head, *n, *next;
        struct haptic_data *h_data;
@@ -169,8 +168,8 @@ static Eina_Bool haptic_duration_play(void *data)
        int ret = 0;
 
        if (duration_timer) {
-               ecore_timer_del(duration_timer);
-               duration_timer = NULL;
+               g_source_remove(duration_timer);
+               duration_timer = 0;
        }
 
        if (!data) {
@@ -198,9 +197,9 @@ static Eina_Bool haptic_duration_play(void *data)
 
                if (next) {
                        h_data->vibration_data = next;
-                       duration_timer = ecore_timer_add((node->duration + node->wait)/1000.0f, haptic_duration_play, (void *)h_data);
+                       duration_timer = g_timeout_add_seconds((node->duration + node->wait)/1000, haptic_duration_play, (void *)h_data);
                } else
-                       duration_timer = ecore_timer_add((node->duration + node->wait)/1000.0f, haptic_duration_play, NULL);
+                       duration_timer = g_timeout_add_seconds((node->duration + node->wait)/1000, haptic_duration_play, NULL);
 
                ret = real_vibrate_monotone(h_data->handle, node->duration, h_data->level, h_data->priority, NULL);
                if (!next)
@@ -214,7 +213,7 @@ static Eina_Bool haptic_duration_play(void *data)
                        h_data->stop = true;
        }
 out:
-       return ECORE_CALLBACK_CANCEL;
+       return G_SOURCE_REMOVE;
 }
 
 int standard_set_vib_function(t_vibrate_monotone func)
@@ -265,8 +264,8 @@ int standard_vibrate_close()
 
        if (duration_timer) {
                _I("Remove duration_timer");
-               ecore_timer_del(duration_timer);
-               duration_timer = NULL;
+               g_source_remove(duration_timer);
+               duration_timer = 0;
        }
 
        return 0;
index 2a914ca..8e77b20 100644 (file)
@@ -28,7 +28,6 @@
 #include <fcntl.h>
 #include <dirent.h>
 #include <linux/input.h>
-#include <Ecore.h>
 
 #include "core/log.h"
 #include "core/list.h"
@@ -64,7 +63,7 @@ struct ff_info_buffer {
 
 struct ff_info {
        int handle;
-       Ecore_Timer *timer;
+       guint timer;
        struct ff_effect effect;
        struct ff_info_buffer *ffinfobuffer;
        int currentindex;
@@ -119,15 +118,15 @@ static bool check_fd(int *fd)
 }
 
 static int ff_stop(int fd, struct ff_effect *effect);
-static Eina_Bool timer_cb(void *data)
+static gboolean timer_cb(void *data)
 {
        struct ff_info *info = (struct ff_info *)data;
 
        if (!info)
-               return ECORE_CALLBACK_CANCEL;
+               return G_SOURCE_REMOVE;
 
        if (!check_valid_handle(info))
-               return ECORE_CALLBACK_CANCEL;
+               return G_SOURCE_REMOVE;
 
        _I("stop vibration by timer : id(%d)", info->effect.id);
 
@@ -135,9 +134,9 @@ static Eina_Bool timer_cb(void *data)
        ff_stop(ff_fd, &info->effect);
 
        /* reset timer */
-       info->timer = NULL;
+       info->timer = 0;
 
-       return ECORE_CALLBACK_CANCEL;
+       return G_SOURCE_REMOVE;
 }
 
 static int ff_find_device(void)
@@ -379,8 +378,8 @@ static int close_device(int device_handle)
        /* unregister existing timer */
        if (r >= 0 && info->timer) {
                _D("device handle %d is closed and timer deleted", device_handle);
-               ecore_timer_del(info->timer);
-               info->timer = NULL;
+               g_source_remove(info->timer);
+               info->timer = 0;
        }
 
        standard_vibrate_close();
@@ -430,8 +429,8 @@ static int vibrate_monotone(int device_handle, int duration, int feedback, int p
        /* unregister existing timer */
        if (info->timer) {
                ff_stop(ff_fd, &info->effect);
-               ecore_timer_del(info->timer);
-               info->timer = NULL;
+               g_source_remove(info->timer);
+               info->timer = 0;
        }
 
        /* set effect as per arguments */
@@ -453,7 +452,7 @@ static int vibrate_monotone(int device_handle, int duration, int feedback, int p
 
        /* register timer */
        if (duration) {
-               info->timer = ecore_timer_add(duration/1000.f, timer_cb, info);
+               info->timer = g_timeout_add_seconds(duration/1000, timer_cb, info);
                if (!info->timer)
                        _E("Failed to add timer callback");
        }
@@ -465,7 +464,7 @@ static int vibrate_monotone(int device_handle, int duration, int feedback, int p
        return 0;
 }
 
-static Eina_Bool _buffer_play(void *cbdata)
+static gboolean _buffer_play(void *cbdata)
 {
        struct ff_info *info = (struct ff_info *)cbdata;
        struct ff_info_header *header = &info->ffinfobuffer->header;
@@ -490,17 +489,17 @@ static Eina_Bool _buffer_play(void *cbdata)
 
        if (info->currentindex < header->ff_info_data_count) {
                info->currentindex++;
-               info->timer = ecore_timer_add(length/1000.0f, _buffer_play, info);
+               info->timer = g_timeout_add_seconds(length/1000, _buffer_play, info);
        } else {
                --header->iteration;
                if (header->iteration > 0) {
                        info->currentindex = 0;
-                       info->timer = ecore_timer_add(0.0, _buffer_play, info);
+                       info->timer = g_timeout_add_seconds(0, _buffer_play, info);
                } else
-                       info->timer = NULL;
+                       info->timer = 0;
        }
 
-       return ECORE_CALLBACK_CANCEL;
+       return G_SOURCE_REMOVE;
 }
 
 static void print_buffer(const unsigned char *vibe_buffer)
@@ -550,7 +549,7 @@ static int vibrate_custom_buffer(int device_handle, const unsigned char *vibe_bu
 
        info->currentindex = 0;
        if (info->timer)
-               ecore_timer_del(info->timer);
+               g_source_remove(info->timer);
 
        if (header->iteration > 0)
                _buffer_play(info);
@@ -605,8 +604,8 @@ static int stop_device(int device_handle)
 
        /* unregister existing timer */
        if (r >= 0 && info->timer) {
-               ecore_timer_del(info->timer);
-               info->timer = NULL;
+               g_source_remove(info->timer);
+               info->timer = 0;
        }
 
        return 0;
@@ -633,7 +632,7 @@ static int get_device_state(int device_index, int *effect_state)
        return 0;
 }
 
-static int create_effect(unsigned char *vibe_buffer, int max_bufsize, haptic_module_effect_element *elem_arr, int max_elemcnt)
+static int create_effect(unsigned char *vibe_buffer, int max_bufsize, const haptic_module_effect_element *elem_arr, int max_elemcnt)
 {
        _E("Not support feature");
        return -EACCES;