1 #include <dbus/dbus-glib.h>
5 #include "statemachine.h"
6 #include "sm-marshal.h"
7 #include "statemachine-server.h"
21 static guint sm_server_signals[LAST_SIGNAL] = { 0 };
23 static void sm_server_set_property (GObject *object,
27 static void sm_server_get_property (GObject *object,
32 G_DEFINE_TYPE(SMServer, sm_server, G_TYPE_OBJECT)
34 #include "statemachine-server-glue.h"
35 #include "statemachine-glue.h"
38 sm_server_init (SMServer *obj)
40 obj->machines = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
44 sm_server_class_init (SMServerClass *klass)
46 GObjectClass *object_class = G_OBJECT_CLASS (klass);
48 object_class->set_property = sm_server_set_property;
49 object_class->get_property = sm_server_get_property;
51 g_object_class_install_property (object_class,
53 g_param_spec_boxed ("bus",
56 DBUS_TYPE_G_CONNECTION,
57 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
59 sm_server_signals[MACHINE_CREATED] =
60 g_signal_new ("machine-created",
61 G_OBJECT_CLASS_TYPE (klass),
62 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
65 sm_marshal_VOID__STRING_BOXED,
66 G_TYPE_NONE, 2, G_TYPE_STRING, DBUS_TYPE_G_OBJECT_PATH);
70 sm_server_set_property (GObject *object,
75 SMServer *server = SM_SERVER (object);
80 server->bus = g_value_get_boxed (value);
83 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
89 sm_server_get_property (GObject *object,
94 SMServer *server = SM_SERVER (object);
99 g_value_set_boxed (value, server->bus);
102 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
108 machine_state_changed_cb (SMObject *obj, const char *state, gpointer data)
112 g_object_get (obj, "name", &name, NULL);
113 g_print ("Machine %s switching to state %s\n", name, state);
118 machine_acquisition_changed_cb (SMObject *obj, gdouble progress, gpointer data)
122 g_object_get (obj, "name", &name, NULL);
123 g_print ("Machine %s got progress %f\n", name, progress);
128 sm_server_create_machine (SMServer *server, const char *name, GError **error)
133 machine = g_hash_table_lookup (server->machines, name);
138 SM_ERROR_NAME_IN_USE,
139 "Statemachine name \"%s\" is already in use",
144 machine = g_object_new (SM_TYPE_OBJECT, "name", name, NULL);
146 path = g_strdup_printf ("/com/example/StateMachines/%s", name);
147 dbus_g_connection_register_g_object (server->bus, path, G_OBJECT (machine));
149 g_hash_table_insert (server->machines, g_strdup (name), machine);
151 g_print ("Created state machine with name %s at %s\n", name, path);
153 g_signal_connect_object (machine, "state-changed",
154 G_CALLBACK (machine_state_changed_cb),
156 g_signal_connect_object (machine, "acquisition-progress",
157 G_CALLBACK (machine_acquisition_changed_cb),
160 g_signal_emit (server, sm_server_signals[MACHINE_CREATED], 0, name, path);
166 add_machine_to_ptr_array (gpointer key, gpointer val, gpointer data)
168 const char *name = key;
169 /* SMObject *sm = val; */
170 GPtrArray *ptrarray = data;
172 g_ptr_array_add (ptrarray, g_strdup_printf ("/com/example/StateMachines/%s",
177 sm_server_get_machines (SMServer *server, GPtrArray **machines, GError **error)
179 *machines = g_ptr_array_new ();
181 g_hash_table_foreach (server->machines, add_machine_to_ptr_array, *machines);
187 main (int argc, char **argv)
189 DBusGConnection *bus;
190 DBusGProxy *bus_proxy;
191 GError *error = NULL;
194 guint request_name_result;
198 dbus_g_object_type_install_info (SM_TYPE_SERVER, &dbus_glib_sm_server_object_info);
199 dbus_g_object_type_install_info (SM_TYPE_OBJECT, &dbus_glib_sm_object_object_info);
200 dbus_g_error_domain_register (SM_ERROR, NULL, SM_TYPE_ERROR);
202 mainloop = g_main_loop_new (NULL, FALSE);
204 bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
206 g_critical ("Couldn't connect to session bus: %s\n", error->message);
208 bus_proxy = dbus_g_proxy_new_for_name (bus, "org.freedesktop.DBus",
209 "/org/freedesktop/DBus",
210 "org.freedesktop.DBus");
212 if (!dbus_g_proxy_call (bus_proxy, "RequestName", &error,
213 G_TYPE_STRING, "com.example.StateServer",
216 G_TYPE_UINT, &request_name_result,
218 g_critical ("Couldn't acquire com.example.StateServer: %s\n", error->message);
220 server = g_object_new (SM_TYPE_SERVER, "bus", bus, NULL);
222 dbus_g_connection_register_g_object (bus, "/com/example/StateServer", G_OBJECT (server));
224 g_print ("StateMachine server initialized\n");
226 g_main_loop_run (mainloop);