1 /******************************************************************
3 * Copyright 2015 Samsung Electronics All Rights Reserved.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 ******************************************************************/
20 #include "jni_things_manager_callbacks.h"
21 #include "JniOcResource.h"
22 #include "ThingsManager.h"
23 #include "jni_things_manager_jvm.h"
24 #include "jni_string.h"
26 #define LOG_TAG "ThingsManagerCallbacks"
28 #define METHOD_ONRESOURCE_CALLBACK "(" TM_JAVA_VECTOR_TYPE")V"
29 #define METHOD_ONGROUP_FIND_CALLBACK "(" TM_SERVICE_OCRESOURCE_TYPE")V"
30 #define METHOD_ONPRESENCE_CALLBACK "(" TM_JAVA_STRING_TYPE"I)V"
31 #define METHOD_ONUPDATE_CONF_CALLBACK "(" TM_JAVA_VECTOR_TYPE TM_SERVICE_OCREPRESENTATION_TYPE"I)V"
32 #define METHOD_ONGET_CONF_CALLBACK "(" TM_JAVA_VECTOR_TYPE TM_SERVICE_OCREPRESENTATION_TYPE"I)V"
33 #define METHOD_ONBOOT_STRAP_CALLBACK "(" TM_JAVA_VECTOR_TYPE TM_SERVICE_OCREPRESENTATION_TYPE"I)V"
34 #define METHOD_ONFACTORY_RESET_CALLBACK "(" TM_JAVA_VECTOR_TYPE TM_SERVICE_OCREPRESENTATION_TYPE"I)V"
35 #define METHOD_ONREBOOT_CALLBACK "(" TM_JAVA_VECTOR_TYPE TM_SERVICE_OCREPRESENTATION_TYPE"I)V"
36 #define METHOD_ONPOST_CALLBACK "(" TM_JAVA_VECTOR_TYPE TM_SERVICE_OCREPRESENTATION_TYPE"I)V"
37 #define METHOD_ONPUT_CALLBACK "(" TM_JAVA_VECTOR_TYPE TM_SERVICE_OCREPRESENTATION_TYPE"I)V"
38 #define METHOD_ONGET_CALLBACK "(" TM_JAVA_VECTOR_TYPE TM_SERVICE_OCREPRESENTATION_TYPE"I)V"
39 #define METHOD_TMCALLBACK_GETINSTANCE "()" TM_SERVICE_CALLBACK_CLASS_TYPE
41 jobject OcResourceToJava(JNIEnv *env, jlong resource)
43 jclass resourceClass = GetJClass(TM_SERVICE_OCRESOURCE_PATH);
44 if (NULL == resourceClass)
46 LOGE("OcResourceToJava : failed to find OCResouce java class!");
50 jmethodID constructor = env->GetMethodID(resourceClass, "<init>", "(J)V");
51 if (NULL == constructor)
53 LOGE("OcResourceToJava: Failed to get constructor method!");
57 jobject resourceObj = (jobject) env->NewObject(resourceClass, constructor, resource);
58 if (NULL == resourceObj)
60 LOGE("OcResourceToJava: Failed to create OCResouce java object!");
67 jobject OcHeaderOptionToJava(JNIEnv *env, OC::HeaderOption::OCHeaderOption headerOption)
69 JString *optionData = new JString(env, headerOption.getOptionData());
72 LOGE("OcHeaderOptionToJava : failed to get JString!");
76 jclass headerOptionClass = GetJClass(TM_SERVICE_HEADER_OPTION_PATH);
77 if (NULL == headerOptionClass)
79 LOGE("OcHeaderOptionToJava : failed to find OCRepresentation java class!");
83 jmethodID constructor = env->GetMethodID(headerOptionClass, "<init>", "(JLjava/lang/String;)V");
84 if (NULL == constructor)
86 LOGE("OcHeaderOptionToJava: Failed to get constructor method!");
90 jobject headerOptionObj = (jobject) env->NewObject(headerOptionClass, constructor,
91 (jlong)headerOption.getOptionID(), optionData);
92 if (NULL == headerOptionObj)
94 LOGE("OcHeaderOptionToJava: Failed to create OCRepresentation java object!");
98 return headerOptionObj;
101 jobject OcRepresentationToJava(JNIEnv *env, jlong ocRepresentation)
103 jclass ocRepresentationClass = GetJClass(TM_SERVICE_OCREPRESENTATION_PATH);
104 if (NULL == ocRepresentationClass)
106 LOGE("OcRepresentationToJava : failed to find OCRepresentation java class!");
110 jmethodID constructor = env->GetMethodID(ocRepresentationClass, "<init>", "(J)V");
111 if (NULL == constructor)
113 LOGE("OcRepresentationToJava: Failed to get constructor method!");
117 jobject ocRepresentationObj = (jobject) env->NewObject(ocRepresentationClass, constructor,
119 if (NULL == ocRepresentationObj)
121 LOGE("OcRepresentationToJava: Failed to create OCRepresentation java object!");
125 return ocRepresentationObj;
128 void ThingsManagerCallbacks::onFoundCandidateResource(
129 std::vector< std::shared_ptr<OC::OCResource>> resources)
131 LOGI("findCandidateResource : Enter");
133 if (resources.size() == 0)
135 LOGE("findCandidateResource : found resources zero");
139 JNIEnv *env = ThingsManagerJVM::getEnv();
142 LOGE("findCandidateResource : Getting JNIEnv failed");
146 // Get ThingsManagerCallback class reference
147 jclass thingsManagerCallbacks = GetJClass(TM_SERVICE_CALLBACK_CLASS_PATH);
148 if (NULL == thingsManagerCallbacks)
150 LOGE("findCandidateResource : GetJClass TMServiceCallbackInterface failed");
151 ThingsManagerJVM::releaseEnv();
155 // Get the ThingsManagerCallback class instance
156 jobject jobjectCallback = GetJObjectInstance(TM_SERVICE_CALLBACK_CLASS_PATH);
157 if (NULL == jobjectCallback)
159 LOGE("getInstance( %s) failed!", TM_SERVICE_CALLBACK_CLASS_PATH);
160 ThingsManagerJVM::releaseEnv();
164 // Get onResourceCallback method reference
165 jmethodID method_id = env->GetMethodID(thingsManagerCallbacks,
166 "onResourceCallback", METHOD_ONRESOURCE_CALLBACK);
167 if (NULL == method_id)
169 LOGE("findCandidateResource: onResourceCallback : GetMethodID failed");
170 ThingsManagerJVM::releaseEnv();
174 if ((env)->ExceptionCheck())
176 LOGE("findCandidateResource : ExceptionCheck failed");
177 ThingsManagerJVM::releaseEnv();
181 jclass vectorCls = env->FindClass(TM_JAVA_VECTOR_CLASS_PATH);
184 LOGE("findCandidateResource: failed to get %s class reference", TM_JAVA_VECTOR_CLASS_PATH);
185 ThingsManagerJVM::releaseEnv();
189 jmethodID constr = env->GetMethodID(vectorCls, "<init>", "()V");
192 LOGE("findCandidateResource: failed to get %s constructor", TM_JAVA_VECTOR_CLASS_PATH);
193 ThingsManagerJVM::releaseEnv();
197 jobject vectorObj = env->NewObject(vectorCls, constr);
200 LOGE("findCandidateResource: failed to create a %s object", TM_JAVA_VECTOR_CLASS_PATH);
201 ThingsManagerJVM::releaseEnv();
205 jmethodID addElement = env->GetMethodID(vectorCls, "addElement", "(Ljava/lang/Object;)V");
206 if (NULL == addElement)
208 LOGE("findCandidateResource: failed to create a addElement method");
209 ThingsManagerJVM::releaseEnv();
213 // Convert to java OCResource object
214 for (int i = 0; i < resources.size(); i++)
216 JniOcResource *jniOcResource = new JniOcResource(resources[i]);
219 LOGE("findCandidateResource: failed to create a JniOcResource");
220 ThingsManagerJVM::releaseEnv();
224 jobject resource = OcResourceToJava(env, reinterpret_cast<jlong>(jniOcResource));
225 env->CallVoidMethod(vectorObj, addElement, resource);
228 env->CallVoidMethod(jobjectCallback, method_id, vectorObj);
230 if ((env)->ExceptionCheck())
232 LOGE("findCandidateResource : CallVoidMethod failed");
233 ThingsManagerJVM::releaseEnv();
237 ThingsManagerJVM::releaseEnv();
238 LOGI("findCandidateResource : Exit");
241 void ThingsManagerCallbacks::onFoundGroup(std::shared_ptr<OC::OCResource> groupResource)
243 LOGI("FindGroup : Enter");
245 if (NULL == groupResource.get())
247 LOGE("FindGroup : Invalid received GroupResource!");
251 JNIEnv *env = ThingsManagerJVM::getEnv();
254 LOGE("FindGroup : Getting JNIEnv failed");
258 // Get ThingsManagerCallback class reference
259 jclass thingsManagerCallbacks = GetJClass(TM_SERVICE_CALLBACK_CLASS_PATH);
260 if (NULL == thingsManagerCallbacks)
262 LOGE("FindGroup : GetJClass TMServiceCallbackInterface failed");
263 ThingsManagerJVM::releaseEnv();
267 // Get the ThingsManagerCallback class instance
268 jobject jobjectCallback = GetJObjectInstance(TM_SERVICE_CALLBACK_CLASS_PATH);
269 if (NULL == jobjectCallback)
271 LOGE("FindGroup: getInstance( %s) failed!", TM_SERVICE_CALLBACK_CLASS_PATH);
272 ThingsManagerJVM::releaseEnv();
276 // Get onGroupFindCallback method reference
277 jmethodID method_id = env->GetMethodID(thingsManagerCallbacks,
278 "onGroupFindCallback",
279 METHOD_ONGROUP_FIND_CALLBACK);
280 if (NULL == method_id)
282 LOGE("FindGroup : GetMethodID failed");
283 ThingsManagerJVM::releaseEnv();
287 if ((env)->ExceptionCheck())
289 LOGE("FindGroup : ExceptionCheck failed");
290 ThingsManagerJVM::releaseEnv();
294 JniOcResource *jniOcResource = new JniOcResource(groupResource);
297 LOGE("FindGroup : groupResource is invalid!");
298 ThingsManagerJVM::releaseEnv();
302 jobject resource = OcResourceToJava(env, reinterpret_cast<jlong>(jniOcResource));
304 env->CallVoidMethod(jobjectCallback, method_id, resource);
306 if ((env)->ExceptionCheck())
308 LOGE("FindGroup : CallVoidMethod failed");
309 ThingsManagerJVM::releaseEnv();
313 ThingsManagerJVM::releaseEnv();
314 LOGI("FindGroup : Exit");
317 void ThingsManagerCallbacks::onSubscribePresence(std::string resource, OCStackResult result)
319 LOGI("SubscribePresence : Entry");
321 JNIEnv *env = ThingsManagerJVM::getEnv();
324 LOGE("SubscribePresence : Getting JNIEnv failed");
328 // Get ThingsManagerCallback class reference
329 jclass thingsManagerCallbacks = GetJClass(TM_SERVICE_CALLBACK_CLASS_PATH);
330 if (NULL == thingsManagerCallbacks)
332 LOGE("findCandidateResource : GetJClass TMServiceCallbackInterface failed");
333 ThingsManagerJVM::releaseEnv();
337 // Get getInstance method reference
338 jmethodID getinstance_method_id = env->GetStaticMethodID(thingsManagerCallbacks,
339 "getInstance", METHOD_TMCALLBACK_GETINSTANCE);
340 if (NULL == getinstance_method_id)
342 LOGE("getInstance : GetMethodID failed");
343 ThingsManagerJVM::releaseEnv();
347 // Get the ThingsManagerCallback class instance
348 jobject jobjectCallback = env->CallStaticObjectMethod(thingsManagerCallbacks,
349 getinstance_method_id);
350 if (NULL == jobjectCallback)
352 LOGE("getInstance( %s) failed!", TM_SERVICE_CALLBACK_CLASS_PATH);
353 ThingsManagerJVM::releaseEnv();
357 jmethodID method_id = env->GetMethodID(thingsManagerCallbacks,
358 "onPresenceCallback",
359 METHOD_ONPRESENCE_CALLBACK);
360 if (NULL == method_id)
362 LOGE("SubscribePresence : GetMethodID failed");
363 ThingsManagerJVM::releaseEnv();
367 if ((env)->ExceptionCheck())
369 LOGE("SubscribePresence : ExceptionCheck failed");
370 ThingsManagerJVM::releaseEnv();
374 JString *jresource = new JString(env, resource);
375 if (jresource == NULL)
377 LOGE("resource value is invalid");
378 ThingsManagerJVM::releaseEnv();
382 env->CallVoidMethod(jobjectCallback, method_id, jresource->getObject(), (jint)result);
386 if ((env)->ExceptionCheck())
388 LOGE("SubscribePresence : CallVoidMethod failed");
389 ThingsManagerJVM::releaseEnv();
393 LOGI("SubscribePresence : Exit");
396 ThingsManagerJVM::releaseEnv();
399 void ThingsManagerCallbacks::onUpdateConfigurationsResponse(const OC::HeaderOptions &headerOptions,
400 const OC::OCRepresentation &rep, const int eCode)
402 LOGI("UpdateConfigurations : Enter");
404 ThingsManagerCallbacks::invokeCallback(headerOptions, rep, eCode, "onUpdateConfigurationsCallback",
405 METHOD_ONUPDATE_CONF_CALLBACK);
407 LOGI("UpdateConfigurations : Exit");
410 void ThingsManagerCallbacks::onGetConfigurationsResponse(const OC::HeaderOptions &headerOptions,
411 const OC::OCRepresentation &rep, const int eCode)
413 LOGI("GetConfigurations : Enter");
415 ThingsManagerCallbacks::invokeCallback(headerOptions, rep, eCode, "onGetConfigurationsCallback",
416 METHOD_ONGET_CONF_CALLBACK);
418 LOGI("GetConfigurations : Exit");
421 void ThingsManagerCallbacks::onBootStrapResponse(const OC::HeaderOptions &headerOptions,
422 const OC::OCRepresentation &rep, const int eCode)
424 LOGI("BootStrap : Enter");
426 ThingsManagerCallbacks::invokeCallback(headerOptions, rep, eCode, "onBootStrapCallback",
427 METHOD_ONBOOT_STRAP_CALLBACK);
429 LOGI("BootStrap : Exit");
432 void ThingsManagerCallbacks::onRebootResponse(const OC::HeaderOptions &headerOptions,
433 const OC::OCRepresentation &rep, const int eCode)
435 LOGI("OnReboot : Enter");
437 ThingsManagerCallbacks::invokeCallback(headerOptions, rep, eCode, "onRebootCallback",
438 METHOD_ONREBOOT_CALLBACK);
440 LOGI("OnReboot : Exit");
443 void ThingsManagerCallbacks::onFactoryResetResponse(const OC::HeaderOptions &headerOptions,
444 const OC::OCRepresentation &rep, const int eCode)
446 LOGI("OnFactoryReset : Enter");
448 ThingsManagerCallbacks::invokeCallback(headerOptions, rep, eCode, "onFactoryResetCallback",
449 METHOD_ONFACTORY_RESET_CALLBACK);
451 LOGI("OnFactoryReset : Exit");
454 void ThingsManagerCallbacks::onPostResponse(const OC::HeaderOptions &headerOptions,
455 const OC::OCRepresentation &rep, const int eCode)
457 LOGI("PostResponse : Enter");
459 ThingsManagerCallbacks::invokeCallback(headerOptions, rep, eCode, "onPostResponseCallback",
460 METHOD_ONPOST_CALLBACK);
462 LOGI("PostResponse : Exit");
465 void ThingsManagerCallbacks::onPutResponse(const OC::HeaderOptions &headerOptions,
466 const OC::OCRepresentation &rep, const int eCode)
468 LOGI("OnPutResponse : Enter");
470 ThingsManagerCallbacks::invokeCallback(headerOptions, rep, eCode, "onPutResponseCallback",
471 METHOD_ONPUT_CALLBACK);
473 LOGI("OnPutResponse : Exit");
477 void ThingsManagerCallbacks::onGetResponse(const OC::HeaderOptions &headerOptions,
478 const OC::OCRepresentation &rep, const int eCode)
480 LOGI("OnGetResponse : Enter");
482 ThingsManagerCallbacks::invokeCallback(headerOptions, rep, eCode, "onGetResponseCallback",
483 METHOD_ONGET_CALLBACK);
485 LOGI("OnGetResponse : Exit");
488 void ThingsManagerCallbacks::invokeCallback(const OC::HeaderOptions &headerOptions,
489 const OC::OCRepresentation &rep, const int eCode, const char *callbackName,
490 const char *signature)
492 LOGI("InvokeCallback : Enter %s", callbackName);
494 JNIEnv *env = ThingsManagerJVM::getEnv();
497 LOGE("InvokeCallback : Getting JNIEnv failed");
501 // Get ThingsManagerCallback class reference
502 jclass thingsManagerCallbacks = GetJClass(TM_SERVICE_CALLBACK_CLASS_PATH);
503 if (NULL == thingsManagerCallbacks)
505 LOGE("InvokeCallback : GetJClass TMServiceCallbackInterface failed");
506 ThingsManagerJVM::releaseEnv();
510 // Get the ThingsManagerCallback class instance
511 jobject jobjectCallback = GetJObjectInstance(TM_SERVICE_CALLBACK_CLASS_PATH);
512 if (NULL == jobjectCallback)
514 LOGE("InvokeCallback: getInstance( %s) failed!", TM_SERVICE_CALLBACK_CLASS_PATH);
515 ThingsManagerJVM::releaseEnv();
519 jmethodID method_id = env->GetMethodID(thingsManagerCallbacks, callbackName, signature);
522 LOGE("InvokeCallback : GetMethodID failed");
523 ThingsManagerJVM::releaseEnv();
527 if ((env)->ExceptionCheck())
529 LOGE("InvokeCallback : ExceptionCheck failed");
530 ThingsManagerJVM::releaseEnv();
534 // Convert vector<OC:HeaderOption::OCHeaderOption> to java type
535 jclass vectorCls = env->FindClass(TM_JAVA_VECTOR_CLASS_PATH);
538 LOGE("InvokeCallback: failed to get %s class reference", TM_JAVA_VECTOR_CLASS_PATH);
539 ThingsManagerJVM::releaseEnv();
543 jmethodID constr = env->GetMethodID(vectorCls, "<init>", "()V");
546 LOGE("InvokeCallback: failed to get %s constructor", TM_JAVA_VECTOR_CLASS_PATH);
547 ThingsManagerJVM::releaseEnv();
551 jobject vectorObj = env->NewObject(vectorCls, constr);
554 LOGE("InvokeCallback: failed to create a %s object", TM_JAVA_VECTOR_CLASS_PATH);
555 ThingsManagerJVM::releaseEnv();
559 jmethodID addElement = env->GetMethodID(vectorCls, "addElement", "(Ljava/lang/Object;)V");
560 if (NULL == addElement)
562 LOGE("InvokeCallback: failed to create a addElement method");
563 ThingsManagerJVM::releaseEnv();
567 jobject headerOptionTemp;
568 for (int i = 0; i < headerOptions.size(); i++)
570 headerOptionTemp = OcHeaderOptionToJava(env, headerOptions[i]);
571 env->CallVoidMethod(vectorObj, addElement, headerOptionTemp);
574 // Convert OCRepresentation to java type
575 jobject jrepresentation = OcRepresentationToJava(env, (jlong) reinterpret_cast<jlong>(&rep));
576 if (!jrepresentation)
578 LOGE("InvokeCallback : cannot create OCRepresentation class");
579 ThingsManagerJVM::releaseEnv();
583 env->CallVoidMethod(jobjectCallback, method_id, vectorObj, jrepresentation, (jint)eCode);
585 if ((env)->ExceptionCheck())
587 LOGE("InvokeCallback : CallVoidMethod failed");
588 ThingsManagerJVM::releaseEnv();
592 ThingsManagerJVM::releaseEnv();
593 LOGI("InvokeCallback : Exit %s", callbackName);