Update for 0.51.2-pre2
[wmaker-crm.git] / WINGs / userdefaults.c
blobd8b06829fbc283bc5d4083653532cd1771eb96f1
2 #include <stdlib.h>
3 #include <strings.h>
4 #include <stdio.h>
5 #include <assert.h>
8 #include "../src/config.h"
10 #include "WUtil.h"
12 #include <proplist.h>
15 typedef struct W_UserDefaults {
16 proplist_t defaults;
18 proplist_t appDomain;
20 proplist_t searchListArray;
21 proplist_t *searchList; /* cache for searchListArray */
23 char dirty;
25 } UserDefaults;
28 static UserDefaults *sharedUserDefaults = NULL;
30 extern char *WMGetApplicationName();
32 #define DEFAULTS_DIR "/Defaults"
35 char*
36 wusergnusteppath()
38 static char *path = NULL;
39 char *gspath;
40 int pathlen;
42 if (!path) {
43 gspath = getenv("GNUSTEP_USER_ROOT");
44 if (gspath) {
45 gspath = wexpandpath(gspath);
46 pathlen = strlen(gspath) + 4;
47 path = wmalloc(pathlen);
48 strcpy(path, gspath);
49 free(gspath);
50 } else {
51 pathlen = strlen(wgethomedir()) + 10;
52 path = wmalloc(pathlen);
53 strcpy(path, wgethomedir());
54 strcat(path, "/GNUstep");
58 return path;
62 char*
63 wdefaultspathfordomain(char *domain)
65 char *path;
66 char *gspath;
68 gspath = wusergnusteppath();
69 path = wmalloc(strlen(gspath)+strlen(DEFAULTS_DIR)+strlen(domain)+4);
70 strcpy(path, gspath);
71 strcat(path, DEFAULTS_DIR);
72 strcat(path, "/");
73 strcat(path, domain);
75 return path;
79 static void
80 #ifndef HAVE_ATEXIT
81 saveDefaultsChanges(int foo, void *bar)
82 #else
83 saveDefaultsChanges(void)
84 #endif
86 if (sharedUserDefaults && sharedUserDefaults->dirty) {
87 PLSave(sharedUserDefaults->appDomain, YES);
92 WMUserDefaults*
93 WMGetStandardUserDefaults(void)
95 if (!sharedUserDefaults) {
96 WMUserDefaults *defaults;
98 proplist_t domain;
99 proplist_t key;
100 char *path;
101 int i;
103 defaults = wmalloc(sizeof(WMUserDefaults));
104 memset(defaults, 0, sizeof(WMUserDefaults));
106 defaults->defaults = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
108 defaults->searchList = wmalloc(sizeof(proplist_t)*3);
110 /* application domain */
111 key = PLMakeString(WMGetApplicationName());
112 defaults->searchList[0] = key;
114 /* temporary kluge */
115 if (strcmp(WMGetApplicationName(), "WindowMaker")==0) {
116 domain = NULL;
117 path = NULL;
118 } else {
119 path = wdefaultspathfordomain(PLGetString(key));
121 domain = PLGetProplistWithPath(path);
123 if (!domain) {
124 proplist_t p;
126 domain = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
127 if (path) {
128 p = PLMakeString(path);
129 PLSetFilename(domain, p);
130 PLRelease(p);
133 if (path)
134 free(path);
136 defaults->appDomain = domain;
138 if (domain)
139 PLInsertDictionaryEntry(defaults->defaults, key, domain);
141 PLRelease(key);
143 /* global domain */
144 key = PLMakeString("WMGLOBAL");
145 defaults->searchList[1] = key;
147 path = wdefaultspathfordomain(PLGetString(key));
149 domain = PLGetProplistWithPath(path);
151 free(path);
153 if (!domain)
154 domain = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
156 if (domain)
157 PLInsertDictionaryEntry(defaults->defaults, key, domain);
159 PLRelease(key);
161 /* terminate list */
162 defaults->searchList[2] = NULL;
164 defaults->searchListArray=PLMakeArrayFromElements(NULL,NULL);
167 i = 0;
168 while (defaults->searchList[i]) {
169 PLAppendArrayElement(defaults->searchListArray,
170 defaults->searchList[i]);
171 i++;
174 sharedUserDefaults = defaults;
176 /* set to save changes in defaults when program is exited */
179 #ifndef HAVE_ATEXIT
180 on_exit(saveDefaultsChanges, (void*)NULL);
181 #else
182 atexit(saveDefaultsChanges);
183 #endif
186 return sharedUserDefaults;
191 proplist_t
192 WMGetUDObjectForKey(WMUserDefaults *database, char *defaultName)
194 proplist_t domainName, domain;
195 proplist_t object = NULL;
196 proplist_t key = PLMakeString(defaultName);
197 int i = 0;
199 while (database->searchList[i] && !object) {
200 domainName = database->searchList[i];
201 domain = PLGetDictionaryEntry(database->defaults, domainName);
202 if (domain) {
203 object = PLGetDictionaryEntry(domain, key);
205 i++;
207 PLRelease(key);
209 return object;
213 void
214 WMSetUDObjectForKey(WMUserDefaults *database, proplist_t object,
215 char *defaultName)
217 proplist_t key = PLMakeString(defaultName);
219 database->dirty = 1;
221 PLInsertDictionaryEntry(database->appDomain, key, object);
222 PLRelease(key);
226 void
227 WMRemoveUDObjectForKey(WMUserDefaults *database, char *defaultName)
229 proplist_t key = PLMakeString(defaultName);
231 database->dirty = 1;
233 PLRemoveDictionaryEntry(database->appDomain, key);
235 PLRelease(key);
239 char*
240 WMGetUDStringForKey(WMUserDefaults *database, char *defaultName)
242 proplist_t val;
244 val = WMGetUDObjectForKey(database, defaultName);
246 if (!val)
247 return NULL;
249 if (!PLIsString(val))
250 return NULL;
252 return wstrdup(PLGetString(val));
257 WMGetUDIntegerForKey(WMUserDefaults *database, char *defaultName)
259 proplist_t val;
260 char *str;
261 int value;
263 val = WMGetUDObjectForKey(database, defaultName);
265 if (!val)
266 return 0;
268 if (!PLIsString(val))
269 return 0;
271 str = PLGetString(val);
272 if (!str)
273 return 0;
275 if (sscanf(str, "%i", &value)!=1)
276 return 0;
278 return value;
283 float
284 WMGetUDFloatForKey(WMUserDefaults *database, char *defaultName)
286 proplist_t val;
287 char *str;
288 float value;
290 val = WMGetUDObjectForKey(database, defaultName);
292 if (!val || !PLIsString(val))
293 return 0.0;
295 if (!(str = PLGetString(val)))
296 return 0.0;
298 if (sscanf(str, "%f", &value)!=1)
299 return 0.0;
301 return value;
306 Bool
307 WMGetUDBoolForKey(WMUserDefaults *database, char *defaultName)
309 proplist_t val;
310 int value;
311 char *str;
313 val = WMGetUDObjectForKey(database, defaultName);
315 if (!val)
316 return False;
318 if (!PLIsString(val))
319 return False;
321 str = PLGetString(val);
322 if (!str)
323 return False;
325 if (sscanf(str, "%i", &value)==1 && value!=0)
326 return True;
328 if (strcasecmp(str, "YES")==0)
329 return True;
331 if (strcasecmp(str, "Y")==0)
332 return True;
334 return False;
338 void
339 WMSetUDIntegerForKey(WMUserDefaults *database, int value, char *defaultName)
341 proplist_t object;
342 char buffer[128];
344 sprintf(buffer, "%i", value);
345 object = PLMakeString(buffer);
347 WMSetUDObjectForKey(database, object, defaultName);
348 PLRelease(object);
354 void
355 WMSetUDStringForKey(WMUserDefaults *database, char *value, char *defaultName)
357 proplist_t object;
359 object = PLMakeString(value);
361 WMSetUDObjectForKey(database, object, defaultName);
362 PLRelease(object);
367 void
368 WMSetUDFloatForKey(WMUserDefaults *database, float value, char *defaultName)
370 proplist_t object;
371 char buffer[128];
373 sprintf(buffer, "%f", value);
374 object = PLMakeString(buffer);
376 WMSetUDObjectForKey(database, object, defaultName);
377 PLRelease(object);
382 void
383 WMSetUDBoolForKey(WMUserDefaults *database, Bool value, char *defaultName)
385 static proplist_t yes = NULL, no = NULL;
387 if (!yes) {
388 yes = PLMakeString("YES");
389 no = PLMakeString("NO");
392 WMSetUDObjectForKey(database, value ? yes : no, defaultName);
396 proplist_t
397 WMGetUDSearchList(WMUserDefaults *database)
399 return database->searchListArray;
403 void
404 WMSetUDSearchList(WMUserDefaults *database, proplist_t list)
406 int i, c;
408 if (database->searchList) {
409 i = 0;
410 while (database->searchList[i]) {
411 PLRelease(database->searchList[i]);
412 i++;
414 free(database->searchList);
416 if (database->searchListArray) {
417 PLRelease(database->searchListArray);
420 c = PLGetNumberOfElements(list);
421 database->searchList = wmalloc(sizeof(proplist_t)*(c+1));
423 for (i=0; i<c; i++) {
424 database->searchList[i] = PLGetArrayElement(list, i);
427 database->searchListArray = PLDeepCopy(list);