Skip to content

Commit d3428a1

Browse files
Mark setupDeviceForNodeID: on MTRDeviceController as abstract. (#35679)
This is overridden by the XPC and Concrete implementations. Also, there is no need to override deviceForNodeID and removeDevice in MTRDeviceController_Concrete, so those overrides are removed.
1 parent dffaaf0 commit d3428a1

4 files changed

+7
-61
lines changed

src/darwin/Framework/CHIP/MTRDeviceController.mm

+2-36
Original file line numberDiff line numberDiff line change
@@ -780,44 +780,10 @@ - (MTRBaseDevice *)baseDeviceForNodeID:(NSNumber *)nodeID
780780
return [[MTRBaseDevice alloc] initWithNodeID:nodeID controller:self];
781781
}
782782

783-
// If prefetchedClusterData is not provided, load attributes individually from controller data store
784783
- (MTRDevice *)_setupDeviceForNodeID:(NSNumber *)nodeID prefetchedClusterData:(NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> *)prefetchedClusterData
785784
{
786-
os_unfair_lock_assert_owner(self.deviceMapLock);
787-
788-
MTRDevice * deviceToReturn = [[MTRDevice_Concrete alloc] initWithNodeID:nodeID controller:self];
789-
// If we're not running, don't add the device to our map. That would
790-
// create a cycle that nothing would break. Just return the device,
791-
// which will be in exactly the state it would be in if it were created
792-
// while we were running and then we got shut down.
793-
if ([self isRunning]) {
794-
[_nodeIDToDeviceMap setObject:deviceToReturn forKey:nodeID];
795-
}
796-
797-
if (prefetchedClusterData) {
798-
if (prefetchedClusterData.count) {
799-
[deviceToReturn setPersistedClusterData:prefetchedClusterData];
800-
}
801-
} else if (_controllerDataStore) {
802-
// Load persisted cluster data if they exist.
803-
NSDictionary * clusterData = [_controllerDataStore getStoredClusterDataForNodeID:nodeID];
804-
MTR_LOG("%@ Loaded %lu cluster data from storage for %@", self, static_cast<unsigned long>(clusterData.count), deviceToReturn);
805-
if (clusterData.count) {
806-
[deviceToReturn setPersistedClusterData:clusterData];
807-
}
808-
}
809-
810-
// TODO: Figure out how to get the device data as part of our bulk-read bits.
811-
if (_controllerDataStore) {
812-
auto * deviceData = [_controllerDataStore getStoredDeviceDataForNodeID:nodeID];
813-
if (deviceData.count) {
814-
[deviceToReturn setPersistedDeviceData:deviceData];
815-
}
816-
}
817-
818-
[deviceToReturn setStorageBehaviorConfiguration:_storageBehaviorConfiguration];
819-
820-
return deviceToReturn;
785+
MTR_ABSTRACT_METHOD();
786+
return nil;
821787
}
822788

823789
- (MTRDevice *)deviceForNodeID:(NSNumber *)nodeID

src/darwin/Framework/CHIP/MTRDeviceControllerParameters.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ MTR_NEWLY_AVAILABLE
166166
/**
167167
* A controller created from this way will connect to a remote instance of an MTRDeviceController loaded in an XPC Service
168168
*
169-
* @param xpcConnectionBlock The XPC Connection block that will return an NSXPCConnection to the indended listener.
169+
* @param xpcConnectionBlock The XPC Connection block that will return an NSXPCConnection to the intended listener.
170170
*
171171
* @param uniqueIdentifier The unique id to assign to the controller.
172172
*

src/darwin/Framework/CHIP/MTRDeviceController_Concrete.mm

-24
Original file line numberDiff line numberDiff line change
@@ -1193,30 +1193,6 @@ - (MTRDevice *)_setupDeviceForNodeID:(NSNumber *)nodeID prefetchedClusterData:(N
11931193
return deviceToReturn;
11941194
}
11951195

1196-
- (MTRDevice *)deviceForNodeID:(NSNumber *)nodeID
1197-
{
1198-
std::lock_guard lock(*self.deviceMapLock);
1199-
MTRDevice * deviceToReturn = [self.nodeIDToDeviceMap objectForKey:nodeID];
1200-
if (!deviceToReturn) {
1201-
deviceToReturn = [self _setupDeviceForNodeID:nodeID prefetchedClusterData:nil];
1202-
}
1203-
1204-
return deviceToReturn;
1205-
}
1206-
1207-
- (void)removeDevice:(MTRDevice *)device
1208-
{
1209-
std::lock_guard lock(*self.deviceMapLock);
1210-
auto * nodeID = device.nodeID;
1211-
MTRDevice * deviceToRemove = [self.nodeIDToDeviceMap objectForKey:nodeID];
1212-
if (deviceToRemove == device) {
1213-
[deviceToRemove invalidate];
1214-
[self.nodeIDToDeviceMap removeObjectForKey:nodeID];
1215-
} else {
1216-
MTR_LOG_ERROR("%@ Error: Cannot remove device %p with nodeID %llu", self, device, nodeID.unsignedLongLongValue);
1217-
}
1218-
}
1219-
12201196
#ifdef DEBUG
12211197
- (NSDictionary<NSNumber *, NSNumber *> *)unitTestGetDeviceAttributeCounts
12221198
{

src/darwin/Framework/CHIP/MTRDeviceController_Internal.h

+4
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,10 @@ NS_ASSUME_NONNULL_BEGIN
268268
#pragma mark - Device-specific data and SDK access
269269
// DeviceController will act as a central repository for this opaque dictionary that MTRDevice manages
270270
- (MTRDevice *)deviceForNodeID:(NSNumber *)nodeID;
271+
/**
272+
* _setupDeviceForNodeID is a hook expected to be implemented by subclasses to
273+
* actually allocate a device object of the right type.
274+
*/
271275
- (MTRDevice *)_setupDeviceForNodeID:(NSNumber *)nodeID prefetchedClusterData:(nullable NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> *)prefetchedClusterData;
272276
- (void)removeDevice:(MTRDevice *)device;
273277

0 commit comments

Comments
 (0)