Ignore:
Timestamp:
01/02/03 05:30:03 (21 years ago)
Author:
Nicholas Riley
Message:

Updated for Pester 1.1a5 (very limited release).

Pester 1.1a4 was never released.

Location:
trunk/Cocoa/Pester/Source
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Cocoa/Pester/Source

    • Property svn:ignore
      •  

        old new  
        11build
         2.gdb_history
  • trunk/Cocoa/Pester/Source/PSAlarms.m

    r51 r53  
    99#import "PSAlarms.h"
    1010#import "PSAlarm.h"
     11#import "NSDictionary-NJRExtensions.h"
     12
     13NSString * const PSAlarmImportException = @"PSAlarmImportException";
    1114
    1215NSString * const PSAlarmsDidChangeNotification = @"PSAlarmsDidChangeNotification";
    1316NSString * const PSAlarmsNextAlarmDidChangeNotification = @"PSAlarmsNextAlarmDidChangeNotification";
    1417
    15 static NSString * const PSPendingAlarms = @"Pester pending alarms"; // NSUserDefaults key
     18// NSUserDefaults key
     19static NSString * const PSPendingAlarms = @"Pester pending alarms"; // 1.0 Ð 1.1a3
     20static NSString * const PSAllAlarms = @"Pester alarms"; // 1.1a4 Ð
     21
     22// property list keys
     23static NSString * const PLAlarmsPending = @"pending";
     24static NSString * const PLAlarmsExpired = @"expired";
    1625
    1726static PSAlarms *PSAlarmsAllAlarms = nil;
     
    2837{
    2938    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        }
    3145        [PSAlarmsAllAlarms _updateNextAlarm]; // only generate notifications after singleton established
    3246    }
     
    3751    NSAssert(PSAlarmsAllAlarms != nil, @"Attempt to use +[PSAlarms allAlarms] before setup complete");
    3852    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];
    3995}
    4096
     
    59115}
    60116
     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
    61126- (id)init;
    62127{
    63128    if ( (self = [super init]) != nil) {
    64129        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];
    81132    }
    82133    return self;
     
    86137{
    87138    [alarms release];
     139    [expiredAlarms release];
    88140    [[NSNotificationCenter defaultCenter] removeObserver: self];
    89141    [super dealloc];
    90142}
    91143
    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;
    121149}
    122150
     
    124152{
    125153    return nextAlarm;
    126 }
    127 
    128 - (NSArray *)alarms;
    129 {
    130     return alarms;
    131154}
    132155
     
    185208}
    186209
     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
    187302@end
Note: See TracChangeset for help on using the changeset viewer.