4 /* ---------------------------------------------------------------------------------------------------- */
5 /* The D-Bus interface definition we want to create a GDBusProxy-derived type for: */
6 /* ---------------------------------------------------------------------------------------------------- */
8 static const gchar introspection_xml[] =
10 " <interface name='org.freedesktop.Accounts.User'>"
11 " <method name='Frobnicate'>"
12 " <arg name='flux' type='s' direction='in'/>"
13 " <arg name='baz' type='s' direction='in'/>"
14 " <arg name='result' type='s' direction='out'/>"
16 " <signal name='Changed'/>"
17 " <property name='AutomaticLogin' type='b' access='readwrite'/>"
18 " <property name='RealName' type='s' access='read'/>"
19 " <property name='UserName' type='s' access='read'/>"
23 /* ---------------------------------------------------------------------------------------------------- */
24 /* Definition of the AccountsUser type */
25 /* ---------------------------------------------------------------------------------------------------- */
27 #define ACCOUNTS_TYPE_USER (accounts_user_get_type ())
28 #define ACCOUNTS_USER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), ACCOUNTS_TYPE_USER, AccountsUser))
29 #define ACCOUNTS_USER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), ACCOUNTS_TYPE_USER, AccountsUserClass))
30 #define ACCOUNTS_USER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), ACCOUNTS_TYPE_USER, AccountsUserClass))
31 #define ACCOUNTS_IS_USER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), ACCOUNTS_TYPE_USER))
32 #define ACCOUNTS_IS_USER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), ACCOUNTS_TYPE_USER))
34 typedef struct _AccountsUser AccountsUser;
35 typedef struct _AccountsUserClass AccountsUserClass;
36 typedef struct _AccountsUserPrivate AccountsUserPrivate;
41 GDBusProxy parent_instance;
42 AccountsUserPrivate *priv;
45 struct _AccountsUserClass
48 GDBusProxyClass parent_class;
49 void (*changed) (AccountsUser *user);
52 GType accounts_user_get_type (void) G_GNUC_CONST;
54 const gchar *accounts_user_get_user_name (AccountsUser *user);
55 const gchar *accounts_user_get_real_name (AccountsUser *user);
56 gboolean accounts_user_get_automatic_login (AccountsUser *user);
58 void accounts_user_frobnicate (AccountsUser *user,
61 GCancellable *cancellable,
62 GAsyncReadyCallback callback,
64 gchar *accounts_user_frobnicate_finish (AccountsUser *user,
67 gchar *accounts_user_frobnicate_sync (AccountsUser *user,
70 GCancellable *cancellable,
73 /* ---------------------------------------------------------------------------------------------------- */
74 /* Implementation of the AccountsUser type */
75 /* ---------------------------------------------------------------------------------------------------- */
77 /* A more efficient approach than parsing XML is to use const static
78 * GDBusInterfaceInfo, GDBusMethodInfo, ... structures
80 static GDBusInterfaceInfo *
81 accounts_user_get_interface_info (void)
83 static gsize has_info = 0;
84 static GDBusInterfaceInfo *info = NULL;
85 if (g_once_init_enter (&has_info))
87 GDBusNodeInfo *introspection_data;
88 introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
89 info = introspection_data->interfaces[0];
90 g_once_init_leave (&has_info, 1);
100 PROP_AUTOMATIC_LOGIN,
109 static guint signals[LAST_SIGNAL] = {0};
111 G_DEFINE_TYPE (AccountsUser, accounts_user, G_TYPE_DBUS_PROXY)
114 accounts_user_init (AccountsUser *user)
116 /* Sets the expected interface */
117 g_dbus_proxy_set_interface_info (G_DBUS_PROXY (user), accounts_user_get_interface_info ());
121 accounts_user_get_property (GObject *object,
126 AccountsUser *user = ACCOUNTS_USER (object);
131 g_value_set_string (value, accounts_user_get_user_name (user));
135 g_value_set_string (value, accounts_user_get_real_name (user));
138 case PROP_AUTOMATIC_LOGIN:
139 g_value_set_boolean (value, accounts_user_get_automatic_login (user));
143 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
149 accounts_user_get_user_name (AccountsUser *user)
153 g_return_val_if_fail (ACCOUNTS_IS_USER (user), NULL);
154 value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), "UserName");
155 ret = g_variant_get_string (value, NULL);
156 g_variant_unref (value);
161 accounts_user_get_real_name (AccountsUser *user)
165 g_return_val_if_fail (ACCOUNTS_IS_USER (user), NULL);
166 value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), "RealName");
167 ret = g_variant_get_string (value, NULL);
168 g_variant_unref (value);
173 accounts_user_get_automatic_login (AccountsUser *user)
177 g_return_val_if_fail (ACCOUNTS_IS_USER (user), FALSE);
178 value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), "AutomaticLogin");
179 ret = g_variant_get_boolean (value);
180 g_variant_unref (value);
185 accounts_user_g_signal (GDBusProxy *proxy,
186 const gchar *sender_name,
187 const gchar *signal_name,
188 GVariant *parameters)
190 AccountsUser *user = ACCOUNTS_USER (proxy);
191 if (g_strcmp0 (signal_name, "Changed") == 0)
192 g_signal_emit (user, signals[CHANGED_SIGNAL], 0);
196 accounts_user_g_properties_changed (GDBusProxy *proxy,
197 GVariant *changed_properties,
198 const gchar* const *invalidated_properties)
200 AccountsUser *user = ACCOUNTS_USER (proxy);
204 if (changed_properties != NULL)
206 g_variant_get (changed_properties, "a{sv}", &iter);
207 while (g_variant_iter_next (iter, "{&sv}", &key, NULL))
209 if (g_strcmp0 (key, "AutomaticLogin") == 0)
210 g_object_notify (G_OBJECT (user), "automatic-login");
211 else if (g_strcmp0 (key, "RealName") == 0)
212 g_object_notify (G_OBJECT (user), "real-name");
213 else if (g_strcmp0 (key, "UserName") == 0)
214 g_object_notify (G_OBJECT (user), "user-name");
216 g_variant_iter_free (iter);
221 accounts_user_class_init (AccountsUserClass *klass)
223 GObjectClass *gobject_class;
224 GDBusProxyClass *proxy_class;
226 gobject_class = G_OBJECT_CLASS (klass);
227 gobject_class->get_property = accounts_user_get_property;
229 proxy_class = G_DBUS_PROXY_CLASS (klass);
230 proxy_class->g_signal = accounts_user_g_signal;
231 proxy_class->g_properties_changed = accounts_user_g_properties_changed;
233 g_object_class_install_property (gobject_class,
235 g_param_spec_string ("user-name",
237 "The user name of the user",
240 G_PARAM_STATIC_STRINGS));
242 g_object_class_install_property (gobject_class,
244 g_param_spec_string ("real-name",
246 "The real name of the user",
249 G_PARAM_STATIC_STRINGS));
251 g_object_class_install_property (gobject_class,
252 PROP_AUTOMATIC_LOGIN,
253 g_param_spec_boolean ("automatic-login",
255 "Whether the user is automatically logged in",
258 G_PARAM_STATIC_STRINGS));
260 signals[CHANGED_SIGNAL] = g_signal_new ("changed",
263 G_STRUCT_OFFSET (AccountsUserClass, changed),
266 g_cclosure_marshal_VOID__VOID,
272 accounts_user_frobnicate_sync (AccountsUser *user,
275 GCancellable *cancellable,
281 g_return_val_if_fail (ACCOUNTS_IS_USER (user), NULL);
285 value = g_dbus_proxy_call_sync (G_DBUS_PROXY (user),
287 g_variant_new ("(si)",
290 G_DBUS_CALL_FLAGS_NONE,
296 g_variant_get (value, "(s)", &ret);
297 g_variant_unref (value);
303 accounts_user_frobnicate (AccountsUser *user,
306 GCancellable *cancellable,
307 GAsyncReadyCallback callback,
310 g_return_if_fail (ACCOUNTS_IS_USER (user));
311 g_dbus_proxy_call (G_DBUS_PROXY (user),
313 g_variant_new ("(si)",
316 G_DBUS_CALL_FLAGS_NONE,
325 accounts_user_frobnicate_finish (AccountsUser *user,
333 value = g_dbus_proxy_call_finish (G_DBUS_PROXY (user), res, error);
336 g_variant_get (value, "(s)", &ret);
337 g_variant_unref (value);
342 /* ---------------------------------------------------------------------------------------------------- */
343 /* Example usage of the AccountsUser type */
344 /* ---------------------------------------------------------------------------------------------------- */
347 print_user (AccountsUser *user)
349 g_print (" user-name = `%s'\n", accounts_user_get_user_name (user));
350 g_print (" real-name = `%s'\n", accounts_user_get_real_name (user));
351 g_print (" automatic-login = %s\n", accounts_user_get_automatic_login (user) ? "true" : "false");
355 on_changed (AccountsUser *user,
358 g_print ("+++ Received the AccountsUser::changed signal\n");
363 on_notify (GObject *object,
367 AccountsUser *user = ACCOUNTS_USER (object);
368 g_print ("+++ Received the GObject::notify signal for property `%s'\n",
374 on_accounts_proxy_available (GObject *object,
375 GAsyncResult *result,
378 GError *error = NULL;
379 GObject *user_object;
382 user_object = g_async_initable_new_finish (G_ASYNC_INITABLE (object),
387 g_error ("Failed to create proxy: %s", error->message);
388 g_clear_error (&error);
391 user = ACCOUNTS_USER (user_object);
393 g_print ("+++ Acquired proxy for user\n");
396 g_signal_connect (user,
398 G_CALLBACK (on_notify),
400 g_signal_connect (user,
402 G_CALLBACK (on_changed),
407 on_accounts_appeared (GDBusConnection *connection,
409 const gchar *name_owner,
412 g_async_initable_new_async (ACCOUNTS_TYPE_USER, 0, NULL,
413 on_accounts_proxy_available,
415 "g-interface-info", NULL,
416 "g-unique-bus-name", name_owner,
417 "g-connection", connection,
418 "g-object-path", "/org/freedesktop/Accounts/User500",
419 "g-interface-name", "org.freedesktop.Accounts.User");
423 on_accounts_vanished (GDBusConnection *connection,
429 /* ---------------------------------------------------------------------------------------------------- */
432 main (gint argc, gchar *argv[])
437 watcher_id = g_bus_watch_name (G_BUS_TYPE_SYSTEM,
438 "org.freedesktop.Accounts",
439 G_BUS_NAME_WATCHER_FLAGS_AUTO_START,
440 on_accounts_appeared,
441 on_accounts_vanished,
444 loop = g_main_loop_new (NULL, FALSE);
445 g_main_loop_run (loop);
446 g_main_loop_unref (loop);
447 g_bus_unwatch_name (watcher_id);