Skip to content

Commit 4356024

Browse files
bzbarsky-applepull[bot]
authored andcommitted
Darwin API review fixes for MTRSetupPayload and MTROptionalQRCodeInfo (#22566)
* Rename MTRDiscoveryCapabilitiesNone to MTRDiscoveryCapabilitiesUnknown to indicate capabilities unknown (e.g. manual setup code). * In MTROptionalQRCodeInfo mark integerValue and stringValue as nullable and document they are mutually exclusive. * In MTROptionalQRCodeInfo switch infoType to MTROptionalQRCodeInfoType, not NSNumber. * Change rendezvousInformation to just be a MTRDiscoveryCapabilities value, not nullable NSNumber, with MTRDiscoveryCapabilitiesNone meaning unknown. When parsing QR code, if the value ends up as 0, reset it to MTRDiscoveryCapabilitiesOnNetwork. * Rename setUpPINCode to setupPasscode. * Mark serialNumber as nullable. * Add setupPayloadWithOnboardingPayload class method on MTRSetupPayload. * Stop exposing the various payload parser APIs from the framework; consumers should use setupPayloadWithOnboardingPayload. Fixes #22543 Fixes #22539 Addresses part of #22420
1 parent b5af86a commit 4356024

File tree

10 files changed

+155
-129
lines changed

10 files changed

+155
-129
lines changed

examples/darwin-framework-tool/commands/payload/SetupPayloadParseCommand.mm

+18-22
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
NSString * codeString = [NSString stringWithCString:mCode encoding:NSASCIIStringEncoding];
6262
NSError * error;
6363
MTRSetupPayload * payload;
64-
payload = [MTROnboardingPayloadParser setupPayloadForOnboardingPayload:codeString error:&error];
64+
payload = [MTRSetupPayload setupPayloadWithOnboardingPayload:codeString error:&error];
6565
if (error) {
6666
LogNSError("Error: ", error);
6767
return CHIP_ERROR_INTERNAL;
@@ -78,37 +78,33 @@
7878
NSLog(@"ProductID: %@", payload.productID);
7979
NSLog(@"Custom flow: %lu (%@)", payload.commissioningFlow, CustomFlowString(payload.commissioningFlow));
8080
{
81-
if (payload.rendezvousInformation == nil) {
81+
if (payload.discoveryCapabilities == MTRDiscoveryCapabilitiesUnknown) {
8282
NSLog(@"Capabilities: UNKNOWN");
8383
} else {
8484
NSMutableString * humanFlags = [[NSMutableString alloc] init];
8585

86-
auto value = [payload.rendezvousInformation unsignedLongValue];
87-
if (value == MTRDiscoveryCapabilitiesNone) {
88-
[humanFlags appendString:@"NONE"];
89-
} else {
90-
if (value & MTRDiscoveryCapabilitiesSoftAP) {
91-
[humanFlags appendString:@"SoftAP"];
92-
}
93-
if (value & MTRDiscoveryCapabilitiesBLE) {
94-
if (!humanFlags) {
95-
[humanFlags appendString:@", "];
96-
}
97-
[humanFlags appendString:@"BLE"];
86+
auto value = payload.discoveryCapabilities;
87+
if (value & MTRDiscoveryCapabilitiesSoftAP) {
88+
[humanFlags appendString:@"SoftAP"];
89+
}
90+
if (value & MTRDiscoveryCapabilitiesBLE) {
91+
if (!humanFlags) {
92+
[humanFlags appendString:@", "];
9893
}
99-
if (value & MTRDiscoveryCapabilitiesOnNetwork) {
100-
if (!humanFlags) {
101-
[humanFlags appendString:@", "];
102-
}
103-
[humanFlags appendString:@"ON NETWORK"];
94+
[humanFlags appendString:@"BLE"];
95+
}
96+
if (value & MTRDiscoveryCapabilitiesOnNetwork) {
97+
if (!humanFlags) {
98+
[humanFlags appendString:@", "];
10499
}
100+
[humanFlags appendString:@"ON NETWORK"];
105101
}
106102

107103
NSLog(@"Capabilities: 0x%02lX (%@)", value, humanFlags);
108104
}
109105
}
110106
NSLog(@"Discriminator: %@", payload.discriminator);
111-
NSLog(@"Passcode: %@", payload.setUpPINCode);
107+
NSLog(@"Passcode: %@", payload.setupPasscode);
112108

113109
if (payload.serialNumber) {
114110
NSLog(@"SerialNumber: %@", payload.serialNumber);
@@ -120,8 +116,8 @@
120116
return CHIP_ERROR_INTERNAL;
121117
}
122118
for (const MTROptionalQRCodeInfo * info : optionalVendorData) {
123-
bool isTypeString = [info.infoType isEqual:@(MTROptionalQRCodeInfoTypeString)];
124-
bool isTypeInt32 = [info.infoType isEqual:@(MTROptionalQRCodeInfoTypeInt32)];
119+
bool isTypeString = (info.infoType == MTROptionalQRCodeInfoTypeString);
120+
bool isTypeInt32 = (info.infoType == MTROptionalQRCodeInfoTypeInt32);
125121
VerifyOrReturnError(isTypeString || isTypeInt32, CHIP_ERROR_INVALID_ARGUMENT);
126122

127123
if (isTypeString) {

src/darwin/CHIPTool/CHIPTool/View Controllers/Enumeration/EnumerateViewController.m

+1-1
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ - (void)enumerate
133133
for (NSNumber * endpoint in endpointsInUse) {
134134
MTRBaseClusterDescriptor * descriptorCluster =
135135
[[MTRBaseClusterDescriptor alloc] initWithDevice:device endpoint:endpoint queue:dispatch_get_main_queue()];
136-
[descriptorCluster readAttributeDeviceListWithCompletionHandler:^(
136+
[descriptorCluster readAttributeDeviceTypeListWithCompletionHandler:^(
137137
NSArray * _Nullable value, NSError * _Nullable error) {
138138
if (error) {
139139
NSString * resultLog = [[NSString alloc]

src/darwin/CHIPTool/CHIPTool/View Controllers/QRCode/QRCodeViewController.m

+19-18
Original file line numberDiff line numberDiff line change
@@ -706,10 +706,10 @@ - (void)updateUIFields:(MTRSetupPayload *)payload rawPayload:(nullable NSString
706706
} else {
707707
_manualCodeLabel.hidden = YES;
708708
_versionLabel.text = [NSString stringWithFormat:@"%@", payload.version];
709-
if (payload.rendezvousInformation == nil) {
709+
if (payload.discoveryCapabilities == MTRDiscoveryCapabilitiesUnknown) {
710710
_rendezVousInformation.text = NOT_APPLICABLE_STRING;
711711
} else {
712-
_rendezVousInformation.text = [NSString stringWithFormat:@"%lu", [payload.rendezvousInformation unsignedLongValue]];
712+
_rendezVousInformation.text = [NSString stringWithFormat:@"%lu", payload.discoveryCapabilities];
713713
}
714714
if ([payload.serialNumber length] > 0) {
715715
self->_serialNumber.text = payload.serialNumber;
@@ -719,7 +719,7 @@ - (void)updateUIFields:(MTRSetupPayload *)payload rawPayload:(nullable NSString
719719
}
720720

721721
_discriminatorLabel.text = [NSString stringWithFormat:@"%@", payload.discriminator];
722-
_setupPinCodeLabel.text = [NSString stringWithFormat:@"%@", payload.setUpPINCode];
722+
_setupPinCodeLabel.text = [NSString stringWithFormat:@"%@", payload.setupPasscode];
723723
// TODO: Only display vid and pid if present
724724
_vendorID.text = [NSString stringWithFormat:@"%@", payload.vendorID];
725725
_productID.text = [NSString stringWithFormat:@"%@", payload.productID];
@@ -747,7 +747,7 @@ - (void)parseOptionalData:(MTRSetupPayload *)payload
747747
continue;
748748
}
749749

750-
BOOL isTypeString = [info.infoType isEqualToNumber:[NSNumber numberWithInt:MTROptionalQRCodeInfoTypeString]];
750+
BOOL isTypeString = (info.infoType == MTROptionalQRCodeInfoTypeString);
751751
if (!isTypeString) {
752752
return;
753753
}
@@ -767,26 +767,29 @@ - (void)parseOptionalData:(MTRSetupPayload *)payload
767767

768768
- (void)handleRendezVous:(MTRSetupPayload *)payload rawPayload:(NSString *)rawPayload
769769
{
770-
if (payload.rendezvousInformation == nil) {
770+
if (payload.discoveryCapabilities == MTRDiscoveryCapabilitiesUnknown) {
771771
NSLog(@"Rendezvous Default");
772772
[self handleRendezVousDefault:rawPayload];
773773
return;
774774
}
775775

776-
// TODO: This is a pretty broken way to handle a bitmask.
777-
switch ([payload.rendezvousInformation unsignedLongValue]) {
778-
case MTRDiscoveryCapabilitiesNone:
779-
case MTRDiscoveryCapabilitiesOnNetwork:
780-
case MTRDiscoveryCapabilitiesBLE:
781-
case MTRDiscoveryCapabilitiesAllMask:
776+
// Avoid SoftAP if we have other options.
777+
if ((payload.discoveryCapabilities & MTRDiscoveryCapabilitiesOnNetwork)
778+
|| (payload.discoveryCapabilities & MTRDiscoveryCapabilitiesBLE)) {
782779
NSLog(@"Rendezvous Default");
783780
[self handleRendezVousDefault:rawPayload];
784-
break;
785-
case MTRDiscoveryCapabilitiesSoftAP:
781+
return;
782+
}
783+
784+
if (payload.discoveryCapabilities & MTRDiscoveryCapabilitiesSoftAP) {
786785
NSLog(@"Rendezvous Wi-Fi");
787786
[self handleRendezVousWiFi:[self getNetworkName:payload.discriminator]];
788-
break;
787+
return;
789788
}
789+
790+
// Just fall back on the default.
791+
NSLog(@"Rendezvous Default");
792+
[self handleRendezVousDefault:rawPayload];
790793
}
791794

792795
- (NSString *)getNetworkName:(NSNumber *)discriminator
@@ -879,9 +882,8 @@ - (void)scannedQRCode:(NSString *)qrCode
879882
[self->_captureSession stopRunning];
880883
[self->_session invalidateSession];
881884
});
882-
MTRQRCodeSetupPayloadParser * parser = [[MTRQRCodeSetupPayloadParser alloc] initWithBase38Representation:qrCode];
883885
NSError * error;
884-
_setupPayload = [parser populatePayload:&error];
886+
_setupPayload = [MTRSetupPayload setupPayloadWithOnboardingPayload:qrCode error:&error];
885887
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
886888
[self postScanningQRCodeState];
887889

@@ -952,9 +954,8 @@ - (IBAction)enteredManualCode:(id)sender
952954
NSString * decimalString = _manualCodeTextField.text;
953955
[self manualCodeEnteredStartState];
954956

955-
MTRManualSetupPayloadParser * parser = [[MTRManualSetupPayloadParser alloc] initWithDecimalStringRepresentation:decimalString];
956957
NSError * error;
957-
_setupPayload = [parser populatePayload:&error];
958+
_setupPayload = [MTRSetupPayload setupPayloadWithOnboardingPayload:decimalString error:&error];
958959
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, INDICATOR_DELAY), dispatch_get_main_queue(), ^{
959960
[self displayManualCodeInSetupPayloadView:self->_setupPayload decimalString:decimalString withError:error];
960961
});

src/darwin/Framework/CHIP/MTRDeviceController.h

-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
#import <Foundation/Foundation.h>
1919

2020
#import <Matter/MTRNOCChainIssuer.h>
21-
#import <Matter/MTROnboardingPayloadParser.h>
2221

2322
@class MTRBaseDevice;
2423

src/darwin/Framework/CHIP/MTRSetupPayload.h

+35-17
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919

2020
NS_ASSUME_NONNULL_BEGIN
2121

22-
typedef NS_ENUM(NSUInteger, MTRDiscoveryCapabilities) {
23-
MTRDiscoveryCapabilitiesNone = 0, // Device does not support any method for rendezvous
22+
typedef NS_OPTIONS(NSUInteger, MTRDiscoveryCapabilities) {
23+
MTRDiscoveryCapabilitiesUnknown = 0, // Device capabilties are not known (e.g. all we have is a manual pairing code).
2424
MTRDiscoveryCapabilitiesSoftAP = 1 << 0, // Device supports WiFi softAP
2525
MTRDiscoveryCapabilitiesBLE = 1 << 1, // Device supports BLE
2626
MTRDiscoveryCapabilitiesOnNetwork = 1 << 2, // Device supports On Network setup
@@ -36,44 +36,62 @@ typedef NS_ENUM(NSUInteger, MTRCommissioningFlow) {
3636
MTRCommissioningFlowInvalid = 3,
3737
};
3838

39-
typedef NS_ENUM(NSUInteger, MTROptionalQRCodeInfoType) {
40-
MTROptionalQRCodeInfoTypeUnknown,
41-
MTROptionalQRCodeInfoTypeString,
42-
MTROptionalQRCodeInfoTypeInt32
43-
};
39+
typedef NS_ENUM(NSUInteger, MTROptionalQRCodeInfoType) { MTROptionalQRCodeInfoTypeString, MTROptionalQRCodeInfoTypeInt32 };
4440

41+
/**
42+
* An optional information item present in the QR code the setup payload was
43+
* initialized from.
44+
*/
4545
@interface MTROptionalQRCodeInfo : NSObject
46-
@property (nonatomic, copy) NSNumber * infoType;
46+
@property (nonatomic, assign) MTROptionalQRCodeInfoType infoType;
47+
// The numeric value of the TLV tag for this information item.
4748
@property (nonatomic, copy) NSNumber * tag;
48-
@property (nonatomic, copy) NSNumber * integerValue;
49-
@property (nonatomic, copy) NSString * stringValue;
49+
// Exactly one of integerValue and stringValue will be non-nil, depending on the
50+
// the value of "infoType".
51+
@property (nonatomic, copy, nullable) NSNumber * integerValue;
52+
@property (nonatomic, copy, nullable) NSString * stringValue;
5053
@end
5154

55+
/**
56+
* A setup payload that can be created from a pairing code and serialized to a
57+
* pairing code.
58+
*/
5259
@interface MTRSetupPayload : NSObject <NSSecureCoding>
5360

5461
@property (nonatomic, copy) NSNumber * version;
5562
@property (nonatomic, copy) NSNumber * vendorID;
5663
@property (nonatomic, copy) NSNumber * productID;
5764
@property (nonatomic, assign) MTRCommissioningFlow commissioningFlow;
5865
/**
59-
* rendezvousInformation is nil when the discovery capabilities bitmask is
60-
* unknown.
61-
*
62-
* Otherwise its value is made up of the MTRDiscoveryCapabilities flags.
66+
* The value of discoveryCapabilities is made up of the various MTRDiscoveryCapabilities flags.
6367
*/
64-
@property (nonatomic, copy, nullable) NSNumber * rendezvousInformation;
68+
@property (nonatomic, assign) MTRDiscoveryCapabilities discoveryCapabilities;
6569
@property (nonatomic, copy) NSNumber * discriminator;
70+
/**
71+
* If hasShortDiscriminator is true, the discriminator value contains just the
72+
* high 4 bits of the full discriminator. For example, if
73+
* hasShortDiscriminator is true and discriminator is 0xA, then the full
74+
* discriminator can be anything in the range 0xA00 t0 0xAFF.
75+
*/
6676
@property (nonatomic, assign) BOOL hasShortDiscriminator;
67-
@property (nonatomic, copy) NSNumber * setUpPINCode;
77+
@property (nonatomic, copy) NSNumber * setupPasscode;
6878

69-
@property (nonatomic, copy) NSString * serialNumber;
79+
@property (nonatomic, copy, nullable) NSString * serialNumber;
7080
- (nullable NSArray<MTROptionalQRCodeInfo *> *)getAllOptionalVendorData:(NSError * __autoreleasing *)error;
7181

7282
/**
7383
* Generate a random Matter-valid setup passcode.
7484
*/
7585
+ (NSNumber *)generateRandomSetupPasscode;
7686

87+
/**
88+
* Create an MTRSetupPayload with the given onboarding payload.
89+
*
90+
* Will return nil on errors (e.g. if the onboarding payload cannot be parsed).
91+
*/
92+
+ (MTRSetupPayload * _Nullable)setupPayloadWithOnboardingPayload:(NSString *)onboardingPayload
93+
error:(NSError * __autoreleasing *)error;
94+
7795
/** Get 11 digit manual entry code from the setup payload. */
7896
- (nullable NSString *)manualEntryCode;
7997

0 commit comments

Comments
 (0)