This update includes the 0.20.3pre3 code
[wmaker-crm.git] / WINGs / userdefaults.c
blob74f108f0f64bbeba291346a19a6c3848095bda21
2 #include <stdlib.h>
3 #include <strings.h>
4 #include <stdio.h>
5 #include <assert.h>
7 #include "WUtil.h"
9 #include <proplist.h>
12 typedef struct W_UserDefaults {
13 proplist_t defaults;
15 proplist_t appDomain;
17 proplist_t searchListArray;
18 proplist_t *searchList; /* cache for searchListArray */
20 char dirty;
22 } UserDefaults;
25 static UserDefaults *sharedUserDefaults = NULL;
27 extern char *WMGetApplicationName();
29 #define DEFAULTS_DIR "/Defaults"
32 char*
33 wusergnusteppath()
35 char *path;
36 char *gspath;
37 int pathlen;
39 gspath = getenv("GNUSTEP_USER_ROOT");
40 if (gspath) {
41 gspath = wexpandpath(gspath);
42 pathlen = strlen(gspath) + 4;
43 path = wmalloc(pathlen);
44 strcpy(path, gspath);
45 free(gspath);
46 } else {
47 pathlen = strlen(wgethomedir()) + 10;
48 path = wmalloc(pathlen);
49 strcpy(path, wgethomedir());
50 strcat(path, "/GNUstep");
53 return path;
57 char*
58 wdefaultspathfordomain(char *domain)
60 char *path;
61 char *gspath;
63 gspath = wusergnusteppath();
64 path = wmalloc(strlen(gspath)+strlen(DEFAULTS_DIR)+strlen(domain)+4);
65 strcpy(path, gspath);
66 free(gspath);
67 strcat(path, DEFAULTS_DIR);
68 strcat(path, "/");
69 strcat(path, domain);
71 return path;
75 static void
76 saveDefaultsChanges(void)
78 if (sharedUserDefaults && sharedUserDefaults->dirty) {
79 PLSave(sharedUserDefaults->appDomain, YES);
84 WMUserDefaults*
85 WMGetStandardUserDefaults(void)
87 if (!sharedUserDefaults) {
88 WMUserDefaults *defaults;
90 proplist_t domain;
91 proplist_t key;
92 char *path;
93 int i;
95 defaults = wmalloc(sizeof(WMUserDefaults));
96 memset(defaults, 0, sizeof(WMUserDefaults));
98 defaults->defaults = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
100 defaults->searchList = wmalloc(sizeof(proplist_t)*3);
102 /* application domain */
103 key = PLMakeString(WMGetApplicationName());
104 defaults->searchList[0] = key;
106 /* temporary kluge */
107 if (strcmp(WMGetApplicationName(), "WindowMaker")==0) {
108 domain = NULL;
109 path = NULL;
110 } else {
111 path = wdefaultspathfordomain(PLGetString(key));
113 domain = PLGetProplistWithPath(path);
115 if (!domain) {
116 proplist_t p;
118 domain = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
119 if (path) {
120 p = PLMakeString(path);
121 PLSetFilename(domain, p);
122 PLRelease(p);
125 if (path)
126 free(path);
128 defaults->appDomain = domain;
130 if (domain)
131 PLInsertDictionaryEntry(defaults->defaults, key, domain);
133 PLRelease(key);
135 /* global domain */
136 key = PLMakeString("WMGLOBAL");
137 defaults->searchList[1] = key;
139 path = wdefaultspathfordomain(PLGetString(key));
141 domain = PLGetProplistWithPath(path);
143 free(path);
145 if (!domain)
146 domain = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
148 if (domain)
149 PLInsertDictionaryEntry(defaults->defaults, key, domain);
151 PLRelease(key);
153 /* terminate list */
154 defaults->searchList[2] = NULL;
156 defaults->searchListArray=PLMakeArrayFromElements(NULL,NULL);
159 i = 0;
160 while (defaults->searchList[i]) {
161 PLAppendArrayElement(defaults->searchListArray,
162 defaults->searchList[i]);
163 i++;
166 sharedUserDefaults = defaults;
168 /* set to save changes in defaults when program is exited */
171 #if !defined(HAVE_ATEXIT) && defined(HAVE_ON_EXIT)
172 on_exit(saveDefaultsChanges,0);
173 #else
174 atexit(saveDefaultsChanges);
175 #endif
178 return sharedUserDefaults;
183 proplist_t
184 WMGetUDObjectForKey(WMUserDefaults *database, char *defaultName)
186 proplist_t domainName, domain;
187 proplist_t object = NULL;
188 proplist_t key = PLMakeString(defaultName);
189 int i = 0;
191 while (database->searchList[i] && !object) {
192 domainName = database->searchList[i];
193 domain = PLGetDictionaryEntry(database->defaults, domainName);
194 if (domain) {
195 object = PLGetDictionaryEntry(domain, key);
197 i++;
199 PLRelease(key);
201 return object;
205 void
206 WMSetUDObjectForKey(WMUserDefaults *database, proplist_t object,
207 char *defaultName)
209 proplist_t key = PLMakeString(defaultName);
211 database->dirty = 1;
213 PLInsertDictionaryEntry(database->appDomain, key, object);
214 PLRelease(key);
218 void
219 WMRemoveUDObjectForKey(WMUserDefaults *database, char *defaultName)
221 proplist_t key = PLMakeString(defaultName);
223 database->dirty = 1;
225 PLRemoveDictionaryEntry(database->appDomain, key);
227 PLRelease(key);
231 char*
232 WMGetUDStringForKey(WMUserDefaults *database, char *defaultName)
234 proplist_t val;
236 val = WMGetUDObjectForKey(database, defaultName);
238 if (!val)
239 return NULL;
241 if (!PLIsString(val))
242 return NULL;
244 return wstrdup(PLGetString(val));
249 WMGetUDIntegerForKey(WMUserDefaults *database, char *defaultName)
251 proplist_t val;
252 char *str;
253 int value;
255 val = WMGetUDObjectForKey(database, defaultName);
257 if (!val)
258 return 0;
260 if (!PLIsString(val))
261 return 0;
263 str = PLGetString(val);
264 if (!str)
265 return 0;
267 if (sscanf(str, "%i", &value)!=1)
268 return 0;
270 return value;
276 WMGetUDFloatForKey(WMUserDefaults *database, char *defaultName)
278 proplist_t val;
279 char *str;
280 float value;
282 val = WMGetUDObjectForKey(database, defaultName);
284 if (!val)
285 return 0.0;
287 if (!PLIsString(val))
288 return 0.0;
290 str = PLGetString(val);
291 if (!str)
292 return 0.0;
294 if (sscanf(str, "%f", &value)!=1)
295 return 0.0;
297 return value;
302 Bool
303 WMGetUDBoolForKey(WMUserDefaults *database, char *defaultName)
305 proplist_t val;
306 int value;
307 char *str;
309 val = WMGetUDObjectForKey(database, defaultName);
311 if (!val)
312 return False;
314 if (!PLIsString(val))
315 return False;
317 str = PLGetString(val);
318 if (!str)
319 return False;
321 if (sscanf(str, "%i", &value)==1 && value!=0)
322 return True;
324 if (strcasecmp(str, "YES")==0)
325 return True;
327 if (strcasecmp(str, "Y")==0)
328 return True;
330 return False;
334 void
335 WMSetUDIntegerForKey(WMUserDefaults *database, int value, char *defaultName)
337 proplist_t object;
338 char buffer[128];
340 sprintf(buffer, "%i", value);
341 object = PLMakeString(buffer);
343 WMSetUDObjectForKey(database, object, defaultName);
344 PLRelease(object);
350 void
351 WMSetUDStringForKey(WMUserDefaults *database, char *value, char *defaultName)
353 proplist_t object;
355 object = PLMakeString(value);
357 WMSetUDObjectForKey(database, object, defaultName);
358 PLRelease(object);
363 void
364 WMSetUDFloatForKey(WMUserDefaults *database, float value, char *defaultName)
366 proplist_t object;
367 char buffer[128];
369 sprintf(buffer, "%f", value);
370 object = PLMakeString(buffer);
372 WMSetUDObjectForKey(database, object, defaultName);
373 PLRelease(object);
378 void
379 WMSetUDBoolForKey(WMUserDefaults *database, Bool value, char *defaultName)
381 static proplist_t yes = NULL, no = NULL;
383 if (!yes) {
384 yes = PLMakeString("YES");
385 no = PLMakeString("NO");
388 WMSetUDObjectForKey(database, value ? yes : no, defaultName);
392 proplist_t
393 WMGetUDSearchList(WMUserDefaults *database)
395 return database->searchListArray;
399 void
400 WMSetUDSearchList(WMUserDefaults *database, proplist_t list)
402 int i, c;
404 if (database->searchList) {
405 i = 0;
406 while (database->searchList[i]) {
407 PLRelease(database->searchList[i]);
408 i++;
410 free(database->searchList);
412 if (database->searchListArray) {
413 PLRelease(database->searchListArray);
416 c = PLGetNumberOfElements(list);
417 database->searchList = wmalloc(sizeof(proplist_t)*(c+1));
419 for (i=0; i<c; i++) {
420 database->searchList[i] = PLGetArrayElement(list, i);
423 database->searchListArray = PLDeepCopy(list);