Add dbus_handle_method_async_pairs_with_reply
[platform/core/system/libsyscommon.git] / src / libgdbus / dbus-system.c
old mode 100644 (file)
new mode 100755 (executable)
index 22df703..79c97e6
@@ -304,18 +304,25 @@ err:
 dbus_handle_h dbus_handle_get_connection(GBusType bus_type, gboolean priv)
 {
        dbus_handle_s *dh = NULL;
+       int i;
 
        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);
+       for (i = 0 ; i < 3; ++i) {
+               /* private */
+               if (priv)
+                       dh = _dbus_handle_get_connection_private(bus_type);
+               /* shared */
+               else
+                       dh = _dbus_handle_get_connection(bus_type);
+
+               if (dh)
+                       break;
+               usleep(5000);
+       }
 
        return dh;
 }
@@ -2262,12 +2269,9 @@ static void _cb_pending(GDBusConnection *conn,
 
        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 (!err)
+                       g_set_error(&err, G_IO_ERROR, G_IO_ERROR_FAILED,
+                               "Error during g_dbus_connection_call");
 
                if (data && data->func)
                        data->func(NULL, data->data, err);
@@ -2277,10 +2281,80 @@ static void _cb_pending(GDBusConnection *conn,
        if (data && data->func)
                data->func(reply, data->data, err);
 out:
+       if (err)
+               g_error_free(err);
        if (data)
                free(data);
 }
 
+int dbus_handle_method_async_pairs_with_reply(const char *dest,
+                       const char *path,
+                       const char *iface,
+                       const char *method,
+                       int num,
+                       va_list args,
+                       dbus_pending_cb cb,
+                       int timeout_msec,
+                       void *data)
+{
+       dbus_handle_s *dh = NULL;
+       pending_call_data *pdata = NULL;
+       GVariantBuilder *builder;
+       char *key, *value;
+       GVariant *param;
+       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;
+       }
+
+       // 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);
+       }
+
+       param = g_variant_new("(a{ss})", builder);
+       g_variant_builder_unref(builder);
+
+       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_handle_method_async_with_reply(const char *dest,
                                const char *path,
                                const char *iface,
@@ -2636,7 +2710,7 @@ char **dbus_handle_get_owner_list(dbus_handle_h handle, const char *bus_name)
        return strv;
 }
 
-void dbush_handle_check_owner_name(dbus_handle_h handle, const char *owner_name)
+void dbus_handle_check_owner_name(dbus_handle_h handle, const char *owner_name)
 {
        dcl_dbus_handle();
        char exe_name[PATH_MAX];
@@ -2667,35 +2741,3 @@ void dbush_handle_check_owner_name(dbus_handle_h handle, const char *owner_name)
 
        g_strfreev(strv);
 }
-
-dbus_handle_h dbus_handle_init(GBusType type,
-                               const char* bus_name,
-                               GBusNameAcquiredCallback acquired_handler,
-                               GBusNameLostCallback lost_handler)
-{
-       dbus_handle_h handle = NULL;
-       int i, ret = 0;
-
-       if (!bus_name) {
-               _E("Wrong 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, acquired_handler, lost_handler);
-       if (ret <= 0)
-               goto out;
-
-       dbush_handle_check_owner_name(NULL, bus_name);
-
-       return handle;
-
-out:
-       return NULL;
-}