Skip to content

Commit d654fec

Browse files
Mark setupDeviceForNodeID: on MTRDeviceController as abstract.
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 204b1fb commit d654fec

4 files changed

+7
-61
lines changed

src/darwin/Framework/CHIP/MTRDeviceController.mm

+2-36
Original file line numberDiff line numberDiff line change
@@ -1190,44 +1190,10 @@ - (MTRBaseDevice *)baseDeviceForNodeID:(NSNumber *)nodeID
11901190
return [[MTRBaseDevice alloc] initWithNodeID:nodeID controller:self];
11911191
}
11921192

1193-
// If prefetchedClusterData is not provided, load attributes individually from controller data store
11941193
- (MTRDevice *)_setupDeviceForNodeID:(NSNumber *)nodeID prefetchedClusterData:(NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> *)prefetchedClusterData
11951194
{
1196-
os_unfair_lock_assert_owner(self.deviceMapLock);
1197-
1198-
MTRDevice * deviceToReturn = [[MTRDevice_Concrete alloc] initWithNodeID:nodeID controller:self];
1199-
// If we're not running, don't add the device to our map. That would
1200-
// create a cycle that nothing would break. Just return the device,
1201-
// which will be in exactly the state it would be in if it were created
1202-
// while we were running and then we got shut down.
1203-
if ([self isRunning]) {
1204-
[_nodeIDToDeviceMap setObject:deviceToReturn forKey:nodeID];
1205-
}
1206-
1207-
if (prefetchedClusterData) {
1208-
if (prefetchedClusterData.count) {
1209-
[deviceToReturn setPersistedClusterData:prefetchedClusterData];
1210-
}
1211-
} else if (_controllerDataStore) {
1212-
// Load persisted cluster data if they exist.
1213-
NSDictionary * clusterData = [_controllerDataStore getStoredClusterDataForNodeID:nodeID];
1214-
MTR_LOG("%@ Loaded %lu cluster data from storage for %@", self, static_cast<unsigned long>(clusterData.count), deviceToReturn);
1215-
if (clusterData.count) {
1216-
[deviceToReturn setPersistedClusterData:clusterData];
1217-
}
1218-
}
1219-
1220-
// TODO: Figure out how to get the device data as part of our bulk-read bits.
1221-
if (_controllerDataStore) {
1222-
auto * deviceData = [_controllerDataStore getStoredDeviceDataForNodeID:nodeID];
1223-
if (deviceData.count) {
1224-
[deviceToReturn setPersistedDeviceData:deviceData];
1225-
}
1226-
}
1227-
1228-
[deviceToReturn setStorageBehaviorConfiguration:_storageBehaviorConfiguration];
1229-
1230-
return deviceToReturn;
1195+
MTR_ABSTRACT_METHOD();
1196+
return nil;
12311197
}
12321198

12331199
- (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
@@ -298,6 +298,10 @@ NS_ASSUME_NONNULL_BEGIN
298298
#pragma mark - Device-specific data and SDK access
299299
// DeviceController will act as a central repository for this opaque dictionary that MTRDevice manages
300300
- (MTRDevice *)deviceForNodeID:(NSNumber *)nodeID;
301+
/**
302+
* _setupDeviceForNodeID is a hook expected to be implemented by subclasses to
303+
* actually allocate a device object of the right type.
304+
*/
301305
- (MTRDevice *)_setupDeviceForNodeID:(NSNumber *)nodeID prefetchedClusterData:(nullable NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> *)prefetchedClusterData;
302306
- (void)removeDevice:(MTRDevice *)device;
303307

0 commit comments

Comments
 (0)