[vlc-devel] commit: XDG user dirs support (unused) ( Rémi Denis-Courmont )

git version control git at videolan.org
Tue Aug 25 23:45:06 CEST 2009


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Wed Aug 26 00:44:45 2009 +0300| [d4db83977662ca03949bbfbb799185e960fdd26f] | committer: Rémi Denis-Courmont 

XDG user dirs support (unused)

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d4db83977662ca03949bbfbb799185e960fdd26f
---

 src/config/dirs.c |  121 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 121 insertions(+), 0 deletions(-)

diff --git a/src/config/dirs.c b/src/config/dirs.c
index 2ebd3c7..d61506d 100644
--- a/src/config/dirs.c
+++ b/src/config/dirs.c
@@ -244,6 +244,111 @@ static char *config_GetAppDir (const char *xdg_name, const char *xdg_default)
     return psz_dir;
 }
 
+static char *config_GetTypeDir (const char *xdg_name)
+{
+#if defined(WIN32) || defined(__APPLE__) || defined(SYS_BEOS)
+    (void)xdg_name;
+    return config_GetAppDir (NULL, NULL);
+#else
+    const size_t namelen = strlen (xdg_name);
+    const char *home = getenv ("HOME");
+    const size_t homelen = strlen (home);
+    const char *dir = getenv ("XDG_CONFIG_HOME");
+    const char *file = "user-dirs.dirs";
+
+    if (home == NULL)
+        return NULL;
+    if (dir == NULL)
+    {
+        dir = home;
+        file = ".config/user-dirs.dirs";
+    }
+
+    char *path;
+    if (asprintf (&path, "%s/%s", dir, file) == -1)
+        return NULL;
+
+    FILE *stream = fopen (path, "rt");
+    free (path);
+    if (stream == NULL)
+        return NULL;
+
+    char *linebuf = NULL;
+    size_t linelen = 0;
+
+    while (getline (&linebuf, &linelen, stream) != -1)
+    {
+        char *ptr = linebuf;
+        ptr += strspn (ptr, " \t"); /* Skip whites */
+        if (strncmp (ptr, "XDG_", 4))
+            continue;
+        ptr += 4; /* Skip XDG_ */
+        if (strncmp (ptr, xdg_name, namelen))
+            continue;
+        ptr += namelen; /* Skip XDG type name */
+        if (strncmp (ptr, "_DIR", 4))
+            continue;
+        ptr += 4; /* Skip _DIR */
+        ptr += strspn (ptr, " \t"); /* Skip whites */
+        if (*ptr != '=')
+            continue;
+        ptr++; /* Skip equality sign */
+        ptr += strspn (ptr, " \t"); /* Skip whites */
+        if (*ptr != '"')
+            continue;
+        ptr++; /* Skip quote */
+        linelen -= ptr - linebuf;
+
+        char *out;
+        if (strncmp (ptr, "$HOME", 5))
+        {
+            path = malloc (linelen);
+            if (path == NULL)
+                continue;
+            out = path;
+        }
+        else
+        {   /* Prefix with $HOME */
+            ptr += 5;
+            path = malloc (homelen + linelen - 5);
+            if (path == NULL)
+                continue;
+            memcpy (path, home, homelen);
+            out = path + homelen;
+        }
+
+        while (*ptr != '"')
+        {
+            if (*ptr == '\\')
+                ptr++;
+            if (*ptr == '\0')
+                goto skip;
+            *(out++) = *(ptr++);
+        }
+        *out = '\0';
+        goto done;
+    skip:
+        free (path);
+    }
+
+    /* Default! */
+    if (strcmp (xdg_name, "DESKTOP") == 0)
+    {
+        if (asprintf (&path, "%s/Desktop", home) == -1)
+            path = NULL;
+    }
+    else
+        path = strdup (home);
+
+done:
+    free (linebuf);
+    char *ret = FromLocaleDup (path);
+    free (path);
+    return ret;
+#endif
+}
+
+
 /**
  * Get the user's VLC cache directory
  * (used for stuff like the modules cache, the album art cache, ...)
@@ -273,6 +378,22 @@ char *config_GetUserDir (vlc_userdir_t type)
             return config_GetAppDir ("CONFIG", ".config");
         case VLC_DATA_DIR:
             return config_GetAppDir ("DATA", ".local/share");
+        case VLC_DESKTOP_DIR:
+            return config_GetTypeDir ("DESKTOP");
+        case VLC_DOWNLOAD_DIR:
+            return config_GetTypeDir ("DOWNLOAD");
+        case VLC_TEMPLATES_DIR:
+            return config_GetTypeDir ("TEMPLATES");
+        case VLC_PUBLICSHARE_DIR:
+            return config_GetTypeDir ("PUBLICSHARE");
+        case VLC_DOCUMENTS_DIR:
+            return config_GetTypeDir ("DOCUMENTS");
+        case VLC_MUSIC_DIR:
+            return config_GetTypeDir ("MUSIC");
+        case VLC_PICTURES_DIR:
+            return config_GetTypeDir ("PICTURES");
+        case VLC_VIDEOS_DIR:
+            return config_GetTypeDir ("VIDEOS");
     }
     assert (0);
 }




More information about the vlc-devel mailing list