Add dbus_handle_method_async_pairs_with_reply 08/182208/4 accepted/tizen/unified/20180629.061543 submit/tizen/20180625.130238 submit/tizen/20180625.142706 submit/tizen/20180627.063926 submit/tizen/20180627.113622 submit/tizen/20180628.074606
authorlokilee73 <changjoo.lee@samsung.com>
Thu, 21 Jun 2018 07:42:48 +0000 (16:42 +0900)
committerlokilee73 <changjoo.lee@samsung.com>
Thu, 21 Jun 2018 12:13:17 +0000 (21:13 +0900)
dbus_handle_method_async_pairs() is just for no reply and used in deviced and storaged.
However, the function has been abnormally used and caused dbus error by unmatched signature
between deviced, storaged and system-popup.
So, it was replaced by dbus_handle_method_async_with_reply_var().

Change-Id: I5452bdb80dd52e72cc4364ff0ce1cf86490d9822
Signed-off-by: lokilee73 <changjoo.lee@samsung.com>
src/libgdbus/dbus-system.c
src/libgdbus/dbus-system.h

index de0f02d..79c97e6 100755 (executable)
@@ -2287,6 +2287,74 @@ out:
                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,
index 9e1af14..9553be5 100755 (executable)
@@ -368,9 +368,11 @@ int dbus_handle_method_sync_timeout(const char *dest, const char *path,
 int dbus_handle_method_sync_pairs(const char *dest, const char *path,
                const char *interface, const char *method,
                int num, va_list args);
+
 int dbus_handle_method_async_pairs(const char *dest, const char *path,
                const char *interface, const char *method,
                int num, va_list args);
+
 int dbus_handle_method_async(const char *dest, const char *path,
                const char *interface, const char *method,
                const char *sig, const char *param[]);
@@ -399,6 +401,16 @@ int dbus_handle_method_async_with_reply_var(const char *dest,
                int timeout_msec,
                void *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);
+
 int check_systemd_active(void);
 
 /**