/** * gedit_utils_location_get_dirname_for_display * @file: the location * * Returns a string suitable to be displayed in the UI indicating * the name of the directory where the file is located. * For remote files it may also contain the hostname etc. * For local files it tries to replace the home dir with ~. * * Returns: a string to display the dirname */ gchar * gedit_utils_location_get_dirname_for_display (GFile *location) { gchar *uri; gchar *res; GMount *mount; g_return_val_if_fail (location != NULL, NULL); /* we use the parse name, that is either the local path * or an uri but which is utf8 safe */ uri = g_file_get_parse_name (location); /* FIXME: this is sync... is it a problem? */ mount = g_file_find_enclosing_mount (location, NULL, NULL); if (mount != NULL) { gchar *mount_name; gchar *path; mount_name = g_mount_get_name (mount); g_object_unref (mount); /* obtain the "path" patrt of the uri */ if (gedit_utils_decode_uri (uri, NULL, NULL, NULL, NULL, &path)) { gchar *dirname; dirname = gedit_utils_uri_get_dirname (path); res = g_strdup_printf ("%s %s", mount_name, dirname); g_free (path); g_free (dirname); g_free (mount_name); } else { res = mount_name; } } else { /* fallback for local files or uris without mounts */ res = gedit_utils_uri_get_dirname (uri); } g_free (uri); return res; }
static gboolean parse_gio_error (gint code, gchar **error_message, gchar **message_details, const gchar *uri, const gchar *uri_for_display) { gboolean ret = TRUE; switch (code) { case G_IO_ERROR_NOT_FOUND: case G_IO_ERROR_NOT_DIRECTORY: *error_message = g_strdup_printf (_("Could not find the file %s."), uri_for_display); *message_details = g_strdup (_("Please check that you typed the " "location correctly and try again.")); break; case G_IO_ERROR_NOT_SUPPORTED: { gchar *scheme_string; gchar *scheme_markup; scheme_string = g_uri_parse_scheme (uri); if ((scheme_string != NULL) && g_utf8_validate (scheme_string, -1, NULL)) { scheme_markup = g_markup_printf_escaped ("<i>%s:</i>", scheme_string); /* Translators: %s is a URI scheme (like for example http:, ftp:, etc.) */ *message_details = g_strdup_printf (_("gedit cannot handle %s locations."), scheme_markup); g_free (scheme_markup); } else { *message_details = g_strdup (_("gedit cannot handle this location.")); } g_free (scheme_string); } break; case G_IO_ERROR_NOT_MOUNTABLE_FILE: *message_details = g_strdup (_("The location of the file cannot be mounted.")); break; case G_IO_ERROR_NOT_MOUNTED: *message_details = g_strdup( _("The location of the file cannot be accessed because it is not mounted.")); break; case G_IO_ERROR_IS_DIRECTORY: *error_message = g_strdup_printf (_("%s is a directory."), uri_for_display); *message_details = g_strdup (_("Please check that you typed the " "location correctly and try again.")); break; case G_IO_ERROR_INVALID_FILENAME: *error_message = g_strdup_printf (_("%s is not a valid location."), uri_for_display); *message_details = g_strdup (_("Please check that you typed the " "location correctly and try again.")); break; case G_IO_ERROR_HOST_NOT_FOUND: /* This case can be hit for user-typed strings like "foo" due to * the code that guesses web addresses when there's no initial "/". * But this case is also hit for legitimate web addresses when * the proxy is set up wrong. */ { gchar *hn = NULL; if (gedit_utils_decode_uri (uri, NULL, NULL, &hn, NULL, NULL)) { if (hn != NULL) { gchar *host_markup; gchar *host_name; host_name = gedit_utils_make_valid_utf8 (hn); g_free (hn); host_markup = g_markup_printf_escaped ("<i>%s</i>", host_name); g_free (host_name); /* Translators: %s is a host name */ *message_details = g_strdup_printf ( _("Host %s could not be found. " "Please check that your proxy settings " "are correct and try again."), host_markup); g_free (host_markup); } } if (!*message_details) { /* use the same string as INVALID_HOST */ *message_details = g_strdup_printf ( _("Hostname was invalid. " "Please check that you typed the location " "correctly and try again.")); } } break; case G_IO_ERROR_NOT_REGULAR_FILE: *message_details = g_strdup_printf (_("%s is not a regular file."), uri_for_display); break; case G_IO_ERROR_TIMED_OUT: *message_details = g_strdup (_("Connection timed out. Please try again.")); break; default: ret = FALSE; break; } return ret; }
/** * gedit_utils_basename_for_display: * @location: location for which the basename should be displayed * * Returns: (transfer full): the basename of a file suitable for display to users. */ gchar * gedit_utils_basename_for_display (GFile *location) { gchar *name; gchar *hn; gchar *uri; g_return_val_if_fail (G_IS_FILE (location), NULL); uri = g_file_get_uri (location); /* First, try to query the display name, but only on local files */ if (g_file_has_uri_scheme (location, "file")) { GFileInfo *info; info = g_file_query_info (location, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME, G_FILE_QUERY_INFO_NONE, NULL, NULL); if (info) { /* Simply get the display name to use as the basename */ name = g_strdup (g_file_info_get_display_name (info)); g_object_unref (info); } else { /* This is a local file, and therefore we will use * g_filename_display_basename on the local path */ gchar *local_path; local_path = g_file_get_path (location); name = g_filename_display_basename (local_path); g_free (local_path); } } else if (g_file_has_parent (location, NULL) || !gedit_utils_decode_uri (uri, NULL, NULL, &hn, NULL, NULL)) { /* For remote files with a parent (so not just http://foo.com) or remote file for which the decoding of the host name fails, use the _parse_name and take basename of that */ gchar *parse_name; gchar *base; parse_name = g_file_get_parse_name (location); base = g_filename_display_basename (parse_name); name = g_uri_unescape_string (base, NULL); g_free (base); g_free (parse_name); } else { /* display '/ on <host>' using the decoded host */ gchar *hn_utf8; if (hn != NULL) { hn_utf8 = gedit_utils_make_valid_utf8 (hn); } else { /* we should never get here */ hn_utf8 = g_strdup ("?"); } /* Translators: '/ on <remote-share>' */ name = g_strdup_printf (_("/ on %s"), hn_utf8); g_free (hn_utf8); g_free (hn); } g_free (uri); return name; }