summaryrefslogtreecommitdiff
path: root/daemon/gvfsbackendnetwork.c
diff options
context:
space:
mode:
authorWilliam Jon McCann <jmccann@redhat.com>2012-08-21 14:44:25 -0400
committerWilliam Jon McCann <jmccann@redhat.com>2012-08-24 07:07:59 -0400
commit30a2eacbfb83c128f1e3628c0346dcfab643f0fa (patch)
treee1fc62b67f11fc7eebd6eb57294c0b26eb3497a9 /daemon/gvfsbackendnetwork.c
parente0aaf394d858ebdca25cb1a28d72fc746c151d6b (diff)
downloadgvfs-30a2eacbfb83c128f1e3628c0346dcfab643f0fa.tar.gz
Append the service name when needed to help differentiate
https://bugzilla.gnome.org/show_bug.cgi?id=592885
Diffstat (limited to 'daemon/gvfsbackendnetwork.c')
-rw-r--r--daemon/gvfsbackendnetwork.c78
1 files changed, 77 insertions, 1 deletions
diff --git a/daemon/gvfsbackendnetwork.c b/daemon/gvfsbackendnetwork.c
index b88d5674..5a52d7a7 100644
--- a/daemon/gvfsbackendnetwork.c
+++ b/daemon/gvfsbackendnetwork.c
@@ -43,10 +43,11 @@
#define NETWORK_FILE_ATTRIBUTES "standard::name,standard::display-name,standard::target-uri"
typedef struct {
- char *file_name;
+ char *file_name;
char *display_name;
char *target_uri;
GIcon *icon;
+ guint num_duplicates;
} NetworkFile;
static NetworkFile root = { "/" };
@@ -140,6 +141,79 @@ sort_file_by_file_name (NetworkFile *a, NetworkFile *b)
return strcmp (a->file_name, b->file_name);
}
+static char *
+get_pretty_scheme_for_uri (const char *uri)
+{
+ GFile *file;
+ char *scheme;
+ char *pretty = NULL;
+
+ file = g_file_new_for_uri (uri);
+ if (file == NULL)
+ return NULL;
+
+ scheme = g_file_get_uri_scheme (file);
+ if (g_strcmp0 (scheme, "afp") == 0
+ || g_strcmp0 (scheme, "smb") == 0)
+ {
+ pretty = g_strdup (_("File Sharing"));
+ }
+ else if (g_strcmp0 (scheme, "sftp") == 0
+ || g_strcmp0 (scheme, "ssh") == 0)
+ {
+ pretty = g_strdup (_("Remote Login"));
+ }
+ else
+ {
+ pretty = g_strdup (scheme);
+ }
+
+ g_free (scheme);
+
+ return pretty;
+}
+
+static void
+network_file_append_service_name (NetworkFile *file)
+{
+ char *name;
+ char *service;
+
+ service = get_pretty_scheme_for_uri (file->target_uri);
+ name = g_strdup_printf ("%s (%s)", file->display_name, service);
+ g_free (service);
+ g_free (file->display_name);
+ file->display_name = name;
+}
+
+static void
+uniquify_display_names (GVfsBackendNetwork *backend)
+{
+ GHashTable *names;
+ GList *l;
+
+ names = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+
+ for (l = backend->files; l != NULL; l = l->next)
+ {
+ NetworkFile *prev_file;
+ NetworkFile *file = l->data;
+
+ prev_file = g_hash_table_lookup (names, file->display_name);
+ if (prev_file != NULL)
+ {
+ prev_file->num_duplicates++;
+ /* only change the first file once */
+ if (prev_file->num_duplicates == 1)
+ network_file_append_service_name (prev_file);
+ network_file_append_service_name (file);
+ }
+ g_hash_table_replace (names, g_strdup (file->display_name), file);
+ }
+
+ g_hash_table_destroy (names);
+}
+
static void
update_from_files (GVfsBackendNetwork *backend,
GList *files)
@@ -153,6 +227,8 @@ update_from_files (GVfsBackendNetwork *backend,
old_files = backend->files;
backend->files = g_list_sort (files, (GCompareFunc)sort_file_by_file_name);
+ uniquify_display_names (backend);
+
/* Generate change events */
oldl = old_files;
newl = backend->files;