62 const gchar *dir =
".remmina";
68 if (g_file_test(
remminadir, G_FILE_TEST_IS_DIR))
72 remminadir = g_build_path(
"/", g_get_home_dir(), dir, NULL);
73 if (g_file_test(
remminadir, G_FILE_TEST_IS_DIR))
77 remminadir = g_build_path(
"/", g_get_user_data_dir(),
"remmina", NULL);
78 if (g_file_test(
remminadir, G_FILE_TEST_IS_DIR))
82 const gchar *
const *dirs = g_get_system_data_dirs();
85 for (i = 0; dirs[i] != NULL; ++i) {
86 remminadir = g_build_path(
"/", dirs[i],
"remmina", NULL);
87 if (g_file_test(
remminadir, G_FILE_TEST_IS_DIR))
92 remminadir = g_build_path(
"/", g_get_user_data_dir(),
"remmina", NULL);
99 GFile *src = g_file_new_for_path(src_path), *dst = g_file_new_for_path(dst_path);
101 const gboolean ok = g_file_copy(src, dst, G_FILE_COPY_NONE, NULL, NULL, NULL, NULL);
118 TRACE_CALL(__func__);
120 const gchar *legacy =
".remmina";
121 const gchar *filename;
126 if (g_mkdir_with_parents(
remminadir, 0750) == 0) {
127 REMMINA_DEBUG(
"Initialized the \"%s\" data folder",
remminadir);
132 remminadir = g_build_path(
"/", g_get_user_data_dir(),
"remmina", NULL);
133 if (g_mkdir_with_parents(
remminadir, 0750) == 0)
134 REMMINA_DEBUG(
"Initialized the \"%s\" data folder",
remminadir);
136 REMMINA_CRITICAL(
"Cannot create the \"%s\" data folder",
remminadir);
140 cachedir = g_build_path(
"/", g_get_user_cache_dir(),
"remmina", NULL);
141 g_mkdir_with_parents(
cachedir, 0750);
144 remminadir = g_build_path(
"/", g_get_home_dir(), legacy, NULL);
145 if (g_file_test(
remminadir, G_FILE_TEST_IS_DIR)) {
147 while ((filename = g_dir_read_name(dir)) != NULL) {
149 g_build_path(
"/",
remminadir, filename, NULL),
150 g_build_path(
"/", g_get_user_data_dir(),
151 "remmina", filename, NULL));
157 const gchar *
const *dirs = g_get_system_data_dirs();
160 for (i = 0; dirs[i] != NULL; ++i) {
161 remminadir = g_build_path(
"/", dirs[i],
"remmina", NULL);
162 if (g_file_test(
remminadir, G_FILE_TEST_IS_DIR)) {
164 while ((filename = g_dir_read_name(dir)) != NULL) {
166 g_build_path(
"/",
remminadir, filename, NULL),
167 g_build_path(
"/", g_get_user_data_dir(),
168 "remmina", filename, NULL));
180 TRACE_CALL(__func__);
181 gchar filename[MAX_PATH_LEN];
185 gint items_count = 0;
186 gchar *remmina_data_dir;
189 dir = g_dir_open(remmina_data_dir, 0, NULL);
192 while ((name = g_dir_read_name(dir)) != NULL) {
193 if (!g_str_has_suffix(name,
".remmina"))
195 g_snprintf(filename, MAX_PATH_LEN,
"%s/%s",
196 remmina_data_dir, name);
199 (*func)(remminafile, user_data);
206 g_free(remmina_data_dir);
212 TRACE_CALL(__func__);
213 gchar filename[MAX_PATH_LEN];
220 gchar *remmina_data_dir;
225 dir = g_dir_open(remmina_data_dir, 0, NULL);
229 while ((name = g_dir_read_name(dir)) != NULL) {
230 if (!g_str_has_suffix(name,
".remmina"))
232 g_snprintf(filename, MAX_PATH_LEN,
"%s/%s", remmina_data_dir, name);
245 g_free(remmina_data_dir);
251 TRACE_CALL(__func__);
262 if (group == NULL || group[0] ==
'\0')
265 p1 = g_strdup(group);
266 p2 = strchr(p1,
'/');
273 for (child = g_node_first_child(node); child; child = g_node_next_sibling(child)) {
289 data->group = g_strdup_printf(
"%s/%s", ((
RemminaGroupData *)node->data)->group, p1);
291 data->group = g_strdup(p1);
293 child = g_node_insert_data_before(node, child, data);
295 child = g_node_append_data(node, data);
305 TRACE_CALL(__func__);
306 gchar filename[MAX_PATH_LEN];
308 g_autofree gchar *datadir = NULL;
314 root = g_node_new(NULL);
317 dir = g_dir_open(datadir, 0, NULL);
321 while ((name = g_dir_read_name(dir)) != NULL) {
322 if (!g_str_has_suffix(name,
".remmina"))
324 g_snprintf(filename, MAX_PATH_LEN,
"%s/%s", datadir, name);
338 TRACE_CALL(__func__);
351 for (child = g_node_first_child(node); child; child = g_node_next_sibling(child))
358 TRACE_CALL(__func__);
363 if ((p = strrchr(filename,
'.')) != NULL && g_strcmp0(p + 1,
"remmina") == 0) {
368 remminafile = plugin->
import_func(plugin, filename);
G_BEGIN_DECLS struct _RemminaGroupData RemminaGroupData
RemminaFile * remmina_file_load(const gchar *filename)
void remmina_file_free(RemminaFile *remminafile)
const gchar * remmina_file_get_string(RemminaFile *remminafile, const gchar *setting)
G_BEGIN_DECLS typedef GPtrArray RemminaStringArray
static gchar * remminadir
typedefG_BEGIN_DECLS struct _RemminaFile RemminaFile
RemminaFile *(* import_func)(struct _RemminaFilePlugin *instance, const gchar *from_file)
void remmina_file_manager_free_group_tree(GNode *node)
RemminaFilePlugin * remmina_plugin_manager_get_import_file_handler(const gchar *file)
gint remmina_string_array_find(RemminaStringArray *array, const gchar *str)
gchar * remmina_string_array_to_string(RemminaStringArray *array)
static gboolean remmina_file_manager_do_copy(const char *src_path, const char *dst_path)
gchar * remmina_pref_get_value(const gchar *key)
void remmina_file_manager_init(void)
It creates the Remmina data and cache folders.
void remmina_string_array_sort(RemminaStringArray *array)
static void remmina_file_manager_add_group(GNode *node, const gchar *group)
void remmina_string_array_free(RemminaStringArray *array)
gchar * remmina_file_get_datadir(void)
Return datadir_path from pref or first found data dir as per XDG specs.
RemminaStringArray * remmina_string_array_new(void)
gchar * remmina_file_manager_get_groups(void)
RemminaFile * remmina_file_manager_load_file(const gchar *filename)
void remmina_string_array_add(RemminaStringArray *array, const gchar *str)
GNode * remmina_file_manager_get_group_tree(void)
gint remmina_file_manager_iterate(GFunc func, gpointer user_data)