aboutsummaryrefslogtreecommitdiffstats
path: root/macos.c
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2011-11-23 22:56:57 -0800
committerGravatar Dirk Hohndel <dirk@hohndel.org>2011-11-24 10:12:40 -0800
commit671f6544ac8b4a6eb68576b37344e84808511eb8 (patch)
tree12a0b650a6d926dbaa7392ef099c04b6fe5a67c7 /macos.c
parentcf6e0e7ca1ef74f4090f660484bdc4726609b5d3 (diff)
downloadsubsurface-671f6544ac8b4a6eb68576b37344e84808511eb8.tar.gz
Split reading/writing preferences into OS specific files
This adds tested code for Linux and Mac OS, implementing the api that Linus suggested. The Windows code was moved into its own file, but hasn't even been compile tested, yet. In order to have just one interface to set or get a preference value we encode TRUE as (void *) 1 and FALSE as NULL. This works consistently on all platforms and regardless of whether we have 32 or 64 bit. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'macos.c')
-rw-r--r--macos.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/macos.c b/macos.c
new file mode 100644
index 000000000..b48f20d87
--- /dev/null
+++ b/macos.c
@@ -0,0 +1,91 @@
+/* macos.c */
+/* implements Mac OS X specific functions */
+#include "display-gtk.h"
+#include <CoreFoundation/CoreFoundation.h>
+
+static CFURLRef fileURL;
+static CFPropertyListRef propertyList;
+static CFMutableDictionaryRef dict = NULL;
+
+/* macos defines CFSTR to create a CFString object from a constant,
+ * but no similar macros if a C string variable is supposed to be
+ * the argument. We add this here (hardcoding the default allocator
+ * and MacRoman encoding */
+#define CFSTR_VAR(_var) CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, \
+ (_var), kCFStringEncodingMacRoman, \
+ kCFAllocatorNull)
+
+void subsurface_open_conf(void)
+{
+ CFStringRef errorString;
+ CFDataRef resourceData;
+ Boolean status;
+ SInt32 errorCode;
+
+ fileURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
+ CFSTR("subsurface.pref"),// file path name
+ kCFURLPOSIXPathStyle, // interpret as POSIX path
+ false ); // is it a directory?
+
+ status = CFURLCreateDataAndPropertiesFromResource(kCFAllocatorDefault,
+ fileURL, &resourceData,
+ NULL, NULL, &errorCode);
+ if (status) {
+ propertyList = CFPropertyListCreateFromXMLData(kCFAllocatorDefault,
+ resourceData, kCFPropertyListImmutable,
+ &errorString);
+ CFRelease(resourceData);
+ }
+}
+
+void subsurface_set_conf(char *name, pref_type_t type, const void *value)
+{
+ if (!dict)
+ dict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
+ &kCFTypeDictionaryKeyCallBacks,
+ &kCFTypeDictionaryValueCallBacks);
+ switch (type) {
+ case PREF_BOOL:
+ CFDictionarySetValue(dict, CFSTR_VAR(name), value == NULL ? CFSTR("0") : CFSTR("1"));
+ break;
+ case PREF_STRING:
+ CFDictionarySetValue(dict, CFSTR_VAR(name), CFSTR_VAR(value));
+ }
+}
+const void *subsurface_get_conf(char *name, pref_type_t type)
+{
+ CFStringRef dict_entry;
+
+ /* if no settings exist, we return the value for FALSE */
+ if (!propertyList)
+ return NULL;
+
+ switch (type) {
+ case PREF_BOOL:
+ dict_entry = CFDictionaryGetValue(propertyList, CFSTR_VAR(name));
+ if (dict_entry && ! CFStringCompare(CFSTR("1"), dict_entry, 0))
+ return (void *) 1;
+ else
+ return NULL;
+ case PREF_STRING:
+ return CFStringGetCStringPtr(CFDictionaryGetValue(propertyList,
+ CFSTR_VAR(name)), kCFStringEncodingMacRoman);
+ }
+ /* we shouldn't get here, but having this line makes the compiler happy */
+ return NULL;
+}
+
+void subsurface_close_conf(void)
+{
+ Boolean status;
+ SInt32 errorCode;
+ CFDataRef xmlData;
+
+ propertyList = dict;
+ dict = NULL;
+ xmlData = CFPropertyListCreateXMLData(kCFAllocatorDefault, propertyList);
+ status = CFURLWriteDataAndPropertiesToResource (fileURL, xmlData, NULL, &errorCode);
+ // some error handling - but really, what can we do?
+ CFRelease(xmlData);
+ CFRelease(propertyList);
+}