All pastes #430892 Raw Edit

Stuff

public c v1 · immutable
·published 2007-04-09 10:55 UTC
rendered paste body
/* example.c - program to demonstrate some D-BUS stuffs. * Copyright (C) 2006 Claessens Xavier * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Claessens Xavier * xclaesse@gmail.com */#include <config.h>#include <dbus/dbus-glib.h>#include <stdlib.h>#include "marshallers.h"#define DBUS_SERVICE "org.gnome.Xchat"#define DBUS_REMOTE "/org/gnome/Xchat/Remote"#define DBUS_REMOTE_CONNECTION_INTERFACE "org.gnome.Xchat.Connection"#define DBUS_REMOTE_PLUGIN_INTERFACE "org.gnome.Xchat.Plugin"#define DBUS_NAME		"org.freedesktop.DBus"#define DBUS_PATH		"/org/freedesktop/DBus"#define DBUS_INTERFACE		"org.freedesktop.DBus"guint command_id;guint server_id;static voidwrite_error (char *message,	     GError **error){	if (error == NULL || *error == NULL) {		return;	}	g_printerr ("%s: %s\n", message, (*error)->message);	g_clear_error (error);}static voidtest_server_cb (DBusGProxy *proxy,		char *word[],		char *word_eol[],		guint hook_id,		guint context_id,		gpointer user_data){	if (hook_id == server_id) {		g_print ("message: %s\n", word_eol[0]);	}}static voidtest_command_cb (DBusGProxy *proxy,		 char *word[],		 char *word_eol[],		 guint hook_id,		 guint context_id,		 gpointer user_data){	GError *error = NULL;	if (hook_id == command_id) {		if (!dbus_g_proxy_call (proxy, "Unhook",					&error,					G_TYPE_UINT, hook_id,					G_TYPE_INVALID, G_TYPE_INVALID)) {			write_error ("Failed to complete unhook", &error);		}		/* Now if you write "/test blah" again in the xchat window		 * you'll get a "Unknown command" error message */		g_print ("test command received: %s\n", word_eol[1]);		if (!dbus_g_proxy_call (proxy, "Print",					&error,					G_TYPE_STRING, "test command succeed",					G_TYPE_INVALID,					G_TYPE_INVALID)) {			write_error ("Failed to complete Print", &error);		}	}}static voidunload_cb (void){	g_print ("Good bye !\n");	exit (EXIT_SUCCESS);}// added by makuchaku/* Wrapping NameOwnerChanged signal */void name_owner_changed_callback (DBusGProxy *gproxy, gchar *arg1, gchar *arg2, gchar *arg3, gpointer user_data){	g_print ("Got a Signal!\n");	g_print ("Signal's Args : [%s] [%s] [%s]\n", arg1, arg2, arg3);}// added by makuchaku/* Creates a DBusGProxy for the object & connects to any interested signals */static DBusGProxy * get_another_dbus_gproxy (){	GError *error = NULL;	DBusGProxy *gproxy = NULL;	DBusGConnection *connection = NULL;	connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);	if (!connection) {		g_print ("Failed to get connection");		g_error_free (error);		return NULL;	}	g_assert ((gproxy = dbus_g_proxy_new_for_name (connection,\							DBUS_NAME,\							DBUS_PATH,\							DBUS_INTERFACE)));									/* TODO - Attaching signals should be moved to a new function - maybe a wrapper... */	dbus_g_object_register_marshaller (g_cclosure_user_marshal_VOID__STRING_STRING_STRING, G_TYPE_NONE,\					G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID);								/* Done once for each signal in object lifetime - for sanity purposes */	dbus_g_proxy_add_signal (gproxy, "NameOwnerChanged", G_TYPE_STRING, G_TYPE_STRING,\				 G_TYPE_STRING, G_TYPE_INVALID);		/* done for each signal */	dbus_g_proxy_connect_signal (gproxy, "NameOwnerChanged", G_CALLBACK (name_owner_changed_callback),			       NULL, NULL);			       	g_print ("Signals connected...\n");		return gproxy;}intmain (int argc, char **argv){	DBusGConnection *connection;	DBusGProxy *remote_object;	GMainLoop *mainloop;	gchar *path;	GError *error = NULL;	g_type_init ();		get_another_dbus_gproxy ();	connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);	if (connection == NULL) {		write_error ("Couldn't connect to session bus", &error);		return EXIT_FAILURE;	}  	remote_object = dbus_g_proxy_new_for_name (connection,						   DBUS_SERVICE,						   DBUS_REMOTE,						   DBUS_REMOTE_CONNECTION_INTERFACE);	if (!dbus_g_proxy_call (remote_object, "Connect",				&error,				G_TYPE_STRING, argv[0],				G_TYPE_STRING, "example",				G_TYPE_STRING, "Example of a D-Bus client",				G_TYPE_STRING, "1.0",				G_TYPE_INVALID,				G_TYPE_STRING, &path, G_TYPE_INVALID)) {		write_error ("Failed to complete Connect", &error);		return EXIT_FAILURE;	}	g_object_unref (remote_object);	remote_object = dbus_g_proxy_new_for_name (connection,						   DBUS_SERVICE,						   path,						   DBUS_REMOTE_PLUGIN_INTERFACE);	g_free (path);	if (!dbus_g_proxy_call (remote_object, "HookCommand",				&error,				G_TYPE_STRING, "test",				G_TYPE_INT, 0,				G_TYPE_STRING, "Simple D-BUS example",				G_TYPE_INT, 1, G_TYPE_INVALID,				G_TYPE_UINT, &command_id, G_TYPE_INVALID)) {		write_error ("Failed to complete HookCommand", &error);		return EXIT_FAILURE;	}	g_print ("Command hook id=%d\n", command_id);	if (!dbus_g_proxy_call (remote_object, "HookServer",				&error,				G_TYPE_STRING, "RAW LINE",				G_TYPE_INT, 0,				G_TYPE_INT, 0, G_TYPE_INVALID,				G_TYPE_UINT, &server_id, G_TYPE_INVALID)) {		write_error ("Failed to complete HookServer", &error);		return EXIT_FAILURE;	}	g_print ("Server hook id=%d\n", server_id);	dbus_g_object_register_marshaller (		g_cclosure_user_marshal_VOID__POINTER_POINTER_UINT_UINT,		G_TYPE_NONE,		G_TYPE_STRV, G_TYPE_STRV, G_TYPE_UINT, G_TYPE_UINT,		G_TYPE_INVALID);	dbus_g_object_register_marshaller (		g_cclosure_marshal_VOID__VOID,		G_TYPE_NONE,		G_TYPE_INVALID);	dbus_g_proxy_add_signal (remote_object, "CommandSignal",				 G_TYPE_STRV,				 G_TYPE_STRV,				 G_TYPE_UINT,				 G_TYPE_UINT,				 G_TYPE_INVALID);	dbus_g_proxy_connect_signal (remote_object, "CommandSignal",				     G_CALLBACK (test_command_cb),				     NULL, NULL);	dbus_g_proxy_add_signal (remote_object, "ServerSignal",				 G_TYPE_STRV,				 G_TYPE_STRV,				 G_TYPE_UINT,				 G_TYPE_UINT,				 G_TYPE_INVALID);	dbus_g_proxy_connect_signal (remote_object, "ServerSignal",				     G_CALLBACK (test_server_cb),				     NULL, NULL);	dbus_g_proxy_add_signal (remote_object, "UnloadSignal",				 G_TYPE_INVALID);	dbus_g_proxy_connect_signal (remote_object, "UnloadSignal",				     G_CALLBACK (unload_cb),				     NULL, NULL);	/* Now you can write on the xchat windows: "/test arg1 arg2 ..." */	mainloop = g_main_loop_new (NULL, FALSE);	g_main_loop_run (mainloop);	return EXIT_SUCCESS;}