Codebase list libcloudproviders / 253e452
Use signal on dbus interface for cloud provider Julius Härtl 6 years ago
6 changed file(s) with 106 addition(s) and 72 deletion(s). Raw diff Collapse all Expand all
2929 <method name='GetPath'>
3030 <arg type='s' name='path' direction='out'/>
3131 </method>
32 <signal name="CloudProviderChanged"></signal>
3233 </interface>
3334 </node>
4040
4141 enum {
4242 CHANGED,
43 CHANGED_NOTIFY,
4344 LAST_SIGNAL
4445 };
4546
6869
6970 variant_dict = g_variant_get_child_value (variant_tuple, 0);
7071 variant = g_variant_get_child_value (variant_dict, 0);
71 priv->icon = g_icon_deserialize (variant);
72 priv->icon = g_icon_deserialize (variant_dict);
7273 g_variant_unref (variant);
7374 g_variant_unref (variant_dict);
7475
173174 }
174175 }
175176
177 void
178 cloud_provider_notify (CloudProvider *self)
179 {
180 g_print("cloud-provider-notify\n");
181 g_signal_emit_by_name (self, "changed-notify");
182 }
183
176184 static void
177185 on_proxy_created (GObject *source_object,
178186 GAsyncResult *res,
195203
196204 priv->proxy = proxy;
197205
198 cloud_provider_update (self);
206 g_signal_connect_swapped(priv->proxy, "cloud-provider-changed", G_CALLBACK(cloud_provider_update), self);
207 g_signal_connect_swapped(priv->proxy, "notify", G_CALLBACK(cloud_provider_notify), self);
199208 }
200209
201210 static void
289298 g_cclosure_marshal_generic,
290299 G_TYPE_NONE,
291300 0);
301 gSignals [CHANGED_NOTIFY] =
302 g_signal_new ("changed-notify",
303 G_TYPE_FROM_CLASS (klass),
304 G_SIGNAL_RUN_LAST,
305 0,
306 NULL,
307 NULL,
308 g_cclosure_marshal_generic,
309 G_TYPE_NONE,
310 0);
292311 }
293312
294313 static void
346365
347366 return priv->path;
348367 }
368
369 gchar *
370 cloud_provider_get_owner (CloudProvider *self)
371 {
372 CloudProviderPrivate *priv = cloud_provider_get_instance_private (self);
373
374 return g_dbus_proxy_get_name_owner (G_DBUS_PROXY(priv->proxy));
375 }
376
377 gboolean cloud_provider_is_available(CloudProvider *self)
378 {
379 GIcon *icon;
380 gchar *name;
381 guint status;
382
383 name = cloud_provider_get_name (self);
384 icon = cloud_provider_get_icon (self);
385 status = cloud_provider_get_status (self);
386 if (name == NULL || icon == NULL || status == CLOUD_PROVIDER_STATUS_INVALID)
387 return FALSE;
388 return TRUE;
389 }
6363 GMenuModel *cloud_provider_get_menu_model (CloudProvider *self);
6464 GActionGroup* cloud_provider_get_action_group (CloudProvider *self);
6565 gchar *cloud_provider_get_path (CloudProvider *self);
66
66 gchar *cloud_provider_get_owner (CloudProvider *self);
6767 G_END_DECLS
68 gboolean cloud_provider_is_available(CloudProvider *self);
6869
6970 #endif /* CLOUD_PROVIDER_H */
4646 on_cloud_provider_changed (CloudProvider *cloud_provider,
4747 CloudProviderManager *self)
4848 {
49 GIcon *icon;
50 gchar *name;
51 guint status;
52
53 name = cloud_provider_get_name (cloud_provider);
54 icon = cloud_provider_get_icon (cloud_provider);
55 status = cloud_provider_get_status (cloud_provider);
56 if (name == NULL || icon == NULL || status == CLOUD_PROVIDER_STATUS_INVALID)
57 return;
58
49 if(!cloud_provider_is_available(cloud_provider))
50 return;
5951 g_signal_emit_by_name (self, "changed", NULL);
6052 }
53
54 static void
55 on_cloud_provider_changed_notify (CloudProvider *cloud_provider, CloudProviderManager *self)
56 {
57 if(!cloud_provider_is_available(cloud_provider))
58 return;
59
60 // update manager to remove cloud providers after owner disappeared
61 if(cloud_provider_get_owner(cloud_provider) == NULL) {
62 cloud_provider_manager_update(self);
63 g_signal_emit_by_name (self, "changed", NULL);
64 }
65 }
66
6167
6268 static void
6369 on_bus_acquired (GDBusConnection *connection,
8995 gpointer user_data)
9096 {
9197 CloudProviderManagerPrivate *priv = cloud_provider_manager_get_instance_private (CLOUD_PROVIDER_MANAGER (user_data));
92 g_dbus_interface_skeleton_unexport(G_DBUS_INTERFACE_SKELETON(priv->skeleton));
98 if (g_dbus_interface_skeleton_has_connection (G_DBUS_INTERFACE_SKELETON (priv->skeleton), connection))
99 {
100 g_dbus_interface_skeleton_unexport(G_DBUS_INTERFACE_SKELETON(priv->skeleton));
101 }
93102 }
94103
95104 /**
206215 cloud_provider = cloud_provider_new (bus_name, object_path);
207216 g_signal_connect (cloud_provider, "changed",
208217 G_CALLBACK (on_cloud_provider_changed), self);
218 g_signal_connect (cloud_provider, "changed-notify",
219 G_CALLBACK (on_cloud_provider_changed_notify), self);
209220 priv->providers = g_list_append (priv->providers, cloud_provider);
210221
211222 success = TRUE;
5151 g_print ("##############\n");
5252 for (l = providers; l != NULL; l = l->next)
5353 {
54 if(!cloud_provider_is_available(CLOUD_PROVIDER (l->data))) {
55 continue;
56 }
5457 provider_status = cloud_provider_get_status (CLOUD_PROVIDER (l->data));
5558 switch (provider_status)
5659 {
11 #include <stdlib.h>
22 #include <gio/gio.h>
33 #include <cloudprovider.h>
4 #include <cloudprovidermanager.h>
54
65 #define TIMEOUT 2000
76
2120 gint status;
2221 GIcon *icon;
2322 gchar *path;
24 CloudProviderManager1 *manager_proxy;
2523 guint timeout_handler;
24 GDBusConnection *connection;
2625 };
2726
2827
3736 g_free (self->name);
3837 g_free (self->path);
3938 g_clear_object (&self->icon);
40 g_clear_object (&self->manager_proxy);
4139
4240 G_OBJECT_CLASS (test_cloud_provider_parent_class)->finalize (object);
4341 }
7573 test_cloud_provider_set_status (TestCloudProvider *self,
7674 gint status)
7775 {
78 /* Inform the manager that the provider changed */
7976 self->status = status;
80 cloud_provider_manager1_call_cloud_provider_changed(self->manager_proxy,
81 NULL,
82 NULL,
83 NULL);
8477 }
8578
8679 /* ---------------------------------------------------------------------------------------------------- */
265258 handle_method_call,
266259 };
267260
261 static gboolean
262 test_cloud_provider_notify_change (gpointer user_data)
263 {
264 TestCloudProvider *cloud_provider = (TestCloudProvider *)user_data;
265 GRand *rand;
266 gint new_status;
267
268 g_print("Emit changed signal for cloud provider\n");
269
270 rand = g_rand_new ();
271 new_status = g_rand_int_range (rand,
272 CLOUD_PROVIDER_STATUS_IDLE,
273 CLOUD_PROVIDER_STATUS_ERROR + 1);
274
275 test_cloud_provider_set_status (cloud_provider, new_status);
276
277 g_dbus_connection_emit_signal (cloud_provider->connection,
278 NULL,
279 "/org/freedesktop/CloudProviderServerExample",
280 "org.freedesktop.CloudProvider1",
281 "CloudProviderChanged",
282 NULL,
283 NULL /*error*/);
284
285 return TRUE;
286 }
287
268288 static void
269289 on_bus_acquired (GDBusConnection *connection,
270290 const gchar *name,
271291 gpointer user_data)
272292 {
273 CloudProvider *cloud_provider = user_data;
293 TestCloudProvider *cloud_provider = user_data;
274294 guint registration_id;
275295
296 cloud_provider->connection = connection;
276297
277298 g_debug ("Registering cloud provider server 'MyCloud'\n");
278299
294315 const gchar *name,
295316 gpointer user_data)
296317 {
318 TestCloudProvider *cloud_provider = (TestCloudProvider *)user_data;
319 cloud_provider->timeout_handler = g_timeout_add (TIMEOUT,
320 (GSourceFunc) test_cloud_provider_notify_change,
321 cloud_provider);
297322 }
298323
299324 static void
304329 exit (1);
305330 }
306331
307 static gboolean
308 change_provider (gpointer user_data)
309 {
310 TestCloudProvider *cloud_provider = (TestCloudProvider *)user_data;
311 GRand *rand;
312 gint new_status;
313
314 g_print("Send change_provider message to bus\n");
315
316 rand = g_rand_new ();
317 new_status = g_rand_int_range (rand,
318 CLOUD_PROVIDER_STATUS_IDLE,
319 CLOUD_PROVIDER_STATUS_ERROR + 1);
320
321 test_cloud_provider_set_status (cloud_provider, new_status);
322
323 return TRUE;
324 }
325
326 static void
327 on_manager_proxy_created (GObject *source_object,
328 GAsyncResult *res,
329 gpointer user_data)
330 {
331 TestCloudProvider *cloud_provider = user_data;
332 GError *error = NULL;
333
334 cloud_provider->manager_proxy = cloud_provider_manager1_proxy_new_for_bus_finish (res, &error);
335 if (error != NULL)
336 g_warning ("Error creating proxy for cloud provider manager %s", error->message);
337 else
338 g_print ("Manager proxy created for 'MyCloud'\n");
339
340 cloud_provider->timeout_handler = g_timeout_add (TIMEOUT,
341 (GSourceFunc) change_provider,
342 cloud_provider);
343 }
344
345332 int
346333 main (int argc, char *argv[])
347334 {
348335 GMainLoop *loop;
349 CloudProvider *cloud_provider;
336 TestCloudProvider *cloud_provider;
350337 guint owner_id;
351338
352339 cloud_provider = g_object_new (test_cloud_provider_get_type (), NULL);
360347 cloud_provider,
361348 NULL);
362349
363 /* Create CloudProviderManager proxy for exporting cloud provider changes */
364 cloud_provider_manager1_proxy_new_for_bus(G_BUS_TYPE_SESSION,
365 G_DBUS_PROXY_FLAGS_NONE,
366 "org.freedesktop.CloudProviderManager",
367 "/org/freedesktop/CloudProviderManager",
368 NULL,
369 on_manager_proxy_created,
370 cloud_provider);
371
372
373350 loop = g_main_loop_new (NULL, FALSE);
374351 g_main_loop_run (loop);
375352