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 ******************************************************************/
21 #include "JniRcsRemoteResourceObject.h"
23 #include "JniRcsObject.h"
24 #include "JniRcsResourceAttributes.h"
25 #include "JavaClasses.h"
26 #include "JavaExceptions.h"
27 #include "JavaGlobalRef.h"
29 #include "ScopedEnv.h"
32 #include "RCSRemoteResourceObject.h"
34 using namespace OIC::Service;
36 #define LOG_TAG "JNI-RCSRemoteResourceObject"
38 #define CLS_NAME_RESOURCE_STATE CLS_NAME_REMOTERESOURCEOBJECT "$ResourceState"
39 #define CLS_NAME_CACHE_STATE CLS_NAME_REMOTERESOURCEOBJECT "$CacheState"
41 #define CLS_NAME_ON_STATE_CHANGED_LISTENER CLS_NAME_REMOTERESOURCEOBJECT "$OnStateChangedListener"
42 #define CLS_NAME_ON_CACHE_UPDATED_LISTENER CLS_NAME_REMOTERESOURCEOBJECT "$OnCacheUpdatedListener"
43 #define CLS_NAME_ON_REMOTE_ATTRIBUTES_RECEIVED_LISTENER \
44 CLS_NAME_REMOTERESOURCEOBJECT "$OnRemoteAttributesReceivedListener"
48 jclass g_cls_RCSRemoteResourceObject;
49 jclass g_cls_ResourceState;
51 jmethodID g_ctor_RCSRemoteResourceObject;
53 jmethodID g_method_onStateChanged;
54 jmethodID g_method_onCacheUpdated;
55 jmethodID g_method_onAttributesReceived;
57 jobject g_obj_ResourceState_None;
58 jobject g_obj_ResourceState_Requested;
59 jobject g_obj_ResourceState_Alive;
60 jobject g_obj_ResourceState_LostSignal;
61 jobject g_obj_ResourceState_Destoryed;
63 jobject g_obj_CacheState_None;
64 jobject g_obj_CacheState_Unready;
65 jobject g_obj_CacheState_Ready;
66 jobject g_obj_CacheState_LostSignal;
69 inline jobjectArray toJavaStringArray(JNIEnv* env, const std::vector< std::string >& vec)
71 jobjectArray arrayObj = env->NewObjectArray(vec.size(), g_cls_String, nullptr);
72 if (!arrayObj) return nullptr;
73 for (size_t i = 0; i < vec.size(); ++i)
75 jstring strObj = env->NewStringUTF(vec[i].c_str());
76 VERIFY_NO_EXC_RET_DEF(env);
78 env->SetObjectArrayElement(arrayObj, i, strObj);
79 VERIFY_NO_EXC_RET_DEF(env);
81 env->DeleteLocalRef(strObj);
86 template < typename ENV >
87 inline jobject convertResourceState(ENV* env, ResourceState state)
91 case ResourceState::NONE: return g_obj_ResourceState_None;
92 case ResourceState::REQUESTED: return g_obj_ResourceState_Requested;
93 case ResourceState::ALIVE: return g_obj_ResourceState_Alive;
94 case ResourceState::LOST_SIGNAL: return g_obj_ResourceState_LostSignal;
95 case ResourceState::DESTROYED: return g_obj_ResourceState_Destoryed;
98 throwRCSException(env, "Failed to convert ResourceState");
102 inline jobject convertCacheState(JNIEnv* env, CacheState state)
106 case CacheState::NONE: return g_obj_CacheState_None;
107 case CacheState::UNREADY: return g_obj_CacheState_Unready;
108 case CacheState::READY: return g_obj_CacheState_Ready;
109 case CacheState::LOST_SIGNAL: return g_obj_CacheState_LostSignal;
112 throwRCSException(env, "Failed to convert CacheState");
116 inline RCSRemoteResourceObject::Ptr& getResource(JNIEnv* env, jobject obj) noexcept
118 return getNativeHandleAs< RCSRemoteResourceObject::Ptr >(env, obj);
121 void onStateChanged(ResourceState newState, const JavaGlobalRef& listener)
123 ScopedEnvWrapper env;
124 EXPECT(env, "env is null!");
128 env->CallVoidMethod(listener, g_method_onStateChanged,
129 convertResourceState(env.get(), newState));
131 catch (const JavaException&)
133 env->ExceptionDescribe();
134 env->ExceptionClear();
138 void onCacheUpdated(const RCSResourceAttributes& attrs, int eCode,
139 const JavaGlobalRef& listener)
141 LOGD("onCacheUpdated");
143 ScopedEnvWrapper env;
144 EXPECT(env, "env is null!");
148 env->CallVoidMethod(listener, g_method_onCacheUpdated,
149 newAttributesObject(env.get(), attrs));
151 catch (const JavaException&)
153 env->ExceptionDescribe();
154 env->ExceptionClear();
158 void onRemoteAttributesReceived(const RCSResourceAttributes& attrs, int errorCode,
159 const JavaGlobalRef& listener)
161 ScopedEnvWrapper env;
162 EXPECT(env, "env is null!");
166 env->CallVoidMethod(listener, g_method_onAttributesReceived,
167 newAttributesObject(env.get(), attrs), errorCode);
169 catch (const JavaException&)
171 env->ExceptionDescribe();
172 env->ExceptionClear();
178 void initRCSRemoteResourceObject(JNIEnvWrapper* env)
180 g_cls_RCSRemoteResourceObject = env->FindClassAsGlobalRef(CLS_NAME_REMOTERESOURCEOBJECT);
182 g_ctor_RCSRemoteResourceObject = env->GetConstructorID(g_cls_RCSRemoteResourceObject, "()V");
184 auto clsOnStateChangedListener = env->FindClass(CLS_NAME_ON_STATE_CHANGED_LISTENER);
185 g_method_onStateChanged = env->GetMethodID(clsOnStateChangedListener, "onStateChanged",
186 "(" AS_SIG(CLS_NAME_RESOURCE_STATE) ")V");
188 auto clsOnCacheUpdatedListener = env->FindClass(CLS_NAME_ON_CACHE_UPDATED_LISTENER);
189 g_method_onCacheUpdated = env->GetMethodID(clsOnCacheUpdatedListener, "onCacheUpdated",
190 "(" AS_SIG(CLS_NAME_RESOURCEATTRIBUTES) "I)V");
192 auto clsOnRemoteAttributesReceivedListener =
193 env->FindClass(CLS_NAME_ON_REMOTE_ATTRIBUTES_RECEIVED_LISTENER);
194 g_method_onAttributesReceived = env->GetMethodID(clsOnRemoteAttributesReceivedListener,
195 "onAttributesReceived", "(" AS_SIG(CLS_NAME_RESOURCEATTRIBUTES) "I)V");
197 auto clsResourceState = env->FindClass(CLS_NAME_RESOURCE_STATE);
199 g_obj_ResourceState_None = env->NewGlobalRef(env->GetStaticObjectField(clsResourceState,
200 "NONE", AS_SIG(CLS_NAME_RESOURCE_STATE)));
202 g_obj_ResourceState_Requested = env->NewGlobalRef(env->GetStaticObjectField(clsResourceState,
203 "REQUESTED", AS_SIG(CLS_NAME_RESOURCE_STATE)));
205 g_obj_ResourceState_Alive = env->NewGlobalRef(env->GetStaticObjectField(clsResourceState,
206 "ALIVE", AS_SIG(CLS_NAME_RESOURCE_STATE)));
208 g_obj_ResourceState_LostSignal = env->NewGlobalRef(env->GetStaticObjectField(clsResourceState,
209 "LOST_SIGNAL", AS_SIG(CLS_NAME_RESOURCE_STATE)));
211 g_obj_ResourceState_Destoryed = env->NewGlobalRef(env->GetStaticObjectField(clsResourceState,
212 "DESTROYED", AS_SIG(CLS_NAME_RESOURCE_STATE)));
214 auto clsCacheState = env->FindClass(CLS_NAME_CACHE_STATE);
216 g_obj_CacheState_None = env->NewGlobalRef(env->GetStaticObjectField(clsCacheState,
217 "NONE", AS_SIG(CLS_NAME_CACHE_STATE)));
219 g_obj_CacheState_Unready = env->NewGlobalRef(env->GetStaticObjectField(clsCacheState,
220 "UNREADY", AS_SIG(CLS_NAME_CACHE_STATE)));
222 g_obj_CacheState_Ready = env->NewGlobalRef(env->GetStaticObjectField(clsCacheState,
223 "READY", AS_SIG(CLS_NAME_CACHE_STATE)));
225 g_obj_CacheState_LostSignal = env->NewGlobalRef(env->GetStaticObjectField(clsCacheState,
226 "LOST_SIGNAL", AS_SIG(CLS_NAME_CACHE_STATE)));
231 void clearRCSRemoteResourceObject(JNIEnvWrapper* env)
233 env->DeleteGlobalRef(g_cls_RCSRemoteResourceObject);
234 env->DeleteGlobalRef(g_cls_ResourceState);
236 env->DeleteGlobalRef(g_obj_ResourceState_None);
237 env->DeleteGlobalRef(g_obj_ResourceState_Requested);
238 env->DeleteGlobalRef(g_obj_ResourceState_Alive);
239 env->DeleteGlobalRef(g_obj_ResourceState_LostSignal);
240 env->DeleteGlobalRef(g_obj_ResourceState_Destoryed);
242 env->DeleteGlobalRef(g_obj_CacheState_None);
243 env->DeleteGlobalRef(g_obj_CacheState_Unready);
244 env->DeleteGlobalRef(g_obj_CacheState_Ready);
245 env->DeleteGlobalRef(g_obj_CacheState_LostSignal);
248 jobject newRemoteResourceObject(JNIEnvWrapper* env)
250 return env->NewObject(g_cls_RCSRemoteResourceObject, g_ctor_RCSRemoteResourceObject);
253 JNIEXPORT jboolean JNICALL
254 Java_org_iotivity_service_client_RcsRemoteResourceObject_nativeIsMonitoring
255 (JNIEnv* env, jobject obj)
257 LOGD("nativeIsMonitoring");
258 auto res = getResource(env, obj);
259 VERIFY_NO_EXC_RET_DEF(env);
261 return res->isMonitoring();
264 JNIEXPORT jboolean JNICALL
265 Java_org_iotivity_service_client_RcsRemoteResourceObject_nativeIsCaching
266 (JNIEnv* env, jobject obj)
268 LOGD("nativeIsCaching");
269 auto res = getResource(env, obj);
270 VERIFY_NO_EXC_RET_DEF(env);
272 return res->isCaching();
275 JNIEXPORT jboolean JNICALL
276 Java_org_iotivity_service_client_RcsRemoteResourceObject_nativeIsObservable
277 (JNIEnv* env, jobject obj)
279 LOGD("nativeIsObservable");
280 auto res = getResource(env, obj);
281 VERIFY_NO_EXC_RET_DEF(env);
283 return res->isObservable();
286 JNIEXPORT void JNICALL
287 Java_org_iotivity_service_client_RcsRemoteResourceObject_nativeStartMonitoring
288 (JNIEnv* env, jobject obj, jobject listener)
290 LOGD("nativeStartMonitoring");
291 EXPECT(listener, "listener is null.");
293 auto res = getResource(env, obj);
298 res->startMonitoring(
299 std::bind(onStateChanged, std::placeholders::_1, JavaGlobalRef{ env, listener }));
301 catch (const RCSBadRequestException& e)
303 env->ThrowNew(env->FindClass(EXC_NAME_ILLEGAL_STATE), e.what());
307 JNIEXPORT void JNICALL
308 Java_org_iotivity_service_client_RcsRemoteResourceObject_nativeStopMonitoring
309 (JNIEnv* env, jobject obj)
311 LOGD("nativeStopMonitoring");
313 auto res = getResource(env, obj);
316 res->stopMonitoring();
319 JNIEXPORT jobject JNICALL
320 Java_org_iotivity_service_client_RcsRemoteResourceObject_nativeGetState
321 (JNIEnv* env, jobject obj)
323 LOGD("nativeGetState");
325 auto res = getResource(env, obj);
326 VERIFY_NO_EXC_RET_DEF(env);
328 return convertResourceState(env, res->getState());
331 JNIEXPORT void JNICALL
332 Java_org_iotivity_service_client_RcsRemoteResourceObject_nativeStartCaching
333 (JNIEnv* env, jobject obj, jobject listener)
335 LOGD("nativeStartCaching");
337 auto res = getResource(env, obj);
344 res->startCaching(std::bind(onCacheUpdated,
345 std::placeholders::_1, std::placeholders::_2,
346 JavaGlobalRef{ env, listener }));
353 catch (const RCSBadRequestException& e)
355 env->ThrowNew(env->FindClass(EXC_NAME_ILLEGAL_STATE), e.what());
359 JNIEXPORT void JNICALL
360 Java_org_iotivity_service_client_RcsRemoteResourceObject_nativeStopCaching
361 (JNIEnv* env, jobject obj)
363 LOGD("nativeStopCaching");
365 auto res = getResource(env, obj);
371 JNIEXPORT jobject JNICALL
372 Java_org_iotivity_service_client_RcsRemoteResourceObject_nativeGetCacheState
373 (JNIEnv* env, jobject obj)
375 LOGD("nativeGetCacheState");
377 auto res = getResource(env, obj);
378 VERIFY_NO_EXC_RET_DEF(env);
380 return convertCacheState(env, res->getCacheState());
383 JNIEXPORT jboolean JNICALL
384 Java_org_iotivity_service_client_RcsRemoteResourceObject_nativeIsCachedAvailable
385 (JNIEnv* env, jobject obj)
387 LOGD("nativeIsCachedAvailable");
389 auto res = getResource(env, obj);
390 VERIFY_NO_EXC_RET_DEF(env);
394 return res->isCachedAvailable();
396 catch (const RCSBadRequestException& e)
398 env->ThrowNew(env->FindClass(EXC_NAME_ILLEGAL_STATE), e.what());
403 JNIEXPORT jobject JNICALL
404 Java_org_iotivity_service_client_RcsRemoteResourceObject_nativeGetCachedAttributes
405 (JNIEnv* env, jobject obj)
407 LOGD("nativeGetCachedAttributes");
409 auto res = getResource(env, obj);
410 VERIFY_NO_EXC_RET_DEF(env);
414 auto attrs = res->getCachedAttributes();
415 VERIFY_NO_EXC_RET_DEF(env);
417 return newAttributesObject(env, attrs);
419 catch (const RCSBadRequestException& e)
421 env->ThrowNew(env->FindClass(EXC_NAME_ILLEGAL_STATE), e.what());
426 JNIEXPORT void JNICALL
427 Java_org_iotivity_service_client_RcsRemoteResourceObject_nativeGetRemoteAttributes
428 (JNIEnv* env, jobject obj, jobject listener)
430 LOGD("nativeGetRemoteAttributes");
431 EXPECT(listener, "listener is null.");
433 auto res = getResource(env, obj);
438 res->getRemoteAttributes(std::bind(onRemoteAttributesReceived,
439 std::placeholders::_1, std::placeholders::_2, JavaGlobalRef{ env, listener }));
441 catch (const RCSPlatformException& e) {
442 throwPlatformException(env, e);
446 JNIEXPORT void JNICALL
447 Java_org_iotivity_service_client_RcsRemoteResourceObject_nativeSetRemoteAttributes
448 (JNIEnv* env, jobject obj, jobject attrsObj, jobject listener)
450 LOGD("nativeSetRemoteAttributes");
451 auto res = getResource(env, obj);
454 RCSResourceAttributes attrs = toNativeAttributes(env, attrsObj);
459 res->setRemoteAttributes(attrs, std::bind(onRemoteAttributesReceived,
460 std::placeholders::_1, std::placeholders::_2, JavaGlobalRef{ env, listener }));
462 catch (const RCSPlatformException& e) {
463 throwPlatformException(env, e);
467 JNIEXPORT jstring JNICALL
468 Java_org_iotivity_service_client_RcsRemoteResourceObject_nativeGetUri
469 (JNIEnv* env, jobject obj)
471 LOGD("nativeGetUri");
473 auto res = getResource(env, obj);
474 VERIFY_NO_EXC_RET_DEF(env);
476 return env->NewStringUTF(res->getUri().c_str());
479 JNIEXPORT jstring JNICALL
480 Java_org_iotivity_service_client_RcsRemoteResourceObject_nativeGetAddress
481 (JNIEnv* env, jobject obj)
483 LOGD("nativeGetAddress");
484 auto res = getResource(env, obj);
485 VERIFY_NO_EXC_RET_DEF(env);
487 return env->NewStringUTF(res->getAddress().c_str());
490 JNIEXPORT jobjectArray JNICALL
491 Java_org_iotivity_service_client_RcsRemoteResourceObject_nativeGetTypes
492 (JNIEnv* env, jobject obj)
494 LOGD("nativeGetTypes");
495 auto res = getResource(env, obj);
496 VERIFY_NO_EXC_RET_DEF(env);
498 return toJavaStringArray(env, res->getTypes());
501 JNIEXPORT jobjectArray JNICALL
502 Java_org_iotivity_service_client_RcsRemoteResourceObject_nativeGetInterfaces
503 (JNIEnv* env, jobject obj)
505 LOGD("nativeGetInterfaces");
507 auto res = getResource(env, obj);
508 VERIFY_NO_EXC_RET_DEF(env);
510 return toJavaStringArray(env, res->getInterfaces());