From 16ad14d131c8a35f24af060f9ac042f1575c1677 Mon Sep 17 00:00:00 2001 From: lokilee73 Date: Thu, 21 Jun 2018 16:42:48 +0900 Subject: [PATCH] Add dbus_handle_method_async_pairs_with_reply 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 --- src/libgdbus/dbus-system.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++ src/libgdbus/dbus-system.h | 12 ++++++++ 2 files changed, 80 insertions(+) diff --git a/src/libgdbus/dbus-system.c b/src/libgdbus/dbus-system.c index de0f02d..79c97e6 100755 --- a/src/libgdbus/dbus-system.c +++ b/src/libgdbus/dbus-system.c @@ -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, diff --git a/src/libgdbus/dbus-system.h b/src/libgdbus/dbus-system.h index 9e1af14..9553be5 100755 --- a/src/libgdbus/dbus-system.h +++ b/src/libgdbus/dbus-system.h @@ -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); /** -- 2.7.4