Skip to content

Commit 8318df9

Browse files
Clean up MTRDeviceController initWithParameters dispatch. (project-chip#35677)
1 parent 9491d8f commit 8318df9

5 files changed

+45
-61
lines changed

src/darwin/Framework/CHIP/MTRDeviceController.mm

+22-9
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@
3232
#import "MTRDeviceControllerLocalTestStorage.h"
3333
#import "MTRDeviceControllerStartupParams.h"
3434
#import "MTRDeviceControllerStartupParams_Internal.h"
35+
#import "MTRDeviceControllerXPCParameters.h"
3536
#import "MTRDeviceController_Concrete.h"
3637
#import "MTRDeviceController_XPC.h"
38+
#import "MTRDeviceController_XPC_Internal.h"
3739
#import "MTRDevice_Concrete.h"
3840
#import "MTRDevice_Internal.h"
3941
#import "MTRError_Internal.h"
@@ -190,20 +192,31 @@ - (instancetype)initForSubclasses:(BOOL)startSuspended
190192

191193
- (nullable MTRDeviceController *)initWithParameters:(MTRDeviceControllerAbstractParameters *)parameters error:(NSError * __autoreleasing *)error
192194
{
195+
// Dispatch to the right non-abstract implementation.
193196
if ([parameters isKindOfClass:MTRXPCDeviceControllerParameters.class]) {
194197
MTR_LOG("Starting up with XPC Device Controller Parameters: %@", parameters);
195198
return [[MTRDeviceController_XPC alloc] initWithParameters:parameters error:error];
196-
} else if (![parameters isKindOfClass:MTRDeviceControllerParameters.class]) {
197-
MTR_LOG_ERROR("Unsupported type of MTRDeviceControllerAbstractParameters: %@", parameters);
198-
if (error) {
199-
*error = [MTRError errorForCHIPErrorCode:CHIP_ERROR_INVALID_ARGUMENT];
200-
}
201-
return nil;
202199
}
203-
auto * controllerParameters = static_cast<MTRDeviceControllerParameters *>(parameters);
204200

205-
// MTRDeviceControllerFactory will auto-start in per-controller-storage mode if necessary
206-
return [MTRDeviceControllerFactory.sharedInstance initializeController:[MTRDeviceController_Concrete alloc] withParameters:controllerParameters error:error];
201+
if ([parameters isKindOfClass:MTRDeviceControllerMachServiceXPCParameters.class]) {
202+
// TODO: This will need to at least pass in the uniqueIdentifier, no? initWithMachServiceName:options: seems to
203+
// be declared but not actually implemented...
204+
auto * xpcParameters = static_cast<MTRDeviceControllerMachServiceXPCParameters *>(parameters);
205+
206+
MTR_LOG("Starting up with Mach Service XPC Device Controller Parameters: %@", parameters);
207+
return [[MTRDeviceController_XPC alloc] initWithMachServiceName:xpcParameters.machServiceName options:xpcParameters.connectionOptions];
208+
}
209+
210+
if ([parameters isKindOfClass:MTRDeviceControllerParameters.class]) {
211+
MTR_LOG("Starting up with Device Controller Parameters: %@", parameters);
212+
return [[MTRDeviceController_Concrete alloc] initWithParameters:parameters error:error];
213+
}
214+
215+
MTR_LOG_ERROR("Unsupported type of MTRDeviceControllerAbstractParameters: %@", parameters);
216+
if (error) {
217+
*error = [MTRError errorForCHIPErrorCode:CHIP_ERROR_INVALID_ARGUMENT];
218+
}
219+
return nil;
207220
}
208221

209222
- (instancetype)initWithFactory:(MTRDeviceControllerFactory *)factory

src/darwin/Framework/CHIP/MTRDeviceControllerXPCParameters.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@
1818

1919
NS_ASSUME_NONNULL_BEGIN
2020

21-
@interface MTRDeviceControllerXPCParameters : MTRDeviceControllerParameters
22-
@end
21+
@interface MTRDeviceControllerMachServiceXPCParameters : MTRDeviceControllerAbstractParameters
2322

24-
@interface MTRDeviceControllerMachServiceXPCParameters : MTRDeviceControllerXPCParameters
23+
- (nullable instancetype)initWithUniqueIdentifier:(NSUUID *)uniqueIdentifier;
2524

25+
@property (atomic, retain) NSUUID * uniqueIdentifier;
2626
@property (atomic, retain) NSString * machServiceName;
2727
@property (atomic, readwrite) NSXPCConnectionOptions connectionOptions;
2828

src/darwin/Framework/CHIP/MTRDeviceControllerXPCParameters.mm

+9-7
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,19 @@
1515
*/
1616

1717
#import "MTRDeviceControllerXPCParameters.h"
18+
#import "MTRDeviceControllerStartupParams_Internal.h"
1819

19-
@implementation MTRDeviceControllerXPCParameters
20+
@implementation MTRDeviceControllerMachServiceXPCParameters
2021

21-
+ (BOOL)supportsSecureCoding
22+
- (nullable instancetype)initWithUniqueIdentifier:(NSUUID *)uniqueIdentifier
2223
{
23-
return YES;
24-
}
24+
if (!(self = [super _initInternal])) {
25+
return nil;
26+
}
2527

26-
@end
27-
28-
@implementation MTRDeviceControllerMachServiceXPCParameters
28+
_uniqueIdentifier = uniqueIdentifier;
29+
return self;
30+
}
2931

3032
+ (BOOL)supportsSecureCoding
3133
{

src/darwin/Framework/CHIP/MTRDeviceController_Concrete.mm

+11-41
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,7 @@
3131
#import "MTRDeviceControllerLocalTestStorage.h"
3232
#import "MTRDeviceControllerStartupParams.h"
3333
#import "MTRDeviceControllerStartupParams_Internal.h"
34-
#import "MTRDeviceControllerXPCParameters.h"
3534
#import "MTRDeviceController_Concrete.h"
36-
#import "MTRDeviceController_XPC.h"
37-
#import "MTRDeviceController_XPC_Internal.h"
3835
#import "MTRDevice_Concrete.h"
3936
#import "MTRDevice_Internal.h"
4037
#import "MTRError_Internal.h"
@@ -148,49 +145,22 @@ @implementation MTRDeviceController_Concrete {
148145
- (nullable instancetype)initWithParameters:(MTRDeviceControllerAbstractParameters *)parameters
149146
error:(NSError * __autoreleasing *)error
150147
{
151-
/// IF YOU ARE ALARMED BY TYPES: You are right to be alarmed, but do not panic.
152-
/// _ORDER MATTERS HERE:_ XPC parameters are a subclass of `MTRDeviceControllerParameters`
153-
/// because of the enormous overlap of params.
154-
if ([parameters isKindOfClass:MTRDeviceControllerXPCParameters.class]) {
155-
if ([parameters isKindOfClass:MTRDeviceControllerMachServiceXPCParameters.class]) {
156-
MTRDeviceControllerMachServiceXPCParameters * xpcParameters = (MTRDeviceControllerMachServiceXPCParameters *) parameters;
157-
MTR_LOG_DEBUG("%s: got XPC parameters, getting XPC device controller", __PRETTY_FUNCTION__);
158-
159-
NSString * machServiceName = xpcParameters.machServiceName;
160-
MTR_LOG_DEBUG("%s: machServiceName %@", __PRETTY_FUNCTION__, machServiceName);
161-
162-
MTRDeviceController * xpcDeviceController = [[MTRDeviceController_XPC alloc] initWithMachServiceName:machServiceName options:xpcParameters.connectionOptions];
163-
164-
/// Being of sound mind, I willfully and voluntarily make this static cast.
165-
return static_cast<MTRDeviceController_Concrete *>(xpcDeviceController);
166-
} else {
167-
MTR_LOG_ERROR("%s: unrecognized XPC parameters class %@", __PRETTY_FUNCTION__, NSStringFromClass(parameters.class));
168-
169-
// TODO: there's probably a more appropriate error here.
170-
if (error) {
171-
*error = [MTRError errorForCHIPErrorCode:CHIP_ERROR_NOT_IMPLEMENTED];
172-
}
173-
174-
return nil;
175-
}
176-
} else if ([parameters isKindOfClass:MTRDeviceControllerParameters.class]) {
177-
MTR_LOG_DEBUG("%s: got standard parameters, getting standard device controller from factory", __PRETTY_FUNCTION__);
178-
auto * controllerParameters = static_cast<MTRDeviceControllerParameters *>(parameters);
179-
180-
// Start us up normally. MTRDeviceControllerFactory will auto-start in per-controller-storage mode if necessary.
181-
MTRDeviceControllerFactory * factory = MTRDeviceControllerFactory.sharedInstance;
182-
id controller = [factory initializeController:self
183-
withParameters:controllerParameters
184-
error:error];
185-
return controller;
186-
} else {
187-
// way out of our league
188-
MTR_LOG_ERROR("Unsupported type of MTRDeviceControllerAbstractParameters: %@", parameters);
148+
if (![parameters isKindOfClass:MTRDeviceControllerParameters.class]) {
149+
MTR_LOG_ERROR("Expected MTRDeviceControllerParameters but got: %@", parameters);
189150
if (error) {
190151
*error = [MTRError errorForCHIPErrorCode:CHIP_ERROR_INVALID_ARGUMENT];
191152
}
192153
return nil;
193154
}
155+
156+
auto * controllerParameters = static_cast<MTRDeviceControllerParameters *>(parameters);
157+
158+
// Start us up normally. MTRDeviceControllerFactory will auto-start in per-controller-storage mode if necessary.
159+
MTRDeviceControllerFactory * factory = MTRDeviceControllerFactory.sharedInstance;
160+
id controller = [factory initializeController:self
161+
withParameters:controllerParameters
162+
error:error];
163+
return controller;
194164
}
195165

196166
- (instancetype)initWithFactory:(MTRDeviceControllerFactory *)factory

src/darwin/Framework/CHIP/MTRDevice_XPC.mm

-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
#import "MTRDeviceControllerLocalTestStorage.h"
4040
#import "MTRDeviceControllerStartupParams.h"
4141
#import "MTRDeviceControllerStartupParams_Internal.h"
42-
#import "MTRDeviceControllerXPCParameters.h"
4342
#import "MTRDeviceController_Concrete.h"
4443
#import "MTRDeviceController_XPC.h"
4544
#import "MTRDevice_Concrete.h"

0 commit comments

Comments
 (0)