00001 #include <dbus/dbus-glib.h> 00002 #include <stdio.h> 00003 #include <stdlib.h> 00004 00005 static void lose (const char *fmt, ...) G_GNUC_NORETURN G_GNUC_PRINTF (1, 2); 00006 static void lose_gerror (const char *prefix, GError *error) G_GNUC_NORETURN; 00007 00008 static void 00009 lose (const char *str, ...) 00010 { 00011 va_list args; 00012 00013 va_start (args, str); 00014 00015 vfprintf (stderr, str, args); 00016 fputc ('\n', stderr); 00017 00018 va_end (args); 00019 00020 exit (1); 00021 } 00022 00023 static void 00024 lose_gerror (const char *prefix, GError *error) 00025 { 00026 lose ("%s: %s", prefix, error->message); 00027 } 00028 00029 static void 00030 print_hash_value (gpointer key, gpointer val, gpointer data) 00031 { 00032 printf ("%s -> %s\n", (char *) key, (char *) val); 00033 } 00034 00035 int 00036 main (int argc, char **argv) 00037 { 00038 DBusGConnection *bus; 00039 DBusGProxy *remote_object; 00040 DBusGProxy *remote_object_introspectable; 00041 GError *error = NULL; 00042 char **reply_list; 00043 char **reply_ptr; 00044 GValueArray *hello_reply_struct; 00045 GHashTable *hello_reply_dict; 00046 char *introspect_data; 00047 guint i; 00048 00049 g_type_init (); 00050 00051 { 00052 GLogLevelFlags fatal_mask; 00053 00054 fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK); 00055 fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL; 00056 g_log_set_always_fatal (fatal_mask); 00057 } 00058 00059 bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error); 00060 if (!bus) 00061 lose_gerror ("Couldn't connect to session bus", error); 00062 00063 remote_object = dbus_g_proxy_new_for_name (bus, 00064 "org.designfu.SampleService", 00065 "/SomeObject", 00066 "org.designfu.SampleInterface"); 00067 00068 if (!dbus_g_proxy_call (remote_object, "HelloWorld", &error, 00069 G_TYPE_STRING, "Hello from example-client.c!", G_TYPE_INVALID, 00070 G_TYPE_STRV, &reply_list, G_TYPE_INVALID)) 00071 lose_gerror ("Failed to complete HelloWorld", error); 00072 00073 00074 if (!dbus_g_proxy_call (remote_object, "GetTuple", &error, 00075 G_TYPE_INVALID, 00076 G_TYPE_VALUE_ARRAY, &hello_reply_struct, G_TYPE_INVALID)) 00077 lose_gerror ("Failed to complete GetTuple", error); 00078 00079 if (!dbus_g_proxy_call (remote_object, "GetDict", &error, 00080 G_TYPE_INVALID, 00081 DBUS_TYPE_G_STRING_STRING_HASHTABLE, &hello_reply_dict, G_TYPE_INVALID)) 00082 lose_gerror ("Failed to complete GetDict", error); 00083 00084 printf ("reply_list: "); 00085 for (reply_ptr = reply_list; *reply_ptr; reply_ptr++) 00086 printf ("\"%s\" ", *reply_ptr); 00087 printf ("\n"); 00088 g_strfreev (reply_list); 00089 00090 for (i = 0; i < hello_reply_struct->n_values; i++) 00091 { 00092 GValue strval = { 0, }; 00093 00094 g_value_init (&strval, G_TYPE_STRING); 00095 if (!g_value_transform (g_value_array_get_nth (hello_reply_struct, i), &strval)) 00096 g_value_set_static_string (&strval, "(couldn't transform to string)"); 00097 g_print ("%s: %s\n", g_type_name (G_VALUE_TYPE (g_value_array_get_nth (hello_reply_struct, i))), 00098 g_value_get_string (&strval)); 00099 } 00100 g_value_array_free (hello_reply_struct); 00101 printf ("\n"); 00102 00103 g_hash_table_foreach (hello_reply_dict, print_hash_value, NULL); 00104 g_hash_table_destroy (hello_reply_dict); 00105 00106 remote_object_introspectable = dbus_g_proxy_new_for_name (bus, 00107 "org.designfu.SampleService", 00108 "/SomeObject", 00109 "org.freedesktop.DBus.Introspectable"); 00110 if (!dbus_g_proxy_call (remote_object_introspectable, "Introspect", &error, 00111 G_TYPE_INVALID, 00112 G_TYPE_STRING, &introspect_data, G_TYPE_INVALID)) 00113 lose_gerror ("Failed to complete Introspect", error); 00114 printf ("%s", introspect_data); 00115 g_free (introspect_data); 00116 00117 g_object_unref (G_OBJECT (remote_object_introspectable)); 00118 g_object_unref (G_OBJECT (remote_object)); 00119 00120 exit(0); 00121 }