Codebase list libcloudproviders / 5daea49
WIP: publish changes only when objects first dbus get is finished Julius Härtl 6 years ago
3 changed file(s) with 55 addition(s) and 10 deletion(s). Raw diff Collapse all Expand all
3434 gchar *bus_name;
3535 gchar *object_path;
3636 GCancellable *cancellable;
37 gboolean ready;
3738 } CloudProviderPrivate;
3839
3940 G_DEFINE_TYPE_WITH_PRIVATE (CloudProvider, cloud_provider, G_TYPE_OBJECT)
4142 enum {
4243 CHANGED,
4344 CHANGED_NOTIFY,
45 READY,
4446 LAST_SIGNAL
4547 };
4648
7678 out:
7779 g_variant_unref (variant_tuple);
7880 g_signal_emit_by_name (self, "changed");
81 if(cloud_provider_is_available(self) && !priv->ready) {
82 priv->ready = TRUE;
83 g_signal_emit_by_name (self, "ready");
84 }
7985 }
8086
8187 static void
97103 return;
98104 }
99105 g_signal_emit_by_name (self, "changed");
106 if(cloud_provider_is_available(self) && !priv->ready) {
107 priv->ready = TRUE;
108 g_signal_emit_by_name (self, "ready");
109 }
100110 }
101111
102112
119129 return;
120130 }
121131 g_signal_emit_by_name (self, "changed");
132 if(cloud_provider_is_available(self) && !priv->ready) {
133 priv->ready = TRUE;
134 g_signal_emit_by_name (self, "ready");
135 }
122136 }
123137
124138 static void
139153 }
140154 priv->status = status;
141155 g_signal_emit_by_name (self, "changed");
156 if(cloud_provider_is_available(self) && !priv->ready) {
157 priv->ready = TRUE;
158 g_signal_emit_by_name (self, "ready");
159 }
142160 }
143161
144162 void
207225
208226 g_signal_connect_swapped(priv->proxy, "cloud-provider-changed", G_CALLBACK(cloud_provider_update), self);
209227 g_signal_connect_swapped(priv->proxy, "notify", G_CALLBACK(cloud_provider_notify), self);
228
229 cloud_provider_update(self);
210230 }
211231
212232 static void
255275 priv->object_path = g_strdup (object_path);
256276 priv->cancellable = g_cancellable_new ();
257277 priv->status = CLOUD_PROVIDER_STATUS_INVALID;
278 priv->ready = FALSE;
258279 g_bus_get (G_BUS_TYPE_SESSION,
259280 priv->cancellable,
260281 on_bus_acquired,
310331 g_cclosure_marshal_generic,
311332 G_TYPE_NONE,
312333 0);
334 gSignals [READY] =
335 g_signal_new ("ready",
336 G_TYPE_FROM_CLASS (klass),
337 G_SIGNAL_RUN_LAST,
338 0,
339 NULL,
340 NULL,
341 g_cclosure_marshal_generic,
342 G_TYPE_NONE,
343 0);
313344 }
314345
315346 static void
380411 {
381412 GIcon *icon;
382413 gchar *name;
414 gchar *path;
383415 guint status;
384416
385417 name = cloud_provider_get_name (self);
386418 icon = cloud_provider_get_icon (self);
387419 status = cloud_provider_get_status (self);
388 if (name == NULL || icon == NULL || status == CLOUD_PROVIDER_STATUS_INVALID)
420 path = cloud_provider_get_path (self);
421 if (name == NULL || icon == NULL || path == NULL || status == CLOUD_PROVIDER_STATUS_INVALID)
389422 return FALSE;
390423 return TRUE;
391424 }
6262 // update manager to remove cloud providers after owner disappeared
6363 if(cloud_provider_get_owner(cloud_provider) == NULL) {
6464 cloud_provider_manager_update(self);
65 g_signal_emit_by_name (self, "changed", NULL);
6665 g_signal_emit_by_name (self, "owners-changed", NULL);
6766 }
6867 }
68
69 static void
70 on_cloud_provider_ready (CloudProvider *cloud_provider, CloudProviderManager *self)
71 {
72 g_signal_emit_by_name (self, "owners-changed", NULL);
73 g_print("on_cloud_provider_ready\n");
74 // update manager to remove cloud providers after owner disappeared
75 /*if(cloud_provider_get_owner(cloud_provider) == NULL) {
76 g_signal_emit_by_name (self, "owners-changed", NULL);
77 }*/
78 }
79
6980
7081 static void
7182 on_cloud_provider_object_manager_notify (
7990
8091 name_owner = g_dbus_object_manager_client_get_name_owner (manager);
8192 g_print ("name-owner: %s\n", name_owner);
93
8294 cloud_provider_manager_update(self);
8395 g_free (name_owner);
84 g_signal_emit_by_name (self, "changed", NULL);
96 g_signal_emit_by_name (self, "owners-changed", NULL);
8597 }
8698
8799
271283 {
272284 Object *object = OBJECT(l->data);
273285 g_print (" - Object at %s\n", g_dbus_object_get_object_path (G_DBUS_OBJECT (object)));
286 g_print("New cloud provider instance\n");
274287 cloud_provider = cloud_provider_new (bus_name, g_dbus_object_get_object_path (G_DBUS_OBJECT (object)));
275 g_signal_connect (cloud_provider, "changed",
276 G_CALLBACK (on_cloud_provider_changed), self);
277 g_signal_connect (cloud_provider, "changed-notify",
278 G_CALLBACK (on_cloud_provider_changed_notify), self);
288 g_signal_connect (cloud_provider, "ready",
289 G_CALLBACK (on_cloud_provider_ready), self);
290 cloud_provider_update(cloud_provider);
279291 priv->providers = g_list_append (priv->providers, cloud_provider);
280292 }
281293 success = TRUE;
336336
337337 export_menu (connection, account_object_name);
338338 // FIXME: send initial changed signal to notify already running e.g. nautilus
339 g_dbus_connection_emit_signal (connection,
339 /*g_dbus_connection_emit_signal (connection,
340340 NULL,
341341 account_object_name,
342342 "org.freedesktop.CloudProvider1",
343343 "CloudProviderChanged",
344344 NULL,
345 NULL /*error*/);
346
345 // NULL);
346 */
347347 g_free(account_object_name);
348348 }
349349 g_dbus_object_manager_server_set_connection (self->manager, connection);