blob: 705d21353a3865d1f518e36dddaa3200425e75c1 [file] [log] [blame]
* Copyright (c) 2008-2009 Brent Fulgham. All rights reserved.
* This source code is a modified version of the CoreFoundation sources released by Apple Inc. under
* the terms of the APSL version 2.0 (see below).
* For information about changes from the original Apple source release can be found by reviewing the
* source control system for the project at
// Apple's "Write a PList" example program.
// Taken from
#include <CoreFoundation/CoreFoundation.h>
void propertyListExample (void);
void writePropertyListToFile (CFDataRef data);
const char* kFilename = "./schema.xml";
int main (int argc, const char * argv[]) {
// Create and save the plist.
propertyListExample ();
return 0;
void propertyListExample (void) {
CFMutableDictionaryRef dict;
CFNumberRef num;
CFArrayRef array;
CFDataRef data;
#define NumKids 2
CFStringRef kidsNames[] = { CFSTR ("John"), CFSTR ("Kyra") };
#define NumPets 0
int yearOfBirth = 1965;
#define NumBytesInPic 10
const unsigned char pic[ NumBytesInPic ] = { 0x3c, 0x42, 0x81, 0xa5, 0x81, 0xa5, 0x99, 0x81, 0x42, 0x3c };
CFDataRef xmlPropertyListData;
CFStringRef xmlAsString;
// Create and populate a pretty standard mutable dictionary: CFString keys, CF type values.
// To be written out as a "propertyList", the tree of CF types can contain only:
// CFDictionary, CFArray, CFString, CFData, CFNumber, and CFDate.
// In addition, the keys of the dictionaries should be CFStrings.
dict = CFDictionaryCreateMutable (NULL, 0, &kCFCopyStringDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks );
CFDictionarySetValue (dict, CFSTR ("Name"), CFSTR ("John Doe"));
CFDictionarySetValue (dict, CFSTR ("City of Birth"), CFSTR ("Springfield"));
num = CFNumberCreate (NULL, kCFNumberIntType, &yearOfBirth);
CFDictionarySetValue (dict, CFSTR ("Year Of Birth"), num);
CFRelease (num);
array = CFArrayCreate (NULL, (const void **)kidsNames, NumKids, &kCFTypeArrayCallBacks);
CFDictionarySetValue (dict, CFSTR ("Kids Names"), array);
CFRelease (array);
array = CFArrayCreate (NULL, NULL, 0, &kCFTypeArrayCallBacks);
CFDictionarySetValue (dict, CFSTR ("Pets Names"), array );
CFRelease (array);
data = CFDataCreate (NULL, pic, NumBytesInPic);
CFDictionarySetValue (dict, CFSTR ("Picture"), data);
CFRelease (data);
// We now have a dictionary which contains everything we want to know about
// John Doe; let's show it first:
CFShow (CFSTR ("John Doe info dictionary: "));
CFShow (dict);
// Now create a "property list", which is a flattened, XML version of the
// dictionary:
xmlPropertyListData = CFPropertyListCreateXMLData (NULL, dict);
// The return value is a CFData containing the XML file; show the data
CFShow (CFSTR ("Shown as XML property list (bytes): "));
CFShow (xmlPropertyListData);
// Given CFDatas are shown as ASCII versions of their hex contents, we can also
// attempt to show the contents of the XML, assuming it was encoded in UTF8
// (This is the case for XML property lists generated by CoreFoundation currently)
xmlAsString = CFStringCreateFromExternalRepresentation (NULL, xmlPropertyListData, kCFStringEncodingUTF8);
CFShow (CFSTR ("The XML property list contents: "));
CFShow (xmlAsString);
writePropertyListToFile (xmlPropertyListData);
CFRelease (dict);
CFRelease (xmlAsString);
CFRelease (xmlPropertyListData);
CFStringRef name = CFSTR("Brent");
if (CFBundleRef bundle = CFBundleGetMainBundle ())
if (CFTypeRef bundleExecutable = CFBundleGetValueForInfoDictionaryKey(bundle, kCFBundleExecutableKey))
if (CFGetTypeID(bundleExecutable) == CFStringGetTypeID())
name = reinterpret_cast<CFStringRef>(bundleExecutable);
int value = 1;
CFNumberRef numRef = CFNumberCreate(0, kCFNumberSInt8Type, &value);
CFShow (CFSTR ("The number was: "));
CFShow (numRef);
CFRelease (numRef);
void writePropertyListToFile (CFDataRef data) {
CFStringRef errorString;
CFPropertyListRef propertyList = CFPropertyListCreateFromXMLData (NULL, data, kCFPropertyListMutableContainersAndLeaves, &errorString);
if (errorString == NULL) {
CFStringRef urlString = CFStringCreateWithCString (NULL, kFilename, CFStringGetSystemEncoding ());
CFURLRef fileURL = CFURLCreateWithFileSystemPath (NULL, urlString, kCFURLPOSIXPathStyle, FALSE);
CFWriteStreamRef stream = CFWriteStreamCreateWithFile (NULL, fileURL);
Boolean isOpen = CFWriteStreamOpen (stream);
CFShow (CFSTR ("Property list (as written to file):"));
CFShow (propertyList);
CFIndex bytesWritten = CFPropertyListWriteToStream (propertyList, stream, kCFPropertyListXMLFormat_v1_0, NULL);
CFWriteStreamClose (stream);
else {
CFShow (errorString);
CFRelease (errorString);
CFRelease (propertyList);