@@ -41,6 +41,8 @@ static const int MILLIS_SINCE_EPOCH = 1;
41
41
// Add the bytes for attribute tag(1:control + 8:tag + 8:length) and structure(1:struct + 1:close container)
42
42
static const int EXTRA_SPACE_FOR_ATTRIBUTE_TAG = 19 ;
43
43
44
+ jobject DecodeGeneralTLVValue (JNIEnv * env, TLV::TLVReader & readerForGeneralValueObject, CHIP_ERROR & err);
45
+
44
46
GetConnectedDeviceCallback::GetConnectedDeviceCallback (jobject wrapperCallback, jobject javaCallback,
45
47
const char * callbackClassSignature) :
46
48
mOnSuccess (OnDeviceConnectedFn, this ),
@@ -314,20 +316,24 @@ void ReportCallback::OnAttributeData(const app::ConcreteDataAttributePath & aPat
314
316
readerForJavaTLV.Init (*apData);
315
317
316
318
jobject value = nullptr ;
317
- #ifdef USE_JAVA_TLV_ENCODE_DECODE
318
319
TLV::TLVReader readerForJavaObject;
319
320
readerForJavaObject.Init (*apData);
320
-
321
+ # ifdef USE_JAVA_TLV_ENCODE_DECODE
321
322
value = DecodeAttributeValue (aPath, readerForJavaObject, &err);
322
323
// If we don't know this attribute, suppress it.
323
324
if (err == CHIP_ERROR_IM_MALFORMED_ATTRIBUTE_PATH_IB)
324
325
{
325
- err = CHIP_NO_ERROR;
326
+ TLV::TLVReader readerForGeneralValueObject;
327
+ readerForGeneralValueObject.Init (*apData);
328
+ value = DecodeGeneralTLVValue (env, readerForGeneralValueObject, err);
329
+ err = CHIP_NO_ERROR;
326
330
}
327
331
328
332
VerifyOrReturn (err == CHIP_NO_ERROR, ChipLogError (Controller, " Fail to decode attribute with error %s" , ErrorStr (err));
329
333
aPath.LogPath ());
330
334
VerifyOrReturn (!env->ExceptionCheck (), env->ExceptionDescribe ());
335
+ #else
336
+ value = DecodeGeneralTLVValue (env, readerForJavaObject, err);
331
337
#endif
332
338
// Create TLV byte array to pass to Java layer
333
339
size_t bufferLen = readerForJavaTLV.GetRemainingLength () + readerForJavaTLV.GetLengthRead ();
@@ -468,18 +474,23 @@ void ReportCallback::OnEventData(const app::EventHeader & aEventHeader, TLV::TLV
468
474
}
469
475
470
476
jobject value = nullptr ;
471
- #ifdef USE_JAVA_TLV_ENCODE_DECODE
472
477
TLV::TLVReader readerForJavaObject;
473
478
readerForJavaObject.Init (*apData);
479
+ #ifdef USE_JAVA_TLV_ENCODE_DECODE
474
480
value = DecodeEventValue (aEventHeader.mPath , readerForJavaObject, &err);
475
481
// If we don't know this event, just skip it.
476
482
if (err == CHIP_ERROR_IM_MALFORMED_EVENT_PATH_IB)
477
483
{
478
- err = CHIP_NO_ERROR;
484
+ TLV::TLVReader readerForGeneralValueObject;
485
+ readerForGeneralValueObject.Init (*apData);
486
+ value = DecodeGeneralTLVValue (env, readerForGeneralValueObject, err);
487
+ err = CHIP_NO_ERROR;
479
488
}
480
489
VerifyOrReturn (err == CHIP_NO_ERROR, ChipLogError (Controller, " Fail to decode event with error %s" , ErrorStr (err));
481
490
aEventHeader.LogPath ());
482
491
VerifyOrReturn (!env->ExceptionCheck (), env->ExceptionDescribe ());
492
+ #else
493
+ value = DecodeGeneralTLVValue (env, readerForJavaObject, err);
483
494
#endif
484
495
485
496
// Create TLV byte array to pass to Java layer
@@ -907,6 +918,111 @@ void InvokeCallback::ReportError(const char * message, ChipError::StorageType er
907
918
VerifyOrReturn (!env->ExceptionCheck (), env->ExceptionDescribe ());
908
919
}
909
920
921
+ jobject DecodeGeneralTLVValue (JNIEnv * env, TLV::TLVReader & readerForGeneralValueObject, CHIP_ERROR & err)
922
+ {
923
+ jobject retValue = nullptr ;
924
+
925
+ switch (readerForGeneralValueObject.GetType ())
926
+ {
927
+ case TLV::kTLVType_SignedInteger : {
928
+ int64_t signedValue = 0 ;
929
+ VerifyOrReturnValue (readerForGeneralValueObject.Get (signedValue) == CHIP_NO_ERROR, nullptr ,
930
+ ChipLogProgress (Controller, " Get TLV Value fail!" ));
931
+ err = JniReferences::GetInstance ().CreateBoxedObject <jlong>(" java/lang/Long" , " (J)V" , static_cast <jlong>(signedValue),
932
+ retValue);
933
+ VerifyOrReturnValue (err == CHIP_NO_ERROR, nullptr , ChipLogProgress (Controller, " Create Boxed Object fail!" ));
934
+ return retValue;
935
+ }
936
+ case TLV::kTLVType_UnsignedInteger : {
937
+ uint64_t unsignedValue = 0 ;
938
+ VerifyOrReturnValue (readerForGeneralValueObject.Get (unsignedValue) == CHIP_NO_ERROR, nullptr ,
939
+ ChipLogProgress (Controller, " Get TLV Value fail!" ));
940
+ err = JniReferences::GetInstance ().CreateBoxedObject <jlong>(" java/lang/Long" , " (J)V" , static_cast <jlong>(unsignedValue),
941
+ retValue);
942
+ VerifyOrReturnValue (err == CHIP_NO_ERROR, nullptr , ChipLogProgress (Controller, " Create Boxed Object fail!" ));
943
+ return retValue;
944
+ }
945
+ case TLV::kTLVType_Boolean : {
946
+ bool booleanValue = false ;
947
+ VerifyOrReturnValue (readerForGeneralValueObject.Get (booleanValue) == CHIP_NO_ERROR, nullptr ,
948
+ ChipLogProgress (Controller, " Get TLV Value fail!" ));
949
+ err = JniReferences::GetInstance ().CreateBoxedObject <jboolean>(" java/lang/Boolean" , " (Z)V" ,
950
+ static_cast <jboolean>(booleanValue), retValue);
951
+ VerifyOrReturnValue (err == CHIP_NO_ERROR, nullptr , ChipLogProgress (Controller, " Create Boxed Object fail!" ));
952
+ return retValue;
953
+ }
954
+ case TLV::kTLVType_FloatingPointNumber : {
955
+ double doubleValue = 0.0 ;
956
+ VerifyOrReturnValue (readerForGeneralValueObject.Get (doubleValue) == CHIP_NO_ERROR, nullptr ,
957
+ ChipLogProgress (Controller, " Get TLV Value fail!" ));
958
+ err = JniReferences::GetInstance ().CreateBoxedObject <jdouble>(" java/lang/Double" , " (D)V" , static_cast <jdouble>(doubleValue),
959
+ retValue);
960
+ VerifyOrReturnValue (err == CHIP_NO_ERROR, nullptr , ChipLogProgress (Controller, " Create Boxed Object fail!" ));
961
+ return retValue;
962
+ }
963
+ case TLV::kTLVType_UTF8String : {
964
+ uint32_t bufferLen = readerForGeneralValueObject.GetLength ();
965
+ std::unique_ptr<char []> buffer = std::unique_ptr<char []>(new char [bufferLen + 1 ]);
966
+ err = readerForGeneralValueObject.GetString (buffer.get (), bufferLen + 1 );
967
+ VerifyOrReturnValue (err == CHIP_NO_ERROR, nullptr , ChipLogProgress (Controller, " Get TLV Value fail!" ));
968
+ chip::CharSpan valueSpan (buffer.get (), bufferLen);
969
+ chip::JniReferences::GetInstance ().CharToStringUTF (valueSpan, retValue);
970
+ return retValue;
971
+ }
972
+ case TLV::kTLVType_ByteString : {
973
+ uint32_t bufferLen = readerForGeneralValueObject.GetLength ();
974
+ std::unique_ptr<uint8_t []> buffer = std::unique_ptr<uint8_t []>(new uint8_t [bufferLen + 1 ]);
975
+ err = readerForGeneralValueObject.GetBytes (buffer.get (), bufferLen + 1 );
976
+ VerifyOrReturnValue (err == CHIP_NO_ERROR, nullptr , ChipLogProgress (Controller, " Get TLV Value fail!" ));
977
+
978
+ jbyteArray valueByteArray = env->NewByteArray (static_cast <jsize>(bufferLen));
979
+ env->SetByteArrayRegion (valueByteArray, 0 , static_cast <jsize>(bufferLen), reinterpret_cast <const jbyte *>(buffer.get ()));
980
+
981
+ return static_cast <jobject>(valueByteArray);
982
+ }
983
+ case TLV::kTLVType_Array : {
984
+ TLV::TLVType containerType;
985
+ err = readerForGeneralValueObject.EnterContainer (containerType);
986
+ VerifyOrReturnValue (err == CHIP_NO_ERROR, nullptr ,
987
+ ChipLogProgress (Controller, " EnterContainer fail! : %" CHIP_ERROR_FORMAT, err.Format ()));
988
+ err = chip::JniReferences::GetInstance ().CreateArrayList (retValue);
989
+ VerifyOrReturnValue (err == CHIP_NO_ERROR, nullptr ,
990
+ ChipLogProgress (Controller, " CreateArrayList fail! : %" CHIP_ERROR_FORMAT, err.Format ()));
991
+ while (readerForGeneralValueObject.Next () == CHIP_NO_ERROR)
992
+ {
993
+ jobject inValue = DecodeGeneralTLVValue (env, readerForGeneralValueObject, err);
994
+ VerifyOrReturnValue (err == CHIP_NO_ERROR, nullptr ,
995
+ ChipLogProgress (Controller, " Can't parse general value : %" CHIP_ERROR_FORMAT, err.Format ()));
996
+ err = chip::JniReferences::GetInstance ().AddToList (retValue, inValue);
997
+ }
998
+ return retValue;
999
+ }
1000
+ case TLV::kTLVType_List : {
1001
+ TLV::TLVType containerType;
1002
+ err = readerForGeneralValueObject.EnterContainer (containerType);
1003
+ VerifyOrReturnValue (err == CHIP_NO_ERROR, nullptr ,
1004
+ ChipLogProgress (Controller, " EnterContainer fail! : %" CHIP_ERROR_FORMAT, err.Format ()));
1005
+ err = chip::JniReferences::GetInstance ().CreateArrayList (retValue);
1006
+ VerifyOrReturnValue (err == CHIP_NO_ERROR, nullptr ,
1007
+ ChipLogProgress (Controller, " CreateArrayList fail! : %" CHIP_ERROR_FORMAT, err.Format ()));
1008
+ while (readerForGeneralValueObject.Next () == CHIP_NO_ERROR)
1009
+ {
1010
+ jobject inValue = DecodeGeneralTLVValue (env, readerForGeneralValueObject, err);
1011
+ VerifyOrReturnValue (err == CHIP_NO_ERROR, nullptr ,
1012
+ ChipLogProgress (Controller, " Can't parse general value : %" CHIP_ERROR_FORMAT, err.Format ()));
1013
+ err = chip::JniReferences::GetInstance ().AddToList (retValue, inValue);
1014
+ }
1015
+ return retValue;
1016
+ }
1017
+ case TLV::kTLVType_Null : {
1018
+ return nullptr ;
1019
+ }
1020
+ default :
1021
+ err = CHIP_ERROR_WRONG_TLV_TYPE;
1022
+ return nullptr ;
1023
+ }
1024
+ }
1025
+
910
1026
jlong newConnectedDeviceCallback (JNIEnv * env, jobject self, jobject callback)
911
1027
{
912
1028
chip::DeviceLayer::StackLock lock;
0 commit comments