Initial revision
[wmaker-crm.git] / WINGs / userdefaults.c
blob2f61cbf5c82f9bb67a7230259452221e02db82c2
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 */
169 atexit(saveDefaultsChanges);
172 return sharedUserDefaults;
177 proplist_t
178 WMGetUDObjectForKey(WMUserDefaults *database, char *defaultName)
180 proplist_t domainName, domain;
181 proplist_t object = NULL;
182 proplist_t key = PLMakeString(defaultName);
183 int i = 0;
185 while (database->searchList[i] && !object) {
186 domainName = database->searchList[i];
187 domain = PLGetDictionaryEntry(database->defaults, domainName);
188 if (domain) {
189 object = PLGetDictionaryEntry(domain, key);
191 i++;
193 PLRelease(key);
195 return object;
199 void
200 WMSetUDObjectForKey(WMUserDefaults *database, proplist_t object,
201 char *defaultName)
203 proplist_t key = PLMakeString(defaultName);
205 database->dirty = 1;
207 PLInsertDictionaryEntry(database->appDomain, key, object);
208 PLRelease(key);
212 void
213 WMRemoveUDObjectForKey(WMUserDefaults *database, char *defaultName)
215 proplist_t key = PLMakeString(defaultName);
217 database->dirty = 1;
219 PLRemoveDictionaryEntry(database->appDomain, key);
221 PLRelease(key);
225 char*
226 WMGetUDStringForKey(WMUserDefaults *database, char *defaultName)
228 proplist_t val;
230 val = WMGetUDObjectForKey(database, defaultName);
232 if (!val)
233 return NULL;
235 if (!PLIsString(val))
236 return NULL;
238 return wstrdup(PLGetString(val));
243 WMGetUDIntegerForKey(WMUserDefaults *database, char *defaultName)
245 proplist_t val;
246 char *str;
247 int value;
249 val = WMGetUDObjectForKey(database, defaultName);
251 if (!val)
252 return 0;
254 if (!PLIsString(val))
255 return 0;
257 str = PLGetString(val);
258 if (!str)
259 return 0;
261 if (sscanf(str, "%i", &value)!=1)
262 return 0;
264 return value;
270 WMGetUDFloatForKey(WMUserDefaults *database, char *defaultName)
272 proplist_t val;
273 char *str;
274 float value;
276 val = WMGetUDObjectForKey(database, defaultName);
278 if (!val)
279 return 0.0;
281 if (!PLIsString(val))
282 return 0.0;
284 str = PLGetString(val);
285 if (!str)
286 return 0.0;
288 if (sscanf(str, "%f", &value)!=1)
289 return 0.0;
291 return value;
296 Bool
297 WMGetUDBoolForKey(WMUserDefaults *database, char *defaultName)
299 proplist_t val;
300 int value;
301 char *str;
303 val = WMGetUDObjectForKey(database, defaultName);
305 if (!val)
306 return False;
308 if (!PLIsString(val))
309 return False;
311 str = PLGetString(val);
312 if (!str)
313 return False;
315 if (sscanf(str, "%i", &value)==1 && value!=0)
316 return True;
318 if (strcasecmp(str, "YES")==0)
319 return True;
321 if (strcasecmp(str, "Y")==0)
322 return True;
324 return False;
328 void
329 WMSetUDIntegerForKey(WMUserDefaults *database, int value, char *defaultName)
331 proplist_t object;
332 char buffer[128];
334 sprintf(buffer, "%i", value);
335 object = PLMakeString(buffer);
337 WMSetUDObjectForKey(database, object, defaultName);
338 PLRelease(object);
344 void
345 WMSetUDStringForKey(WMUserDefaults *database, char *value, char *defaultName)
347 proplist_t object;
349 object = PLMakeString(value);
351 WMSetUDObjectForKey(database, object, defaultName);
352 PLRelease(object);
357 void
358 WMSetUDFloatForKey(WMUserDefaults *database, float value, char *defaultName)
360 proplist_t object;
361 char buffer[128];
363 sprintf(buffer, "%f", value);
364 object = PLMakeString(buffer);
366 WMSetUDObjectForKey(database, object, defaultName);
367 PLRelease(object);
372 void
373 WMSetUDBoolForKey(WMUserDefaults *database, Bool value, char *defaultName)
375 static proplist_t yes = NULL, no = NULL;
377 if (!yes) {
378 yes = PLMakeString("YES");
379 no = PLMakeString("NO");
382 WMSetUDObjectForKey(database, value ? yes : no, defaultName);
386 proplist_t
387 WMGetUDSearchList(WMUserDefaults *database)
389 return database->searchListArray;
393 void
394 WMSetUDSearchList(WMUserDefaults *database, proplist_t list)
396 int i, c;
398 if (database->searchList) {
399 i = 0;
400 while (database->searchList[i]) {
401 PLRelease(database->searchList[i]);
402 i++;
404 free(database->searchList);
406 if (database->searchListArray) {
407 PLRelease(database->searchListArray);
410 c = PLGetNumberOfElements(list);
411 database->searchList = wmalloc(sizeof(proplist_t)*(c+1));
413 for (i=0; i<c; i++) {
414 database->searchList[i] = PLGetArrayElement(list, i);
417 database->searchListArray = PLDeepCopy(list);