xdg-user-dirs-gtk/parse.c

217 lines
4.6 KiB
C

#include "parse.h"
#include <string.h>
static char *
get_gtk_bookmarks_filename (void)
{
char *filename, *legacy_filename;
gboolean exists, legacy_exists;
filename = g_build_filename (g_get_user_config_dir (), "gtk-3.0", "bookmarks", NULL);
exists = g_file_test (filename, G_FILE_TEST_EXISTS);
if (exists)
return filename;
legacy_filename = g_build_filename (g_get_home_dir (), ".gtk-bookmarks", NULL);
legacy_exists = g_file_test (legacy_filename, G_FILE_TEST_EXISTS);
if (legacy_exists)
{
g_free (filename);
return legacy_filename;
}
g_free (legacy_filename);
/* if neither exist, return the new filename */
return filename;
}
char *
parse_xdg_dirs_locale (void)
{
char *file, *content;
char *locale;
locale = NULL;
file = g_build_filename (g_get_user_config_dir (),
"user-dirs.locale", NULL);
if (g_file_get_contents (file, &content, NULL, NULL))
locale = g_strchug (g_strchomp (content));
g_free (file);
return locale;
}
XdgDirEntry *
parse_xdg_dirs (const char *config_file)
{
GArray *array;
char *config_file_free = NULL;
XdgDirEntry dir;
char *data;
char **lines;
char *p, *d;
int i;
char *type_start, *type_end;
char *value, *unescaped;
gboolean relative;
array = g_array_new (TRUE, TRUE, sizeof (XdgDirEntry));
if (config_file == NULL)
{
config_file_free = g_build_filename (g_get_user_config_dir (),
"user-dirs.dirs", NULL);
config_file = (const char *)config_file_free;
}
if (g_file_get_contents (config_file, &data, NULL, NULL))
{
lines = g_strsplit (data, "\n", 0);
g_free (data);
for (i = 0; lines[i] != NULL; i++)
{
p = lines[i];
while (g_ascii_isspace (*p))
p++;
if (*p == '#')
continue;
value = strchr (p, '=');
if (value == NULL)
continue;
*value++ = 0;
g_strchug (g_strchomp (p));
if (!g_str_has_prefix (p, "XDG_"))
continue;
if (!g_str_has_suffix (p, "_DIR"))
continue;
type_start = p + 4;
type_end = p + strlen (p) - 4;
while (g_ascii_isspace (*value))
value++;
if (*value != '"')
continue;
value++;
relative = FALSE;
if (g_str_has_prefix (value, "$HOME/"))
{
relative = TRUE;
value += 6;
}
else if (*value != '/')
continue;
d = unescaped = g_malloc (strlen (value) + 1);
while (*value && *value != '"')
{
if ((*value == '\\') && (*(value + 1) != 0))
value++;
*d++ = *value++;
}
*d = 0;
*type_end = 0;
dir.type = g_strdup (type_start);
if (relative)
{
dir.path = g_build_filename (g_get_home_dir (), unescaped, NULL);
g_free (unescaped);
}
else
dir.path = unescaped;
g_array_append_val (array, dir);
}
g_strfreev (lines);
}
g_free (config_file_free);
return (XdgDirEntry *)g_array_free (array, FALSE);
}
GList *
parse_gtk_bookmarks (void)
{
char *filename, *contents;
GError **error = NULL;
char **lines;
int i;
GtkBookmark *bookmark;
GList *bookmarks;
filename = get_gtk_bookmarks_filename ();
bookmarks = NULL;
/* Read new list from file */
if (g_file_get_contents (filename, &contents, NULL, error))
{
lines = g_strsplit (contents, "\n", -1);
g_free (contents);
for (i = 0; lines[i]; i++)
{
if (lines[i][0])
{
/* gtk 2.7/2.8 might have labels appended to bookmarks which are separated by a space */
/* we must seperate the bookmark uri and the potential label */
char *space;
bookmark = g_new0 (GtkBookmark, 1);
bookmark->label = NULL;
space = strchr (lines[i], ' ');
if (space)
{
*space = '\0';
bookmark->label = g_strdup (space + 1);
}
bookmark->uri = g_strdup (lines[i]);
bookmarks = g_list_append (bookmarks, bookmark);
}
}
g_strfreev (lines);
}
g_free (filename);
return bookmarks;
}
void
save_gtk_bookmarks (GList *bookmarks)
{
char *filename, *dirname;
GString *str;
GList *l;
GtkBookmark *bookmark;
filename = get_gtk_bookmarks_filename ();
str = g_string_new ("");
for (l = bookmarks; l != NULL; l = l->next)
{
bookmark = l->data;
if (bookmark->label)
g_string_append_printf (str, "%s %s\n", bookmark->uri, bookmark->label);
else
g_string_append_printf (str, "%s\n", bookmark->uri);
}
dirname = g_path_get_dirname (filename);
if (g_mkdir_with_parents (dirname, 0700) == 0)
g_file_set_contents (filename, str->str, str->len, NULL);
g_string_free (str, TRUE);
g_free (filename);
g_free (dirname);
}