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