NSURL+SOSPlistStore.m   [plain text]


//
//  NSURL+SOSPlistWriting.h
//

#import <Security/Security.h>
#import <Foundation/NSPropertyList.h>
#import <Foundation/NSArray.h>
#import <Foundation/NSPropertyList.h>
#import <Foundation/NSData.h>
#import <Foundation/NSURL.h>
#import <Foundation/NSDictionary.h>
#import <utilities/debugging.h>
#import <utilities/SecFileLocations.h>

#if ! __has_feature(objc_arc)
#error This file must be compiled with ARC. Either turn on ARC for the project or use -fobjc-arc flag
#endif

// may want to have this hold incoming events in file as well

@implementation NSURL (SOSPlistWriting)

- (BOOL)writePlist: (id) plist
{
    NSError *error = nil;
    if (![NSPropertyListSerialization propertyList: plist isValidForFormat: NSPropertyListXMLFormat_v1_0])
    {
        secerror("can't save PersistentState as XML");
        return false;
    }

    NSData *data = [NSPropertyListSerialization dataWithPropertyList: plist
        format: NSPropertyListXMLFormat_v1_0 options: 0 error: &error];
    if (data == nil)
    {
        secerror("error serializing PersistentState to xml: %@", error);
        return false;
    }

    BOOL writeStatus = [data writeToURL:self options: NSDataWritingAtomic error: &error];
    if (!writeStatus)
        secerror("error writing PersistentState to file: %@", error);
    
    return writeStatus;
}

- (id) readPlist
{
    NSError *error = nil;
    NSData *data = [NSData dataWithContentsOfURL: self options: 0 error: &error];
    if (data == nil)
    {
        secdebug("keyregister", "error reading PersistentState from %@: %@", self, error);
        return nil;
    }

    // Now the deserializing:

    NSPropertyListFormat format;
    id plist = [NSPropertyListSerialization propertyListWithData: data
        options: NSPropertyListMutableContainersAndLeaves format: &format error: &error];
                                            
    if (plist == nil)
        secerror("could not deserialize PersistentState from %@: %@", self, error);
    
    return plist;
}

@end