1
1
{{> header}}
2
2
{{#if (chip_has_client_clusters)}}
3
+ #include "CHIPCallbackTypes.h"
4
+ #include "CHIPInvokeCallbacks.h"
3
5
#include "CHIPReadCallbacks.h"
4
6
5
7
#include <app-common/zap-generated/cluster-objects.h>
8
10
9
11
#include <controller/java/AndroidClusterExceptions.h>
10
12
#include <controller/java/CHIPDefaultCallbacks.h>
11
- #include <lib/support/CHIPJNIError.h>
12
13
#include <lib/support/JniReferences.h>
13
14
#include <lib/support/JniTypeWrappers.h>
14
15
#include <jni.h>
22
23
using namespace chip;
23
24
using namespace chip::Controller;
24
25
25
- {{! TODO(#8773): Clean up callbacks. }}
26
-
27
- {{#chip_client_clusters}}
28
- {{#chip_cluster_responses}}
29
- class CHIP{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}Callback : public Callback::Callback<{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}Callback>
30
- {
31
- public:
32
- CHIP{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}Callback(jobject javaCallback): Callback::Callback<{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}Callback>(CallbackFn, this)
33
- {
34
- JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread();
35
- if (env == nullptr) {
36
- ChipLogError(Zcl, "Could not create global reference for Java callback");
37
- return;
38
- }
39
-
40
- javaCallbackRef = env->NewGlobalRef(javaCallback);
41
- if (javaCallbackRef == nullptr) {
42
- ChipLogError(Zcl, "Could not create global reference for Java callback");
43
- }
44
- }
45
- ~CHIP{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}Callback()
46
- {
47
- JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread();
48
- if (env == nullptr) {
49
- ChipLogError(Zcl, "Could not create global reference for Java callback");
50
- return;
51
- }
52
- env->DeleteGlobalRef(javaCallbackRef);
53
- };
54
-
55
- static void CallbackFn(void * context{{#chip_cluster_response_arguments}}, {{asUnderlyingZclType type}} {{asSymbol label}}{{/chip_cluster_response_arguments}})
56
- {
57
- chip::DeviceLayer::StackUnlock unlock;
58
- CHIP_ERROR err = CHIP_NO_ERROR;
59
- JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread();
60
- jobject javaCallbackRef;
61
- jmethodID javaMethod;
62
- CHIP{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}Callback * cppCallback = nullptr;
63
- {{#chip_cluster_response_arguments}}
64
- {{#if (isOctetString type)}}
65
- jbyteArray {{asSymbol label}}Arr;
66
- {{else if (isShortString type)}}
67
- UtfString {{asSymbol label}}Str(env, {{asSymbol label}});
68
- {{/if}}
69
- {{/chip_cluster_response_arguments}}
70
-
71
- VerifyOrExit(env != nullptr, err = CHIP_JNI_ERROR_NO_ENV);
72
-
73
- cppCallback = reinterpret_cast<CHIP{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}Callback *>(context);
74
- VerifyOrExit(cppCallback != nullptr, err = CHIP_JNI_ERROR_NULL_OBJECT);
75
-
76
- javaCallbackRef = cppCallback->javaCallbackRef;
77
- VerifyOrExit(javaCallbackRef != nullptr, err = CHIP_NO_ERROR);
78
-
79
- err = JniReferences::GetInstance().FindMethod(env, javaCallbackRef, "onSuccess", "({{#chip_cluster_response_arguments}}{{#if isArray}}{{else if (isOctetString type)}}[B{{else if (isShortString type)}}Ljava/lang/String;{{else}}{{asJniSignature type false}}{{/if}}{{/chip_cluster_response_arguments}})V", &javaMethod);
80
- SuccessOrExit(err);
81
-
82
- {{#chip_cluster_response_arguments}}
83
- {{#if (isOctetString type)}}
84
- {{asSymbol label}}Arr = env->NewByteArray({{asSymbol label}}.size());
85
- VerifyOrExit({{asSymbol label}}Arr != nullptr, err = CHIP_ERROR_NO_MEMORY);
86
- env->ExceptionClear();
87
- env->SetByteArrayRegion({{asSymbol label}}Arr, 0, {{asSymbol label}}.size(), reinterpret_cast<const jbyte *>({{asSymbol label}}.data()));
88
- VerifyOrExit(!env->ExceptionCheck(), err = CHIP_JNI_ERROR_EXCEPTION_THROWN);
89
- {{/if}}
90
- {{/chip_cluster_response_arguments}}
91
-
92
- env->CallVoidMethod(javaCallbackRef, javaMethod
93
- {{#chip_cluster_response_arguments}}
94
- {{#if isArray}}
95
- // {{asSymbol label}}: {{asUnderlyingZclType type}}
96
- // Conversion from this type to Java is not properly implemented yet
97
- {{else if (isOctetString type)}}
98
- , {{asSymbol label}}Arr
99
- {{else if (isShortString type)}}
100
- , {{asSymbol label}}Str.jniValue()
101
- {{else}}
102
- , static_cast<{{asJniBasicTypeForZclType type}}>({{asSymbol label}})
103
- {{/if}}
104
- {{/chip_cluster_response_arguments}}
105
- );
106
-
107
- {{#chip_cluster_response_arguments}}
108
- {{#if (isOctetString type)}}
109
- env->DeleteLocalRef({{asSymbol label}}Arr);
110
- {{/if}}
111
- {{/chip_cluster_response_arguments}}
112
-
113
- exit:
114
- if (err != CHIP_NO_ERROR) {
115
- ChipLogError(Zcl, "Error invoking Java callback: %" CHIP_ERROR_FORMAT, err.Format());
116
- }
117
- if (cppCallback != nullptr) {
118
- cppCallback->Cancel();
119
- delete cppCallback;
120
- }
121
- }
122
-
123
- private:
124
- jobject javaCallbackRef;
125
- };
126
-
127
- {{/chip_cluster_responses}}
128
- {{/chip_client_clusters}}
129
26
JNI_METHOD(void, BaseChipCluster, deleteCluster)(JNIEnv * env, jobject self, jlong clusterPtr)
130
27
{
131
28
chip::DeviceLayer::StackLock lock;
@@ -146,58 +43,37 @@ JNI_METHOD(jlong, {{asUpperCamelCase name}}Cluster, initWithDevice)(JNIEnv * env
146
43
}
147
44
148
45
{{#chip_cluster_commands}}
149
- JNI_METHOD(void, {{asUpperCamelCase ../name}}Cluster, {{asLowerCamelCase name}})(JNIEnv * env, jobject self, jlong clusterPtr, jobject callback{{#chip_cluster_command_arguments_with_structs_expanded}}, {{asJniBasicType type false }} {{asLowerCamelCase label}}{{/chip_cluster_command_arguments_with_structs_expanded}})
46
+ JNI_METHOD(void, {{asUpperCamelCase ../name}}Cluster, {{asLowerCamelCase name}})(JNIEnv * env, jobject self, jlong clusterPtr, jobject callback{{#chip_cluster_command_arguments_with_structs_expanded}}, {{asJniBasicType type true }} {{asLowerCamelCase label}}{{/chip_cluster_command_arguments_with_structs_expanded}})
150
47
{
151
48
chip::DeviceLayer::StackLock lock;
152
49
CHIP_ERROR err = CHIP_NO_ERROR;
153
50
{{asUpperCamelCase ../name}}Cluster * cppCluster;
154
51
155
- {{#chip_cluster_command_arguments_with_structs_expanded}}
156
- {{#if (isOctetString type)}}
157
- JniByteArray {{asLowerCamelCase label}}Arr(env, {{asLowerCamelCase label}});
158
- {{else if (isCharString type)}}
159
- JniUtfString {{asLowerCamelCase label}}Str(env, {{asLowerCamelCase label}});
160
- {{/if}}
161
- {{/chip_cluster_command_arguments_with_structs_expanded}}
52
+ chip::app::Clusters::{{asUpperCamelCase parent.name}}::Commands::{{asUpperCamelCase name}}::Type request;
162
53
163
- {{#if hasSpecificResponse}}
164
- std::unique_ptr<CHIP{{asCamelCased parent.name false}}Cluster{{asCamelCased responseName false}}Callback, void (*)(CHIP{{asCamelCased parent.name false}}Cluster{{asCamelCased responseName false}}Callback *)> onSuccess(
165
- Platform::New<CHIP{{asCamelCased parent.name false}}Cluster{{asCamelCased responseName false}}Callback>(callback), Platform::Delete<CHIP{{asCamelCased parent.name false}}Cluster{{asCamelCased responseName false}}Callback>);
166
- {{else}}
167
- std::unique_ptr<CHIPDefaultSuccessCallback, void (*)(CHIPDefaultSuccessCallback *)> onSuccess(Platform::New<CHIPDefaultSuccessCallback>(callback), Platform::Delete<CHIPDefaultSuccessCallback>);
168
- {{/if}}
54
+ {{#chip_cluster_command_arguments}}
55
+ {{>encode_value target=(concat "request." (asLowerCamelCase label)) source=(asLowerCamelCase label)}}
56
+ {{/chip_cluster_command_arguments}}
57
+
58
+ {{#*inline "callbackName"}}{{#if hasSpecificResponse}}{{asUpperCamelCase parent.name false}}Cluster{{asUpperCamelCase responseName false}}{{else}}DefaultSuccess{{/if}}{{/inline}}
59
+
60
+ std::unique_ptr<CHIP{{>callbackName}}Callback, void (*)(CHIP{{>callbackName}}Callback *)> onSuccess(
61
+ Platform::New<CHIP{{>callbackName}}Callback>(callback), Platform::Delete<CHIP{{>callbackName}}Callback>);
169
62
std::unique_ptr<CHIPDefaultFailureCallback, void (*)(CHIPDefaultFailureCallback *)> onFailure(Platform::New<CHIPDefaultFailureCallback>(callback), Platform::Delete<CHIPDefaultFailureCallback>);
170
- VerifyOrExit (onSuccess.get() != nullptr, err = CHIP_ERROR_INCORRECT_STATE );
171
- VerifyOrExit (onFailure.get() != nullptr, err = CHIP_ERROR_INCORRECT_STATE );
63
+ VerifyOrReturn (onSuccess.get() != nullptr, AndroidClusterExceptions::GetInstance().ReturnIllegalStateException(env, callback, "Error creating native callback", CHIP_ERROR_NO_MEMORY) );
64
+ VerifyOrReturn (onFailure.get() != nullptr, AndroidClusterExceptions::GetInstance().ReturnIllegalStateException(env, callback, "Error creating native callback", CHIP_ERROR_NO_MEMORY) );
172
65
173
66
cppCluster = reinterpret_cast<{{asUpperCamelCase ../name}}Cluster *>(clusterPtr);
174
- VerifyOrExit(cppCluster != nullptr, err = CHIP_ERROR_INCORRECT_STATE);
175
-
176
- err = cppCluster->{{asCamelCased name false}}(onSuccess->Cancel(), onFailure->Cancel()
177
- {{#chip_cluster_command_arguments_with_structs_expanded}}, {{#if_chip_enum type}}static_cast<{{chipType}}>({{asLowerCamelCase label}}){{else if (isOctetString type)}}{{asUnderlyingZclType type}}((const uint8_t*) {{asLowerCamelCase label}}Arr.data(), {{asLowerCamelCase label}}Arr.size()){{else if (isCharString type)}}chip::CharSpan({{asLowerCamelCase label}}Str.c_str(), strlen({{asLowerCamelCase label}}Str.c_str())){{else}}{{asLowerCamelCase label}}{{/if_chip_enum}}{{/chip_cluster_command_arguments_with_structs_expanded}});
178
- SuccessOrExit(err);
67
+ VerifyOrReturn(cppCluster != nullptr, AndroidClusterExceptions::GetInstance().ReturnIllegalStateException(env, callback, "Error getting native cluster", CHIP_ERROR_INCORRECT_STATE));
179
68
180
- exit:
181
- if (err != CHIP_NO_ERROR) {
182
- jthrowable exception;
183
- jmethodID method;
69
+ auto successFn = chip::Callback::Callback<CHIP{{>callbackName}}CallbackType>::FromCancelable(onSuccess->Cancel());
70
+ auto failureFn = chip::Callback::Callback<CHIPDefaultFailureCallbackType>::FromCancelable(onFailure->Cancel());
184
71
185
- err = JniReferences::GetInstance().FindMethod(env, callback, "onError", "(Ljava/lang/Exception;)V", &method);
186
- if (err != CHIP_NO_ERROR) {
187
- ChipLogError(Zcl, "Error throwing IllegalStateException %" CHIP_ERROR_FORMAT, err.Format());
188
- return;
189
- }
72
+ err = cppCluster->InvokeCommand(request, onSuccess->mContext, successFn->mCall, failureFn->mCall);
73
+ VerifyOrReturn(err == CHIP_NO_ERROR, AndroidClusterExceptions::GetInstance().ReturnIllegalStateException(env, callback, "Error invoking command", CHIP_ERROR_INCORRECT_STATE));
190
74
191
- err = chip::AndroidClusterExceptions::GetInstance().CreateIllegalStateException(env, "Error invoking cluster", err, exception);
192
- if (err != CHIP_NO_ERROR) {
193
- ChipLogError(Zcl, "Error throwing IllegalStateException %" CHIP_ERROR_FORMAT, err.Format());
194
- return;
195
- }
196
- env->CallVoidMethod(callback, method, exception);
197
- } else {
198
- onSuccess.release();
199
- onFailure.release();
200
- }
75
+ onSuccess.release();
76
+ onFailure.release();
201
77
}
202
78
{{/chip_cluster_commands}}
203
79
{{#chip_server_cluster_attributes}}
0 commit comments