From 7d697c78f5d8a1659c367a05ca9fe54da7cd9e8e Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Mon, 23 Apr 2007 17:12:21 +0000 Subject: Use xdg-user-dirs to get a better default Downloads directory (Closes: 2007-04-23 Bastien Nocera * lib/ephy-file-helpers.c: (xdg_user_dir_lookup), (ephy_file_downloads_dir_from_xdg), (ephy_file_downloads_dir): Use xdg-user-dirs to get a better default Downloads directory (Closes: #415342) svn path=/trunk/; revision=7011 --- ChangeLog | 7 +++ lib/ephy-file-helpers.c | 150 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 157 insertions(+) diff --git a/ChangeLog b/ChangeLog index 036ad70a1..82b844709 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2007-04-23 Bastien Nocera + + * lib/ephy-file-helpers.c: (xdg_user_dir_lookup), + (ephy_file_downloads_dir_from_xdg), (ephy_file_downloads_dir): + Use xdg-user-dirs to get a better default Downloads directory + (Closes: #415342) + 2007-04-20 Bastien Nocera * data/mime-types-permissions.xml: Add "application/x-quicktimeplayer" diff --git a/lib/ephy-file-helpers.c b/lib/ephy-file-helpers.c index 131ff4aed..225a1af93 100644 --- a/lib/ephy-file-helpers.c +++ b/lib/ephy-file-helpers.c @@ -98,12 +98,162 @@ ephy_file_tmp_dir (void) return tmp_dir; } +/* Copied from xdg-user-dir-lookup.c */ + +static char * +xdg_user_dir_lookup (const char *type) +{ + FILE *file; + char *home_dir, *config_home, *config_file; + char buffer[512]; + char *user_dir; + char *p, *d; + int len; + int relative; + + home_dir = getenv ("HOME"); + + if (home_dir == NULL) + return strdup ("/tmp"); + + config_home = getenv ("XDG_CONFIG_HOME"); + if (config_home == NULL || config_home[0] == 0) + { + config_file = malloc (strlen (home_dir) + strlen ("/.config/user-dirs.dirs") + 1); + strcpy (config_file, home_dir); + strcat (config_file, "/.config/user-dirs.dirs"); + } + else + { + config_file = malloc (strlen (config_home) + strlen ("/user-dirs.dirs") + 1); + strcpy (config_file, config_home); + strcat (config_file, "/user-dirs.dirs"); + } + + file = fopen (config_file, "r"); + free (config_file); + if (file == NULL) + goto error; + + user_dir = NULL; + while (fgets (buffer, sizeof (buffer), file)) + { + /* Remove newline at end */ + len = strlen (buffer); + if (len > 0 && buffer[len-1] == '\n') + buffer[len-1] = 0; + + p = buffer; + while (*p == ' ' || *p == '\t') + p++; + + if (strncmp (p, "XDG_", 4) != 0) + continue; + p += 4; + if (strncmp (p, type, strlen (type)) != 0) + continue; + p += strlen (type); + if (strncmp (p, "_DIR", 4) != 0) + continue; + p += 4; + + while (*p == ' ' || *p == '\t') + p++; + + if (*p != '=') + continue; + p++; + + while (*p == ' ' || *p == '\t') + p++; + + if (*p != '"') + continue; + p++; + + relative = 0; + if (strncmp (p, "$HOME/", 6) == 0) + { + p += 6; + relative = 1; + } + else if (*p != '/') + continue; + + if (relative) + { + user_dir = malloc (strlen (home_dir) + 1 + strlen (p) + 1); + strcpy (user_dir, home_dir); + strcat (user_dir, "/"); + } + else + { + user_dir = malloc (strlen (p) + 1); + *user_dir = 0; + } + + d = user_dir + strlen (user_dir); + while (*p && *p != '"') + { + if ((*p == '\\') && (*(p+1) != 0)) + p++; + *d++ = *p++; + } + *d = 0; + } + fclose (file); + + if (user_dir) + return user_dir; + + error: + /* Special case desktop for historical compatibility */ + if (strcmp (type, "DESKTOP") == 0) + { + user_dir = malloc (strlen (home_dir) + strlen ("/Desktop") + 1); + strcpy (user_dir, home_dir); + strcat (user_dir, "/Desktop"); + return user_dir; + } + else + return strdup (home_dir); +} + +static char * +ephy_file_downloads_dir_from_xdg (void) +{ + const char *home_dir; + char *downloads_dir; + + /* We use getenv to exactly match the default output + * from xdg_user_dir_lookup, otherwise we might have a + * mismatch in the string comparison below */ + home_dir = getenv ("HOME"); + downloads_dir = xdg_user_dir_lookup ("DOWNLOAD"); + + /* No home directory, it will use /tmp then */ + if (home_dir == NULL) + return downloads_dir; + /* If the dir lookup fellback on the home dir, + * we don't want it, we have our own fall back code */ + if (strcmp (downloads_dir, home_dir) == 0) { + g_free (downloads_dir); + return NULL; + } + + return downloads_dir; +} + char * ephy_file_downloads_dir (void) { const char *translated_folder; char *desktop_dir, *converted, *downloads_dir; + downloads_dir = ephy_file_downloads_dir_from_xdg (); + if (downloads_dir != NULL) + return downloads_dir; + /* The name of the default downloads folder */ translated_folder = _("Downloads"); -- cgit