Update for 0.51.0
[wmaker-crm.git] / WINGs / userdefaults.c
blobf6b279685ee2559fa6c708234fff788f9d6678d7
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 char *path;
39 char *gspath;
40 int pathlen;
42 gspath = getenv("GNUSTEP_USER_ROOT");
43 if (gspath) {
44 gspath = wexpandpath(gspath);
45 pathlen = strlen(gspath) + 4;
46 path = wmalloc(pathlen);
47 strcpy(path, gspath);
48 free(gspath);
49 } else {
50 pathlen = strlen(wgethomedir()) + 10;
51 path = wmalloc(pathlen);
52 strcpy(path, wgethomedir());
53 strcat(path, "/GNUstep");
56 return path;
60 char*
61 wdefaultspathfordomain(char *domain)
63 char *path;
64 char *gspath;
66 gspath = wusergnusteppath();
67 path = wmalloc(strlen(gspath)+strlen(DEFAULTS_DIR)+strlen(domain)+4);
68 strcpy(path, gspath);
69 free(gspath);
70 strcat(path, DEFAULTS_DIR);
71 strcat(path, "/");
72 strcat(path, domain);
74 return path;
78 static void
79 saveDefaultsChanges(void)
81 if (sharedUserDefaults && sharedUserDefaults->dirty) {
82 PLSave(sharedUserDefaults->appDomain, YES);
87 WMUserDefaults*
88 WMGetStandardUserDefaults(void)
90 if (!sharedUserDefaults) {
91 WMUserDefaults *defaults;
93 proplist_t domain;
94 proplist_t key;
95 char *path;
96 int i;
98 defaults = wmalloc(sizeof(WMUserDefaults));
99 memset(defaults, 0, sizeof(WMUserDefaults));
101 defaults->defaults = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
103 defaults->searchList = wmalloc(sizeof(proplist_t)*3);
105 /* application domain */
106 key = PLMakeString(WMGetApplicationName());
107 defaults->searchList[0] = key;
109 /* temporary kluge */
110 if (strcmp(WMGetApplicationName(), "WindowMaker")==0) {
111 domain = NULL;
112 path = NULL;
113 } else {
114 path = wdefaultspathfordomain(PLGetString(key));
116 domain = PLGetProplistWithPath(path);
118 if (!domain) {
119 proplist_t p;
121 domain = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
122 if (path) {
123 p = PLMakeString(path);
124 PLSetFilename(domain, p);
125 PLRelease(p);
128 if (path)
129 free(path);
131 defaults->appDomain = domain;
133 if (domain)
134 PLInsertDictionaryEntry(defaults->defaults, key, domain);
136 PLRelease(key);
138 /* global domain */
139 key = PLMakeString("WMGLOBAL");
140 defaults->searchList[1] = key;
142 path = wdefaultspathfordomain(PLGetString(key));
144 domain = PLGetProplistWithPath(path);
146 free(path);
148 if (!domain)
149 domain = PLMakeDictionaryFromEntries(NULL, NULL, NULL);
151 if (domain)
152 PLInsertDictionaryEntry(defaults->defaults, key, domain);
154 PLRelease(key);
156 /* terminate list */
157 defaults->searchList[2] = NULL;
159 defaults->searchListArray=PLMakeArrayFromElements(NULL,NULL);
162 i = 0;
163 while (defaults->searchList[i]) {
164 PLAppendArrayElement(defaults->searchListArray,
165 defaults->searchList[i]);
166 i++;
169 sharedUserDefaults = defaults;
171 /* set to save changes in defaults when program is exited */
174 #ifndef HAVE_ATEXIT
175 on_exit(saveDefaultsChanges,0);
176 #else
177 atexit(saveDefaultsChanges);
178 #endif
181 return sharedUserDefaults;
186 proplist_t
187 WMGetUDObjectForKey(WMUserDefaults *database, char *defaultName)
189 proplist_t domainName, domain;
190 proplist_t object = NULL;
191 proplist_t key = PLMakeString(defaultName);
192 int i = 0;
194 while (database->searchList[i] && !object) {
195 domainName = database->searchList[i];
196 domain = PLGetDictionaryEntry(database->defaults, domainName);
197 if (domain) {
198 object = PLGetDictionaryEntry(domain, key);
200 i++;
202 PLRelease(key);
204 return object;
208 void
209 WMSetUDObjectForKey(WMUserDefaults *database, proplist_t object,
210 char *defaultName)
212 proplist_t key = PLMakeString(defaultName);
214 database->dirty = 1;
216 PLInsertDictionaryEntry(database->appDomain, key, object);
217 PLRelease(key);
221 void
222 WMRemoveUDObjectForKey(WMUserDefaults *database, char *defaultName)
224 proplist_t key = PLMakeString(defaultName);
226 database->dirty = 1;
228 PLRemoveDictionaryEntry(database->appDomain, key);
230 PLRelease(key);
234 char*
235 WMGetUDStringForKey(WMUserDefaults *database, char *defaultName)
237 proplist_t val;
239 val = WMGetUDObjectForKey(database, defaultName);
241 if (!val)
242 return NULL;
244 if (!PLIsString(val))
245 return NULL;
247 return wstrdup(PLGetString(val));
252 WMGetUDIntegerForKey(WMUserDefaults *database, char *defaultName)
254 proplist_t val;
255 char *str;
256 int value;
258 val = WMGetUDObjectForKey(database, defaultName);
260 if (!val)
261 return 0;
263 if (!PLIsString(val))
264 return 0;
266 str = PLGetString(val);
267 if (!str)
268 return 0;
270 if (sscanf(str, "%i", &value)!=1)
271 return 0;
273 return value;
279 WMGetUDFloatForKey(WMUserDefaults *database, char *defaultName)
281 proplist_t val;
282 char *str;
283 float value;
285 val = WMGetUDObjectForKey(database, defaultName);
287 if (!val)
288 return 0.0;
290 if (!PLIsString(val))
291 return 0.0;
293 str = PLGetString(val);
294 if (!str)
295 return 0.0;
297 if (sscanf(str, "%f", &value)!=1)
298 return 0.0;
300 return value;
305 Bool
306 WMGetUDBoolForKey(WMUserDefaults *database, char *defaultName)
308 proplist_t val;
309 int value;
310 char *str;
312 val = WMGetUDObjectForKey(database, defaultName);
314 if (!val)
315 return False;
317 if (!PLIsString(val))
318 return False;
320 str = PLGetString(val);
321 if (!str)
322 return False;
324 if (sscanf(str, "%i", &value)==1 && value!=0)
325 return True;
327 if (strcasecmp(str, "YES")==0)
328 return True;
330 if (strcasecmp(str, "Y")==0)
331 return True;
333 return False;
337 void
338 WMSetUDIntegerForKey(WMUserDefaults *database, int value, char *defaultName)
340 proplist_t object;
341 char buffer[128];
343 sprintf(buffer, "%i", value);
344 object = PLMakeString(buffer);
346 WMSetUDObjectForKey(database, object, defaultName);
347 PLRelease(object);
353 void
354 WMSetUDStringForKey(WMUserDefaults *database, char *value, char *defaultName)
356 proplist_t object;
358 object = PLMakeString(value);
360 WMSetUDObjectForKey(database, object, defaultName);
361 PLRelease(object);
366 void
367 WMSetUDFloatForKey(WMUserDefaults *database, float value, char *defaultName)
369 proplist_t object;
370 char buffer[128];
372 sprintf(buffer, "%f", value);
373 object = PLMakeString(buffer);
375 WMSetUDObjectForKey(database, object, defaultName);
376 PLRelease(object);
381 void
382 WMSetUDBoolForKey(WMUserDefaults *database, Bool value, char *defaultName)
384 static proplist_t yes = NULL, no = NULL;
386 if (!yes) {
387 yes = PLMakeString("YES");
388 no = PLMakeString("NO");
391 WMSetUDObjectForKey(database, value ? yes : no, defaultName);
395 proplist_t
396 WMGetUDSearchList(WMUserDefaults *database)
398 return database->searchListArray;
402 void
403 WMSetUDSearchList(WMUserDefaults *database, proplist_t list)
405 int i, c;
407 if (database->searchList) {
408 i = 0;
409 while (database->searchList[i]) {
410 PLRelease(database->searchList[i]);
411 i++;
413 free(database->searchList);
415 if (database->searchListArray) {
416 PLRelease(database->searchListArray);
419 c = PLGetNumberOfElements(list);
420 database->searchList = wmalloc(sizeof(proplist_t)*(c+1));
422 for (i=0; i<c; i++) {
423 database->searchList[i] = PLGetArrayElement(list, i);
426 database->searchListArray = PLDeepCopy(list);