/* -*- mode: C; c-file-style: "gnu" -*- */
#include "dbus-glib.h"
#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+static GMainLoop *loop = NULL;
+static int n_times_foo_received = 0;
+
+static void
+foo_signal_handler (DBusGProxy *proxy,
+ DBusMessage *signal,
+ void *user_data)
+{
+ double d;
+ DBusError derror;
+
+ if (!dbus_message_is_signal (signal,
+ "org.freedesktop.TestSuite",
+ "Foo"))
+ {
+ g_printerr ("Signal handler received the wrong message\n");
+ exit (1);
+ }
+
+ dbus_error_init (&derror);
+ if (!dbus_message_get_args (signal, &derror, DBUS_TYPE_DOUBLE,
+ &d, DBUS_TYPE_INVALID))
+ {
+ g_printerr ("failed to get signal args: %s\n", derror.message);
+ dbus_error_free (&derror);
+ exit (1);
+ }
+
+ n_times_foo_received += 1;
+
+ g_main_loop_quit (loop);
+}
int
main (int argc, char **argv)
{
DBusConnection *connection;
- DBusMessage *message, *reply;
- GMainLoop *loop;
- DBusError error;
+ GError *error;
+ DBusGProxy *driver;
+ DBusGProxy *proxy;
+ DBusPendingCall *call;
+ char **service_list;
+ int service_list_len;
+ int i;
+ dbus_uint32_t result;
+ char *str;
+
+ g_type_init ();
- if (argc < 2)
+ loop = g_main_loop_new (NULL, FALSE);
+
+ error = NULL;
+ connection = dbus_bus_get_with_g_main (DBUS_BUS_SESSION,
+ &error);
+ if (connection == NULL)
{
- g_printerr ("Give the server address as an argument\n");
- return 1;
+ g_printerr ("Failed to open connection to bus: %s\n",
+ error->message);
+ g_error_free (error);
+ exit (1);
}
- loop = g_main_loop_new (NULL, FALSE);
+ /* Create a proxy object for the "bus driver" */
+
+ driver = dbus_gproxy_new_for_service (connection,
+ DBUS_SERVICE_ORG_FREEDESKTOP_DBUS,
+ DBUS_PATH_ORG_FREEDESKTOP_DBUS,
+ DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS);
- dbus_error_init (&error);
- connection = dbus_connection_open (argv[1], &error);
- if (connection == NULL)
+ /* Call ListServices method */
+
+ call = dbus_gproxy_begin_call (driver, "ListServices", DBUS_TYPE_INVALID);
+
+ error = NULL;
+ if (!dbus_gproxy_end_call (driver, call, &error,
+ DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
+ &service_list, &service_list_len,
+ DBUS_TYPE_INVALID))
+ {
+ g_printerr ("Failed to complete ListServices call: %s\n",
+ error->message);
+ g_error_free (error);
+ exit (1);
+ }
+
+ g_print ("Services on the message bus:\n");
+ i = 0;
+ while (i < service_list_len)
+ {
+ g_assert (service_list[i] != NULL);
+ g_print (" %s\n", service_list[i]);
+ ++i;
+ }
+ g_assert (service_list[i] == NULL);
+
+ dbus_free_string_array (service_list);
+
+ /* Test handling of unknown method */
+ call = dbus_gproxy_begin_call (driver, "ThisMethodDoesNotExist",
+ DBUS_TYPE_STRING,
+ "blah blah blah blah blah",
+ DBUS_TYPE_INT32,
+ 10,
+ DBUS_TYPE_INVALID);
+
+ error = NULL;
+ if (dbus_gproxy_end_call (driver, call, &error,
+ DBUS_TYPE_INVALID))
{
- g_printerr ("Failed to open connection to %s: %s\n", argv[1],
- error.message);
- dbus_error_free (&error);
- return 1;
+ g_printerr ("Calling nonexistent method succeeded!\n");
+ exit (1);
}
- dbus_connection_setup_with_g_main (connection, NULL);
+ g_print ("Got EXPECTED error from calling unknown method: %s\n",
+ error->message);
+ g_error_free (error);
+
+ /* Activate a service */
+ call = dbus_gproxy_begin_call (driver, "ActivateService",
+ DBUS_TYPE_STRING,
+ "org.freedesktop.DBus.TestSuiteEchoService",
+ DBUS_TYPE_UINT32,
+ 0,
+ DBUS_TYPE_INVALID);
- message = dbus_message_new_method_call (DBUS_SERVICE_ORG_FREEDESKTOP_DBUS,
- DBUS_PATH_ORG_FREEDESKTOP_DBUS,
- DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
- "Hello");
+ error = NULL;
+ if (!dbus_gproxy_end_call (driver, call, &error,
+ DBUS_TYPE_UINT32, &result,
+ DBUS_TYPE_INVALID))
+ {
+ g_printerr ("Failed to complete Activate call: %s\n",
+ error->message);
+ g_error_free (error);
+ exit (1);
+ }
- dbus_error_init (&error);
- reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error);
- if (reply == NULL)
+ g_print ("Activation of echo service = 0x%x\n", result);
+
+ /* Activate a service again */
+ call = dbus_gproxy_begin_call (driver, "ActivateService",
+ DBUS_TYPE_STRING,
+ "org.freedesktop.DBus.TestSuiteEchoService",
+ DBUS_TYPE_UINT32,
+ 0,
+ DBUS_TYPE_INVALID);
+
+ error = NULL;
+ if (!dbus_gproxy_end_call (driver, call, &error,
+ DBUS_TYPE_UINT32, &result,
+ DBUS_TYPE_INVALID))
{
- g_printerr ("Error on hello message: %s\n", error.message);
- dbus_error_free (&error);
- return 1;
+ g_printerr ("Failed to complete Activate call: %s\n",
+ error->message);
+ g_error_free (error);
+ exit (1);
}
+
+ g_print ("Duplicate activation of echo service = 0x%x\n", result);
+
+ /* Talk to the new service */
- g_print ("reply received\n");
+ proxy = dbus_gproxy_new_for_service (connection,
+ "org.freedesktop.DBus.TestSuiteEchoService",
+ "/org/freedesktop/TestSuite",
+ "org.freedesktop.TestSuite");
+
+ call = dbus_gproxy_begin_call (proxy, "Echo",
+ DBUS_TYPE_STRING,
+ "my string hello",
+ DBUS_TYPE_INVALID);
+
+ error = NULL;
+ if (!dbus_gproxy_end_call (proxy, call, &error,
+ DBUS_TYPE_STRING, &str,
+ DBUS_TYPE_INVALID))
+ {
+ g_printerr ("Failed to complete Echo call: %s\n",
+ error->message);
+ g_error_free (error);
+ exit (1);
+ }
+
+ g_print ("String echoed = \"%s\"\n", str);
+ dbus_free (str);
+
+ /* Test oneway call and signal handling */
+
+ dbus_gproxy_connect_signal (proxy, "Foo",
+ foo_signal_handler,
+ NULL, NULL);
+
+ dbus_gproxy_call_no_reply (proxy, "EmitFoo",
+ DBUS_TYPE_INVALID);
+
+ dbus_connection_flush (connection);
g_main_loop_run (loop);
+
+ if (n_times_foo_received != 1)
+ {
+ g_printerr ("Foo signal received %d times, should have been 1\n",
+ n_times_foo_received);
+ exit (1);
+ }
+
+ g_object_unref (G_OBJECT (driver));
+ g_object_unref (G_OBJECT (proxy));
+
+ g_print ("Successfully completed %s\n", argv[0]);
return 0;
}