1 /*
2 * gnc-prefs.c:
3 *
4 * Copyright (C) 2006 Chris Shoemaker <c.shoemaker@cox.net>
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of
9 * the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, contact:
18 *
19 * Free Software Foundation Voice: +1-617-542-5942
20 * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652
21 * Boston, MA 02110-1301, USA gnu@gnu.org
22 */
23
24 #include <stdlib.h>
25 #include <glib.h>
26 #include <config.h>
27 #include "gnc-prefs.h"
28 #include "gnc-prefs-p.h"
29 #include "gnc-version.h"
30
31 static gchar *namespace_regexp = NULL;
32 static gboolean is_debugging = FALSE;
33 static gboolean extras_enabled = FALSE;
34 static gboolean use_compression = TRUE; // This is also the default in the prefs backend
35 static gint file_retention_policy = 1; // 1 = "days", the default in the prefs backend
36 static gint file_retention_days = 30; // This is also the default in the prefs backend
37
38
39 /* Global variables used to remove the preference registered callbacks
40 * that were setup via a g_once. */
41 static gulong reg_auto_raise_lists_id;
42 static gulong reg_negative_color_pref_id;
43
44 PrefsBackend *prefsbackend = NULL;
45
46 const gchar *
gnc_prefs_get_namespace_regexp(void)47 gnc_prefs_get_namespace_regexp(void)
48 {
49 return namespace_regexp;
50 }
51
52 void
gnc_prefs_set_namespace_regexp(const gchar * str)53 gnc_prefs_set_namespace_regexp(const gchar *str)
54 {
55 if (namespace_regexp)
56 g_free(namespace_regexp);
57
58 if (str)
59 namespace_regexp = g_strdup(str);
60 }
61
62 gboolean
gnc_prefs_is_debugging_enabled(void)63 gnc_prefs_is_debugging_enabled(void)
64 {
65 return is_debugging;
66 }
67
68 void
gnc_prefs_set_debugging(gboolean d)69 gnc_prefs_set_debugging(gboolean d)
70 {
71 is_debugging = d;
72 }
73
74 gboolean
gnc_prefs_is_extra_enabled(void)75 gnc_prefs_is_extra_enabled(void)
76 {
77 return extras_enabled;
78 }
79
80 void
gnc_prefs_set_extra(gboolean enabled)81 gnc_prefs_set_extra(gboolean enabled)
82 {
83 extras_enabled = enabled;
84 }
85
86 gboolean
gnc_prefs_get_file_save_compressed(void)87 gnc_prefs_get_file_save_compressed(void)
88 {
89 return use_compression;
90 }
91
92 void
gnc_prefs_set_file_save_compressed(gboolean compressed)93 gnc_prefs_set_file_save_compressed(gboolean compressed)
94 {
95 use_compression = compressed;
96 }
97
98 gint
gnc_prefs_get_file_retention_policy(void)99 gnc_prefs_get_file_retention_policy(void)
100 {
101 return file_retention_policy;
102 }
103
104 void
gnc_prefs_set_file_retention_policy(gint policy)105 gnc_prefs_set_file_retention_policy(gint policy)
106 {
107 file_retention_policy = policy;
108 }
109
110 gint
gnc_prefs_get_file_retention_days(void)111 gnc_prefs_get_file_retention_days(void)
112 {
113 return file_retention_days;
114 }
115
116 void
gnc_prefs_set_file_retention_days(gint days)117 gnc_prefs_set_file_retention_days(gint days)
118 {
119 file_retention_days = days;
120 }
121
122 guint
gnc_prefs_get_long_version()123 gnc_prefs_get_long_version()
124 {
125 return PROJECT_VERSION_MAJOR * 1000000 + PROJECT_VERSION_MINOR;
126 }
127
gnc_prefs_register_cb(const char * group,const gchar * pref_name,gpointer func,gpointer user_data)128 gulong gnc_prefs_register_cb (const char *group,
129 const gchar *pref_name,
130 gpointer func,
131 gpointer user_data)
132 {
133 if (prefsbackend && prefsbackend->register_cb)
134 return (prefsbackend->register_cb) (group, pref_name, func, user_data);
135 else
136 {
137 g_warning ("no preferences backend loaded, or the backend doesn't define register_cb, returning 0");
138 return 0;
139 }
140 }
141
142
gnc_prefs_remove_cb_by_func(const gchar * group,const gchar * pref_name,gpointer func,gpointer user_data)143 void gnc_prefs_remove_cb_by_func (const gchar *group,
144 const gchar *pref_name,
145 gpointer func,
146 gpointer user_data)
147 {
148 if (prefsbackend && prefsbackend->remove_cb_by_func)
149 (prefsbackend->remove_cb_by_func) (group, pref_name, func, user_data);
150 }
151
152
gnc_prefs_remove_cb_by_id(const gchar * group,guint id)153 void gnc_prefs_remove_cb_by_id (const gchar *group,
154 guint id)
155 {
156 if (prefsbackend && prefsbackend->remove_cb_by_id)
157 (prefsbackend->remove_cb_by_id) (group, id);
158 }
159
160
gnc_prefs_register_group_cb(const gchar * group,gpointer func,gpointer user_data)161 guint gnc_prefs_register_group_cb (const gchar *group,
162 gpointer func,
163 gpointer user_data)
164 {
165 if (prefsbackend && prefsbackend->register_group_cb)
166 return (prefsbackend->register_group_cb) (group, func, user_data);
167 else
168 return 0;
169 }
170
171
gnc_prefs_remove_group_cb_by_func(const gchar * group,gpointer func,gpointer user_data)172 void gnc_prefs_remove_group_cb_by_func (const gchar *group,
173 gpointer func,
174 gpointer user_data)
175 {
176 if (prefsbackend && prefsbackend->remove_group_cb_by_func)
177 (prefsbackend->remove_group_cb_by_func) (group, func, user_data);
178 }
179
180
gnc_prefs_bind(const gchar * group,const gchar * pref_name,gpointer object,const gchar * property)181 void gnc_prefs_bind (const gchar *group,
182 /*@ null @*/ const gchar *pref_name,
183 gpointer object,
184 const gchar *property)
185 {
186 if (prefsbackend && prefsbackend->bind)
187 (prefsbackend->bind) (group, pref_name, object, property);
188 }
189
190
gnc_prefs_get_bool(const gchar * group,const gchar * pref_name)191 gboolean gnc_prefs_get_bool (const gchar *group,
192 /*@ null @*/ const gchar *pref_name)
193 {
194 if (prefsbackend && prefsbackend->get_bool)
195 return (prefsbackend->get_bool) (group, pref_name);
196 else
197 return FALSE;
198 }
199
200
gnc_prefs_get_int(const gchar * group,const gchar * pref_name)201 gint gnc_prefs_get_int (const gchar *group,
202 const gchar *pref_name)
203 {
204 if (prefsbackend && prefsbackend->get_int)
205 return (prefsbackend->get_int) (group, pref_name);
206 else
207 return 0;
208 }
209
210
gnc_prefs_get_int64(const gchar * group,const gchar * pref_name)211 gint64 gnc_prefs_get_int64 (const gchar *group,
212 const gchar *pref_name)
213 {
214 gint64 result = 0;
215 GVariant *var = gnc_prefs_get_value(group, pref_name);
216 result = g_variant_get_int64 (var);
217 g_variant_unref (var);
218 return result;
219 }
220
221
gnc_prefs_get_float(const gchar * group,const gchar * pref_name)222 gdouble gnc_prefs_get_float (const gchar *group,
223 const gchar *pref_name)
224 {
225 if (prefsbackend && prefsbackend->get_float)
226 return (prefsbackend->get_float) (group, pref_name);
227 else
228 return 0.0;
229 }
230
231
gnc_prefs_get_string(const gchar * group,const gchar * pref_name)232 gchar *gnc_prefs_get_string (const gchar *group,
233 const gchar *pref_name)
234 {
235 if (prefsbackend && prefsbackend->get_string)
236 return (prefsbackend->get_string) (group, pref_name);
237 else
238 return NULL;
239 }
240
241
gnc_prefs_get_enum(const gchar * group,const gchar * pref_name)242 gint gnc_prefs_get_enum (const gchar *group,
243 const gchar *pref_name)
244 {
245 if (prefsbackend && prefsbackend->get_enum)
246 return (prefsbackend->get_enum) (group, pref_name);
247 else
248 return 0;
249 }
250
251 void
gnc_prefs_get_coords(const gchar * group,const gchar * pref_name,gdouble * x,gdouble * y)252 gnc_prefs_get_coords (const gchar *group,
253 const gchar *pref_name,
254 gdouble *x, gdouble *y)
255 {
256 GVariant *coords = gnc_prefs_get_value (group, pref_name);
257
258 *x = 0;
259 *y = 0;
260
261 if (g_variant_is_of_type (coords, (const GVariantType *) "(dd)") )
262 g_variant_get (coords, "(dd)", x, y);
263 g_variant_unref (coords);
264 }
265
266
gnc_prefs_get_value(const gchar * group,const gchar * pref_name)267 GVariant *gnc_prefs_get_value (const gchar *group,
268 const gchar *pref_name)
269 {
270 if (prefsbackend && prefsbackend->get_value)
271 return (prefsbackend->get_value) (group,pref_name);
272 else
273 return NULL;
274 }
275
276
gnc_prefs_set_bool(const gchar * group,const gchar * pref_name,gboolean value)277 gboolean gnc_prefs_set_bool (const gchar *group,
278 const gchar *pref_name,
279 gboolean value)
280 {
281 if (prefsbackend && prefsbackend->set_bool)
282 return (prefsbackend->set_bool) (group, pref_name, value);
283 else
284 return FALSE;
285 }
286
287
gnc_prefs_set_int(const gchar * group,const gchar * pref_name,gint value)288 gboolean gnc_prefs_set_int (const gchar *group,
289 const gchar *pref_name,
290 gint value)
291 {
292 if (prefsbackend && prefsbackend->set_int)
293 return (prefsbackend->set_int) (group, pref_name, value);
294 else
295 return FALSE;
296 }
297
298
gnc_prefs_set_int64(const gchar * group,const gchar * pref_name,gint64 value)299 gboolean gnc_prefs_set_int64 (const gchar *group,
300 const gchar *pref_name,
301 gint64 value)
302 {
303 GVariant *var = g_variant_new ("x",value);
304 return gnc_prefs_set_value (group, pref_name, var);
305 }
306
307
gnc_prefs_set_float(const gchar * group,const gchar * pref_name,gdouble value)308 gboolean gnc_prefs_set_float (const gchar *group,
309 const gchar *pref_name,
310 gdouble value)
311 {
312 if (prefsbackend && prefsbackend->set_float)
313 return (prefsbackend->set_float) (group, pref_name, value);
314 else
315 return FALSE;
316 }
317
318
gnc_prefs_set_string(const gchar * group,const gchar * pref_name,const gchar * value)319 gboolean gnc_prefs_set_string (const gchar *group,
320 const gchar *pref_name,
321 const gchar *value)
322 {
323 if (prefsbackend && prefsbackend->set_string)
324 return (prefsbackend->set_string) (group, pref_name, value);
325 else
326 return FALSE;
327 }
328
329
gnc_prefs_set_enum(const gchar * group,const gchar * pref_name,gint value)330 gboolean gnc_prefs_set_enum (const gchar *group,
331 const gchar *pref_name,
332 gint value)
333 {
334 if (prefsbackend && prefsbackend->set_enum)
335 return (prefsbackend->set_enum) (group, pref_name, value);
336 else
337 return FALSE;
338 }
339
340
gnc_prefs_set_coords(const gchar * group,const gchar * pref_name,gdouble x,gdouble y)341 gboolean gnc_prefs_set_coords (const gchar *group,
342 const gchar *pref_name,
343 gdouble x, gdouble y)
344 {
345 GVariant *var = g_variant_new ("(dd)",x, y);
346 return gnc_prefs_set_value (group, pref_name, var);
347 }
348
349
gnc_prefs_set_value(const gchar * group,const gchar * pref_name,GVariant * value)350 gboolean gnc_prefs_set_value (const gchar *group,
351 const gchar *pref_name,
352 GVariant *value)
353 {
354 if (prefsbackend && prefsbackend->set_value)
355 return (prefsbackend->set_value) (group, pref_name, value);
356 else
357 return FALSE;
358 }
359
360
gnc_prefs_reset(const gchar * group,const gchar * pref_name)361 void gnc_prefs_reset (const gchar *group,
362 const gchar *pref_name)
363 {
364 if (prefsbackend && prefsbackend->reset)
365 (prefsbackend->reset) (group, pref_name);
366 }
367
gnc_prefs_reset_group(const gchar * group)368 void gnc_prefs_reset_group (const gchar *group)
369 {
370 if (prefsbackend && prefsbackend->reset_group)
371 (prefsbackend->reset_group) (group);
372 }
373
gnc_prefs_is_set_up(void)374 gboolean gnc_prefs_is_set_up (void)
375 {
376 return (prefsbackend !=NULL);
377 }
378
gnc_prefs_block_all(void)379 void gnc_prefs_block_all (void)
380 {
381 if (prefsbackend && prefsbackend->block_all)
382 (prefsbackend->block_all) ();
383 }
384
gnc_prefs_unblock_all(void)385 void gnc_prefs_unblock_all (void)
386 {
387 if (prefsbackend && prefsbackend->unblock_all)
388 (prefsbackend->unblock_all) ();
389 }
390
gnc_prefs_get_reg_auto_raise_lists_id(void)391 gulong gnc_prefs_get_reg_auto_raise_lists_id (void)
392 {
393 return reg_auto_raise_lists_id;
394 }
395
gnc_prefs_set_reg_auto_raise_lists_id(gulong id)396 void gnc_prefs_set_reg_auto_raise_lists_id (gulong id)
397 {
398 reg_auto_raise_lists_id = id;
399 }
400
gnc_prefs_get_reg_negative_color_pref_id(void)401 gulong gnc_prefs_get_reg_negative_color_pref_id (void)
402 {
403 return reg_negative_color_pref_id;
404 }
405
gnc_prefs_set_reg_negative_color_pref_id(gulong id)406 void gnc_prefs_set_reg_negative_color_pref_id (gulong id)
407 {
408 reg_negative_color_pref_id = id;
409 }
410
411