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 typedef struct SomeObject SomeObject; 00030 typedef struct SomeObjectClass SomeObjectClass; 00031 00032 GType some_object_get_type (void); 00033 00034 struct SomeObject 00035 { 00036 GObject parent; 00037 }; 00038 00039 struct SomeObjectClass 00040 { 00041 GObjectClass parent; 00042 }; 00043 00044 #define SOME_TYPE_OBJECT (some_object_get_type ()) 00045 #define SOME_OBJECT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), SOME_TYPE_OBJECT, SomeObject)) 00046 #define SOME_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SOME_TYPE_OBJECT, SomeObjectClass)) 00047 #define SOME_IS_OBJECT(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), SOME_TYPE_OBJECT)) 00048 #define SOME_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SOME_TYPE_OBJECT)) 00049 #define SOME_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SOME_TYPE_OBJECT, SomeObjectClass)) 00050 00051 G_DEFINE_TYPE(SomeObject, some_object, G_TYPE_OBJECT) 00052 00053 gboolean some_object_hello_world (SomeObject *obj, const char *hello_message, char ***ret, GError **error); 00054 gboolean some_object_get_tuple (SomeObject *obj, GValueArray **ret, GError **error); 00055 gboolean some_object_get_dict (SomeObject *obj, GHashTable **ret, GError **error); 00056 00057 #include "example-service-glue.h" 00058 00059 static void 00060 some_object_init (SomeObject *obj) 00061 { 00062 } 00063 00064 static void 00065 some_object_class_init (SomeObjectClass *klass) 00066 { 00067 } 00068 00069 gboolean 00070 some_object_hello_world (SomeObject *obj, const char *hello_message, char ***ret, GError **error) 00071 { 00072 printf ("%s\n", hello_message); 00073 *ret = g_new (char *, 3); 00074 (*ret)[0] = g_strdup ("Hello"); 00075 (*ret)[1] = g_strdup (" from example-service.c"); 00076 (*ret)[2] = NULL; 00077 00078 return TRUE; 00079 } 00080 00081 gboolean 00082 some_object_get_tuple (SomeObject *obj, GValueArray **ret, GError **error) 00083 { 00084 *ret = g_value_array_new (6); 00085 g_value_array_prepend (*ret, NULL); 00086 g_value_init (g_value_array_get_nth (*ret, 0), G_TYPE_STRING); 00087 g_value_set_string (g_value_array_get_nth (*ret, 0), "hello"); 00088 g_value_array_prepend (*ret, NULL); 00089 g_value_init (g_value_array_get_nth (*ret, 0), G_TYPE_UINT); 00090 g_value_set_uint (g_value_array_get_nth (*ret, 0), 42); 00091 00092 return TRUE; 00093 } 00094 00095 gboolean 00096 some_object_get_dict (SomeObject *obj, GHashTable **ret, GError **error) 00097 { 00098 *ret = g_hash_table_new (g_str_hash, g_str_equal); 00099 g_hash_table_insert (*ret, "first", "Hello Dict"); 00100 g_hash_table_insert (*ret, "second", " from example-service.c"); 00101 return TRUE; 00102 } 00103 00104 int 00105 main (int argc, char **argv) 00106 { 00107 DBusGConnection *bus; 00108 DBusGProxy *bus_proxy; 00109 GError *error = NULL; 00110 SomeObject *obj; 00111 GMainLoop *mainloop; 00112 guint request_name_result; 00113 00114 g_type_init (); 00115 00116 { 00117 GLogLevelFlags fatal_mask; 00118 00119 fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK); 00120 fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL; 00121 g_log_set_always_fatal (fatal_mask); 00122 } 00123 00124 dbus_g_object_type_install_info (SOME_TYPE_OBJECT, &dbus_glib_some_object_object_info); 00125 00126 mainloop = g_main_loop_new (NULL, FALSE); 00127 00128 bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error); 00129 if (!bus) 00130 lose_gerror ("Couldn't connect to session bus", error); 00131 00132 bus_proxy = dbus_g_proxy_new_for_name (bus, "org.freedesktop.DBus", 00133 "/org/freedesktop/DBus", 00134 "org.freedesktop.DBus"); 00135 00136 if (!dbus_g_proxy_call (bus_proxy, "RequestName", &error, 00137 G_TYPE_STRING, "org.designfu.SampleService", 00138 G_TYPE_UINT, 0, 00139 G_TYPE_INVALID, 00140 G_TYPE_UINT, &request_name_result, 00141 G_TYPE_INVALID)) 00142 lose_gerror ("Failed to acquire org.designfu.SampleService", error); 00143 00144 obj = g_object_new (SOME_TYPE_OBJECT, NULL); 00145 00146 dbus_g_connection_register_g_object (bus, "/SomeObject", G_OBJECT (obj)); 00147 00148 printf ("service running\n"); 00149 00150 g_main_loop_run (mainloop); 00151 00152 exit (0); 00153 }