diff options
author | William Jon McCann <jmccann@redhat.com> | 2012-08-21 14:44:25 -0400 |
---|---|---|
committer | William Jon McCann <jmccann@redhat.com> | 2012-08-24 07:07:59 -0400 |
commit | 30a2eacbfb83c128f1e3628c0346dcfab643f0fa (patch) | |
tree | e1fc62b67f11fc7eebd6eb57294c0b26eb3497a9 /daemon/gvfsbackendnetwork.c | |
parent | e0aaf394d858ebdca25cb1a28d72fc746c151d6b (diff) | |
download | gvfs-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.c | 78 |
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; |