diff options
Diffstat (limited to 'gdbus')
-rw-r--r-- | gdbus/gdbus.h | 2 | ||||
-rw-r--r-- | gdbus/mainloop.c | 43 |
2 files changed, 45 insertions, 0 deletions
diff --git a/gdbus/gdbus.h b/gdbus/gdbus.h index 818a36f7..e0d653a5 100644 --- a/gdbus/gdbus.h +++ b/gdbus/gdbus.h @@ -43,6 +43,8 @@ DBusConnection *g_dbus_setup_bus(DBusBusType type, const char *name, gboolean g_dbus_request_name(DBusConnection *connection, const char *name, DBusError *error); +gboolean g_dbus_check_service(DBusConnection *connection, const char *name); + gboolean g_dbus_set_disconnect_function(DBusConnection *connection, GDBusWatchFunction function, void *user_data, DBusFreeFunction destroy); diff --git a/gdbus/mainloop.c b/gdbus/mainloop.c index d38bd637..9e493268 100644 --- a/gdbus/mainloop.c +++ b/gdbus/mainloop.c @@ -281,6 +281,49 @@ gboolean g_dbus_request_name(DBusConnection *connection, const char *name, return TRUE; } +gboolean g_dbus_check_service(DBusConnection *connection, const char *name) +{ + DBusMessage *message, *reply; + const char **names; + int i, count; + gboolean result = FALSE; + + message = dbus_message_new_method_call(DBUS_SERVICE_DBUS, + DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS, "ListNames"); + if (message == NULL) { + error("Can't allocate new message"); + return FALSE; + } + + reply = dbus_connection_send_with_reply_and_block(connection, + message, -1, NULL); + + dbus_message_unref(message); + + if (reply == NULL) { + error("Failed to execute method call"); + return FALSE; + } + + if (dbus_message_get_args(reply, NULL, + DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, + &names, &count, DBUS_TYPE_INVALID) == FALSE) { + error("Failed to read name list"); + goto done; + } + + for (i = 0; i < count; i++) + if (g_str_equal(names[i], name) == TRUE) { + result = TRUE; + break; + } + +done: + dbus_message_unref(reply); + + return result; +} + gboolean g_dbus_set_disconnect_function(DBusConnection *connection, GDBusWatchFunction function, void *user_data, DBusFreeFunction destroy) |