1 /* ****************************************************************
3 * Copyright 2016 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 "JniOcRDClient.h"
22 #include "JniOcResourceHandle.h"
26 void RemoveOnPublishResourceListener(JNIEnv* env, jobject jListener)
34 publishResourceListenerMapLock.lock();
36 for (auto it = onPublishResourceListenerMap.begin(); it != onPublishResourceListenerMap.end(); ++it)
38 if (env->IsSameObject(jListener, it->first))
40 auto refPair = it->second;
41 if (refPair.second > 1)
45 onPublishResourceListenerMap.insert(*it);
46 LOGI("onPublishResourceListener: ref. count decremented");
50 env->DeleteGlobalRef(it->first);
51 JniOnPublishResourceListener* listener = refPair.first;
53 onPublishResourceListenerMap.erase(it);
54 LOGI("onPublishResourceListener is removed");
62 ThrowOcException(JNI_EXCEPTION, "onPublishResourceListener not found");
64 publishResourceListenerMapLock.unlock();
67 JniOnPublishResourceListener* AddOnPublishResourceListener(JNIEnv* env, jobject jListener)
75 JniOnPublishResourceListener *onPublishResourceListener = nullptr;
77 publishResourceListenerMapLock.lock();
79 for (auto it = onPublishResourceListenerMap.begin(); it !=
80 onPublishResourceListenerMap.end(); ++it)
82 if (env->IsSameObject(jListener, it->first))
84 auto refPair = it->second;
85 onPublishResourceListener = refPair.first;
88 onPublishResourceListenerMap.insert(*it);
89 LOGD("onPublishResourceListener: ref. count incremented");
93 if (!onPublishResourceListener)
95 onPublishResourceListener = new JniOnPublishResourceListener(env, jListener,
96 RemoveOnPublishResourceListener);
98 jobject jgListener = env->NewGlobalRef(jListener);
99 onPublishResourceListenerMap.insert(
100 std::pair<jobject, std::pair<JniOnPublishResourceListener*, int>>(
102 std::pair<JniOnPublishResourceListener*, int>(onPublishResourceListener, 1)));
103 LOGI("onPublishResourceListener: new listener");
105 publishResourceListenerMapLock.unlock();
106 return onPublishResourceListener;
109 void RemoveOnDeleteResourceListener(JNIEnv* env, jobject jListener)
117 deleteResourceListenerMapLock.lock();
118 bool isFound = false;
119 for (auto it = onDeleteResourceListenerMap.begin(); it !=
120 onDeleteResourceListenerMap.end(); ++it)
122 if (env->IsSameObject(jListener, it->first))
124 auto refPair = it->second;
125 if (refPair.second > 1)
128 it->second = refPair;
129 onDeleteResourceListenerMap.insert(*it);
130 LOGI("onDeleteResourceListener: ref. count decremented");
134 env->DeleteGlobalRef(it->first);
135 JniOnDeleteResourceListener* listener = refPair.first;
137 onDeleteResourceListenerMap.erase(it);
138 LOGI("onDeleteResourceListener is removed");
146 ThrowOcException(JNI_EXCEPTION, "onDeleteResourceListener not found");
148 deleteResourceListenerMapLock.unlock();
151 JniOnDeleteResourceListener* AddOnDeleteResourceListener(JNIEnv* env, jobject jListener)
159 JniOnDeleteResourceListener *onDeleteResourceListener = nullptr;
161 deleteResourceListenerMapLock.lock();
163 for (auto it = onDeleteResourceListenerMap.begin(); it !=
164 onDeleteResourceListenerMap.end(); ++it)
166 if (env->IsSameObject(jListener, it->first))
168 auto refPair = it->second;
169 onDeleteResourceListener = refPair.first;
171 it->second = refPair;
172 onDeleteResourceListenerMap.insert(*it);
173 LOGD("onDeleteResourceListener: ref. count incremented");
177 if (!onDeleteResourceListener)
179 onDeleteResourceListener = new JniOnDeleteResourceListener(env, jListener,
180 RemoveOnDeleteResourceListener);
181 jobject jgListener = env->NewGlobalRef(jListener);
182 onDeleteResourceListenerMap.insert(
183 std::pair<jobject, std::pair<JniOnDeleteResourceListener*, int>>(
185 std::pair<JniOnDeleteResourceListener*, int>(onDeleteResourceListener, 1)));
186 LOGI("onDeleteResourceListener: new listener");
188 deleteResourceListenerMapLock.unlock();
189 return onDeleteResourceListener;
193 * Class: org_iotivity_base_OcRDClient
194 * Method: publishResourceToRD0
195 * Signature: (Ljava/lang/String;ILorg/iotivity/base/OcRDClient/OnPublishResourceListener;I)V
197 JNIEXPORT void JNICALL Java_org_iotivity_base_OcRDClient_publishResourceToRD0(
201 jint jConnectivityType,
205 LOGD("OcRDClient_publishResourceToRD");
210 host = env->GetStringUTFChars(jHost, nullptr);
214 ThrowOcException(OC_STACK_INVALID_PARAM, "onPublishResourceListener cannot be null");
217 JniOnPublishResourceListener *onPubResListener = AddOnPublishResourceListener(env, jListener);
219 PublishResourceCallback pubResCallback = [onPubResListener](
220 const OCRepresentation& ocRepresentation,
223 onPubResListener->onPublishResourceCallback(ocRepresentation, eCode);
228 OCStackResult result = RDClient::Instance().publishResourceToRD(
230 static_cast<OCConnectivityType>(jConnectivityType),
232 JniUtils::getQOS(env, static_cast<int>(jQoS)));
234 if (OC_STACK_OK != result)
236 ThrowOcException(result, "Publish resource has failed");
240 catch (OCException& e)
242 LOGE("%s", e.reason().c_str());
243 ThrowOcException(e.code(), e.reason().c_str());
246 ThrowOcException(JNI_NO_SUPPORT, "Not supported");
252 * Class: org_iotivity_base_OcRDClient
253 * Method: publishResourceToRD1
254 * Signature: (Ljava/lang/String;I[Lorg/iotivity/base/OcResourceHandle;Lorg/iotivity/base/OcRDClient/OnPublishResourceListener;I)V
256 JNIEXPORT void JNICALL Java_org_iotivity_base_OcRDClient_publishResourceToRD1(
260 jint jConnectivityType,
261 jobjectArray jResourceHandleArray,
265 LOGD("OcRDClient_publishResourceToRD");
275 host = env->GetStringUTFChars(jHost, nullptr);
279 ThrowOcException(OC_STACK_INVALID_PARAM, "onPublishResourceListener cannot be null");
282 if (!jResourceHandleArray)
284 ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandleList cannot be null");
287 JniOnPublishResourceListener *onPubResListener = AddOnPublishResourceListener(env, jListener);
289 PublishResourceCallback pubResCallback = [onPubResListener](
290 const OCRepresentation& ocRepresentation,
293 onPubResListener->onPublishResourceCallback(ocRepresentation, eCode);
296 std::vector<OCResourceHandle> resourceHandleList;
297 size_t len = env->GetArrayLength(jResourceHandleArray);
298 for (size_t i = 0; i < len; ++i)
300 jobject jResourceHandle = env->GetObjectArrayElement(jResourceHandleArray, i);
301 if (!jResourceHandle)
303 ThrowOcException(JNI_EXCEPTION, "resource handle cannot be null");
306 JniOcResourceHandle* jniOcResourceHandle =
307 JniOcResourceHandle::getJniOcResourceHandlePtr(env, jResourceHandle);
308 if (!jniOcResourceHandle)
310 ThrowOcException(OC_STACK_INVALID_PARAM, "resource handle is invalid");
314 resourceHandleList.push_back(jniOcResourceHandle->getOCResourceHandle());
319 OCStackResult result = RDClient::Instance().publishResourceToRD(
321 static_cast<OCConnectivityType>(jConnectivityType),
324 JniUtils::getQOS(env, static_cast<int>(jQoS)));
326 if (OC_STACK_OK != result)
328 ThrowOcException(result, "Publish resource has failed");
332 catch (OCException& e)
334 LOGE("%s", e.reason().c_str());
335 ThrowOcException(e.code(), e.reason().c_str());
338 ThrowOcException(JNI_NO_SUPPORT, "Not supported");
344 * Class: org_iotivity_base_OcRDClient
345 * Method: deleteResourceFromRD0
346 * Signature: (Ljava/lang/String;ILorg/iotivity/base/OcRDClient/OnDeleteResourceListener;I)V
348 JNIEXPORT void JNICALL Java_org_iotivity_base_OcRDClient_deleteResourceFromRD0(
352 jint jConnectivityType,
356 LOGD("OcRDClient_deleteResourceFromRD");
361 host = env->GetStringUTFChars(jHost, nullptr);
365 ThrowOcException(OC_STACK_INVALID_PARAM, "onDeleteResourceListener cannot be null");
368 JniOnDeleteResourceListener *onDelResListener = AddOnDeleteResourceListener(env, jListener);
370 DeleteResourceCallback delResCallback = [onDelResListener](const int eCode)
372 onDelResListener->onDeleteResourceCallback(eCode);
376 OCStackResult result = RDClient::Instance().deleteResourceFromRD(
378 static_cast<OCConnectivityType>(jConnectivityType),
380 JniUtils::getQOS(env, static_cast<int>(jQoS)));
382 if (OC_STACK_OK != result)
384 ThrowOcException(result, "Delete resource has failed");
388 catch (OCException& e)
390 LOGE("%s", e.reason().c_str());
391 ThrowOcException(e.code(), e.reason().c_str());
394 ThrowOcException(JNI_NO_SUPPORT, "Not supported");
400 * Class: org_iotivity_base_OcRDClient
401 * Method: deleteResourceFromRD1
402 * Signature: (Ljava/lang/String;I[Lorg/iotivity/base/OcResourceHandle;Lorg/iotivity/base/OcRDClient/OnDeleteResourceListener;I)V
404 JNIEXPORT void JNICALL Java_org_iotivity_base_OcRDClient_deleteResourceFromRD1(
408 jint jConnectivityType,
409 jobjectArray jResourceHandleArray,
413 LOGD("OcRDClient_deleteResourceFromRD");
423 host = env->GetStringUTFChars(jHost, nullptr);
427 ThrowOcException(OC_STACK_INVALID_PARAM, "onDeleteResourceListener cannot be null");
430 if (!jResourceHandleArray)
432 ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandleList cannot be null");
435 JniOnDeleteResourceListener *onDelResListener = AddOnDeleteResourceListener(env, jListener);
437 DeleteResourceCallback delResCallback = [onDelResListener](const int eCode)
439 onDelResListener->onDeleteResourceCallback(eCode);
442 std::vector<OCResourceHandle> resourceHandleList;
443 size_t len = env->GetArrayLength(jResourceHandleArray);
444 for (size_t i = 0; i < len; ++i)
446 jobject jResourceHandle = env->GetObjectArrayElement(jResourceHandleArray, i);
447 if (!jResourceHandle)
449 ThrowOcException(JNI_EXCEPTION, "resource handle cannot be null");
453 JniOcResourceHandle* jniOcResourceHandle =
454 JniOcResourceHandle::getJniOcResourceHandlePtr(env, jResourceHandle);
455 if (!jniOcResourceHandle)
457 ThrowOcException(OC_STACK_INVALID_PARAM, "resource handle is invalid");
461 resourceHandleList.push_back(jniOcResourceHandle->getOCResourceHandle());
466 OCStackResult result = RDClient::Instance().deleteResourceFromRD(
468 static_cast<OCConnectivityType>(jConnectivityType),
471 JniUtils::getQOS(env, static_cast<int>(jQoS)));
473 if (OC_STACK_OK != result)
475 ThrowOcException(result, "Delete resource has failed");
479 catch (OCException& e)
481 LOGE("%s", e.reason().c_str());
482 ThrowOcException(e.code(), e.reason().c_str());
485 ThrowOcException(JNI_NO_SUPPORT, "Not supported");