4
* Authors: Rodrigo Moya <rodrigo.moya@canonical.com>
6
* Copyright 2010-2012 Canonical Ltd.
8
* This program is free software: you can redistribute it and/or modify it
9
* under the terms of the GNU General Public License version 3, as published
10
* by the Free Software Foundation.
12
* This program is distributed in the hope that it will be useful, but
13
* WITHOUT ANY WARRANTY; without even the implied warranties of
14
* MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
15
* PURPOSE. See the GNU General Public License for more details.
17
* You should have received a copy of the GNU General Public License along
18
* with this program. If not, see <http://www.gnu.org/licenses/>.
20
* In addition, as a special exception, the copyright holders give
21
* permission to link the code of portions of this program with the
22
* OpenSSL library under certain conditions as described in each
23
* individual source file, and distribute linked combinations
25
* You must obey the GNU General Public License in all respects
26
* for all of the code used other than OpenSSL. If you modify
27
* file(s) with this exception, you may extend this exception to your
28
* version of the file(s), but you are not obligated to do so. If you
29
* do not wish to do so, delete this exception statement from your
30
* version. If you delete this exception statement from all source
31
* files in the program, then also delete it here.
36
#include "syncdaemon-shares-interface.h"
39
G_DEFINE_TYPE(SyncdaemonSharesInterface, syncdaemon_shares_interface, SYNCDAEMON_TYPE_INTERFACE)
41
struct _SyncdaemonSharesInterfacePrivate {
47
typedef struct _AddEmblemData {
48
SyncdaemonSharesInterface *interface;
53
syncdaemon_shares_interface_finalize (GObject *object)
55
SyncdaemonSharesInterface *interface = SYNCDAEMON_SHARES_INTERFACE (object);
57
if (interface->priv != NULL) {
58
g_free (interface->priv);
61
G_OBJECT_CLASS (syncdaemon_shares_interface_parent_class)->finalize (object);
65
syncdaemon_shares_interface_class_init (SyncdaemonSharesInterfaceClass *klass)
67
GObjectClass *object_class = G_OBJECT_CLASS (klass);
69
object_class->finalize = syncdaemon_shares_interface_finalize;
73
share_created_cb (DBusGProxy *proxy, GHashTable *hash, gpointer user_data)
75
SyncdaemonDaemon *daemon = NULL;
76
SyncdaemonShareInfo *share_info;
77
SyncdaemonSharesInterface *interface = SYNCDAEMON_SHARES_INTERFACE (user_data);
79
share_info = syncdaemon_share_info_new_from_hash_table (hash);
80
switch (syncdaemon_share_info_get_share_type (share_info)) {
81
case SYNCDAEMON_SHARE_INFO_TYPE_SHARED:
82
if (interface->priv->shared == NULL) {
85
shared = syncdaemon_shares_interface_get_shared (interface);
86
g_slist_free (shared);
89
g_hash_table_insert (interface->priv->shared,
90
g_strdup (syncdaemon_share_info_get_path (share_info)),
93
case SYNCDAEMON_SHARE_INFO_TYPE_SHARE:
94
if (interface->priv->shares == NULL) {
97
shares = syncdaemon_shares_interface_get_shares (interface);
98
g_slist_free (shares);
101
g_hash_table_insert (interface->priv->shares,
102
g_strdup (syncdaemon_share_info_get_path (share_info)),
109
g_object_get (G_OBJECT (interface), "daemon", &daemon, NULL);
111
g_signal_emit_by_name (daemon, "share_created", TRUE, share_info);
115
share_create_error_cb (DBusGProxy *proxy, GHashTable *hash, const gchar *error, gpointer user_data)
117
SyncdaemonDaemon *daemon = NULL;
118
SyncdaemonSharesInterface *interface = SYNCDAEMON_SHARES_INTERFACE (user_data);
120
g_object_get (G_OBJECT (interface), "daemon", &daemon, NULL);
121
if (daemon != NULL) {
122
SyncdaemonShareInfo *share_info;
124
share_info = syncdaemon_share_info_new_from_hash_table (hash);
125
g_signal_emit_by_name (daemon, "share_created", FALSE, share_info);
126
g_object_unref (G_OBJECT (share_info));
131
share_deleted_cb (DBusGProxy *proxy, GHashTable *hash, gpointer user_data)
133
SyncdaemonDaemon *daemon = NULL;
134
SyncdaemonShareInfo *share_info;
135
SyncdaemonSharesInterface *interface = SYNCDAEMON_SHARES_INTERFACE (user_data);
137
share_info = syncdaemon_share_info_new_from_hash_table (hash);
138
switch (syncdaemon_share_info_get_share_type (share_info)) {
139
case SYNCDAEMON_SHARE_INFO_TYPE_SHARED:
140
if (interface->priv->shared != NULL)
141
g_hash_table_remove (interface->priv->shared, syncdaemon_share_info_get_path (share_info));
143
case SYNCDAEMON_SHARE_INFO_TYPE_SHARE:
144
if (interface->priv->shares != NULL)
145
g_hash_table_remove (interface->priv->shares, syncdaemon_share_info_get_path (share_info));
151
g_object_get (G_OBJECT (interface), "daemon", &daemon, NULL);
153
g_signal_emit_by_name (daemon, "share_deleted", TRUE, share_info);
155
g_object_unref (G_OBJECT (share_info));
159
share_delete_error_cb (DBusGProxy *proxy, GHashTable *hash, const gchar *error, gpointer user_data)
161
SyncdaemonDaemon *daemon = NULL;
162
SyncdaemonSharesInterface *interface = SYNCDAEMON_SHARES_INTERFACE (user_data);
164
g_object_get (G_OBJECT (interface), "daemon", &daemon, NULL);
165
if (daemon != NULL) {
166
SyncdaemonShareInfo *share_info;
168
share_info = syncdaemon_share_info_new_from_hash_table (hash);
169
g_signal_emit_by_name (daemon, "share_deleted", FALSE, share_info);
170
g_object_unref (G_OBJECT (share_info));
175
syncdaemon_shares_interface_init (SyncdaemonSharesInterface *interface)
177
interface->priv = g_new0 (SyncdaemonSharesInterfacePrivate, 1);
179
/* Setup DBus proxy */
180
interface->priv->proxy = syncdaemon_interface_setup_proxy (SYNCDAEMON_INTERFACE (interface),
181
"com.ubuntuone.SyncDaemon",
182
"/shares", "com.ubuntuone.SyncDaemon.Shares");
183
if (interface->priv->proxy != NULL) {
184
/* Connect to DBus signals */
185
dbus_g_proxy_add_signal (DBUS_G_PROXY (interface->priv->proxy), "ShareCreated",
186
dbus_g_type_get_map ("GHashTable",
190
dbus_g_proxy_connect_signal (DBUS_G_PROXY (interface->priv->proxy), "ShareCreated",
191
G_CALLBACK (share_created_cb), interface, NULL);
193
dbus_g_proxy_add_signal (DBUS_G_PROXY (interface->priv->proxy), "ShareCreateError",
194
dbus_g_type_get_map ("GHashTable",
199
dbus_g_proxy_connect_signal (DBUS_G_PROXY (interface->priv->proxy), "ShareCreateError",
200
G_CALLBACK (share_create_error_cb), interface, NULL);
202
dbus_g_proxy_add_signal (DBUS_G_PROXY (interface->priv->proxy), "ShareDeleted",
203
dbus_g_type_get_map ("GHashTable",
207
dbus_g_proxy_connect_signal (DBUS_G_PROXY (interface->priv->proxy), "ShareDeleted",
208
G_CALLBACK (share_deleted_cb), interface, NULL);
210
dbus_g_proxy_add_signal (DBUS_G_PROXY (interface->priv->proxy), "ShareDeleteError",
211
dbus_g_type_get_map ("GHashTable",
216
dbus_g_proxy_connect_signal (DBUS_G_PROXY (interface->priv->proxy), "ShareDeleteError",
217
G_CALLBACK (share_delete_error_cb), interface, NULL);
222
* syncdaemon_shares_interface_new:
224
SyncdaemonSharesInterface *
225
syncdaemon_shares_interface_new (SyncdaemonDaemon *daemon)
227
g_return_val_if_fail (SYNCDAEMON_IS_DAEMON (daemon), NULL);
229
return g_object_new (SYNCDAEMON_TYPE_SHARES_INTERFACE, "daemon", daemon, NULL);
233
* syncdaemon_shares_interface_accept:
236
syncdaemon_shares_interface_accept (SyncdaemonSharesInterface *interface, const gchar *share_id)
238
g_return_if_fail (SYNCDAEMON_IS_SHARES_INTERFACE (interface));
239
g_return_if_fail (share_id != NULL);
241
dbus_g_proxy_begin_call (DBUS_G_PROXY (interface->priv->proxy), "accept_share",
242
no_output_dbus_call_ended_cb, interface, NULL,
243
G_TYPE_STRING, share_id,
248
add_emblem_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data) {
249
SyncdaemonShareInfo *share_info;
250
SyncdaemonDaemon *daemon;
252
AddEmblemData *emblem_data = user_data;
254
hash = g_hash_table_new (g_str_hash, g_str_equal);
255
g_hash_table_insert (hash, "path", emblem_data->path);
256
share_info = syncdaemon_share_info_new_from_hash_table (hash);
257
g_hash_table_unref (hash);
259
g_hash_table_insert (emblem_data->interface->priv->shared,
260
g_strdup (syncdaemon_share_info_get_path (share_info)),
264
g_object_get (G_OBJECT (emblem_data->interface), "daemon", &daemon, NULL);
266
g_signal_emit_by_name (daemon, "share_created", TRUE, share_info);
268
no_output_dbus_call_ended_cb (proxy, call_id, user_data);
270
g_object_unref (emblem_data->interface);
271
g_free (emblem_data->path);
272
g_free (emblem_data);
276
* syncdaemon_shares_interface_create:
279
syncdaemon_shares_interface_create (SyncdaemonSharesInterface *interface,
283
gboolean allow_modifications)
285
AddEmblemData *emblem_data;
286
g_return_if_fail (SYNCDAEMON_IS_SHARES_INTERFACE (interface));
287
g_return_if_fail (path != NULL);
288
g_return_if_fail (usernames != NULL);
289
g_return_if_fail (name != NULL);
291
emblem_data = g_new0 (AddEmblemData, 1);
292
emblem_data->interface = g_object_ref (interface);
293
emblem_data->path = g_strdup (path);
295
if (g_slist_length (usernames) == 1) {
296
dbus_g_proxy_begin_call (DBUS_G_PROXY (interface->priv->proxy), "create_share",
297
add_emblem_cb, emblem_data, NULL,
299
G_TYPE_STRING, (const gchar *) usernames->data,
301
G_TYPE_STRING, allow_modifications ? "Modify" : "View",
306
gchar **users_array = g_new0 (gchar *, g_slist_length (usernames) + 1);
308
for (l = usernames, i = 0; l != NULL; l = l->next, i++)
309
users_array[i] = g_strdup (l->data);
311
dbus_g_proxy_begin_call (DBUS_G_PROXY (interface->priv->proxy), "create_shares",
312
add_emblem_cb, emblem_data, NULL,
314
G_TYPE_STRV, users_array,
316
G_TYPE_STRING, allow_modifications ? "Modify" : "View",
319
g_strfreev (users_array);
324
* syncdaemon_shares_interface_delete:
327
syncdaemon_shares_interface_delete (SyncdaemonSharesInterface *interface, const gchar *path)
330
const gchar *share_id = NULL;
332
g_return_if_fail (SYNCDAEMON_IS_SHARES_INTERFACE (interface));
333
g_return_if_fail (path != NULL);
335
shares = syncdaemon_shares_interface_get_shared (interface);
336
for (l = shares; l != NULL; l = l->next) {
337
SyncdaemonShareInfo *sinfo = SYNCDAEMON_SHARE_INFO (l->data);
339
if (g_str_equal (path, syncdaemon_share_info_get_path (sinfo)))
340
share_id = syncdaemon_share_info_get_node_id (sinfo);
343
if (share_id != NULL) {
344
dbus_g_proxy_begin_call (DBUS_G_PROXY (interface->priv->proxy), "delete_share",
345
no_output_dbus_call_ended_cb, interface, NULL,
346
G_TYPE_STRING, share_id,
350
g_slist_free (shares);
354
* syncdaemon_shares_interface_get_shared:
357
syncdaemon_shares_interface_get_shared (SyncdaemonSharesInterface *interface)
361
SyncdaemonShareInfo *share_info;
362
GSList *shared_list, *returned_list = NULL;;
363
GError *error = NULL;
365
g_return_val_if_fail (SYNCDAEMON_IS_SHARES_INTERFACE (interface), NULL);
367
if (interface->priv->shared == NULL) {
368
interface->priv->shared = g_hash_table_new_full (g_str_hash, g_str_equal,
369
g_free, g_object_unref);
371
if (dbus_g_proxy_call (DBUS_G_PROXY (interface->priv->proxy), "get_shared", &error,
373
dbus_g_type_get_collection ("GSList",
374
dbus_g_type_get_map (
377
G_TYPE_STRING)), &shared_list,
379
while (shared_list != NULL) {
380
GHashTable *hash = (GHashTable *) shared_list->data;
382
share_info = syncdaemon_share_info_new_from_hash_table (hash);
384
shared_list = g_slist_remove (shared_list, hash);
385
g_hash_table_unref (hash);
387
g_hash_table_insert (interface->priv->shared,
388
g_strdup (syncdaemon_share_info_get_path (share_info)),
392
SyncdaemonDaemon *daemon = NULL;
394
g_object_get (G_OBJECT (interface), "daemon", &daemon, NULL);
396
g_signal_emit_by_name (daemon, "error", error->message, NULL);
398
g_error_free (error);
404
/* Create the list to be returned */
405
g_hash_table_iter_init (&iter, interface->priv->shared);
406
while (g_hash_table_iter_next (&iter, (gpointer *) &path, (gpointer *) &share_info))
407
returned_list = g_slist_append (returned_list, share_info);
409
return returned_list;
413
* syncdaemon_shares_interface_get_shares:
416
syncdaemon_shares_interface_get_shares (SyncdaemonSharesInterface *interface)
420
SyncdaemonShareInfo *share_info;
421
GSList *shares_list, *returned_list = NULL;;
422
GError *error = NULL;
424
g_return_val_if_fail (SYNCDAEMON_IS_SHARES_INTERFACE (interface), NULL);
426
if (interface->priv->shares == NULL) {
427
interface->priv->shares = g_hash_table_new_full (g_str_hash, g_str_equal,
428
g_free, g_object_unref);
430
if (dbus_g_proxy_call (DBUS_G_PROXY (interface->priv->proxy), "get_shares", &error,
432
dbus_g_type_get_collection ("GSList",
433
dbus_g_type_get_map (
436
G_TYPE_STRING)), &shares_list,
438
while (shares_list != NULL) {
439
GHashTable *hash = (GHashTable *) shares_list->data;
441
share_info = syncdaemon_share_info_new_from_hash_table (hash);
443
shares_list = g_slist_remove (shares_list, hash);
444
g_hash_table_unref (hash);
446
g_hash_table_insert (interface->priv->shares,
447
g_strdup (syncdaemon_share_info_get_path (share_info)),
451
SyncdaemonDaemon *daemon = NULL;
453
g_object_get (G_OBJECT (interface), "daemon", &daemon, NULL);
455
g_signal_emit_by_name (daemon, "error", error->message, NULL);
457
g_error_free (error);
463
/* Create the list to be returned */
464
g_hash_table_iter_init (&iter, interface->priv->shares);
465
while (g_hash_table_iter_next (&iter, (gpointer) &path, (gpointer) &share_info))
466
returned_list = g_slist_append (returned_list, share_info);
468
return returned_list;
472
* syncdaemon_shares_interface_refresh:
475
syncdaemon_shares_interface_refresh (SyncdaemonSharesInterface *interface)
477
g_return_if_fail (SYNCDAEMON_IS_SHARES_INTERFACE (interface));
479
dbus_g_proxy_begin_call (DBUS_G_PROXY (interface->priv->proxy), "refresh_shares",
480
no_output_dbus_call_ended_cb, interface, NULL,
485
* syncdaemon_shares_interface_reject:
488
syncdaemon_shares_interface_reject (SyncdaemonSharesInterface *interface, const gchar *share_id)
490
g_return_if_fail (SYNCDAEMON_IS_SHARES_INTERFACE (interface));
491
g_return_if_fail (share_id != NULL);
493
dbus_g_proxy_begin_call (DBUS_G_PROXY (interface->priv->proxy), "reject_share",
494
no_output_dbus_call_ended_cb, interface, NULL,
495
G_TYPE_STRING, share_id,