Changeset 28 for trunk/Cocoa/Pester/Source/PSAlarms.m
- Timestamp:
- 10/20/02 06:40:54 (22 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Cocoa/Pester/Source/PSAlarms.m
r26 r28 11 11 12 12 NSString * const PSAlarmsDidChangeNotification = @"PSAlarmsDidChangeNotification"; 13 NSString * const PSAlarmsNextAlarmDidChangeNotification = @"PSAlarmsNextAlarmDidChangeNotification"; 13 14 14 15 static NSString * const PSPendingAlarms = @"Pester pending alarms"; // NSUserDefaults key … … 16 17 static PSAlarms *PSAlarmsAllAlarms = nil; 17 18 19 @interface PSAlarms (Private) 20 21 - (void)_updateNextAlarm; 22 23 @end 24 18 25 @implementation PSAlarms 19 26 20 + (void)setUp; // XXX if you can think of a better name, please be my guest.27 + (void)setUp; 21 28 { 22 29 if (PSAlarmsAllAlarms == nil) { 23 30 PSAlarmsAllAlarms = [[self alloc] init]; 31 [PSAlarmsAllAlarms _updateNextAlarm]; // only generate notifications after singleton established 24 32 } 25 33 } … … 27 35 + (PSAlarms *)allAlarms; 28 36 { 37 NSAssert(PSAlarmsAllAlarms != nil, @"Attempt to use +[PSAlarms allAlarms] before setup complete"); 29 38 return PSAlarmsAllAlarms; 39 } 40 41 - (void)_updateNextAlarm; 42 { 43 NSEnumerator *e; 44 PSAlarm *alarm, *oldNextAlarm = nextAlarm; 45 [nextAlarm release]; 46 nextAlarm = nil; 47 // sort alarms so earliest is first 48 [alarms sortUsingSelector: @selector(compare:)]; 49 // find first un-expired alarm 50 e = [alarms objectEnumerator]; 51 while ( (alarm = [e nextObject]) != nil) { 52 if ([alarm isValid]) { 53 nextAlarm = [alarm retain]; 54 break; 55 } 56 } 57 if (oldNextAlarm != nextAlarm) 58 [[NSNotificationCenter defaultCenter] postNotificationName: PSAlarmsNextAlarmDidChangeNotification object: nextAlarm]; 30 59 } 31 60 … … 33 62 { 34 63 if ( (self = [super init]) != nil) { 64 alarms = [[NSMutableArray alloc] init]; 35 65 NS_DURING 36 NSData *alarmData = [[NSUserDefaults standardUserDefaults] dataForKey: PSPendingAlarms]; 37 if (alarmData != nil) { 38 alarms = [[NSUnarchiver unarchiveObjectWithData: alarmData] retain]; 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]; 39 74 } 40 75 NS_HANDLER … … 42 77 NSLog(@"An error occurred while attempting to restore the alarm list: %@", localException); 43 78 NS_ENDHANDLER 44 if (alarms == nil) alarms = [[NSMutableArray alloc] init];45 79 [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(_alarmTimerSet:) name: PSAlarmTimerSetNotification object: nil]; 46 80 [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(_alarmTimerExpired:) name: PSAlarmTimerExpiredNotification object: nil]; … … 51 85 - (void)dealloc; 52 86 { 53 [alarms dealloc];87 [alarms release]; 54 88 [[NSNotificationCenter defaultCenter] removeObserver: self]; 55 89 [super dealloc]; … … 58 92 - (void)_changed; 59 93 { 60 NS Data *alarmData;94 NSMutableArray *alarmsData = [[NSMutableArray alloc] init]; 61 95 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 62 [alarms sortUsingSelector: @selector(compare:)]; 63 alarmData = [NSArchiver archivedDataWithRootObject: alarms]; 64 [defaults setObject: alarmData forKey: PSPendingAlarms]; 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]; 65 106 [defaults synchronize]; 66 // NSLog(@"PSAlarms changed: %@", alarms);107 [alarmsData release]; 67 108 [[NSNotificationCenter defaultCenter] postNotificationName: PSAlarmsDidChangeNotification object: self]; 68 109 } … … 80 121 } 81 122 123 - (PSAlarm *)nextAlarm; 124 { 125 return nextAlarm; 126 } 127 82 128 - (int)alarmCount; 83 129 { … … 92 138 - (void)removeAlarmAtIndex:(int)index; 93 139 { 140 [(PSAlarm *)[alarms objectAtIndex: index] cancel]; 94 141 [alarms removeObjectAtIndex: index]; 95 142 } … … 99 146 NSEnumerator *e = [indices objectEnumerator]; 100 147 NSNumber *n; 101 int indexCount = [indices count], i = 0 ;148 int indexCount = [indices count], i = 0, alarmIndex; 102 149 int *indexArray = (int *)malloc(indexCount * sizeof(int)); 103 150 NS_DURING 104 151 while ( (n = [e nextObject]) != nil) { 105 indexArray[i] = [n intValue]; 152 alarmIndex = [n intValue]; 153 [(PSAlarm *)[alarms objectAtIndex: alarmIndex] cancel]; 154 indexArray[i] = alarmIndex; 106 155 i++; 107 156 }
Note:
See TracChangeset
for help on using the changeset viewer.