@@ -55,22 +55,6 @@ CHIP_ERROR CreateChipAttributePath(JNIEnv * env, const app::ConcreteDataAttribut
55
55
return CHIP_NO_ERROR;
56
56
}
57
57
58
- CHIP_ERROR ReportCallback::CreateChipEventPath (JNIEnv * env, const app::ConcreteEventPath & aPath, jobject & outObj)
59
- {
60
- jclass eventPathCls = nullptr ;
61
- ReturnErrorOnFailure (
62
- JniReferences::GetInstance ().GetLocalClassRef (env, " chip/devicecontroller/model/ChipEventPath" , eventPathCls));
63
-
64
- jmethodID eventPathCtor =
65
- env->GetStaticMethodID (eventPathCls, " newInstance" , " (IJJ)Lchip/devicecontroller/model/ChipEventPath;" );
66
- VerifyOrReturnError (eventPathCtor != nullptr , CHIP_JNI_ERROR_METHOD_NOT_FOUND);
67
-
68
- outObj = env->CallStaticObjectMethod (eventPathCls, eventPathCtor, static_cast <jint>(aPath.mEndpointId ),
69
- static_cast <jlong>(aPath.mClusterId ), static_cast <jlong>(aPath.mEventId ));
70
- VerifyOrReturnError (outObj != nullptr , CHIP_JNI_ERROR_NULL_OBJECT);
71
- return CHIP_NO_ERROR;
72
- }
73
-
74
58
GetConnectedDeviceCallback::GetConnectedDeviceCallback (jobject wrapperCallback, jobject javaCallback) :
75
59
mOnSuccess (OnDeviceConnectedFn, this ), mOnFailure (OnDeviceConnectionFailureFn, this )
76
60
{
@@ -270,21 +254,59 @@ CHIP_ERROR ConvertReportTlvToJson(const uint32_t id, TLV::TLVReader & data, std:
270
254
return TlvToJson (readerForJson, json);
271
255
}
272
256
257
+ static CHIP_ERROR CreateStatus (JNIEnv * env, const app::StatusIB & aStatus, jobject & outObj)
258
+ {
259
+ jclass statusCls = nullptr ;
260
+ ReturnErrorOnFailure (JniReferences::GetInstance ().GetLocalClassRef (env, " chip/devicecontroller/model/Status" , statusCls));
261
+ jmethodID statusCtor = nullptr ;
262
+ if (aStatus.mClusterStatus .HasValue ())
263
+ {
264
+ statusCtor = env->GetStaticMethodID (statusCls, " newInstance" , " (II)Lchip/devicecontroller/model/Status;" );
265
+ VerifyOrReturnError (!env->ExceptionCheck (), CHIP_JNI_ERROR_EXCEPTION_THROWN);
266
+ VerifyOrReturnError (statusCtor != nullptr , CHIP_JNI_ERROR_METHOD_NOT_FOUND);
267
+ outObj = env->CallStaticObjectMethod (statusCls, statusCtor, static_cast <jint>(aStatus.mStatus ),
268
+ static_cast <jint>(aStatus.mClusterStatus .Value ()));
269
+ }
270
+ else
271
+ {
272
+ statusCtor = env->GetStaticMethodID (statusCls, " newInstance" , " (I)Lchip/devicecontroller/model/Status;" );
273
+ VerifyOrReturnError (!env->ExceptionCheck (), CHIP_JNI_ERROR_EXCEPTION_THROWN);
274
+ VerifyOrReturnError (statusCtor != nullptr , CHIP_JNI_ERROR_METHOD_NOT_FOUND);
275
+ outObj = env->CallStaticObjectMethod (statusCls, statusCtor, static_cast <jint>(aStatus.mStatus ));
276
+ }
277
+ VerifyOrReturnError (outObj != nullptr , CHIP_JNI_ERROR_METHOD_NOT_FOUND);
278
+ return CHIP_NO_ERROR;
279
+ }
280
+
273
281
void ReportCallback::OnAttributeData (const app::ConcreteDataAttributePath & aPath, TLV::TLVReader * apData,
274
282
const app::StatusIB & aStatus)
275
283
{
276
284
CHIP_ERROR err = CHIP_NO_ERROR;
277
285
JNIEnv * env = JniReferences::GetInstance ().GetEnvForCurrentThread ();
278
286
VerifyOrReturn (env != nullptr , ChipLogError (Controller, " Could not get JNIEnv for current thread" ));
279
287
JniLocalReferenceScope scope (env);
280
-
281
- jobject attributePathObj = nullptr ;
282
- err = CreateChipAttributePath (env, aPath, attributePathObj);
283
- VerifyOrReturn (err == CHIP_NO_ERROR, ChipLogError (Controller, " Unable to create Java ChipAttributePath: %s" , ErrorStr (err)));
284
-
285
288
VerifyOrReturn (!aPath.IsListItemOperation (), ChipLogError (Controller, " Expect non-list item operation" ); aPath.LogPath ());
286
- VerifyOrReturn (aStatus.IsSuccess (), ChipLogError (Controller, " Receive bad status %s" , ErrorStr (aStatus.ToChipError ()));
287
- aPath.LogPath ());
289
+
290
+ jobject nodeState = mNodeStateObj .ObjectRef ();
291
+ if (aStatus.IsFailure ())
292
+ {
293
+ ChipLogError (Controller, " Receive bad status %s" , ErrorStr (aStatus.ToChipError ()));
294
+ jobject statusObj = nullptr ;
295
+ err = CreateStatus (env, aStatus, statusObj);
296
+ VerifyOrReturn (err == CHIP_NO_ERROR,
297
+ ChipLogError (Controller, " Fail to create status with error %" CHIP_ERROR_FORMAT, err.Format ()));
298
+ // Add Attribute Status to NodeState
299
+ jmethodID addAttributeStatusMethod = nullptr ;
300
+ err = JniReferences::GetInstance ().FindMethod (env, nodeState, " addAttributeStatus" ,
301
+ " (IJJLchip/devicecontroller/model/Status;)V" , &addAttributeStatusMethod);
302
+ VerifyOrReturn (
303
+ err == CHIP_NO_ERROR,
304
+ ChipLogError (Controller, " Could not find addAttributeStatus method with error %" CHIP_ERROR_FORMAT, err.Format ()));
305
+ env->CallVoidMethod (nodeState, addAttributeStatusMethod, static_cast <jint>(aPath.mEndpointId ),
306
+ static_cast <jlong>(aPath.mClusterId ), static_cast <jlong>(aPath.mAttributeId ), statusObj);
307
+ VerifyOrReturn (!env->ExceptionCheck (), env->ExceptionDescribe ());
308
+ return ;
309
+ }
288
310
VerifyOrReturn (apData != nullptr , ChipLogError (Controller, " Receive empty apData" ); aPath.LogPath ());
289
311
290
312
TLV::TLVReader readerForJavaTLV;
@@ -345,7 +367,6 @@ void ReportCallback::OnAttributeData(const app::ConcreteDataAttributePath & aPat
345
367
VerifyOrReturn (attributeStateObj != nullptr , ChipLogError (Controller, " Could not create AttributeState object" );
346
368
aPath.LogPath ());
347
369
348
- jobject nodeState = mNodeStateObj .ObjectRef ();
349
370
// Add AttributeState to NodeState
350
371
jmethodID addAttributeMethod;
351
372
err = JniReferences::GetInstance ().FindMethod (env, nodeState, " addAttribute" ,
@@ -401,10 +422,28 @@ void ReportCallback::OnEventData(const app::EventHeader & aEventHeader, TLV::TLV
401
422
CHIP_ERROR err = CHIP_NO_ERROR;
402
423
JNIEnv * env = JniReferences::GetInstance ().GetEnvForCurrentThread ();
403
424
VerifyOrReturn (env != nullptr , ChipLogError (Controller, " Could not get JNIEnv for current thread" ));
404
- jobject eventPathObj = nullptr ;
405
- err = CreateChipEventPath (env, aEventHeader.mPath , eventPathObj);
406
- VerifyOrReturn (err == CHIP_NO_ERROR, ChipLogError (Controller, " Unable to create Java ChipEventPath: %s" , ErrorStr (err)));
407
425
426
+ jobject nodeState = mNodeStateObj .ObjectRef ();
427
+ if (apStatus != nullptr && apStatus->IsFailure ())
428
+ {
429
+ ChipLogError (Controller, " Receive bad status %s" , ErrorStr (apStatus->ToChipError ()));
430
+ jobject statusObj = nullptr ;
431
+ err = CreateStatus (env, *apStatus, statusObj);
432
+ VerifyOrReturn (err == CHIP_NO_ERROR,
433
+ ChipLogError (Controller, " Fail to create status with error %" CHIP_ERROR_FORMAT, err.Format ()));
434
+ // Add Event Status to NodeState
435
+ jmethodID addEventStatusMethod;
436
+ err = JniReferences::GetInstance ().FindMethod (env, nodeState, " addEventStatus" ,
437
+ " (IJJLchip/devicecontroller/model/Status;)V" , &addEventStatusMethod);
438
+ VerifyOrReturn (
439
+ err == CHIP_NO_ERROR,
440
+ ChipLogError (Controller, " Could not find addEventStatus method with error %" CHIP_ERROR_FORMAT, err.Format ()));
441
+ env->CallVoidMethod (nodeState, addEventStatusMethod, static_cast <jint>(aEventHeader.mPath .mEndpointId ),
442
+ static_cast <jlong>(aEventHeader.mPath .mClusterId ), static_cast <jlong>(aEventHeader.mPath .mEventId ),
443
+ statusObj);
444
+ VerifyOrReturn (!env->ExceptionCheck (), env->ExceptionDescribe ());
445
+ return ;
446
+ }
408
447
VerifyOrReturn (apData != nullptr , ChipLogError (Controller, " Receive empty apData" ); aEventHeader.LogPath ());
409
448
410
449
TLV::TLVReader readerForJavaTLV;
@@ -484,7 +523,7 @@ void ReportCallback::OnEventData(const app::EventHeader & aEventHeader, TLV::TLV
484
523
485
524
// Add EventState to NodeState
486
525
jmethodID addEventMethod;
487
- jobject nodeState = mNodeStateObj . ObjectRef ();
526
+
488
527
err = JniReferences::GetInstance ().FindMethod (env, nodeState, " addEvent" , " (IJJLchip/devicecontroller/model/EventState;)V" ,
489
528
&addEventMethod);
490
529
VerifyOrReturn (err == CHIP_NO_ERROR, ChipLogError (Controller, " Could not find addEvent method with error %s" , ErrorStr (err));
0 commit comments