@@ -378,6 +378,60 @@ bool GetPeerNodeInfo(CommandHandler * commandHandler, const ConcreteCommandPath
378
378
*outNodeId = desc.subject ;
379
379
return true ;
380
380
}
381
+
382
+ // Ensures we have a usable CommandHandler and do not have an error.
383
+ //
384
+ // When this function returns non-null, it's safe to go ahead and use the return
385
+ // value to send a response.
386
+ //
387
+ // When this function returns null, the CommandHandler::Handle should not be
388
+ // used anymore.
389
+ CommandHandler * _Nullable EnsureValidState (
390
+ CommandHandler::Handle & handle, const ConcreteCommandPath & cachedCommandPath, const char * prefix, NSError * _Nullable error)
391
+ {
392
+ CommandHandler * handler = handle.Get ();
393
+ if (handler == nullptr ) {
394
+ ChipLogError (Controller, " %s: no CommandHandler to send response" , prefix);
395
+ return nullptr ;
396
+ }
397
+
398
+ if (error != nil ) {
399
+ auto * desc = [error description ];
400
+ auto err = [MTRError errorToCHIPErrorCode: error];
401
+ ChipLogError (Controller, " %s: application returned error: '%s', sending error: '%s'" , prefix,
402
+ [desc cStringUsingEncoding: NSUTF8StringEncoding], chip::ErrorStr (err));
403
+
404
+ handler->AddStatus (cachedCommandPath, StatusIB (err).mStatus );
405
+ handle.Release ();
406
+ return nullptr ;
407
+ }
408
+
409
+ return handler;
410
+ }
411
+
412
+ // Ensures we have a usable CommandHandler and that our args don't involve any
413
+ // errors, for the case when we have data to send back.
414
+ //
415
+ // When this function returns non-null, it's safe to go ahead and use whatever
416
+ // object "data" points to to add a response to the command.
417
+ //
418
+ // When this function returns null, the CommandHandler::Handle should not be
419
+ // used anymore.
420
+ CommandHandler * _Nullable EnsureValidState (CommandHandler::Handle & handle, const ConcreteCommandPath & cachedCommandPath,
421
+ const char * prefix, NSObject * _Nullable data, NSError * _Nullable error)
422
+ {
423
+ CommandHandler * handler = EnsureValidState (handle, cachedCommandPath, prefix, error);
424
+ VerifyOrReturnValue (handler != nullptr , nullptr );
425
+
426
+ if (data == nil ) {
427
+ ChipLogError (Controller, " %s: no data to send as a response" , prefix);
428
+ handler->AddStatus (cachedCommandPath, Protocols::InteractionModel::Status::Failure);
429
+ handle.Release ();
430
+ return nullptr ;
431
+ }
432
+
433
+ return handler;
434
+ }
381
435
} // anonymous namespace
382
436
383
437
void MTROTAProviderDelegateBridge::HandleQueryImage (
@@ -403,9 +457,12 @@ bool GetPeerNodeInfo(CommandHandler * commandHandler, const ConcreteCommandPath
403
457
auto completionHandler = ^(
404
458
MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data, NSError * _Nullable error) {
405
459
dispatch_async (mWorkQueue , ^{
406
- CommandHandler * handler = handle. Get ( );
460
+ CommandHandler * handler = EnsureValidState (handle, cachedCommandPath, " QueryImage " , data, error );
407
461
VerifyOrReturn (handler != nullptr );
408
462
463
+ ChipLogDetail (Controller, " QueryImage: application responded with: %s" ,
464
+ [[data description ] cStringUsingEncoding: NSUTF8StringEncoding]);
465
+
409
466
Commands::QueryImageResponse::Type response;
410
467
ConvertFromQueryImageResponseParms (data, response);
411
468
@@ -472,9 +529,12 @@ bool GetPeerNodeInfo(CommandHandler * commandHandler, const ConcreteCommandPath
472
529
auto completionHandler
473
530
= ^(MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data, NSError * _Nullable error) {
474
531
dispatch_async (mWorkQueue , ^{
475
- CommandHandler * handler = handle. Get ( );
532
+ CommandHandler * handler = EnsureValidState (handle, cachedCommandPath, " ApplyUpdateRequest " , data, error );
476
533
VerifyOrReturn (handler != nullptr );
477
534
535
+ ChipLogDetail (Controller, " ApplyUpdateRequest: application responded with: %s" ,
536
+ [[data description ] cStringUsingEncoding: NSUTF8StringEncoding]);
537
+
478
538
Commands::ApplyUpdateResponse::Type response;
479
539
ConvertFromApplyUpdateRequestResponseParms (data, response);
480
540
handler->AddResponse (cachedCommandPath, response);
@@ -509,7 +569,7 @@ bool GetPeerNodeInfo(CommandHandler * commandHandler, const ConcreteCommandPath
509
569
510
570
auto completionHandler = ^(NSError * _Nullable error) {
511
571
dispatch_async (mWorkQueue , ^{
512
- CommandHandler * handler = handle. Get ( );
572
+ CommandHandler * handler = EnsureValidState (handle, cachedCommandPath, " NotifyUpdateApplied " , error );
513
573
VerifyOrReturn (handler != nullptr );
514
574
515
575
handler->AddStatus (cachedCommandPath, Protocols::InteractionModel::Status::Success);
0 commit comments