@@ -648,7 +648,6 @@ static CHIP_ERROR MTREncodeTLVFromDataValueDictionary(id object, chip::TLV::TLVW
648
648
649
649
// Callback type to pass data value as an NSObject
650
650
typedef void (*MTRDataValueDictionaryCallback)(void * context, id value);
651
- typedef void (*MTRErrorCallback)(void * context, CHIP_ERROR error);
652
651
653
652
// Rename to be generic for decode and encode
654
653
class MTRDataValueDictionaryDecodableType {
@@ -689,9 +688,9 @@ CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const
689
688
// Callback bridge for MTRDataValueDictionaryCallback
690
689
class MTRDataValueDictionaryCallbackBridge : public MTRCallbackBridge <MTRDataValueDictionaryCallback> {
691
690
public:
692
- MTRDataValueDictionaryCallbackBridge (dispatch_queue_t queue, MTRBaseDevice * device, MTRDeviceResponseHandler handler,
693
- MTRActionBlock action, bool keepAlive = false )
694
- : MTRCallbackBridge<MTRDataValueDictionaryCallback>(queue, device, handler, action, OnSuccessFn, keepAlive) {};
691
+ MTRDataValueDictionaryCallbackBridge (
692
+ dispatch_queue_t queue, MTRDeviceResponseHandler handler, MTRActionBlock action, bool keepAlive = false )
693
+ : MTRCallbackBridge<MTRDataValueDictionaryCallback>(queue, handler, action, OnSuccessFn, keepAlive) {};
695
694
696
695
static void OnSuccessFn (void * context, id value) { DispatchSuccess (context, value); }
697
696
};
@@ -791,14 +790,9 @@ - (void)readAttributesWithEndpointID:(NSNumber * _Nullable)endpointID
791
790
clusterID = (clusterID == nil ) ? nil : [clusterID copy ];
792
791
attributeID = (attributeID == nil ) ? nil : [attributeID copy ];
793
792
params = (params == nil ) ? nil : [params copy ];
794
- new MTRDataValueDictionaryCallbackBridge (queue, self, completion,
795
- ^(ExchangeManager & exchangeManager, const SessionHandle & session, chip::Callback::Cancelable * success,
796
- chip::Callback::Cancelable * failure) {
797
- auto successFn = chip::Callback::Callback<MTRDataValueDictionaryCallback>::FromCancelable (success);
798
- auto failureFn = chip::Callback::Callback<MTRErrorCallback>::FromCancelable (failure);
799
- auto context = successFn->mContext ;
800
- auto successCb = successFn->mCall ;
801
- auto failureCb = failureFn->mCall ;
793
+ auto * bridge = new MTRDataValueDictionaryCallbackBridge (queue, completion,
794
+ ^(ExchangeManager & exchangeManager, const SessionHandle & session, MTRDataValueDictionaryCallback successCb,
795
+ MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
802
796
auto resultArray = [[NSMutableArray alloc ] init ];
803
797
auto resultSuccess = [[NSMutableArray alloc ] init ];
804
798
auto resultFailure = [[NSMutableArray alloc ] init ];
@@ -842,23 +836,23 @@ new MTRDataValueDictionaryCallbackBridge(queue, self, completion,
842
836
readParams.mAttributePathParamsListSize = 1 ;
843
837
readParams.mIsFabricFiltered = params.filterByFabric ;
844
838
845
- auto onDone = [resultArray, resultSuccess, resultFailure, context , successCb, failureCb](
839
+ auto onDone = [resultArray, resultSuccess, resultFailure, bridge , successCb, failureCb](
846
840
BufferedReadAttributeCallback<MTRDataValueDictionaryDecodableType> * callback) {
847
841
if ([resultFailure count ] > 0 || [resultSuccess count ] == 0 ) {
848
842
// Failure
849
843
if (failureCb) {
850
844
if ([resultFailure count ] > 0 ) {
851
- failureCb (context , [MTRError errorToCHIPErrorCode: resultFailure[0 ]]);
845
+ failureCb (bridge , [MTRError errorToCHIPErrorCode: resultFailure[0 ]]);
852
846
} else if ([resultArray count ] > 0 ) {
853
- failureCb (context , [MTRError errorToCHIPErrorCode: resultArray[0 ][MTRErrorKey]]);
847
+ failureCb (bridge , [MTRError errorToCHIPErrorCode: resultArray[0 ][MTRErrorKey]]);
854
848
} else {
855
- failureCb (context , CHIP_ERROR_READ_FAILED);
849
+ failureCb (bridge , CHIP_ERROR_READ_FAILED);
856
850
}
857
851
}
858
852
} else {
859
853
// Success
860
854
if (successCb) {
861
- successCb (context , resultArray);
855
+ successCb (bridge , resultArray);
862
856
}
863
857
}
864
858
chip::Platform::Delete (callback);
@@ -887,6 +881,7 @@ new MTRDataValueDictionaryCallbackBridge(queue, self, completion,
887
881
callback.release ();
888
882
return err;
889
883
});
884
+ std::move (*bridge).DispatchAction (self);
890
885
}
891
886
892
887
- (void )writeAttributeWithEndpointID : (NSNumber *)endpointID
@@ -897,14 +892,9 @@ - (void)writeAttributeWithEndpointID:(NSNumber *)endpointID
897
892
queue : (dispatch_queue_t )queue
898
893
completion : (MTRDeviceResponseHandler)completion
899
894
{
900
- new MTRDataValueDictionaryCallbackBridge (queue, self, completion,
901
- ^(ExchangeManager & exchangeManager, const SessionHandle & session, chip::Callback::Cancelable * success,
902
- chip::Callback::Cancelable * failure) {
903
- auto successFn = chip::Callback::Callback<MTRDataValueDictionaryCallback>::FromCancelable (success);
904
- auto failureFn = chip::Callback::Callback<MTRErrorCallback>::FromCancelable (failure);
905
- auto context = successFn->mContext ;
906
- auto successCb = successFn->mCall ;
907
- auto failureCb = failureFn->mCall ;
895
+ auto * bridge = new MTRDataValueDictionaryCallbackBridge (queue, completion,
896
+ ^(ExchangeManager & exchangeManager, const SessionHandle & session, MTRDataValueDictionaryCallback successCb,
897
+ MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
908
898
auto resultArray = [[NSMutableArray alloc ] init ];
909
899
auto resultSuccess = [[NSMutableArray alloc ] init ];
910
900
auto resultFailure = [[NSMutableArray alloc ] init ];
@@ -929,22 +919,22 @@ new MTRDataValueDictionaryCallbackBridge(queue, self, completion,
929
919
};
930
920
931
921
auto onDoneCb
932
- = [context , successCb, failureCb, resultArray, resultSuccess, resultFailure](app::WriteClient * pWriteClient) {
922
+ = [bridge , successCb, failureCb, resultArray, resultSuccess, resultFailure](app::WriteClient * pWriteClient) {
933
923
if ([resultFailure count ] > 0 || [resultSuccess count ] == 0 ) {
934
924
// Failure
935
925
if (failureCb) {
936
926
if ([resultFailure count ] > 0 ) {
937
- failureCb (context , [MTRError errorToCHIPErrorCode: resultFailure[0 ]]);
927
+ failureCb (bridge , [MTRError errorToCHIPErrorCode: resultFailure[0 ]]);
938
928
} else if ([resultArray count ] > 0 ) {
939
- failureCb (context , [MTRError errorToCHIPErrorCode: resultArray[0 ][MTRErrorKey]]);
929
+ failureCb (bridge , [MTRError errorToCHIPErrorCode: resultArray[0 ][MTRErrorKey]]);
940
930
} else {
941
- failureCb (context , CHIP_ERROR_WRITE_FAILED);
931
+ failureCb (bridge , CHIP_ERROR_WRITE_FAILED);
942
932
}
943
933
}
944
934
} else {
945
935
// Success
946
936
if (successCb) {
947
- successCb (context , resultArray);
937
+ successCb (bridge , resultArray);
948
938
}
949
939
}
950
940
};
@@ -956,6 +946,7 @@ new MTRDataValueDictionaryCallbackBridge(queue, self, completion,
956
946
onSuccessCb, onFailureCb, (timeoutMs == nil ) ? NullOptional : Optional<uint16_t >([timeoutMs unsignedShortValue ]),
957
947
onDoneCb, NullOptional);
958
948
});
949
+ std::move (*bridge).DispatchAction (self);
959
950
}
960
951
961
952
class NSObjectCommandCallback final : public app::CommandSender::Callback {
@@ -1045,14 +1036,9 @@ - (void)invokeCommandWithEndpointID:(NSNumber *)endpointID
1045
1036
commandFields = (commandFields == nil ) ? nil : [commandFields copy ];
1046
1037
timeoutMs = (timeoutMs == nil ) ? nil : [timeoutMs copy ];
1047
1038
1048
- new MTRDataValueDictionaryCallbackBridge (queue, self, completion,
1049
- ^(ExchangeManager & exchangeManager, const SessionHandle & session, chip::Callback::Cancelable * success,
1050
- chip::Callback::Cancelable * failure) {
1051
- auto successFn = chip::Callback::Callback<MTRDataValueDictionaryCallback>::FromCancelable (success);
1052
- auto failureFn = chip::Callback::Callback<MTRErrorCallback>::FromCancelable (failure);
1053
- auto context = successFn->mContext ;
1054
- auto successCb = successFn->mCall ;
1055
- auto failureCb = failureFn->mCall ;
1039
+ auto * bridge = new MTRDataValueDictionaryCallbackBridge (queue, completion,
1040
+ ^(ExchangeManager & exchangeManager, const SessionHandle & session, MTRDataValueDictionaryCallback successCb,
1041
+ MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
1056
1042
auto resultArray = [[NSMutableArray alloc ] init ];
1057
1043
auto resultSuccess = [[NSMutableArray alloc ] init ];
1058
1044
auto resultFailure = [[NSMutableArray alloc ] init ];
@@ -1086,21 +1072,21 @@ new MTRDataValueDictionaryCallbackBridge(queue, self, completion,
1086
1072
VerifyOrReturnError (decoder != nullptr , CHIP_ERROR_NO_MEMORY);
1087
1073
1088
1074
auto rawDecoderPtr = decoder.get ();
1089
- auto onDoneCb = [rawDecoderPtr, context , successCb, failureCb, resultArray, resultSuccess, resultFailure](
1075
+ auto onDoneCb = [rawDecoderPtr, bridge , successCb, failureCb, resultArray, resultSuccess, resultFailure](
1090
1076
app::CommandSender * commandSender) {
1091
1077
if ([resultFailure count ] > 0 || [resultSuccess count ] == 0 ) {
1092
1078
// Failure
1093
1079
if (failureCb) {
1094
1080
if ([resultFailure count ] > 0 ) {
1095
- failureCb (context , [MTRError errorToCHIPErrorCode: resultFailure[0 ]]);
1081
+ failureCb (bridge , [MTRError errorToCHIPErrorCode: resultFailure[0 ]]);
1096
1082
} else {
1097
- failureCb (context , CHIP_ERROR_WRITE_FAILED);
1083
+ failureCb (bridge , CHIP_ERROR_WRITE_FAILED);
1098
1084
}
1099
1085
}
1100
1086
} else {
1101
1087
// Success
1102
1088
if (successCb) {
1103
- successCb (context , resultArray);
1089
+ successCb (bridge , resultArray);
1104
1090
}
1105
1091
}
1106
1092
chip::Platform::Delete (commandSender);
@@ -1121,6 +1107,7 @@ new MTRDataValueDictionaryCallbackBridge(queue, self, completion,
1121
1107
commandSender.release ();
1122
1108
return CHIP_NO_ERROR;
1123
1109
});
1110
+ std::move (*bridge).DispatchAction (self);
1124
1111
}
1125
1112
1126
1113
- (void )subscribeToAttributesWithEndpointID : (NSNumber * _Nullable)endpointID
0 commit comments