17
17
*/
18
18
19
19
#include " CastingPlayer.h"
20
- #include " Endpoint .h"
20
+ #include " CastingPlayerDiscovery .h"
21
21
22
22
#include " support/CastingStore.h"
23
23
@@ -27,13 +27,14 @@ namespace matter {
27
27
namespace casting {
28
28
namespace core {
29
29
30
- CastingPlayer * CastingPlayer::mTargetCastingPlayer = nullptr ;
30
+ memory::Weak< CastingPlayer> CastingPlayer::mTargetCastingPlayer ;
31
31
32
32
void CastingPlayer::VerifyOrEstablishConnection (ConnectionCallbacks connectionCallbacks, uint16_t commissioningWindowTimeoutSec,
33
33
IdentificationDeclarationOptions idOptions)
34
34
{
35
35
ChipLogProgress (AppServer, " CastingPlayer::VerifyOrEstablishConnection() called" );
36
36
37
+ CastingPlayerDiscovery * castingPlayerDiscovery = CastingPlayerDiscovery::GetInstance ();
37
38
std::vector<core::CastingPlayer>::iterator it;
38
39
std::vector<core::CastingPlayer> cachedCastingPlayers = support::CastingStore::GetInstance ()->ReadAll ();
39
40
@@ -53,8 +54,9 @@ void CastingPlayer::VerifyOrEstablishConnection(ConnectionCallbacks connectionCa
53
54
mConnectionState = CASTING_PLAYER_CONNECTING;
54
55
mOnCompleted = connectionCallbacks.mOnConnectionComplete ;
55
56
mCommissioningWindowTimeoutSec = commissioningWindowTimeoutSec;
56
- mTargetCastingPlayer = this ;
57
+ mTargetCastingPlayer = weak_from_this () ;
57
58
mIdOptions = idOptions;
59
+ castingPlayerDiscovery->ClearDisconnectedCastingPlayersInternal ();
58
60
59
61
// Register the handler for Commissioner's CommissionerDeclaration messages. The CommissionerDeclaration messages provide
60
62
// information indicating the Commissioner's pre-commissioning state.
@@ -120,7 +122,8 @@ void CastingPlayer::VerifyOrEstablishConnection(ConnectionCallbacks connectionCa
120
122
nullptr ,
121
123
[](void * context, chip::Messaging::ExchangeManager & exchangeMgr, const chip::SessionHandle & sessionHandle) {
122
124
ChipLogProgress (AppServer,
123
- " CastingPlayer::VerifyOrEstablishConnection() Connection to CastingPlayer successful" );
125
+ " CastingPlayer::VerifyOrEstablishConnection() FindOrEstablishSession Connection to "
126
+ " CastingPlayer successful" );
124
127
CastingPlayer::GetTargetCastingPlayer ()->mConnectionState = CASTING_PLAYER_CONNECTED;
125
128
126
129
// this async call will Load all the endpoints with their respective attributes into the TargetCastingPlayer
@@ -129,7 +132,9 @@ void CastingPlayer::VerifyOrEstablishConnection(ConnectionCallbacks connectionCa
129
132
support::EndpointListLoader::GetInstance ()->Load ();
130
133
},
131
134
[](void * context, const chip::ScopedNodeId & peerId, CHIP_ERROR error) {
132
- ChipLogError (AppServer, " CastingPlayer::VerifyOrEstablishConnection() Connection to CastingPlayer failed" );
135
+ ChipLogError (AppServer,
136
+ " CastingPlayer::VerifyOrEstablishConnection() FindOrEstablishSession Connection to "
137
+ " CastingPlayer failed" );
133
138
CastingPlayer::GetTargetCastingPlayer ()->mConnectionState = CASTING_PLAYER_NOT_CONNECTED;
134
139
CHIP_ERROR e = support::CastingStore::GetInstance ()->Delete (*CastingPlayer::GetTargetCastingPlayer ());
135
140
if (e != CHIP_NO_ERROR)
@@ -139,7 +144,7 @@ void CastingPlayer::VerifyOrEstablishConnection(ConnectionCallbacks connectionCa
139
144
140
145
VerifyOrReturn (CastingPlayer::GetTargetCastingPlayer ()->mOnCompleted );
141
146
CastingPlayer::GetTargetCastingPlayer ()->mOnCompleted (error, nullptr );
142
- mTargetCastingPlayer = nullptr ;
147
+ mTargetCastingPlayer . reset () ;
143
148
});
144
149
return ; // FindOrEstablishSession called. Return early.
145
150
}
@@ -196,7 +201,7 @@ CHIP_ERROR CastingPlayer::ContinueConnecting()
196
201
" only be called when the CastingPlayer/Commissioner-Generated passcode commissioning flow is in progress." ););
197
202
198
203
CHIP_ERROR err = CHIP_NO_ERROR;
199
- mTargetCastingPlayer = this ;
204
+ mTargetCastingPlayer = weak_from_this () ;
200
205
201
206
ChipLogProgress (AppServer, " CastingPlayer::ContinueConnecting() calling OpenBasicCommissioningWindow()" );
202
207
SuccessOrExit (err = chip::Server::GetInstance ().GetCommissioningWindowManager ().OpenBasicCommissioningWindow (
@@ -235,7 +240,8 @@ CHIP_ERROR CastingPlayer::StopConnecting()
235
240
mIdOptions .mCancelPasscode = true ;
236
241
mConnectionState = CASTING_PLAYER_NOT_CONNECTED;
237
242
mCommissioningWindowTimeoutSec = kCommissioningWindowTimeoutSec ;
238
- mTargetCastingPlayer = nullptr ;
243
+ mTargetCastingPlayer .reset ();
244
+ CastingPlayerDiscovery::GetInstance ()->ClearCastingPlayersInternal ();
239
245
240
246
// If a CastingPlayer::ContinueConnecting() error occurs, StopConnecting() can be called while sUdcInProgress == true.
241
247
// sUdcInProgress should be set to false before sending the CancelPasscode IdentificationDeclaration message to the
@@ -273,18 +279,21 @@ void CastingPlayer::resetState(CHIP_ERROR err)
273
279
support::ChipDeviceEventHandler::SetUdcStatus (false );
274
280
mConnectionState = CASTING_PLAYER_NOT_CONNECTED;
275
281
mCommissioningWindowTimeoutSec = kCommissioningWindowTimeoutSec ;
276
- mTargetCastingPlayer = nullptr ;
282
+ mTargetCastingPlayer . reset () ;
277
283
if (mOnCompleted )
278
284
{
279
285
mOnCompleted (err, nullptr );
280
286
mOnCompleted = nullptr ;
281
287
}
288
+ CastingPlayerDiscovery::GetInstance ()->ClearCastingPlayersInternal ();
282
289
}
283
290
284
291
void CastingPlayer::Disconnect ()
285
292
{
286
- mConnectionState = CASTING_PLAYER_NOT_CONNECTED;
287
- mTargetCastingPlayer = nullptr ;
293
+ ChipLogProgress (AppServer, " CastingPlayer::Disconnect()" );
294
+ mConnectionState = CASTING_PLAYER_NOT_CONNECTED;
295
+ mTargetCastingPlayer .reset ();
296
+ CastingPlayerDiscovery::GetInstance ()->ClearCastingPlayersInternal ();
288
297
}
289
298
290
299
void CastingPlayer::RegisterEndpoint (const memory::Strong<Endpoint> endpoint)
@@ -320,6 +329,7 @@ CHIP_ERROR CastingPlayer::SendUserDirectedCommissioningRequest()
320
329
ReturnErrorOnFailure (chip::Server::GetInstance ().SendUserDirectedCommissioningRequest (
321
330
chip::Transport::PeerAddress::UDP (*ipAddressToUse, mAttributes .port , mAttributes .interfaceId ), id));
322
331
332
+ ChipLogProgress (AppServer, " CastingPlayer::SendUserDirectedCommissioningRequest() complete" );
323
333
return CHIP_NO_ERROR;
324
334
}
325
335
@@ -478,23 +488,35 @@ ConnectionContext::ConnectionContext(void * clientContext, core::CastingPlayer *
478
488
479
489
mOnConnectedCallback = new chip::Callback::Callback<chip::OnDeviceConnected>(
480
490
[](void * context, chip::Messaging::ExchangeManager & exchangeMgr, const chip::SessionHandle & sessionHandle) {
481
- ChipLogProgress (AppServer, " Device Connection success callback called" );
491
+ ChipLogProgress (AppServer, " CastingPlayer::ConnectionContext() Device Connection success callback called" );
482
492
ConnectionContext * connectionContext = static_cast <ConnectionContext *>(context);
483
- VerifyOrReturn (connectionContext != nullptr && connectionContext->mTargetCastingPlayer != nullptr ,
484
- ChipLogError (AppServer, " Invalid ConnectionContext received in DeviceConnection success callback" ));
493
+ VerifyOrReturn (
494
+ connectionContext != nullptr && connectionContext->mTargetCastingPlayer != nullptr ,
495
+ ChipLogError (
496
+ AppServer,
497
+ " CastingPlayer::ConnectionContext() Invalid ConnectionContext received in DeviceConnection success callback" ));
485
498
499
+ ChipLogProgress (AppServer,
500
+ " CastingPlayer::ConnectionContext() calling mConnectionState = core::CASTING_PLAYER_CONNECTED" );
486
501
connectionContext->mTargetCastingPlayer ->mConnectionState = core::CASTING_PLAYER_CONNECTED;
502
+ ChipLogProgress (AppServer, " CastingPlayer::ConnectionContext() calling mOnDeviceConnectedFn" );
487
503
connectionContext->mOnDeviceConnectedFn (connectionContext->mClientContext , exchangeMgr, sessionHandle);
504
+ ChipLogProgress (AppServer, " CastingPlayer::ConnectionContext() calling delete connectionContext" );
488
505
delete connectionContext;
489
506
},
490
507
this );
491
508
492
509
mOnConnectionFailureCallback = new chip::Callback::Callback<chip::OnDeviceConnectionFailure>(
493
510
[](void * context, const chip::ScopedNodeId & peerId, CHIP_ERROR error) {
494
- ChipLogError (AppServer, " Device Connection failure callback called with %" CHIP_ERROR_FORMAT, error.Format ());
511
+ ChipLogError (AppServer,
512
+ " CastingPlayer::ConnectionContext() Device Connection failure callback called with %" CHIP_ERROR_FORMAT,
513
+ error.Format ());
495
514
ConnectionContext * connectionContext = static_cast <ConnectionContext *>(context);
496
- VerifyOrReturn (connectionContext != nullptr && connectionContext->mTargetCastingPlayer != nullptr ,
497
- ChipLogError (AppServer, " Invalid ConnectionContext received in DeviceConnection failure callback" ));
515
+ VerifyOrReturn (
516
+ connectionContext != nullptr && connectionContext->mTargetCastingPlayer != nullptr ,
517
+ ChipLogError (
518
+ AppServer,
519
+ " CastingPlayer::ConnectionContext() Invalid ConnectionContext received in DeviceConnection failure callback" ));
498
520
connectionContext->mTargetCastingPlayer ->mConnectionState = CASTING_PLAYER_NOT_CONNECTED;
499
521
connectionContext->mOnDeviceConnectionFailureFn (connectionContext->mClientContext , peerId, error);
500
522
delete connectionContext;
0 commit comments