Skip to content

Commit 50fe2e0

Browse files
Clean up MTRDeviceController initWithParameters dispatch.
1 parent 12f04dc commit 50fe2e0

5 files changed

+45
-61
lines changed

src/darwin/Framework/CHIP/MTRDeviceController.mm

+22-9
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@
3131
#import "MTRDeviceControllerLocalTestStorage.h"
3232
#import "MTRDeviceControllerStartupParams.h"
3333
#import "MTRDeviceControllerStartupParams_Internal.h"
34+
#import "MTRDeviceControllerXPCParameters.h"
3435
#import "MTRDeviceController_Concrete.h"
3536
#import "MTRDeviceController_XPC.h"
37+
#import "MTRDeviceController_XPC_Internal.h"
3638
#import "MTRDevice_Concrete.h"
3739
#import "MTRDevice_Internal.h"
3840
#import "MTRError_Internal.h"
@@ -199,20 +201,31 @@ - (instancetype)initForSubclasses:(BOOL)startSuspended
199201

200202
- (nullable MTRDeviceController *)initWithParameters:(MTRDeviceControllerAbstractParameters *)parameters error:(NSError * __autoreleasing *)error
201203
{
204+
// Dispatch to the right non-abstract implementation.
202205
if ([parameters isKindOfClass:MTRXPCDeviceControllerParameters.class]) {
203206
MTR_LOG("Starting up with XPC Device Controller Parameters: %@", parameters);
204207
return [[MTRDeviceController_XPC alloc] initWithParameters:parameters error:error];
205-
} else if (![parameters isKindOfClass:MTRDeviceControllerParameters.class]) {
206-
MTR_LOG_ERROR("Unsupported type of MTRDeviceControllerAbstractParameters: %@", parameters);
207-
if (error) {
208-
*error = [MTRError errorForCHIPErrorCode:CHIP_ERROR_INVALID_ARGUMENT];
209-
}
210-
return nil;
211208
}
212-
auto * controllerParameters = static_cast<MTRDeviceControllerParameters *>(parameters);
213209

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

218231
- (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)