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