Codebase list libcloudproviders / e1465fc
Use generated object manager to handle multiple account objects per dbus name Julius Härtl 6 years ago
6 changed file(s) with 179 addition(s) and 92 deletion(s). Raw diff Collapse all Expand all
1717 -->
1818 <node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
1919 <interface name='org.freedesktop.CloudProviderManager1'>
20 <method name='GetAllCloudProviders'>
21 <arg name="providers" type="ao" direction="out" />
22 </method>
23 <method name="AddCloudProvider">
24 <arg name="object" type="s" direction="in" />
25 </method>
26 <method name="RemoveCloudProvider">
27 <arg name="object" type="s" direction="in" />
28 </method>
20 <method name='CloudProviderChanged'></method>
2921 </interface>
3022 </node>
202202 priv = cloud_provider_get_instance_private (self);
203203
204204 priv->proxy = proxy;
205
206 cloud_provider_notify(self);
205207
206208 g_signal_connect_swapped(priv->proxy, "cloud-provider-changed", G_CALLBACK(cloud_provider_update), self);
207209 g_signal_connect_swapped(priv->proxy, "notify", G_CALLBACK(cloud_provider_notify), self);
2929 GList *providers;
3030 guint dbus_owner_id;
3131 GDBusNodeInfo *dbus_node_info;
32 GHashTable* provider_object_managers;
3233 CloudProviderManager1 *skeleton;
3334 } CloudProviderManagerPrivate;
3435
3738 enum
3839 {
3940 CHANGED,
41 OWNERS_CHANGED,
4042 LAST_SIGNAL
4143 };
4244
6163 if(cloud_provider_get_owner(cloud_provider) == NULL) {
6264 cloud_provider_manager_update(self);
6365 g_signal_emit_by_name (self, "changed", NULL);
66 g_signal_emit_by_name (self, "owners-changed", NULL);
6467 }
68 }
69
70 static void
71 on_cloud_provider_object_manager_notify (
72 GObject *object,
73 GParamSpec *pspec,
74 gpointer user_data)
75 {
76 GDBusObjectManagerClient *manager = G_DBUS_OBJECT_MANAGER_CLIENT (object);
77 CloudProviderManager *self = CLOUD_PROVIDER_MANAGER(user_data);
78 gchar *name_owner;
79
80 name_owner = g_dbus_object_manager_client_get_name_owner (manager);
81 g_print ("name-owner: %s\n", name_owner);
82 cloud_provider_manager_update(self);
83 g_free (name_owner);
84 g_signal_emit_by_name (self, "changed", NULL);
6585 }
6686
6787
124144 self,
125145 NULL);
126146 priv->skeleton = cloud_provider_manager1_skeleton_new ();
147 priv->provider_object_managers = g_hash_table_new(g_str_hash, g_str_equal);
127148 return CLOUD_PROVIDER_MANAGER (self);
128149 }
129150 else
162183 g_cclosure_marshal_generic,
163184 G_TYPE_NONE,
164185 0);
186 gSignals [OWNERS_CHANGED] =
187 g_signal_new ("owners-changed",
188 G_TYPE_FROM_CLASS (klass),
189 G_SIGNAL_RUN_LAST,
190 0,
191 NULL,
192 NULL,
193 g_cclosure_marshal_generic,
194 G_TYPE_NONE,
195 0);
165196 }
166197
167198 static void
212243 goto out;
213244
214245 g_print ("cloud provider found %s %s\n", bus_name, object_path);
215 cloud_provider = cloud_provider_new (bus_name, object_path);
216 g_signal_connect (cloud_provider, "changed",
246 GDBusObjectManager *manager = g_hash_table_lookup(priv->provider_object_managers, bus_name);
247 if(manager == NULL) {
248 manager = object_manager_client_new_for_bus_sync(G_BUS_TYPE_SESSION,
249 G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
250 bus_name,
251 object_path,
252 NULL,
253 &error);
254
255 if (manager == NULL)
256 {
257 g_printerr ("Error getting object manager client: %s", error->message);
258 g_error_free (error);
259 goto out;
260 }
261
262 g_signal_connect(manager, "notify::name-owner", G_CALLBACK(on_cloud_provider_object_manager_notify), self);
263 g_hash_table_insert(priv->provider_object_managers, bus_name, manager);
264 }
265 GList *objects;
266 GList *l;
267
268 g_print ("Object manager at %s\n", g_dbus_object_manager_get_object_path (manager));
269 objects = g_dbus_object_manager_get_objects (manager);
270 for (l = objects; l != NULL; l = l->next)
271 {
272 Object *object = OBJECT(l->data);
273 g_print (" - Object at %s\n", g_dbus_object_get_object_path (G_DBUS_OBJECT (object)));
274 cloud_provider = cloud_provider_new (bus_name, g_dbus_object_get_object_path (G_DBUS_OBJECT (object)));
275 g_signal_connect (cloud_provider, "changed",
217276 G_CALLBACK (on_cloud_provider_changed), self);
218 g_signal_connect (cloud_provider, "changed-notify",
277 g_signal_connect (cloud_provider, "changed-notify",
219278 G_CALLBACK (on_cloud_provider_changed_notify), self);
220 priv->providers = g_list_append (priv->providers, cloud_provider);
221
279 priv->providers = g_list_append (priv->providers, cloud_provider);
280 }
222281 success = TRUE;
223282 out:
224283 if (!success)
1515 gdbus_sources += gnome.gdbus_codegen ('cloudprovider-generated',
1616 join_paths (meson.source_root (), 'data', 'cloudprovider-dbus.xml'),
1717 interface_prefix: 'org.freedesktop',
18 namespace: '')
18 namespace: '',
19 object_manager: true)
1920 gdbus_sources += gnome.gdbus_codegen ('cloudprovidermanager-generated',
2021 join_paths (meson.source_root (), 'data', 'cloudprovidermanager-dbus.xml'),
2122 interface_prefix: 'org.freedesktop',
00 [Cloud Provider]
11 BusName=org.freedesktop.CloudProviderServerExample
2 ObjectPath=/org/freedesktop/CloudProviderServerExample/account1
2 ObjectPath=/org/freedesktop/CloudProviderServerExample
33 Version=1
11 #include <stdlib.h>
22 #include <gio/gio.h>
33 #include <cloudprovider.h>
4 #include <cloudprovidermanager.h>
45
56 #define TIMEOUT 2000
7 #define COUNT_PLACEHOLDER_ACCOUNTS 3
68
79 typedef struct _TestCloudProviderClass TestCloudProviderClass;
810 typedef struct _TestCloudProvider TestCloudProvider;
2224 gchar *path;
2325 guint timeout_handler;
2426 GDBusConnection *connection;
27 GDBusObjectManagerServer *manager;
2528 };
2629
2730
2831 static GType test_cloud_provider_get_type (void);
2932 G_DEFINE_TYPE (TestCloudProvider, test_cloud_provider, G_TYPE_OBJECT);
33
34 TestCloudProvider*
35 test_cloud_provider_new (const gchar *name)
36 {
37 TestCloudProvider *self;
38
39 self = g_object_new (test_cloud_provider_get_type(), NULL);
40 self->name = g_strdup(name);
41
42 return self;
43 }
3044
3145 static void
3246 test_cloud_provider_finalize (GObject *object)
5266 self->name = "MyCloud";
5367 self->path = g_strdup (current_dir);
5468 self->status = CLOUD_PROVIDER_STATUS_INVALID;
55 uri = g_build_filename (current_dir, "apple-red.png", NULL);
69 uri = g_build_filename (current_dir, "icon.png", NULL);
5670 icon_file = g_file_new_for_uri (uri);
5771 self->icon = g_file_icon_new (icon_file);
5872
218232 }
219233 }
220234
221 static void
222 handle_method_call (GDBusConnection *connection,
223 const gchar *sender,
224 const gchar *object_path,
225 const gchar *interface_name,
226 const gchar *method_name,
227 GVariant *parameters,
228 GDBusMethodInvocation *invocation,
229 gpointer user_data)
230 {
231 TestCloudProvider *cloud_provider = user_data;
232
233 g_debug ("Handling dbus call in server\n");
234 if (g_strcmp0 (method_name, "GetName") == 0)
235 {
236 g_dbus_method_invocation_return_value (invocation,
237 g_variant_new ("(s)", cloud_provider->name));
238 }
239 else if (g_strcmp0 (method_name, "GetStatus") == 0)
240 {
241 g_dbus_method_invocation_return_value (invocation,
242 g_variant_new ("(i)", cloud_provider->status));
243 }
244 else if (g_strcmp0 (method_name, "GetIcon") == 0)
245 {
246 g_dbus_method_invocation_return_value (invocation,
247 g_variant_new ("(v)", g_icon_serialize (cloud_provider->icon)));
248 }
249 else if (g_strcmp0 (method_name, "GetPath") == 0)
250 {
251 g_dbus_method_invocation_return_value (invocation,
252 g_variant_new ("(s)", cloud_provider->path));
253 }
254 }
255
256 static const GDBusInterfaceVTable interface_vtable =
257 {
258 handle_method_call,
259 };
260
261235 static gboolean
262236 test_cloud_provider_notify_change (gpointer user_data)
263237 {
265239 GRand *rand;
266240 gint new_status;
267241
268 g_print("Emit changed signal for cloud provider\n");
269
270242 rand = g_rand_new ();
243
244 g_print("Emit changed signal for cloud providers\n");
245 gchar *account_object_name;
246 account_object_name = g_strdup_printf ("/org/freedesktop/CloudProviderServerExample/%03d",
247 g_rand_int_range(rand, 0, COUNT_PLACEHOLDER_ACCOUNTS));
248
271249 new_status = g_rand_int_range (rand,
272250 CLOUD_PROVIDER_STATUS_IDLE,
273251 CLOUD_PROVIDER_STATUS_ERROR + 1);
276254
277255 g_dbus_connection_emit_signal (cloud_provider->connection,
278256 NULL,
279 "/org/freedesktop/CloudProviderServerExample/account1",
257 account_object_name,
280258 "org.freedesktop.CloudProvider1",
281259 "CloudProviderChanged",
282260 NULL,
283261 NULL /*error*/);
284
285262 return TRUE;
263 }
264
265
266 static void
267 on_get_name (CloudProvider1 *cloud_provider,
268 GDBusMethodInvocation *invocation,
269 gpointer user_data)
270 {
271 gchar *name = user_data;
272 g_dbus_method_invocation_return_value (invocation,
273 g_variant_new ("(s)", name));
274 }
275
276 static void
277 on_get_icon (CloudProvider1 *cloud_provider,
278 GDBusMethodInvocation *invocation,
279 gpointer user_data)
280 {
281 TestCloudProvider *self = user_data;
282 g_dbus_method_invocation_return_value (invocation,
283 g_variant_new ("(v)", g_icon_serialize(self->icon)));
284 }
285
286 static void
287 on_get_path (CloudProvider1 *cloud_provider,
288 GDBusMethodInvocation *invocation,
289 gpointer user_data)
290 {
291 TestCloudProvider *self = user_data;
292 g_dbus_method_invocation_return_value (invocation,
293 g_variant_new ("(s)", self->path));
294 }
295
296 static void
297 on_get_status (CloudProvider1 *cloud_provider,
298 GDBusMethodInvocation *invocation,
299 gpointer user_data)
300 {
301 TestCloudProvider *self = user_data;
302 g_dbus_method_invocation_return_value (invocation,
303 g_variant_new ("(i)", self->status));
286304 }
287305
288306 static void
290308 const gchar *name,
291309 gpointer user_data)
292310 {
293 TestCloudProvider *cloud_provider = user_data;
294 guint registration_id;
295
296 cloud_provider->connection = connection;
311 TestCloudProvider *self = user_data;
312 guint n;
313 ObjectSkeleton *object;
314 self->connection = connection;
297315
298316 g_debug ("Registering cloud provider server 'MyCloud'\n");
299317
300 registration_id = g_dbus_connection_register_object (connection,
301 "/org/freedesktop/CloudProviderServerExample/account1",
302 cloud_provider1_interface_info(),
303 &interface_vtable,
304 cloud_provider,
305 NULL, /* user_data_free_func */
306 NULL); /* GError** */
307
308 g_assert (registration_id > 0);
309 /* Export a menu for our own application */
310 export_menu (connection, "/org/freedesktop/CloudProviderServerExample/account1");
311
312 registration_id = g_dbus_connection_register_object (connection,
313 "/org/freedesktop/CloudProviderServerExample/account2",
314 cloud_provider1_interface_info(),
315 &interface_vtable,
316 cloud_provider,
317 NULL, /* user_data_free_func */
318 NULL); /* GError** */
319
320 g_assert (registration_id > 0);
321 /* Export a menu for our own application */
322 export_menu (connection, "/org/freedesktop/CloudProviderServerExample/account2");
318 self->manager = g_dbus_object_manager_server_new ("/org/freedesktop/CloudProviderServerExample");
319 for (n = 0; n < COUNT_PLACEHOLDER_ACCOUNTS; n++)
320 {
321
322 gchar *account_object_name;
323 gchar *account_name;
324
325 account_object_name = g_strdup_printf ("/org/freedesktop/CloudProviderServerExample/%03d", n);
326 account_name = g_strdup_printf ("MyCloud %d", n);
327 object = object_skeleton_new(account_object_name);
328
329 CloudProvider1 *cloud_provider = cloud_provider1_skeleton_new();
330 g_signal_connect(cloud_provider, "handle_get_name", G_CALLBACK (on_get_name), account_name);
331 g_signal_connect(cloud_provider, "handle_get_icon", G_CALLBACK (on_get_icon), self);
332 g_signal_connect(cloud_provider, "handle_get_path", G_CALLBACK (on_get_path), self);
333 g_signal_connect(cloud_provider, "handle_get_status", G_CALLBACK (on_get_status), self);
334 object_skeleton_set_cloud_provider1(object, cloud_provider);
335 g_dbus_object_manager_server_export (self->manager, G_DBUS_OBJECT_SKELETON(object));
336
337 export_menu (connection, account_object_name);
338 // FIXME: send initial changed signal to notify already running e.g. nautilus
339 g_dbus_connection_emit_signal (connection,
340 NULL,
341 account_object_name,
342 "org.freedesktop.CloudProvider1",
343 "CloudProviderChanged",
344 NULL,
345 NULL /*error*/);
346
347 g_free(account_object_name);
348 }
349 g_dbus_object_manager_server_set_connection (self->manager, connection);
350
351 return;
352
353
323354 }
324355
325356 static void
346377 main (int argc, char *argv[])
347378 {
348379 GMainLoop *loop;
349 TestCloudProvider *cloud_provider;
380 TestCloudProvider *test_cloud_provider;
350381 guint owner_id;
351382
352 cloud_provider = g_object_new (test_cloud_provider_get_type (), NULL);
383
384 test_cloud_provider = g_object_new (test_cloud_provider_get_type (), NULL);
385
353386
354387 owner_id = g_bus_own_name (G_BUS_TYPE_SESSION,
355388 "org.freedesktop.CloudProviderServerExample",
357390 on_bus_acquired,
358391 on_name_acquired,
359392 on_name_lost,
360 cloud_provider,
393 test_cloud_provider,
361394 NULL);
362395
363396 loop = g_main_loop_new (NULL, FALSE);
365398
366399 g_bus_unown_name (owner_id);
367400
368 g_object_unref (cloud_provider);
401 g_object_unref (test_cloud_provider);
369402
370403 return 0;
371404 }