@@ -38,10 +38,14 @@ @interface CastingServerBridge ()
38
38
39
39
@property OnboardingPayload * _Nonnull onboardingPayload;
40
40
41
- @property chip::DeviceLayer:: CommissionableDataProviderImpl * commissionableDataProvider;
41
+ @property CommissionableDataProviderImpl * commissionableDataProvider;
42
42
43
43
@property chip::Credentials::DeviceAttestationCredentialsProvider * deviceAttestationCredentialsProvider;
44
44
45
+ @property chip::CommonCaseDeviceServerInitParams * serverInitParams;
46
+
47
+ @property TargetVideoPlayerInfo * previouslyConnectedVideoPlayer;
48
+
45
49
// queue used to serialize all work performed by the CastingServerBridge
46
50
@property (atomic ) dispatch_queue_t chipWorkQueue;
47
51
@@ -111,10 +115,15 @@ - (void)initApp:(AppParameters * _Nullable)appParameters
111
115
ChipLogProgress (AppServer, " CastingServerBridge().initApp() called" );
112
116
113
117
CHIP_ERROR err = CHIP_NO_ERROR;
114
- _commissionableDataProvider = new chip::DeviceLayer:: CommissionableDataProviderImpl ();
118
+ _commissionableDataProvider = new CommissionableDataProviderImpl ();
115
119
_deviceAttestationCredentialsProvider = chip::Credentials::Examples::GetExampleDACProvider ();
120
+
116
121
_appParameters = appParameters;
117
122
AppParams cppAppParams;
123
+ uint32_t setupPasscode = CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE;
124
+ uint16_t setupDiscriminator = CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR;
125
+ uint32_t spake2pIterationCount;
126
+ chip::ByteSpan spake2pSaltSpan, spake2pVerifierSpan;
118
127
if (_appParameters != nil ) {
119
128
err = [ConversionUtils convertToCppAppParamsInfoFrom: _appParameters outAppParams: cppAppParams];
120
129
if (err != CHIP_NO_ERROR) {
@@ -123,22 +132,31 @@ - (void)initApp:(AppParameters * _Nullable)appParameters
123
132
}
124
133
125
134
// set fields in commissionableDataProvider
126
- _commissionableDataProvider->SetSpake2pIterationCount (_appParameters.spake2pIterationCount );
127
- if (_appParameters.spake2pSalt != nil ) {
128
- chip::ByteSpan spake2pSaltSpan
129
- = chip::ByteSpan (static_cast <const uint8_t *>(_appParameters.spake2pSalt .bytes ), _appParameters.spake2pSalt .length );
130
- _commissionableDataProvider->SetSpake2pSalt (spake2pSaltSpan);
135
+ if (_appParameters.onboardingPayload != nil ) {
136
+ setupPasscode = _appParameters.onboardingPayload .setupPasscode > 0 ? _appParameters.onboardingPayload .setupPasscode
137
+ : CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE;
138
+ setupDiscriminator = _appParameters.onboardingPayload .setupDiscriminator > 0
139
+ ? _appParameters.onboardingPayload .setupDiscriminator
140
+ : CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR;
141
+ }
142
+ spake2pIterationCount = _appParameters.spake2pIterationCount ;
143
+ if (_appParameters.spake2pSaltBase64 != nil ) {
144
+ spake2pSaltSpan = chip::ByteSpan (
145
+ static_cast <const uint8_t *>(_appParameters.spake2pSaltBase64 .bytes ), _appParameters.spake2pSaltBase64 .length );
131
146
}
132
147
133
- if (_appParameters.spake2pVerifier != nil ) {
134
- chip::ByteSpan spake2pVerifierSpan = chip::ByteSpan (
135
- static_cast <const uint8_t *>(_appParameters.spake2pVerifier .bytes ), _appParameters. spake2pVerifier . length );
136
- _commissionableDataProvider-> SetSpake2pSalt (spake2pVerifierSpan );
148
+ if (_appParameters.spake2pVerifierBase64 != nil ) {
149
+ chip::ByteSpan spake2pVerifierSpan
150
+ = chip::ByteSpan ( static_cast <const uint8_t *>(_appParameters.spake2pVerifierBase64 .bytes ),
151
+ _appParameters. spake2pVerifierBase64 . length );
137
152
}
138
153
139
- if (_appParameters.onboardingPayload != nil ) {
140
- _commissionableDataProvider->SetSetupPasscode (_appParameters.onboardingPayload .setupPasscode );
141
- _commissionableDataProvider->SetSetupDiscriminator (_appParameters.onboardingPayload .setupDiscriminator );
154
+ err = _commissionableDataProvider->Initialize (_appParameters.spake2pVerifierBase64 != nil ? &spake2pVerifierSpan : nil ,
155
+ _appParameters.spake2pSaltBase64 != nil ? &spake2pSaltSpan : nil , spake2pIterationCount, setupPasscode,
156
+ setupDiscriminator);
157
+ if (err != CHIP_NO_ERROR) {
158
+ ChipLogError (AppServer, " Failed to initialize CommissionableDataProvider: %s" , ErrorStr (err));
159
+ return ;
142
160
}
143
161
144
162
if (_appParameters.deviceAttestationCredentials != nil ) {
@@ -182,8 +200,6 @@ - (void)initApp:(AppParameters * _Nullable)appParameters
182
200
}
183
201
chip::DeviceLayer::SetCommissionableDataProvider (_commissionableDataProvider);
184
202
185
- uint32_t setupPasscode = 0 ;
186
- uint16_t setupDiscriminator = 0 ;
187
203
_commissionableDataProvider->GetSetupPasscode (setupPasscode);
188
204
_commissionableDataProvider->GetSetupDiscriminator (setupDiscriminator);
189
205
_onboardingPayload = [[OnboardingPayload alloc ] initWithSetupPasscode: setupPasscode setupDiscriminator: setupDiscriminator];
@@ -199,14 +215,14 @@ - (void)initApp:(AppParameters * _Nullable)appParameters
199
215
}
200
216
201
217
// init app Server
202
- static chip::CommonCaseDeviceServerInitParams initParams ;
203
- err = initParams. InitializeStaticResourcesBeforeServerInit ();
218
+ _serverInitParams = new chip::CommonCaseDeviceServerInitParams () ;
219
+ err = _serverInitParams-> InitializeStaticResourcesBeforeServerInit ();
204
220
if (err != CHIP_NO_ERROR) {
205
221
ChipLogError (AppServer, " InitializeStaticResourcesBeforeServerInit failed: %s" , ErrorStr (err));
206
222
return ;
207
223
}
208
224
209
- err = chip::Server::GetInstance ().Init (initParams );
225
+ err = chip::Server::GetInstance ().Init (*_serverInitParams );
210
226
if (err != CHIP_NO_ERROR) {
211
227
ChipLogError (AppServer, " chip::Server init failed: %s" , ErrorStr (err));
212
228
return ;
@@ -261,7 +277,7 @@ - (void)getDiscoveredCommissioner:(int)index
261
277
{
262
278
ChipLogProgress (AppServer, " CastingServerBridge().getDiscoveredCommissioner() called" );
263
279
264
- dispatch_async (_chipWorkQueue, ^{
280
+ dispatch_sync (_chipWorkQueue, ^{
265
281
chip::Optional<TargetVideoPlayerInfo *> associatedConnectableVideoPlayer;
266
282
DiscoveredNodeData * commissioner = nil ;
267
283
const chip::Dnssd::DiscoveredNodeData * cppDiscoveredNodeData
@@ -275,7 +291,7 @@ - (void)getDiscoveredCommissioner:(int)index
275
291
}
276
292
}
277
293
278
- dispatch_async (clientQueue, ^{
294
+ dispatch_sync (clientQueue, ^{
279
295
discoveredCommissionerHandler (commissioner);
280
296
});
281
297
});
@@ -407,10 +423,9 @@ - (void)getActiveTargetVideoPlayers:(dispatch_queue_t _Nonnull)clientQueue
407
423
ChipLogProgress (AppServer, " CastingServerBridge().getActiveTargetVideoPlayers() called" );
408
424
409
425
dispatch_async (_chipWorkQueue, ^{
410
- NSMutableArray * videoPlayers = nil ;
426
+ NSMutableArray * videoPlayers = [ NSMutableArray new ] ;
411
427
TargetVideoPlayerInfo * cppTargetVideoPlayerInfo = CastingServer::GetInstance ()->GetActiveTargetVideoPlayer ();
412
- if (cppTargetVideoPlayerInfo != nullptr ) {
413
- videoPlayers = [NSMutableArray new ];
428
+ if (cppTargetVideoPlayerInfo != nullptr && cppTargetVideoPlayerInfo->IsInitialized ()) {
414
429
videoPlayers[0 ] = [ConversionUtils convertToObjCVideoPlayerFrom: cppTargetVideoPlayerInfo];
415
430
}
416
431
@@ -495,6 +510,79 @@ - (void)shutdownAllSubscriptions:(dispatch_queue_t _Nonnull)clientQueue requestS
495
510
});
496
511
}
497
512
513
+ - (void )startMatterServer
514
+ {
515
+ ChipLogProgress (AppServer, " CastingServerBridge().startMatterServer() called" );
516
+
517
+ dispatch_sync (_chipWorkQueue, ^{
518
+ // Initialize the Matter server
519
+ CHIP_ERROR err = chip::Server::GetInstance ().Init (*self->_serverInitParams );
520
+ if (err != CHIP_NO_ERROR) {
521
+ ChipLogError (AppServer, " chip::Server init failed: %s" , ErrorStr (err));
522
+ return ;
523
+ }
524
+
525
+ // Now reconnect to the VideoPlayer the casting app was previously connected to (if any)
526
+ if (self->_previouslyConnectedVideoPlayer != nil ) {
527
+ ChipLogProgress (
528
+ AppServer, " CastingServerBridge().startMatterServer() reconnecting to previously connected VideoPlayer..." );
529
+ err = CastingServer::GetInstance ()->VerifyOrEstablishConnection (
530
+ *(self->_previouslyConnectedVideoPlayer ), [](TargetVideoPlayerInfo * cppTargetVideoPlayerInfo) {},
531
+ [](CHIP_ERROR err) {}, [](TargetEndpointInfo * cppTargetEndpointInfo) {});
532
+ }
533
+ });
534
+ }
535
+
536
+ - (void )stopMatterServer
537
+ {
538
+ ChipLogProgress (AppServer, " CastingServerBridge().stopMatterServer() called" );
539
+
540
+ dispatch_sync (_chipWorkQueue, ^{
541
+ // capture pointer to previouslyConnectedVideoPlayer, to be deleted
542
+ TargetVideoPlayerInfo * videoPlayerForDeletion
543
+ = self->_previouslyConnectedVideoPlayer == nil ? nil : self->_previouslyConnectedVideoPlayer ;
544
+
545
+ // On shutting down the Matter server, the casting app will be automatically disconnected from any Video Players it was
546
+ // connected to. Save the VideoPlayer that the casting app was targetting and connected to, so we can reconnect to it on
547
+ // re-starting the Matter server.
548
+ TargetVideoPlayerInfo * currentTargetVideoPlayerInfo = CastingServer::GetInstance ()->GetActiveTargetVideoPlayer ();
549
+ if (currentTargetVideoPlayerInfo != nil && currentTargetVideoPlayerInfo->IsInitialized ()
550
+ && currentTargetVideoPlayerInfo->GetOperationalDeviceProxy () != nil ) {
551
+ self->_previouslyConnectedVideoPlayer = new TargetVideoPlayerInfo ();
552
+ self->_previouslyConnectedVideoPlayer ->Initialize (currentTargetVideoPlayerInfo->GetNodeId (),
553
+ currentTargetVideoPlayerInfo->GetFabricIndex (), nullptr , nullptr , currentTargetVideoPlayerInfo->GetVendorId (),
554
+ currentTargetVideoPlayerInfo->GetProductId (), currentTargetVideoPlayerInfo->GetDeviceType (),
555
+ currentTargetVideoPlayerInfo->GetDeviceName (), currentTargetVideoPlayerInfo->GetNumIPs (),
556
+ const_cast <chip::Inet::IPAddress *>(currentTargetVideoPlayerInfo->GetIpAddresses ()));
557
+
558
+ TargetEndpointInfo * prevEndpoints = self->_previouslyConnectedVideoPlayer ->GetEndpoints ();
559
+ if (prevEndpoints != nullptr ) {
560
+ for (size_t i = 0 ; i < kMaxNumberOfEndpoints ; i++) {
561
+ prevEndpoints[i].Reset ();
562
+ }
563
+ }
564
+ TargetEndpointInfo * currentEndpoints = currentTargetVideoPlayerInfo->GetEndpoints ();
565
+ for (size_t i = 0 ; i < kMaxNumberOfEndpoints && currentEndpoints[i].IsInitialized (); i++) {
566
+ prevEndpoints[i].Initialize (currentEndpoints[i].GetEndpointId ());
567
+ chip::ClusterId * currentClusters = currentEndpoints[i].GetClusters ();
568
+ for (size_t j = 0 ; j < kMaxNumberOfClustersPerEndpoint && currentClusters[j] != chip::kInvalidClusterId ; j++) {
569
+ prevEndpoints[i].AddCluster (currentClusters[j]);
570
+ }
571
+ }
572
+ } else {
573
+ self->_previouslyConnectedVideoPlayer = nil ;
574
+ }
575
+
576
+ // Now shutdown the Matter server
577
+ chip::Server::GetInstance ().Shutdown ();
578
+
579
+ // Delete the old previouslyConnectedVideoPlayer, if non-nil
580
+ if (videoPlayerForDeletion != nil ) {
581
+ delete videoPlayerForDeletion;
582
+ }
583
+ });
584
+ }
585
+
498
586
- (void )disconnect : (dispatch_queue_t _Nonnull)clientQueue requestSentHandler : (nullable void (^)())requestSentHandler
499
587
{
500
588
ChipLogProgress (AppServer, " CastingServerBridge().disconnect() called" );
0 commit comments