@@ -104,7 +104,7 @@ CHIP_ERROR Shutdown()
104
104
VerifyOrReturnError (mExchangeMgr != nullptr , CHIP_ERROR_INCORRECT_STATE);
105
105
106
106
mExchangeMgr ->UnregisterUnsolicitedMessageHandlerForProtocol (Protocols::BDX::Id);
107
- ResetState ();
107
+ ResetState (CHIP_ERROR_CANCELLED );
108
108
109
109
mExchangeMgr = nullptr ;
110
110
mSystemLayer = nullptr ;
@@ -117,18 +117,35 @@ void ControllerShuttingDown(MTRDeviceController * controller)
117
117
assertChipStackLockedByCurrentThread ();
118
118
119
119
if (mInitialized && mFabricIndex .Value () == controller.fabricIndex ) {
120
- ResetState ();
120
+ ResetState (CHIP_ERROR_CANCELLED );
121
121
}
122
122
}
123
123
124
- void ResetState ()
124
+ void ResetState (CHIP_ERROR error )
125
125
{
126
126
assertChipStackLockedByCurrentThread ();
127
127
if (mNodeId .HasValue () && mFabricIndex .HasValue ()) {
128
128
ChipLogProgress (Controller,
129
129
" Resetting state for OTA Provider; no longer providing an update for node id 0x" ChipLogFormatX64
130
130
" , fabric index %u" ,
131
131
ChipLogValueX64 (mNodeId .Value ()), mFabricIndex .Value ());
132
+
133
+ if (mTransferStarted ) {
134
+ auto controller = [MTRDeviceControllerFactory.sharedInstance runningControllerForFabricIndex: mFabricIndex .Value ()];
135
+ if (controller) {
136
+ auto nodeId = @(mNodeId .Value ());
137
+ auto strongDelegate = mDelegate ;
138
+ if ([strongDelegate respondsToSelector: @selector (handleBDXTransferSessionEndForNodeID:controller:error: )]) {
139
+ dispatch_async (mDelegateNotificationQueue , ^{
140
+ [strongDelegate handleBDXTransferSessionEndForNodeID: nodeId
141
+ controller: controller
142
+ error: [MTRError errorForCHIPErrorCode: error]];
143
+ });
144
+ }
145
+ } else {
146
+ ChipLogError (Controller, " Not notifying delegate of BDX Transfer Session End, controller is not running" );
147
+ }
148
+ }
132
149
} else {
133
150
ChipLogProgress (Controller, " Resetting state for OTA Provider" );
134
151
}
@@ -153,6 +170,7 @@ void ResetState()
153
170
mDelegateNotificationQueue = nil ;
154
171
155
172
mInitialized = false ;
173
+ mTransferStarted = false ;
156
174
}
157
175
158
176
private:
@@ -162,7 +180,7 @@ void ResetState()
162
180
static void HandleBdxInitReceivedTimeoutExpired (chip::System::Layer * systemLayer, void * state)
163
181
{
164
182
VerifyOrReturn (state != nullptr );
165
- static_cast <BdxOTASender *>(state)->ResetState ();
183
+ static_cast <BdxOTASender *>(state)->ResetState (CHIP_ERROR_TIMEOUT );
166
184
}
167
185
168
186
CHIP_ERROR OnMessageToSend (TransferSession::OutputEvent & event)
@@ -188,12 +206,12 @@ CHIP_ERROR OnMessageToSend(TransferSession::OutputEvent & event)
188
206
if (err != CHIP_NO_ERROR) {
189
207
mExchangeCtx ->Close ();
190
208
mExchangeCtx = nullptr ;
191
- ResetState ();
192
- } else if (event. msgTypeData .HasMessageType (Protocols::SecureChannel::MsgType::StatusReport)) {
209
+ ResetState (err );
210
+ } else if (msgTypeData.HasMessageType (Protocols::SecureChannel::MsgType::StatusReport)) {
193
211
// If the send was successful for a status report, since we are not expecting a response the exchange context is
194
212
// already closed. We need to null out the reference to avoid having a dangling pointer.
195
213
mExchangeCtx = nullptr ;
196
- ResetState ();
214
+ ResetState (CHIP_ERROR_INTERNAL );
197
215
}
198
216
return err;
199
217
}
@@ -258,8 +276,8 @@ CHIP_ERROR OnTransferSessionBegin(TransferSession::OutputEvent & event)
258
276
}];
259
277
};
260
278
279
+ mTransferStarted = true ;
261
280
auto nodeId = @(mNodeId .Value ());
262
-
263
281
auto strongDelegate = mDelegate ;
264
282
dispatch_async (mDelegateNotificationQueue , ^{
265
283
if ([strongDelegate respondsToSelector: @selector (handleBDXTransferSessionBeginForNodeID:controller:fileDesignator:offset:completion: )]) {
@@ -294,20 +312,7 @@ CHIP_ERROR OnTransferSessionEnd(TransferSession::OutputEvent & event)
294
312
error = CHIP_ERROR_INTERNAL;
295
313
}
296
314
297
- auto * controller = [[MTRDeviceControllerFactory sharedInstance ] runningControllerForFabricIndex: mFabricIndex .Value ()];
298
- VerifyOrReturnError (controller != nil , CHIP_ERROR_INCORRECT_STATE);
299
- auto nodeId = @(mNodeId .Value ());
300
-
301
- auto strongDelegate = mDelegate ;
302
- if ([strongDelegate respondsToSelector: @selector (handleBDXTransferSessionEndForNodeID:controller:error: )]) {
303
- dispatch_async (mDelegateNotificationQueue , ^{
304
- [strongDelegate handleBDXTransferSessionEndForNodeID: nodeId
305
- controller: controller
306
- error: [MTRError errorForCHIPErrorCode: error]];
307
- });
308
- }
309
-
310
- ResetState ();
315
+ ResetState (error); // will notify the delegate
311
316
return CHIP_NO_ERROR;
312
317
}
313
318
@@ -438,7 +443,7 @@ CHIP_ERROR ConfigureState(chip::FabricIndex fabricIndex, chip::NodeId nodeId)
438
443
VerifyOrReturnError (mFabricIndex .Value () == fabricIndex && mNodeId .Value () == nodeId, CHIP_ERROR_BUSY);
439
444
440
445
// Reset stale connection from the same Node if exists.
441
- ResetState ();
446
+ ResetState (CHIP_ERROR_CANCELLED );
442
447
}
443
448
444
449
auto * controller = [[MTRDeviceControllerFactory sharedInstance ] runningControllerForFabricIndex: fabricIndex];
@@ -466,6 +471,7 @@ CHIP_ERROR ConfigureState(chip::FabricIndex fabricIndex, chip::NodeId nodeId)
466
471
}
467
472
468
473
bool mInitialized = false ;
474
+ bool mTransferStarted = false ;
469
475
Optional<FabricIndex> mFabricIndex ;
470
476
Optional<NodeId> mNodeId ;
471
477
id <MTROTAProviderDelegate> mDelegate = nil ;
@@ -489,7 +495,7 @@ CHIP_ERROR ConfigureState(chip::FabricIndex fabricIndex, chip::NodeId nodeId)
489
495
490
496
MTROTAProviderDelegateBridge::~MTROTAProviderDelegateBridge ()
491
497
{
492
- gOtaSender ->ResetState ();
498
+ gOtaSender ->ResetState (CHIP_ERROR_CANCELLED );
493
499
Clusters::OTAProvider::SetDelegate (kOtaProviderEndpoint , nullptr );
494
500
}
495
501
@@ -685,7 +691,7 @@ bool GetPeerNodeInfo(CommandHandler * commandHandler, const ConcreteCommandPath
685
691
handle.Release ();
686
692
// We need to reset state here to clean up any initialization we might have done including starting the BDX
687
693
// timeout timer while preparing for transfer if any failure occurs afterwards.
688
- gOtaSender ->ResetState ();
694
+ gOtaSender ->ResetState (err );
689
695
return ;
690
696
}
691
697
@@ -696,7 +702,7 @@ bool GetPeerNodeInfo(CommandHandler * commandHandler, const ConcreteCommandPath
696
702
LogErrorOnFailure (err);
697
703
handler->AddStatus (cachedCommandPath, StatusIB (err).mStatus );
698
704
handle.Release ();
699
- gOtaSender ->ResetState ();
705
+ gOtaSender ->ResetState (err );
700
706
return ;
701
707
}
702
708
delegateResponse.imageURI .SetValue (uri);
0 commit comments