Fixed MYAddressLookup to allocate an NSSet, and to send correct KV notifications. (Based on Jim Roepke's patch, but outsourcing the KV grunge to CollectionUtils.)
authorJens Alfke <jens@mooseyard.com>
Sun May 10 19:00:50 2009 -0700 (2009-05-10)
changeset 458efb48eabd08
parent 42 c1cf9df64c70
child 46 50dc5502ef46
Fixed MYAddressLookup to allocate an NSSet, and to send correct KV notifications. (Based on Jim Roepke's patch, but outsourcing the KV grunge to CollectionUtils.)
Bonjour/MYAddressLookup.m
Bonjour/MYBonjourBrowser.m
MYNetwork.xcodeproj/project.pbxproj
     1.1 --- a/Bonjour/MYAddressLookup.m	Tue May 05 22:19:33 2009 -0700
     1.2 +++ b/Bonjour/MYAddressLookup.m	Sun May 10 19:00:50 2009 -0700
     1.3 @@ -25,7 +25,7 @@
     1.4              return nil;
     1.5          }
     1.6          _hostname = [hostname copy];
     1.7 -        _addresses = [[NSMutableArray alloc] init];
     1.8 +        _addresses = [[NSMutableSet alloc] init];
     1.9      }
    1.10      return self;
    1.11  }
    1.12 @@ -62,10 +62,10 @@
    1.13      if (address) {
    1.14          if (flags & kDNSServiceFlagsAdd) {
    1.15              LogTo(DNS,@"%@ got %@ [TTL = %u]", self, address, ttl);
    1.16 -            [_addresses addObject: address];
    1.17 +            kvAddToSet(self, @"addresses", _addresses, address);
    1.18          } else {
    1.19              LogTo(DNS,@"%@ lost %@ [TTL = %u]", self, address, ttl);
    1.20 -            [_addresses removeObject: address];
    1.21 +            kvRemoveFromSet(self, @"addresses", _addresses, address);
    1.22          }
    1.23          [address release];
    1.24      }
    1.25 @@ -96,7 +96,7 @@
    1.26  
    1.27  
    1.28  - (DNSServiceErrorType) createServiceRef: (DNSServiceRef*)sdRefPtr {
    1.29 -    [_addresses removeAllObjects];
    1.30 +    kvSetSet(self, @"addresses", _addresses, nil);
    1.31      return DNSServiceGetAddrInfo(sdRefPtr,
    1.32                                   kDNSServiceFlagsShareConnection,
    1.33                                   _interfaceIndex, 0,
     2.1 --- a/Bonjour/MYBonjourBrowser.m	Tue May 05 22:19:33 2009 -0700
     2.2 +++ b/Bonjour/MYBonjourBrowser.m	Sun May 10 19:00:50 2009 -0700
     2.3 @@ -200,6 +200,7 @@
     2.4  
     2.5  
     2.6  
     2.7 +
     2.8  #pragma mark -
     2.9  #pragma mark TESTING:
    2.10  
    2.11 @@ -221,8 +222,12 @@
    2.12      self = [super init];
    2.13      if (self != nil) {
    2.14          _browser = [[MYBonjourBrowser alloc] initWithServiceType: @"_presence._tcp"];
    2.15 -        [_browser addObserver: self forKeyPath: @"services" options: NSKeyValueObservingOptionNew context: NULL];
    2.16 -        [_browser addObserver: self forKeyPath: @"browsing" options: NSKeyValueObservingOptionNew context: NULL];
    2.17 +        [_browser addObserver: self forKeyPath: @"services" 
    2.18 +                      options: NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew 
    2.19 +                      context: NULL];
    2.20 +        [_browser addObserver: self forKeyPath: @"browsing" 
    2.21 +                      options: NSKeyValueObservingOptionNew
    2.22 +                      context: NULL];
    2.23          [_browser start];
    2.24          
    2.25          MYBonjourRegistration *myReg = _browser.myRegistration;
    2.26 @@ -243,7 +248,7 @@
    2.27  
    2.28  - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    2.29  {
    2.30 -    LogTo(Bonjour,@"Observed change in %@: %@",keyPath,change);
    2.31 +    Log(@"Observed change in %@: %@",keyPath,change);
    2.32      if( $equal(keyPath,@"services") ) {
    2.33          if( [[change objectForKey: NSKeyValueChangeKindKey] intValue]==NSKeyValueChangeInsertion ) {
    2.34              NSSet *newServices = [change objectForKey: NSKeyValueChangeNewKey];
    2.35 @@ -252,8 +257,18 @@
    2.36                  Log(@"##### %@ : at %@:%hu, TXT=%@", 
    2.37                        service, hostname, service.port, service.txtRecord);
    2.38                  service.addressLookup.continuous = YES;
    2.39 +                [service.addressLookup addObserver: self
    2.40 +                                        forKeyPath: @"addresses"
    2.41 +                                           options: NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew
    2.42 +                                           context: NULL];
    2.43                  [service queryForRecord: kDNSServiceType_NULL];
    2.44              }
    2.45 +        } else if( [[change objectForKey: NSKeyValueChangeKindKey] intValue]==NSKeyValueChangeRemoval ) {
    2.46 +            NSSet *oldServices = [change objectForKey: NSKeyValueChangeOldKey];
    2.47 +            for( MYBonjourService *service in oldServices ) {
    2.48 +                Log(@"##### REMOVED: %@", service);
    2.49 +                [service.addressLookup removeObserver: self forKeyPath: @"addresses"];
    2.50 +            }
    2.51          }
    2.52      }
    2.53  }
     3.1 --- a/MYNetwork.xcodeproj/project.pbxproj	Tue May 05 22:19:33 2009 -0700
     3.2 +++ b/MYNetwork.xcodeproj/project.pbxproj	Sun May 10 19:00:50 2009 -0700
     3.3 @@ -351,23 +351,23 @@
     3.4  		270461220DE49055003D9D3F /* MYUtilities */ = {
     3.5  			isa = PBXGroup;
     3.6  			children = (
     3.7 +				270461880DE49634003D9D3F /* CollectionUtils.h */,
     3.8 +				270461870DE49634003D9D3F /* CollectionUtils.m */,
     3.9  				278C1BB50F9F975700954AE1 /* ConcurrentOperation.h */,
    3.10  				278C1BB60F9F975700954AE1 /* ConcurrentOperation.m */,
    3.11 -				270462C10DE4A64B003D9D3F /* MYUtilitiesTest_main.m */,
    3.12 -				270462C00DE4A639003D9D3F /* MYUtilities_Prefix.pch */,
    3.13 -				270461880DE49634003D9D3F /* CollectionUtils.h */,
    3.14 -				270461870DE49634003D9D3F /* CollectionUtils.m */,
    3.15  				270461360DE4918D003D9D3F /* ExceptionUtils.h */,
    3.16  				270461350DE4918D003D9D3F /* ExceptionUtils.m */,
    3.17 +				27E0DBEC0DF3450F00E7F648 /* GoogleToolboxSubset */,
    3.18  				2704612B0DE49088003D9D3F /* Logging.h */,
    3.19  				2704612A0DE49088003D9D3F /* Logging.m */,
    3.20 +				274122DD0F9CDD1600F21842 /* MYUtilities_Debug.xcconfig */,
    3.21 +				270462C00DE4A639003D9D3F /* MYUtilities_Prefix.pch */,
    3.22 +				274122DE0F9CDD1600F21842 /* MYUtilities_Release.xcconfig */,
    3.23 +				270462C10DE4A64B003D9D3F /* MYUtilitiesTest_main.m */,
    3.24  				270461450DE491A6003D9D3F /* Target.h */,
    3.25  				270461460DE491A6003D9D3F /* Target.m */,
    3.26  				270461290DE49088003D9D3F /* Test.h */,
    3.27  				270461280DE49088003D9D3F /* Test.m */,
    3.28 -				274122DD0F9CDD1600F21842 /* MYUtilities_Debug.xcconfig */,
    3.29 -				274122DE0F9CDD1600F21842 /* MYUtilities_Release.xcconfig */,
    3.30 -				27E0DBEC0DF3450F00E7F648 /* GoogleToolboxSubset */,
    3.31  			);
    3.32  			name = MYUtilities;
    3.33  			sourceTree = MYUtilities;