/ CircleJoinRequested / PersistentState.m
PersistentState.m
 1  //
 2  //  PersistentState.m
 3  //  Security
 4  //
 5  //  Created by J Osborne on 7/11/13.
 6  //
 7  //
 8  
 9  #import "PersistentState.h"
10  #import <Foundation/Foundation.h>
11  
12  @interface PersistentState()
13  -(NSURL*)urlForStorage;
14  @end
15  
16  @implementation PersistentState
17  
18  -(NSURL*)urlForStorage
19  {
20      return [NSURL fileURLWithPath:@"/var/mobile/Library/Preferences/com.apple.security.CircleJoinRequested.plist" isDirectory:NO];
21  }
22  
23  -(unsigned int)defaultPendingApplicationReminderAlertInterval
24  {
25      return 24 * 60 * 60;
26  }
27  
28  +(instancetype)loadFromStorage
29  {
30      PersistentState *state = [[PersistentState alloc] init];
31      if (!state) {
32          return state;
33      }
34      
35      NSError *error = nil;
36      id plist = @{@"lastWritten": [NSDate distantPast]};
37      
38      NSData *stateData = [NSData dataWithContentsOfURL:[state urlForStorage] options:0 error:&error];
39      if (!stateData) {
40          NSLog(@"Can't read state data (p=%@, err=%@)", [state urlForStorage], error);
41      } else {
42          NSPropertyListFormat format;
43          id plistTmp = [NSPropertyListSerialization propertyListWithData:stateData options: NSPropertyListMutableContainersAndLeaves format:&format error:&error];
44          
45          if (plistTmp == nil) {
46              NSLog(@"Can't deserialize %@, e=%@", stateData, error);
47          } else {
48              plist = plistTmp;
49          }
50      }
51      
52      state.lastCircleStatus				= plist[@"lastCircleStatus"] ? [plist[@"lastCircleStatus"] intValue] : kSOSCCCircleAbsent;
53      state.lastWritten     				= plist[@"lastWritten"];
54  	state.pendingApplicationReminder	= plist[@"pendingApplicationReminder"] ?: [NSDate distantFuture];
55  	state.applicationDate				= plist[@"applicationDate"]            ?: [NSDate distantPast];
56      state.debugShowLeftReason			= plist[@"debugShowLeftReason"];
57      state.pendingApplicationReminderAlertInterval	= plist[@"pendingApplicationReminderAlertInterval"] ?
58   															[plist[@"pendingApplicationReminderAlertInterval"] unsignedIntValue] :
59   															[state defaultPendingApplicationReminderAlertInterval];
60      state.absentCircleWithNoReason		= plist[@"absentCircleWithNoReason"] ? [plist[@"absentCircleWithNoReason"] intValue] : NO;
61      
62      return state;
63  }
64  
65  -(void)writeToStorage
66  {
67      NSDictionary *plist = @{@"lastCircleStatus": [NSNumber numberWithInt:self.lastCircleStatus],
68                              @"lastWritten": [NSDate date],
69  							@"pendingApplicationReminder": self.pendingApplicationReminder ?: [NSDate distantFuture],
70  							@"applicationDate": self.applicationDate ?: [NSDate distantPast],
71                              @"pendingApplicationReminderAlertInterval": [NSNumber numberWithUnsignedInt:self.pendingApplicationReminderAlertInterval],
72                              @"absentCircleWithNoReason": [NSNumber numberWithBool:self.absentCircleWithNoReason]};
73      if (self.debugShowLeftReason) {
74          NSMutableDictionary *tmp = [plist mutableCopy];
75          tmp[@"debugShowLeftReason"] = self.debugShowLeftReason;
76          plist =[tmp copy];
77      }
78      NSLog(@"writeToStorage plist=%@", plist);
79      
80      NSError *error = nil;
81      NSData *stateData = [NSPropertyListSerialization dataWithPropertyList:plist format:NSPropertyListXMLFormat_v1_0 options:kCFPropertyListImmutable error:&error];
82      if (!stateData) {
83          NSLog(@"Can't serialize %@: %@", plist, error);
84          return;
85      }
86      if (![stateData writeToURL:[self urlForStorage] options:NSDataWritingAtomic error:&error]) {
87          NSLog(@"Can't write to %@, error=%@", [self urlForStorage], error);
88      }
89  }
90  
91  @end