@@ -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,60 @@ 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" ,
265
+ " (II)Lchip/devicecontroller/model/Status;" );
266
+ VerifyOrReturnError (!env->ExceptionCheck (), CHIP_JNI_ERROR_EXCEPTION_THROWN);
267
+ VerifyOrReturnError (statusCtor != nullptr , CHIP_JNI_ERROR_METHOD_NOT_FOUND);
268
+ outObj = env->CallStaticObjectMethod (statusCls, statusCtor, static_cast <jint>(aStatus.mStatus ),
269
+ static_cast <jint>(aStatus.mClusterStatus .Value ()));
270
+ }
271
+ else
272
+ {
273
+ statusCtor = env->GetStaticMethodID (statusCls, " newInstance" ,
274
+ " (I)Lchip/devicecontroller/model/Status;" );
275
+ VerifyOrReturnError (!env->ExceptionCheck (), CHIP_JNI_ERROR_EXCEPTION_THROWN);
276
+ VerifyOrReturnError (statusCtor != nullptr , CHIP_JNI_ERROR_METHOD_NOT_FOUND);
277
+ outObj = env->CallStaticObjectMethod (statusCls, statusCtor, static_cast <jint>(aStatus.mStatus ));
278
+ }
279
+ VerifyOrReturnError (outObj != nullptr , CHIP_JNI_ERROR_METHOD_NOT_FOUND);
280
+ return CHIP_NO_ERROR;
281
+ }
282
+
283
+
273
284
void ReportCallback::OnAttributeData (const app::ConcreteDataAttributePath & aPath, TLV::TLVReader * apData,
274
285
const app::StatusIB & aStatus)
275
286
{
276
287
CHIP_ERROR err = CHIP_NO_ERROR;
277
288
JNIEnv * env = JniReferences::GetInstance ().GetEnvForCurrentThread ();
278
289
VerifyOrReturn (env != nullptr , ChipLogError (Controller, " Could not get JNIEnv for current thread" ));
279
290
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
291
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 ());
292
+
293
+ jobject nodeState = mNodeStateObj .ObjectRef ();
294
+ if (aStatus.IsFailure ())
295
+ {
296
+ ChipLogError (Controller, " Receive bad status %s" , ErrorStr (aStatus.ToChipError ()));
297
+ jobject statusObj = nullptr ;
298
+ err = CreateStatus (env, aStatus, statusObj);
299
+ VerifyOrReturn (err == CHIP_NO_ERROR, ChipLogError (Controller, " Fail to create status with error %" CHIP_ERROR_FORMAT, err.Format ()));
300
+ // Add Attribute Status to NodeState
301
+ jmethodID addAttributeStatusMethod = nullptr ;
302
+ err = JniReferences::GetInstance ().FindMethod (env, nodeState, " addAttributeStatus" ,
303
+ " (IJJLchip/devicecontroller/model/Status;)V" , &addAttributeStatusMethod);
304
+ VerifyOrReturn (err == CHIP_NO_ERROR,
305
+ ChipLogError (Controller, " Could not find addAttributeStatus method with error %" CHIP_ERROR_FORMAT, err.Format ()));
306
+ env->CallVoidMethod (nodeState, addAttributeStatusMethod, static_cast <jint>(aPath.mEndpointId ), static_cast <jlong>(aPath.mClusterId ),
307
+ static_cast <jlong>(aPath.mAttributeId ), statusObj);
308
+ VerifyOrReturn (!env->ExceptionCheck (), env->ExceptionDescribe ());
309
+ return ;
310
+ }
288
311
VerifyOrReturn (apData != nullptr , ChipLogError (Controller, " Receive empty apData" ); aPath.LogPath ());
289
312
290
313
TLV::TLVReader readerForJavaTLV;
@@ -345,7 +368,6 @@ void ReportCallback::OnAttributeData(const app::ConcreteDataAttributePath & aPat
345
368
VerifyOrReturn (attributeStateObj != nullptr , ChipLogError (Controller, " Could not create AttributeState object" );
346
369
aPath.LogPath ());
347
370
348
- jobject nodeState = mNodeStateObj .ObjectRef ();
349
371
// Add AttributeState to NodeState
350
372
jmethodID addAttributeMethod;
351
373
err = JniReferences::GetInstance ().FindMethod (env, nodeState, " addAttribute" ,
@@ -401,10 +423,25 @@ void ReportCallback::OnEventData(const app::EventHeader & aEventHeader, TLV::TLV
401
423
CHIP_ERROR err = CHIP_NO_ERROR;
402
424
JNIEnv * env = JniReferences::GetInstance ().GetEnvForCurrentThread ();
403
425
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
426
427
+ jobject nodeState = mNodeStateObj .ObjectRef ();
428
+ if (apStatus != nullptr && apStatus->IsFailure ())
429
+ {
430
+ ChipLogError (Controller, " Receive bad status %s" , ErrorStr (apStatus->ToChipError ()));
431
+ jobject statusObj = nullptr ;
432
+ err = CreateStatus (env, *apStatus, statusObj);
433
+ VerifyOrReturn (err == CHIP_NO_ERROR, 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 (err == CHIP_NO_ERROR,
439
+ ChipLogError (Controller, " Could not find addEventStatus method with error %" CHIP_ERROR_FORMAT, err.Format ()));
440
+ env->CallVoidMethod (nodeState, addEventStatusMethod, static_cast <jint>(aEventHeader.mPath .mEndpointId ),
441
+ static_cast <jlong>(aEventHeader.mPath .mClusterId ), static_cast <jlong>(aEventHeader.mPath .mEventId ), statusObj);
442
+ VerifyOrReturn (!env->ExceptionCheck (), env->ExceptionDescribe ());
443
+ return ;
444
+ }
408
445
VerifyOrReturn (apData != nullptr , ChipLogError (Controller, " Receive empty apData" ); aEventHeader.LogPath ());
409
446
410
447
TLV::TLVReader readerForJavaTLV;
@@ -484,7 +521,7 @@ void ReportCallback::OnEventData(const app::EventHeader & aEventHeader, TLV::TLV
484
521
485
522
// Add EventState to NodeState
486
523
jmethodID addEventMethod;
487
- jobject nodeState = mNodeStateObj . ObjectRef ();
524
+
488
525
err = JniReferences::GetInstance ().FindMethod (env, nodeState, " addEvent" , " (IJJLchip/devicecontroller/model/EventState;)V" ,
489
526
&addEventMethod);
490
527
VerifyOrReturn (err == CHIP_NO_ERROR, ChipLogError (Controller, " Could not find addEvent method with error %s" , ErrorStr (err));
0 commit comments