summary refs log tree commit diff stats
path: root/src/common
diff options
context:
space:
mode:
authorPatrick Griffis <tingping@tingping.se>2016-07-13 23:39:38 -0400
committerPatrick Griffis <tingping@tingping.se>2016-08-27 23:04:20 -0400
commitec4d3de9d2e4cbc55a0ee1087bc49c14cbe56515 (patch)
tree838a35fd3cb0e08c4e19cb3c6ff89536330c5c6e /src/common
parent439ff094ce0d1be5704d52bc445a22c1be01ab0d (diff)
dbus-client: Rewrite with GDBus
This is just a direct port and should change no logic
Diffstat (limited to 'src/common')
-rw-r--r--src/common/dbus/dbus-client.c131
1 files changed, 86 insertions, 45 deletions
diff --git a/src/common/dbus/dbus-client.c b/src/common/dbus/dbus-client.c
index bce7e2de..6de01583 100644
--- a/src/common/dbus/dbus-client.c
+++ b/src/common/dbus/dbus-client.c
@@ -21,20 +21,22 @@
 
 #include "config.h"
 
-#define GLIB_DISABLE_DEPRECATION_WARNINGS
-#include <stdlib.h>
-#include <dbus/dbus-glib.h>
 #include "dbus-client.h"
+#include <stdlib.h>
+#include <gio/gio.h>
 #include "hexchat.h"
 #include "hexchatc.h"
 
 #define DBUS_SERVICE "org.hexchat.service"
-#define DBUS_REMOTE "/org/hexchat/Remote"
+#define DBUS_REMOTE_PATH "/org/hexchat/Remote"
 #define DBUS_REMOTE_INTERFACE "org.hexchat.plugin"
 
+#define DBUS_SERVICE_DBUS "org.freedesktop.DBus"
+#define DBUS_PATH_DBUS "/org/freedesktop/DBus"
+#define DBUS_INTERFACE_DBUS "org.freedesktop.DBus"
+
 static void
-write_error (char *message,
-	     GError **error)
+write_error (char *message, GError **error)
 {
 	if (error == NULL || *error == NULL) {
 		return;
@@ -43,6 +45,15 @@ write_error (char *message,
 	g_clear_error (error);
 }
 
+static inline GVariant *
+new_param_variant (const char *arg)
+{
+	GVariant * const args[1] = {
+		g_variant_new_string (arg)
+	};
+	return g_variant_new_tuple (args, 1);
+}
+
 void
 hexchat_remote (void)
 /* TODO: dbus_g_connection_unref (connection) are commented because it makes
@@ -50,21 +61,15 @@ hexchat_remote (void)
  * https://launchpad.net/distros/ubuntu/+source/dbus/+bug/54375
  */
 {
-	DBusGConnection *connection;
-	DBusGProxy *dbus = NULL;
-	DBusGProxy *remote_object = NULL;
+	GDBusConnection *connection;
+	GDBusProxy *dbus = NULL;
+	GVariant *ret;
+	GDBusProxy *remote_object = NULL;
 	gboolean hexchat_running;
 	GError *error = NULL;
 	char *command = NULL;
 	int i;
 
-	/* GnomeVFS >=2.15 uses D-Bus and threads, so threads should be
-	 * initialised before opening for the first time a D-Bus connection */
-	if (!g_thread_supported ()) {
-		g_thread_init (NULL);
-	}
-	dbus_g_thread_init ();
-
 	/* if there is nothing to do, return now. */
 	if (!arg_existing || !(arg_url || arg_urls || arg_command)) {
 		return;
@@ -72,36 +77,63 @@ hexchat_remote (void)
 
 	arg_dont_autoconnect = TRUE;
 
-	connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
-	if (!connection) {
+	connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
+	if (!connection)
+	{
 		write_error (_("Couldn't connect to session bus"), &error);
 		return;
 	}
 
 	/* Checks if HexChat is already running */
-	dbus = dbus_g_proxy_new_for_name (connection,
-					  DBUS_SERVICE_DBUS,
-					  DBUS_PATH_DBUS,
-					  DBUS_INTERFACE_DBUS);
-	if (!dbus_g_proxy_call (dbus, "NameHasOwner", &error,
-				G_TYPE_STRING, DBUS_SERVICE,
-				G_TYPE_INVALID,
-				G_TYPE_BOOLEAN, &hexchat_running,
-				G_TYPE_INVALID)) {
+	dbus = g_dbus_proxy_new_sync (connection,
+								  G_DBUS_PROXY_FLAGS_NONE,
+								  NULL,
+								  DBUS_SERVICE_DBUS,
+								  DBUS_PATH_DBUS,
+								  DBUS_INTERFACE_DBUS,
+								  NULL,
+								  &error);
+
+	ret = g_dbus_proxy_call_sync (dbus, "NameHasOwner",
+								 new_param_variant (DBUS_SERVICE),
+								 G_DBUS_CALL_FLAGS_NONE,
+								 -1,
+								 NULL,
+								 &error);
+	if (!ret)
+	{
 		write_error (_("Failed to complete NameHasOwner"), &error);
 		hexchat_running = FALSE;
 	}
+	else
+	{
+		GVariant *child = g_variant_get_child_value (ret, 0);
+		hexchat_running = g_variant_get_boolean (child);
+		g_variant_unref (ret);
+		g_variant_unref (child);
+	}
 	g_object_unref (dbus);
 
 	if (!hexchat_running) {
-		/* dbus_g_connection_unref (connection); */
+		g_object_unref (connection);
 		return;
 	}
 
-	remote_object = dbus_g_proxy_new_for_name (connection,
-						   DBUS_SERVICE,
-						   DBUS_REMOTE,
-						   DBUS_REMOTE_INTERFACE);
+	remote_object = g_dbus_proxy_new_sync (connection,
+								  G_DBUS_PROXY_FLAGS_NONE,
+								  NULL,
+								  DBUS_SERVICE,
+								  DBUS_REMOTE_PATH,
+								  DBUS_REMOTE_INTERFACE,
+								  NULL,
+								  &error);
+
+	if (!remote_object)
+	{
+		write_error("Failed to connect to HexChat", &error);
+		g_object_unref (connection);
+		exit (0);
+	}
 
 	if (arg_url) {
 		command = g_strdup_printf ("url %s", arg_url);
@@ -109,31 +141,40 @@ hexchat_remote (void)
 		command = g_strdup (arg_command);
 	}
 
-	if (command) {
-		if (!dbus_g_proxy_call (remote_object, "Command",
-					&error,
-					G_TYPE_STRING, command,
-					G_TYPE_INVALID,G_TYPE_INVALID)) {
+	if (command)
+	{
+		g_dbus_proxy_call_sync (remote_object, "Command",
+								new_param_variant (command),
+								G_DBUS_CALL_FLAGS_NONE,
+								-1,
+								NULL,
+								&error);
+
+		if (error)
 			write_error (_("Failed to complete Command"), &error);
-		}
 		g_free (command);
 	}
-	
+
 	if (arg_urls)
 	{
 		for (i = 0; i < g_strv_length(arg_urls); i++)
 		{
 			command = g_strdup_printf ("url %s", arg_urls[i]);
-			if (!dbus_g_proxy_call (remote_object, "Command",
-					&error,
-					G_TYPE_STRING, command,
-					G_TYPE_INVALID, G_TYPE_INVALID)) {
+
+			g_dbus_proxy_call_sync (remote_object, "Command",
+									new_param_variant (command),
+									G_DBUS_CALL_FLAGS_NONE,
+									-1,
+									NULL,
+									&error);
+			if (error)
 				write_error (_("Failed to complete Command"), &error);
-			}
 			g_free (command);
 		}
 		g_strfreev (arg_urls);
-	} 	
+	}
 
+	g_object_unref (remote_object);
+	g_object_unref (connection);
 	exit (0);
 }