Changeset 53 for trunk/Cocoa/Pester/Source/PSAlarms.m
- Timestamp:
- 01/02/03 05:30:03 (21 years ago)
- Location:
- trunk/Cocoa/Pester/Source
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Cocoa/Pester/Source
- Property svn:ignore
-
old new 1 1 build 2 .gdb_history
-
- Property svn:ignore
-
trunk/Cocoa/Pester/Source/PSAlarms.m
r51 r53 9 9 #import "PSAlarms.h" 10 10 #import "PSAlarm.h" 11 #import "NSDictionary-NJRExtensions.h" 12 13 NSString * const PSAlarmImportException = @"PSAlarmImportException"; 11 14 12 15 NSString * const PSAlarmsDidChangeNotification = @"PSAlarmsDidChangeNotification"; 13 16 NSString * const PSAlarmsNextAlarmDidChangeNotification = @"PSAlarmsNextAlarmDidChangeNotification"; 14 17 15 static NSString * const PSPendingAlarms = @"Pester pending alarms"; // NSUserDefaults key 18 // NSUserDefaults key 19 static NSString * const PSPendingAlarms = @"Pester pending alarms"; // 1.0 Ð 1.1a3 20 static NSString * const PSAllAlarms = @"Pester alarms"; // 1.1a4 Ð 21 22 // property list keys 23 static NSString * const PLAlarmsPending = @"pending"; 24 static NSString * const PLAlarmsExpired = @"expired"; 16 25 17 26 static PSAlarms *PSAlarmsAllAlarms = nil; … … 28 37 { 29 38 if (PSAlarmsAllAlarms == nil) { 30 PSAlarmsAllAlarms = [[self alloc] init]; 39 NSDictionary *plAlarms = [[NSUserDefaults standardUserDefaults] objectForKey: PSAllAlarms]; 40 if (plAlarms == nil) { 41 PSAlarmsAllAlarms = [[self alloc] init]; 42 } else { 43 PSAlarmsAllAlarms = [[self alloc] initWithPropertyList: plAlarms]; 44 } 31 45 [PSAlarmsAllAlarms _updateNextAlarm]; // only generate notifications after singleton established 32 46 } … … 37 51 NSAssert(PSAlarmsAllAlarms != nil, @"Attempt to use +[PSAlarms allAlarms] before setup complete"); 38 52 return PSAlarmsAllAlarms; 53 } 54 55 #pragma mark private 56 57 - (void)_changed; 58 { 59 NSMutableArray *alarmsData = [[NSMutableArray alloc] init]; 60 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 61 [self _updateNextAlarm]; 62 // NSLog(@"PSAlarms _changed:\n%@", alarms); 63 [defaults setObject: [self propertyListRepresentation] forKey: PSAllAlarms]; 64 [defaults synchronize]; 65 [alarmsData release]; 66 [[NSNotificationCenter defaultCenter] postNotificationName: PSAlarmsDidChangeNotification object: self]; 67 } 68 69 - (void)_alarmTimerExpired:(NSNotification *)notification; 70 { 71 PSAlarm *alarm = [notification object]; 72 NSLog(@"timer expired: %@ retainCount %d", alarm, [alarm retainCount]); 73 [expiredAlarms addObject: alarm]; 74 NSLog(@"expired alarms: %@", [expiredAlarms description]); 75 [alarms removeObject: alarm]; 76 [self _changed]; 77 } 78 79 - (void)_alarmTimerSet:(NSNotification *)notification; 80 { 81 PSAlarm *alarm = [notification object]; 82 NSLog(@"timer set: %@ retainCount %d", alarm, [alarm retainCount]); 83 [alarms addObject: alarm]; 84 [expiredAlarms removeObject: alarm]; 85 [self _changed]; 86 } 87 88 - (void)_alarmDied:(NSNotification *)notification; 89 { 90 PSAlarm *alarm = [notification object]; 91 NSLog(@"alarm died: %@ retainCount %d", alarm, [alarm retainCount]); 92 [alarms removeObject: alarm]; 93 [expiredAlarms removeObject: alarm]; 94 [self _changed]; 39 95 } 40 96 … … 59 115 } 60 116 117 - (void)_setUpNotifications; 118 { 119 [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(_alarmTimerSet:) name: PSAlarmTimerSetNotification object: nil]; 120 [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(_alarmTimerExpired:) name: PSAlarmTimerExpiredNotification object: nil]; 121 [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(_alarmDied:) name: PSAlarmDiedNotification object: nil]; 122 } 123 124 #pragma mark initialize-release 125 61 126 - (id)init; 62 127 { 63 128 if ( (self = [super init]) != nil) { 64 129 alarms = [[NSMutableArray alloc] init]; 65 NS_DURING 66 NSArray *alarmsData = [[NSUserDefaults standardUserDefaults] arrayForKey: PSPendingAlarms]; 67 NSEnumerator *e = [alarmsData objectEnumerator]; 68 NSData *alarmData; 69 PSAlarm *alarm; 70 while ( (alarmData = [e nextObject]) != nil) { 71 alarm = [NSUnarchiver unarchiveObjectWithData: alarmData]; 72 if (alarm != nil) 73 [alarms addObject: alarm]; 74 } 75 NS_HANDLER 76 // XXX need better error handling here, don't stomp on data 77 NSLog(@"An error occurred while attempting to restore the alarm list: %@", localException); 78 NS_ENDHANDLER 79 [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(_alarmTimerSet:) name: PSAlarmTimerSetNotification object: nil]; 80 [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(_alarmTimerExpired:) name: PSAlarmTimerExpiredNotification object: nil]; 130 expiredAlarms = [[NSMutableSet alloc] init]; 131 [self _setUpNotifications]; 81 132 } 82 133 return self; … … 86 137 { 87 138 [alarms release]; 139 [expiredAlarms release]; 88 140 [[NSNotificationCenter defaultCenter] removeObserver: self]; 89 141 [super dealloc]; 90 142 } 91 143 92 - (void)_changed; 93 { 94 NSMutableArray *alarmsData = [[NSMutableArray alloc] init]; 95 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 96 NSEnumerator *e; 97 PSAlarm *alarm; 98 [self _updateNextAlarm]; 99 // NSLog(@"PSAlarms _changed:\n%@", alarms); 100 // archive 101 e = [alarms objectEnumerator]; 102 while ( (alarm = [e nextObject]) != nil) { 103 [alarmsData addObject: [NSArchiver archivedDataWithRootObject: alarm]]; 104 } 105 [defaults setObject: alarmsData forKey: PSPendingAlarms]; 106 [defaults synchronize]; 107 [alarmsData release]; 108 [[NSNotificationCenter defaultCenter] postNotificationName: PSAlarmsDidChangeNotification object: self]; 109 } 110 111 - (void)_alarmTimerExpired:(NSNotification *)notification; 112 { 113 [alarms removeObject: [notification object]]; 114 [self _changed]; 115 } 116 117 - (void)_alarmTimerSet:(NSNotification *)notification; 118 { 119 [alarms addObject: [notification object]]; 120 [self _changed]; 144 #pragma mark accessing 145 146 - (NSArray *)alarms; 147 { 148 return alarms; 121 149 } 122 150 … … 124 152 { 125 153 return nextAlarm; 126 }127 128 - (NSArray *)alarms;129 {130 return alarms;131 154 } 132 155 … … 185 208 } 186 209 210 #pragma mark property list serialization (Pester 1.1) 211 212 - (NSDictionary *)propertyListRepresentation; 213 { 214 NSMutableArray *plPendingAlarms = [[NSMutableArray alloc] initWithCapacity: [alarms count]]; 215 NSMutableArray *plExpiredAlarms = [[NSMutableArray alloc] initWithCapacity: [expiredAlarms count]]; 216 NSDictionary *plAllAlarms, *plAlarm; 217 NSEnumerator *e; 218 PSAlarm *alarm; 219 220 e = [alarms objectEnumerator]; 221 while ( (alarm = [e nextObject]) != nil) { 222 plAlarm = [alarm propertyListRepresentation]; 223 if (plAlarm != nil) 224 [plPendingAlarms addObject: plAlarm]; 225 } 226 227 e = [expiredAlarms objectEnumerator]; 228 while ( (alarm = [e nextObject]) != nil) { 229 plAlarm = [alarm propertyListRepresentation]; 230 if (plAlarm != nil) 231 [plExpiredAlarms addObject: plAlarm]; 232 } 233 234 plAllAlarms = [NSDictionary dictionaryWithObjectsAndKeys: 235 plPendingAlarms, PLAlarmsPending, plExpiredAlarms, PLAlarmsExpired, nil]; 236 [plPendingAlarms release]; 237 [plExpiredAlarms release]; 238 239 return plAllAlarms; 240 } 241 242 - (id)initWithPropertyList:(NSDictionary *)dict; 243 { 244 if ( (self = [super init]) != nil) { 245 NSArray *plPendingAlarms = [dict objectForRequiredKey: PLAlarmsPending]; 246 NSArray *plExpiredAlarms = [dict objectForRequiredKey: PLAlarmsExpired]; 247 NSEnumerator *e; 248 NSDictionary *plAlarm; 249 PSAlarm *alarm; 250 251 alarms = [[NSMutableArray alloc] initWithCapacity: [plPendingAlarms count]]; 252 e = [plPendingAlarms objectEnumerator]; 253 while ( (plAlarm = [e nextObject]) != nil) { 254 [alarms addObject: [[PSAlarm alloc] initWithPropertyList: plAlarm]]; 255 } 256 257 e = [plExpiredAlarms objectEnumerator]; 258 while ( (plAlarm = [e nextObject]) != nil) { 259 // expired alarms may be just that, or they may have outstanding repeats - if the latter, PSAlarm will reschedule the alarm. 260 if ( (alarm = [[PSAlarm alloc] initWithPropertyList: plAlarm]) != nil) 261 [alarms addObject: alarm]; 262 } 263 expiredAlarms = [[NSMutableSet alloc] init]; 264 265 [self _setUpNotifications]; 266 } 267 return self; 268 } 269 270 #pragma mark archiving (Pester 1.0) 271 272 - (unsigned)countOfVersion1Alarms; 273 { 274 return [[[NSUserDefaults standardUserDefaults] objectForKey: PSPendingAlarms] count]; 275 } 276 277 - (void)discardVersion1Alarms; 278 { 279 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 280 [defaults removeObjectForKey: PSPendingAlarms]; 281 [defaults synchronize]; 282 } 283 284 - (void)importVersion1Alarms; 285 { 286 NSArray *alarmsData = [[NSUserDefaults standardUserDefaults] arrayForKey: PSPendingAlarms]; 287 NSEnumerator *e = [alarmsData objectEnumerator]; 288 NSData *alarmData; 289 PSAlarm *alarm; 290 while ( (alarmData = [e nextObject]) != nil) { 291 NS_DURING 292 alarm = [NSUnarchiver unarchiveObjectWithData: alarmData]; 293 NS_HANDLER 294 alarm = nil; 295 // XXX 296 NS_ENDHANDLER 297 if (alarm != nil) 298 [alarms addObject: alarm]; 299 } 300 } 301 187 302 @end
Note:
See TracChangeset
for help on using the changeset viewer.