2 * //******************************************************************
4 * // Copyright 2015 Samsung Electronics All Rights Reserved.
6 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
8 * // Licensed under the Apache License, Version 2.0 (the "License");
9 * // you may not use this file except in compliance with the License.
10 * // You may obtain a copy of the License at
12 * // http://www.apache.org/licenses/LICENSE-2.0
14 * // Unless required by applicable law or agreed to in writing, software
15 * // distributed under the License is distributed on an "AS IS" BASIS,
16 * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * // See the License for the specific language governing permissions and
18 * // limitations under the License.
20 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
23 #include "JniOcSecureResource.h"
24 #include "JniSecureUtils.h"
25 #include "oic_string.h"
26 namespace PH = std::placeholders;
28 JniOcSecureResource::JniOcSecureResource(std::shared_ptr<OCSecureResource> device)
29 : m_sharedSecureResource(device)
32 JniOcSecureResource::~JniOcSecureResource()
34 LOGD("~JniOcSecureResource()");
35 m_sharedSecureResource = nullptr;
38 std::string JniOcSecureResource::getIpAddr()
40 return m_sharedSecureResource->getDevAddr();
43 std::string JniOcSecureResource::getDeviceID()
45 return m_sharedSecureResource->getDeviceID();
48 int JniOcSecureResource::getDeviceStatus()
50 return m_sharedSecureResource->getDeviceStatus();
53 bool JniOcSecureResource::getOwnedStatus()
55 return m_sharedSecureResource->getOwnedStatus();
58 OCSecureResource* JniOcSecureResource::getDevicePtr()
60 return m_sharedSecureResource.get();
63 JniOcSecureResource* JniOcSecureResource::getJniOcSecureResourcePtr(JNIEnv *env, jobject thiz)
65 JniOcSecureResource *secureResource = GetHandle<JniOcSecureResource>(env, thiz);
66 if (env->ExceptionCheck())
68 LOGE("Failed to get native handle from OcSecureResource");
72 ThrowOcException(JNI_NO_NATIVE_POINTER, "");
74 return secureResource;
77 JniProvisionResultListner* JniOcSecureResource::AddProvisionResultListener(JNIEnv* env,
80 JniProvisionResultListner *resultListener = NULL;
83 for (auto it = resultMap.begin(); it != resultMap.end(); ++it)
85 if (env->IsSameObject(jListener, it->first))
87 auto refPair = it->second;
88 resultListener = refPair.first;
91 resultMap.insert(*it);
92 LOGD("Provision resultListener: ref. count incremented");
98 resultListener = new JniProvisionResultListner(env, jListener,
99 RemoveCallback(std::bind(&JniOcSecureResource::RemoveProvisionResultListener,
100 this, PH::_1, PH::_2)));
101 jobject jgListener = env->NewGlobalRef(jListener);
103 resultMap.insert(std::pair < jobject, std::pair < JniProvisionResultListner*,
104 int >> (jgListener, std::pair<JniProvisionResultListner*, int>(resultListener, 1)));
105 LOGD("Provision resultListener: new listener");
107 resultMapLock.unlock();
108 return resultListener;
111 void JniOcSecureResource::RemoveProvisionResultListener(JNIEnv* env, jobject jListener)
113 resultMapLock.lock();
115 for (auto it = resultMap.begin(); it != resultMap.end(); ++it)
117 if (env->IsSameObject(jListener, it->first))
119 auto refPair = it->second;
120 if (refPair.second > 1)
123 it->second = refPair;
124 resultMap.insert(*it);
125 LOGI("Provision resultListener: ref. count decremented");
129 env->DeleteGlobalRef(it->first);
130 JniProvisionResultListner* listener = refPair.first;
133 LOGI("Provision resultListener removed");
138 resultMapLock.unlock();
141 OCStackResult JniOcSecureResource::doOwnershipTransfer(JNIEnv* env, jobject jListener)
143 JniProvisionResultListner *resultListener = AddProvisionResultListener(env, jListener);
145 ResultCallBack resultCallback = [resultListener](PMResultList_t *result, int hasError)
147 resultListener->ProvisionResultCallback(result, hasError, ListenerFunc::OWNERSHIPTRANSFER);
150 return m_sharedSecureResource->doOwnershipTransfer(resultCallback);
153 OCStackResult JniOcSecureResource::getLinkedDevices(JNIEnv *env, UuidList_t &uuidList)
155 return m_sharedSecureResource->getLinkedDevices(uuidList);
158 OCStackResult JniOcSecureResource::removeDevice(JNIEnv* env, jint timeout, jobject jListener)
160 JniProvisionResultListner *resultListener = AddProvisionResultListener(env, jListener);
162 ResultCallBack resultCallback = [resultListener](PMResultList_t *result, int hasError)
164 resultListener->ProvisionResultCallback(result, hasError, ListenerFunc::REMOVEDEVICE);
167 return m_sharedSecureResource->removeDevice((int)timeout, resultCallback);
170 OCStackResult JniOcSecureResource::unlinkDevices(JNIEnv* env, jobject _device2, jobject jListener)
172 JniProvisionResultListner *resultListener = AddProvisionResultListener(env, jListener);
174 ResultCallBack resultCallback = [resultListener](PMResultList_t *result, int hasError)
176 resultListener->ProvisionResultCallback(result, hasError, ListenerFunc::UNLINKDEVICES);
179 JniOcSecureResource *device2 = JniOcSecureResource::getJniOcSecureResourcePtr(env, _device2);
182 return OC_STACK_ERROR;
185 return m_sharedSecureResource->unlinkDevices(*device2->getDevicePtr(), resultCallback);
188 OCStackResult JniOcSecureResource::provisionCredentials(JNIEnv* env, jint type, jint keySize,
189 jobject _device2, jobject jListener)
191 JniProvisionResultListner *resultListener = AddProvisionResultListener(env, jListener);
193 ResultCallBack resultCallback = [resultListener](PMResultList_t *result, int hasError)
195 resultListener->ProvisionResultCallback(result, hasError, ListenerFunc::PROVISIONCREDENTIALS);
198 JniOcSecureResource *device2 = JniOcSecureResource::getJniOcSecureResourcePtr(env, _device2);
201 return OC_STACK_ERROR;
204 Credential cred((OicSecCredType_t)type, keySize);
206 return m_sharedSecureResource->provisionCredentials(cred, *device2->getDevicePtr(),
210 OCStackResult JniOcSecureResource::provisionACL(JNIEnv* env, jobject _acl, jobject jListener)
214 JniProvisionResultListner *resultListener = AddProvisionResultListener(env, jListener);
215 OicSecAcl_t *acl = new OicSecAcl_t;
219 return OC_STACK_NO_MEMORY;
224 if (OC_STACK_OK != JniSecureUtils::convertJavaACLToOCAcl(env, _acl, acl))
227 return OC_STACK_ERROR;
230 ResultCallBack resultCallback = [acl, resultListener](PMResultList_t *result, int hasError)
233 resultListener->ProvisionResultCallback(result, hasError, ListenerFunc::PROVISIONACL);
235 ret = m_sharedSecureResource->provisionACL(acl, resultCallback);
237 if (ret != OC_STACK_OK)
247 OCStackResult JniOcSecureResource::provisionDirectPairing(JNIEnv* env, jobjectArray jpdacls,
248 jobject jListener, std::string pin, std::vector<int> prms, int edp)
251 JniProvisionResultListner *resultListener = AddProvisionResultListener(env, jListener);
253 jsize len = env->GetArrayLength(jpdacls);
255 OicSecPconf_t *pconf = nullptr;
256 OicSecPdAcl_t *head = nullptr;
258 for (jsize i = 0; i < len; ++i)
260 OicSecPdAcl_t *pdacl = new OicSecPdAcl_t;
263 return OC_STACK_NO_MEMORY;
266 memset(pdacl, 0, sizeof(OicSecPdAcl_t));
267 pdacl->next = nullptr;
269 jobject jpdacl = env->GetObjectArrayElement(jpdacls, i);
271 if (OC_STACK_OK != JniSecureUtils::convertJavaPdACLToOCAcl(env, jpdacl, pdacl))
274 return OC_STACK_ERROR;
281 pconf = new OicSecPconf_t;
282 memset(pconf, 0, sizeof(OicSecPconf_t));
284 pconf->prmLen = prms.size();
285 pconf->prm = new OicSecPrm_t[pconf->prmLen];
288 for (int i = 0 ; i < prms.size(); i++)
289 pconf->prm[i] = (OicSecPrm_t)prms[i];
291 memcpy(pconf->pin.val, pin.c_str(), DP_PIN_LENGTH);
292 pconf->pdacls = head;
294 ResultCallBack resultCallback = [head, resultListener, pconf, prms]
295 (PMResultList_t *result, int hasError)
297 OicSecPdAcl_t *tmp1, *tmp2;
308 resultListener->ProvisionResultCallback(result, hasError, ListenerFunc::PROVISIONDIRECTPAIRING);
311 ret = m_sharedSecureResource->provisionDirectPairing(pconf, resultCallback);
313 if (ret != OC_STACK_OK)
315 OicSecPdAcl_t *tmp1, *tmp2;
330 OCStackResult JniOcSecureResource::provisionPairwiseDevices(JNIEnv* env, jint type, jint keySize,
331 jobject _acl1, jobject _device2, jobject _acl2, jobject jListener)
336 JniProvisionResultListner *resultListener = AddProvisionResultListener(env, jListener);
337 JniOcSecureResource *device2 = JniOcSecureResource::getJniOcSecureResourcePtr(env, _device2);
340 return OC_STACK_ERROR;
343 Credential cred((OicSecCredType_t)type, keySize);
345 OicSecAcl_t *acl1 = nullptr;
346 OicSecAcl_t *acl2 = nullptr;
350 acl1 = new OicSecAcl_t;
353 return OC_STACK_NO_MEMORY;
356 if (OC_STACK_OK != JniSecureUtils::convertJavaACLToOCAcl(env, _acl1, acl1))
359 return OC_STACK_ERROR;
361 acl1->next = nullptr;
366 acl2 = new OicSecAcl_t;
370 return OC_STACK_NO_MEMORY;
373 if (OC_STACK_OK != JniSecureUtils::convertJavaACLToOCAcl(env, _acl2, acl2))
376 return OC_STACK_ERROR;
378 acl2->next = nullptr;
381 ResultCallBack resultCallback = [acl1, acl2, resultListener](PMResultList_t *result,
386 resultListener->ProvisionResultCallback(result, hasError,
387 ListenerFunc::PROVISIONPAIRWISEDEVICES);
391 ret = m_sharedSecureResource->provisionPairwiseDevices(cred, acl1,
392 *device2->getDevicePtr(), acl2, resultCallback);
393 if (ret != OC_STACK_OK)
404 * Class: org_iotivity_base_OcSecureResource
405 * Method: doOwnershipTransfer
406 * Signature: (Lorg/iotivity/base/OcSecureResource/doOwnershipTransferListener;)V
408 JNIEXPORT void JNICALL Java_org_iotivity_base_OcSecureResource_doOwnershipTransfer
409 (JNIEnv *env, jobject thiz, jobject jListener)
411 LOGD("OcSecureResource_doOwnershipTransfer");
414 ThrowOcException(OC_STACK_INVALID_PARAM, "provisionResultListener cannot be null");
418 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
426 OCStackResult result = secureResource->doOwnershipTransfer(env, jListener);
427 if (OC_STACK_OK != result)
429 ThrowOcException(result, "OcSecureResource_doOwnershipTransfer");
433 catch (OCException& e)
435 LOGE("%s", e.reason().c_str());
436 ThrowOcException(e.code(), e.reason().c_str());
441 * Class: org_iotivity_base_OcSecureResource
442 * Method: removeDevice
443 * Signature: (ILorg/iotivity/base/OcSecureResource/removeDevice;)V
445 JNIEXPORT void JNICALL Java_org_iotivity_base_OcSecureResource_removeDevice
446 (JNIEnv *env, jobject thiz, jint timeout, jobject jListener)
448 LOGD("OcSecureResource_removeDevice");
451 ThrowOcException(OC_STACK_INVALID_PARAM, "Timeout value cannot be negative");
457 ThrowOcException(OC_STACK_INVALID_PARAM, "provisionResultListener cannot be null");
461 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
469 OCStackResult result = secureResource->removeDevice(env, timeout, jListener);
470 if (OC_STACK_OK != result)
472 ThrowOcException(result, "OcSecureResource_removeDevice");
476 catch (OCException& e)
478 LOGE("%s", e.reason().c_str());
479 ThrowOcException(e.code(), e.reason().c_str());
484 * Class: org_iotivity_base_OcSecureResource
485 * Method: unlinkDevices
486 * Signature: (Lorg/iotivity/base/OcSecureResource/unlinkDevices;)V
488 JNIEXPORT void JNICALL Java_org_iotivity_base_OcSecureResource_unlinkDevices
489 (JNIEnv *env, jobject thiz, jobject device2, jobject jListener)
491 LOGD("OcSecureResource_unlinkDevices");
492 if (!jListener || !device2)
494 ThrowOcException(OC_STACK_INVALID_PARAM, "provisionResultListener or device2 cannot be null");
498 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
506 OCStackResult result = secureResource->unlinkDevices(env, device2, jListener);
507 if (OC_STACK_OK != result)
509 ThrowOcException(result, "OcSecureResource_unlinkDevices");
513 catch (OCException& e)
515 LOGE("%s", e.reason().c_str());
516 ThrowOcException(e.code(), e.reason().c_str());
521 * Class: org_iotivity_base_OcSecureResource
522 * Method: provisionCredentials1
523 * Signature: (Lorg/iotivity/base/OcSecureResource/provisionCredentials;)V
525 JNIEXPORT void JNICALL Java_org_iotivity_base_OcSecureResource_provisionCredentials1
526 (JNIEnv *env, jobject thiz, jint type, jint keySize, jobject device2, jobject jListener)
528 LOGD("OcSecureResource_provisionCredentials");
529 if (!jListener || !device2)
531 ThrowOcException(OC_STACK_INVALID_PARAM, "provisionResultListener or device2 cannot be null");
535 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
543 OCStackResult result = secureResource->provisionCredentials(env, type, keySize, device2,
545 if (OC_STACK_OK != result)
547 ThrowOcException(result, "OcSecureResource_provisionCredentials");
551 catch (OCException& e)
553 LOGE("%s", e.reason().c_str());
554 ThrowOcException(e.code(), e.reason().c_str());
559 * Class: org_iotivity_base_OcSecureResource
560 * Method: provisionACL
561 * Signature: (Lorg/iotivity/base/OcSecureResource/provisionACL;)V
563 JNIEXPORT void JNICALL Java_org_iotivity_base_OcSecureResource_provisionACL
564 (JNIEnv *env, jobject thiz, jobject acl, jobject jListener)
566 LOGD("OcSecureResource_provisionACL");
567 if (!jListener || !acl)
569 ThrowOcException(OC_STACK_INVALID_PARAM, "provisionResultListener or acl cannot be null");
573 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
581 OCStackResult result = secureResource->provisionACL(env, acl, jListener);
582 if (OC_STACK_OK != result)
584 ThrowOcException(result, "OcSecureResource_provisionACL");
588 catch (OCException& e)
590 LOGE("%s", e.reason().c_str());
591 ThrowOcException(e.code(), e.reason().c_str());
596 * Class: org_iotivity_base_OcSecureResource
597 * Method: provisionPairwiseDevices1
598 * Signature: (Lorg/iotivity/base/OcSecureResource/provisionPairwiseDevices;)V
600 JNIEXPORT void JNICALL Java_org_iotivity_base_OcSecureResource_provisionPairwiseDevices1
601 (JNIEnv *env, jobject thiz, jint type, jint keySize, jobject acl1, jobject device2,
602 jobject acl2, jobject jListener)
604 LOGD("OcSecureResource_provisionPairwiseDevices");
605 if (!jListener || !device2)
607 ThrowOcException(OC_STACK_INVALID_PARAM, "Invalid Parameters");
611 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
619 OCStackResult result = secureResource->provisionPairwiseDevices(env, type, keySize,
620 acl1, device2, acl2, jListener);
621 if (OC_STACK_OK != result)
623 ThrowOcException(result, "OcSecureResource_provisionPairwiseDevices");
627 catch (OCException& e)
629 LOGE("%s", e.reason().c_str());
630 ThrowOcException(e.code(), e.reason().c_str());
635 * Class: org_iotivity_base_OcSecureResource
636 * Method: provisionDirectPairing
637 * Signature: (Ljava/lang/String;[Lorg/iotivity/base/OicSecPdAcl;ILorg/iotivity/base/OcSecureResource/ProvisionDirectPairingListener;I)V
639 JNIEXPORT void JNICALL Java_org_iotivity_base_OcSecureResource_provisionDirectPairing
640 (JNIEnv *env, jobject thiz, jstring jpin, jobjectArray pdacls, jintArray jprmType,
641 jint jedp, jobject jListener)
643 LOGD("OcSecureResource_provisionDirectPairing");
644 if (!jListener || !pdacls || !jpin || ! jprmType)
646 ThrowOcException(OC_STACK_INVALID_PARAM, "Invalid Parameters");
649 std::string pin = env->GetStringUTFChars(jpin, nullptr);
651 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
657 const jsize len = env->GetArrayLength(jprmType);
658 jint* ints = env->GetIntArrayElements(jprmType, nullptr);
659 std::vector<int> value;
660 for (jsize i = 0; i < len; ++i)
662 value.push_back(static_cast<int>(ints[i]));
664 env->ReleaseIntArrayElements(jprmType, ints, JNI_ABORT);
668 OCStackResult result = secureResource->provisionDirectPairing(env, pdacls, jListener,
669 pin, value, static_cast<int>(jedp));
670 if (OC_STACK_OK != result)
672 ThrowOcException(result, "OcSecureResource_provisionDirectPairing");
676 catch (OCException& e)
678 LOGE("%s", e.reason().c_str());
679 ThrowOcException(e.code(), e.reason().c_str());
684 * Class: org_iotivity_base_OcSecureResource
685 * Method: getLinkedDevices
686 * Signature: ()Ljava/util/List;
688 JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcSecureResource_getLinkedDevices
689 (JNIEnv *env, jobject thiz)
691 LOGD("OcSecureResource_getLinkedDevices");
694 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
702 OCStackResult result = secureResource->getLinkedDevices(env, uuidList);
703 if (OC_STACK_OK != result)
705 ThrowOcException(result, "OcSecureResource_getLinkedDevices");
708 return JniSecureUtils::convertUUIDVectorToJavaStrList(env, uuidList);
710 catch (OCException& e)
712 LOGE("%s", e.reason().c_str());
713 ThrowOcException(e.code(), e.reason().c_str());
719 * Class: org_iotivity_base_OcSecureResource
721 * Signature: ()Ljava/lang/String;
723 JNIEXPORT jstring JNICALL Java_org_iotivity_base_OcSecureResource_getIpAddr
724 (JNIEnv *env, jobject thiz)
726 LOGD("OcSecureResource_getIpAddr");
727 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
733 return env->NewStringUTF(secureResource->getIpAddr().c_str());
737 * Class: org_iotivity_base_OcSecureResource
738 * Method: getDeviceID
739 * Signature: ()Ljava/lang/String;
741 JNIEXPORT jstring JNICALL Java_org_iotivity_base_OcSecureResource_getDeviceID
742 (JNIEnv *env , jobject thiz)
744 LOGD("OcSecureResource_getDeviceID");
745 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
751 return env->NewStringUTF(secureResource->getDeviceID().c_str());
755 * Class: org_iotivity_base_OcSecureResource
756 * Method: deviceStatus
759 JNIEXPORT jint JNICALL Java_org_iotivity_base_OcSecureResource_deviceStatus
760 (JNIEnv *env, jobject thiz)
762 LOGD("OcSecureResource_deviceStatus");
763 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
769 return secureResource->getDeviceStatus();
773 * Class: org_iotivity_base_OcSecureResource
774 * Method: ownedStatus
777 JNIEXPORT jint JNICALL Java_org_iotivity_base_OcSecureResource_ownedStatus
778 (JNIEnv *env, jobject thiz)
780 LOGD("OcSecureResource_ownedStatus");
781 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
787 return secureResource->getOwnedStatus();
791 * Class: org_iotivity_base_OcSecureResource
795 JNIEXPORT void JNICALL Java_org_iotivity_base_OcSecureResource_dispose
796 (JNIEnv *env, jobject thiz)
798 LOGD("OcSecureResource_dispose");
799 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
800 delete secureResource;