* configure.in: Add test/name-test/Makefile to the generated
[platform/upstream/dbus.git] / glib / examples / statemachine / statemachine-server.c
1 #include <dbus/dbus-glib.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4
5 #include "statemachine.h"
6 #include "sm-marshal.h"
7 #include "statemachine-server.h"
8
9 enum
10 {
11   PROP_O,
12   PROP_BUS
13 };
14
15 enum
16 {
17   MACHINE_CREATED,
18   LAST_SIGNAL
19 };
20
21 static guint sm_server_signals[LAST_SIGNAL] = { 0 };
22
23 static void     sm_server_set_property       (GObject               *object,
24                                               guint                  prop_id,
25                                               const GValue          *value,
26                                               GParamSpec            *pspec);
27 static void     sm_server_get_property       (GObject               *object,
28                                               guint                  prop_id,
29                                               GValue                *value,
30                                               GParamSpec            *pspec);
31
32 G_DEFINE_TYPE(SMServer, sm_server, G_TYPE_OBJECT)
33
34 #include "statemachine-server-glue.h"
35 #include "statemachine-glue.h"
36
37 static void
38 sm_server_init (SMServer *obj)
39 {
40   obj->machines = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
41 }
42
43 static void
44 sm_server_class_init (SMServerClass *klass)
45 {
46   GObjectClass *object_class = G_OBJECT_CLASS (klass);
47
48   object_class->set_property = sm_server_set_property;
49   object_class->get_property = sm_server_get_property;
50
51   g_object_class_install_property (object_class,
52                                    PROP_BUS,
53                                    g_param_spec_boxed ("bus",
54                                                        "bus",
55                                                        "bus",
56                                                        DBUS_TYPE_G_CONNECTION,
57                                                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
58
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,
63                   0,
64                   NULL, NULL,
65                   sm_marshal_VOID__STRING_BOXED,
66                   G_TYPE_NONE, 2, G_TYPE_STRING, DBUS_TYPE_G_OBJECT_PATH);
67 }
68
69 static void
70 sm_server_set_property (GObject *object,
71                         guint prop_id,
72                         const GValue *value,
73                         GParamSpec *pspec)
74 {
75   SMServer *server = SM_SERVER (object);
76
77   switch (prop_id)
78     {
79     case PROP_BUS:
80       server->bus = g_value_get_boxed (value);
81       break;
82     default:
83       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
84       break;
85     }
86 }
87
88 static void 
89 sm_server_get_property (GObject *object,
90                         guint prop_id,
91                         GValue *value,
92                         GParamSpec *pspec)
93 {
94   SMServer *server = SM_SERVER (object);
95
96   switch (prop_id)
97     {
98     case PROP_BUS:
99       g_value_set_boxed (value, server->bus);
100       break;
101     default:
102       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
103       break;
104     }
105 }
106
107 static void
108 machine_state_changed_cb (SMObject *obj, const char *state, gpointer data)
109 {
110   char *name;
111
112   g_object_get (obj, "name", &name, NULL);
113   g_print ("Machine %s switching to state %s\n", name, state);
114   g_free (name);
115 }
116
117 static void
118 machine_acquisition_changed_cb (SMObject *obj, gdouble progress, gpointer data)
119 {
120   char *name;
121
122   g_object_get (obj, "name", &name, NULL);
123   g_print ("Machine %s got progress %f\n", name, progress);
124   g_free (name);
125 }
126
127 gboolean
128 sm_server_create_machine (SMServer *server, const char *name, GError **error)
129 {
130   SMObject *machine;
131   char *path;
132
133   machine = g_hash_table_lookup (server->machines, name);
134   if (machine != NULL)
135     {
136       g_set_error (error,
137                    SM_ERROR,
138                    SM_ERROR_NAME_IN_USE,
139                    "Statemachine name \"%s\" is already in use",
140                    name);
141       return FALSE;
142     }
143
144   machine = g_object_new (SM_TYPE_OBJECT, "name", name, NULL);
145
146   path = g_strdup_printf ("/com/example/StateMachines/%s", name);
147   dbus_g_connection_register_g_object (server->bus, path, G_OBJECT (machine));
148
149   g_hash_table_insert (server->machines, g_strdup (name), machine);
150
151   g_print ("Created state machine with name %s at %s\n", name, path);
152
153   g_signal_connect_object (machine, "state-changed",
154                            G_CALLBACK (machine_state_changed_cb),
155                            NULL, 0);
156   g_signal_connect_object (machine, "acquisition-progress",
157                            G_CALLBACK (machine_acquisition_changed_cb),
158                            NULL, 0);
159
160   g_signal_emit (server, sm_server_signals[MACHINE_CREATED], 0, name, path);
161   
162   return TRUE;
163 }
164
165 static void
166 add_machine_to_ptr_array (gpointer key, gpointer val, gpointer data)
167 {
168   const char *name = key;
169   /* SMObject *sm = val; */
170   GPtrArray *ptrarray = data;
171   
172   g_ptr_array_add (ptrarray, g_strdup_printf ("/com/example/StateMachines/%s",
173                                               name));
174 }
175
176 gboolean
177 sm_server_get_machines (SMServer *server, GPtrArray **machines, GError **error)
178 {
179   *machines = g_ptr_array_new ();
180
181   g_hash_table_foreach (server->machines, add_machine_to_ptr_array, *machines);
182
183   return TRUE;
184 }
185
186 int
187 main (int argc, char **argv)
188 {
189   DBusGConnection *bus;
190   DBusGProxy *bus_proxy;
191   GError *error = NULL;
192   SMServer *server;
193   GMainLoop *mainloop;
194   guint request_name_result;
195
196   g_type_init ();
197   
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);
201
202   mainloop = g_main_loop_new (NULL, FALSE);
203
204   bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
205   if (!bus)
206     g_critical ("Couldn't connect to session bus: %s\n", error->message);
207
208   bus_proxy = dbus_g_proxy_new_for_name (bus, "org.freedesktop.DBus",
209                                          "/org/freedesktop/DBus",
210                                          "org.freedesktop.DBus");
211
212   if (!dbus_g_proxy_call (bus_proxy, "RequestName", &error,
213                           G_TYPE_STRING, "com.example.StateServer",
214                           G_TYPE_UINT, 0,
215                           G_TYPE_INVALID,
216                           G_TYPE_UINT, &request_name_result,
217                           G_TYPE_INVALID))
218     g_critical ("Couldn't acquire com.example.StateServer: %s\n", error->message);
219
220   server = g_object_new (SM_TYPE_SERVER, "bus", bus, NULL);
221
222   dbus_g_connection_register_g_object (bus, "/com/example/StateServer", G_OBJECT (server));
223
224   g_print ("StateMachine server initialized\n");
225
226   g_main_loop_run (mainloop);
227
228   exit (0);
229 }