1
2#include <gio/gio.h>
3
4/* ---------------------------------------------------------------------------------------------------- */
5/* The D-Bus interface definition we want to create a GDBusProxy-derived type for: */
6/* ---------------------------------------------------------------------------------------------------- */
7
8static const gchar introspection_xml[] =
9 "<node>"
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'/>"
15 " </method>"
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'/>"
20 " </interface>"
21 "</node>";
22
23/* ---------------------------------------------------------------------------------------------------- */
24/* Definition of the AccountsUser type */
25/* ---------------------------------------------------------------------------------------------------- */
26
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))
33
34typedef struct _AccountsUser AccountsUser;
35typedef struct _AccountsUserClass AccountsUserClass;
36typedef struct _AccountsUserPrivate AccountsUserPrivate;
37
38struct _AccountsUser
39{
40 /*< private >*/
41 GDBusProxy parent_instance;
42 AccountsUserPrivate *priv;
43};
44
45struct _AccountsUserClass
46{
47 /*< private >*/
48 GDBusProxyClass parent_class;
49 void (*changed) (AccountsUser *user);
50};
51
52GType accounts_user_get_type (void) G_GNUC_CONST;
53
54const gchar *accounts_user_get_user_name (AccountsUser *user);
55const gchar *accounts_user_get_real_name (AccountsUser *user);
56gboolean accounts_user_get_automatic_login (AccountsUser *user);
57
58void accounts_user_frobnicate (AccountsUser *user,
59 const gchar *flux,
60 gint baz,
61 GCancellable *cancellable,
62 GAsyncReadyCallback callback,
63 gpointer user_data);
64gchar *accounts_user_frobnicate_finish (AccountsUser *user,
65 GAsyncResult *res,
66 GError **error);
67gchar *accounts_user_frobnicate_sync (AccountsUser *user,
68 const gchar *flux,
69 gint baz,
70 GCancellable *cancellable,
71 GError **error);
72
73/* ---------------------------------------------------------------------------------------------------- */
74/* Implementation of the AccountsUser type */
75/* ---------------------------------------------------------------------------------------------------- */
76
77/* A more efficient approach than parsing XML is to use const static
78 * GDBusInterfaceInfo, GDBusMethodInfo, ... structures
79 */
80static GDBusInterfaceInfo *
81accounts_user_get_interface_info (void)
82{
83 static gsize has_info = 0;
84 static GDBusInterfaceInfo *info = NULL;
85 if (g_once_init_enter (&has_info))
86 {
87 GDBusNodeInfo *introspection_data;
88 introspection_data = g_dbus_node_info_new_for_xml (xml_data: introspection_xml, NULL);
89 info = introspection_data->interfaces[0];
90 g_once_init_leave (&has_info, 1);
91 }
92 return info;
93}
94
95enum
96{
97 PROP_0,
98 PROP_USER_NAME,
99 PROP_REAL_NAME,
100 PROP_AUTOMATIC_LOGIN,
101};
102
103enum
104{
105 CHANGED_SIGNAL,
106 LAST_SIGNAL
107};
108
109static guint signals[LAST_SIGNAL] = {0};
110
111G_DEFINE_TYPE (AccountsUser, accounts_user, G_TYPE_DBUS_PROXY)
112
113static void
114accounts_user_finalize (GObject *object)
115{
116 G_GNUC_UNUSED AccountsUser *user = ACCOUNTS_USER (object);
117
118 if (G_OBJECT_CLASS (accounts_user_parent_class)->finalize != NULL)
119 G_OBJECT_CLASS (accounts_user_parent_class)->finalize (object);
120}
121
122static void
123accounts_user_init (AccountsUser *user)
124{
125 /* Sets the expected interface */
126 g_dbus_proxy_set_interface_info (G_DBUS_PROXY (user), info: accounts_user_get_interface_info ());
127}
128
129static void
130accounts_user_get_property (GObject *object,
131 guint prop_id,
132 GValue *value,
133 GParamSpec *pspec)
134{
135 AccountsUser *user = ACCOUNTS_USER (object);
136
137 switch (prop_id)
138 {
139 case PROP_USER_NAME:
140 g_value_set_string (value, v_string: accounts_user_get_user_name (user));
141 break;
142
143 case PROP_REAL_NAME:
144 g_value_set_string (value, v_string: accounts_user_get_real_name (user));
145 break;
146
147 case PROP_AUTOMATIC_LOGIN:
148 g_value_set_boolean (value, v_boolean: accounts_user_get_automatic_login (user));
149 break;
150
151 default:
152 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
153 break;
154 }
155}
156
157const gchar *
158accounts_user_get_user_name (AccountsUser *user)
159{
160 GVariant *value;
161 const gchar *ret;
162 g_return_val_if_fail (ACCOUNTS_IS_USER (user), NULL);
163 value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), property_name: "UserName");
164 ret = g_variant_get_string (value, NULL);
165 g_variant_unref (value);
166 return ret;
167}
168
169const gchar *
170accounts_user_get_real_name (AccountsUser *user)
171{
172 GVariant *value;
173 const gchar *ret;
174 g_return_val_if_fail (ACCOUNTS_IS_USER (user), NULL);
175 value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), property_name: "RealName");
176 ret = g_variant_get_string (value, NULL);
177 g_variant_unref (value);
178 return ret;
179}
180
181gboolean
182accounts_user_get_automatic_login (AccountsUser *user)
183{
184 GVariant *value;
185 gboolean ret;
186 g_return_val_if_fail (ACCOUNTS_IS_USER (user), FALSE);
187 value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), property_name: "AutomaticLogin");
188 ret = g_variant_get_boolean (value);
189 g_variant_unref (value);
190 return ret;
191}
192
193static void
194accounts_user_g_signal (GDBusProxy *proxy,
195 const gchar *sender_name,
196 const gchar *signal_name,
197 GVariant *parameters)
198{
199 AccountsUser *user = ACCOUNTS_USER (proxy);
200 if (g_strcmp0 (str1: signal_name, str2: "Changed") == 0)
201 g_signal_emit (instance: user, signal_id: signals[CHANGED_SIGNAL], detail: 0);
202}
203
204static void
205accounts_user_g_properties_changed (GDBusProxy *proxy,
206 GVariant *changed_properties,
207 const gchar* const *invalidated_properties)
208{
209 AccountsUser *user = ACCOUNTS_USER (proxy);
210 GVariantIter *iter;
211 const gchar *key;
212
213 if (changed_properties != NULL)
214 {
215 g_variant_get (value: changed_properties, format_string: "a{sv}", &iter);
216 while (g_variant_iter_next (iter, format_string: "{&sv}", &key, NULL))
217 {
218 if (g_strcmp0 (str1: key, str2: "AutomaticLogin") == 0)
219 g_object_notify (G_OBJECT (user), property_name: "automatic-login");
220 else if (g_strcmp0 (str1: key, str2: "RealName") == 0)
221 g_object_notify (G_OBJECT (user), property_name: "real-name");
222 else if (g_strcmp0 (str1: key, str2: "UserName") == 0)
223 g_object_notify (G_OBJECT (user), property_name: "user-name");
224 }
225 g_variant_iter_free (iter);
226 }
227}
228
229static void
230accounts_user_class_init (AccountsUserClass *klass)
231{
232 GObjectClass *gobject_class;
233 GDBusProxyClass *proxy_class;
234
235 gobject_class = G_OBJECT_CLASS (klass);
236 gobject_class->get_property = accounts_user_get_property;
237 gobject_class->finalize = accounts_user_finalize;
238
239 proxy_class = G_DBUS_PROXY_CLASS (klass);
240 proxy_class->g_signal = accounts_user_g_signal;
241 proxy_class->g_properties_changed = accounts_user_g_properties_changed;
242
243 g_object_class_install_property (oclass: gobject_class,
244 property_id: PROP_USER_NAME,
245 pspec: g_param_spec_string (name: "user-name",
246 nick: "User Name",
247 blurb: "The user name of the user",
248 NULL,
249 flags: G_PARAM_READABLE |
250 G_PARAM_STATIC_STRINGS));
251
252 g_object_class_install_property (oclass: gobject_class,
253 property_id: PROP_REAL_NAME,
254 pspec: g_param_spec_string (name: "real-name",
255 nick: "Real Name",
256 blurb: "The real name of the user",
257 NULL,
258 flags: G_PARAM_READABLE |
259 G_PARAM_STATIC_STRINGS));
260
261 g_object_class_install_property (oclass: gobject_class,
262 property_id: PROP_AUTOMATIC_LOGIN,
263 pspec: g_param_spec_boolean (name: "automatic-login",
264 nick: "Automatic Login",
265 blurb: "Whether the user is automatically logged in",
266 FALSE,
267 flags: G_PARAM_READABLE |
268 G_PARAM_STATIC_STRINGS));
269
270 signals[CHANGED_SIGNAL] = g_signal_new (signal_name: "changed",
271 ACCOUNTS_TYPE_USER,
272 signal_flags: G_SIGNAL_RUN_LAST,
273 G_STRUCT_OFFSET (AccountsUserClass, changed),
274 NULL,
275 NULL,
276 c_marshaller: g_cclosure_marshal_VOID__VOID,
277 G_TYPE_NONE,
278 n_params: 0);
279}
280
281gchar *
282accounts_user_frobnicate_sync (AccountsUser *user,
283 const gchar *flux,
284 gint baz,
285 GCancellable *cancellable,
286 GError **error)
287{
288 gchar *ret;
289 GVariant *value;
290
291 g_return_val_if_fail (ACCOUNTS_IS_USER (user), NULL);
292
293 ret = NULL;
294
295 value = g_dbus_proxy_call_sync (G_DBUS_PROXY (user),
296 method_name: "Frobnicate",
297 parameters: g_variant_new (format_string: "(si)",
298 flux,
299 baz),
300 flags: G_DBUS_CALL_FLAGS_NONE,
301 timeout_msec: -1,
302 cancellable,
303 error);
304 if (value != NULL)
305 {
306 g_variant_get (value, format_string: "(s)", &ret);
307 g_variant_unref (value);
308 }
309 return ret;
310}
311
312void
313accounts_user_frobnicate (AccountsUser *user,
314 const gchar *flux,
315 gint baz,
316 GCancellable *cancellable,
317 GAsyncReadyCallback callback,
318 gpointer user_data)
319{
320 g_return_if_fail (ACCOUNTS_IS_USER (user));
321 g_dbus_proxy_call (G_DBUS_PROXY (user),
322 method_name: "Frobnicate",
323 parameters: g_variant_new (format_string: "(si)",
324 flux,
325 baz),
326 flags: G_DBUS_CALL_FLAGS_NONE,
327 timeout_msec: -1,
328 cancellable,
329 callback,
330 user_data);
331}
332
333
334gchar *
335accounts_user_frobnicate_finish (AccountsUser *user,
336 GAsyncResult *res,
337 GError **error)
338{
339 gchar *ret;
340 GVariant *value;
341
342 ret = NULL;
343 value = g_dbus_proxy_call_finish (G_DBUS_PROXY (user), res, error);
344 if (value != NULL)
345 {
346 g_variant_get (value, format_string: "(s)", &ret);
347 g_variant_unref (value);
348 }
349 return ret;
350}
351
352/* ---------------------------------------------------------------------------------------------------- */
353
354gint
355main (gint argc, gchar *argv[])
356{
357 return 0;
358}
359

source code of gtk/subprojects/glib/gio/tests/gdbus-example-proxy-subclass.c