Skip to content

Commit

Permalink
XDG base directory spec (#1003)
Browse files Browse the repository at this point in the history
* Implemented full XDG base directory spec, also closes #818 #1006 

* Code cleaning
  • Loading branch information
antenore authored Oct 4, 2016
1 parent 059a3cb commit d8a48d3
Show file tree
Hide file tree
Showing 7 changed files with 168 additions and 49 deletions.
4 changes: 2 additions & 2 deletions remmina/src/remmina_applet_menu.c
Original file line number Diff line number Diff line change
Expand Up @@ -273,15 +273,15 @@ void remmina_applet_menu_populate(RemminaAppletMenu *menu)
GDir *dir;
const gchar *name;

dir = g_dir_open(remmina_file_get_user_datadir(), 0, NULL);
dir = g_dir_open(remmina_file_get_datadir(), 0, NULL);
if (dir != NULL)
{
/* Iterate all remote desktop profiles */
while ((name = g_dir_read_name(dir)) != NULL)
{
if (!g_str_has_suffix(name, ".remmina"))
continue;
g_snprintf(filename, sizeof(filename), "%s/%s", remmina_file_get_user_datadir(), name);
g_snprintf(filename, sizeof(filename), "%s/%s", remmina_file_get_datadir(), name);

menuitem = remmina_applet_menu_item_new(REMMINA_APPLET_MENU_ITEM_FILE, filename);
if (menuitem != NULL)
Expand Down
4 changes: 2 additions & 2 deletions remmina/src/remmina_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -157,9 +157,9 @@ void remmina_file_generate_filename(RemminaFile *remminafile)
g_free(remminafile->filename);
g_get_current_time(&gtime);

dir = g_dir_open(remmina_file_get_user_datadir(), 0, NULL);
dir = g_dir_open(remmina_file_get_datadir(), 0, NULL);
if (dir != NULL)
remminafile->filename = g_strdup_printf("%s/%li%03li.remmina", remmina_file_get_user_datadir(), gtime.tv_sec,
remminafile->filename = g_strdup_printf("%s/%li%03li.remmina", remmina_file_get_datadir(), gtime.tv_sec,
gtime.tv_usec / 1000);
else
remminafile->filename = NULL;
Expand Down
114 changes: 92 additions & 22 deletions remmina/src/remmina_file_manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,31 +44,100 @@
#include "remmina_file_manager.h"
#include "remmina/remmina_trace_calls.h"

static gchar remminadir[MAX_PATH_LEN];
static gchar *remminadir;

gchar* remmina_file_get_user_datadir(void)
/* return first found data dir as per XDG specs */
gchar *remmina_file_get_datadir(void)
{

TRACE_CALL("remmina_file_get_user_datadir");
GDir *old;

if (remminadir[0] == '\0') {
/* If the old .remmina exists, use it. */
g_snprintf(remminadir, sizeof(remminadir), "%s/.%s", g_get_home_dir(), remmina);
old = g_dir_open(remminadir, 0, NULL);
if (old == NULL)
/* If the XDG directories exist, use them. */
g_snprintf(remminadir, sizeof(remminadir), "%s/%s", g_get_user_data_dir(), remmina);
else
g_dir_close(old);
TRACE_CALL("remmina_file_get_datadir");
gchar *dir = g_strdup_printf (".%s", g_get_prgname ());
int i;
/* Legacy ~/.remmina */
remminadir = g_build_path ("/", g_get_home_dir(), dir, NULL);
if (g_file_test (remminadir, G_FILE_TEST_IS_DIR))
return remminadir;
g_free (remminadir), remminadir = NULL;
/* ~/.local/share/remmina */
remminadir = g_build_path ( "/", g_get_user_data_dir (), g_get_prgname (), NULL);
if (g_file_test (remminadir, G_FILE_TEST_IS_DIR))
return remminadir;
g_free (remminadir), remminadir = NULL;
/* /usr/local/share/remmina */
const gchar * const *dirs = g_get_system_data_dirs ();
g_free (remminadir), remminadir = NULL;
for (i = 0; dirs[i] != NULL; ++i)
{
remminadir = g_build_path ( "/", dirs[i], g_get_prgname (), NULL);
if (g_file_test (remminadir, G_FILE_TEST_IS_DIR))
return remminadir;
g_free (remminadir), remminadir = NULL;
}
/* The last case we use the home ~/.local/share/remmina */
remminadir = g_build_path ( "/", g_get_user_data_dir (), g_get_prgname (), NULL);
return remminadir;
}

/* TODO: remmina_pref_file_do_copy and remmina_file_manager_do_copy to remmina_files_copy */
static gboolean remmina_file_manager_do_copy(const char *src_path, const char *dst_path)
{
GFile *src = g_file_new_for_path(src_path), *dst = g_file_new_for_path(dst_path);
/* We don't overwrite the target if it exists */
const gboolean ok = g_file_copy(src, dst, G_FILE_COPY_NONE, NULL, NULL, NULL, NULL);
g_object_unref(dst);
g_object_unref(src);

return ok;
}

void remmina_file_manager_init(void)
{
TRACE_CALL("remmina_file_manager_init");
g_mkdir_with_parents(remmina_file_get_user_datadir(), 0700);
GDir *dir;
gchar *legacy = g_strdup_printf (".%s", g_get_prgname ());
const gchar *filename;
int i;

remminadir = g_build_path ( "/", g_get_user_data_dir (), g_get_prgname (), NULL);
/* Create the XDG_USER_DATA directory */
g_mkdir_with_parents (remminadir, 0750);

g_free (remminadir), remminadir = NULL;
/* Empty legacy ~/.remmina */
remminadir = g_build_path ("/", g_get_home_dir(), legacy, NULL);
if (g_file_test (remminadir, G_FILE_TEST_IS_DIR))
{
dir = g_dir_open(remminadir, 0, NULL);
while ((filename = g_dir_read_name (dir)) != NULL) {
remmina_file_manager_do_copy(
g_build_path ( "/", remminadir, filename, NULL),
g_build_path ( "/", g_get_user_data_dir (),
g_get_prgname (), filename, NULL));
}
}

/* XDG_DATA_DIRS, i.e. /usr/local/share/remmina */
const gchar * const *dirs = g_get_system_data_dirs ();
g_free (remminadir), remminadir = NULL;
for (i = 0; dirs[i] != NULL; ++i)
{
remminadir = g_build_path ( "/", dirs[i], g_get_prgname (), NULL);
if (g_file_test (remminadir, G_FILE_TEST_IS_DIR))
{
dir = g_dir_open(remminadir, 0, NULL);
while ((filename = g_dir_read_name (dir)) != NULL) {
remmina_file_manager_do_copy(
g_build_path ( "/", remminadir, filename, NULL),
g_build_path ( "/", g_get_user_data_dir (),
g_get_prgname (), filename, NULL));
}
}
g_free (remminadir), remminadir = NULL;
}
/* At last we make sure we use XDG_USER_DATA */
if (remminadir != NULL)
g_free (remminadir), remminadir = NULL;
remminadir = g_build_path ( "/", g_get_user_data_dir (),
g_get_prgname (), NULL);
}

gint remmina_file_manager_iterate(GFunc func, gpointer user_data)
Expand All @@ -80,7 +149,8 @@ gint remmina_file_manager_iterate(GFunc func, gpointer user_data)
RemminaFile* remminafile;
gint items_count = 0;

dir = g_dir_open(remmina_file_get_user_datadir(), 0, NULL);
/* It should always return XDG_DATA_HOME */
dir = g_dir_open(remmina_file_get_datadir(), 0, NULL);

if (dir)
{
Expand All @@ -89,7 +159,7 @@ gint remmina_file_manager_iterate(GFunc func, gpointer user_data)
if (!g_str_has_suffix(name, ".remmina"))
continue;
g_snprintf(filename, MAX_PATH_LEN, "%s/%s",
remmina_file_get_user_datadir(), name);
remmina_file_get_datadir(), name);
remminafile = remmina_file_load(filename);
if (remminafile)
{
Expand All @@ -116,15 +186,15 @@ gchar* remmina_file_manager_get_groups(void)

array = remmina_string_array_new();

dir = g_dir_open(remmina_file_get_user_datadir(), 0, NULL);
dir = g_dir_open(remmina_file_get_datadir(), 0, NULL);

if (dir == NULL)
return 0;
while ((name = g_dir_read_name(dir)) != NULL)
{
if (!g_str_has_suffix(name, ".remmina"))
continue;
g_snprintf(filename, MAX_PATH_LEN, "%s/%s", remmina_file_get_user_datadir(), name);
g_snprintf(filename, MAX_PATH_LEN, "%s/%s", remmina_file_get_datadir(), name);
remminafile = remmina_file_load(filename);
group = remmina_file_get_string(remminafile, "group");
if (group && remmina_string_array_find(array, group) < 0)
Expand Down Expand Up @@ -219,15 +289,15 @@ GNode* remmina_file_manager_get_group_tree(void)

root = g_node_new(NULL);

dir = g_dir_open(remmina_file_get_user_datadir(), 0, NULL);
dir = g_dir_open(remmina_file_get_datadir(), 0, NULL);

if (dir == NULL)
return root;
while ((name = g_dir_read_name(dir)) != NULL)
{
if (!g_str_has_suffix(name, ".remmina"))
continue;
g_snprintf(filename, MAX_PATH_LEN, "%s/%s", remmina_file_get_user_datadir(), name);
g_snprintf(filename, MAX_PATH_LEN, "%s/%s", remmina_file_get_datadir(), name);
remminafile = remmina_file_load(filename);
group = remmina_file_get_string(remminafile, "group");
remmina_file_manager_add_group(root, group);
Expand Down
2 changes: 1 addition & 1 deletion remmina/src/remmina_file_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ typedef struct _RemminaGroupData
} RemminaGroupData;

/* Initialize */
gchar* remmina_file_get_user_datadir(void);
gchar* remmina_file_get_datadir(void);
void remmina_file_manager_init(void);
/* Iterate all .remmina connections in the home directory */
gint remmina_file_manager_iterate(GFunc func, gpointer user_data);
Expand Down
2 changes: 1 addition & 1 deletion remmina/src/remmina_plugin_manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ RemminaPluginService remmina_plugin_manager_service =
remmina_protocol_widget_chat_receive,
remmina_protocol_widget_send_keys_signals,

remmina_file_get_user_datadir,
remmina_file_get_datadir,

remmina_file_new,
remmina_file_get_filename,
Expand Down
75 changes: 62 additions & 13 deletions remmina/src/remmina_pref.c
Original file line number Diff line number Diff line change
Expand Up @@ -238,23 +238,72 @@ static void remmina_pref_init_keymap(void)
g_key_file_free(gkeyfile);
}

/* TODO: remmina_pref_file_do_copy and remmina_file_manager_do_copy to remmina_files_copy */
static gboolean remmina_pref_file_do_copy(const char *src_path, const char *dst_path)
{
GFile *src = g_file_new_for_path(src_path), *dst = g_file_new_for_path(dst_path);
/* We don't overwrite the target if it exists, because overwrite is not set */
const gboolean ok = g_file_copy(src, dst, G_FILE_COPY_NONE, NULL, NULL, NULL, NULL);
g_object_unref(dst);
g_object_unref(src);

return ok;
}

void remmina_pref_init(void)
{
TRACE_CALL("remmina_pref_init");
GKeyFile *gkeyfile;
gchar dirname[MAX_PATH_LEN];
GDir *old;

g_snprintf(dirname, sizeof(dirname), "%s/.%s", g_get_home_dir(), remmina);
old = g_dir_open(dirname, 0, NULL);
if (old == NULL)
/* If the XDG directories exist, use them. */
g_snprintf(dirname, sizeof(dirname), "%s/%s", g_get_user_config_dir(), remmina);
else
g_dir_close(old);
g_mkdir_with_parents(dirname, 0700);
remmina_pref_file = g_strdup_printf("%s/remmina.pref", dirname);
remmina_keymap_file = g_strdup_printf("%s/remmina.keymap", dirname);
gchar *remmina_dir;
const gchar *filename = g_strdup_printf("%s.pref", g_get_prgname());
GDir *dir;
gchar *legacy = g_strdup_printf (".%s", g_get_prgname ());
int i;

remmina_dir = g_build_path ( "/", g_get_user_config_dir (), g_get_prgname (), NULL);
/* Create the XDG_CONFIG_HOME directory */
g_mkdir_with_parents (remmina_dir, 0750);

g_free (remmina_dir), remmina_dir = NULL;
/* Legacy ~/.remmina we copy the existing remmina.pref file inside
* XDG_CONFIG_HOME */
remmina_dir = g_build_path ("/", g_get_home_dir(), legacy, NULL);
if (g_file_test (remmina_dir, G_FILE_TEST_IS_DIR))
{
dir = g_dir_open(remmina_dir, 0, NULL);
remmina_pref_file_do_copy(
g_build_path ( "/", remmina_dir, filename, NULL),
g_build_path ( "/", g_get_user_config_dir (),
g_get_prgname (), filename, NULL));
}

/* /usr/local/etc/remmina */
const gchar * const *dirs = g_get_system_config_dirs ();
g_free (remmina_dir), remmina_dir = NULL;
for (i = 0; dirs[i] != NULL; ++i)
{
remmina_dir = g_build_path ( "/", dirs[i], g_get_prgname (), NULL);
if (g_file_test (remmina_dir, G_FILE_TEST_IS_DIR))
{
dir = g_dir_open(remmina_dir, 0, NULL);
while ((filename = g_dir_read_name (dir)) != NULL) {
remmina_pref_file_do_copy (
g_build_path ( "/", remmina_dir, filename, NULL),
g_build_path ( "/", g_get_user_config_dir (),
g_get_prgname (), filename, NULL));
}
g_free (remmina_dir), remmina_dir = NULL;
}
}

/* The last case we use the home ~/.config/remmina */
if (remmina_dir != NULL)
g_free (remmina_dir), remmina_dir = NULL;
remmina_dir = g_build_path ( "/", g_get_user_config_dir (),
g_get_prgname (), NULL);

remmina_pref_file = g_strdup_printf("%s/remmina.pref", remmina_dir);
remmina_keymap_file = g_strdup_printf("%s/remmina.keymap", remmina_dir);

gkeyfile = g_key_file_new();
g_key_file_load_from_file(gkeyfile, remmina_pref_file, G_KEY_FILE_NONE, NULL);
Expand Down
16 changes: 8 additions & 8 deletions remmina/src/remmina_survey.c
Original file line number Diff line number Diff line change
Expand Up @@ -174,21 +174,21 @@ gboolean remmina_survey_valid_profile()
gint min_profiles=1; /* TODO: Use a constant */
gint min_days = 30; /* TODO: Use a constant */

dir = g_dir_open(remmina_file_get_user_datadir(), 0, &gerror);
dir = g_dir_open(remmina_file_get_datadir(), 0, &gerror);
if (gerror != NULL)
{
/* This should not happen */
g_message("Cannot open %s, with error: %s", remmina_file_get_user_datadir(), gerror->message);
g_message("Cannot open %s, with error: %s", remmina_file_get_datadir(), gerror->message);
g_error_free(gerror);
g_snprintf(remmina_file_get_user_datadir(), sizeof(remmina_file_get_user_datadir()),
g_snprintf(remmina_file_get_datadir(), sizeof(remmina_file_get_datadir()),
"%s/%s", g_get_user_data_dir(), "remmina");
}else{

while ((dir_entry = g_dir_read_name(dir)) != NULL) {
/* Olny *.remmina files */
if (!g_str_has_suffix(dir_entry, ".remmina\0"))
continue;
g_snprintf(filename, PATH_MAX, "%s/%s", remmina_file_get_user_datadir(), dir_entry);
g_snprintf(filename, PATH_MAX, "%s/%s", remmina_file_get_datadir(), dir_entry);

if (filename != NULL)
count_profile++;
Expand Down Expand Up @@ -255,7 +255,7 @@ static gchar *remmina_survey_files_iter_setting()
GHashTableIter iter;
gpointer key, value;

dir = g_dir_open(remmina_file_get_user_datadir(), 0, NULL);
dir = g_dir_open(remmina_file_get_datadir(), 0, NULL);

if (dir == NULL)
return FALSE;
Expand All @@ -266,7 +266,7 @@ static gchar *remmina_survey_files_iter_setting()
/* Olny *.remmina files */
if (!g_str_has_suffix(dir_entry, ".remmina\0"))
continue;
g_snprintf(filename, PATH_MAX, "%s/%s", remmina_file_get_user_datadir(), dir_entry);
g_snprintf(filename, PATH_MAX, "%s/%s", remmina_file_get_datadir(), dir_entry);

if (!g_key_file_load_from_file(gkeyfile, filename, G_KEY_FILE_NONE, NULL))
g_key_file_free(gkeyfile);
Expand Down Expand Up @@ -333,7 +333,7 @@ static void remmina_survey_stats_create_html_form()
const gchar old[] = "<!-- STATS HOLDER -->";
gchar *new;

output_file_path = g_strdup_printf("%s/%s", remmina_file_get_user_datadir(), output_file_name);
output_file_path = g_strdup_printf("%s/%s", remmina_file_get_datadir(), output_file_name);

template = g_file_new_for_uri(templateuri);
output_file = g_file_new_for_path(output_file_path);
Expand Down Expand Up @@ -433,7 +433,7 @@ void remmina_survey_start(GtkWindow *parent)

gtk_container_add(GTK_CONTAINER(remmina_survey->scrolledwindow), GTK_WIDGET(web_view));
gtk_widget_show(GTK_WIDGET(web_view));
g_snprintf(localurl, PATH_MAX, "%s%s/%s", "file://", remmina_file_get_user_datadir(), "local_remmina_form.html");
g_snprintf(localurl, PATH_MAX, "%s%s/%s", "file://", remmina_file_get_datadir(), "local_remmina_form.html");
webkit_web_view_load_uri(web_view, localurl);
g_object_unref(G_OBJECT(remmina_survey->builder));
}
Expand Down

0 comments on commit d8a48d3

Please sign in to comment.