@@ -127,19 +127,27 @@ void GetConnectedDeviceCallback::OnDeviceConnectionFailureFn(void * context,
127
127
128
128
CHIP_ERROR CreateOptional (chip::Optional<uint8_t > value, jobject & outObj)
129
129
{
130
- jobject jOptionalValue = nullptr ;
131
- jobject jValue = nullptr ;
132
- if (value.HasValue ()) {
133
- ReturnLogErrorOnFailure (JniReferences::GetInstance ().CreateBoxedObject <jint>(" java/lang/Integer" , " (I)V" , static_cast <jint>(value.Value ()), jValue));
134
- }
135
- ReturnLogErrorOnFailure (JniReferences::GetInstance ().CreateOptional (jValue, jOptionalValue));
130
+
131
+
136
132
137
133
return CHIP_NO_ERROR;
138
134
}
135
+ jobject GetNodeStateObj (JNIEnv * env, const char * nodeStateClassSignature, jobject wrapperCallback)
136
+ {
137
+ jmethodID getNodeStateMethod;
138
+ CHIP_ERROR err = JniReferences::GetInstance ().FindMethod (env, wrapperCallback, " getNodeState" , nodeStateClassSignature, &getNodeStateMethod);
139
+ VerifyOrReturnValue (err == CHIP_NO_ERROR, nullptr , ChipLogError (Controller, " Could not find getNodeState method" ));
140
+
141
+ DeviceLayer::StackUnlock unlock;
142
+ jobject ret = env->CallObjectMethod (wrapperCallback, getNodeStateMethod);
143
+ VerifyOrReturnValue (!env->ExceptionCheck (), nullptr , env->ExceptionDescribe ());
144
+
145
+ return ret;
146
+ }
139
147
140
148
ReportCallback::ReportCallback (jobject wrapperCallback, jobject subscriptionEstablishedCallback,
141
- jobject resubscriptionAttemptCallback) :
142
- mClusterCacheAdapter (*this , Optional<EventNumber>::Missing(), false /* cacheData*/ )
149
+ jobject resubscriptionAttemptCallback, const char * nodeStateClassSignature ) :
150
+ mClusterCacheAdapter (*this , Optional<EventNumber>::Missing(), false /* cacheData*/ ), mNodeStateClassSignature (nodeStateClassSignature)
143
151
{
144
152
JNIEnv * env = JniReferences::GetInstance ().GetEnvForCurrentThread ();
145
153
VerifyOrReturn (env != nullptr , ChipLogError (Controller, " Could not get JNIEnv for current thread" ));
@@ -271,25 +279,26 @@ void ReportCallback::OnAttributeData(const app::ConcreteDataAttributePath & aPat
271
279
ChipLogError (Controller, " mReportCallbackRef is not valid in %s" , __func__));
272
280
jobject wrapperCallback = mWrapperCallbackRef .ObjectRef ();
273
281
282
+ jobject nodeState = GetNodeStateObj (env, mNodeStateClassSignature , wrapperCallback);
274
283
if (aStatus.IsFailure ())
275
284
{
276
285
ChipLogError (Controller, " Receive bad status %s" , ErrorStr (aStatus.ToChipError ()));
277
286
// Add Attribute Status to wrapperCallback
278
287
jmethodID addAttributeStatusMethod = nullptr ;
279
- err = JniReferences::GetInstance ().FindMethod (env, wrapperCallback , " addAttributeStatus" ,
280
- " (IJJILjava/util/Optional ;)V" , &addAttributeStatusMethod);
288
+ err = JniReferences::GetInstance ().FindMethod (env, nodeState , " addAttributeStatus" ,
289
+ " (IJJILjava/lang/Integer ;)V" , &addAttributeStatusMethod);
281
290
VerifyOrReturn (
282
291
err == CHIP_NO_ERROR,
283
292
ChipLogError (Controller, " Could not find addAttributeStatus method with error %" CHIP_ERROR_FORMAT, err.Format ()));
284
293
285
- jobject jClusterStateOptional = nullptr ;
286
- err = CreateOptional (aStatus.mClusterStatus , jClusterStateOptional);
287
- VerifyOrReturn (
288
- err == CHIP_NO_ERROR,
289
- ChipLogError (Controller, " Could not CreateOptional with error % " CHIP_ERROR_FORMAT, err. Format ()));
294
+ jobject jClusterState = nullptr ;
295
+ if (aStatus.mClusterStatus . HasValue ()) {
296
+ err = JniReferences::GetInstance (). CreateBoxedObject <jint>( " java/lang/Integer " , " (I)V " , static_cast <jint>(aStatus. mClusterStatus . Value ()), jClusterState);
297
+ VerifyOrReturn ( err == CHIP_NO_ERROR, ChipLogError (Controller, " Could not CreateBoxedObject with error % " CHIP_ERROR_FORMAT, err. Format ()));
298
+ }
290
299
291
- env->CallVoidMethod (wrapperCallback , addAttributeStatusMethod, static_cast <jint>(aPath.mEndpointId ),
292
- static_cast <jlong>(aPath.mClusterId ), static_cast <jlong>(aPath.mAttributeId ), static_cast <jint>(aStatus.mStatus ), jClusterStateOptional );
300
+ env->CallVoidMethod (nodeState , addAttributeStatusMethod, static_cast <jint>(aPath.mEndpointId ),
301
+ static_cast <jlong>(aPath.mClusterId ), static_cast <jlong>(aPath.mAttributeId ), static_cast <jint>(aStatus.mStatus ), jClusterState );
293
302
VerifyOrReturn (!env->ExceptionCheck (), env->ExceptionDescribe ());
294
303
return ;
295
304
}
@@ -340,11 +349,11 @@ void ReportCallback::OnAttributeData(const app::ConcreteDataAttributePath & aPat
340
349
341
350
// Add AttributeState to wrapperCallback
342
351
jmethodID addAttributeMethod;
343
- err = JniReferences::GetInstance ().FindMethod (env, wrapperCallback , " addAttribute" ,
352
+ err = JniReferences::GetInstance ().FindMethod (env, nodeState , " addAttribute" ,
344
353
" (IJJLjava/lang/Object;[BLjava/lang/String;)V" , &addAttributeMethod);
345
354
VerifyOrReturn (err == CHIP_NO_ERROR,
346
355
ChipLogError (Controller, " Could not find addAttribute method with error %s" , ErrorStr (err)));
347
- env->CallVoidMethod (wrapperCallback , addAttributeMethod, static_cast <jint>(aPath.mEndpointId ),
356
+ env->CallVoidMethod (nodeState , addAttributeMethod, static_cast <jint>(aPath.mEndpointId ),
348
357
static_cast <jlong>(aPath.mClusterId ), static_cast <jlong>(aPath.mAttributeId ), value,
349
358
jniByteArray.jniValue (), jsonString.jniValue ());
350
359
VerifyOrReturn (!env->ExceptionCheck (), env->ExceptionDescribe ());
@@ -381,13 +390,14 @@ void ReportCallback::UpdateClusterDataVersion()
381
390
VerifyOrReturn (mWrapperCallbackRef .HasValidObjectRef (),
382
391
ChipLogError (Controller, " mReportCallbackRef is not valid in %s" , __func__));
383
392
jobject wrapperCallback = mWrapperCallbackRef .ObjectRef ();
393
+ jobject nodeState = GetNodeStateObj (env, mNodeStateClassSignature , wrapperCallback);
384
394
385
395
// SetDataVersion to NodeState
386
396
jmethodID setDataVersionMethod;
387
397
CHIP_ERROR err =
388
- JniReferences::GetInstance ().FindMethod (env, wrapperCallback , " setDataVersion" , " (IJJ)V" , &setDataVersionMethod);
398
+ JniReferences::GetInstance ().FindMethod (env, nodeState , " setDataVersion" , " (IJJ)V" , &setDataVersionMethod);
389
399
VerifyOrReturn (err == CHIP_NO_ERROR, ChipLogError (Controller, " Could not find setDataVersion method" ));
390
- env->CallVoidMethod (wrapperCallback , setDataVersionMethod, static_cast <jint>(lastConcreteClusterPath.mEndpointId ),
400
+ env->CallVoidMethod (nodeState , setDataVersionMethod, static_cast <jint>(lastConcreteClusterPath.mEndpointId ),
391
401
static_cast <jlong>(lastConcreteClusterPath.mClusterId ), static_cast <jlong>(committedDataVersion.Value ()));
392
402
VerifyOrReturn (!env->ExceptionCheck (), env->ExceptionDescribe ());
393
403
}
@@ -401,26 +411,27 @@ void ReportCallback::OnEventData(const app::EventHeader & aEventHeader, TLV::TLV
401
411
VerifyOrReturn (mWrapperCallbackRef .HasValidObjectRef (),
402
412
ChipLogError (Controller, " mReportCallbackRef is not valid in %s" , __func__));
403
413
jobject wrapperCallback = mWrapperCallbackRef .ObjectRef ();
414
+ jobject nodeState = GetNodeStateObj (env, mNodeStateClassSignature , wrapperCallback);
404
415
if (apStatus != nullptr && apStatus->IsFailure ())
405
416
{
406
417
ChipLogError (Controller, " Receive bad status %s" , ErrorStr (apStatus->ToChipError ()));
407
418
// Add Event Status to NodeState
408
419
jmethodID addEventStatusMethod;
409
- err = JniReferences::GetInstance ().FindMethod (env, wrapperCallback , " addEventStatus" ,
410
- " (IJJILjava/util/Optional ;)V" , &addEventStatusMethod);
420
+ err = JniReferences::GetInstance ().FindMethod (env, nodeState , " addEventStatus" ,
421
+ " (IJJILjava/lang/Integer ;)V" , &addEventStatusMethod);
411
422
VerifyOrReturn (
412
423
err == CHIP_NO_ERROR,
413
424
ChipLogError (Controller, " Could not find addEventStatus method with error %" CHIP_ERROR_FORMAT, err.Format ()));
414
425
415
- jobject jClusterStateOptional = nullptr ;
416
- err = CreateOptional (apStatus->mClusterStatus , jClusterStateOptional);
417
- VerifyOrReturn (
418
- err == CHIP_NO_ERROR,
419
- ChipLogError (Controller, " Could not CreateOptional with error % " CHIP_ERROR_FORMAT, err. Format ()));
426
+ jobject jClusterState = nullptr ;
427
+ if (apStatus->mClusterStatus . HasValue ()) {
428
+ err = JniReferences::GetInstance (). CreateBoxedObject <jint>( " java/lang/Integer " , " (I)V " , static_cast <jint>(apStatus-> mClusterStatus . Value ()), jClusterState);
429
+ VerifyOrReturn ( err == CHIP_NO_ERROR, ChipLogError (Controller, " Could not CreateBoxedObject with error % " CHIP_ERROR_FORMAT, err. Format ()));
430
+ }
420
431
421
- env->CallVoidMethod (wrapperCallback , addEventStatusMethod, static_cast <jint>(aEventHeader.mPath .mEndpointId ),
432
+ env->CallVoidMethod (nodeState , addEventStatusMethod, static_cast <jint>(aEventHeader.mPath .mEndpointId ),
422
433
static_cast <jlong>(aEventHeader.mPath .mClusterId ), static_cast <jlong>(aEventHeader.mPath .mEventId ),
423
- static_cast <jint>(apStatus->mStatus ), jClusterStateOptional );
434
+ static_cast <jint>(apStatus->mStatus ), jClusterState );
424
435
VerifyOrReturn (!env->ExceptionCheck (), env->ExceptionDescribe ());
425
436
return ;
426
437
}
@@ -489,11 +500,11 @@ void ReportCallback::OnEventData(const app::EventHeader & aEventHeader, TLV::TLV
489
500
UtfString jsonString (env, json.c_str ());
490
501
491
502
jmethodID addEventMethod;
492
- err = JniReferences::GetInstance ().FindMethod (env, wrapperCallback , " addEvent" ,
503
+ err = JniReferences::GetInstance ().FindMethod (env, nodeState , " addEvent" ,
493
504
" (IJJJIIJLjava/lang/Object;[BLjava/lang/String;)V" , &addEventMethod);
494
505
VerifyOrReturn (err == CHIP_NO_ERROR, ChipLogError (Controller, " Could not find addEvent method with error %s" , ErrorStr (err));
495
506
aEventHeader.LogPath ());
496
- env->CallVoidMethod (wrapperCallback , addEventMethod, static_cast <jint>(aEventHeader.mPath .mEndpointId ),
507
+ env->CallVoidMethod (nodeState , addEventMethod, static_cast <jint>(aEventHeader.mPath .mEndpointId ),
497
508
static_cast <jlong>(aEventHeader.mPath .mClusterId ), static_cast <jlong>(aEventHeader.mPath .mEventId ),
498
509
eventNumber, priorityLevel, timestampType, timestampValue, value, jniByteArray.jniValue (),
499
510
jsonString.jniValue ());
@@ -900,11 +911,11 @@ void deleteConnectedDeviceCallback(JNIEnv * env, jobject self, jlong callbackHan
900
911
}
901
912
902
913
jlong newReportCallback (JNIEnv * env, jobject self, jobject subscriptionEstablishedCallbackJava,
903
- jobject resubscriptionAttemptCallbackJava)
914
+ jobject resubscriptionAttemptCallbackJava, const char * nodeStateClassSignature )
904
915
{
905
916
chip::DeviceLayer::StackLock lock;
906
917
ReportCallback * reportCallback =
907
- chip::Platform::New<ReportCallback>(self, subscriptionEstablishedCallbackJava, resubscriptionAttemptCallbackJava);
918
+ chip::Platform::New<ReportCallback>(self, subscriptionEstablishedCallbackJava, resubscriptionAttemptCallbackJava, nodeStateClassSignature );
908
919
return reinterpret_cast <jlong>(reportCallback);
909
920
}
910
921
0 commit comments