1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2
3 /*
4 * GThumb
5 *
6 * Copyright (C) 2008 Free Software Foundation, Inc.
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 */
21
22 #include <config.h>
23 #include <glib/gi18n.h>
24 #include <glib.h>
25 #include "gth-user-dir.h"
26
27
28 #define GTH_DIR_CONFIG_MODE 0755
29 #define GTH_DIR_CACHE_MODE 0700
30 #define GTH_DIR_DATA_MODE 0700
31
32
33 static int
_gth_user_dir_mkdir_with_parents(GthDir dir_type,GFile * dir)34 _gth_user_dir_mkdir_with_parents (GthDir dir_type,
35 GFile *dir)
36 {
37 char *pathname;
38 int mode;
39 int result;
40
41 pathname = g_file_get_path (dir);
42
43 switch (dir_type) {
44 case GTH_DIR_CONFIG:
45 mode = GTH_DIR_CONFIG_MODE;
46 break;
47 case GTH_DIR_CACHE:
48 mode = GTH_DIR_CACHE_MODE;
49 break;
50 case GTH_DIR_DATA:
51 mode = GTH_DIR_DATA_MODE;
52 break;
53 default:
54 g_assert_not_reached ();
55 }
56
57 result = g_mkdir_with_parents (pathname, mode);
58
59 g_free (pathname);
60
61 return result;
62 }
63
64
65 static GFile *
_gth_user_dir_get_file_va_list(GthDir dir_type,const char * first_element,va_list var_args)66 _gth_user_dir_get_file_va_list (GthDir dir_type,
67 const char *first_element,
68 va_list var_args)
69 {
70 const char *user_dir;
71 char *config_dir;
72 GString *path;
73 const char *element;
74 GFile *file;
75
76 user_dir = NULL;
77 switch (dir_type) {
78 case GTH_DIR_CONFIG:
79 user_dir = g_get_user_config_dir ();
80 break;
81 case GTH_DIR_CACHE:
82 user_dir = g_get_user_cache_dir ();
83 break;
84 case GTH_DIR_DATA:
85 user_dir = g_get_user_data_dir ();
86 break;
87 }
88
89 config_dir = g_build_path (G_DIR_SEPARATOR_S,
90 user_dir,
91 NULL);
92 path = g_string_new (user_dir);
93
94 element = first_element;
95 while (element != NULL) {
96 if (element[0] != '\0') {
97 g_string_append (path, G_DIR_SEPARATOR_S);
98 g_string_append (path, element);
99 }
100 element = va_arg (var_args, const char *);
101 }
102
103 file = g_file_new_for_path (path->str);
104
105 g_string_free (path, TRUE);
106 g_free (config_dir);
107
108 return file;
109 }
110
111
112 void
gth_user_dir_mkdir_with_parents(GthDir dir_type,const char * first_element,...)113 gth_user_dir_mkdir_with_parents (GthDir dir_type,
114 const char *first_element,
115 ...)
116 {
117 va_list var_args;
118 GFile *file;
119
120 va_start (var_args, first_element);
121 file = _gth_user_dir_get_file_va_list (dir_type, first_element, var_args);
122 va_end (var_args);
123
124 _gth_user_dir_mkdir_with_parents (dir_type, file);
125
126 g_object_unref (file);
127 }
128
129
130 GFile *
gth_user_dir_get_dir_for_write(GthDir dir_type,const char * first_element,...)131 gth_user_dir_get_dir_for_write (GthDir dir_type,
132 const char *first_element,
133 ...)
134 {
135 va_list var_args;
136 GFile *file;
137
138 va_start (var_args, first_element);
139 file = _gth_user_dir_get_file_va_list (dir_type, first_element, var_args);
140 va_end (var_args);
141
142 _gth_user_dir_mkdir_with_parents (dir_type, file);
143
144 return file;
145 }
146
147
148 GFile *
gth_user_dir_get_file_for_read(GthDir dir_type,const char * first_element,...)149 gth_user_dir_get_file_for_read (GthDir dir_type,
150 const char *first_element,
151 ...)
152 {
153 va_list var_args;
154 GFile *file;
155
156 va_start (var_args, first_element);
157 file = _gth_user_dir_get_file_va_list (dir_type, first_element, var_args);
158 va_end (var_args);
159
160 return file;
161 }
162
163
164 GFile *
gth_user_dir_get_file_for_write(GthDir dir_type,const char * first_element,...)165 gth_user_dir_get_file_for_write (GthDir dir_type,
166 const char *first_element,
167 ...)
168 {
169 va_list var_args;
170 GFile *file;
171 GFile *parent;
172
173 va_start (var_args, first_element);
174 file = _gth_user_dir_get_file_va_list (dir_type, first_element, var_args);
175 va_end (var_args);
176
177 parent = g_file_get_parent (file);
178 _gth_user_dir_mkdir_with_parents (dir_type, parent);
179 g_object_unref (parent);
180
181 return file;
182 }
183