Mercurial > pidgin
annotate src/prefs.c @ 10429:e41f0668a648
[gaim-migrate @ 11681]
blist.xml is now written using the util function and xmlnodes.
Let no one ever ever complain about losing their blist because their
hard drive was full.
prefs and pounces are the only two xml files not use the util functions
and xmlnodes.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Mon, 27 Dec 2004 06:24:22 +0000 |
parents | 3232e1a33899 |
children | b6ca0e1b19d0 |
rev | line source |
---|---|
1 | 1 /* |
2 * gaim | |
3 * | |
8046 | 4 * Gaim is the legal property of its developers, whose names are too numerous |
5 * to list here. Please refer to the COPYRIGHT file distributed with this | |
6 * source distribution. | |
1 | 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, write to the Free Software | |
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
21 * | |
22 */ | |
23 | |
349
b402a23f35df
[gaim-migrate @ 359]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
340
diff
changeset
|
24 #ifdef HAVE_CONFIG_H |
2090
b66aca8e8dce
[gaim-migrate @ 2100]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2074
diff
changeset
|
25 #include <config.h> |
349
b402a23f35df
[gaim-migrate @ 359]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
340
diff
changeset
|
26 #endif |
5440 | 27 |
1 | 28 #include <string.h> |
29 #include <stdio.h> | |
30 #include <stdlib.h> | |
5440 | 31 #include <sys/stat.h> |
32 #include <sys/types.h> | |
33 #include <glib.h> | |
6216 | 34 #include "internal.h" |
5440 | 35 #include "prefs.h" |
36 #include "debug.h" | |
37 #include "util.h" | |
3366 | 38 |
4026
a997156437b6
[gaim-migrate @ 4230]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4010
diff
changeset
|
39 #ifdef _WIN32 |
a997156437b6
[gaim-migrate @ 4230]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4010
diff
changeset
|
40 #include "win32dep.h" |
a997156437b6
[gaim-migrate @ 4230]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4010
diff
changeset
|
41 #endif |
a997156437b6
[gaim-migrate @ 4230]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4010
diff
changeset
|
42 |
5440 | 43 struct pref_cb { |
44 GaimPrefCallback func; | |
45 gpointer data; | |
46 guint id; | |
10087 | 47 void *handle; |
5440 | 48 }; |
49 | |
50 struct gaim_pref { | |
51 GaimPrefType type; | |
52 char *name; | |
53 union { | |
54 gpointer generic; | |
55 gboolean boolean; | |
56 int integer; | |
57 char *string; | |
5561 | 58 GList *stringlist; |
5440 | 59 } value; |
60 GSList *callbacks; | |
61 struct gaim_pref *parent; | |
62 struct gaim_pref *sibling; | |
63 struct gaim_pref *first_child; | |
64 }; | |
3366 | 65 |
5440 | 66 static GHashTable *prefs_hash = NULL; |
67 | |
68 static struct gaim_pref prefs = { GAIM_PREF_NONE, NULL, {NULL}, NULL, | |
69 NULL, NULL, NULL }; | |
70 | |
5534 | 71 static guint prefs_save_timer = 0; |
72 static gboolean prefs_is_loaded = FALSE; | |
73 | |
74 | |
75 static gboolean prefs_save_callback(gpointer who_cares) { | |
76 gaim_prefs_sync(); | |
77 prefs_save_timer = 0; | |
78 return FALSE; | |
79 } | |
80 | |
81 static void schedule_prefs_save() { | |
82 if(!prefs_save_timer) | |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8235
diff
changeset
|
83 prefs_save_timer = gaim_timeout_add(5000, prefs_save_callback, NULL); |
5534 | 84 } |
85 | |
86 static void prefs_save_cb(const char *name, GaimPrefType type, gpointer val, | |
87 gpointer user_data) { | |
88 | |
89 if(!prefs_is_loaded) | |
90 return; | |
91 | |
92 gaim_debug(GAIM_DEBUG_MISC, "prefs", "%s changed, scheduling save.\n", name); | |
93 | |
94 schedule_prefs_save(); | |
95 } | |
96 | |
5440 | 97 void gaim_prefs_init() { |
98 prefs_hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); | |
99 | |
10087 | 100 gaim_prefs_connect_callback(NULL, "/", prefs_save_cb, NULL); |
5534 | 101 |
5529
e7747cae9710
[gaim-migrate @ 5929]
Christian Hammond <chipx86@chipx86.com>
parents:
5458
diff
changeset
|
102 gaim_prefs_add_none("/core"); |
5550
b18c2a37cc96
[gaim-migrate @ 5951]
Christian Hammond <chipx86@chipx86.com>
parents:
5547
diff
changeset
|
103 gaim_prefs_add_none("/plugins"); |
b18c2a37cc96
[gaim-migrate @ 5951]
Christian Hammond <chipx86@chipx86.com>
parents:
5547
diff
changeset
|
104 gaim_prefs_add_none("/plugins/core"); |
b18c2a37cc96
[gaim-migrate @ 5951]
Christian Hammond <chipx86@chipx86.com>
parents:
5547
diff
changeset
|
105 gaim_prefs_add_none("/plugins/lopl"); |
b18c2a37cc96
[gaim-migrate @ 5951]
Christian Hammond <chipx86@chipx86.com>
parents:
5547
diff
changeset
|
106 gaim_prefs_add_none("/plugins/prpl"); |
5529
e7747cae9710
[gaim-migrate @ 5929]
Christian Hammond <chipx86@chipx86.com>
parents:
5458
diff
changeset
|
107 |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5539
diff
changeset
|
108 /* Away */ |
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5539
diff
changeset
|
109 gaim_prefs_add_none("/core/away"); |
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5539
diff
changeset
|
110 gaim_prefs_add_bool("/core/away/away_when_idle", TRUE); |
7689 | 111 gaim_prefs_add_int("/core/away/mins_before_away", 5); |
6216 | 112 /* XXX: internationalized string in prefs...evil */ |
113 gaim_prefs_add_string("/core/away/default_message", | |
114 _("Slightly less boring default")); | |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5539
diff
changeset
|
115 |
9594 | 116 /* Away -> Auto-Reply */ |
117 if (!gaim_prefs_exists("/core/away/auto_response/enabled") || | |
118 !gaim_prefs_exists("/core/away/auto_response/idle_only")) { | |
119 gaim_prefs_add_string("/core/away/auto_reply", "awayidle"); | |
120 } else { | |
121 if (!gaim_prefs_get_bool("/core/away/auto_response/enabled")) { | |
122 gaim_prefs_add_string("/core/away/auto_reply", "never"); | |
123 } else { | |
124 if (gaim_prefs_get_bool("/core/away/auto_response/idle_only")) { | |
125 gaim_prefs_add_string("/core/away/auto_reply", "awayidle"); | |
126 } else { | |
127 gaim_prefs_add_string("/core/away/auto_reply", "away"); | |
128 } | |
129 } | |
130 } | |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5539
diff
changeset
|
131 |
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5539
diff
changeset
|
132 /* Buddies */ |
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5539
diff
changeset
|
133 gaim_prefs_add_none("/core/buddies"); |
7420 | 134 |
135 /* Contact Priority Settings */ | |
136 gaim_prefs_add_none("/core/contact"); | |
137 gaim_prefs_add_bool("/core/contact/last_match", FALSE); | |
138 gaim_prefs_add_int("/core/contact/offline_score", 4); | |
139 gaim_prefs_add_int("/core/contact/away_score", 2); | |
140 gaim_prefs_add_int("/core/contact/idle_score", 1); | |
5440 | 141 } |
3366 | 142 |
8235 | 143 void |
144 gaim_prefs_uninit() | |
145 { | |
146 if (prefs_save_timer != 0) { | |
8287
ef881489396e
[gaim-migrate @ 9011]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
147 gaim_timeout_remove(prefs_save_timer); |
8235 | 148 prefs_save_timer = 0; |
149 gaim_prefs_sync(); | |
150 } | |
151 } | |
152 | |
5787
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
153 static char * |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
154 get_path_dirname(const char *name) |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
155 { |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
156 char *c, *str; |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
157 |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
158 str = g_strdup(name); |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
159 |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
160 if ((c = strrchr(str, '/')) != NULL) { |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
161 *c = '\0'; |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
162 |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
163 if (*str == '\0') { |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
164 g_free(str); |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
165 |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
166 str = g_strdup("/"); |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
167 } |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
168 } |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
169 else { |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
170 g_free(str); |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
171 |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
172 str = g_strdup("."); |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
173 } |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
174 |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
175 return str; |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
176 } |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
177 |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
178 static char * |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
179 get_path_basename(const char *name) |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
180 { |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
181 const char *c; |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
182 |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
183 if ((c = strrchr(name, '/')) != NULL) |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
184 return g_strdup(c + 1); |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
185 |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
186 return g_strdup(name); |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
187 } |
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
188 |
5440 | 189 static char *pref_full_name(struct gaim_pref *pref) { |
190 GString *name; | |
191 struct gaim_pref *parent; | |
6693 | 192 char *ret; |
193 | |
5440 | 194 if(!pref) |
195 return NULL; | |
196 | |
197 if(pref == &prefs) | |
198 return g_strdup("/"); | |
199 | |
200 name = g_string_new(pref->name); | |
201 parent = pref->parent; | |
3366 | 202 |
5440 | 203 for(parent = pref->parent; parent && parent->name; parent = parent->parent) { |
204 name = g_string_prepend_c(name, '/'); | |
205 name = g_string_prepend(name, parent->name); | |
206 } | |
6693 | 207 ret = name->str; |
5440 | 208 g_string_free(name, FALSE); |
6693 | 209 return ret; |
5440 | 210 } |
211 | |
212 static struct gaim_pref *find_pref(const char *name) | |
213 { | |
214 if(!name || name[0] != '/') { | |
215 return NULL; | |
216 } else if(name[1] == '\0') { | |
217 return &prefs; | |
218 } else { | |
219 return g_hash_table_lookup(prefs_hash, name); | |
220 } | |
221 } | |
222 | |
223 static struct gaim_pref *find_pref_parent(const char *name) | |
224 { | |
5787
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
225 char *parent_name = get_path_dirname(name); |
5440 | 226 struct gaim_pref *ret = &prefs; |
227 | |
228 if(strcmp(parent_name, "/")) { | |
229 ret = find_pref(parent_name); | |
230 } | |
1026 | 231 |
5440 | 232 g_free(parent_name); |
233 return ret; | |
234 } | |
235 | |
236 static void free_pref_value(struct gaim_pref *pref) { | |
237 switch(pref->type) { | |
238 case GAIM_PREF_BOOLEAN: | |
239 pref->value.boolean = FALSE; | |
7317 | 240 break; |
5440 | 241 case GAIM_PREF_INT: |
242 pref->value.integer = 0; | |
243 break; | |
244 case GAIM_PREF_STRING: | |
245 g_free(pref->value.string); | |
246 pref->value.string = NULL; | |
247 break; | |
5561 | 248 case GAIM_PREF_STRING_LIST: |
249 { | |
250 GList *tmp; | |
251 for(tmp = pref->value.stringlist; tmp; tmp = tmp->next) | |
252 g_free(tmp->data); | |
253 | |
254 g_list_free(pref->value.stringlist); | |
255 } break; | |
5440 | 256 case GAIM_PREF_NONE: |
257 break; | |
258 } | |
259 } | |
260 | |
261 static struct gaim_pref *add_pref(GaimPrefType type, const char *name) { | |
262 struct gaim_pref *parent; | |
263 struct gaim_pref *me; | |
264 struct gaim_pref *sibling; | |
5458
156e65ca910f
[gaim-migrate @ 5846]
Christian Hammond <chipx86@chipx86.com>
parents:
5451
diff
changeset
|
265 char *my_name; |
5440 | 266 |
267 parent = find_pref_parent(name); | |
268 | |
269 if(!parent) | |
270 return NULL; | |
1525
ba8e6e211af5
[gaim-migrate @ 1535]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1455
diff
changeset
|
271 |
5787
2adc29c88a45
[gaim-migrate @ 6212]
Christian Hammond <chipx86@chipx86.com>
parents:
5684
diff
changeset
|
272 my_name = get_path_basename(name); |
5458
156e65ca910f
[gaim-migrate @ 5846]
Christian Hammond <chipx86@chipx86.com>
parents:
5451
diff
changeset
|
273 |
5440 | 274 for(sibling = parent->first_child; sibling; sibling = sibling->sibling) { |
275 if(!strcmp(sibling->name, my_name)) { | |
276 g_free(my_name); | |
277 return NULL; | |
278 } | |
279 } | |
280 | |
281 me = g_new0(struct gaim_pref, 1); | |
282 me->type = type; | |
283 me->name = my_name; | |
284 | |
285 me->parent = parent; | |
286 if(parent->first_child) { | |
287 /* blatant abuse of a for loop */ | |
288 for(sibling = parent->first_child; sibling->sibling; | |
289 sibling = sibling->sibling); | |
290 sibling->sibling = me; | |
291 } else { | |
292 parent->first_child = me; | |
293 } | |
294 | |
295 g_hash_table_insert(prefs_hash, g_strdup(name), (gpointer)me); | |
296 | |
297 return me; | |
298 } | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5105
diff
changeset
|
299 |
5440 | 300 void gaim_prefs_add_none(const char *name) { |
301 add_pref(GAIM_PREF_NONE, name); | |
302 } | |
303 | |
304 void gaim_prefs_add_bool(const char *name, gboolean value) { | |
305 struct gaim_pref *pref = add_pref(GAIM_PREF_BOOLEAN, name); | |
306 | |
307 if(!pref) | |
308 return; | |
309 | |
310 pref->value.boolean = value; | |
311 } | |
3630 | 312 |
5440 | 313 void gaim_prefs_add_int(const char *name, int value) { |
314 struct gaim_pref *pref = add_pref(GAIM_PREF_INT, name); | |
315 | |
316 if(!pref) | |
317 return; | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5105
diff
changeset
|
318 |
5440 | 319 pref->value.integer = value; |
320 } | |
321 | |
322 void gaim_prefs_add_string(const char *name, const char *value) { | |
323 struct gaim_pref *pref = add_pref(GAIM_PREF_STRING, name); | |
324 | |
325 if(!pref) | |
326 return; | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5105
diff
changeset
|
327 |
5440 | 328 pref->value.string = g_strdup(value); |
329 } | |
330 | |
5561 | 331 void gaim_prefs_add_string_list(const char *name, GList *value) { |
332 struct gaim_pref *pref = add_pref(GAIM_PREF_STRING_LIST, name); | |
333 GList *tmp; | |
334 | |
335 if(!pref) | |
336 return; | |
337 | |
338 for(tmp = value; tmp; tmp = tmp->next) | |
339 pref->value.stringlist = g_list_append(pref->value.stringlist, | |
340 g_strdup(tmp->data)); | |
341 } | |
342 | |
5440 | 343 void remove_pref(struct gaim_pref *pref) { |
344 char *name; | |
345 | |
346 if(!pref || pref == &prefs) | |
347 return; | |
348 | |
6693 | 349 while(pref->first_child) |
350 remove_pref(pref->first_child); | |
351 | |
5440 | 352 if(pref->parent->first_child == pref) { |
353 pref->parent->first_child = pref->sibling; | |
354 } else { | |
355 struct gaim_pref *sib = pref->parent->first_child; | |
356 while(sib->sibling != pref) | |
357 sib = sib->sibling; | |
358 sib->sibling = pref->sibling; | |
359 } | |
360 | |
361 name = pref_full_name(pref); | |
362 | |
7785 | 363 gaim_debug(GAIM_DEBUG_INFO, "prefs", "removing pref /%s\n", name); |
6693 | 364 |
5440 | 365 g_hash_table_remove(prefs_hash, name); |
366 g_free(name); | |
367 | |
368 free_pref_value(pref); | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5105
diff
changeset
|
369 |
5440 | 370 g_slist_free(pref->callbacks); |
371 g_free(pref->name); | |
372 g_free(pref); | |
373 } | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5105
diff
changeset
|
374 |
5440 | 375 void gaim_prefs_remove(const char *name) { |
376 struct gaim_pref *pref = find_pref(name); | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5105
diff
changeset
|
377 |
5440 | 378 if(!pref) |
379 return; | |
380 | |
381 remove_pref(pref); | |
382 } | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5105
diff
changeset
|
383 |
5440 | 384 void gaim_prefs_destroy() { |
385 gaim_prefs_remove("/"); | |
386 } | |
387 | |
388 static void do_callbacks(const char* name, struct gaim_pref *pref) { | |
389 GSList *cbs; | |
390 struct gaim_pref *cb_pref; | |
391 for(cb_pref = pref; cb_pref; cb_pref = cb_pref->parent) { | |
392 for(cbs = cb_pref->callbacks; cbs; cbs = cbs->next) { | |
393 struct pref_cb *cb = cbs->data; | |
394 cb->func(name, pref->type, pref->value.generic, cb->data); | |
4215 | 395 } |
396 } | |
1525
ba8e6e211af5
[gaim-migrate @ 1535]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1455
diff
changeset
|
397 } |
ba8e6e211af5
[gaim-migrate @ 1535]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1455
diff
changeset
|
398 |
5684 | 399 void gaim_prefs_trigger_callback(const char *name) { |
400 struct gaim_pref *pref = find_pref(name); | |
401 | |
5814 | 402 if(!pref) { |
403 gaim_debug(GAIM_DEBUG_ERROR, "prefs", | |
404 "gaim_prefs_trigger_callback: Unknown pref %s\n", name); | |
405 return; | |
406 } | |
407 | |
5684 | 408 do_callbacks(name, pref); |
409 } | |
410 | |
5440 | 411 void gaim_prefs_set_generic(const char *name, gpointer value) { |
412 struct gaim_pref *pref = find_pref(name); | |
3366 | 413 |
5814 | 414 if(!pref) { |
415 gaim_debug(GAIM_DEBUG_ERROR, "prefs", | |
416 "gaim_prefs_set_generic: Unknown pref %s\n", name); | |
417 return; | |
418 } | |
3500 | 419 |
5440 | 420 pref->value.generic = value; |
421 do_callbacks(name, pref); | |
3366 | 422 } |
423 | |
5440 | 424 void gaim_prefs_set_bool(const char *name, gboolean value) { |
425 struct gaim_pref *pref = find_pref(name); | |
4288 | 426 |
5533 | 427 if(pref) { |
5814 | 428 if(pref->type != GAIM_PREF_BOOLEAN) { |
429 gaim_debug(GAIM_DEBUG_ERROR, "prefs", | |
430 "gaim_prefs_set_bool: %s not a boolean pref\n", name); | |
431 return; | |
432 } | |
4325 | 433 |
5533 | 434 if(pref->value.boolean != value) { |
435 pref->value.boolean = value; | |
436 do_callbacks(name, pref); | |
437 } | |
438 } else { | |
439 gaim_prefs_add_bool(name, value); | |
4288 | 440 } |
4324 | 441 } |
4325 | 442 |
5440 | 443 void gaim_prefs_set_int(const char *name, int value) { |
444 struct gaim_pref *pref = find_pref(name); | |
4325 | 445 |
5533 | 446 if(pref) { |
5814 | 447 if(pref->type != GAIM_PREF_INT) { |
448 gaim_debug(GAIM_DEBUG_ERROR, "prefs", | |
449 "gaim_prefs_set_int: %s not an integer pref\n", name); | |
450 return; | |
451 } | |
4325 | 452 |
5533 | 453 if(pref->value.integer != value) { |
454 pref->value.integer = value; | |
455 do_callbacks(name, pref); | |
456 } | |
457 } else { | |
458 gaim_prefs_add_int(name, value); | |
5440 | 459 } |
4326 | 460 } |
461 | |
5451 | 462 void gaim_prefs_set_string(const char *name, const char *value) { |
5440 | 463 struct gaim_pref *pref = find_pref(name); |
4325 | 464 |
5533 | 465 if(pref) { |
5814 | 466 if(pref->type != GAIM_PREF_STRING) { |
467 gaim_debug(GAIM_DEBUG_ERROR, "prefs", | |
468 "gaim_prefs_set_string: %s not a string pref\n", name); | |
469 return; | |
470 } | |
4325 | 471 |
6295 | 472 if((value && !pref->value.string) || |
473 (!value && pref->value.string) || | |
474 strcmp(pref->value.string, value)) { | |
5533 | 475 g_free(pref->value.string); |
476 pref->value.string = g_strdup(value); | |
477 do_callbacks(name, pref); | |
478 } | |
479 } else { | |
480 gaim_prefs_add_string(name, value); | |
4325 | 481 } |
482 } | |
483 | |
5561 | 484 void gaim_prefs_set_string_list(const char *name, GList *value) { |
485 struct gaim_pref *pref = find_pref(name); | |
486 if(pref) { | |
487 GList *tmp; | |
5814 | 488 |
489 if(pref->type != GAIM_PREF_STRING_LIST) { | |
490 gaim_debug(GAIM_DEBUG_ERROR, "prefs", | |
491 "gaim_prefs_set_string_list: %s not a string list pref\n", | |
492 name); | |
493 return; | |
494 } | |
495 | |
5561 | 496 for(tmp = pref->value.stringlist; tmp; tmp = tmp->next) |
497 g_free(tmp->data); | |
498 | |
499 g_list_free(pref->value.stringlist); | |
500 pref->value.stringlist = NULL; | |
501 | |
502 for(tmp = value; tmp; tmp = tmp->next) | |
503 pref->value.stringlist = g_list_append(pref->value.stringlist, | |
504 g_strdup(tmp->data)); | |
505 | |
5986
96e0ac28d933
[gaim-migrate @ 6434]
Christian Hammond <chipx86@chipx86.com>
parents:
5949
diff
changeset
|
506 do_callbacks(name, pref); |
96e0ac28d933
[gaim-migrate @ 6434]
Christian Hammond <chipx86@chipx86.com>
parents:
5949
diff
changeset
|
507 |
5561 | 508 } else { |
509 gaim_prefs_add_string_list(name, value); | |
510 } | |
511 } | |
512 | |
9594 | 513 gboolean gaim_prefs_exists(const char *name) { |
5440 | 514 struct gaim_pref *pref = find_pref(name); |
4325 | 515 |
9594 | 516 if (pref != NULL) |
517 return TRUE; | |
4288 | 518 |
9594 | 519 return FALSE; |
4288 | 520 } |
521 | |
6538 | 522 GaimPrefType gaim_prefs_get_type(const char *name) { |
523 struct gaim_pref *pref = find_pref(name); | |
524 | |
525 if (pref == NULL) | |
526 return GAIM_PREF_NONE; | |
527 | |
528 return (pref->type); | |
529 } | |
530 | |
5440 | 531 gboolean gaim_prefs_get_bool(const char *name) { |
532 struct gaim_pref *pref = find_pref(name); | |
3427 | 533 |
5814 | 534 if(!pref) { |
535 gaim_debug(GAIM_DEBUG_ERROR, "prefs", | |
536 "gaim_prefs_get_bool: Unknown pref %s\n", name); | |
537 return FALSE; | |
538 } else if(pref->type != GAIM_PREF_BOOLEAN) { | |
539 gaim_debug(GAIM_DEBUG_ERROR, "prefs", | |
540 "gaim_prefs_get_bool: %s not a boolean pref\n", name); | |
541 return FALSE; | |
542 } | |
3472 | 543 |
5440 | 544 return pref->value.boolean; |
3366 | 545 } |
546 | |
5440 | 547 int gaim_prefs_get_int(const char *name) { |
548 struct gaim_pref *pref = find_pref(name); | |
3500 | 549 |
5814 | 550 if(!pref) { |
551 gaim_debug(GAIM_DEBUG_ERROR, "prefs", | |
552 "gaim_prefs_get_int: Unknown pref %s\n", name); | |
553 return 0; | |
554 } else if(pref->type != GAIM_PREF_INT) { | |
555 gaim_debug(GAIM_DEBUG_ERROR, "prefs", | |
556 "gaim_prefs_get_int: %s not an integer pref\n", name); | |
557 return 0; | |
558 } | |
3366 | 559 |
5440 | 560 return pref->value.integer; |
3366 | 561 } |
562 | |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5539
diff
changeset
|
563 const char *gaim_prefs_get_string(const char *name) { |
5440 | 564 struct gaim_pref *pref = find_pref(name); |
3366 | 565 |
5814 | 566 if(!pref) { |
567 gaim_debug(GAIM_DEBUG_ERROR, "prefs", | |
568 "gaim_prefs_get_string: Unknown pref %s\n", name); | |
569 return NULL; | |
570 } else if(pref->type != GAIM_PREF_STRING) { | |
571 gaim_debug(GAIM_DEBUG_ERROR, "prefs", | |
572 "gaim_prefs_get_string: %s not a string pref\n", name); | |
573 return NULL; | |
574 } | |
4469
d76095396a0e
[gaim-migrate @ 4744]
Christian Hammond <chipx86@chipx86.com>
parents:
4461
diff
changeset
|
575 |
5440 | 576 return pref->value.string; |
4469
d76095396a0e
[gaim-migrate @ 4744]
Christian Hammond <chipx86@chipx86.com>
parents:
4461
diff
changeset
|
577 } |
d76095396a0e
[gaim-migrate @ 4744]
Christian Hammond <chipx86@chipx86.com>
parents:
4461
diff
changeset
|
578 |
5561 | 579 GList *gaim_prefs_get_string_list(const char *name) { |
580 struct gaim_pref *pref = find_pref(name); | |
581 GList *ret = NULL, *tmp; | |
582 | |
5814 | 583 if(!pref) { |
584 gaim_debug(GAIM_DEBUG_ERROR, "prefs", | |
585 "gaim_prefs_get_string_list: Unknown pref %s\n", name); | |
586 return NULL; | |
587 } else if(pref->type != GAIM_PREF_STRING_LIST) { | |
588 gaim_debug(GAIM_DEBUG_ERROR, "prefs", | |
589 "gaim_prefs_get_string_list: %s not a string list pref\n", name); | |
590 return NULL; | |
591 } | |
5561 | 592 |
593 for(tmp = pref->value.stringlist; tmp; tmp = tmp->next) | |
594 ret = g_list_append(ret, g_strdup(tmp->data)); | |
595 | |
596 return ret; | |
597 } | |
598 | |
6693 | 599 void gaim_prefs_rename(const char *oldname, const char *newname) { |
600 struct gaim_pref *oldpref, *newpref; | |
601 | |
602 oldpref = find_pref(oldname); | |
603 newpref = find_pref(newname); | |
604 | |
605 /* it's already been renamed, call off the dogs */ | |
606 if(!oldpref) | |
607 return; | |
608 | |
9031 | 609 gaim_debug_info("prefs", "Renaming %s to %s\n", oldname, newname); |
610 | |
611 g_return_if_fail(newpref != NULL); /* the new one needs to be created first */ | |
6693 | 612 g_return_if_fail(oldpref->type == newpref->type); |
613 g_return_if_fail(oldpref->first_child == NULL); /* can't rename parents */ | |
614 | |
615 switch(oldpref->type) { | |
616 case GAIM_PREF_NONE: | |
617 break; | |
618 case GAIM_PREF_BOOLEAN: | |
619 gaim_prefs_set_bool(newname, oldpref->value.boolean); | |
620 break; | |
621 case GAIM_PREF_INT: | |
622 gaim_prefs_set_int(newname, oldpref->value.integer); | |
623 break; | |
624 case GAIM_PREF_STRING: | |
625 gaim_prefs_set_string(newname, oldpref->value.string); | |
626 break; | |
627 case GAIM_PREF_STRING_LIST: | |
628 gaim_prefs_set_string_list(newname, oldpref->value.stringlist); | |
629 break; | |
630 } | |
631 | |
632 remove_pref(oldpref); | |
633 } | |
634 | |
8705 | 635 void gaim_prefs_rename_boolean_toggle(const char *oldname, const char *newname) { |
636 struct gaim_pref *oldpref, *newpref; | |
10087 | 637 |
8705 | 638 gaim_debug_info("prefs", "Attempting to rename and toggle %s to %s\n", oldname, newname); |
639 | |
640 oldpref = find_pref(oldname); | |
641 newpref = find_pref(newname); | |
642 | |
643 /* it's already been renamed, call off the cats */ | |
644 if(!oldpref) | |
645 return; | |
646 | |
647 g_return_if_fail(newpref != NULL); /* the new one needs to be created */ | |
648 g_return_if_fail(oldpref->type == newpref->type); | |
649 g_return_if_fail(oldpref->type == GAIM_PREF_BOOLEAN); | |
650 g_return_if_fail(oldpref->first_child == NULL); /* can't rename parents */ | |
10087 | 651 |
8705 | 652 gaim_prefs_set_bool(newname, !(oldpref->value.boolean)); |
653 | |
654 remove_pref(oldpref); | |
655 | |
6693 | 656 } |
657 | |
10087 | 658 guint gaim_prefs_connect_callback(void *handle, const char *name, GaimPrefCallback func, gpointer data) |
5440 | 659 { |
9156 | 660 struct gaim_pref *pref; |
5440 | 661 struct pref_cb *cb; |
662 static guint cb_id = 0; | |
3366 | 663 |
9156 | 664 pref = find_pref(name); |
665 if (pref == NULL) | |
5440 | 666 return 0; |
3366 | 667 |
5440 | 668 cb = g_new0(struct pref_cb, 1); |
1881
a02584b98823
[gaim-migrate @ 1891]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1840
diff
changeset
|
669 |
5440 | 670 cb->func = func; |
671 cb->data = data; | |
672 cb->id = ++cb_id; | |
10087 | 673 cb->handle = handle; |
4991 | 674 |
5440 | 675 pref->callbacks = g_slist_append(pref->callbacks, cb); |
3366 | 676 |
5440 | 677 return cb->id; |
3366 | 678 } |
679 | |
10087 | 680 static gboolean disco_callback_helper(struct gaim_pref *pref, guint callback_id) { |
5440 | 681 GSList *cbs; |
682 struct gaim_pref *child; | |
2254 | 683 |
5440 | 684 if(!pref) |
685 return FALSE; | |
1881
a02584b98823
[gaim-migrate @ 1891]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1840
diff
changeset
|
686 |
5440 | 687 for(cbs = pref->callbacks; cbs; cbs = cbs->next) { |
688 struct pref_cb *cb = cbs->data; | |
689 if(cb->id == callback_id) { | |
690 pref->callbacks = g_slist_remove(pref->callbacks, cb); | |
691 g_free(cb); | |
692 return TRUE; | |
4428 | 693 } |
694 } | |
695 | |
5440 | 696 for(child = pref->first_child; child; child = child->sibling) { |
697 if(disco_callback_helper(child, callback_id)) | |
698 return TRUE; | |
4428 | 699 } |
4451
ce5b64fac95d
[gaim-migrate @ 4726]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4449
diff
changeset
|
700 |
5440 | 701 return FALSE; |
1757
3dfe4aefd366
[gaim-migrate @ 1767]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1755
diff
changeset
|
702 } |
3dfe4aefd366
[gaim-migrate @ 1767]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1755
diff
changeset
|
703 |
5440 | 704 void gaim_prefs_disconnect_callback(guint callback_id) { |
705 disco_callback_helper(&prefs, callback_id); | |
2262
9c8f353331e7
[gaim-migrate @ 2272]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2254
diff
changeset
|
706 } |
9c8f353331e7
[gaim-migrate @ 2272]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2254
diff
changeset
|
707 |
10087 | 708 static void disco_callback_helper_handle(struct gaim_pref *pref, void *handle) { |
709 GSList *cbs; | |
710 struct gaim_pref *child; | |
711 | |
712 if(!pref) | |
713 return; | |
714 | |
715 cbs = pref->callbacks; | |
716 while (cbs != NULL) { | |
717 struct pref_cb *cb = cbs->data; | |
718 if(cb->handle == handle) { | |
719 pref->callbacks = g_slist_remove(pref->callbacks, cb); | |
720 g_free(cb); | |
721 cbs = pref->callbacks; | |
722 } else | |
723 cbs = cbs->next; | |
724 } | |
725 | |
726 for(child = pref->first_child; child; child = child->sibling) | |
727 disco_callback_helper_handle(child, handle); | |
728 } | |
729 | |
730 void gaim_prefs_disconnect_by_handle(void *handle) { | |
731 g_return_if_fail(handle != NULL); | |
732 disco_callback_helper_handle(&prefs, handle); | |
733 } | |
734 | |
5440 | 735 static void gaim_prefs_write(FILE *f, struct gaim_pref *pref, int depth) { |
736 struct gaim_pref *tmp; | |
737 char *esc; | |
738 int i; | |
3500 | 739 |
5440 | 740 if(!pref) { |
741 pref = &prefs; | |
3551 | 742 |
10423 | 743 fprintf(f, "<?xml version='1.0' encoding='UTF-8' ?>\n\n"); |
744 fprintf(f, "<pref version='1.0' name='/'"); | |
5440 | 745 } else { |
746 for(i=0; i<depth; i++) | |
747 fprintf(f, "\t"); | |
748 esc = g_markup_escape_text(pref->name, -1); | |
749 fprintf(f, "<pref name='%s'", esc); | |
750 g_free(esc); | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5105
diff
changeset
|
751 } |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5105
diff
changeset
|
752 |
5440 | 753 switch(pref->type) { |
754 case GAIM_PREF_NONE: | |
755 break; | |
756 case GAIM_PREF_BOOLEAN: | |
757 fprintf(f, " type='bool' value='%d'", pref->value.boolean); | |
758 break; | |
759 case GAIM_PREF_INT: | |
760 fprintf(f, " type='int' value='%d'", pref->value.integer); | |
761 break; | |
762 case GAIM_PREF_STRING: | |
763 esc = g_markup_escape_text(pref->value.string, -1); | |
764 fprintf(f, " type='string' value='%s'", esc); | |
765 g_free(esc); | |
766 break; | |
5561 | 767 case GAIM_PREF_STRING_LIST: |
768 fprintf(f, " type='stringlist'"); | |
769 break; | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5105
diff
changeset
|
770 } |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5105
diff
changeset
|
771 |
5561 | 772 if(pref->first_child || pref->type == GAIM_PREF_STRING_LIST) { |
5440 | 773 fprintf(f, ">\n"); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5105
diff
changeset
|
774 |
5440 | 775 for(tmp = pref->first_child; tmp; tmp = tmp->sibling) |
776 gaim_prefs_write(f, tmp, depth+1); | |
5561 | 777 |
778 if(pref->type == GAIM_PREF_STRING_LIST) { | |
779 GList *tmp2; | |
780 for(tmp2 = pref->value.stringlist; tmp2; tmp2 = tmp2->next) { | |
781 for(i=0; i<depth+1; i++) | |
782 fprintf(f, "\t"); | |
783 esc = g_markup_escape_text(tmp2->data, -1); | |
784 fprintf(f, "<item value='%s' />\n", esc); | |
785 g_free(esc); | |
786 } | |
787 } | |
788 | |
5440 | 789 for(i=0; i<depth; i++) |
790 fprintf(f, "\t"); | |
791 fprintf(f, "</pref>\n"); | |
792 } else { | |
793 fprintf(f, " />\n"); | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5105
diff
changeset
|
794 } |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5105
diff
changeset
|
795 } |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5105
diff
changeset
|
796 |
5440 | 797 void gaim_prefs_sync() { |
798 FILE *file; | |
10399 | 799 struct stat st; |
5440 | 800 const char *user_dir = gaim_user_dir(); |
801 char *filename; | |
802 char *filename_real; | |
3551 | 803 |
5534 | 804 if(!prefs_is_loaded) { |
805 gaim_debug(GAIM_DEBUG_WARNING, "prefs", "prefs saved before loading! scheduling save.\n"); | |
806 schedule_prefs_save(); /* schedule a save for after we read in */ | |
807 return; | |
808 } | |
809 | |
5440 | 810 if(!user_dir) |
811 return; | |
3551 | 812 |
5534 | 813 gaim_debug(GAIM_DEBUG_INFO, "prefs", "writing prefs out to disk.\n"); |
814 | |
5440 | 815 file = fopen(user_dir, "r"); |
816 if(!file) | |
817 mkdir(user_dir, S_IRUSR | S_IWUSR | S_IXUSR); | |
818 else | |
819 fclose(file); | |
3551 | 820 |
5440 | 821 filename = g_build_filename(user_dir, "prefs.xml.save", NULL); |
3551 | 822 |
5440 | 823 if((file = fopen(filename, "w"))) { |
824 gaim_prefs_write(file, NULL, 0); | |
825 fclose(file); | |
826 chmod(filename, S_IRUSR | S_IWUSR); | |
827 } else { | |
828 gaim_debug(GAIM_DEBUG_ERROR, "prefs", "Unable to write %s\n", | |
829 filename); | |
8549 | 830 g_free(filename); |
831 return; | |
5440 | 832 } |
3551 | 833 |
10399 | 834 if (stat(filename, &st) || (st.st_size == 0)) { |
835 gaim_debug_error("prefs", "Failed to save prefs\n"); | |
836 unlink(filename); | |
837 g_free(filename); | |
838 return; | |
839 } | |
840 | |
5440 | 841 filename_real = g_build_filename(user_dir, "prefs.xml", NULL); |
842 if(rename(filename, filename_real) < 0) | |
843 gaim_debug(GAIM_DEBUG_ERROR, "prefs", "Error renaming %s to %s\n", | |
844 filename, filename_real); | |
3551 | 845 |
5440 | 846 g_free(filename); |
847 g_free(filename_real); | |
3551 | 848 } |
849 | |
5440 | 850 static GList *prefs_stack = NULL; |
873
789df4b47508
[gaim-migrate @ 883]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
864
diff
changeset
|
851 |
5440 | 852 static void prefs_start_element_handler (GMarkupParseContext *context, |
853 const gchar *element_name, | |
854 const gchar **attribute_names, | |
855 const gchar **attribute_values, | |
856 gpointer user_data, | |
857 GError **error) { | |
858 GaimPrefType pref_type = GAIM_PREF_NONE; | |
859 int i; | |
860 const char *pref_name = NULL, *pref_value = NULL; | |
861 GString *pref_name_full; | |
862 GList *tmp; | |
3366 | 863 |
5561 | 864 if(strcmp(element_name, "pref") && strcmp(element_name, "item")) |
5440 | 865 return; |
3500 | 866 |
5440 | 867 for(i = 0; attribute_names[i]; i++) { |
868 if(!strcmp(attribute_names[i], "name")) { | |
869 pref_name = attribute_values[i]; | |
870 } else if(!strcmp(attribute_names[i], "type")) { | |
871 if(!strcmp(attribute_values[i], "bool")) | |
872 pref_type = GAIM_PREF_BOOLEAN; | |
873 else if(!strcmp(attribute_values[i], "int")) | |
874 pref_type = GAIM_PREF_INT; | |
875 else if(!strcmp(attribute_values[i], "string")) | |
876 pref_type = GAIM_PREF_STRING; | |
5561 | 877 else if(!strcmp(attribute_values[i], "stringlist")) |
878 pref_type = GAIM_PREF_STRING_LIST; | |
5440 | 879 else |
880 return; | |
881 } else if(!strcmp(attribute_names[i], "value")) { | |
882 pref_value = attribute_values[i]; | |
883 } | |
884 } | |
873
789df4b47508
[gaim-migrate @ 883]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
864
diff
changeset
|
885 |
5561 | 886 if(!strcmp(element_name, "item")) { |
5838 | 887 struct gaim_pref *pref; |
888 | |
889 pref_name_full = g_string_new(""); | |
890 | |
891 for(tmp = prefs_stack; tmp; tmp = tmp->next) { | |
892 pref_name_full = g_string_prepend(pref_name_full, tmp->data); | |
893 pref_name_full = g_string_prepend_c(pref_name_full, '/'); | |
894 } | |
895 | |
896 pref = find_pref(pref_name_full->str); | |
897 | |
5561 | 898 if(pref) { |
899 pref->value.stringlist = g_list_append(pref->value.stringlist, | |
900 g_strdup(pref_value)); | |
901 } | |
5838 | 902 } else { |
903 if(!pref_name || !strcmp(pref_name, "/")) | |
904 return; | |
652
4d3285caa191
[gaim-migrate @ 662]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
619
diff
changeset
|
905 |
5838 | 906 pref_name_full = g_string_new(pref_name); |
652
4d3285caa191
[gaim-migrate @ 662]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
619
diff
changeset
|
907 |
5838 | 908 for(tmp = prefs_stack; tmp; tmp = tmp->next) { |
909 pref_name_full = g_string_prepend_c(pref_name_full, '/'); | |
910 pref_name_full = g_string_prepend(pref_name_full, tmp->data); | |
911 } | |
912 | |
5440 | 913 pref_name_full = g_string_prepend_c(pref_name_full, '/'); |
1253
8342d3aab1f1
[gaim-migrate @ 1263]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1250
diff
changeset
|
914 |
5838 | 915 switch(pref_type) { |
916 case GAIM_PREF_NONE: | |
7785 | 917 gaim_prefs_add_none(pref_name_full->str); |
5838 | 918 break; |
919 case GAIM_PREF_BOOLEAN: | |
920 gaim_prefs_set_bool(pref_name_full->str, atoi(pref_value)); | |
921 break; | |
922 case GAIM_PREF_INT: | |
923 gaim_prefs_set_int(pref_name_full->str, atoi(pref_value)); | |
924 break; | |
925 case GAIM_PREF_STRING: | |
926 gaim_prefs_set_string(pref_name_full->str, pref_value); | |
927 break; | |
928 case GAIM_PREF_STRING_LIST: | |
929 gaim_prefs_set_string_list(pref_name_full->str, NULL); | |
930 break; | |
931 } | |
932 prefs_stack = g_list_prepend(prefs_stack, g_strdup(pref_name)); | |
933 g_string_free(pref_name_full, TRUE); | |
5440 | 934 } |
1170 | 935 } |
936 | |
5440 | 937 static void prefs_end_element_handler(GMarkupParseContext *context, |
938 const gchar *element_name, gpointer user_data, GError **error) { | |
5940 | 939 if(prefs_stack && !strcmp(element_name, "pref")) { |
940 g_free(prefs_stack->data); | |
5440 | 941 prefs_stack = g_list_delete_link(prefs_stack, prefs_stack); |
942 } | |
1170 | 943 } |
944 | |
5440 | 945 static GMarkupParser prefs_parser = { |
946 prefs_start_element_handler, | |
947 prefs_end_element_handler, | |
948 NULL, | |
949 NULL, | |
950 NULL | |
951 }; | |
1170 | 952 |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5539
diff
changeset
|
953 gboolean gaim_prefs_load() { |
5440 | 954 gchar *filename = g_build_filename(gaim_user_dir(), "prefs.xml", NULL); |
955 gchar *contents = NULL; | |
956 gsize length; | |
957 GMarkupParseContext *context; | |
958 GError *error = NULL; | |
5314
1f901484599d
[gaim-migrate @ 5686]
Christian Hammond <chipx86@chipx86.com>
parents:
5297
diff
changeset
|
959 |
7561
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7555
diff
changeset
|
960 if (!filename) { |
5534 | 961 prefs_is_loaded = TRUE; |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5539
diff
changeset
|
962 return FALSE; |
5534 | 963 } |
5440 | 964 |
965 gaim_debug(GAIM_DEBUG_INFO, "prefs", "Reading %s\n", filename); | |
5314
1f901484599d
[gaim-migrate @ 5686]
Christian Hammond <chipx86@chipx86.com>
parents:
5297
diff
changeset
|
966 |
5440 | 967 if(!g_file_get_contents(filename, &contents, &length, &error)) { |
8671
d99d2572d1a9
[gaim-migrate @ 9423]
Christian Hammond <chipx86@chipx86.com>
parents:
8549
diff
changeset
|
968 #ifndef _WIN32 |
d99d2572d1a9
[gaim-migrate @ 9423]
Christian Hammond <chipx86@chipx86.com>
parents:
8549
diff
changeset
|
969 g_free(filename); |
d99d2572d1a9
[gaim-migrate @ 9423]
Christian Hammond <chipx86@chipx86.com>
parents:
8549
diff
changeset
|
970 g_error_free(error); |
d99d2572d1a9
[gaim-migrate @ 9423]
Christian Hammond <chipx86@chipx86.com>
parents:
8549
diff
changeset
|
971 |
d99d2572d1a9
[gaim-migrate @ 9423]
Christian Hammond <chipx86@chipx86.com>
parents:
8549
diff
changeset
|
972 error = NULL; |
d99d2572d1a9
[gaim-migrate @ 9423]
Christian Hammond <chipx86@chipx86.com>
parents:
8549
diff
changeset
|
973 |
8702 | 974 filename = g_build_filename(SYSCONFDIR, "gaim", "prefs.xml", NULL); |
8671
d99d2572d1a9
[gaim-migrate @ 9423]
Christian Hammond <chipx86@chipx86.com>
parents:
8549
diff
changeset
|
975 |
d99d2572d1a9
[gaim-migrate @ 9423]
Christian Hammond <chipx86@chipx86.com>
parents:
8549
diff
changeset
|
976 gaim_debug(GAIM_DEBUG_INFO, "prefs", "Reading %s\n", filename); |
d99d2572d1a9
[gaim-migrate @ 9423]
Christian Hammond <chipx86@chipx86.com>
parents:
8549
diff
changeset
|
977 |
d99d2572d1a9
[gaim-migrate @ 9423]
Christian Hammond <chipx86@chipx86.com>
parents:
8549
diff
changeset
|
978 if (!g_file_get_contents(filename, &contents, &length, &error)) { |
d99d2572d1a9
[gaim-migrate @ 9423]
Christian Hammond <chipx86@chipx86.com>
parents:
8549
diff
changeset
|
979 gaim_debug(GAIM_DEBUG_ERROR, "prefs", "Error reading prefs: %s\n", |
d99d2572d1a9
[gaim-migrate @ 9423]
Christian Hammond <chipx86@chipx86.com>
parents:
8549
diff
changeset
|
980 error->message); |
d99d2572d1a9
[gaim-migrate @ 9423]
Christian Hammond <chipx86@chipx86.com>
parents:
8549
diff
changeset
|
981 g_error_free(error); |
d99d2572d1a9
[gaim-migrate @ 9423]
Christian Hammond <chipx86@chipx86.com>
parents:
8549
diff
changeset
|
982 g_free(filename); |
d99d2572d1a9
[gaim-migrate @ 9423]
Christian Hammond <chipx86@chipx86.com>
parents:
8549
diff
changeset
|
983 prefs_is_loaded = TRUE; |
d99d2572d1a9
[gaim-migrate @ 9423]
Christian Hammond <chipx86@chipx86.com>
parents:
8549
diff
changeset
|
984 |
d99d2572d1a9
[gaim-migrate @ 9423]
Christian Hammond <chipx86@chipx86.com>
parents:
8549
diff
changeset
|
985 return FALSE; |
d99d2572d1a9
[gaim-migrate @ 9423]
Christian Hammond <chipx86@chipx86.com>
parents:
8549
diff
changeset
|
986 } |
d99d2572d1a9
[gaim-migrate @ 9423]
Christian Hammond <chipx86@chipx86.com>
parents:
8549
diff
changeset
|
987 #else /* _WIN32 */ |
5440 | 988 gaim_debug(GAIM_DEBUG_ERROR, "prefs", "Error reading prefs: %s\n", |
989 error->message); | |
990 g_error_free(error); | |
6040 | 991 g_free(filename); |
5534 | 992 prefs_is_loaded = TRUE; |
6040 | 993 |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5539
diff
changeset
|
994 return FALSE; |
8671
d99d2572d1a9
[gaim-migrate @ 9423]
Christian Hammond <chipx86@chipx86.com>
parents:
8549
diff
changeset
|
995 #endif /* _WIN32 */ |
1170 | 996 } |
997 | |
5440 | 998 context = g_markup_parse_context_new(&prefs_parser, 0, NULL, NULL); |
999 | |
1000 if(!g_markup_parse_context_parse(context, contents, length, NULL)) { | |
1001 g_markup_parse_context_free(context); | |
1002 g_free(contents); | |
6040 | 1003 g_free(filename); |
5534 | 1004 prefs_is_loaded = TRUE; |
6040 | 1005 |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5539
diff
changeset
|
1006 return FALSE; |
5440 | 1007 } |
1008 | |
1009 if(!g_markup_parse_context_end_parse(context, NULL)) { | |
1010 gaim_debug(GAIM_DEBUG_ERROR, "prefs", "Error parsing %s\n", filename); | |
1011 g_markup_parse_context_free(context); | |
1012 g_free(contents); | |
6040 | 1013 g_free(filename); |
5534 | 1014 prefs_is_loaded = TRUE; |
6040 | 1015 |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5539
diff
changeset
|
1016 return FALSE; |
5440 | 1017 } |
1018 | |
6040 | 1019 gaim_debug(GAIM_DEBUG_INFO, "prefs", "Finished reading %s\n", filename); |
5440 | 1020 g_markup_parse_context_free(context); |
1021 g_free(contents); | |
1022 g_free(filename); | |
5534 | 1023 prefs_is_loaded = TRUE; |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5539
diff
changeset
|
1024 |
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5539
diff
changeset
|
1025 return TRUE; |
1006
0a4d0ed65e17
[gaim-migrate @ 1016]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1002
diff
changeset
|
1026 } |
0a4d0ed65e17
[gaim-migrate @ 1016]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1002
diff
changeset
|
1027 |
8900 | 1028 void gaim_prefs_update_old() { |
1029 /* Remove some no-longer-used prefs */ | |
9594 | 1030 gaim_prefs_remove("/core/away/auto_response/enabled"); |
1031 gaim_prefs_remove("/core/away/auto_response/idle_only"); | |
8948 | 1032 gaim_prefs_remove("/core/away/auto_response/in_active_conv"); |
1033 gaim_prefs_remove("/core/away/auto_response/sec_before_resend"); | |
9594 | 1034 gaim_prefs_remove("/core/away/auto_response"); |
10353 | 1035 gaim_prefs_remove("/core/buddies/use_server_alias"); |
8942 | 1036 gaim_prefs_remove("/core/conversations/away_back_on_send"); |
8900 | 1037 gaim_prefs_remove("/core/conversations/send_urls_as_links"); |
8942 | 1038 gaim_prefs_remove("/core/conversations/im/show_login"); |
8998 | 1039 gaim_prefs_remove("/core/conversations/chat/show_join"); |
1040 gaim_prefs_remove("/core/conversations/chat/show_leave"); | |
9251 | 1041 gaim_prefs_remove("/core/conversations/combine_chat_im"); |
10389 | 1042 gaim_prefs_remove("/core/conversations/use_alias_for_title"); |
8900 | 1043 } |