diff --git a/src/darwin/Framework/CHIP/MTRDevice.mm b/src/darwin/Framework/CHIP/MTRDevice.mm index 63555c8ebb82b9..7633d03ebd2d3b 100644 --- a/src/darwin/Framework/CHIP/MTRDevice.mm +++ b/src/darwin/Framework/CHIP/MTRDevice.mm @@ -201,10 +201,10 @@ - (void)_addDelegate:(id)delegate queue:(dispatch_queue_t)que MTR_LOG("%@ added delegate info %@", self, newDelegateInfo); // Call hook to allow subclasses to act on delegate addition. - [self _delegateAdded]; + [self _delegateAdded:delegate]; } -- (void)_delegateAdded +- (void)_delegateAdded:(id)delegate { os_unfair_lock_assert_owner(&self->_lock); @@ -233,6 +233,16 @@ - (void)removeDelegate:(id)delegate [_delegates minusSet:delegatesToRemove]; MTR_LOG("%@ removeDelegate: removed %lu", self, static_cast(_delegates.count - oldDelegatesCount)); } + + // Call hook to allow subclasses to act on delegate addition. + [self _delegateRemoved:delegate]; +} + +- (void)_delegateRemoved:(id)delegate +{ + os_unfair_lock_assert_owner(&self->_lock); + + // Nothing to do for now. At the moment this is a hook for subclasses. } - (void)invalidate diff --git a/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm b/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm index ac8fa523416f80..4871b1b129b699 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm @@ -18,6 +18,7 @@ #import "MTRDefines_Internal.h" #import "MTRDeviceController_Internal.h" +#import "MTRDevice_Internal.h" #import "MTRDevice_XPC.h" #import "MTRDevice_XPC_Internal.h" #import "MTRError_Internal.h" @@ -77,10 +78,13 @@ - (void)_updateRegistrationInfo NSMutableArray * nodeIDs = [NSMutableArray array]; for (NSNumber * nodeID in [self.nodeIDToDeviceMap keyEnumerator]) { - NSMutableDictionary * nodeDictionary = [NSMutableDictionary dictionary]; - MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationNodeIDKey, nodeID, nodeDictionary) + MTRDevice * device = [self _deviceForNodeID:nodeID createIfNeeded:NO]; + if ([device _delegateExists]) { + NSMutableDictionary * nodeDictionary = [NSMutableDictionary dictionary]; + MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationNodeIDKey, nodeID, nodeDictionary) - [nodeIDs addObject:nodeDictionary]; + [nodeIDs addObject:nodeDictionary]; + } } MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationNodeIDsKey, nodeIDs, registrationInfo) MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationControllerContextKey, controllerContext, registrationInfo) @@ -386,8 +390,6 @@ - (MTRDevice *)_setupDeviceForNodeID:(NSNumber *)nodeID prefetchedClusterData:(N [self.nodeIDToDeviceMap setObject:deviceToReturn forKey:nodeID]; MTR_LOG("%s: returning XPC device for node id %@", __PRETTY_FUNCTION__, nodeID); - [self _updateRegistrationInfo]; - return deviceToReturn; } diff --git a/src/darwin/Framework/CHIP/MTRDeviceController_XPC_Internal.h b/src/darwin/Framework/CHIP/MTRDeviceController_XPC_Internal.h index e6c85b1f8de348..347038f3ae3c0c 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController_XPC_Internal.h +++ b/src/darwin/Framework/CHIP/MTRDeviceController_XPC_Internal.h @@ -19,5 +19,6 @@ @interface MTRDeviceController_XPC (Internal) - (id)initWithMachServiceName:(NSString *)machServiceName options:(NSXPCConnectionOptions)options; +- (void)_updateRegistrationInfo; @end diff --git a/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm b/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm index 0cb81e6b3f56dc..afbb41ff8da409 100644 --- a/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm +++ b/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm @@ -884,11 +884,11 @@ - (BOOL)_subscriptionsAllowed return self.suspended == NO && ![_deviceController isKindOfClass:MTRDeviceControllerOverXPC.class]; } -- (void)_delegateAdded +- (void)_delegateAdded:(id)delegate { os_unfair_lock_assert_owner(&self->_lock); - [super _delegateAdded]; + [super _delegateAdded:delegate]; [self _ensureSubscriptionForExistingDelegates:@"delegate is set"]; } diff --git a/src/darwin/Framework/CHIP/MTRDevice_Internal.h b/src/darwin/Framework/CHIP/MTRDevice_Internal.h index 8db681d4802e60..1887ddc3cb27b6 100644 --- a/src/darwin/Framework/CHIP/MTRDevice_Internal.h +++ b/src/darwin/Framework/CHIP/MTRDevice_Internal.h @@ -149,7 +149,8 @@ MTR_DIRECT_MEMBERS - (BOOL)_delegateExists; // Must be called by subclasses or MTRDevice implementation only. -- (void)_delegateAdded; +- (void)_delegateAdded:(id)delegate; +- (void)_delegateRemoved:(id)delegate; #ifdef DEBUG // Only used for unit test purposes - normal delegate should not expect or handle being called back synchronously diff --git a/src/darwin/Framework/CHIP/MTRDevice_XPC.mm b/src/darwin/Framework/CHIP/MTRDevice_XPC.mm index 77b55f315c6658..77fa823a24eb5a 100644 --- a/src/darwin/Framework/CHIP/MTRDevice_XPC.mm +++ b/src/darwin/Framework/CHIP/MTRDevice_XPC.mm @@ -22,6 +22,7 @@ #import #import "MTRDeviceController_Internal.h" +#import "MTRDeviceController_XPC_Internal.h" #import "MTRAsyncWorkQueue.h" #import "MTRAttestationTrustStoreBridge.h" @@ -146,6 +147,22 @@ - (MTRNetworkCommissioningFeature)networkCommissioningFeatures return [[self._internalState objectForKey:kMTRDeviceInternalPropertyNetworkFeatures] unsignedIntValue]; } +#pragma mark - Delegate added/removed callbacks + +- (void)_delegateAdded:(id)delegate +{ + [super _delegateAdded:delegate]; + MTR_LOG("%@ delegate added: %@", self, delegate); + [(MTRDeviceController_XPC *) [self deviceController] _updateRegistrationInfo]; +} + +- (void)_delegateRemoved:(id)delegate +{ + [super _delegateRemoved:delegate]; + MTR_LOG("%@ delegate removed: %@", self, delegate); + [(MTRDeviceController_XPC *) [self deviceController] _updateRegistrationInfo]; +} + #pragma mark - Client Callbacks (MTRDeviceDelegate) // required methods for MTRDeviceDelegates