Merge lp:~rodrigo-moya/ubuntuone-client/check-before-disabling into lp:ubuntuone-client

Proposed by Rodrigo Moya
Status: Merged
Approved by: Manuel de la Peña
Approved revision: 591
Merged at revision: 597
Proposed branch: lp:~rodrigo-moya/ubuntuone-client/check-before-disabling
Merge into: lp:ubuntuone-client
Diff against target: 1098 lines (+824/-61)
10 files modified
libsyncdaemon/Makefile.am (+2/-0)
libsyncdaemon/libsyncdaemon.h (+1/-0)
libsyncdaemon/syncdaemon-daemon.c (+4/-4)
libsyncdaemon/syncdaemon-daemon.h (+3/-2)
libsyncdaemon/syncdaemon-share-info.c (+344/-0)
libsyncdaemon/syncdaemon-share-info.h (+78/-0)
libsyncdaemon/syncdaemon-shares-interface.c (+177/-48)
libsyncdaemon/syncdaemon-shares-interface.h (+2/-2)
libsyncdaemon/test-libsyncdaemon.c (+113/-4)
nautilus/location-widget.c (+100/-1)
To merge this branch: bzr merge lp:~rodrigo-moya/ubuntuone-client/check-before-disabling
Reviewer Review Type Date Requested Status
Manuel de la Peña (community) Approve
Natalia Bidart (community) Approve
Review via email: mp+30664@code.launchpad.net

Commit message

Check for shared subfolders in UDFs when disabling them and ask user for confirmation

Description of the change

Check for shared subfolders in UDFs when disabling them and ask user for confirmation.

This cannot be tested due to a bug in syncdaemon (bug #608779), so please review it with that in mind

To post a comment you must log in.
Revision history for this message
Natalia Bidart (nataliabidart) wrote :

Tests are failing for me with this trace:

nessita@miro:~/canonical/ubuntuone-client/review_check-before-disabling$ ./libsyncdaemon/test-libsyncdaemon
/testlibsyncdaemon/TestDaemon:
** CRITICAL **: syncdaemon_interface_get_proxy_object: assertion `SYNCDAEMON_IS_INTERFACE (interface)' failed
aborting...
Trace/breakpoint trap (core dumped)

Not sure if this is a Needs Fixing or Information, I may be missing something?

review: Needs Information
Revision history for this message
Rodrigo Moya (rodrigo-moya) wrote :

Is your syncdaemon running?

Revision history for this message
Rodrigo Moya (rodrigo-moya) wrote :

wait, I'm getting it also, looking

591. By Rodrigo Moya

Run the test suite only when the syncdaemon is ready

Revision history for this message
Rodrigo Moya (rodrigo-moya) wrote :

The tests got broken with the last merge from trunk, fixed now, so please review again

Revision history for this message
Natalia Bidart (nataliabidart) :
review: Approve
Revision history for this message
Manuel de la Peña (mandel) wrote :

Tests work as expected

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'libsyncdaemon/Makefile.am'
2--- libsyncdaemon/Makefile.am 2010-07-07 23:03:09 +0000
3+++ libsyncdaemon/Makefile.am 2010-07-23 10:31:40 +0000
4@@ -29,6 +29,7 @@
5 syncdaemon-folders-interface.h \
6 syncdaemon-metadata.h \
7 syncdaemon-publicfiles-interface.h \
8+ syncdaemon-share-info.h \
9 syncdaemon-shares-interface.h \
10 syncdaemon-status-info.h \
11 syncdaemon-status-interface.h \
12@@ -46,6 +47,7 @@
13 syncdaemon-folders-interface.c \
14 syncdaemon-metadata.c \
15 syncdaemon-publicfiles-interface.c \
16+ syncdaemon-share-info.c \
17 syncdaemon-shares-interface.c \
18 syncdaemon-status-info.c \
19 syncdaemon-status-interface.c \
20
21=== modified file 'libsyncdaemon/libsyncdaemon.h'
22--- libsyncdaemon/libsyncdaemon.h 2010-06-24 10:25:12 +0000
23+++ libsyncdaemon/libsyncdaemon.h 2010-07-23 10:31:40 +0000
24@@ -27,6 +27,7 @@
25 #include <libsyncdaemon/syncdaemon-folders-interface.h>
26 #include <libsyncdaemon/syncdaemon-interface.h>
27 #include <libsyncdaemon/syncdaemon-publicfiles-interface.h>
28+#include <libsyncdaemon/syncdaemon-share-info.h>
29 #include <libsyncdaemon/syncdaemon-shares-interface.h>
30 #include <libsyncdaemon/syncdaemon-status-info.h>
31 #include <libsyncdaemon/syncdaemon-status-interface.h>
32
33=== modified file 'libsyncdaemon/syncdaemon-daemon.c'
34--- libsyncdaemon/syncdaemon-daemon.c 2010-07-20 10:30:05 +0000
35+++ libsyncdaemon/syncdaemon-daemon.c 2010-07-23 10:31:40 +0000
36@@ -222,19 +222,19 @@
37 (GSignalFlags) G_SIGNAL_RUN_LAST,
38 G_STRUCT_OFFSET (SyncdaemonDaemonClass, share_created),
39 NULL, NULL,
40- _syncdaemon_marshal_VOID__BOOLEAN_POINTER,
41+ _syncdaemon_marshal_VOID__BOOLEAN_OBJECT,
42 G_TYPE_NONE, 2,
43 G_TYPE_BOOLEAN,
44- G_TYPE_POINTER);
45+ G_TYPE_OBJECT);
46 daemon_signals[SHARE_DELETED_SIGNAL] = g_signal_new ("share_deleted",
47 G_TYPE_FROM_CLASS (klass),
48 (GSignalFlags) G_SIGNAL_RUN_LAST,
49 G_STRUCT_OFFSET (SyncdaemonDaemonClass, share_deleted),
50 NULL, NULL,
51- _syncdaemon_marshal_VOID__BOOLEAN_POINTER,
52+ _syncdaemon_marshal_VOID__BOOLEAN_OBJECT,
53 G_TYPE_NONE, 2,
54 G_TYPE_BOOLEAN,
55- G_TYPE_POINTER);
56+ G_TYPE_OBJECT);
57 daemon_signals[DOWNLOAD_STARTED_SIGNAL] = g_signal_new ("download_started",
58 G_TYPE_FROM_CLASS (klass),
59 (GSignalFlags) G_SIGNAL_RUN_LAST,
60
61=== modified file 'libsyncdaemon/syncdaemon-daemon.h'
62--- libsyncdaemon/syncdaemon-daemon.h 2010-07-20 08:37:30 +0000
63+++ libsyncdaemon/syncdaemon-daemon.h 2010-07-23 10:31:40 +0000
64@@ -25,6 +25,7 @@
65 #include <glib-object.h>
66 #include "syncdaemon-folder-info.h"
67 #include "syncdaemon-interface.h"
68+#include "syncdaemon-share-info.h"
69 #include "syncdaemon-status-info.h"
70 #include "syncdaemon-transfer-info.h"
71
72@@ -65,8 +66,8 @@
73 void (* file_published) (SyncdaemonDaemon *daemon, GHashTable *file_info);
74 void (* got_published_files) (SyncdaemonDaemon *daemon, GPtrArray *files);
75
76- void (* share_created) (SyncdaemonDaemon *daemon, gboolean success, GHashTable *share_info);
77- void (* share_deleted) (SyncdaemonDaemon *daemon, gboolean success, GHashTable *share_info);
78+ void (* share_created) (SyncdaemonDaemon *daemon, gboolean success, SyncdaemonShareInfo *share_info);
79+ void (* share_deleted) (SyncdaemonDaemon *daemon, gboolean success, SyncdaemonShareInfo *share_info);
80
81 void (* download_started) (SyncdaemonDaemon *daemon, const gchar *path);
82 void (* download_file_progress) (SyncdaemonDaemon *daemon, const gchar *path, SyncdaemonTransferInfo *tinfo);
83
84=== added file 'libsyncdaemon/syncdaemon-share-info.c'
85--- libsyncdaemon/syncdaemon-share-info.c 1970-01-01 00:00:00 +0000
86+++ libsyncdaemon/syncdaemon-share-info.c 2010-07-23 10:31:40 +0000
87@@ -0,0 +1,344 @@
88+/*
89+ * Syncdaemon API
90+ *
91+ * Authors: Rodrigo Moya <rodrigo.moya@canonical.com>
92+ *
93+ * Copyright 2010 Canonical Ltd.
94+ *
95+ * This program is free software: you can redistribute it and/or modify it
96+ * under the terms of the GNU General Public License version 3, as published
97+ * by the Free Software Foundation.
98+ *
99+ * This program is distributed in the hope that it will be useful, but
100+ * WITHOUT ANY WARRANTY; without even the implied warranties of
101+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
102+ * PURPOSE. See the GNU General Public License for more details.
103+ *
104+ * You should have received a copy of the GNU General Public License along
105+ * with this program. If not, see <http://www.gnu.org/licenses/>.
106+ *
107+ */
108+
109+#include "syncdaemon-share-info.h"
110+
111+G_DEFINE_TYPE(SyncdaemonShareInfo, syncdaemon_share_info, G_TYPE_OBJECT)
112+
113+struct _SyncdaemonShareInfoPrivate {
114+ gchar *name;
115+ SyncdaemonShareInfoType type;
116+ gchar *path;
117+ gchar *username;
118+ gchar *user_visible_name;
119+ gchar *node_id;
120+ gchar *volume_id;
121+ gboolean accepted;
122+ gboolean allow_modifications;
123+};
124+
125+static void
126+syncdaemon_share_info_finalize (GObject *object)
127+{
128+ SyncdaemonShareInfo *sinfo = SYNCDAEMON_SHARE_INFO (object);
129+
130+ if (sinfo->priv != NULL) {
131+ if (sinfo->priv->name != NULL)
132+ g_free (sinfo->priv->name);
133+
134+ if (sinfo->priv->path != NULL)
135+ g_free (sinfo->priv->path);
136+
137+ if (sinfo->priv->username != NULL)
138+ g_free (sinfo->priv->username);
139+
140+ if (sinfo->priv->user_visible_name != NULL)
141+ g_free (sinfo->priv->user_visible_name);
142+
143+ if (sinfo->priv->node_id != NULL)
144+ g_free (sinfo->priv->node_id);
145+
146+ if (sinfo->priv->volume_id != NULL)
147+ g_free (sinfo->priv->volume_id);
148+
149+ g_free (sinfo->priv);
150+ }
151+
152+ G_OBJECT_CLASS (syncdaemon_share_info_parent_class)->finalize (object);
153+}
154+
155+static void
156+syncdaemon_share_info_class_init (SyncdaemonShareInfoClass *klass)
157+{
158+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
159+
160+ object_class->finalize = syncdaemon_share_info_finalize;
161+}
162+
163+static void
164+syncdaemon_share_info_init (SyncdaemonShareInfo *sinfo)
165+{
166+ sinfo->priv = g_new0 (SyncdaemonShareInfoPrivate, 1);
167+}
168+
169+/**
170+ * syncdaemon_share_info_new:
171+ */
172+SyncdaemonShareInfo *
173+syncdaemon_share_info_new (void)
174+{
175+ return g_object_new (SYNCDAEMON_TYPE_SHARE_INFO, NULL);
176+}
177+
178+/**
179+ * syncdaemon_share_info_new_from_hash_table:
180+ */
181+SyncdaemonShareInfo *
182+syncdaemon_share_info_new_from_hash_table (GHashTable *hash)
183+{
184+ SyncdaemonShareInfo *sinfo;
185+
186+ sinfo = g_object_new (SYNCDAEMON_TYPE_SHARE_INFO, NULL);
187+ if (hash != NULL) {
188+ gchar *str;
189+
190+ syncdaemon_share_info_set_name (sinfo, g_hash_table_lookup (hash, "name"));
191+ syncdaemon_share_info_set_path (sinfo, g_hash_table_lookup (hash, "path"));
192+ syncdaemon_share_info_set_username (sinfo, g_hash_table_lookup (hash, "other_username"));
193+ syncdaemon_share_info_set_user_visible_name (
194+ sinfo,
195+ g_hash_table_lookup (hash, "other_visible_name"));
196+ syncdaemon_share_info_set_node_id (sinfo, g_hash_table_lookup (hash, "node_id"));
197+ syncdaemon_share_info_set_volume_id (sinfo, g_hash_table_lookup (hash, "volume_id"));
198+ syncdaemon_share_info_set_accepted (
199+ sinfo,
200+ g_strcmp0 (g_hash_table_lookup (hash, "accepted"), "True") == 0);
201+ syncdaemon_share_info_set_allow_modifications (
202+ sinfo,
203+ g_strcmp0 (g_hash_table_lookup (hash, "access_level"), "Modify") == 0);
204+
205+ str = g_hash_table_lookup (hash, "type");
206+ if (g_strcmp0 (str, "Shared") == 0)
207+ syncdaemon_share_info_set_share_type (sinfo, SYNCDAEMON_SHARE_INFO_TYPE_SHARED);
208+ else if (g_strcmp0 (str, "Share") == 0)
209+ syncdaemon_share_info_set_share_type (sinfo, SYNCDAEMON_SHARE_INFO_TYPE_SHARE);
210+ else
211+ syncdaemon_share_info_set_share_type (sinfo, SYNCDAEMON_SHARE_INFO_TYPE_UNKNOWN);
212+ }
213+
214+ return sinfo;
215+}
216+
217+/**
218+ * syncdameon_share_info_get_name:
219+ */
220+const gchar *
221+syncdaemon_share_info_get_name (SyncdaemonShareInfo *sinfo)
222+{
223+ g_return_val_if_fail (SYNCDAEMON_IS_SHARE_INFO (sinfo), NULL);
224+
225+ return (const gchar *) sinfo->priv->name;
226+}
227+
228+/**
229+ * syncdameon_share_info_set_name:
230+ */
231+void
232+syncdaemon_share_info_set_name (SyncdaemonShareInfo *sinfo, const gchar *name)
233+{
234+ g_return_if_fail (SYNCDAEMON_IS_SHARE_INFO (sinfo));
235+
236+ if (sinfo->priv->name != NULL)
237+ g_free (sinfo->priv->name);
238+
239+ sinfo->priv->name = g_strdup (name);
240+}
241+
242+/**
243+ * syncdameon_share_info_get_share_type:
244+ */
245+SyncdaemonShareInfoType
246+syncdaemon_share_info_get_share_type (SyncdaemonShareInfo *sinfo)
247+{
248+ g_return_val_if_fail (SYNCDAEMON_IS_SHARE_INFO (sinfo), SYNCDAEMON_SHARE_INFO_TYPE_UNKNOWN);
249+
250+ return sinfo->priv->type;
251+}
252+
253+/**
254+ * syncdameon_share_info_set_share_type:
255+ */
256+void
257+syncdaemon_share_info_set_share_type (SyncdaemonShareInfo *sinfo, SyncdaemonShareInfoType type)
258+{
259+ g_return_if_fail (SYNCDAEMON_IS_SHARE_INFO (sinfo));
260+
261+ sinfo->priv->type = type;
262+}
263+
264+/**
265+ * syncdameon_share_info_get_path:
266+ */
267+const gchar *
268+syncdaemon_share_info_get_path (SyncdaemonShareInfo *sinfo)
269+{
270+ g_return_val_if_fail (SYNCDAEMON_IS_SHARE_INFO (sinfo), NULL);
271+
272+ return (const gchar *) sinfo->priv->path;
273+}
274+
275+/**
276+ * syncdameon_share_info_set_path:
277+ */
278+void
279+syncdaemon_share_info_set_path (SyncdaemonShareInfo *sinfo, const gchar *path)
280+{
281+ g_return_if_fail (SYNCDAEMON_IS_SHARE_INFO (sinfo));
282+
283+ if (sinfo->priv->path != NULL)
284+ g_free (sinfo->priv->path);
285+
286+ sinfo->priv->path = g_strdup (path);
287+}
288+
289+/**
290+ * syncdameon_share_info_get_username:
291+ */
292+const gchar *
293+syncdaemon_share_info_get_username (SyncdaemonShareInfo *sinfo)
294+{
295+ g_return_val_if_fail (SYNCDAEMON_IS_SHARE_INFO (sinfo), NULL);
296+
297+ return (const gchar *) sinfo->priv->username;
298+}
299+
300+/**
301+ * syncdameon_share_info_set_username:
302+ */
303+void
304+syncdaemon_share_info_set_username (SyncdaemonShareInfo *sinfo, const gchar *username)
305+{
306+ g_return_if_fail (SYNCDAEMON_IS_SHARE_INFO (sinfo));
307+
308+ if (sinfo->priv->username != NULL)
309+ g_free (sinfo->priv->username);
310+
311+ sinfo->priv->username = g_strdup (username);
312+}
313+
314+/**
315+ * syncdameon_share_info_get_user_visible_name:
316+ */
317+const gchar *
318+syncdaemon_share_info_get_user_visible_name (SyncdaemonShareInfo *sinfo)
319+{
320+ g_return_val_if_fail (SYNCDAEMON_IS_SHARE_INFO (sinfo), NULL);
321+
322+ return (const gchar *) sinfo->priv->user_visible_name;
323+}
324+
325+/**
326+ * syncdameon_share_info_set_user_visible_name:
327+ */
328+void
329+syncdaemon_share_info_set_user_visible_name (SyncdaemonShareInfo *sinfo, const gchar *user_visible_name)
330+{
331+ g_return_if_fail (SYNCDAEMON_IS_SHARE_INFO (sinfo));
332+
333+ if (sinfo->priv->user_visible_name != NULL)
334+ g_free (sinfo->priv->user_visible_name);
335+
336+ sinfo->priv->user_visible_name = g_strdup (user_visible_name);
337+}
338+
339+/**
340+ * syncdameon_share_info_get_node_id:
341+ */
342+const gchar *
343+syncdaemon_share_info_get_node_id (SyncdaemonShareInfo *sinfo)
344+{
345+ g_return_val_if_fail (SYNCDAEMON_IS_SHARE_INFO (sinfo), NULL);
346+
347+ return (const gchar *) sinfo->priv->node_id;
348+}
349+
350+/**
351+ * syncdameon_share_info_set_node_id:
352+ */
353+void
354+syncdaemon_share_info_set_node_id (SyncdaemonShareInfo *sinfo, const gchar *node_id)
355+{
356+ g_return_if_fail (SYNCDAEMON_IS_SHARE_INFO (sinfo));
357+
358+ if (sinfo->priv->node_id != NULL)
359+ g_free (sinfo->priv->node_id);
360+
361+ sinfo->priv->node_id = g_strdup (node_id);
362+}
363+
364+/**
365+ * syncdameon_share_info_get_volume_id:
366+ */
367+const gchar *
368+syncdaemon_share_info_get_volume_id (SyncdaemonShareInfo *sinfo)
369+{
370+ g_return_val_if_fail (SYNCDAEMON_IS_SHARE_INFO (sinfo), NULL);
371+
372+ return (const gchar *) sinfo->priv->volume_id;
373+}
374+
375+/**
376+ * syncdameon_share_info_set_volume_id:
377+ */
378+void
379+syncdaemon_share_info_set_volume_id (SyncdaemonShareInfo *sinfo, const gchar *volume_id)
380+{
381+ g_return_if_fail (SYNCDAEMON_IS_SHARE_INFO (sinfo));
382+
383+ if (sinfo->priv->volume_id != NULL)
384+ g_free (sinfo->priv->volume_id);
385+
386+ sinfo->priv->volume_id = g_strdup (volume_id);
387+}
388+
389+/**
390+ * syncdameon_share_info_get_accepted:
391+ */
392+gboolean
393+syncdaemon_share_info_get_accepted (SyncdaemonShareInfo *sinfo)
394+{
395+ g_return_val_if_fail (SYNCDAEMON_IS_SHARE_INFO (sinfo), FALSE);
396+
397+ return sinfo->priv->accepted;
398+}
399+
400+/**
401+ * syncdameon_share_info_set_accepted:
402+ */
403+void
404+syncdaemon_share_info_set_accepted (SyncdaemonShareInfo *sinfo, gboolean accepted)
405+{
406+ g_return_if_fail (SYNCDAEMON_IS_SHARE_INFO (sinfo));
407+
408+ sinfo->priv->accepted = accepted;
409+}
410+
411+/**
412+ * syncdameon_share_info_get_allow_modifications:
413+ */
414+gboolean
415+syncdaemon_share_info_get_allow_modifications (SyncdaemonShareInfo *sinfo)
416+{
417+ g_return_val_if_fail (SYNCDAEMON_IS_SHARE_INFO (sinfo), FALSE);
418+
419+ return sinfo->priv->allow_modifications;
420+}
421+
422+/**
423+ * syncdameon_share_info_set_allow_modifications:
424+ */
425+void
426+syncdaemon_share_info_set_allow_modifications (SyncdaemonShareInfo *sinfo, gboolean allow_modifications)
427+{
428+ g_return_if_fail (SYNCDAEMON_IS_SHARE_INFO (sinfo));
429+
430+ sinfo->priv->allow_modifications = allow_modifications;
431+}
432
433=== added file 'libsyncdaemon/syncdaemon-share-info.h'
434--- libsyncdaemon/syncdaemon-share-info.h 1970-01-01 00:00:00 +0000
435+++ libsyncdaemon/syncdaemon-share-info.h 2010-07-23 10:31:40 +0000
436@@ -0,0 +1,78 @@
437+/*
438+ * Syncdaemon API
439+ *
440+ * Authors: Rodrigo Moya <rodrigo.moya@canonical.com>
441+ *
442+ * Copyright 2010 Canonical Ltd.
443+ *
444+ * This program is free software: you can redistribute it and/or modify it
445+ * under the terms of the GNU General Public License version 3, as published
446+ * by the Free Software Foundation.
447+ *
448+ * This program is distributed in the hope that it will be useful, but
449+ * WITHOUT ANY WARRANTY; without even the implied warranties of
450+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
451+ * PURPOSE. See the GNU General Public License for more details.
452+ *
453+ * You should have received a copy of the GNU General Public License along
454+ * with this program. If not, see <http://www.gnu.org/licenses/>.
455+ *
456+ */
457+
458+#ifndef __SYNCDAEMON_SHARE_INFO_H__
459+#define __SYNCDAEMON_SHARE_INFO_H__
460+
461+#include <glib-object.h>
462+
463+G_BEGIN_DECLS
464+
465+#define SYNCDAEMON_TYPE_SHARE_INFO (syncdaemon_share_info_get_type ())
466+#define SYNCDAEMON_SHARE_INFO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SYNCDAEMON_TYPE_SHARE_INFO, SyncdaemonShareInfo))
467+#define SYNCDAEMON_IS_SHARE_INFO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SYNCDAEMON_TYPE_SHARE_INFO))
468+#define SYNCDAEMON_SHARE_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SYNCDAEMON_TYPE_SHARE_INFO, SyncdaemonShareInfoClass))
469+#define SYNCDAEMON_IS_SHARE_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SYNCDAEMON_TYPE_SHARE_INFO))
470+#define SYNCDAEMON_SHARE_INFO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SYNCDAEMON_TYPE_SHARE_INFO, SyncdaemonShareInfoClass))
471+
472+typedef struct _SyncdaemonShareInfoPrivate SyncdaemonShareInfoPrivate;
473+
474+typedef struct {
475+ GObject parent;
476+ SyncdaemonShareInfoPrivate *priv;
477+} SyncdaemonShareInfo;
478+
479+typedef struct {
480+ GObjectClass parent_class;
481+} SyncdaemonShareInfoClass;
482+
483+typedef enum {
484+ SYNCDAEMON_SHARE_INFO_TYPE_UNKNOWN,
485+ SYNCDAEMON_SHARE_INFO_TYPE_SHARED,
486+ SYNCDAEMON_SHARE_INFO_TYPE_SHARE
487+} SyncdaemonShareInfoType;
488+
489+GType syncdaemon_share_info_get_type (void);
490+SyncdaemonShareInfo *syncdaemon_share_info_new (void);
491+SyncdaemonShareInfo *syncdaemon_share_info_new_from_hash_table (GHashTable *hash);
492+
493+const gchar *syncdaemon_share_info_get_name (SyncdaemonShareInfo *sinfo);
494+void syncdaemon_share_info_set_name (SyncdaemonShareInfo *sinfo, const gchar *name);
495+SyncdaemonShareInfoType syncdaemon_share_info_get_share_type (SyncdaemonShareInfo *sinfo);
496+void syncdaemon_share_info_set_share_type (SyncdaemonShareInfo *sinfo, SyncdaemonShareInfoType type);
497+const gchar *syncdaemon_share_info_get_path (SyncdaemonShareInfo *sinfo);
498+void syncdaemon_share_info_set_path (SyncdaemonShareInfo *sinfo, const gchar *path);
499+const gchar *syncdaemon_share_info_get_username (SyncdaemonShareInfo *sinfo);
500+void syncdaemon_share_info_set_username (SyncdaemonShareInfo *sinfo, const gchar *username);
501+const gchar *syncdaemon_share_info_get_user_visible_name (SyncdaemonShareInfo *sinfo);
502+void syncdaemon_share_info_set_user_visible_name (SyncdaemonShareInfo *sinfo, const gchar *user_visible_name);
503+const gchar *syncdaemon_share_info_get_node_id (SyncdaemonShareInfo *sinfo);
504+void syncdaemon_share_info_set_node_id (SyncdaemonShareInfo *sinfo, const gchar *node_id);
505+const gchar *syncdaemon_share_info_get_volume_id (SyncdaemonShareInfo *sinfo);
506+void syncdaemon_share_info_set_volume_id (SyncdaemonShareInfo *sinfo, const gchar *volume_id);
507+gboolean syncdaemon_share_info_get_accepted (SyncdaemonShareInfo *sinfo);
508+void syncdaemon_share_info_set_accepted (SyncdaemonShareInfo *sinfo, gboolean accepted);
509+gboolean syncdaemon_share_info_get_allow_modifications (SyncdaemonShareInfo *sinfo);
510+void syncdaemon_share_info_set_allow_modifications (SyncdaemonShareInfo *sinfo, gboolean allow_modifications);
511+
512+G_END_DECLS
513+
514+#endif
515
516=== modified file 'libsyncdaemon/syncdaemon-shares-interface.c'
517--- libsyncdaemon/syncdaemon-shares-interface.c 2010-07-12 17:06:17 +0000
518+++ libsyncdaemon/syncdaemon-shares-interface.c 2010-07-23 10:31:40 +0000
519@@ -27,6 +27,8 @@
520
521 struct _SyncdaemonSharesInterfacePrivate {
522 GObject *proxy;
523+ GHashTable *shared;
524+ GHashTable *shares;
525 };
526
527 static void
528@@ -50,47 +52,105 @@
529 }
530
531 static void
532-share_created_cb (DBusGProxy *proxy, GHashTable *share_info, gpointer user_data)
533+share_created_cb (DBusGProxy *proxy, GHashTable *hash, gpointer user_data)
534 {
535 SyncdaemonDaemon *daemon = NULL;
536+ SyncdaemonShareInfo *share_info;
537 SyncdaemonSharesInterface *interface = SYNCDAEMON_SHARES_INTERFACE (user_data);
538
539+ share_info = syncdaemon_share_info_new_from_hash_table (hash);
540+ switch (syncdaemon_share_info_get_share_type (share_info)) {
541+ case SYNCDAEMON_SHARE_INFO_TYPE_SHARED:
542+ if (interface->priv->shared == NULL) {
543+ GSList *shared;
544+
545+ shared = syncdaemon_shares_interface_get_shared (interface);
546+ g_slist_free (shared);
547+ }
548+
549+ g_hash_table_insert (interface->priv->shared,
550+ g_strdup (syncdaemon_share_info_get_path (share_info)),
551+ share_info);
552+ break;
553+ case SYNCDAEMON_SHARE_INFO_TYPE_SHARE:
554+ if (interface->priv->shares == NULL) {
555+ GSList *shares;
556+
557+ shares = syncdaemon_shares_interface_get_shares (interface);
558+ g_slist_free (shares);
559+ }
560+
561+ g_hash_table_insert (interface->priv->shares,
562+ g_strdup (syncdaemon_share_info_get_path (share_info)),
563+ share_info);
564+ break;
565+ default:
566+ return;
567+ }
568+
569 g_object_get (G_OBJECT (interface), "daemon", &daemon, NULL);
570 if (daemon != NULL)
571 g_signal_emit_by_name (daemon, "share_created", TRUE, share_info);
572 }
573
574 static void
575-share_create_error_cb (DBusGProxy *proxy, GHashTable *share_info, const gchar *error, gpointer user_data)
576+share_create_error_cb (DBusGProxy *proxy, GHashTable *hash, const gchar *error, gpointer user_data)
577 {
578 SyncdaemonDaemon *daemon = NULL;
579 SyncdaemonSharesInterface *interface = SYNCDAEMON_SHARES_INTERFACE (user_data);
580
581 g_object_get (G_OBJECT (interface), "daemon", &daemon, NULL);
582- if (daemon != NULL)
583+ if (daemon != NULL) {
584+ SyncdaemonShareInfo *share_info;
585+
586+ share_info = syncdaemon_share_info_new_from_hash_table (hash);
587 g_signal_emit_by_name (daemon, "share_created", FALSE, share_info);
588+ g_object_unref (G_OBJECT (share_info));
589+ }
590 }
591
592 static void
593-share_deleted_cb (DBusGProxy *proxy, GHashTable *share_info, gpointer user_data)
594+share_deleted_cb (DBusGProxy *proxy, GHashTable *hash, gpointer user_data)
595 {
596 SyncdaemonDaemon *daemon = NULL;
597+ SyncdaemonShareInfo *share_info;
598 SyncdaemonSharesInterface *interface = SYNCDAEMON_SHARES_INTERFACE (user_data);
599
600+ share_info = syncdaemon_share_info_new_from_hash_table (hash);
601+ switch (syncdaemon_share_info_get_share_type (share_info)) {
602+ case SYNCDAEMON_SHARE_INFO_TYPE_SHARED:
603+ if (interface->priv->shared != NULL)
604+ g_hash_table_remove (interface->priv->shared, syncdaemon_share_info_get_path (share_info));
605+ break;
606+ case SYNCDAEMON_SHARE_INFO_TYPE_SHARE:
607+ if (interface->priv->shares != NULL)
608+ g_hash_table_remove (interface->priv->shares, syncdaemon_share_info_get_path (share_info));
609+ break;
610+ default:
611+ return;
612+ }
613+
614 g_object_get (G_OBJECT (interface), "daemon", &daemon, NULL);
615 if (daemon != NULL)
616 g_signal_emit_by_name (daemon, "share_deleted", TRUE, share_info);
617+
618+ g_object_unref (G_OBJECT (share_info));
619 }
620
621 static void
622-share_delete_error_cb (DBusGProxy *proxy, GHashTable *share_info, const gchar *error, gpointer user_data)
623+share_delete_error_cb (DBusGProxy *proxy, GHashTable *hash, const gchar *error, gpointer user_data)
624 {
625 SyncdaemonDaemon *daemon = NULL;
626 SyncdaemonSharesInterface *interface = SYNCDAEMON_SHARES_INTERFACE (user_data);
627
628 g_object_get (G_OBJECT (interface), "daemon", &daemon, NULL);
629- if (daemon != NULL)
630+ if (daemon != NULL) {
631+ SyncdaemonShareInfo *share_info;
632+
633+ share_info = syncdaemon_share_info_new_from_hash_table (hash);
634 g_signal_emit_by_name (daemon, "share_deleted", FALSE, share_info);
635+ g_object_unref (G_OBJECT (share_info));
636+ }
637 }
638
639 static void
640@@ -224,53 +284,122 @@
641 G_TYPE_INVALID);
642 }
643
644-static void
645-got_shared_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
646-{
647- GSList *shared_list;
648- SyncdaemonSharesInterface *interface = SYNCDAEMON_SHARES_INTERFACE (user_data);
649- SyncdaemonDaemon *daemon = NULL;
650- GError *error = NULL;
651-
652- g_object_get (G_OBJECT (interface), "daemon", &daemon, NULL);
653-
654- if (!dbus_g_proxy_end_call (proxy, call_id, &error,
655- dbus_g_type_get_collection ("GSList",
656- dbus_g_type_get_map (
657- "GHashTable",
658- G_TYPE_STRING,
659- G_TYPE_STRING)),
660- &shared_list,
661- G_TYPE_INVALID)) {
662- if (daemon != NULL) {
663- g_signal_emit_by_name (daemon, "error", error->message, NULL);
664- g_error_free (error);
665-
666- return;
667- }
668- }
669-
670- while (shared_list != NULL) {
671- GHashTable *share_info = shared_list->data;
672-
673- share_created_cb (proxy, share_info, interface);
674-
675- shared_list = g_slist_remove (shared_list, share_info);
676- g_hash_table_unref (share_info);
677- }
678-}
679-
680 /**
681 * syncdaemon_shares_interface_get_shared:
682 */
683-void
684+GSList *
685 syncdaemon_shares_interface_get_shared (SyncdaemonSharesInterface *interface)
686 {
687- g_return_if_fail (SYNCDAEMON_IS_SHARES_INTERFACE (interface));
688-
689- dbus_g_proxy_begin_call (DBUS_G_PROXY (interface->priv->proxy), "get_shared",
690- got_shared_cb, interface, NULL,
691- G_TYPE_INVALID);
692+ GHashTableIter iter;
693+ gchar *path;
694+ SyncdaemonShareInfo *share_info;
695+ GSList *shared_list, *returned_list = NULL;;
696+ GError *error = NULL;
697+
698+ g_return_val_if_fail (SYNCDAEMON_IS_SHARES_INTERFACE (interface), NULL);
699+
700+ if (interface->priv->shared == NULL) {
701+ interface->priv->shared = g_hash_table_new_full (g_str_hash, g_str_equal,
702+ g_free, g_object_unref);
703+
704+ if (dbus_g_proxy_call (DBUS_G_PROXY (interface->priv->proxy), "get_shared", &error,
705+ G_TYPE_INVALID,
706+ dbus_g_type_get_collection ("GSList",
707+ dbus_g_type_get_map (
708+ "GHashTable",
709+ G_TYPE_STRING,
710+ G_TYPE_STRING)), &shared_list,
711+ G_TYPE_INVALID)) {
712+ while (shared_list != NULL) {
713+ GHashTable *hash = (GHashTable *) shared_list->data;
714+
715+ share_info = syncdaemon_share_info_new_from_hash_table (hash);
716+
717+ shared_list = g_slist_remove (shared_list, hash);
718+ g_hash_table_unref (hash);
719+
720+ g_hash_table_insert (interface->priv->shared,
721+ g_strdup (syncdaemon_share_info_get_path (share_info)),
722+ share_info);
723+ }
724+ } else {
725+ SyncdaemonDaemon *daemon = NULL;
726+
727+ g_object_get (G_OBJECT (interface), "daemon", &daemon, NULL);
728+ if (daemon != NULL)
729+ g_signal_emit_by_name (daemon, "error", error->message, NULL);
730+
731+ g_error_free (error);
732+
733+ return NULL;
734+ }
735+ }
736+
737+ /* Create the list to be returned */
738+ g_hash_table_iter_init (&iter, interface->priv->shared);
739+ while (g_hash_table_iter_next (&iter, (gpointer *) &path, (gpointer *) &share_info))
740+ returned_list = g_slist_append (returned_list, share_info);
741+
742+ return returned_list;
743+}
744+
745+/**
746+ * syncdaemon_shares_interface_get_shares:
747+ */
748+GSList *
749+syncdaemon_shares_interface_get_shares (SyncdaemonSharesInterface *interface)
750+{
751+ GHashTableIter iter;
752+ gchar *path;
753+ SyncdaemonShareInfo *share_info;
754+ GSList *shares_list, *returned_list = NULL;;
755+ GError *error = NULL;
756+
757+ g_return_val_if_fail (SYNCDAEMON_IS_SHARES_INTERFACE (interface), NULL);
758+
759+ if (interface->priv->shares == NULL) {
760+ interface->priv->shares = g_hash_table_new_full (g_str_hash, g_str_equal,
761+ g_free, g_object_unref);
762+
763+ if (dbus_g_proxy_call (DBUS_G_PROXY (interface->priv->proxy), "get_shares", &error,
764+ G_TYPE_INVALID,
765+ dbus_g_type_get_collection ("GSList",
766+ dbus_g_type_get_map (
767+ "GHashTable",
768+ G_TYPE_STRING,
769+ G_TYPE_STRING)), &shares_list,
770+ G_TYPE_INVALID)) {
771+ while (shares_list != NULL) {
772+ GHashTable *hash = (GHashTable *) shares_list->data;
773+
774+ share_info = syncdaemon_share_info_new_from_hash_table (hash);
775+
776+ shares_list = g_slist_remove (shares_list, hash);
777+ g_hash_table_unref (hash);
778+
779+ g_hash_table_insert (interface->priv->shares,
780+ g_strdup (syncdaemon_share_info_get_path (share_info)),
781+ share_info);
782+ }
783+ } else {
784+ SyncdaemonDaemon *daemon = NULL;
785+
786+ g_object_get (G_OBJECT (interface), "daemon", &daemon, NULL);
787+ if (daemon != NULL)
788+ g_signal_emit_by_name (daemon, "error", error->message, NULL);
789+
790+ g_error_free (error);
791+
792+ return NULL;
793+ }
794+ }
795+
796+ /* Create the list to be returned */
797+ g_hash_table_iter_init (&iter, interface->priv->shares);
798+ while (g_hash_table_iter_next (&iter, (gpointer) &path, (gpointer) &share_info))
799+ returned_list = g_slist_append (returned_list, share_info);
800+
801+ return returned_list;
802 }
803
804 /**
805
806=== modified file 'libsyncdaemon/syncdaemon-shares-interface.h'
807--- libsyncdaemon/syncdaemon-shares-interface.h 2010-07-12 17:06:17 +0000
808+++ libsyncdaemon/syncdaemon-shares-interface.h 2010-07-23 10:31:40 +0000
809@@ -56,8 +56,8 @@
810 const gchar *name,
811 gboolean allow_modifications);
812 void syncdaemon_shares_interface_delete (SyncdaemonSharesInterface *interface, const gchar *share_id);
813-void syncdaemon_shares_interface_get_shared (SyncdaemonSharesInterface *interface);
814-void syncdaemon_shares_interface_get_shares (SyncdaemonSharesInterface *interface);
815+GSList *syncdaemon_shares_interface_get_shared (SyncdaemonSharesInterface *interface);
816+GSList *syncdaemon_shares_interface_get_shares (SyncdaemonSharesInterface *interface);
817 void syncdaemon_shares_interface_refresh (SyncdaemonSharesInterface *interface);
818 void syncdaemon_shares_interface_reject (SyncdaemonSharesInterface *interface, const gchar *share_id);
819
820
821=== modified file 'libsyncdaemon/test-libsyncdaemon.c'
822--- libsyncdaemon/test-libsyncdaemon.c 2010-06-24 11:06:24 +0000
823+++ libsyncdaemon/test-libsyncdaemon.c 2010-07-23 10:31:40 +0000
824@@ -28,6 +28,7 @@
825 #define TEST_ID "abcdefeghijk"
826 #define TEST_HASH "1234567890abcdef"
827
828+static GMainLoop *main_loop = NULL;
829 static SyncdaemonDaemon *the_daemon = NULL;
830
831 static void
832@@ -199,6 +200,103 @@
833 }
834
835 static void
836+test_share_info (void)
837+{
838+ SyncdaemonShareInfo *sinfo;
839+ GHashTable *hash;
840+
841+ /* Test creating an empty SyncdaemonShareInfo */
842+ sinfo = syncdaemon_share_info_new ();
843+ g_assert (SYNCDAEMON_IS_SHARE_INFO (sinfo));
844+
845+ syncdaemon_share_info_set_name (sinfo, TEST_NAME);
846+ g_assert (g_strcmp0 (syncdaemon_share_info_get_name (sinfo), TEST_NAME) == 0);
847+
848+ syncdaemon_share_info_set_share_type (sinfo, SYNCDAEMON_SHARE_INFO_TYPE_SHARED);
849+ g_assert (syncdaemon_share_info_get_share_type (sinfo) == SYNCDAEMON_SHARE_INFO_TYPE_SHARED);
850+
851+ syncdaemon_share_info_set_path (sinfo, TEST_PATH);
852+ g_assert (g_strcmp0 (syncdaemon_share_info_get_path (sinfo), TEST_PATH) == 0);
853+
854+ syncdaemon_share_info_set_username (sinfo, TEST_NAME);
855+ g_assert (g_strcmp0 (syncdaemon_share_info_get_username (sinfo), TEST_NAME) == 0);
856+
857+ syncdaemon_share_info_set_user_visible_name (sinfo, TEST_NAME);
858+ g_assert (g_strcmp0 (syncdaemon_share_info_get_user_visible_name (sinfo), TEST_NAME) == 0);
859+
860+ syncdaemon_share_info_set_node_id (sinfo, TEST_ID);
861+ g_assert (g_strcmp0 (syncdaemon_share_info_get_node_id (sinfo), TEST_ID) == 0);
862+
863+ syncdaemon_share_info_set_volume_id (sinfo, TEST_ID);
864+ g_assert (g_strcmp0 (syncdaemon_share_info_get_volume_id (sinfo), TEST_ID) == 0);
865+
866+ syncdaemon_share_info_set_accepted (sinfo, TRUE);
867+ g_assert (syncdaemon_share_info_get_accepted (sinfo) == TRUE);
868+
869+ syncdaemon_share_info_set_allow_modifications (sinfo, FALSE);
870+ g_assert (syncdaemon_share_info_get_allow_modifications (sinfo) == FALSE);
871+
872+ g_object_unref (G_OBJECT (sinfo));
873+
874+ /* Test creating a SyncdaemonShareInfo from a hash table */
875+ hash = g_hash_table_new (g_str_hash, g_str_equal);
876+ g_hash_table_insert (hash, "name", TEST_NAME);
877+ g_hash_table_insert (hash, "type", "Shared");
878+ g_hash_table_insert (hash, "path", TEST_PATH);
879+ g_hash_table_insert (hash, "other_username", TEST_NAME);
880+ g_hash_table_insert (hash, "other_visible_name", TEST_NAME);
881+ g_hash_table_insert (hash, "node_id", TEST_ID);
882+ g_hash_table_insert (hash, "volume_id", TEST_ID);
883+ g_hash_table_insert (hash, "accepted", "True");
884+ g_hash_table_insert (hash, "access_level", "View");
885+
886+ sinfo = syncdaemon_share_info_new_from_hash_table (hash);
887+ g_assert (g_strcmp0 (syncdaemon_share_info_get_name (sinfo), TEST_NAME) == 0);
888+ g_assert (syncdaemon_share_info_get_share_type (sinfo) == SYNCDAEMON_SHARE_INFO_TYPE_SHARED);
889+ g_assert (g_strcmp0 (syncdaemon_share_info_get_path (sinfo), TEST_PATH) == 0);
890+ g_assert (g_strcmp0 (syncdaemon_share_info_get_username (sinfo), TEST_NAME) == 0);
891+ g_assert (g_strcmp0 (syncdaemon_share_info_get_user_visible_name (sinfo), TEST_NAME) == 0);
892+ g_assert (g_strcmp0 (syncdaemon_share_info_get_node_id (sinfo), TEST_ID) == 0);
893+ g_assert (g_strcmp0 (syncdaemon_share_info_get_volume_id (sinfo), TEST_ID) == 0);
894+ g_assert (syncdaemon_share_info_get_accepted (sinfo) == TRUE);
895+ g_assert (syncdaemon_share_info_get_allow_modifications (sinfo) == FALSE);
896+
897+ g_object_unref (G_OBJECT (sinfo));
898+}
899+
900+static void
901+test_shares (void)
902+{
903+ GSList *list;
904+ SyncdaemonSharesInterface *shares;
905+
906+ shares = (SyncdaemonSharesInterface *) syncdaemon_daemon_get_shares_interface (the_daemon);
907+ g_assert (SYNCDAEMON_IS_SHARES_INTERFACE (shares));
908+
909+ /* Get shared folders */
910+ list = syncdaemon_shares_interface_get_shared (shares);
911+ while (list != NULL) {
912+ SyncdaemonShareInfo *share_info = list->data;
913+
914+ g_assert (SYNCDAEMON_IS_SHARE_INFO (share_info));
915+ g_assert (syncdaemon_share_info_get_share_type (share_info) == SYNCDAEMON_SHARE_INFO_TYPE_SHARED);
916+
917+ list = g_slist_remove (list, share_info);
918+ }
919+
920+ /* Get shares */
921+ list = syncdaemon_shares_interface_get_shares (shares);
922+ while (list != NULL) {
923+ SyncdaemonShareInfo *share_info = list->data;
924+
925+ g_assert (SYNCDAEMON_IS_SHARE_INFO (share_info));
926+ g_assert (syncdaemon_share_info_get_share_type (share_info) == SYNCDAEMON_SHARE_INFO_TYPE_SHARE);
927+
928+ list = g_slist_remove (list, share_info);
929+ }
930+}
931+
932+static void
933 test_status (void)
934 {
935 GSList *list;
936@@ -325,16 +423,23 @@
937 show_hash_table (event_dict);
938 }
939
940+static void
941+daemon_ready_cb (SyncdaemonDaemon daemon, gpointer user_data)
942+{
943+ g_test_run ();
944+
945+ g_main_loop_quit (main_loop);
946+}
947+
948 int
949 main (int argc, gchar *argv[])
950 {
951- GMainLoop *main_loop;
952-
953 g_type_init ();
954 g_test_init (&argc, &argv, NULL);
955
956 /* Initialize main object */
957 the_daemon = syncdaemon_daemon_new ();
958+ g_signal_connect (G_OBJECT (the_daemon), "ready", G_CALLBACK (daemon_ready_cb), NULL);
959 g_signal_connect (G_OBJECT (the_daemon), "connected", G_CALLBACK (daemon_connected_cb), NULL);
960 g_signal_connect (G_OBJECT (the_daemon), "disconnected", G_CALLBACK (daemon_disconnected_cb), NULL);
961 g_signal_connect (G_OBJECT (the_daemon), "event", G_CALLBACK (daemon_event_cb), NULL);
962@@ -347,11 +452,15 @@
963 g_test_add_func ("/testlibsyncdaemon/TestFolders", test_folders);
964 g_test_add_func ("/testlibsyncdaemon/TestMetadata", test_metadata);
965 g_test_add_func ("/testlibsyncdaemon/TestPublicFiles", test_public_files);
966+ g_test_add_func ("/testlibsyncdaemon/TestShareInfo", test_share_info);
967+ g_test_add_func ("/testlibsyncdaemon/TestShares", test_shares);
968 g_test_add_func ("/testlibsyncdaemon/TestStatus", test_status);
969 g_test_add_func ("/testlibsyncdaemon/TestStatusInfo", test_status_info);
970 g_test_add_func ("/testlibsyncdaemon/TestTransferInfo", test_transfer_info);
971
972 /* Run main loop and tests suite */
973- //main_loop = g_main_loop_new (NULL, TRUE);
974- return g_test_run ();
975+ main_loop = g_main_loop_new (NULL, TRUE);
976+ g_main_loop_run (main_loop);
977+
978+ return 0;
979 }
980
981=== modified file 'nautilus/location-widget.c'
982--- nautilus/location-widget.c 2010-07-20 14:52:23 +0000
983+++ nautilus/location-widget.c 2010-07-23 10:31:40 +0000
984@@ -136,6 +136,105 @@
985 object_class->finalize = location_widget_finalize;
986 }
987
988+static gboolean
989+check_shared_for_folder (LocationWidget *location, SyncdaemonFolderInfo *folder_info)
990+{
991+ SyncdaemonInterface *interface;
992+ GHashTable *shares = NULL;
993+ gboolean result = TRUE;
994+
995+ interface = syncdaemon_daemon_get_shares_interface (location->uon->syncdaemon);
996+ if (SYNCDAEMON_IS_SHARES_INTERFACE (interface)) {
997+ GSList *shared_list, *l;
998+
999+ shared_list = syncdaemon_shares_interface_get_shared (SYNCDAEMON_SHARES_INTERFACE (interface));
1000+ for (l = shared_list; l != NULL; l = l->next) {
1001+ SyncdaemonShareInfo *share_info = SYNCDAEMON_SHARE_INFO (shared_list->data);
1002+
1003+ if (g_str_has_prefix (syncdaemon_share_info_get_path (share_info),
1004+ syncdaemon_folder_info_get_path (folder_info))
1005+ && syncdaemon_share_info_get_accepted (share_info)) {
1006+ gchar *path;
1007+ const gchar *username;
1008+ GSList *users = NULL;
1009+
1010+ if (shares == NULL)
1011+ shares = g_hash_table_new (g_str_hash, g_str_equal);
1012+
1013+ g_hash_table_lookup_extended (shares,
1014+ syncdaemon_share_info_get_path (share_info),
1015+ (gpointer *) &path,
1016+ (gpointer *) &users);
1017+
1018+ /* Add the share and the user it's shared with to the hash table */
1019+ if (syncdaemon_share_info_get_user_visible_name (share_info) != NULL)
1020+ username = syncdaemon_share_info_get_user_visible_name (share_info);
1021+ else
1022+ username = syncdaemon_share_info_get_username (share_info);
1023+
1024+ users = g_slist_append (users, (gpointer) username);
1025+ g_hash_table_insert (shares,
1026+ (gpointer) syncdaemon_share_info_get_path (share_info),
1027+ (gpointer) users);
1028+ }
1029+ }
1030+
1031+ g_slist_free (shared_list);
1032+
1033+ /* If there are shares, ask the user what to do */
1034+ if (shares != NULL) {
1035+ GtkWidget *dialog;
1036+ GHashTableIter iter;
1037+ GString *question;
1038+ gchar *path;
1039+ GSList *users;
1040+
1041+ question = g_string_new (_("This folder contains folders that have been shared:\n"));
1042+
1043+ g_hash_table_iter_init (&iter, shares);
1044+ while (g_hash_table_iter_next (&iter, (gpointer) &path, (gpointer) &users)) {
1045+ gint count = 0;
1046+
1047+ question = g_string_append (question, "\t- ");
1048+ question = g_string_append (question, path);
1049+ question = g_string_append (question, " (");
1050+
1051+ while (users != NULL) {
1052+ gchar *username = (gchar *) users->data;
1053+
1054+ if (count > 0)
1055+ question = g_string_append (question, ", ");
1056+ question = g_string_append (question, username);
1057+
1058+ users = g_slist_remove (users, username);
1059+ count += 1;
1060+ }
1061+
1062+ question = g_string_append (question, ")\n");
1063+ }
1064+
1065+ question = g_string_append (question, _("This action will un-share these items. Other users"
1066+ " will no longer be able to access these files."
1067+ " Would you like to proceed?"));
1068+
1069+ dialog = gtk_message_dialog_new (
1070+ GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (location))),
1071+ 0, GTK_MESSAGE_QUESTION,
1072+ GTK_BUTTONS_YES_NO,
1073+ question->str);
1074+ if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_YES)
1075+ result = FALSE;
1076+
1077+ gtk_widget_destroy (dialog);
1078+ g_string_free (question, TRUE);
1079+ g_hash_table_destroy (shares);
1080+ }
1081+
1082+ }
1083+
1084+ return result;
1085+}
1086+
1087 static void
1088 disable_u1_cb (GtkButton *button, gpointer user_data)
1089 {
1090@@ -150,7 +249,7 @@
1091 folder_info = syncdaemon_folders_interface_get_info (
1092 SYNCDAEMON_FOLDERS_INTERFACE (interface),
1093 location->path);
1094- if (folder_info != NULL) {
1095+ if (folder_info != NULL && check_shared_for_folder (location, folder_info)) {
1096 set_label_text (location, FALSE);
1097 gtk_widget_hide (location->disable_button);
1098 gtk_widget_show (location->enable_button);

Subscribers

People subscribed via source and target branches