From 1cee1631595cac6a6394ac2e0b365c6dd5a42c68 Mon Sep 17 00:00:00 2001 From: Youngjae Shin Date: Tue, 2 Aug 2016 13:14:01 +0900 Subject: [PATCH] Imported Upstream version 1.1.1 --- android/android_api/base/build.gradle | 2 +- android/android_api/base/jni/Android.mk | 22 +- .../android_api/base/jni/JniOcDirectPairDevice.cpp | 132 ++ .../android_api/base/jni/JniOcDirectPairDevice.h | 101 ++ android/android_api/base/jni/JniOcPlatform.cpp | 317 ++++- android/android_api/base/jni/JniOcPlatform.h | 41 +- .../android_api/base/jni/JniOcSecureResource.cpp | 166 ++- android/android_api/base/jni/JniOcSecureResource.h | 11 +- android/android_api/base/jni/JniOcStack.cpp | 296 ++-- android/android_api/base/jni/JniOcStack.h | 75 +- .../base/jni/JniOnDPDevicesFoundListener.cpp | 165 +++ .../base/jni/JniOnDPDevicesFoundListener.h | 51 + .../base/jni/JniOnDirectPairingListener.cpp | 129 ++ .../base/jni/JniOnDirectPairingListener.h | 43 + .../base/jni/JniProvisionResultListner.cpp | 5 + .../base/jni/JniProvisionResultListner.h | 3 +- android/android_api/base/jni/JniSecureUtils.cpp | 423 +++++- android/android_api/base/jni/JniSecureUtils.h | 2 + .../java/org/iotivity/base/SmokeTest.java | 6 +- .../main/java/org/iotivity/base/OcDeviceInfo.java | 15 +- .../java/org/iotivity/base/OcDirectPairDevice.java | 113 ++ .../java/org/iotivity/base/OcHeaderOption.java | 15 +- .../main/java/org/iotivity/base/OcPlatform.java | 83 +- .../src/main/java/org/iotivity/base/OcPrmType.java | 58 + .../java/org/iotivity/base/OcSecureResource.java | 40 + .../src/main/java/org/iotivity/base/OicSecAce.java | 80 ++ .../src/main/java/org/iotivity/base/OicSecAcl.java | 171 +-- .../main/java/org/iotivity/base/OicSecPdAcl.java | 95 ++ .../main/java/org/iotivity/base/OicSecResr.java | 102 ++ .../java/org/iotivity/base/OicSecValidity.java | 67 + .../main/java/org/iotivity/ca/CaIpInterface.java | 12 +- .../java/org/iotivity/ca/CaLeClientInterface.java | 2 +- android/examples/DirectPairing/.classpath | 9 + android/examples/DirectPairing/.project | 33 + android/examples/DirectPairing/DirectPairing.iml | 96 ++ android/examples/DirectPairing/build.gradle | 38 + android/examples/DirectPairing/project.properties | 15 + .../DirectPairing/src/main/AndroidManifest.xml | 29 + .../assets/oic_svr_db_client_directpairing.dat | Bin 0 -> 778 bytes .../DirectPairing/ExpandableListAdapter.java | 137 ++ .../iotivity/base/examples/DirectPairing/Led.java | 66 + .../base/examples/DirectPairing/MainActivity.java | 534 ++++++++ .../examples/DirectPairing/StringConstants.java | 40 + .../src/main/res/drawable-hdpi/arrow_down.png | Bin 0 -> 567 bytes .../src/main/res/drawable-hdpi/arrow_right.png | Bin 0 -> 406 bytes .../src/main/res/drawable-hdpi/ic_launcher.png | Bin 0 -> 7658 bytes .../src/main/res/drawable-mdpi/ic_launcher.png | Bin 0 -> 3777 bytes .../src/main/res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 12516 bytes .../src/main/res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 24777 bytes .../src/main/res/layout/activity_main.xml | 95 ++ .../src/main/res/layout/custom_list_view.xml | 34 + .../src/main/res/layout/group_indicator.xml | 6 + .../src/main/res/layout/list_group.xml | 28 + .../src/main/res/layout/list_item.xml | 39 + .../DirectPairing/src/main/res/menu/main.xml | 11 + .../src/main/res/values-v11/styles.xml | 11 + .../src/main/res/values-v14/styles.xml | 12 + .../src/main/res/values-w820dp/dimens.xml | 10 + .../DirectPairing/src/main/res/values/dimens.xml | 7 + .../DirectPairing/src/main/res/values/strings.xml | 10 + .../DirectPairing/src/main/res/values/styles.xml | 20 + .../base/examples/DeviceDiscoveryClient.java | 8 +- .../base/examples/DeviceDiscoveryServer.java | 8 +- .../src/main/assets/oic_svr_db_client.dat | Bin 711 -> 1046 bytes .../src/main/assets/oic_svr_db_client.json | 64 +- .../provisioningclient/ProvisioningClient.java | 663 +++++---- .../provisioningclient/StringConstants.java | 20 +- android/examples/settings.gradle | 2 +- .../src/main/assets/oic_svr_db_client.dat | Bin 907 -> 1226 bytes .../src/main/assets/oic_svr_db_client.json | 40 +- .../src/main/assets/oic_svr_db_server.dat | Bin 1031 -> 1421 bytes .../src/main/assets/oic_svr_db_server.json | 50 +- build_common/SConscript | 19 +- build_common/android/SConscript | 1 - build_common/linux/SConscript | 2 +- build_common/tizen/SConscript | 2 +- examples/OICMiddle/SConscript | 13 +- extlibs/gtest/SConscript | 62 +- extlibs/tinycbor/SConscript | 3 +- extlibs/tinydtls/dtls.c | 127 +- extlibs/tinydtls/hmac.h | 10 +- extlibs/tinydtls/sha2/sha2.c | 120 +- extlibs/tinydtls/sha2/sha2.h | 108 +- extlibs/tinydtls/sha2/sha2prog.c | 24 +- extlibs/tinydtls/sha2/sha2speed.c | 30 +- extlibs/tinydtls/tests/pcap.c | 2 +- gbsbuild.sh | 3 +- plugins/samples/linux/IotivityandZigbeeServer.c | 4 + plugins/unittests/SConscript | 27 +- resource/SConscript | 5 +- resource/c_common/ocrandom/test/SConscript | 31 +- resource/c_common/oic_malloc/test/SConscript | 28 +- resource/c_common/oic_string/test/SConscript | 21 +- resource/c_common/oic_time/test/SConscript | 30 +- resource/csdk/connectivity/api/cacommon.h | 3 + resource/csdk/connectivity/api/cainterface.h | 16 +- .../csdk/connectivity/api/casecurityinterface.h | 2 +- resource/csdk/connectivity/build/SConscript | 10 +- .../csdk/connectivity/build/android/SConscript | 1 - resource/csdk/connectivity/build/linux/SConscript | 2 +- resource/csdk/connectivity/build/tizen/gbsbuild.sh | 2 + .../build/tizen/packaging/com.oic.ca.spec | 8 +- .../csdk/connectivity/build/tizen/scons/SConscript | 1 + .../csdk/connectivity/inc/caadapterinterface.h | 8 +- resource/csdk/connectivity/inc/caedradapter.h | 9 +- .../connectivity/inc/caedradapter_singlethread.h | 2 +- .../csdk/connectivity/inc/cainterfacecontroller.h | 9 +- .../inc/cainterfacecontroller_singlethread.h | 4 +- resource/csdk/connectivity/inc/caipadapter.h | 2 +- resource/csdk/connectivity/inc/caipinterface.h | 32 +- resource/csdk/connectivity/inc/caleadapter.h | 7 +- resource/csdk/connectivity/inc/caleinterface.h | 21 +- resource/csdk/connectivity/inc/canfcadapter.h | 2 +- resource/csdk/connectivity/inc/caraadapter.h | 2 +- resource/csdk/connectivity/inc/catcpadapter.h | 15 +- resource/csdk/connectivity/inc/catcpinterface.h | 9 +- .../csdk/connectivity/inc/pkix/crypto_adapter.h | 8 +- resource/csdk/connectivity/lib/libcoap-4.1.1/pdu.c | 2 +- .../src/adapter_util/caadapternetdtls.c | 36 +- .../src/bt_edr_adapter/android/caedrclient.c | 1 + .../connectivity/src/bt_edr_adapter/caedradapter.c | 52 +- .../src/bt_edr_adapter/linux/SConscript | 9 - .../src/bt_edr_adapter/linux/caedradapter.c | 141 -- .../src/bt_edr_adapter/tizen/caedrnwmonitor.c | 50 +- .../src/bt_le_adapter/android/caleclient.c | 518 +++---- .../src/bt_le_adapter/android/caleclient.h | 73 +- .../src/bt_le_adapter/android/calenwmonitor.c | 7 +- .../src/bt_le_adapter/android/caleutils.c | 2 - .../src/bt_le_adapter/android/caleutils.h | 9 +- .../src/bt_le_adapter/arduino/cablenwmonitor.cpp | 2 +- .../connectivity/src/bt_le_adapter/caleadapter.c | 68 +- .../src/bt_le_adapter/linux/caleinterface.c | 3 +- .../src/bt_le_adapter/tizen/caleclient.c | 53 +- .../src/bt_le_adapter/tizen/caleclient.h | 18 - .../src/bt_le_adapter/tizen/calenwmonitor.c | 54 +- .../src/bt_le_adapter/tizen/caleserver.c | 236 ++-- .../src/bt_le_adapter/tizen/caleserver.h | 18 - .../src/bt_le_adapter/tizen/caleutil.c | 137 +- .../src/bt_le_adapter/tizen/caleutil.h | 50 +- .../csdk/connectivity/src/cablockwisetransfer.c | 288 ++-- .../csdk/connectivity/src/caconnectivitymanager.c | 5 +- .../csdk/connectivity/src/cainterfacecontroller.c | 49 +- resource/csdk/connectivity/src/camessagehandler.c | 13 - resource/csdk/connectivity/src/caprotocolmessage.c | 20 +- resource/csdk/connectivity/src/caqueueingthread.c | 45 +- .../src/ip_adapter/android/caipnwmonitor.c | 21 +- .../csdk/connectivity/src/ip_adapter/caipadapter.c | 19 +- .../csdk/connectivity/src/ip_adapter/caipserver.c | 103 +- .../src/ip_adapter/linux/caipnwmonitor.c | 254 +++- .../src/ip_adapter/tizen/caipnwmonitor.c | 137 +- .../connectivity/src/nfc_adapter/canfcadapter.c | 10 +- .../csdk/connectivity/src/ra_adapter/caraadapter.c | 40 +- .../connectivity/src/tcp_adapter/catcpadapter.c | 53 +- .../connectivity/src/tcp_adapter/catcpserver.c | 308 +++-- resource/csdk/connectivity/test/SConscript | 44 +- resource/csdk/connectivity/util/SConscript | 44 +- .../connectivity/util/inc/camanagerleinterface.h | 14 +- .../util/src/camanager/android/caleautoconnector.c | 22 +- .../util/src/camanager/android/caleautoconnector.h | 4 +- .../src/camanager/android/caleconnectionmanager.c | 34 +- .../src/camanager/arduino/caleconnectionmanager.c | 61 - .../src/camanager/linux/caleconnectionmanager.c | 61 - .../src/camanager/tizen/caleconnectionmanager.c | 144 -- .../csdk/connectivity/util/src/cautilinterface.c | 69 +- resource/csdk/logger/include/logger.h | 19 +- resource/csdk/logger/src/logger.c | 83 +- resource/csdk/security/SConscript | 14 +- .../csdk/security/include/internal/aclresource.h | 29 +- resource/csdk/security/include/internal/amsmgr.h | 8 +- .../csdk/security/include/internal/credresource.h | 3 +- .../csdk/security/include/internal/crlresource.h | 6 +- .../csdk/security/include/internal/directpairing.h | 5 +- .../csdk/security/include/internal/doxmresource.h | 3 +- .../csdk/security/include/internal/psinterface.h | 17 + .../csdk/security/include/internal/pstatresource.h | 2 +- .../security/include/internal/srmresourcestrings.h | 13 +- .../security/include/securevirtualresourcetypes.h | 59 +- resource/csdk/security/provisioning/SConscript | 5 +- .../provisioning/ck_manager/sample/Door_sample.cpp | 4 +- .../ck_manager/sample/oic_svr_db_door.dat | Bin 810 -> 1054 bytes .../ck_manager/sample/oic_svr_db_door.json | 62 +- .../ck_manager/sample/oic_svr_db_light.dat | Bin 810 -> 1054 bytes .../ck_manager/sample/oic_svr_db_light.json | 62 +- .../ck_manager/sample/oic_svr_db_pt.dat | Bin 677 -> 878 bytes .../ck_manager/sample/oic_svr_db_pt.json | 42 +- .../ck_manager/sample/provisioningclient.c | 192 ++- .../provisioning/ck_manager/unittest/SConscript | 48 +- .../ck_manager/unittest/ckm_info_test.cpp | 272 ++++ .../ck_manager/unittest/crl_generator_test.cpp | 98 ++ .../ck_manager/unittest/csr_generator_test.cpp | 110 ++ .../provisioning/ck_manager/unittest/pki_test.cpp | 64 +- .../ck_manager/unittest/test_data/CKMInfo.dat | Bin 742 -> 996 bytes .../ck_manager/unittest/test_data/CKMInfo.json | 50 +- .../include/internal/credentialgenerator.h | 4 + .../include/internal/provisioningdatabasemanager.h | 10 + .../include/internal/secureresourceprovider.h | 73 +- .../provisioning/include/ocprovisioningmanager.h | 43 +- .../csdk/security/provisioning/include/pmtypes.h | 3 +- .../csdk/security/provisioning/sample/SConscript | 10 +- .../provisioning/sample/oic_svr_db_client.dat | Bin 711 -> 1046 bytes .../provisioning/sample/oic_svr_db_client.json | 62 +- .../oic_svr_db_randompin_with_empty_deviceid.dat | Bin 958 -> 1261 bytes .../oic_svr_db_randompin_with_empty_deviceid.json | 66 +- .../sample/oic_svr_db_server_justworks.dat | Bin 957 -> 1260 bytes .../sample/oic_svr_db_server_justworks.json | 62 +- .../sample/oic_svr_db_server_randompin.dat | Bin 958 -> 1261 bytes .../sample/oic_svr_db_server_randompin.json | 66 +- .../provisioning/sample/provisioningclient.c | 465 ++++++- .../provisioning/src/credentialgenerator.c | 6 +- .../provisioning/src/ocprovisioningmanager.c | 264 +++- .../provisioning/src/ownershiptransfermanager.c | 208 +-- .../csdk/security/provisioning/src/oxmjustworks.c | 4 +- .../csdk/security/provisioning/src/oxmrandompin.c | 4 +- .../csdk/security/provisioning/src/pmutility.c | 56 +- .../provisioning/src/provisioningdatabasemanager.c | 12 +- .../provisioning/src/secureresourceprovider.c | 938 ++++++++++++- .../csdk/security/provisioning/unittest/SConscript | 72 +- .../unittest/credentialgeneratortest.cpp | 159 +++ .../unittest/ocprovisioningmanager.cpp | 61 + .../security/provisioning/unittest/otmunittest.cpp | 443 +++++- .../provisioning/unittest/sampleserver1.cpp | 583 ++++++++ .../provisioning/unittest/sampleserver2.cpp | 583 ++++++++ resource/csdk/security/src/aclresource.c | 1438 ++++++++++++++------ resource/csdk/security/src/amaclresource.c | 24 +- resource/csdk/security/src/amsmgr.c | 10 +- resource/csdk/security/src/credresource.c | 360 +++-- resource/csdk/security/src/crlresource.c | 24 +- resource/csdk/security/src/directpairing.c | 30 +- resource/csdk/security/src/doxmresource.c | 311 +++-- resource/csdk/security/src/dpairingresource.c | 92 +- resource/csdk/security/src/pconfresource.c | 41 +- resource/csdk/security/src/policyengine.c | 84 +- resource/csdk/security/src/psinterface.c | 307 ++++- resource/csdk/security/src/pstatresource.c | 405 ++++-- resource/csdk/security/src/srmresourcestrings.c | 38 +- resource/csdk/security/src/svcresource.c | 12 +- resource/csdk/security/src/verresource.c | 2 +- resource/csdk/security/tool/json2cbor.c | 199 ++- resource/csdk/security/unittest/SConscript | 48 +- .../csdk/security/unittest/aclresourcetest.cpp | 396 ++++-- .../csdk/security/unittest/credentialresource.cpp | 109 +- .../csdk/security/unittest/crlresourcetest.cpp | 113 ++ .../csdk/security/unittest/directpairingtest.cpp | 7 +- resource/csdk/security/unittest/doxmresource.cpp | 12 +- resource/csdk/security/unittest/oic_svr_db.dat | Bin 818 -> 1104 bytes resource/csdk/security/unittest/oic_svr_db.json | 46 +- .../csdk/security/unittest/oic_svr_db_prov.dat | Bin 0 -> 1311 bytes .../csdk/security/unittest/oic_svr_db_prov.json | 109 ++ resource/csdk/security/unittest/oic_unittest.dat | Bin 473 -> 573 bytes resource/csdk/security/unittest/oic_unittest.json | 20 +- .../csdk/security/unittest/oic_unittest_acl1.dat | 2 +- .../csdk/security/unittest/oic_unittest_acl1.json | 58 +- .../security/unittest/oic_unittest_default_acl.dat | 2 +- .../unittest/oic_unittest_default_acl.json | 40 +- resource/csdk/security/unittest/pstatresource.cpp | 14 +- .../csdk/stack/include/internal/ocserverrequest.h | 3 +- .../csdk/stack/include/internal/ocstackinternal.h | 12 +- .../csdk/stack/include/internal/oickeepalive.h | 8 +- resource/csdk/stack/include/ocpayload.h | 19 +- resource/csdk/stack/include/ocstack.h | 10 +- resource/csdk/stack/include/ocstackconfig.h | 2 +- resource/csdk/stack/include/octypes.h | 63 +- resource/csdk/stack/include/payload_logging.h | 21 +- resource/csdk/stack/include/rdpayload.h | 2 +- .../samples/linux/SimpleClientServer/SConscript | 13 +- .../samples/linux/SimpleClientServer/occlient.cpp | 6 +- .../linux/SimpleClientServer/occlientcoll.cpp | 2 +- .../samples/linux/SimpleClientServer/ocserver.cpp | 19 +- .../csdk/stack/samples/linux/secure/SConscript | 3 +- .../samples/linux/secure/occlientbasicops.cpp | 43 +- .../samples/linux/secure/occlientdirectpairing.cpp | 5 +- .../stack/samples/linux/secure/oic_amss_db.dat | Bin 941 -> 1284 bytes .../stack/samples/linux/secure/oic_amss_db.json | 42 +- .../samples/linux/secure/oic_svr_db_client.dat | Bin 941 -> 1284 bytes .../samples/linux/secure/oic_svr_db_client.json | 210 ++- .../linux/secure/oic_svr_db_client_devowner.dat | Bin 0 -> 1284 bytes .../linux/secure/oic_svr_db_client_devowner.json | 102 ++ .../secure/oic_svr_db_client_directpairing.dat | Bin 778 -> 996 bytes .../secure/oic_svr_db_client_directpairing.json | 182 ++- .../linux/secure/oic_svr_db_client_nondevowner.dat | Bin 0 -> 1284 bytes .../secure/oic_svr_db_client_nondevowner.json | 102 ++ .../samples/linux/secure/oic_svr_db_server.dat | Bin 1764 -> 1941 bytes .../samples/linux/secure/oic_svr_db_server.json | 76 +- .../linux/secure/oic_svr_db_server_justworks.dat | Bin 431 -> 1260 bytes .../linux/secure/oic_svr_db_server_justworks.json | 112 ++ .../samples/tizen/SimpleClientServer/occlient.cpp | 81 +- .../samples/tizen/SimpleClientServer/ocrouting.cpp | 45 +- .../samples/tizen/SimpleClientServer/ocserver.cpp | 67 +- .../packaging/com.oic.ri.sample.spec | 7 +- .../samples/tizen/build/packaging/com.oic.ri.spec | 8 +- resource/csdk/stack/src/occlientcb.c | 4 +- resource/csdk/stack/src/ocobserve.c | 9 +- resource/csdk/stack/src/ocpayload.c | 121 +- resource/csdk/stack/src/ocpayloadconvert.c | 59 +- resource/csdk/stack/src/ocpayloadparse.c | 36 +- resource/csdk/stack/src/ocresource.c | 184 ++- resource/csdk/stack/src/ocserverrequest.c | 91 +- resource/csdk/stack/src/ocstack.c | 79 +- resource/csdk/stack/src/oickeepalive.c | 40 +- resource/csdk/stack/src/rdpayload.c | 127 +- resource/csdk/stack/test/SConscript | 37 +- resource/csdk/stack/test/linux/occlient.c | 2 +- resource/csdk/stack/test/stacktests.cpp | 15 +- resource/examples/SConscript | 16 +- resource/examples/devicediscoveryserver.cpp | 19 +- resource/examples/directpairingclient.cpp | 411 ++++++ resource/examples/fridgeserver.cpp | 3 + resource/examples/garageclient.cpp | 2 +- resource/examples/oic_svr_db_client.dat | Bin 915 -> 1222 bytes resource/examples/oic_svr_db_client.json | 38 +- .../examples/oic_svr_db_client_directpairing.dat | Bin 0 -> 996 bytes .../examples/oic_svr_db_client_directpairing.json | 82 ++ resource/examples/oic_svr_db_server.dat | Bin 981 -> 1313 bytes resource/examples/oic_svr_db_server.json | 42 +- resource/examples/simpleclient.cpp | 22 +- resource/examples/simpleclientHQ.cpp | 4 +- resource/examples/simpleclientserver.cpp | 2 +- resource/include/IClientWrapper.h | 9 +- resource/include/InProcClientWrapper.h | 18 + resource/include/OCApi.h | 8 + resource/include/OCDirectPairing.h | 69 + resource/include/OCHeaderOption.h | 14 +- resource/include/OCPlatform.h | 120 +- resource/include/OCPlatform_impl.h | 10 + resource/include/OCProvisioningManager.h | 25 + resource/include/OCRepresentation.h | 5 + resource/include/OCResourceRequest.h | 14 + resource/include/OCSerialization.h | 17 + resource/include/OutOfProcClientWrapper.h | 12 + resource/include/StringConstants.h | 4 +- resource/provisioning/examples/SConscript | 1 + .../provisioning/examples/oic_svr_db_client.dat | Bin 711 -> 993 bytes .../provisioning/examples/oic_svr_db_client.json | 40 +- .../provisioning/examples/provisioningclient.cpp | 413 +++++- .../provisioning/src/OCProvisioningManager.cpp | 124 +- .../provisioning/unittests/OCProvisioningTest.cpp | 19 + resource/provisioning/unittests/SConscript | 41 +- resource/src/InProcClientWrapper.cpp | 224 ++- resource/src/InProcServerWrapper.cpp | 1 + resource/src/OCDirectPairing.cpp | 85 ++ resource/src/OCPlatform.cpp | 158 ++- resource/src/OCPlatform_impl.cpp | 26 + resource/src/OCRepresentation.cpp | 24 +- resource/src/OCResource.cpp | 2 +- resource/src/SConscript | 4 +- resource/unit_tests.scons | 4 +- resource/unittests/OCHeaderOptionTest.cpp | 12 +- resource/unittests/OCPlatformTest.cpp | 58 +- .../unittests/OCRepresentationEncodingTest.cpp | 61 +- resource/unittests/OCResourceResponseTest.cpp | 6 + resource/unittests/SConscript | 29 +- service/easy-setup/enrollee/unittests/SConscript | 25 +- service/easy-setup/mediator/csdk/SConscript | 15 +- .../easy-setup/mediator/csdk/src/provisioning.cpp | 2 +- .../mediator/csdk/src/provisioningapi.cpp | 2 +- .../mediator/csdk/src/wifiprovisioning.cpp | 2 +- .../easy-setup/mediator/csdk/unittests/SConscript | 63 +- service/easy-setup/mediator/richsdk/SConscript | 14 +- .../mediator/richsdk/unittests/SConscript | 59 +- .../packaging/com.oic.es.sample.spec | 7 +- .../app/src/main/assets/oic_svr_db_client.dat | Bin 709 -> 1052 bytes .../app/src/main/assets/oic_svr_db_client.json | 176 +-- .../mediator/linux/richsdk_sample/SConscript | 9 +- service/resource-container/SConscript | 17 +- .../examples/BMISensorBundle/src/BMISensor.cpp | 5 +- .../src/inputSensors/HeightSensorApp/SConscript | 8 +- .../src/inputSensors/WeightSensorApp/SConscript | 10 +- .../src/inputSensors/THSensorApp/SConscript | 8 +- .../src/inputSensors/THSensorApp1/SConscript | 8 +- .../resource-container/src/BundleInfoInternal.cpp | 2 +- service/resource-container/unittests/SConscript | 59 +- service/resource-directory/SConscript | 3 +- .../examples/linux/SConscript | 10 +- .../linux/secureResourceExample/SConscript | 10 +- .../secureResourceExample/oic_svr_db_client.dat | Bin 907 -> 1222 bytes .../secureResourceExample/oic_svr_db_client.json | 38 +- .../secureResourceExample/oic_svr_db_server.dat | Bin 1031 -> 1421 bytes .../secureResourceExample/oic_svr_db_server.json | 50 +- .../resource-encapsulation/src/common/SConscript | 37 +- .../src/resourceBroker/unittest/SConscript | 58 +- .../src/resourceCache/unittests/SConscript | 43 +- .../src/serverBuilder/SConscript | 53 +- .../resource-encapsulation/unittests/SConscript | 59 +- .../resource-hosting/SampleApp/linux/SConscript | 16 +- service/resource-hosting/unittest/SConscript | 53 +- service/scene-manager/SConscript | 12 +- service/scene-manager/sampleapp/linux/SConscript | 10 +- service/scene-manager/unittests/SConscript | 71 +- service/scene-manager/unittests/SceneTest.cpp | 12 +- .../simulator/examples/client/simulator_client.cpp | 2 +- .../serviceprovider/manager/ResourceManager.java | 15 +- .../simulator/serviceprovider/utils/Utility.java | 1 - .../serviceprovider/view/MetaPropertiesView.java | 10 +- .../dialogs/UpdateResourceInterfaceDialog.java | 25 +- .../simulator/src/server/oc_interface_details.cpp | 2 +- .../src/server/simulator_single_resource_impl.cpp | 20 +- .../sampleapp/linux/configuration/SConscript | 12 +- service/things-manager/unittests/SConscript | 74 +- tools/tizen/iotivity.spec | 11 +- 399 files changed, 18402 insertions(+), 6269 deletions(-) create mode 100644 android/android_api/base/jni/JniOcDirectPairDevice.cpp create mode 100644 android/android_api/base/jni/JniOcDirectPairDevice.h create mode 100644 android/android_api/base/jni/JniOnDPDevicesFoundListener.cpp create mode 100644 android/android_api/base/jni/JniOnDPDevicesFoundListener.h create mode 100644 android/android_api/base/jni/JniOnDirectPairingListener.cpp create mode 100644 android/android_api/base/jni/JniOnDirectPairingListener.h create mode 100644 android/android_api/base/src/main/java/org/iotivity/base/OcDirectPairDevice.java create mode 100755 android/android_api/base/src/main/java/org/iotivity/base/OcPrmType.java create mode 100644 android/android_api/base/src/main/java/org/iotivity/base/OicSecAce.java create mode 100644 android/android_api/base/src/main/java/org/iotivity/base/OicSecPdAcl.java create mode 100644 android/android_api/base/src/main/java/org/iotivity/base/OicSecResr.java create mode 100644 android/android_api/base/src/main/java/org/iotivity/base/OicSecValidity.java create mode 100644 android/examples/DirectPairing/.classpath create mode 100644 android/examples/DirectPairing/.project create mode 100644 android/examples/DirectPairing/DirectPairing.iml create mode 100644 android/examples/DirectPairing/build.gradle create mode 100644 android/examples/DirectPairing/project.properties create mode 100644 android/examples/DirectPairing/src/main/AndroidManifest.xml create mode 100644 android/examples/DirectPairing/src/main/assets/oic_svr_db_client_directpairing.dat create mode 100644 android/examples/DirectPairing/src/main/java/org/iotivity/base/examples/DirectPairing/ExpandableListAdapter.java create mode 100644 android/examples/DirectPairing/src/main/java/org/iotivity/base/examples/DirectPairing/Led.java create mode 100644 android/examples/DirectPairing/src/main/java/org/iotivity/base/examples/DirectPairing/MainActivity.java create mode 100644 android/examples/DirectPairing/src/main/java/org/iotivity/base/examples/DirectPairing/StringConstants.java create mode 100644 android/examples/DirectPairing/src/main/res/drawable-hdpi/arrow_down.png create mode 100644 android/examples/DirectPairing/src/main/res/drawable-hdpi/arrow_right.png create mode 100644 android/examples/DirectPairing/src/main/res/drawable-hdpi/ic_launcher.png create mode 100644 android/examples/DirectPairing/src/main/res/drawable-mdpi/ic_launcher.png create mode 100644 android/examples/DirectPairing/src/main/res/drawable-xhdpi/ic_launcher.png create mode 100644 android/examples/DirectPairing/src/main/res/drawable-xxhdpi/ic_launcher.png create mode 100644 android/examples/DirectPairing/src/main/res/layout/activity_main.xml create mode 100644 android/examples/DirectPairing/src/main/res/layout/custom_list_view.xml create mode 100644 android/examples/DirectPairing/src/main/res/layout/group_indicator.xml create mode 100644 android/examples/DirectPairing/src/main/res/layout/list_group.xml create mode 100644 android/examples/DirectPairing/src/main/res/layout/list_item.xml create mode 100644 android/examples/DirectPairing/src/main/res/menu/main.xml create mode 100644 android/examples/DirectPairing/src/main/res/values-v11/styles.xml create mode 100644 android/examples/DirectPairing/src/main/res/values-v14/styles.xml create mode 100644 android/examples/DirectPairing/src/main/res/values-w820dp/dimens.xml create mode 100644 android/examples/DirectPairing/src/main/res/values/dimens.xml create mode 100644 android/examples/DirectPairing/src/main/res/values/strings.xml create mode 100644 android/examples/DirectPairing/src/main/res/values/styles.xml delete mode 100644 resource/csdk/connectivity/src/bt_edr_adapter/linux/SConscript delete mode 100644 resource/csdk/connectivity/src/bt_edr_adapter/linux/caedradapter.c delete mode 100644 resource/csdk/connectivity/util/src/camanager/arduino/caleconnectionmanager.c delete mode 100644 resource/csdk/connectivity/util/src/camanager/linux/caleconnectionmanager.c delete mode 100644 resource/csdk/connectivity/util/src/camanager/tizen/caleconnectionmanager.c mode change 100644 => 100755 resource/csdk/security/SConscript mode change 100644 => 100755 resource/csdk/security/include/internal/doxmresource.h mode change 100644 => 100755 resource/csdk/security/provisioning/SConscript mode change 100755 => 100644 resource/csdk/security/provisioning/ck_manager/sample/oic_svr_db_door.dat mode change 100755 => 100644 resource/csdk/security/provisioning/ck_manager/sample/oic_svr_db_door.json mode change 100755 => 100644 resource/csdk/security/provisioning/ck_manager/sample/oic_svr_db_light.dat mode change 100755 => 100644 resource/csdk/security/provisioning/ck_manager/sample/oic_svr_db_light.json mode change 100755 => 100644 resource/csdk/security/provisioning/ck_manager/sample/oic_svr_db_pt.dat mode change 100755 => 100644 resource/csdk/security/provisioning/ck_manager/sample/oic_svr_db_pt.json create mode 100644 resource/csdk/security/provisioning/ck_manager/unittest/ckm_info_test.cpp create mode 100644 resource/csdk/security/provisioning/ck_manager/unittest/crl_generator_test.cpp create mode 100644 resource/csdk/security/provisioning/ck_manager/unittest/csr_generator_test.cpp create mode 100644 resource/csdk/security/provisioning/unittest/credentialgeneratortest.cpp create mode 100644 resource/csdk/security/provisioning/unittest/sampleserver1.cpp create mode 100644 resource/csdk/security/provisioning/unittest/sampleserver2.cpp create mode 100644 resource/csdk/security/unittest/crlresourcetest.cpp create mode 100644 resource/csdk/security/unittest/oic_svr_db_prov.dat create mode 100644 resource/csdk/security/unittest/oic_svr_db_prov.json create mode 100644 resource/csdk/stack/samples/linux/secure/oic_svr_db_client_devowner.dat create mode 100644 resource/csdk/stack/samples/linux/secure/oic_svr_db_client_devowner.json create mode 100644 resource/csdk/stack/samples/linux/secure/oic_svr_db_client_nondevowner.dat create mode 100644 resource/csdk/stack/samples/linux/secure/oic_svr_db_client_nondevowner.json create mode 100644 resource/csdk/stack/samples/linux/secure/oic_svr_db_server_justworks.json create mode 100644 resource/examples/directpairingclient.cpp create mode 100644 resource/examples/oic_svr_db_client_directpairing.dat create mode 100644 resource/examples/oic_svr_db_client_directpairing.json create mode 100644 resource/include/OCDirectPairing.h create mode 100644 resource/src/OCDirectPairing.cpp diff --git a/android/android_api/base/build.gradle b/android/android_api/base/build.gradle index 7deb01c..a0b52ae 100755 --- a/android/android_api/base/build.gradle +++ b/android/android_api/base/build.gradle @@ -41,7 +41,7 @@ android { minSdkVersion 21 targetSdkVersion 21 versionCode 1 - versionName "1.1" + versionName "1.1.1" buildConfigField 'int', 'SECURED', SECURED } buildTypes { diff --git a/android/android_api/base/jni/Android.mk b/android/android_api/base/jni/Android.mk index cc43275..51d9dcd 100644 --- a/android/android_api/base/jni/Android.mk +++ b/android/android_api/base/jni/Android.mk @@ -58,7 +58,7 @@ LOCAL_SRC_FILES := JniOcStack.cpp \ JniEntityHandler.cpp \ JniOnResourceFoundListener.cpp \ JniOnDeviceInfoListener.cpp \ - JniOnPlatformInfoListener.cpp \ + JniOnPlatformInfoListener.cpp \ JniOnPresenceListener.cpp \ JniOnGetListener.cpp \ JniOnPutListener.cpp \ @@ -74,15 +74,18 @@ LOCAL_SRC_FILES := JniOcStack.cpp \ JniOcPlatform.cpp \ JniOcResource.cpp \ JniOcResourceIdentifier.cpp \ - JniOcSecurity.cpp + JniOcSecurity.cpp \ + JniOnDPDevicesFoundListener.cpp \ + JniOnDirectPairingListener.cpp \ + JniOcDirectPairDevice.cpp ifeq ($(SECURED), 1) -LOCAL_SRC_FILES += JniOcSecureResource.cpp \ - JniOcProvisioning.cpp \ - JniSecureUtils.cpp \ - JniProvisionResultListner.cpp \ - JniPinCheckListener.cpp \ - JniDisplayPinListener.cpp -endif + LOCAL_SRC_FILES += JniOcSecureResource.cpp \ + JniOcProvisioning.cpp \ + JniSecureUtils.cpp \ + JniProvisionResultListner.cpp \ + JniPinCheckListener.cpp \ + JniDisplayPinListener.cpp + endif LOCAL_LDLIBS := -llog LOCAL_STATIC_LIBRARIES := android-oc @@ -112,6 +115,7 @@ LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/csdk/security/provisioning/include LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/csdk/security/provisioning/include/oxm/ LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/csdk/security/provisioning/include/internal LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/csdk/security/include +LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/csdk/security/include/internal LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/csdk/connectivity/api LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/csdk/connectivity/lib/libcoap-4.1.1 include $(BUILD_SHARED_LIBRARY) diff --git a/android/android_api/base/jni/JniOcDirectPairDevice.cpp b/android/android_api/base/jni/JniOcDirectPairDevice.cpp new file mode 100644 index 0000000..535bebc --- /dev/null +++ b/android/android_api/base/jni/JniOcDirectPairDevice.cpp @@ -0,0 +1,132 @@ +/* +* //****************************************************************** +* // +* // Copyright 2016 Samsung Electronics All Rights Reserved. +* // +* //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +* // +* // Licensed under the Apache License, Version 2.0 (the "License"); +* // you may not use this file except in compliance with the License. +* // You may obtain a copy of the License at +* // +* // http://www.apache.org/licenses/LICENSE-2.0 +* // +* // Unless required by applicable law or agreed to in writing, software +* // distributed under the License is distributed on an "AS IS" BASIS, +* // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* // See the License for the specific language governing permissions and +* // limitations under the License. +* // +* //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +*/ + +#include "JniOcDirectPairDevice.h" +#include "OCDirectPairing.h" +#include "OCDirectPairing.h" +using namespace OC; +namespace PH = std::placeholders; + +JniOcDirectPairDevice::JniOcDirectPairDevice(std::shared_ptr directPairingDevice) + : m_sharedDirectPairDevice(directPairingDevice) +{} + +JniOcDirectPairDevice::~JniOcDirectPairDevice() +{ + LOGD("~JniOcDirectPairDevice()"); + m_sharedDirectPairDevice = nullptr; +} + +std::string JniOcDirectPairDevice::getHost() +{ + return m_sharedDirectPairDevice->getHost(); +} + +std::vector JniOcDirectPairDevice::getPairingMethods() +{ + + return m_sharedDirectPairDevice->getPairingMethods(); +} + +OCConnectivityType JniOcDirectPairDevice::connectivityType() +{ + return m_sharedDirectPairDevice->getConnType(); +} + +JniOcDirectPairDevice* JniOcDirectPairDevice::getJniOcDirectPairDevicePtr(JNIEnv *env, jobject thiz) +{ + JniOcDirectPairDevice *dpDev = GetHandle(env, thiz); + if (env->ExceptionCheck()) + { + LOGE("Failed to get native handle from OcDirectPairingDevice"); + } + if (!dpDev) + { + ThrowOcException(JNI_NO_NATIVE_POINTER, ""); + } + return dpDev; +} +std::shared_ptr JniOcDirectPairDevice::getPtr() +{ + return m_sharedDirectPairDevice; +} + +JNIEXPORT jstring JNICALL Java_org_iotivity_base_OcDirectPairDevice_getHost +(JNIEnv *env, jobject thiz) +{ + + LOGD("OcDirectPairing_getHost"); + + JniOcDirectPairDevice* device = JniOcDirectPairDevice::getJniOcDirectPairDevicePtr(env,thiz); + if (!device) return nullptr; + + std::string dev = device->getHost(); + return env->NewStringUTF(dev.c_str()); +} + +JNIEXPORT jintArray JNICALL Java_org_iotivity_base_OcDirectPairDevice_getPairingMethods + (JNIEnv *env, jobject thiz) +{ + + LOGD("OcDirectPairing_getPairingMethods"); + + std::vector pairingMethodList; + JniOcDirectPairDevice* device = JniOcDirectPairDevice::getJniOcDirectPairDevicePtr(env,thiz); + if (!device) return nullptr; + + std::vector pairingMethods = device->getPairingMethods(); + return JniOcDirectPairDevice::JconvertIntVectorToJavaList(env,pairingMethods); +} + + +jintArray JniOcDirectPairDevice::JconvertIntVectorToJavaList(JNIEnv *env, std::vector &vector) +{ + + jsize len = static_cast(vector.size()); + + jintArray intArray = env->NewIntArray(len); + if (!intArray) return nullptr; + + env->SetIntArrayRegion(intArray, (jsize)0, len, (const jint*)&vector[0]); + + if (env->ExceptionCheck()) + { + LOGE("ArrayIndexOutOfBoundsException in JconvertIntVectorToJavaList"); + } + return intArray; +} + +/* +* Class: org_iotivity_base_OcDirectPairDevice +* Method: getConnectivityTypeN +* Signature: ()I +*/ +JNIEXPORT jint JNICALL Java_org_iotivity_base_OcDirectPairDevice_getConnectivityTypeN +(JNIEnv *env, jobject thiz) +{ + LOGD("OcDirectPairDevice_getConnectivityType"); + JniOcDirectPairDevice* device = JniOcDirectPairDevice::getJniOcDirectPairDevicePtr(env,thiz); + if (!device) return -1; + + OCConnectivityType connectivityType = device->connectivityType(); + return static_cast(connectivityType); +} diff --git a/android/android_api/base/jni/JniOcDirectPairDevice.h b/android/android_api/base/jni/JniOcDirectPairDevice.h new file mode 100644 index 0000000..505bac2 --- /dev/null +++ b/android/android_api/base/jni/JniOcDirectPairDevice.h @@ -0,0 +1,101 @@ +/* +* //****************************************************************** +* // +* // Copyright 2016 Samsung Electronics All Rights Reserved. +* // +* //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +* // +* // Licensed under the Apache License, Version 2.0 (the "License"); +* // you may not use this file except in compliance with the License. +* // You may obtain a copy of the License at +* // +* // http://www.apache.org/licenses/LICENSE-2.0 +* // +* // Unless required by applicable law or agreed to in writing, software +* // distributed under the License is distributed on an "AS IS" BASIS, +* // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* // See the License for the specific language governing permissions and +* // limitations under the License. +* // +* //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +*/ + +#include "JniOcStack.h" +#include "JniOnDPDevicesFoundListener.h" +#include "OCDirectPairing.h" +#include + +#ifndef _Included_org_iotivity_base_OcDirectPairDevice +#define _Included_org_iotivity_base_OcDirectPairDevice + +using namespace OC; + +class JniOcDirectPairDevice +{ + public: + JniOcDirectPairDevice(std::shared_ptr directPairingDevice); + ~JniOcDirectPairDevice(); + + static JniOcDirectPairDevice* getJniOcDirectPairDevicePtr(JNIEnv *env, jobject thiz); + static jintArray JconvertIntVectorToJavaList(JNIEnv *env, std::vector &vector); + + std::shared_ptr getPtr(); + std::string getHost(); + std::vector getPairingMethods(); + OCConnectivityType connectivityType(); + + private: + std::shared_ptr m_sharedDirectPairDevice; +}; + +/* DO NOT EDIT THIS FILE BEYOND THIS LINE - it is machine generated */ + +#ifdef __cplusplus +extern "C" { +#endif + /* + * Class: org_iotivity_base_OcDirectPairDevice + * Method: getDirectPairedDevices + * Signature: (Lorg/iotivity/base/OcDirectPairDevice/GetDirectPairedListener;)V + */ + JNIEXPORT void JNICALL Java_org_iotivity_base_OcDirectPairDevice_getDirectPairedDevices + (JNIEnv *, jobject, jobject); + + /* + * Class: org_iotivity_base_OcDirectPairDevice + * Method: getHost + * Signature: ()Ljava/lang/String; + */ + JNIEXPORT jstring JNICALL Java_org_iotivity_base_OcDirectPairDevice_getHost + (JNIEnv *, jobject); + + /* + * Class: org_iotivity_base_OcDirectPairDevice + * Method: getPairingMethods + * Signature: ()Ljava/util/List; + */ + JNIEXPORT jintArray JNICALL Java_org_iotivity_base_OcDirectPairDevice_getPairingMethods + (JNIEnv *, jobject); + + /* + * Class: org_iotivity_base_OcDirectPairDevice + * Method: doDirectPairing + * Signature: (Lorg/iotivity/base/OcDirectPairDevice;Lorg/iotivity/base/OcPrmType; + * Ljava/lang/String;Lorg/iotivity/base/OcDirectPairDevice/DirectPairingListener;)V + */ + JNIEXPORT void JNICALL Java_org_iotivity_base_OcDirectPairDevice_doDirectPairing + (JNIEnv *, jobject, jobject, jint, jstring, jobject); + + /* + * Class: org_iotivity_base_OcDirectPairDevice + * Method: getConnectivityTypeN + * Signature: ()I + */ + JNIEXPORT jint JNICALL Java_org_iotivity_base_OcDirectPairDevice_getConnectivityTypeN + (JNIEnv *env, jobject thiz); + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/android/android_api/base/jni/JniOcPlatform.cpp b/android/android_api/base/jni/JniOcPlatform.cpp index 93029c9..82f693f 100644 --- a/android/android_api/base/jni/JniOcPlatform.cpp +++ b/android/android_api/base/jni/JniOcPlatform.cpp @@ -25,7 +25,9 @@ #include "JniOcPresenceHandle.h" #include "JniOcResourceResponse.h" #include "JniOcSecurity.h" +#include "JniOcDirectPairDevice.h" #include "JniUtils.h" +#include "ocpayload.h" using namespace OC; @@ -320,6 +322,148 @@ void RemoveOnPresenceListener(JNIEnv* env, jobject jListener) presenceMapLock.unlock(); } +JniOnDPDevicesFoundListener* AddOnDPDevicesFoundListener(JNIEnv* env, jobject jListener) +{ + JniOnDPDevicesFoundListener *onDPDeviceListener = nullptr; + + dpDevicesFoundListenerMapLock.lock(); + + for (auto it = onDPDevicesFoundListenerMap.begin(); it != + onDPDevicesFoundListenerMap.end(); ++it) + { + if (env->IsSameObject(jListener, it->first)) + { + auto refPair = it->second; + onDPDeviceListener = refPair.first; + refPair.second++; + it->second = refPair; + onDPDevicesFoundListenerMap.insert(*it); + LOGD("onDPDeviceListener: ref. count incremented"); + break; + } + } + if (!onDPDeviceListener) + { + onDPDeviceListener = new JniOnDPDevicesFoundListener(env, jListener, + RemoveOnDPDevicesFoundListener); + jobject jgListener = env->NewGlobalRef(jListener); + onDPDevicesFoundListenerMap.insert( + std::pair>( + jgListener, + std::pair(onDPDeviceListener, 1))); + LOGI("onDPDeviceListener: new listener"); + } + dpDevicesFoundListenerMapLock.unlock(); + return onDPDeviceListener; +} + +void RemoveOnDPDevicesFoundListener(JNIEnv* env, jobject jListener) +{ + dpDevicesFoundListenerMapLock.lock(); + bool isFound = false; + for (auto it = onDPDevicesFoundListenerMap.begin(); it != + onDPDevicesFoundListenerMap.end(); ++it) + { + if (env->IsSameObject(jListener, it->first)) + { + auto refPair = it->second; + if (refPair.second > 1) + { + refPair.second--; + it->second = refPair; + onDPDevicesFoundListenerMap.insert(*it); + LOGI("onDPDeviceListener: ref. count decremented"); + } + else + { + env->DeleteGlobalRef(it->first); + JniOnDPDevicesFoundListener* listener = refPair.first; + delete listener; + onDPDevicesFoundListenerMap.erase(it); + LOGI("onDPDeviceListener is removed"); + } + isFound = true; + break; + } + } + if (!isFound) + { + ThrowOcException(JNI_EXCEPTION, "onDPDeviceListener not found"); + } + dpDevicesFoundListenerMapLock.unlock(); +} + +JniOnDirectPairingListener* AddOnDirectPairingListener(JNIEnv* env, jobject jListener) +{ + JniOnDirectPairingListener *onDirectPairingListener = nullptr; + + directPairingListenerMapLock.lock(); + + for (auto it = directPairingListenerMap.begin(); it != + directPairingListenerMap.end(); ++it) + { + if (env->IsSameObject(jListener, it->first)) + { + auto refPair = it->second; + onDirectPairingListener = refPair.first; + refPair.second++; + it->second = refPair; + directPairingListenerMap.insert(*it); + LOGD("onDirectPairingListener: ref. count incremented"); + break; + } + } + if (!onDirectPairingListener) + { + onDirectPairingListener = new JniOnDirectPairingListener(env, jListener, + RemoveOnDirectPairingListener); + jobject jgListener = env->NewGlobalRef(jListener); + directPairingListenerMap.insert( + std::pair>( + jgListener, + std::pair(onDirectPairingListener, 1))); + LOGI("onDirectPairingListener: new listener"); + } + directPairingListenerMapLock.unlock(); + return onDirectPairingListener; +} + +void RemoveOnDirectPairingListener(JNIEnv* env, jobject jListener) +{ + directPairingListenerMapLock.lock(); + bool isFound = false; + for (auto it = directPairingListenerMap.begin(); it != + directPairingListenerMap.end(); ++it) + { + if (env->IsSameObject(jListener, it->first)) + { + auto refPair = it->second; + if (refPair.second > 1) + { + refPair.second--; + it->second = refPair; + directPairingListenerMap.insert(*it); + LOGI("onDirectPairingListener: ref. count decremented"); + } + else + { + env->DeleteGlobalRef(it->first); + JniOnDirectPairingListener* listener = refPair.first; + delete listener; + directPairingListenerMap.erase(it); + LOGI("onDirectPairingListener is removed"); + } + isFound = true; + break; + } + } + if (!isFound) + { + ThrowOcException(JNI_EXCEPTION, "onDirectPairingListener not found"); + } + directPairingListenerMapLock.unlock(); +} + /* * Class: org_iotivity_base_OcPlatform * Method: configure @@ -703,6 +847,145 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findResource1( } /* + * Class: org_iotivity_base_OcPlatform + * Method: findDirectPairingDevices + * Signature: (ILorg/iotivity/base/OcPlatform/FindDirectPairingListener;)V + */ +JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findDirectPairingDevices + (JNIEnv * env, jclass clazz, jint jTimeout, jobject jListener) +{ + LOGD("OcPlatform_findDirectPairingDevices"); + + if (!jListener) + { + ThrowOcException(OC_STACK_INVALID_PARAM, "onDPDevicesFoundListener cannot be null"); + return; + } + JniOnDPDevicesFoundListener *onDPDevsFoundListener = AddOnDPDevicesFoundListener(env, + jListener); + + GetDirectPairedCallback getDirectPairedCallback = + [onDPDevsFoundListener](PairedDevices pairingDevList) + { + onDPDevsFoundListener->directPairingDevicesCallback(pairingDevList, + DPFunc::FIND_DIRECT_PAIRED_DEV_LIST); + }; + + try + { + OCStackResult result = OCPlatform::findDirectPairingDevices(jTimeout, + getDirectPairedCallback); + if (OC_STACK_OK != result) + { + ThrowOcException(result, "OCPlatform::findDirectPairingDevices has failed"); + return; + } + } + catch (OCException& e) + { + LOGE("%s", e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); + } +} + +/* + * Class: org_iotivity_base_OcPlatform + * Method: getDirectPairedDevices + * Signature: (Lorg/iotivity/base/OcDirectPairDevice/GetDirectPairedListener;)V + */ +JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getDirectPairedDevices +(JNIEnv *env, jclass jclazz, jobject jListener) +{ + LOGD("OcPlatform_getDirectPairedDevices"); + + if (!jListener) + { + ThrowOcException(OC_STACK_INVALID_PARAM, "getPairedDevList Callback cannot be null"); + return; + } + JniOnDPDevicesFoundListener *onGetPairedDevicesListener = AddOnDPDevicesFoundListener(env, + jListener); + + GetDirectPairedCallback getDirectPairedCallback = + [onGetPairedDevicesListener](PairedDevices pairedDevList) + { + onGetPairedDevicesListener->directPairingDevicesCallback(pairedDevList, + DPFunc::GET_PAIRED_DEV_LIST); + }; + + try + { + OCStackResult result = OCPlatform::getDirectPairedDevices(getDirectPairedCallback); + if (OC_STACK_OK != result) + { + ThrowOcException(result, "OcDirectPairDevice_getDirectPairedDevices"); + return; + } + } + catch (OCException& e) + { + LOGE("%s", e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); + } +} + +/* + * Class: org_iotivity_base_OcPlatform + * Method: doDirectPairing + * Signature: (Lorg/iotivity/base/OcDirectPairDevice;Lorg/iotivity/base/OcPrmType; + * Ljava/lang/String;Lorg/iotivity/base/OcDirectPairDevice/DirectPairingListener;)V + */ +JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_doDirectPairing0 +(JNIEnv *env, jclass clazz, jobject jpeer, jint jprmType, jstring jpin, jobject jListener) +{ + LOGD("OcPlatform_doDirectPairing"); + + if (!jListener) + { + ThrowOcException(OC_STACK_INVALID_PARAM, "doDirectPairing Callback cannot be null"); + return; + } + if (!jpeer) + { + ThrowOcException(OC_STACK_INVALID_PARAM, "Peer cannot be null"); + return; + } + + JniOnDirectPairingListener *onDirectPairingListener = AddOnDirectPairingListener(env, + jListener); + + DirectPairingCallback DirectPairingCB = + [onDirectPairingListener](std::shared_ptr dpDev, OCStackResult result) + { + onDirectPairingListener->doDirectPairingCB(dpDev, result); + }; + + JniOcDirectPairDevice *dev = JniOcDirectPairDevice::getJniOcDirectPairDevicePtr(env, jpeer); + + if (!dev) + { + return ; + } + std::string pin = env->GetStringUTFChars(jpin, 0); + + try + { + OCStackResult result = OCPlatform::doDirectPairing(dev->getPtr(), (OCPrm_t)jprmType, + pin, DirectPairingCB); + if (OC_STACK_OK != result) + { + ThrowOcException(result, "OcPlatform_oDirectPairing"); + return; + } + } + catch (OCException& e) + { + LOGE("%s", e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); + } +} + +/* * Class: org_iotivity_base_OcPlatform * Method: getDeviceInfo0 * Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnDeviceFoundListener;)V @@ -1070,20 +1353,44 @@ jobject jListener, jint jResourceProperty) JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_registerDeviceInfo0( JNIEnv *env, jclass clazz, - jstring jDeviceName) + jstring jDeviceName, + jobjectArray jDeviceTypes) { LOGI("OcPlatform_registerDeviceInfo"); - std::string deviceName; - if (jDeviceName) + if (!jDeviceName) + { + ThrowOcException(OC_STACK_INVALID_PARAM, "deviceName cannot be null"); + return; + } + + if (!jDeviceTypes) { - deviceName = env->GetStringUTFChars(jDeviceName, nullptr); + ThrowOcException(OC_STACK_INVALID_PARAM, "deviceTypes cannot be null"); + return; } OCDeviceInfo deviceInfo; try { - DuplicateString(&deviceInfo.deviceName, deviceName); + DuplicateString(&deviceInfo.deviceName, env->GetStringUTFChars(jDeviceName, nullptr)); + deviceInfo.types = NULL; + + jsize len = env->GetArrayLength(jDeviceTypes); + for (jsize i = 0; i < len; ++i) + { + jstring jStr = (jstring)env->GetObjectArrayElement(jDeviceTypes, i); + if (!jStr) + { + ThrowOcException(OC_STACK_INVALID_PARAM, "device type cannot be null"); + return; + } + + OCResourcePayloadAddStringLL(&deviceInfo.types, env->GetStringUTFChars(jStr, nullptr)); + if (env->ExceptionCheck()) return; + + env->DeleteLocalRef(jStr); + } } catch (std::exception &e) { diff --git a/android/android_api/base/jni/JniOcPlatform.h b/android/android_api/base/jni/JniOcPlatform.h index cfd6853..a45f059 100644 --- a/android/android_api/base/jni/JniOcPlatform.h +++ b/android/android_api/base/jni/JniOcPlatform.h @@ -23,6 +23,8 @@ #include "JniOnResourceFoundListener.h" #include "JniOnDeviceInfoListener.h" #include "JniOnPlatformInfoListener.h" +#include "JniOnDPDevicesFoundListener.h" +#include "JniOnDirectPairingListener.h" #include "JniOnPresenceListener.h" #include @@ -43,15 +45,26 @@ void RemoveOnPlatformInfoListener(JNIEnv* env, jobject jListener); JniOnPresenceListener* AddOnPresenceListener(JNIEnv* env, jobject jListener); void RemoveOnPresenceListener(JNIEnv* env, jobject jListener); +JniOnDPDevicesFoundListener* AddOnDPDevicesFoundListener(JNIEnv* env, jobject jListener); +void RemoveOnDPDevicesFoundListener(JNIEnv* env, jobject jListener); + +JniOnDirectPairingListener* AddOnDirectPairingListener(JNIEnv* env, jobject jListener); +void RemoveOnDirectPairingListener(JNIEnv* env, jobject jListener); + + std::map> onResourceFoundListenerMap; std::map> onDeviceInfoListenerMap; std::map> onPlatformInfoListenerMap; std::map> onPresenceListenerMap; +std::map> onDPDevicesFoundListenerMap; +std::map> directPairingListenerMap; std::mutex resourceFoundMapLock; std::mutex deviceInfoMapLock; std::mutex platformInfoMapLock; std::mutex presenceMapLock; +std::mutex dpDevicesFoundListenerMapLock; +std::mutex directPairingListenerMapLock; #ifdef __cplusplus extern "C" { @@ -163,10 +176,10 @@ extern "C" { /* * Class: org_iotivity_base_OcPlatform * Method: registerDeviceInfo0 - * Signature: (Ljava/lang/String;)V + * Signature: (Ljava/lang/String;[Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_registerDeviceInfo0 - (JNIEnv *, jclass, jstring); + (JNIEnv *, jclass, jstring, jobjectArray); /* * Class: org_iotivity_base_OcPlatform @@ -288,6 +301,30 @@ extern "C" { JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_sendResponse0 (JNIEnv *, jclass, jobject); + /* + * Class: org_iotivity_base_OcPlatform + * Method: findDirectPairingDevices + * Signature: (ILorg/iotivity/base/OcPlatform/FindDirectPairingListener;)V + */ + JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findDirectPairingDevices + (JNIEnv *, jclass, jint, jobject); + + /* + * Class: org_iotivity_base_OcPlatform + * Method: getDirectPairedDevices + * Signature: (Lorg/iotivity/base/OcDirectPairDevice/GetDirectPairedListener;)V + */ + JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getDirectPairedDevices + (JNIEnv *, jclass, jobject); + + /* + * Class: org_iotivity_base_OcPlatform + * Method: doDirectPairing + * Signature: (Lorg/iotivity/base/OcDirectPairDevice;Lorg/iotivity/base/OcPrmType; + * Ljava/lang/String;Lorg/iotivity/base/OcDirectPairDevice/DirectPairingListener;)V + */ + JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_doDirectPairing0 + (JNIEnv *, jclass, jobject, jint, jstring, jobject); #ifdef __cplusplus } #endif diff --git a/android/android_api/base/jni/JniOcSecureResource.cpp b/android/android_api/base/jni/JniOcSecureResource.cpp index 77c8dc6..4b12e52 100644 --- a/android/android_api/base/jni/JniOcSecureResource.cpp +++ b/android/android_api/base/jni/JniOcSecureResource.cpp @@ -22,6 +22,9 @@ #include "JniOcSecureResource.h" #include "JniSecureUtils.h" +#include "aclresource.h" +#include "oic_malloc.h" +#include "oic_string.h" namespace PH = std::placeholders; JniOcSecureResource::JniOcSecureResource(std::shared_ptr device) @@ -210,32 +213,112 @@ OCStackResult JniOcSecureResource::provisionACL(JNIEnv* env, jobject _acl, jobje { OCStackResult ret; JniProvisionResultListner *resultListener = AddProvisionResultListener(env, jListener); - OicSecAcl_t *acl = new OicSecAcl_t; + OicSecAcl_t *acl = (OicSecAcl_t*)OICCalloc(1, sizeof(OicSecAcl_t)); if (!acl) { return OC_STACK_NO_MEMORY; } - acl->next = nullptr; - if (OC_STACK_OK != JniSecureUtils::convertJavaACLToOCAcl(env, _acl, acl)) { - delete acl; + JniSecureUtils::FreeACLList(acl); return OC_STACK_ERROR; } ResultCallBack resultCallback = [acl, resultListener](PMResultList_t *result, int hasError) { - delete acl; + JniSecureUtils::FreeACLList(acl); resultListener->ProvisionResultCallback(result, hasError, ListenerFunc::PROVISIONACL); }; ret = m_sharedSecureResource->provisionACL(acl, resultCallback); if (ret != OC_STACK_OK) { - delete acl; + JniSecureUtils::FreeACLList(acl); + } + return ret; +} + +OCStackResult JniOcSecureResource::provisionDirectPairing(JNIEnv* env, jobjectArray jpdacls, + jobject jListener, std::string pin, std::vector prms, int edp) +{ + OCStackResult ret; + JniProvisionResultListner *resultListener = AddProvisionResultListener(env, jListener); + + jsize len = env->GetArrayLength(jpdacls); + + OicSecPconf_t *pconf = nullptr; + OicSecPdAcl_t *head = nullptr; + + for (jsize i = 0; i < len; ++i) + { + OicSecPdAcl_t *pdacl = new OicSecPdAcl_t; + if (!pdacl) + { + return OC_STACK_NO_MEMORY; + } + + memset(pdacl, 0, sizeof(OicSecPdAcl_t)); + pdacl->next = nullptr; + + jobject jpdacl = env->GetObjectArrayElement(jpdacls, i); + + if (OC_STACK_OK != JniSecureUtils::convertJavaPdACLToOCAcl(env, jpdacl, pdacl)) + { + delete pdacl; + return OC_STACK_ERROR; + } + + pdacl->next = head; + head = pdacl; + } + + pconf = new OicSecPconf_t; + memset(pconf, 0, sizeof(OicSecPconf_t)); + pconf->edp = edp; + pconf->prmLen = prms.size(); + pconf->prm = new OicSecPrm_t[pconf->prmLen]; + pconf->pddevLen = 0; + + for (int i = 0 ; i < prms.size(); i++) + pconf->prm[i] = (OicSecPrm_t)prms[i]; + + memcpy(pconf->pin.val, pin.c_str(), DP_PIN_LENGTH); + pconf->pdacls = head; + + ResultCallBack resultCallback = [head, resultListener, pconf, prms] + (PMResultList_t *result, int hasError) + { + OicSecPdAcl_t *tmp1, *tmp2; + tmp1 = head; + while (tmp1) + { + tmp2 = tmp1->next; + delete tmp1; + tmp1 = tmp2; + } + + delete pconf->prm; + delete pconf; + resultListener->ProvisionResultCallback(result, hasError, ListenerFunc::PROVISIONDIRECTPAIRING); + }; + + ret = m_sharedSecureResource->provisionDirectPairing(pconf, resultCallback); + + if (ret != OC_STACK_OK) + { + OicSecPdAcl_t *tmp1, *tmp2; + tmp1 = head; + while (tmp1) + { + tmp2 = tmp1->next; + delete tmp1; + tmp1 = tmp2; + } + delete pconf->prm; + delete pconf; } return ret; } @@ -259,7 +342,7 @@ OCStackResult JniOcSecureResource::provisionPairwiseDevices(JNIEnv* env, jint ty if (_acl1) { - acl1 = new OicSecAcl_t; + acl1 = (OicSecAcl_t*)OICCalloc(1, sizeof(OicSecAcl_t)); if (!acl1) { return OC_STACK_NO_MEMORY; @@ -267,45 +350,43 @@ OCStackResult JniOcSecureResource::provisionPairwiseDevices(JNIEnv* env, jint ty if (OC_STACK_OK != JniSecureUtils::convertJavaACLToOCAcl(env, _acl1, acl1)) { - delete acl1; + JniSecureUtils::FreeACLList(acl1); return OC_STACK_ERROR; } - acl1->next = nullptr; } if (_acl2) { - acl2 = new OicSecAcl_t; + acl2 = (OicSecAcl_t*)OICCalloc(1, sizeof(OicSecAcl_t)); if (!acl2) { - delete acl1; + JniSecureUtils::FreeACLList(acl1); return OC_STACK_NO_MEMORY; } if (OC_STACK_OK != JniSecureUtils::convertJavaACLToOCAcl(env, _acl2, acl2)) { - delete acl2; + JniSecureUtils::FreeACLList(acl1); + JniSecureUtils::FreeACLList(acl2); return OC_STACK_ERROR; } - acl2->next = nullptr; } ResultCallBack resultCallback = [acl1, acl2, resultListener](PMResultList_t *result, int hasError) { - delete acl1; - delete acl2; + JniSecureUtils::FreeACLList(acl1); + JniSecureUtils::FreeACLList(acl2); resultListener->ProvisionResultCallback(result, hasError, ListenerFunc::PROVISIONPAIRWISEDEVICES); }; - ret = m_sharedSecureResource->provisionPairwiseDevices(cred, acl1, *device2->getDevicePtr(), acl2, resultCallback); if (ret != OC_STACK_OK) { - delete acl1; - delete acl2; + JniSecureUtils::FreeACLList(acl1); + JniSecureUtils::FreeACLList(acl2); } return ret; } @@ -543,6 +624,55 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcSecureResource_provisionPairwise /* * Class: org_iotivity_base_OcSecureResource + * Method: provisionDirectPairing + * Signature: (Ljava/lang/String;[Lorg/iotivity/base/OicSecPdAcl;ILorg/iotivity/base/OcSecureResource/ProvisionDirectPairingListener;I)V + */ +JNIEXPORT void JNICALL Java_org_iotivity_base_OcSecureResource_provisionDirectPairing +(JNIEnv *env, jobject thiz, jstring jpin, jobjectArray pdacls, jintArray jprmType, + jint jedp, jobject jListener) +{ + LOGD("OcSecureResource_provisionDirectPairing"); + if (!jListener || !pdacls || !jpin || ! jprmType) + { + ThrowOcException(OC_STACK_INVALID_PARAM, "Invalid Parameters"); + return; + } + std::string pin = env->GetStringUTFChars(jpin, nullptr); + + JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz); + if (!secureResource) + { + return; + } + + const jsize len = env->GetArrayLength(jprmType); + jint* ints = env->GetIntArrayElements(jprmType, nullptr); + std::vector value; + for (jsize i = 0; i < len; ++i) + { + value.push_back(static_cast(ints[i])); + } + env->ReleaseIntArrayElements(jprmType, ints, JNI_ABORT); + + try + { + OCStackResult result = secureResource->provisionDirectPairing(env, pdacls, jListener, + pin, value, static_cast(jedp)); + if (OC_STACK_OK != result) + { + ThrowOcException(result, "OcSecureResource_provisionDirectPairing"); + return; + } + } + catch (OCException& e) + { + LOGE("%s", e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); + } +} + +/* + * Class: org_iotivity_base_OcSecureResource * Method: getLinkedDevices * Signature: ()Ljava/util/List; */ diff --git a/android/android_api/base/jni/JniOcSecureResource.h b/android/android_api/base/jni/JniOcSecureResource.h index 0b98f75..d071e96 100644 --- a/android/android_api/base/jni/JniOcSecureResource.h +++ b/android/android_api/base/jni/JniOcSecureResource.h @@ -55,7 +55,8 @@ class JniOcSecureResource jobject device2, jobject jListener); OCStackResult unlinkDevices(JNIEnv* env, jobject device2, jobject jListener); OCStackResult removeDevice(JNIEnv* env, jint timeout, jobject jListener); - + OCStackResult provisionDirectPairing(JNIEnv* env, jobjectArray jpdacls,jobject jListener, + std::string pin, std::vector prms, int edp); private: std::map> resultMap; @@ -118,6 +119,14 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcSecureResource_provisionPairwise /* * Class: org_iotivity_base_OcSecureResource + * Method: provisionDirectPairing + * Signature: (Ljava/lang/Object;Lorg/iotivity/base/OcSecureResource/ProvisionDirectPairingListener;)V + */ +JNIEXPORT void JNICALL Java_org_iotivity_base_OcSecureResource_provisionDirectPairing + (JNIEnv *, jobject, jstring, jobjectArray, jintArray, jint, jobject); + +/* + * Class: org_iotivity_base_OcSecureResource * Method: getLinkedDevices * Signature: ()Ljava/util/List; */ diff --git a/android/android_api/base/jni/JniOcStack.cpp b/android/android_api/base/jni/JniOcStack.cpp index c5c3d7d..18d0160 100644 --- a/android/android_api/base/jni/JniOcStack.cpp +++ b/android/android_api/base/jni/JniOcStack.cpp @@ -25,6 +25,18 @@ #include "OCRepresentation.h" #include "JniUtils.h" +/** + * Macro to verify the validity of input argument. + * + * @param arg log level + */ +#define VERIFY_VARIABLE_NULL(arg) \ + if (nullptr == (arg)) \ + { \ + LOGE("invalid input"); \ + return JNI_ERR; \ + } \ + JavaVM* g_jvm = nullptr; jclass g_cls_Integer = nullptr; @@ -62,6 +74,11 @@ jclass g_cls_OcResourceIdentifier = nullptr; jclass g_cls_OcProvisionResult = nullptr; jclass g_cls_OcSecureResource = nullptr; jclass g_cls_OcOicSecAcl = nullptr; +jclass g_cls_OcOicSecAcl_ace = nullptr; +jclass g_cls_OcOicSecAcl_resr = nullptr; +jclass g_cls_OcOicSecAcl_validity = nullptr; +jclass g_cls_OcOicSecPdAcl = nullptr; +jclass g_cls_OcDirectPairDevice = nullptr; jmethodID g_mid_Integer_ctor = nullptr; jmethodID g_mid_Double_ctor = nullptr; @@ -94,14 +111,30 @@ jmethodID g_mid_OcPresenceStatus_get = nullptr; jmethodID g_mid_OcResourceIdentifier_N_ctor = nullptr; jmethodID g_mid_OcProvisionResult_ctor = nullptr; jmethodID g_mid_OcSecureResource_ctor = nullptr; - -jmethodID g_mid_OcOicSecAcl_get_subject = nullptr; -jmethodID g_mid_OcOicSecAcl_get_resources_cnt = nullptr; -jmethodID g_mid_OcOicSecAcl_get_resources = nullptr; -jmethodID g_mid_OcOicSecAcl_get_permission = nullptr; -jmethodID g_mid_OcOicSecAcl_get_periods_cnt = nullptr; -jmethodID g_mid_OcOicSecAcl_get_periods = nullptr; -jmethodID g_mid_OcOicSecAcl_get_recurrences = nullptr; +jmethodID g_mid_OcDirectPairDevice_ctor = nullptr; +jmethodID g_mid_OcDirectPairDevice_dev_ctor = nullptr; + +jmethodID g_mid_OcOicSecPdAcl_get_resources_cnt = nullptr; +jmethodID g_mid_OcOicSecPdAcl_get_resources = nullptr; +jmethodID g_mid_OcOicSecPdAcl_get_permission = nullptr; +jmethodID g_mid_OcOicSecPdAcl_get_periods_cnt = nullptr; +jmethodID g_mid_OcOicSecPdAcl_get_periods = nullptr; +jmethodID g_mid_OcOicSecPdAcl_get_recurrences = nullptr; + +jmethodID g_mid_OcOicSecAcl_get_aces = nullptr; +jmethodID g_mid_OcOicSecAcl_ace_get_subjectID = nullptr; +jmethodID g_mid_OcOicSecAcl_ace_get_permissions = nullptr; +jmethodID g_mid_OcOicSecAcl_ace_get_resources = nullptr; +jmethodID g_mid_OcOicSecAcl_ace_get_validities = nullptr; +jmethodID g_mid_OcOicSecAcl_resr_get_href = nullptr; +jmethodID g_mid_OcOicSecAcl_resr_get_rel = nullptr; +jmethodID g_mid_OcOicSecAcl_resr_get_types = nullptr; +jmethodID g_mid_OcOicSecAcl_resr_get_typeLen = nullptr; +jmethodID g_mid_OcOicSecAcl_resr_get_interfaces = nullptr; +jmethodID g_mid_OcOicSecAcl_validity_get_getPeriod = nullptr; +jmethodID g_mid_OcOicSecAcl_validity_get_recurrences = nullptr; +jmethodID g_mid_OcOicSecAcl_validity_get_recurrenceLen = nullptr; +jmethodID g_mid_OcOicSecAcl_resr_get_interfaceLen = nullptr; jmethodID g_mid_OcOicSecAcl_get_rownerID = nullptr; jobject getOcException(JNIEnv* env, const char* file, const char* functionName, @@ -141,7 +174,7 @@ void throwOcException(JNIEnv* env, jobject ex) JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) { LOGI("JNI_OnLoad"); - JNIEnv* env; + JNIEnv* env = nullptr; g_jvm = vm; if (g_jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK) @@ -149,316 +182,392 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) LOGE("Failed to get the environment using GetEnv()"); return JNI_ERR; } + VERIFY_VARIABLE_NULL(env); jclass clazz = nullptr; //Integer clazz = env->FindClass("java/lang/Integer"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); + g_cls_Integer = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); g_mid_Integer_ctor = env->GetMethodID(g_cls_Integer, "", "(I)V"); - if (!g_mid_Integer_ctor) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_Integer_ctor); clazz = env->FindClass("[I"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_int1DArray = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); clazz = env->FindClass("[[I"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_int2DArray = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); //Double clazz = env->FindClass("java/lang/Double"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_Double = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); g_mid_Double_ctor = env->GetMethodID(g_cls_Double, "", "(D)V"); - if (!g_mid_Double_ctor) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_Double_ctor); clazz = env->FindClass("[D"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_double1DArray = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); clazz = env->FindClass("[[D"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_double2DArray = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); //Boolean clazz = env->FindClass("java/lang/Boolean"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_Boolean = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); g_mid_Boolean_ctor = env->GetMethodID(g_cls_Boolean, "", "(Z)V"); - if (!g_mid_Boolean_ctor) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_Boolean_ctor); clazz = env->FindClass("[Z"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_boolean1DArray = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); clazz = env->FindClass("[[Z"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_boolean2DArray = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); //String clazz = env->FindClass("java/lang/String"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_String = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); clazz = env->FindClass("[Ljava/lang/String;"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_String1DArray = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); clazz = env->FindClass("[[Ljava/lang/String;"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_String2DArray = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); //LinkedList clazz = env->FindClass("java/util/LinkedList"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_LinkedList = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); g_mid_LinkedList_ctor = env->GetMethodID(g_cls_LinkedList, "", "()V"); - if (!g_mid_LinkedList_ctor) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_LinkedList_ctor); g_mid_LinkedList_add_object = env->GetMethodID(g_cls_LinkedList, "add", "(Ljava/lang/Object;)Z"); - if (!g_mid_LinkedList_add_object) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_LinkedList_add_object); //Map clazz = env->FindClass("java/util/Map"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_Map = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); g_mid_Map_entrySet = env->GetMethodID(g_cls_Map, "entrySet", "()Ljava/util/Set;"); - if (!g_mid_Map_entrySet) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_Map_entrySet); //MapEntry clazz = env->FindClass("java/util/Map$Entry"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_MapEntry = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); g_mid_MapEntry_getKey = env->GetMethodID(g_cls_MapEntry, "getKey", "()Ljava/lang/Object;"); - if (!g_mid_MapEntry_getKey) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_MapEntry_getKey); g_mid_MapEntry_getValue = env->GetMethodID(g_cls_MapEntry, "getValue", "()Ljava/lang/Object;"); - if (!g_mid_MapEntry_getValue) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_MapEntry_getValue); //Set clazz = env->FindClass("java/util/Set"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_Set = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); g_mid_Set_iterator = env->GetMethodID(g_cls_Set, "iterator", "()Ljava/util/Iterator;"); - if (!g_mid_Set_iterator) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_Set_iterator); //Iterator clazz = env->FindClass("java/util/Iterator"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_Iterator = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); g_mid_Iterator_hasNext = env->GetMethodID(g_cls_Iterator, "hasNext", "()Z"); - if (!g_mid_Iterator_hasNext) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_Iterator_hasNext); g_mid_Iterator_next = env->GetMethodID(g_cls_Iterator, "next", "()Ljava/lang/Object;"); - if (!g_mid_Iterator_next) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_Iterator_next); //HashMap clazz = env->FindClass("java/util/HashMap"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_HashMap = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); g_mid_HashMap_ctor = env->GetMethodID(g_cls_HashMap, "", "()V"); - if (!g_mid_HashMap_ctor) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_HashMap_ctor); g_mid_HashMap_put = env->GetMethodID(g_cls_HashMap, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); - if (!g_mid_HashMap_put) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_HashMap_put); //OcException clazz = env->FindClass("org/iotivity/base/OcException"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_OcException = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); g_mid_OcException_ctor = env->GetMethodID(g_cls_OcException, "", "(Ljava/lang/String;Ljava/lang/String;)V"); - if (!g_mid_OcException_ctor) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_OcException_ctor); g_mid_OcException_setNativeExceptionLocation = env->GetMethodID(g_cls_OcException, "setNativeExceptionLocation", "(Ljava/lang/String;""Ljava/lang/String;""I)V"); - if (!g_mid_OcException_setNativeExceptionLocation) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_OcException_setNativeExceptionLocation); //OcResource clazz = env->FindClass("org/iotivity/base/OcResource"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_OcResource = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); g_mid_OcResource_ctor = env->GetMethodID(g_cls_OcResource, "", "(J)V"); - if (!g_mid_OcResource_ctor) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_OcResource_ctor); //OcRepresentation clazz = env->FindClass("org/iotivity/base/OcRepresentation"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_OcRepresentation = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); g_mid_OcRepresentation_N_ctor = env->GetMethodID(g_cls_OcRepresentation, "", "(J)V"); - if (!g_mid_OcRepresentation_N_ctor) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_OcRepresentation_N_ctor); g_mid_OcRepresentation_N_ctor_bool = env->GetMethodID(g_cls_OcRepresentation, "", "(JZ)V"); - if (!g_mid_OcRepresentation_N_ctor_bool) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_OcRepresentation_N_ctor_bool); clazz = env->FindClass("[Lorg/iotivity/base/OcRepresentation;"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_OcRepresentation1DArray = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); clazz = env->FindClass("[[Lorg/iotivity/base/OcRepresentation;"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_OcRepresentation2DArray = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); //HeaderOptions clazz = env->FindClass("org/iotivity/base/OcHeaderOption"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_OcHeaderOption = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); g_mid_OcHeaderOption_ctor = env->GetMethodID(g_cls_OcHeaderOption, "", "(ILjava/lang/String;)V"); - if (!g_mid_OcHeaderOption_ctor) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_OcHeaderOption_ctor); g_mid_OcHeaderOption_get_id = env->GetMethodID(g_cls_OcHeaderOption, "getOptionId", "()I"); - if (!g_mid_OcHeaderOption_get_id) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_OcHeaderOption_get_id); g_mid_OcHeaderOption_get_data = env->GetMethodID(g_cls_OcHeaderOption, "getOptionData", "()Ljava/lang/String;"); - if (!g_mid_OcHeaderOption_get_data) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_OcHeaderOption_get_data); //OcResourceRequest clazz = env->FindClass("org/iotivity/base/OcResourceRequest"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_OcResourceRequest = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); g_mid_OcResourceRequest_N_ctor = env->GetMethodID(g_cls_OcResourceRequest, "", "(J)V"); - if (!g_mid_OcResourceRequest_N_ctor) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_OcResourceRequest_N_ctor); //OcResourceResponse clazz = env->FindClass("org/iotivity/base/OcResourceResponse"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_OcResourceResponse = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); g_mid_OcResourceResponse_N_ctor = env->GetMethodID(g_cls_OcResourceResponse, "", "(J)V"); - if (!g_mid_OcResourceResponse_N_ctor) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_OcResourceResponse_N_ctor); //OcResourceHandle clazz = env->FindClass("org/iotivity/base/OcResourceHandle"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_OcResourceHandle = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); g_mid_OcResourceHandle_N_ctor = env->GetMethodID(g_cls_OcResourceHandle, "", "(J)V"); - if (!g_mid_OcResourceHandle_N_ctor) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_OcResourceHandle_N_ctor); //OcPresenceHandle clazz = env->FindClass("org/iotivity/base/OcPresenceHandle"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_OcPresenceHandle = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); g_mid_OcPresenceHandle_N_ctor = env->GetMethodID(g_cls_OcPresenceHandle, "", "(J)V"); - if (!g_mid_OcPresenceHandle_N_ctor) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_OcPresenceHandle_N_ctor); //OcRequestHandle clazz = env->FindClass("org/iotivity/base/OcRequestHandle"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_OcRequestHandle = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); g_mid_OcRequestHandle_N_ctor = env->GetMethodID(g_cls_OcRequestHandle, "", "(J)V"); - if (!g_mid_OcRequestHandle_N_ctor) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_OcRequestHandle_N_ctor); //OcPresenceStatus clazz = env->FindClass("org/iotivity/base/OcPresenceStatus"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_OcPresenceStatus = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); g_mid_OcPresenceStatus_get = env->GetStaticMethodID(g_cls_OcPresenceStatus, "get", "(Ljava/lang/String;)Lorg/iotivity/base/OcPresenceStatus;"); - if (!g_mid_OcPresenceStatus_get) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_OcPresenceStatus_get); //ObservationInfo clazz = env->FindClass("org/iotivity/base/ObservationInfo"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_ObservationInfo = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); g_mid_ObservationInfo_N_ctor = env->GetMethodID(g_cls_ObservationInfo, "", "(IB)V"); - if (!g_mid_ObservationInfo_N_ctor) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_ObservationInfo_N_ctor); clazz = env->FindClass("org/iotivity/base/OcResourceIdentifier"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_OcResourceIdentifier = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); g_mid_OcResourceIdentifier_N_ctor = env->GetMethodID(g_cls_OcResourceIdentifier, "", "(J)V"); - if (!g_mid_OcResourceIdentifier_N_ctor) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_OcResourceIdentifier_N_ctor); //OcSecureResource clazz = env->FindClass("org/iotivity/base/OcSecureResource"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_OcSecureResource = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); g_mid_OcSecureResource_ctor = env->GetMethodID(g_cls_OcSecureResource, "", "(J)V"); - if (!g_mid_OcSecureResource_ctor) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_OcSecureResource_ctor); //ProvisionResult clazz = env->FindClass("org/iotivity/base/ProvisionResult"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_OcProvisionResult = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); g_mid_OcProvisionResult_ctor = env->GetMethodID(g_cls_OcProvisionResult, "", "(Ljava/lang/String;I)V"); - if (!g_mid_OcProvisionResult_ctor) return JNI_ERR; + VERIFY_VARIABLE_NULL(g_mid_OcProvisionResult_ctor); + + //OcDirectPairDevice + clazz = env->FindClass("org/iotivity/base/OcDirectPairDevice"); + VERIFY_VARIABLE_NULL(clazz); + g_cls_OcDirectPairDevice = (jclass)env->NewGlobalRef(clazz); + g_mid_OcDirectPairDevice_ctor = env->GetMethodID(g_cls_OcDirectPairDevice, "", "(J)V"); + VERIFY_VARIABLE_NULL(g_mid_OcDirectPairDevice_ctor); + + g_mid_OcDirectPairDevice_dev_ctor = env->GetMethodID(g_cls_OcDirectPairDevice, "", "(Ljava/lang/String;)V"); + VERIFY_VARIABLE_NULL(g_mid_OcDirectPairDevice_dev_ctor); + env->DeleteLocalRef(clazz); //OicSecAcl clazz = env->FindClass("org/iotivity/base/OicSecAcl"); - if (!clazz) return JNI_ERR; + VERIFY_VARIABLE_NULL(clazz); g_cls_OcOicSecAcl = (jclass)env->NewGlobalRef(clazz); env->DeleteLocalRef(clazz); - g_mid_OcOicSecAcl_get_subject = env->GetMethodID(g_cls_OcOicSecAcl, "getSubject", "()Ljava/lang/String;"); - if (!g_mid_OcOicSecAcl_get_subject) return JNI_ERR; + g_mid_OcOicSecAcl_get_rownerID = env->GetMethodID(g_cls_OcOicSecAcl, "getRownerID", "()Ljava/lang/String;"); + VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_get_rownerID); + + g_mid_OcOicSecAcl_get_aces = env->GetMethodID(g_cls_OcOicSecAcl, "getOicSecAces", "()[Lorg/iotivity/base/OicSecAce;"); + VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_get_aces); + + //OicSecAce + clazz = env->FindClass("org/iotivity/base/OicSecAce"); + VERIFY_VARIABLE_NULL(clazz); + g_cls_OcOicSecAcl_ace = (jclass)env->NewGlobalRef(clazz); + env->DeleteLocalRef(clazz); + + g_mid_OcOicSecAcl_ace_get_subjectID = env->GetMethodID(g_cls_OcOicSecAcl_ace, "getSubjectID","()Ljava/lang/String;"); + VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_ace_get_subjectID); - g_mid_OcOicSecAcl_get_resources_cnt = env->GetMethodID(g_cls_OcOicSecAcl, "getResourcesCount", "()I"); - if (!g_mid_OcOicSecAcl_get_resources_cnt) return JNI_ERR; + g_mid_OcOicSecAcl_ace_get_permissions = env->GetMethodID(g_cls_OcOicSecAcl_ace, "getPermission","()I"); + VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_ace_get_permissions); - g_mid_OcOicSecAcl_get_resources = env->GetMethodID(g_cls_OcOicSecAcl, "getResources", "(I)Ljava/lang/String;"); - if (!g_mid_OcOicSecAcl_get_resources) return JNI_ERR; + g_mid_OcOicSecAcl_ace_get_resources = env->GetMethodID(g_cls_OcOicSecAcl_ace, "getResources","()[Lorg/iotivity/base/OicSecResr;"); + VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_ace_get_resources); - g_mid_OcOicSecAcl_get_permission = env->GetMethodID(g_cls_OcOicSecAcl, "getPermission", "()I"); - if (!g_mid_OcOicSecAcl_get_permission) return JNI_ERR; + g_mid_OcOicSecAcl_ace_get_validities = env->GetMethodID(g_cls_OcOicSecAcl_ace, "getValidities","()[Lorg/iotivity/base/OicSecValidity;"); + VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_ace_get_validities); - g_mid_OcOicSecAcl_get_periods_cnt = env->GetMethodID(g_cls_OcOicSecAcl, "getPeriodsCount", "()I"); - if (!g_mid_OcOicSecAcl_get_periods_cnt) return JNI_ERR; + //OicSecResr + clazz = env->FindClass("org/iotivity/base/OicSecResr"); + VERIFY_VARIABLE_NULL(clazz); + g_cls_OcOicSecAcl_resr = (jclass)env->NewGlobalRef(clazz); + env->DeleteLocalRef(clazz); - g_mid_OcOicSecAcl_get_periods = env->GetMethodID(g_cls_OcOicSecAcl, "getPeriods", "(I)Ljava/lang/String;"); - if (!g_mid_OcOicSecAcl_get_periods) return JNI_ERR; + g_mid_OcOicSecAcl_resr_get_href = env->GetMethodID(g_cls_OcOicSecAcl_resr, "getHref","()Ljava/lang/String;"); + VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_resr_get_href); - g_mid_OcOicSecAcl_get_recurrences = env->GetMethodID(g_cls_OcOicSecAcl, "getRecurrences", "(I)Ljava/lang/String;"); - if (!g_mid_OcOicSecAcl_get_recurrences) return JNI_ERR; + g_mid_OcOicSecAcl_resr_get_rel = env->GetMethodID(g_cls_OcOicSecAcl_resr, "getRel","()Ljava/lang/String;"); + VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_resr_get_rel); - g_mid_OcOicSecAcl_get_rownerID = env->GetMethodID(g_cls_OcOicSecAcl, "getRownerID", "()Ljava/lang/String;"); - if (!g_mid_OcOicSecAcl_get_rownerID) return JNI_ERR; + g_mid_OcOicSecAcl_resr_get_types = env->GetMethodID(g_cls_OcOicSecAcl_resr, "getTypes","(I)Ljava/lang/String;"); + VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_resr_get_types); + + g_mid_OcOicSecAcl_resr_get_typeLen = env->GetMethodID(g_cls_OcOicSecAcl_resr, "getTypeLen","()I"); + VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_resr_get_typeLen); + + g_mid_OcOicSecAcl_resr_get_interfaces = env->GetMethodID(g_cls_OcOicSecAcl_resr, "getInterfaces","(I)Ljava/lang/String;"); + VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_resr_get_interfaces); + + g_mid_OcOicSecAcl_resr_get_interfaceLen = env->GetMethodID(g_cls_OcOicSecAcl_resr, "getInterfaceLen","()I"); + VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_resr_get_interfaceLen); + + //OicSecAcl$OicSecValidity + clazz = env->FindClass("org/iotivity/base/OicSecValidity"); + VERIFY_VARIABLE_NULL(clazz); + g_cls_OcOicSecAcl_validity = (jclass)env->NewGlobalRef(clazz); + env->DeleteLocalRef(clazz); + + g_mid_OcOicSecAcl_validity_get_getPeriod = env->GetMethodID(g_cls_OcOicSecAcl_validity, "getPeriod","()Ljava/lang/String;"); + VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_validity_get_getPeriod); + + g_mid_OcOicSecAcl_validity_get_recurrences = env->GetMethodID(g_cls_OcOicSecAcl_validity, "getRecurrences","(I)Ljava/lang/String;"); + VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_validity_get_recurrences); + + g_mid_OcOicSecAcl_validity_get_recurrenceLen = env->GetMethodID(g_cls_OcOicSecAcl_validity, "getRecurrenceLen","()I"); + VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_validity_get_recurrenceLen); + + //OicSecPdAcl + clazz = env->FindClass("org/iotivity/base/OicSecPdAcl"); + VERIFY_VARIABLE_NULL(clazz); + g_cls_OcOicSecPdAcl = (jclass)env->NewGlobalRef(clazz); + env->DeleteLocalRef(clazz); + + g_mid_OcOicSecPdAcl_get_resources_cnt = env->GetMethodID(g_cls_OcOicSecPdAcl, "getResourcesCount", "()I"); + VERIFY_VARIABLE_NULL(g_mid_OcOicSecPdAcl_get_resources_cnt); + + g_mid_OcOicSecPdAcl_get_resources = env->GetMethodID(g_cls_OcOicSecPdAcl, "getResources", "(I)Ljava/lang/String;"); + VERIFY_VARIABLE_NULL(g_mid_OcOicSecPdAcl_get_resources); + + g_mid_OcOicSecPdAcl_get_permission = env->GetMethodID(g_cls_OcOicSecPdAcl, "getPermission", "()I"); + VERIFY_VARIABLE_NULL(g_mid_OcOicSecPdAcl_get_permission); + + g_mid_OcOicSecPdAcl_get_periods_cnt = env->GetMethodID(g_cls_OcOicSecPdAcl, "getPeriodsCount", "()I"); + VERIFY_VARIABLE_NULL(g_mid_OcOicSecPdAcl_get_periods_cnt); + + g_mid_OcOicSecPdAcl_get_periods = env->GetMethodID(g_cls_OcOicSecPdAcl, "getPeriods", "(I)Ljava/lang/String;"); + VERIFY_VARIABLE_NULL(g_mid_OcOicSecPdAcl_get_periods); + + g_mid_OcOicSecPdAcl_get_recurrences = env->GetMethodID(g_cls_OcOicSecPdAcl, "getRecurrences", "(I)Ljava/lang/String;"); + VERIFY_VARIABLE_NULL(g_mid_OcOicSecPdAcl_get_recurrences); return JNI_CURRENT_VERSION; } @@ -509,4 +618,7 @@ JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved) env->DeleteGlobalRef(g_cls_OcSecureResource); env->DeleteGlobalRef(g_cls_OcProvisionResult); env->DeleteGlobalRef(g_cls_OcOicSecAcl); -} \ No newline at end of file + env->DeleteGlobalRef(g_cls_OcOicSecAcl_ace); + env->DeleteGlobalRef(g_cls_OcOicSecAcl_resr); + env->DeleteGlobalRef(g_cls_OcOicSecAcl_validity); +} diff --git a/android/android_api/base/jni/JniOcStack.h b/android/android_api/base/jni/JniOcStack.h index b9f2ccd..243ce4c 100644 --- a/android/android_api/base/jni/JniOcStack.h +++ b/android/android_api/base/jni/JniOcStack.h @@ -82,6 +82,12 @@ extern jclass g_cls_OcResourceIdentifier; extern jclass g_cls_OcProvisionResult; extern jclass g_cls_OcSecureResource; extern jclass g_cls_OcOicSecAcl; +extern jclass g_cls_OcOicSecPdAcl; +extern jclass g_cls_OcDirectPairDevice; + +extern jclass g_cls_OcOicSecAcl_ace; +extern jclass g_cls_OcOicSecAcl_resr; +extern jclass g_cls_OcOicSecAcl_validity; extern jmethodID g_mid_Integer_ctor; extern jmethodID g_mid_Double_ctor; @@ -114,14 +120,30 @@ extern jmethodID g_mid_OcPresenceStatus_get; extern jmethodID g_mid_OcResourceIdentifier_N_ctor; extern jmethodID g_mid_OcProvisionResult_ctor; extern jmethodID g_mid_OcSecureResource_ctor; -extern jmethodID g_mid_OcOicSecAcl_get_subject; -extern jmethodID g_mid_OcOicSecAcl_get_resources_cnt; -extern jmethodID g_mid_OcOicSecAcl_get_resources; -extern jmethodID g_mid_OcOicSecAcl_get_permission; -extern jmethodID g_mid_OcOicSecAcl_get_periods_cnt; -extern jmethodID g_mid_OcOicSecAcl_get_periods; -extern jmethodID g_mid_OcOicSecAcl_get_recurrences; +extern jmethodID g_mid_OcDirectPairDevice_ctor; +extern jmethodID g_mid_OcDirectPairDevice_dev_ctor; + extern jmethodID g_mid_OcOicSecAcl_get_rownerID; +extern jmethodID g_mid_OcOicSecAcl_get_aces; +extern jmethodID g_mid_OcOicSecAcl_ace_get_subjectID; +extern jmethodID g_mid_OcOicSecAcl_ace_get_permissions; +extern jmethodID g_mid_OcOicSecAcl_ace_get_resources; +extern jmethodID g_mid_OcOicSecAcl_ace_get_validities; +extern jmethodID g_mid_OcOicSecAcl_resr_get_href; +extern jmethodID g_mid_OcOicSecAcl_resr_get_rel; +extern jmethodID g_mid_OcOicSecAcl_resr_get_types; +extern jmethodID g_mid_OcOicSecAcl_resr_get_typeLen; +extern jmethodID g_mid_OcOicSecAcl_resr_get_interfaces; +extern jmethodID g_mid_OcOicSecAcl_resr_get_interfaceLen; +extern jmethodID g_mid_OcOicSecAcl_validity_get_getPeriod; +extern jmethodID g_mid_OcOicSecAcl_validity_get_recurrences; +extern jmethodID g_mid_OcOicSecAcl_validity_get_recurrenceLen; +extern jmethodID g_mid_OcOicSecPdAcl_get_resources_cnt; +extern jmethodID g_mid_OcOicSecPdAcl_get_resources; +extern jmethodID g_mid_OcOicSecPdAcl_get_permission; +extern jmethodID g_mid_OcOicSecPdAcl_get_periods_cnt; +extern jmethodID g_mid_OcOicSecPdAcl_get_periods; +extern jmethodID g_mid_OcOicSecPdAcl_get_recurrences; typedef void(*RemoveListenerCallback)(JNIEnv* env, jobject jListener); @@ -151,26 +173,29 @@ static JNIEnv* GetJNIEnv(jint& ret) JNIEnv *env = nullptr; ret = g_jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION); - switch (ret) { - case JNI_OK: - return env; - case JNI_EDETACHED: - if (g_jvm->AttachCurrentThread(&env, nullptr) < 0) - { + switch (ret) + { + case JNI_OK: + return env; + case JNI_EDETACHED: + if (g_jvm->AttachCurrentThread(&env, nullptr) < 0) + { + LOGE("Failed to get the environment"); + return nullptr; + } + else + { + return env; + } + + case JNI_EVERSION: + LOGE("JNI version not supported"); + break; + default: LOGE("Failed to get the environment"); return nullptr; - } - else - { - return env; - } - - case JNI_EVERSION: - LOGE("JNI version not supported"); - default: - LOGE("Failed to get the environment"); - return nullptr; } + return nullptr; } static void DuplicateString(char ** targetString, std::string sourceString) @@ -179,4 +204,4 @@ static void DuplicateString(char ** targetString, std::string sourceString) strncpy(*targetString, sourceString.c_str(), (sourceString.length() + 1)); } -#endif // _Included_org_iotivity_base_ocstack \ No newline at end of file +#endif // _Included_org_iotivity_base_ocstack diff --git a/android/android_api/base/jni/JniOnDPDevicesFoundListener.cpp b/android/android_api/base/jni/JniOnDPDevicesFoundListener.cpp new file mode 100644 index 0000000..5c5d900 --- /dev/null +++ b/android/android_api/base/jni/JniOnDPDevicesFoundListener.cpp @@ -0,0 +1,165 @@ +/* +* //****************************************************************** +* // +* // Copyright 2016 Samsung Electronics All Rights Reserved. +* // +* //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +* // +* // Licensed under the Apache License, Version 2.0 (the "License"); +* // you may not use this file except in compliance with the License. +* // You may obtain a copy of the License at +* // +* // http://www.apache.org/licenses/LICENSE-2.0 +* // +* // Unless required by applicable law or agreed to in writing, software +* // distributed under the License is distributed on an "AS IS" BASIS, +* // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* // See the License for the specific language governing permissions and +* // limitations under the License. +* // +* //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +*/ +#include "JniOnDPDevicesFoundListener.h" +#include "JniOcDirectPairDevice.h" +#include "OCApi.h" +using namespace OC; + +JniOnDPDevicesFoundListener::JniOnDPDevicesFoundListener(JNIEnv *env, jobject jListener, + RemoveListenerCallback removeListenerCallback) +{ + m_jwListener = env->NewWeakGlobalRef(jListener); + m_removeListenerCallback = removeListenerCallback; +} + +jobject JniOnDPDevicesFoundListener::convertdpDevVectorToJavaList(JNIEnv *env, PairedDevices DPdevList) +{ + jobject jResultList = env->NewObject(g_cls_LinkedList, g_mid_LinkedList_ctor); + if (!jResultList) + { + return nullptr; + } + + for (size_t i = 0; i < DPdevList.size(); ++i) + { + JniOcDirectPairDevice *device = new JniOcDirectPairDevice(DPdevList.at(i)); + if (!device) + { + return nullptr; + } + + jstring jStr = env->NewStringUTF(((DPdevList.at(i))->getDeviceID()).c_str()); + if (!jStr) + { + return nullptr; + } + jobject jresult = env->NewObject(g_cls_OcDirectPairDevice, + g_mid_OcDirectPairDevice_dev_ctor,jStr); + if (!jresult) + { + return nullptr; + } + + SetHandle(env, jresult, device); + + env->CallBooleanMethod(jResultList, g_mid_LinkedList_add_object, jresult); + if (env->ExceptionCheck()) + { + return nullptr; + } + env->DeleteLocalRef(jresult); + env->DeleteLocalRef(jStr); + } + return jResultList; +} + +JniOnDPDevicesFoundListener::~JniOnDPDevicesFoundListener() +{ + LOGI("~JniOnDPDevicesFoundListener()"); + if (m_jwListener) + { + jint ret; + JNIEnv *env = GetJNIEnv(ret); + if (nullptr == env) return; + env->DeleteWeakGlobalRef(m_jwListener); + m_jwListener = nullptr; + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + } +} + +void JniOnDPDevicesFoundListener::directPairingDevicesCallback(PairedDevices paringDevicesList, DPFunc func) +{ + jint ret; + JNIEnv *env = GetJNIEnv(ret); + if (nullptr == env) return; + + jobject jListener = env->NewLocalRef(m_jwListener); + if (!jListener) + { + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + return; + } + + jclass clsL = env->GetObjectClass(jListener); + + if (!clsL) + { + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + return; + } + + jobject jpairingDevicesList = convertdpDevVectorToJavaList(env, paringDevicesList); + std::string calledFunc; + switch (func) + { + case DPFunc::FIND_DIRECT_PAIRED_DEV_LIST: + { + calledFunc = "onFindDirectPairingListener"; + } + break; + case DPFunc::GET_PAIRED_DEV_LIST: + { + calledFunc = "onGetDirectPairedListener"; + } + default: + { + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + } + return; + } + + jmethodID midL = env->GetMethodID(clsL, calledFunc.c_str(), "(Ljava/util/List;)V"); + + if (!midL) + { + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + return; + } + + env->CallVoidMethod(jListener, midL, jpairingDevicesList); + if (env->ExceptionCheck()) + { + LOGE("Java exception is thrown"); + } + + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); +} + +void JniOnDPDevicesFoundListener::checkExAndRemoveListener(JNIEnv* env) +{ + if (env->ExceptionCheck()) + { + jthrowable ex = env->ExceptionOccurred(); + env->ExceptionClear(); + m_removeListenerCallback(env, m_jwListener); + env->Throw((jthrowable)ex); + } + else + { + m_removeListenerCallback(env, m_jwListener); + } +} diff --git a/android/android_api/base/jni/JniOnDPDevicesFoundListener.h b/android/android_api/base/jni/JniOnDPDevicesFoundListener.h new file mode 100644 index 0000000..88acb61 --- /dev/null +++ b/android/android_api/base/jni/JniOnDPDevicesFoundListener.h @@ -0,0 +1,51 @@ +/* +* //****************************************************************** +* // +* // Copyright 2016 Samsung Electronics All Rights Reserved. +* // +* //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +* // +* // Licensed under the Apache License, Version 2.0 (the "License"); +* // you may not use this file except in compliance with the License. +* // You may obtain a copy of the License at +* // +* // http://www.apache.org/licenses/LICENSE-2.0 +* // +* // Unless required by applicable law or agreed to in writing, software +* // distributed under the License is distributed on an "AS IS" BASIS, +* // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* // See the License for the specific language governing permissions and +* // limitations under the License. +* // +* //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +*/ +#include +#include "OCDirectPairing.h" +#include "OCApi.h" +#include "JniOcStack.h" + +#ifndef _Included_org_iotivity_base_OcPlatform_JniOnDPDevicesFoundListener +#define _Included_org_iotivity_base_OcPlatform_JniOnDPDevicesFoundListener + +enum class DPFunc +{ + FIND_DIRECT_PAIRED_DEV_LIST = 1, + GET_PAIRED_DEV_LIST, +}; + +class JniOnDPDevicesFoundListener +{ +public: + JniOnDPDevicesFoundListener(JNIEnv *env, jobject jListener, + RemoveListenerCallback removeListenerCallback); + ~JniOnDPDevicesFoundListener(); + + jobject convertdpDevVectorToJavaList(JNIEnv *env, OC::PairedDevices DPdevList); + void directPairingDevicesCallback(OC::PairedDevices paringDevicesList, DPFunc); + +private: + RemoveListenerCallback m_removeListenerCallback; + jweak m_jwListener; + void checkExAndRemoveListener(JNIEnv* env); +}; +#endif diff --git a/android/android_api/base/jni/JniOnDirectPairingListener.cpp b/android/android_api/base/jni/JniOnDirectPairingListener.cpp new file mode 100644 index 0000000..f580079 --- /dev/null +++ b/android/android_api/base/jni/JniOnDirectPairingListener.cpp @@ -0,0 +1,129 @@ +/* +* //****************************************************************** +* // +* // Copyright 2016 Samsung Electronics All Rights Reserved. +* // +* //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +* // +* // Licensed under the Apache License, Version 2.0 (the "License"); +* // you may not use this file except in compliance with the License. +* // You may obtain a copy of the License at +* // +* // http://www.apache.org/licenses/LICENSE-2.0 +* // +* // Unless required by applicable law or agreed to in writing, software +* // distributed under the License is distributed on an "AS IS" BASIS, +* // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* // See the License for the specific language governing permissions and +* // limitations under the License. +* // +* //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +*/ +#include "JniOnDirectPairingListener.h" +#include "JniOcDirectPairDevice.h" +#include "OCDirectPairing.h" +#include "OCApi.h" +using namespace OC; + +JniOnDirectPairingListener::JniOnDirectPairingListener(JNIEnv *env, jobject jListener, + RemoveListenerCallback removeListenerCallback) +{ + m_jwListener = env->NewWeakGlobalRef(jListener); + m_removeListenerCallback = removeListenerCallback; +} + + +JniOnDirectPairingListener::~JniOnDirectPairingListener() +{ + LOGI("~JniOnDirectPairingListener()"); + if (m_jwListener) + { + jint ret; + JNIEnv *env = GetJNIEnv(ret); + if (nullptr == env) return; + env->DeleteWeakGlobalRef(m_jwListener); + m_jwListener = nullptr; + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + } +} + +void JniOnDirectPairingListener::doDirectPairingCB(std::shared_ptr dpDev, + OCStackResult result) +{ + jint ret; + JNIEnv *env = GetJNIEnv(ret); + if (nullptr == env) return; + + jobject jListener = env->NewLocalRef(m_jwListener); + if (!jListener) + { + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + return; + } + + jclass clsL = env->GetObjectClass(jListener); + + if (!clsL) + { + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + return; + } + + JniOcDirectPairDevice *device = new JniOcDirectPairDevice(dpDev); + if (!device) return; + + jstring jStr = env->NewStringUTF((dpDev->getDeviceID()).c_str()); + if (!jStr) + { + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + return ; + } + + jobject jresult = env->NewObject(g_cls_OcDirectPairDevice, g_mid_OcDirectPairDevice_ctor); + if (!jresult) + { + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + return ; + } + + SetHandle(env, jresult, device); + + jint jres = static_cast(result); + + jmethodID midL = env->GetMethodID(clsL, "onDirectPairingListener", "(Ljava/lang/String;I)V"); + + if (!midL) + { + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + return; + } + + env->CallVoidMethod(jListener, midL, jStr, jres); + if (env->ExceptionCheck()) + { + LOGE("Java exception is thrown"); + } + + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); +} + +void JniOnDirectPairingListener::checkExAndRemoveListener(JNIEnv* env) +{ + if (env->ExceptionCheck()) + { + jthrowable ex = env->ExceptionOccurred(); + env->ExceptionClear(); + m_removeListenerCallback(env, m_jwListener); + env->Throw((jthrowable)ex); + } + else + { + m_removeListenerCallback(env, m_jwListener); + } +} diff --git a/android/android_api/base/jni/JniOnDirectPairingListener.h b/android/android_api/base/jni/JniOnDirectPairingListener.h new file mode 100644 index 0000000..8ec2b7e --- /dev/null +++ b/android/android_api/base/jni/JniOnDirectPairingListener.h @@ -0,0 +1,43 @@ +/* +* //****************************************************************** +* // +* // Copyright 2016 Samsung Electronics All Rights Reserved. +* // +* //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +* // +* // Licensed under the Apache License, Version 2.0 (the "License"); +* // you may not use this file except in compliance with the License. +* // You may obtain a copy of the License at +* // +* // http://www.apache.org/licenses/LICENSE-2.0 +* // +* // Unless required by applicable law or agreed to in writing, software +* // distributed under the License is distributed on an "AS IS" BASIS, +* // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* // See the License for the specific language governing permissions and +* // limitations under the License. +* // +* //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +*/ +#include +#include "OCDirectPairing.h" +#include "JniOcStack.h" + +#ifndef _Included_org_iotivity_base_OcPlatform_JniOnDirectPairingListener +#define _Included_org_iotivity_base_OcPlatform_JniOnDirectPairingListener + +class JniOnDirectPairingListener +{ +public: + JniOnDirectPairingListener(JNIEnv *env, jobject jListener, + RemoveListenerCallback removeListenerCallback); + ~JniOnDirectPairingListener(); + + void doDirectPairingCB(std::shared_ptr, OCStackResult); + +private: + RemoveListenerCallback m_removeListenerCallback; + jweak m_jwListener; + void checkExAndRemoveListener(JNIEnv* env); +}; +#endif diff --git a/android/android_api/base/jni/JniProvisionResultListner.cpp b/android/android_api/base/jni/JniProvisionResultListner.cpp index 6b9fd04..a600e64 100644 --- a/android/android_api/base/jni/JniProvisionResultListner.cpp +++ b/android/android_api/base/jni/JniProvisionResultListner.cpp @@ -109,6 +109,11 @@ void JniProvisionResultListner::ProvisionResultCallback(PMResultList_t *result, calledFunc = "provisionPairwiseDevicesListener"; } break; + case ListenerFunc::PROVISIONDIRECTPAIRING: + { + calledFunc = "provisionDirectPairingListener"; + } + break; default: { checkExAndRemoveListener(env); diff --git a/android/android_api/base/jni/JniProvisionResultListner.h b/android/android_api/base/jni/JniProvisionResultListner.h index 6df56d7..8bf5242 100644 --- a/android/android_api/base/jni/JniProvisionResultListner.h +++ b/android/android_api/base/jni/JniProvisionResultListner.h @@ -35,7 +35,8 @@ enum class ListenerFunc PROVISIONCREDENTIALS, UNLINKDEVICES, REMOVEDEVICE, - PROVISIONPAIRWISEDEVICES + PROVISIONPAIRWISEDEVICES, + PROVISIONDIRECTPAIRING }; class JniProvisionResultListner diff --git a/android/android_api/base/jni/JniSecureUtils.cpp b/android/android_api/base/jni/JniSecureUtils.cpp index 24e4f57..718bb4a 100644 --- a/android/android_api/base/jni/JniSecureUtils.cpp +++ b/android/android_api/base/jni/JniSecureUtils.cpp @@ -21,7 +21,9 @@ */ #include "JniSecureUtils.h" +#include "JniOcStack.h" #include "JniOcSecureResource.h" +#include "oic_malloc.h" #include "srmutility.h" #include "base64.h" @@ -35,7 +37,15 @@ jobject JniSecureUtils::convertProvisionresultVectorToJavaList(JNIEnv *env, cons for (size_t i = 0; i < result->size(); ++i) { - jstring jStr = env->NewStringUTF((convertUUIDtoStr(result->at(i).deviceId).c_str())); + char *Str = NULL; + + if (OC_STACK_OK != ConvertUuidToStr(&(result->at(i).deviceId), &Str)) + { + return nullptr; + } + jstring jStr = env->NewStringUTF(Str); + OICFree(Str); + if (!jStr) { return nullptr; @@ -117,7 +127,15 @@ jobject JniSecureUtils::convertUUIDVectorToJavaStrList(JNIEnv *env, UuidList_t & } for (size_t i = 0; i < vector.size(); ++i) { - jstring jStr = env->NewStringUTF((convertUUIDtoStr(vector[i])).c_str()); + char *Str = NULL; + + if (OC_STACK_OK != ConvertUuidToStr(&(vector[i]), &Str)) + { + return nullptr; + } + jstring jStr = env->NewStringUTF(Str); + OICFree(Str); + if (!jStr) { return nullptr; @@ -132,19 +150,270 @@ jobject JniSecureUtils::convertUUIDVectorToJavaStrList(JNIEnv *env, UuidList_t & return jList; } +static void freeValidities(OicSecValidity_t *head) +{ + OicSecValidity_t *tmp = head; + while(tmp != NULL) + { + head = head->next; + free(tmp->recurrences); + free(tmp); + tmp = head; + } +} + +static void freeResources(OicSecRsrc_t *head) +{ + OicSecRsrc_t *tmp = head; + while(tmp != NULL) + { + head = head->next; + free(tmp->types); + free(tmp->interfaces); + free(tmp); + tmp = head; + } +} + +void JniSecureUtils::FreeACLList(OicSecAcl_t *acl) +{ + if (acl) + { + if (acl->aces) + { + freeResources(acl->aces->resources); + freeValidities(acl->aces->validities); + OICFree(acl->aces); + } + OICFree(acl); + } +} + +static OicSecValidity_t* getValiditiesList(JNIEnv *env, jobject validityObject) +{ + jstring jData; + jobjectArray valList = (jobjectArray)env->CallObjectMethod(validityObject, g_mid_OcOicSecAcl_ace_get_validities); + if (!valList || env->ExceptionCheck()) + { + return nullptr; + } + int nr_validities = env->GetArrayLength(valList); + + OicSecValidity_t *valHead = NULL; + + for (int i = 0 ; i < nr_validities; i++) + { + OicSecValidity_t *tmp = (OicSecValidity_t*)OICCalloc(1, sizeof(OicSecValidity_t)); + if (NULL == tmp) + { + LOGE("Failed to allocate memory"); + freeValidities(valHead); + return nullptr; + } + + jobject element = env->GetObjectArrayElement(valList, i); + if (!element || env->ExceptionCheck()) + { + OICFree(tmp); + freeValidities(valHead); + return nullptr; + } + + jData = (jstring)env->CallObjectMethod(element, g_mid_OcOicSecAcl_validity_get_getPeriod); + if (!jData || env->ExceptionCheck()) + { + OICFree(tmp); + freeValidities(valHead); + return nullptr; + } + tmp->period = (char*)env->GetStringUTFChars(jData, 0); + + jint jrecurrenceLen = (jint) env->CallIntMethod(element, + g_mid_OcOicSecAcl_validity_get_recurrenceLen); + if (env->ExceptionCheck()) + { + OICFree(tmp); + freeValidities(valHead); + return nullptr; + } + tmp->recurrenceLen = (int)jrecurrenceLen; + + if (jrecurrenceLen > 0) + { + jvalue argv[1]; + tmp->recurrences = (char**)OICCalloc(jrecurrenceLen, sizeof(char*)); + + for (int i = 0 ; i < jrecurrenceLen; i++) + { + argv[0].i = i; + jData = (jstring)env->CallObjectMethodA(element, g_mid_OcOicSecAcl_validity_get_recurrences, argv); + if (!jData || env->ExceptionCheck()) + { + OICFree(tmp->recurrences); + OICFree(tmp); + freeValidities(valHead); + return nullptr; + } + tmp->recurrences[i] = (char*)env->GetStringUTFChars(jData, 0); + } + } + if (NULL == valHead) + { + valHead = tmp; + } + else + { + OicSecValidity_t *ptr = valHead; + while(ptr->next != NULL) ptr = ptr->next; + ptr->next = tmp; + tmp->next = NULL; + } + env->DeleteLocalRef(element); + } + return valHead; +} + +static OicSecRsrc_t * getResourcesList(JNIEnv *env, jobject resourceObject) +{ + jstring jData; + + jobjectArray rescList = (jobjectArray)env->CallObjectMethod(resourceObject, g_mid_OcOicSecAcl_ace_get_resources); + if (!rescList || env->ExceptionCheck()) + { + return nullptr; + } + + int nr_resc = env->GetArrayLength(rescList); + OicSecRsrc_t *rescHead = NULL; + + for (int i = 0 ; i < nr_resc; i++) + { + OicSecRsrc_t *tmp = (OicSecRsrc_t*)OICCalloc(1, sizeof(OicSecRsrc_t)); + if (NULL == tmp) + { + LOGE("Failed to allocate memory"); + freeResources(rescHead); + return nullptr; + } + jobject element = env->GetObjectArrayElement(rescList, i); + if (!element || env->ExceptionCheck()) + { + OICFree(tmp); + freeResources(rescHead); + return nullptr; + } + jData = (jstring)env->CallObjectMethod(element, g_mid_OcOicSecAcl_resr_get_href); + if (!jData || env->ExceptionCheck()) + { + OICFree(tmp); + freeResources(rescHead); + return nullptr; + } + tmp->href = (char*)env->GetStringUTFChars(jData, 0); + + jData = (jstring)env->CallObjectMethod(element, g_mid_OcOicSecAcl_resr_get_rel); + if (!jData || env->ExceptionCheck()) + { + OICFree(tmp); + freeResources(rescHead); + return nullptr; + } + tmp->rel = (char*)env->GetStringUTFChars(jData, 0); + + jint len = (jint) env->CallIntMethod(element, g_mid_OcOicSecAcl_resr_get_typeLen); + if (env->ExceptionCheck()) + { + OICFree(tmp); + freeResources(rescHead); + return nullptr; + } + tmp->typeLen = (int)len; + if (len > 0) + { + jvalue argv[1]; + tmp->types = (char**)OICCalloc(len, sizeof(char*)); + if (NULL == tmp->types) + { + LOGE("Failed to allocate memory"); + return nullptr; + } + + for (int i = 0 ; i < len; i++) + { + argv[0].i = i; + jData = (jstring)env->CallObjectMethodA(element, g_mid_OcOicSecAcl_resr_get_types, argv); + if (!jData || env->ExceptionCheck()) + { + OICFree(tmp->types); + OICFree(tmp); + freeResources(rescHead); + return nullptr; + } + tmp->types[i] = (char*)env->GetStringUTFChars(jData, 0); + } + } + + len = (jint) env->CallIntMethod(element, g_mid_OcOicSecAcl_resr_get_interfaceLen); + if (env->ExceptionCheck()) + { + OICFree(tmp->types); + OICFree(tmp); + freeResources(rescHead); + return nullptr; + } + tmp->interfaceLen = len; + if (len > 0) + { + jvalue argv[1]; + tmp->interfaces = (char**)OICCalloc(len, sizeof(char*)); + + for (int i = 0 ; i < len; i++) + { + argv[0].i = i; + jData = (jstring)env->CallObjectMethodA(element, g_mid_OcOicSecAcl_resr_get_interfaces, argv); + if (!jData || env->ExceptionCheck()) + { + OICFree(tmp->types); + OICFree(tmp); + freeResources(rescHead); + return nullptr; + } + tmp->interfaces[i] = (char*)env->GetStringUTFChars(jData, 0); + } + } + + if (NULL == rescHead) + { + rescHead = tmp; + } + else + { + OicSecRsrc_t *ptr = rescHead; + while(ptr->next != NULL) ptr = ptr->next; + ptr->next = tmp; + tmp->next = NULL; + } + env->DeleteLocalRef(element); + } + return rescHead; +} + OCStackResult JniSecureUtils::convertJavaACLToOCAcl(JNIEnv *env, jobject in, OicSecAcl_t *acl) { jstring jData; - jvalue args[1]; - jData = (jstring) env->CallObjectMethod(in, g_mid_OcOicSecAcl_get_subject); + jData = (jstring) env->CallObjectMethod(in, g_mid_OcOicSecAcl_get_rownerID); if (!jData || env->ExceptionCheck()) { return OC_STACK_ERROR; } char *str = (char*) env->GetStringUTFChars(jData, 0); - if (OC_STACK_OK == ConvertStrToUuid(str, &acl->subject)) + if (!str) + { + return OC_STACK_ERROR; + } + if (OC_STACK_OK == ConvertStrToUuid(str, &acl->rownerID)) { env->ReleaseStringUTFChars(jData, str); } @@ -153,82 +422,160 @@ OCStackResult JniSecureUtils::convertJavaACLToOCAcl(JNIEnv *env, jobject in, Oic return OC_STACK_ERROR; } - jint jCount = (jint) env->CallIntMethod(in, g_mid_OcOicSecAcl_get_resources_cnt); + jobjectArray acesList = (jobjectArray)env->CallObjectMethod(in, g_mid_OcOicSecAcl_get_aces); + + if (!acesList || env->ExceptionCheck()) + { + return OC_STACK_ERROR; + } + + int nr_aces = env->GetArrayLength(acesList); + + OicSecAce_t *acesHead = NULL; + + for (int i = 0 ; i < nr_aces; i++) + { + OicSecAce_t *tmp = (OicSecAce_t*)OICCalloc(1, sizeof(OicSecAce_t)); + + jobject element = env->GetObjectArrayElement(acesList, i); + if (!element || env->ExceptionCheck()) + { + return OC_STACK_ERROR; + } + + jData = (jstring) env->CallObjectMethod(element, g_mid_OcOicSecAcl_ace_get_subjectID); + if (!jData || env->ExceptionCheck()) + { + return OC_STACK_ERROR; + } + + str = (char*) env->GetStringUTFChars(jData, 0); + + if (!str) + { + return OC_STACK_ERROR; + } + if (OC_STACK_OK == ConvertStrToUuid(str, &tmp->subjectuuid)) + { + env->ReleaseStringUTFChars(jData, str); + } + else + { + return OC_STACK_ERROR; + } + + jint perm = (jint)env->CallIntMethod(element, g_mid_OcOicSecAcl_ace_get_permissions); + tmp->permission = (uint16_t)perm; + if (nullptr == (tmp->resources = getResourcesList(env, element))) + { + return OC_STACK_ERROR; + } + + tmp->validities = NULL; //TODO Seems Validities CBOR conversion is broken in C stack +#if 0 + if (nullptr == (tmp->validities = getValiditiesList(env, element))) + { + return OC_STACK_ERROR; + } +#endif + if (NULL == acesHead) + { + acesHead = tmp; + } + else + { + OicSecAce_t *ptr = acesHead; + while(ptr->next != NULL) ptr = ptr->next; + ptr->next = tmp; + tmp->next = NULL; + } + } + acl->aces = acesHead; + return OC_STACK_OK; +} + +OCStackResult JniSecureUtils::convertJavaPdACLToOCAcl(JNIEnv *env, jobject in, OicSecPdAcl_t *pdacl) +{ + jstring jData; + jvalue args[1]; + + jint jCount = (jint) env->CallIntMethod(in, g_mid_OcOicSecPdAcl_get_resources_cnt); if (!jCount || env->ExceptionCheck()) { return OC_STACK_ERROR; } - acl->resourcesLen = jCount; - acl->resources = new char*[jCount]; + pdacl->resourcesLen = jCount; + pdacl->resources = new char*[jCount]; + + if (!pdacl->resources) + { + return OC_STACK_ERROR; + } for (jint i = 0; i < jCount; ++i) { args[0].i = i; - jData = (jstring) env->CallObjectMethodA(in, g_mid_OcOicSecAcl_get_resources, args); + jData = (jstring) env->CallObjectMethodA(in, g_mid_OcOicSecPdAcl_get_resources, args); if (!jData || env->ExceptionCheck()) { return OC_STACK_ERROR; } - acl->resources[i] = (char*) env->GetStringUTFChars(jData, 0); + pdacl->resources[i] = (char*) env->GetStringUTFChars(jData, 0); } - jCount = (jint) env->CallIntMethod(in, g_mid_OcOicSecAcl_get_permission); + jCount = (jint) env->CallIntMethod(in, g_mid_OcOicSecPdAcl_get_permission); if (env->ExceptionCheck()) { return OC_STACK_ERROR; } - acl->permission = jCount; - jCount = (jint) env->CallIntMethod(in, g_mid_OcOicSecAcl_get_periods_cnt); + pdacl->permission = jCount; + jCount = (jint) env->CallIntMethod(in, g_mid_OcOicSecPdAcl_get_periods_cnt); if (env->ExceptionCheck()) { return OC_STACK_ERROR; } - acl->prdRecrLen = jCount; - acl->periods = new char*[jCount]; + pdacl->prdRecrLen = jCount; + if (jCount) + { + pdacl->periods = new char*[jCount]; + if (!pdacl->periods) + { + return OC_STACK_ERROR; + } + } for (jint i = 0; i < jCount; ++i) { args[0].i = i; - jData = (jstring) env->CallObjectMethodA(in, g_mid_OcOicSecAcl_get_periods, args); + jData = (jstring) env->CallObjectMethodA(in, g_mid_OcOicSecPdAcl_get_periods, args); if (!jData || env->ExceptionCheck()) { return OC_STACK_ERROR; } - acl->periods[i] = (char*) env->GetStringUTFChars(jData, 0); + pdacl->periods[i] = (char*) env->GetStringUTFChars(jData, 0); } - acl->recurrences = new char*[jCount]; //TODO:Period Len and Reccurence len is same + if (jCount) + { + pdacl->recurrences = new char*[jCount]; + if (!pdacl->recurrences) + { + return OC_STACK_ERROR; + } + } for (jint i = 0; i < jCount; ++i) { args[0].i = i; - jData = (jstring) env->CallObjectMethodA(in, g_mid_OcOicSecAcl_get_recurrences, args); + jData = (jstring) env->CallObjectMethodA(in, g_mid_OcOicSecPdAcl_get_recurrences, args); if (!jData || env->ExceptionCheck()) { return OC_STACK_ERROR; } - acl->recurrences[i] = (char*) env->GetStringUTFChars(jData, 0); - } - - jData = (jstring) env->CallObjectMethod(in, g_mid_OcOicSecAcl_get_rownerID); - if (!jData || env->ExceptionCheck()) - { - return OC_STACK_ERROR; - } - - str = (char*) env->GetStringUTFChars(jData, 0); - - if (OC_STACK_OK == ConvertStrToUuid(str, &acl->rownerID)) - { - env->ReleaseStringUTFChars(jData, str); - } - else - { - return OC_STACK_ERROR; + pdacl->recurrences[i] = (char*) env->GetStringUTFChars(jData, 0); } - return OC_STACK_OK; } diff --git a/android/android_api/base/jni/JniSecureUtils.h b/android/android_api/base/jni/JniSecureUtils.h index c239c44..c16457d 100644 --- a/android/android_api/base/jni/JniSecureUtils.h +++ b/android/android_api/base/jni/JniSecureUtils.h @@ -29,10 +29,12 @@ class JniSecureUtils static std::string convertUUIDtoStr(OicUuid_t uuid); static void convertStrToUUID(char *str, OicUuid_t &uuid); public: + static void FreeACLList(OicSecAcl_t *acl); static jobject convertProvisionresultVectorToJavaList(JNIEnv *, const OC::PMResultList_t *); static jobjectArray convertDeviceVectorToJavaArray(JNIEnv *env, std::vector>& deviceListVector); static jobject convertUUIDVectorToJavaStrList(JNIEnv *env, OC::UuidList_t &vector); static OCStackResult convertJavaACLToOCAcl(JNIEnv *env, jobject in, OicSecAcl_t *out); + static OCStackResult convertJavaPdACLToOCAcl(JNIEnv *env, jobject in, OicSecPdAcl_t *pdacl); }; diff --git a/android/android_api/base/src/androidTest/java/org/iotivity/base/SmokeTest.java b/android/android_api/base/src/androidTest/java/org/iotivity/base/SmokeTest.java index 9645343..4842eca 100644 --- a/android/android_api/base/src/androidTest/java/org/iotivity/base/SmokeTest.java +++ b/android/android_api/base/src/androidTest/java/org/iotivity/base/SmokeTest.java @@ -25,6 +25,7 @@ package org.iotivity.base; import android.test.InstrumentationTestCase; import android.util.Log; +import java.util.Arrays; import java.util.Date; import java.util.EnumSet; import java.util.HashMap; @@ -1048,7 +1049,10 @@ public class SmokeTest extends InstrumentationTestCase { } }; - OcDeviceInfo devInfo = new OcDeviceInfo("myDeviceName"); + OcDeviceInfo devInfo = new OcDeviceInfo( + "myDeviceName", + Arrays.asList(new String[]{"oic.d.test"}) + ); try { //server diff --git a/android/android_api/base/src/main/java/org/iotivity/base/OcDeviceInfo.java b/android/android_api/base/src/main/java/org/iotivity/base/OcDeviceInfo.java index 4a89856..062405f 100644 --- a/android/android_api/base/src/main/java/org/iotivity/base/OcDeviceInfo.java +++ b/android/android_api/base/src/main/java/org/iotivity/base/OcDeviceInfo.java @@ -22,20 +22,27 @@ package org.iotivity.base; +import java.util.List; + /** - * This class is expected as input for device properties. Device name is mandatory and expected - * from the application. Device id of type UUID will be generated by the stack. + * This class is expected as input for device properties. Device name and types are mandatory + * and expected from the application. Device id of type UUID will be generated by the stack. */ public class OcDeviceInfo { private String mDeviceName; + private List mDeviceTypes; - public OcDeviceInfo(String deviceName) { - + public OcDeviceInfo(String deviceName, List deviceTypes) { this.mDeviceName = deviceName; + this.mDeviceTypes = deviceTypes; } public String getDeviceName() { return mDeviceName; } + + public List getDeviceTypes() { + return mDeviceTypes; + } } diff --git a/android/android_api/base/src/main/java/org/iotivity/base/OcDirectPairDevice.java b/android/android_api/base/src/main/java/org/iotivity/base/OcDirectPairDevice.java new file mode 100644 index 0000000..aff3238 --- /dev/null +++ b/android/android_api/base/src/main/java/org/iotivity/base/OcDirectPairDevice.java @@ -0,0 +1,113 @@ +/* + * //****************************************************************** + * // + * // Copyright 2016 Samsung Electronics All Rights Reserved. + * // + * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + * // + * // Licensed under the Apache License, Version 2.0 (the "License"); + * // you may not use this file except in compliance with the License. + * // You may obtain a copy of the License at + * // + * // http://www.apache.org/licenses/LICENSE-2.0 + * // + * // Unless required by applicable law or agreed to in writing, software + * // distributed under the License is distributed on an "AS IS" BASIS, + * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * // See the License for the specific language governing permissions and + * // limitations under the License. + * // + * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + */ + +package org.iotivity.base; + +import java.util.List; +import java.util.EnumSet; +import java.util.Map; +import java.util.Arrays; +import java.util.ArrayList; + +public class OcDirectPairDevice { + + + private long mNativeHandle; + private String mdeviceID; + private String mHost; + + private OcDirectPairDevice(long nativeHandle) { + this.mNativeHandle = nativeHandle; + } + + public OcDirectPairDevice(String deviceID) + { + this.mdeviceID = deviceID; + } + + public String getDevId() + { + return this.mdeviceID; + } + + public native String getHost(); + + public List getPairingMethodList() { + int [] intList = this.getPairingMethods(); + List prmList = new ArrayList(); + for (int i = 0; i < intList.length; i++) + { + prmList.add(intList[i]); + } + return prmList; + } + + private native int[] getPairingMethods(); + + /** + * Method to get the connectivity type of this resource + * + * @return EnumSet connectivity type set + */ + public EnumSet getConnectivityTypeSet() { + return OcConnectivityType.convertToEnumSet( + this.getConnectivityTypeN() + ); + } + + private native int getConnectivityTypeN(); + + + /** + * Method to get list of all paired devices for a given device. + * + * @param GetDirectPairedListener Callback function, which will receive the list of direct paired devices. + * @throws OcException + */ + + public native void getDirectPairedDevices(GetDirectPairedListener getDirectPairedListener) throws OcException; + + public interface GetDirectPairedListener { + public void getDirectPairedListener(List ocPairedDeviceList); + } + + /** + * Method to perform direct pairing between two devices. + * + * @param DirectPairingListener Callback function, which will be called after + * completion of direct pairing. + * @throws OcException + */ + public native void doDirectPairing(OcDirectPairDevice peer, + OcPrmType pmSel, String pinNumber, + DirectPairingListener directPairingListener) throws OcException; + + + public interface DirectPairingListener { + public void directPairingListener(String devId, int result); + } + + @Override + public String toString() { + return this.mdeviceID; + } +} diff --git a/android/android_api/base/src/main/java/org/iotivity/base/OcHeaderOption.java b/android/android_api/base/src/main/java/org/iotivity/base/OcHeaderOption.java index d672bf0..6bf442f 100644 --- a/android/android_api/base/src/main/java/org/iotivity/base/OcHeaderOption.java +++ b/android/android_api/base/src/main/java/org/iotivity/base/OcHeaderOption.java @@ -30,19 +30,30 @@ import java.security.InvalidParameterException; * After creating instances of OcHeaderOptions, use setHeaderOptions API * (in OcResource) to set header Options. * NOTE: optionId is an integer value which MUST be within - * range of 2048 to 3000 inclusive of lower and upper bound. + * range of 2048 to 3000 inclusive of lower and upper bound + * except for a few options including If-Match with empty(num : 1), + * If-None-Match(num : 5), Location-Path(num : 8), + * Location-Query(num : 20) CoAP option. * HeaderOption instance creation fails if above condition is not satisfied. */ public class OcHeaderOption { public static final int MIN_HEADER_OPTION_ID = 2048; public static final int MAX_HEADER_OPTION_ID = 3000; + public static final int IF_MATCH_OPTION_ID = 1; + public static final int IF_NONE_MATCH_OPTION_ID = 5; + public static final int LOCATION_PATH_OPTION_ID = 8; + public static final int LOCATION_QUERY_OPTION_ID = 20; private int mOptionId; private String mOptionData; public OcHeaderOption(int optionId, String optionData) { - if (!(optionId >= MIN_HEADER_OPTION_ID && optionId <= MAX_HEADER_OPTION_ID)) { + if (!(optionId >= MIN_HEADER_OPTION_ID && optionId <= MAX_HEADER_OPTION_ID) + && optionId != IF_MATCH_OPTION_ID + && optionId != IF_NONE_MATCH_OPTION_ID + && optionId != LOCATION_PATH_OPTION_ID + && optionId != LOCATION_QUERY_OPTION_ID) { throw new InvalidParameterException("Option ID range is invalid"); } diff --git a/android/android_api/base/src/main/java/org/iotivity/base/OcPlatform.java b/android/android_api/base/src/main/java/org/iotivity/base/OcPlatform.java index c8678ff..76cd649 100644 --- a/android/android_api/base/src/main/java/org/iotivity/base/OcPlatform.java +++ b/android/android_api/base/src/main/java/org/iotivity/base/OcPlatform.java @@ -541,12 +541,16 @@ public final class OcPlatform { OcDeviceInfo ocDeviceInfo) throws OcException { OcPlatform.initCheck(); OcPlatform.registerDeviceInfo0( - ocDeviceInfo.getDeviceName() + ocDeviceInfo.getDeviceName(), + ocDeviceInfo.getDeviceTypes().toArray( + new String[ocDeviceInfo.getDeviceTypes().size()] + ) ); } private static native void registerDeviceInfo0( - String deviceName + String deviceName, + String[] deviceTypes ) throws OcException; /** @@ -897,6 +901,81 @@ public final class OcPlatform { throws OcException; /** + * Method to find all devices which are eligible for direct pairing and return the list. + * + * @param timeout timeout for discovering direct pair devices. + * @param FindDirectPairingListener Callback function, which will receive the list of direct + * pairable devices. + * @throws OcException + */ + public static native void findDirectPairingDevices(int timeout, + FindDirectPairingListener onFindDirectPairingListener) throws OcException; + + /** + * Method to get list of all paired devices for a given device. + * + * @param GetDirectPairedListener Callback function, which will receive the list of direct + * paired devices. + * @throws OcException + */ + public native void getDirectPairedDevices(GetDirectPairedListener onGetDirectPairedListener) + throws OcException; + + /** + * Method to perform direct pairing between two devices. + * + * @param peer Target peer + * @param prmType Pairing Method to be used for Pairing + * @param pin pin + * @param DirectPairingListener Callback function, which will be called after + * completion of direct pairing. + * @throws OcException + */ + public static void doDirectPairing( + OcDirectPairDevice peer, + OcPrmType prmType, + String pin, + DirectPairingListener onDirectPairingListener) throws OcException { + + OcPlatform.doDirectPairing0( + peer, + prmType.getValue(), + pin, + onDirectPairingListener + ); + } + + private static native void doDirectPairing0(OcDirectPairDevice peer, + int pmSel, String pinNumber, DirectPairingListener onDirectPairingListener) + throws OcException; + + /** + * An FindDirectPairingListener can be registered via the OcPlatform.findDirectPairingDevices call. + * Event listeners are notified asynchronously + */ + public interface FindDirectPairingListener { + public void onFindDirectPairingListener(List ocPairedDeviceList); + } + + /** + * Listerner to Get List of already Direct Paired devices. + * An GetDirectPairedListener can be registered via the OcPlatform.getDirectPairedDevices call. + * Event listeners are notified asynchronously + */ + public interface GetDirectPairedListener { + public void onGetDirectPairedListener(List ocPairedDeviceList); + } + + /** + * Listner to get result of doDirectPairing. + * An DirectPairingListener can be registered via the OcPlatform.doDirectPairing call. + * Event listeners are notified asynchronously + */ + public interface DirectPairingListener { + public void onDirectPairingListener(String devId, int result); + } + + /** * An OnResourceFoundListener can be registered via the OcPlatform.findResource call. * Event listeners are notified asynchronously */ diff --git a/android/android_api/base/src/main/java/org/iotivity/base/OcPrmType.java b/android/android_api/base/src/main/java/org/iotivity/base/OcPrmType.java new file mode 100755 index 0000000..2c2b37f --- /dev/null +++ b/android/android_api/base/src/main/java/org/iotivity/base/OcPrmType.java @@ -0,0 +1,58 @@ +/* + * //****************************************************************** + * // + * // Copyright 2016 Samsung Electronics All Rights Reserved. + * // + * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + * // + * // Licensed under the Apache License, Version 2.0 (the "License"); + * // you may not use this file except in compliance with the License. + * // You may obtain a copy of the License at + * // + * // http://www.apache.org/licenses/LICENSE-2.0 + * // + * // Unless required by applicable law or agreed to in writing, software + * // distributed under the License is distributed on an "AS IS" BASIS, + * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * // See the License for the specific language governing permissions and + * // limitations under the License. + * // + * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + */ +/** + * @brief direct pairing Method Type. + * 0: not allowed + * 1: pre-configured pin + * 2: random pin + */ +package org.iotivity.base; + +public enum OcPrmType { + DP_INVALID (-1), + DP_NOT_ALLOWED (0), + DP_PRE_CONFIGURED (1 << 0), + DP_RANDOM_PIN (1 << 1); + + private int value; + + private OcPrmType(int value) { + this.value = value; + } + + public int getValue() { + return this.value; + } + + public static OcPrmType convertOcPrmType(int value) { + switch (value) + { + case 0: + return OcPrmType.DP_NOT_ALLOWED; + case 1: + return OcPrmType.DP_PRE_CONFIGURED; + case 2: + return OcPrmType.DP_RANDOM_PIN; + } + return OcPrmType.DP_INVALID; + } +} diff --git a/android/android_api/base/src/main/java/org/iotivity/base/OcSecureResource.java b/android/android_api/base/src/main/java/org/iotivity/base/OcSecureResource.java index 218b9e2..b1daf6c 100644 --- a/android/android_api/base/src/main/java/org/iotivity/base/OcSecureResource.java +++ b/android/android_api/base/src/main/java/org/iotivity/base/OcSecureResource.java @@ -131,6 +131,46 @@ public class OcSecureResource { ProvisionPairwiseDevicesListener provisionPairwiseDevicesListener) throws OcException; /** + * Method to configure resource for direct pairing + * + * @param pin pin number + * @param pdacls Array of Device Pairing Access Control List + * @param type List of supported OcPrmType + * @param edp enable (1) / disable (0) + * @param ProvisionDirectPairing Callback function, which will be called after completion + * of Direct Pairing. + * @throws OcException + */ + + public void doProvisionDirectPairing(String pin, OicSecPdAcl[] pdacls, List type, + boolean edp , ProvisionDirectPairingListener provisionDirectPairingListener) + throws OcException { + + int[] typeArray = new int[type.size()]; + int i = 0; + for (OcPrmType ocPrmType:type) { + typeArray[i++] = ocPrmType.getValue(); + } + + this.provisionDirectPairing(pin, pdacls, typeArray, (edp?1:0), + provisionDirectPairingListener); + } + + private native void provisionDirectPairing(String pin, OicSecPdAcl[] pdacls, int[] type, + int edp , ProvisionDirectPairingListener provisionDirectPairingListener) + throws OcException; + + /** + * provisionDirectPairingListener can be registered with doOwnershipTransfer + * call. + * Listener notified asynchronously. + */ + public interface ProvisionDirectPairingListener { + public void provisionDirectPairingListener(List provisionResultList, + int hasError); + } + + /** * doOwnershipTransferListener can be registered with doOwnershipTransfer * call. * Listener notified asynchronously. diff --git a/android/android_api/base/src/main/java/org/iotivity/base/OicSecAce.java b/android/android_api/base/src/main/java/org/iotivity/base/OicSecAce.java new file mode 100644 index 0000000..a5bd53f --- /dev/null +++ b/android/android_api/base/src/main/java/org/iotivity/base/OicSecAce.java @@ -0,0 +1,80 @@ +/* + ******************************************************************* + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + *-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + */ + +package org.iotivity.base; + +import java.util.List; +public class OicSecAce { + private String subjectID; + private int permission; + private List resources; + private List validities; + + public OicSecAce(String subjectID, int permission, + List resources, List validities) { + super(); + this.subjectID = subjectID; + this.permission = permission; + this.resources = resources; + this.validities = validities; + } + + public String getSubjectID() { + return subjectID; + } + + public void setSubjectID(String subjectID) { + this.subjectID = subjectID; + } + + public int getPermission() { + return permission; + } + + public void setPermission(int permission) { + this.permission = permission; + } + + public List getResourcesList() { + return resources; + } + + public OicSecResr[] getResources() { + return resources.toArray(new OicSecResr[resources.size()]); + } + public void setResources(List resources) { + this.resources = resources; + } + + public List getValiditiesList() { + return validities; + } + + public OicSecValidity[] getValidities() { + return validities.toArray(new OicSecValidity[validities.size()]); + } + + + public void setValidities(List validities) { + this.validities = validities; + } +} diff --git a/android/android_api/base/src/main/java/org/iotivity/base/OicSecAcl.java b/android/android_api/base/src/main/java/org/iotivity/base/OicSecAcl.java index a47ffaa..f0fdc72 100644 --- a/android/android_api/base/src/main/java/org/iotivity/base/OicSecAcl.java +++ b/android/android_api/base/src/main/java/org/iotivity/base/OicSecAcl.java @@ -1,116 +1,55 @@ -/* - * //****************************************************************** - * // - * // Copyright 2015 Samsung Electronics All Rights Reserved. - * // - * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - * // - * // Licensed under the Apache License, Version 2.0 (the "License"); - * // you may not use this file except in compliance with the License. - * // You may obtain a copy of the License at - * // - * // http://www.apache.org/licenses/LICENSE-2.0 - * // - * // Unless required by applicable law or agreed to in writing, software - * // distributed under the License is distributed on an "AS IS" BASIS, - * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * // See the License for the specific language governing permissions and - * // limitations under the License. - * // - * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - */ - -package org.iotivity.base; - -import java.io.Serializable; -import java.util.List; -import java.util.Arrays; - -public class OicSecAcl implements Serializable { - - private String subject; - private int permission; - private List resources; - private List periods; - private List recurrences; - private String rownerID; - - public OicSecAcl(String subject, List recurrences, List periods, int permission, - List resources, String rownerID) { - this.subject = subject; - this.recurrences = recurrences; - this.periods = periods; - this.permission = permission; - this.resources = resources; - this.rownerID = rownerID; - } - - public String getSubject() { - return this.subject; - } - - public void setSubject(String subject) { - this.subject = subject; - } - - - public void setRownerID(String rownerID) { - this.rownerID = rownerID; - } - - public List getRecurrences() { - return recurrences; - } - - public void setRecurrences(List recurrences) { - this.recurrences = recurrences; - } - - public List getPeriods() { - return periods; - } - - public void setPeriods(List periods) { - this.periods = periods; - } - - public int getPermission() { - return this.permission; - } - - public void setPermission(int permission) { - this.permission = permission; - } - - public List getResources() { - return resources; - } - - public void setResources(List resources) { - this.resources = resources; - } - - public int getResourcesCount() { - return this.resources.size(); - } - - public String getResources(int i) { - return this.resources.get(i); - } - - public int getPeriodsCount() { - return this.periods.size(); - } - - public String getPeriods(int i) { - return this.periods.get(i); - } - - public String getRecurrences(int i) { - return this.recurrences.get(i); - } - - public String getRownerID() { - return this.rownerID; - } -} +/* + ******************************************************************* + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + *-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + */ + +package org.iotivity.base; + +import java.util.List; + +public class OicSecAcl { + private String rownerID; + private List oicSecAces; + + public OicSecAcl (String rownerID, List oicSecAces) { + super(); + this.rownerID = rownerID; + this.oicSecAces = oicSecAces; + } + public String getRownerID() { + return rownerID; + } + + public void setRownerID(String rownerID) { + this.rownerID = rownerID; + } + + public List getOicSecAcesList() { + return oicSecAces; + } + + public OicSecAce[] getOicSecAces() { + return oicSecAces.toArray(new OicSecAce[oicSecAces.size()]); + } + + public void setOicSecAces(List oicSecAces) { + this.oicSecAces = oicSecAces; + } +} diff --git a/android/android_api/base/src/main/java/org/iotivity/base/OicSecPdAcl.java b/android/android_api/base/src/main/java/org/iotivity/base/OicSecPdAcl.java new file mode 100644 index 0000000..5768123 --- /dev/null +++ b/android/android_api/base/src/main/java/org/iotivity/base/OicSecPdAcl.java @@ -0,0 +1,95 @@ +/* + * //****************************************************************** + * // + * // Copyright 2016 Samsung Electronics All Rights Reserved. + * // + * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + * // + * // Licensed under the Apache License, Version 2.0 (the "License"); + * // you may not use this file except in compliance with the License. + * // You may obtain a copy of the License at + * // + * // http://www.apache.org/licenses/LICENSE-2.0 + * // + * // Unless required by applicable law or agreed to in writing, software + * // distributed under the License is distributed on an "AS IS" BASIS, + * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * // See the License for the specific language governing permissions and + * // limitations under the License. + * // + * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + */ + +package org.iotivity.base; + +import java.io.Serializable; +import java.util.List; +import java.util.Arrays; + +public class OicSecPdAcl implements Serializable { + + private int mPermission; + private List mResources; + private List mPeriods; + private List mRecurrences; + + public OicSecPdAcl(List recurrences, List periods, int permission, + List resources) { + this.mRecurrences = recurrences; + this.mPeriods = periods; + this.mPermission = permission; + this.mResources = resources; + } + + public List getRecurrences() { + return mRecurrences; + } + + public void setRecurrences(List recurrences) { + this.mRecurrences = recurrences; + } + + public List getPeriods() { + return mPeriods; + } + + public void setPeriods(List periods) { + this.mPeriods = periods; + } + + public int getPermission() { + return this.mPermission; + } + + public void setPermission(int permission) { + this.mPermission = permission; + } + + public List getResources() { + return mResources; + } + + public void setResources(List resources) { + this.mResources = resources; + } + + public int getResourcesCount() { + return this.mResources.size(); + } + + public String getResources(int i) { + return this.mResources.get(i); + } + + public int getPeriodsCount() { + return this.mPeriods.size(); + } + + public String getPeriods(int i) { + return this.mPeriods.get(i); + } + + public String getRecurrences(int i) { + return this.mRecurrences.get(i); + } +} diff --git a/android/android_api/base/src/main/java/org/iotivity/base/OicSecResr.java b/android/android_api/base/src/main/java/org/iotivity/base/OicSecResr.java new file mode 100644 index 0000000..490462e --- /dev/null +++ b/android/android_api/base/src/main/java/org/iotivity/base/OicSecResr.java @@ -0,0 +1,102 @@ +/* + ******************************************************************* + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + *-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + */ + +package org.iotivity.base; + +import java.util.List; +public class OicSecResr { + + private String href; + private String rel; + private List types; + private int typeLen; + private List interfaces; + private int interfaceLen; + + public OicSecResr(String href, String rel, List types, int typeLen, + List interfaces, int interfaceLen) { + super(); + this.href = href; + this.rel = rel; + this.types = types; + this.typeLen = typeLen; + this.interfaces = interfaces; + this.interfaceLen = interfaceLen; + } + + public String getHref() { + return href; + } + + public void setHref(String href) { + this.href = href; + } + + public String getRel() { + return rel; + } + + public void setRel(String rel) { + this.rel = rel; + } + + public List getTypesList() { + return types; + } + + public void setTypes(List types) { + this.types = types; + } + + public int getTypeLen() { + return typeLen; + } + + public void setTypeLen(int typeLen) { + this.typeLen = typeLen; + } + + public List getInterfacesList() { + return interfaces; + } + + public String getInterfaces(int i) { + return this.interfaces.get(i); + } + + public String getTypes(int i) { + return this.types.get(i); + } + + public void setInterfaces(List interfaces) { + this.interfaces = interfaces; + } + + public int getInterfaceLen() { + return interfaceLen; + } + + public void setInterfaceLen(int interfaceLen) { + this.interfaceLen = interfaceLen; + } + +} diff --git a/android/android_api/base/src/main/java/org/iotivity/base/OicSecValidity.java b/android/android_api/base/src/main/java/org/iotivity/base/OicSecValidity.java new file mode 100644 index 0000000..0846658 --- /dev/null +++ b/android/android_api/base/src/main/java/org/iotivity/base/OicSecValidity.java @@ -0,0 +1,67 @@ +/* + ******************************************************************* + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + *-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + */ + +package org.iotivity.base; + +import java.util.List; +public class OicSecValidity { + private String period; + private List recurrences; + private int recurrenceLen; + + public OicSecValidity(String period, List recurrences, + int recurrenceLen) { + super(); + this.period = period; + this.recurrences = recurrences; + this.recurrenceLen = recurrenceLen; + } + + public String getPeriod() { + return period; + } + + public void setPeriod(String period) { + this.period = period; + } + + public List getRecurrencesList() { + return recurrences; + } + + public String getRecurrences(int i) { + return this.recurrences.get(i); + } + + public void setRecurrences(List recurrences) { + this.recurrences = recurrences; + } + + public int getRecurrenceLen() { + return recurrenceLen; + } + + public void setRecurrenceLen(int recurrenceLen) { + this.recurrenceLen = recurrenceLen; + } + +} diff --git a/android/android_api/base/src/main/java/org/iotivity/ca/CaIpInterface.java b/android/android_api/base/src/main/java/org/iotivity/ca/CaIpInterface.java index 81ab7d5..2314df9 100644 --- a/android/android_api/base/src/main/java/org/iotivity/ca/CaIpInterface.java +++ b/android/android_api/base/src/main/java/org/iotivity/ca/CaIpInterface.java @@ -73,16 +73,16 @@ public class CaIpInterface { private static BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - if (intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, - WifiManager.WIFI_STATE_UNKNOWN) == WifiManager.WIFI_STATE_DISABLED) { - caIpStateDisabled(); - } else if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { + if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { ConnectivityManager manager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo nwInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); + NetworkInfo wifiInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); + NetworkInfo mobileInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); - if(nwInfo.isConnected()) { + if (mobileInfo != null && mobileInfo.isConnected() || wifiInfo.isConnected()) { caIpStateEnabled(); + } else { + caIpStateDisabled(); } } diff --git a/android/android_api/base/src/main/java/org/iotivity/ca/CaLeClientInterface.java b/android/android_api/base/src/main/java/org/iotivity/ca/CaLeClientInterface.java index 0801bdb..8b383a7 100644 --- a/android/android_api/base/src/main/java/org/iotivity/ca/CaLeClientInterface.java +++ b/android/android_api/base/src/main/java/org/iotivity/ca/CaLeClientInterface.java @@ -41,7 +41,7 @@ import android.util.Log; public class CaLeClientInterface { private static String SERVICE_UUID = "ADE3D529-C784-4F63-A987-EB69F70EE816"; - private static String TAG = "Sample_Service : CaLeClientInterface"; + private static String TAG = "OIC_LE_CB_INTERFACE"; private static Context mContext; private CaLeClientInterface(Context context) { diff --git a/android/examples/DirectPairing/.classpath b/android/examples/DirectPairing/.classpath new file mode 100644 index 0000000..26bdfa6 --- /dev/null +++ b/android/examples/DirectPairing/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android/examples/DirectPairing/.project b/android/examples/DirectPairing/.project new file mode 100644 index 0000000..2dadd42 --- /dev/null +++ b/android/examples/DirectPairing/.project @@ -0,0 +1,33 @@ + + + Iot + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/android/examples/DirectPairing/DirectPairing.iml b/android/examples/DirectPairing/DirectPairing.iml new file mode 100644 index 0000000..5de258a --- /dev/null +++ b/android/examples/DirectPairing/DirectPairing.iml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/examples/DirectPairing/build.gradle b/android/examples/DirectPairing/build.gradle new file mode 100644 index 0000000..8499e31 --- /dev/null +++ b/android/examples/DirectPairing/build.gradle @@ -0,0 +1,38 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 21 + buildToolsVersion "20.0.0" + + defaultConfig { + applicationId "org.iotivity.base.examples.DirectPairing" + minSdkVersion 21 + targetSdkVersion 21 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + lintOptions { + abortOnError false + } +} +repositories { + flatDir { + dirs "../../android_api/base/build/outputs/aar/" + } +} + +try { + dependencies { + compile ":iotivity-base-${TARGET_ARCH}-${RELEASE}@aar" + } +} catch (all) { + print "${ERROR_MSG}" + assert all +} + diff --git a/android/examples/DirectPairing/project.properties b/android/examples/DirectPairing/project.properties new file mode 100644 index 0000000..8e02666 --- /dev/null +++ b/android/examples/DirectPairing/project.properties @@ -0,0 +1,15 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +# Project target. +target=android-23 +android.library.reference.1=../appcompat_v7 diff --git a/android/examples/DirectPairing/src/main/AndroidManifest.xml b/android/examples/DirectPairing/src/main/AndroidManifest.xml new file mode 100644 index 0000000..54ec6b9 --- /dev/null +++ b/android/examples/DirectPairing/src/main/AndroidManifest.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + diff --git a/android/examples/DirectPairing/src/main/assets/oic_svr_db_client_directpairing.dat b/android/examples/DirectPairing/src/main/assets/oic_svr_db_client_directpairing.dat new file mode 100644 index 0000000000000000000000000000000000000000..43b7a1c5c8c4fd2c89a669014ac050c3c3ded40f GIT binary patch literal 778 zcmb7>OHRWu5Qh7ZI0-AHCV-#|@Au3<;}6K7yc~W$M*nMlh zEkg*g&`Z@R(+aAlPY@V#nd?!MTZLa~5C3i9VRzger$>d=Hx=6O0n1~Su#5DJO(S-m zCQ&+Jr%_1wiy=#sgiTY1jiK4 mGroupList; + private List mChilditemsList; + private Context mContext; + + public ExpandableListAdapter(List groupList, List childitemsList, + Context context) { + super(); + this.mContext = context; + this.mGroupList = groupList; + this.mChilditemsList = childitemsList; + } + + @Override + public int getGroupCount() { + return mGroupList.size(); + } + + @Override + public int getChildrenCount(int groupPosition) { + return 1; + } + + @Override + public Object getGroup(int groupPosition) { + return mGroupList.get(groupPosition); + } + + @Override + public Object getChild(int groupPosition, int childPosition) { + return this.mChilditemsList.get(childPosition); + } + + @Override + public long getGroupId(int groupPosition) { + return groupPosition; + } + + @Override + public long getChildId(int groupPosition, int childPosition) { + return childPosition; + } + + @Override + public boolean hasStableIds() { + return false; + } + + @Override + public View getGroupView(int groupPosition, boolean isExpanded, + View convertView, ViewGroup parent) { + + String data = (String) getGroup(groupPosition); + if (convertView == null) { + LayoutInflater infalInflater = (LayoutInflater) this.mContext + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + convertView = infalInflater.inflate(R.layout.list_group, null); + } + + ImageView img = (ImageView) convertView.findViewById(R.id.image); + if (isExpanded) { + img.setImageResource(R.drawable.arrow_down); + + } else { + img.setImageResource(R.drawable.arrow_right); + } + + TextView groupText = (TextView) convertView.findViewById(R.id.title); + groupText.setText(mGroupList.get(groupPosition)); + + return convertView; + } + + @Override + public View getChildView(int groupPosition, int childPosition, boolean isLastChild, + View convertView, ViewGroup parent) { + LayoutInflater inflater = (LayoutInflater) mContext + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + convertView = inflater.inflate(R.layout.list_item, parent, false); + + Led ledResource = (Led) getChild(groupPosition, childPosition); + TextView textItem = (TextView) convertView + .findViewById(R.id.textViewItem); + TextView textSource = (TextView) convertView + .findViewById(R.id.textViewSource); + TextView textStatus = (TextView) convertView + .findViewById(R.id.textViewStatus); + textStatus.setText("URI:" + "/a/led"); + textItem.setText("State: " + ledResource.getState()); + textSource.setText("Power: " + ledResource.getPower()); + + return convertView; + + } + + @Override + public boolean isChildSelectable(int groupPosition, int childPosition) { + return true; + } + +} diff --git a/android/examples/DirectPairing/src/main/java/org/iotivity/base/examples/DirectPairing/Led.java b/android/examples/DirectPairing/src/main/java/org/iotivity/base/examples/DirectPairing/Led.java new file mode 100644 index 0000000..f44f97c --- /dev/null +++ b/android/examples/DirectPairing/src/main/java/org/iotivity/base/examples/DirectPairing/Led.java @@ -0,0 +1,66 @@ +/* + * //****************************************************************** + * // + * // Copyright 2016 Samsung Electronics All Rights Reserved. + * // + * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + * // + * // Licensed under the Apache License, Version 2.0 (the "License"); + * // you may not use this file except in compliance with the License. + * // You may obtain a copy of the License at + * // + * // http://www.apache.org/licenses/LICENSE-2.0 + * // + * // Unless required by applicable law or agreed to in writing, software + * // distributed under the License is distributed on an "AS IS" BASIS, + * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * // See the License for the specific language governing permissions and + * // limitations under the License. + * // + * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + */ +package org.iotivity.base.examples.DirectPairing; + +/** + * Led + *

+ * This class is used by simpleclient to create an object and update the values depending + * on the server response + */ +public class Led { + private boolean mState; + private int mPower; + private String mUri; + + // constructor + public Led() { + mState = false; + mPower = 0; + mUri = ""; + } + + // accessor methods + public boolean getState() { + return mState; + } + + public void setState(boolean state) { + mState = state; + } + + public int getPower() { + return mPower; + } + + public void setPower(int power) { + mPower = power; + } + + public String getUri() { + return mUri; + } + + public void setUri(String uri) { + mUri = uri; + } +} diff --git a/android/examples/DirectPairing/src/main/java/org/iotivity/base/examples/DirectPairing/MainActivity.java b/android/examples/DirectPairing/src/main/java/org/iotivity/base/examples/DirectPairing/MainActivity.java new file mode 100644 index 0000000..90c4301 --- /dev/null +++ b/android/examples/DirectPairing/src/main/java/org/iotivity/base/examples/DirectPairing/MainActivity.java @@ -0,0 +1,534 @@ +/* + * //****************************************************************** + * // + * // Copyright 2016 Samsung Electronics All Rights Reserved. + * // + * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + * // + * // Licensed under the Apache License, Version 2.0 (the "License"); + * // you may not use this file except in compliance with the License. + * // You may obtain a copy of the License at + * // + * // http://www.apache.org/licenses/LICENSE-2.0 + * // + * // Unless required by applicable law or agreed to in writing, software + * // distributed under the License is distributed on an "AS IS" BASIS, + * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * // See the License for the specific language governing permissions and + * // limitations under the License. + * // + * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + */ +package org.iotivity.base.examples.DirectPairing; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.ProgressDialog; +import android.content.DialogInterface; +import android.content.SharedPreferences; +import android.graphics.Color; +import android.os.AsyncTask; +import android.os.Bundle; +import android.os.Environment; +import android.preference.PreferenceManager; +import android.text.InputFilter; +import android.util.Log; +import android.view.View; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CompoundButton; +import android.widget.EditText; +import android.widget.ExpandableListView; +import android.widget.ExpandableListView.OnGroupExpandListener; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.Switch; +import android.widget.Toast; + +import org.iotivity.base.ModeType; +import org.iotivity.base.OcDirectPairDevice; +import org.iotivity.base.OcException; +import org.iotivity.base.OcHeaderOption; +import org.iotivity.base.OcPlatform; +import org.iotivity.base.OcPrmType; +import org.iotivity.base.OcProvisioning; +import org.iotivity.base.OcRepresentation; +import org.iotivity.base.OcResource; +import org.iotivity.base.PlatformConfig; +import org.iotivity.base.QualityOfService; +import org.iotivity.base.ServiceType; +import org.iotivity.base.examples.DirectPairing.Led; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.channels.FileChannel; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +public class MainActivity extends Activity { + private static final int BUFFER_SIZE = 1024; + private static final String TAG = "DirectPairing: "; + private static int selected = -1; + private int[] pList; + private Button save; + private int prmType; + private EditText pinText; + private Led ledResource; + private ListView mListView; + private String filePath = ""; + private OcResource led = null; + private Switch discoverButton; + private List resourceInterfaces; + private ArrayAdapter arrayAdapter; + private List onGetResponseList; + private ExpandableListAdapter exlistAdapter; + OcResource.OnGetListener onGetListener = new OcResource.OnGetListener() { + @Override + public synchronized void onGetCompleted(List headerOptionList, + OcRepresentation ocRepresentation) { + onGetResponseList = new ArrayList(); + ledResource.setState(ocRepresentation.getValueBool("state")); + ledResource.setPower(ocRepresentation.getValueInt("power")); + ledResource.setUri(ocRepresentation.getUri()); + runOnUiThread(new Runnable() { + public void run() { + onGetResponseList.add(ledResource); + exlistAdapter.notifyDataSetChanged(); + } + }); + + Log.d(TAG, "Got a response from " + ocRepresentation.getUri() + + " " + ocRepresentation.getValueBool("state") + " " + + ocRepresentation.getValueInt("power") + " " + + ocRepresentation.getValueString("name")); + } + + @Override + public synchronized void onGetFailed(Throwable throwable) { + Log.d(TAG, "GET request has failed"); + Log.e(TAG, throwable.toString()); + } + }; + private ExpandableListView mPairedListDisplay; + private ArrayAdapter adapter; + private List pairedList; + private List discoveredListObj; + OcPlatform.DirectPairingListener doDPListener = new OcPlatform.DirectPairingListener() { + @Override + public void onDirectPairingListener(String devId, int result) { + Log.d(TAG, "Inside getDPListener"); + if (result == StringConstants.SUCCES_CODE) { + pairedList.clear(); + pairedList.add(devId); + onGetResponseList.add(new Led()); + runOnUiThread(new Runnable() { + public void run() { + mPairedListDisplay.setAdapter(exlistAdapter); + int pos = mListView.getCheckedItemPosition(); + if (pos != ListView.INVALID_POSITION && discoveredListObj.size() != 0) { + discoveredListObj.remove(pos); + adapter.notifyDataSetChanged(); + } + } + }); + Log.d(TAG, "direct pair successfull for " + devId); + } else { + Log.d(TAG, "direct pairing failed"); + runOnUiThread(new Runnable() { + public void run() { + Toast.makeText(getApplicationContext(), + "Direct Pairing Failed", Toast.LENGTH_SHORT).show(); + } + }); + } + exportCBOR(); + } + }; + private List discoveredPairableDevices; + OcPlatform.FindDirectPairingListener finddirectPairing = + new OcPlatform.FindDirectPairingListener() { + @Override + public void onFindDirectPairingListener(List direcPairingDevice) { + Log.d(TAG, "find direct pairable successfull "); + discoveredListObj.clear(); + discoveredPairableDevices = + new ArrayList(direcPairingDevice); + for (int i = 0; i < direcPairingDevice.size(); i++) { + OcDirectPairDevice dpPairDevice = direcPairingDevice.get(i); + Log.d(TAG, "getHost from Find Direct Pairing " + dpPairDevice.getHost()); + discoveredListObj.add(dpPairDevice); + } + + runOnUiThread(new Runnable() { + public void run() { + mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); + mListView.setAdapter(adapter); + discoverButton.setChecked(false); + } + }); + } + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + onGetResponseList = new ArrayList(); + discoveredListObj = new ArrayList(); + pairedList = new ArrayList(); + + ledResource = new Led(); + + mListView = (ListView) findViewById(R.id.list_view); + discoverButton = (Switch) findViewById(R.id.discover); + mPairedListDisplay = (ExpandableListView) findViewById(R.id.list_view_paired_list); + + + filePath = getFilesDir().getPath() + "/"; // data/data//files/ + //copy CBOR file when application runs first time + SharedPreferences wmbPreference = PreferenceManager.getDefaultSharedPreferences(this); + boolean isFirstRun = wmbPreference.getBoolean("FIRSTRUN", true); + if (isFirstRun) { + copyCborFromAsset(); + SharedPreferences.Editor editor = wmbPreference.edit(); + editor.putBoolean("FIRSTRUN", false); + editor.commit(); + } + + initOICStack(); + + adapter = new ArrayAdapter(this, + android.R.layout.simple_list_item_single_choice, + discoveredListObj); + + arrayAdapter = new ArrayAdapter( + MainActivity.this, + android.R.layout.select_dialog_singlechoice); + + save = (Button) findViewById(R.id.saveDiscovered); + + save.setEnabled(false); + save.setBackgroundColor(Color.GRAY); + + resourceInterfaces = new LinkedList<>(); + resourceInterfaces.add(OcPlatform.DEFAULT_INTERFACE); + + exlistAdapter = new ExpandableListAdapter(pairedList, onGetResponseList, + MainActivity.this); + mPairedListDisplay.setAdapter(exlistAdapter); + + // to expand only a single group item. + mPairedListDisplay.setOnGroupExpandListener(new OnGroupExpandListener() { + int previousGroup = -1; + + @Override + public void onGroupExpand(int groupPosition) { + Log.d(TAG, "Calling GET api on mResource"); + try { + if (null != led) led.get(new HashMap(), onGetListener); + } catch (OcException e) { + Log.d(TAG, "Error in GET calls"); + Log.e(TAG, e.getMessage()); + } + + if (groupPosition != previousGroup) + mPairedListDisplay.collapseGroup(previousGroup); + + previousGroup = groupPosition; + } + }); + + save.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + + AlertDialog.Builder alertPinDialog = + new AlertDialog.Builder(MainActivity.this); + alertPinDialog.setTitle("PIN"); + alertPinDialog.setMessage("Enter Pin"); + + pinText = new EditText(MainActivity.this); + int maxLength = 8; + InputFilter[] fArray = new InputFilter[1]; + fArray[0] = new InputFilter.LengthFilter(maxLength); + pinText.setFilters(fArray); + pinText.setMaxLines(1); + LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.MATCH_PARENT); + pinText.setLayoutParams(lp); + alertPinDialog.setView(pinText); + alertPinDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + selected = -1; + final AlertDialog alertPrmTypeDialog = new AlertDialog.Builder + (MainActivity.this) + .setSingleChoiceItems(arrayAdapter, -1, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + selected = which; + prmType = pList[which]; + Log.d(TAG, " prmType " + prmType); + } + }) + .setTitle("Select Direct Pair Method") + .setPositiveButton("OK", null) + .setNegativeButton("CANCEL", null) + .create(); + + alertPrmTypeDialog.setOnShowListener( + new DialogInterface.OnShowListener() { + @Override + public void onShow(DialogInterface dialog) { + Button ok = + alertPrmTypeDialog + .getButton(AlertDialog.BUTTON_POSITIVE); + + Button cancel = + alertPrmTypeDialog + .getButton(AlertDialog.BUTTON_NEGATIVE); + + ok.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + int pos = mListView.getCheckedItemPosition(); + if (selected == -1) { + Toast.makeText(getApplicationContext(), + "Please Select A Value", + Toast.LENGTH_SHORT).show(); + } else if (pos != ListView.INVALID_POSITION) { + if (!discoveredListObj.isEmpty()) { + try { + OcDirectPairDevice peer = + (OcDirectPairDevice) + discoveredListObj. + get(pos); + OcPlatform.doDirectPairing(peer, + OcPrmType.convertOcPrmType(prmType), + pinText.getText().toString(), + doDPListener); + } catch (OcException e) { + Log.d(TAG, "do Direct Pairing error: " + + e.getMessage()); + Log.e(TAG, e.getMessage()); + } + + alertPrmTypeDialog.dismiss(); + } else { + alertPrmTypeDialog.dismiss(); + } + } + } + }); + + cancel.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + alertPrmTypeDialog.dismiss(); + } + }); + } + }); + + alertPrmTypeDialog.show(); + } + }); + alertPinDialog.show(); + } + }); + + mListView.setOnItemClickListener(new OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapt, View view, int position, long itemId) { + save.setEnabled(true); + save.setBackgroundColor(Color.parseColor("#13AEF4")); + OcDirectPairDevice dpPairDevice = + (OcDirectPairDevice) adapt.getItemAtPosition(position); + Log.d(TAG, "DevId On List Item Clicked " + dpPairDevice.getDevId()); + List pTypeList = dpPairDevice.getPairingMethodList(); + pList = new int[pTypeList.size()]; + Iterator iterator = pTypeList.iterator(); + for(int k = 0; k < pList.length; k++){ + pList[k]=iterator.next().intValue(); + } + arrayAdapter.clear(); + for (int j = 0; j < pList.length; j++) { + Log.d(TAG, " List Item Value " + pList[j]); + OcPrmType prmTy = OcPrmType.convertOcPrmType(pList[j]); + arrayAdapter.add(prmTy.name()); + } + } + }); + + discoverButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked) { + save.setEnabled(false); + save.setBackgroundColor(Color.GRAY); + new GetDiscoveredItems().execute(); + } + } + }); + + } + + /** + * Copy svr db CBOR dat file from assets folder to app data files dir + */ + private void copyCborFromAsset() { + InputStream inputStream = null; + OutputStream outputStream = null; + int length; + byte[] buffer = new byte[BUFFER_SIZE]; + try { + inputStream = getAssets().open(StringConstants.OIC_CLIENT_CBOR_DB_FILE); + File file = new File(filePath); + //check files directory exists + if (!(file.exists() && file.isDirectory())) { + file.mkdirs(); + } + outputStream = new FileOutputStream(filePath + + StringConstants.OIC_CLIENT_CBOR_DB_FILE); + while ((length = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, length); + } + } catch (NullPointerException e) { + Log.d(TAG, "Null pointer exception " + e.getMessage()); + Log.e(TAG, e.getMessage()); + } catch (FileNotFoundException e) { + Log.d(TAG, "CBOR svr db file not found " + e.getMessage()); + Log.e(TAG, e.getMessage()); + } catch (IOException e) { + Log.d(TAG, StringConstants.OIC_CLIENT_CBOR_DB_FILE + " file copy failed"); + Log.e(TAG, e.getMessage()); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + Log.e(TAG, e.getMessage()); + } + } + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + Log.e(TAG, e.getMessage()); + } + } + } + } + + void exportCBOR() { + try { + File sd = Environment.getExternalStorageDirectory(); + File data = Environment.getDataDirectory(); + if (sd.canWrite()) { + String currentDBPath = "/data/data/" + getPackageName() + + "/files/" + StringConstants.OIC_CLIENT_CBOR_DB_FILE; + File currentDB = new File(currentDBPath); + File backupDB = new File(sd, StringConstants.OIC_CLIENT_CBOR_DB_FILE); + if (currentDB.exists()) { + FileChannel src = new FileInputStream(currentDB).getChannel(); + FileChannel dst = new FileOutputStream(backupDB).getChannel(); + dst.transferFrom(src, 0, src.size()); + src.close(); + dst.close(); + } + } + } catch (Exception e) { + Log.e(TAG, e.getMessage()); + } + } + + /** + * configure OIC platform and call findResource + */ + private void initOICStack() { + //create platform config + PlatformConfig cfg = new PlatformConfig(this, ServiceType.IN_PROC, ModeType.CLIENT_SERVER, + "0.0.0.0", // bind to all available interfaces + 0, + QualityOfService.LOW, filePath + StringConstants.OIC_CLIENT_CBOR_DB_FILE); + OcPlatform.Configure(cfg); + try { + /* + * Initialize DataBase + */ + String sqlDbPath = getFilesDir().getAbsolutePath().replace("files", "databases") + + File.separator; + File file = new File(sqlDbPath); + //check files directory exists + if (!(file.isDirectory())) { + file.mkdirs(); + Log.d(TAG, "Sql db directory created at " + sqlDbPath); + } + Log.d(TAG, "Sql db directory exists at " + sqlDbPath); + OcProvisioning.provisionInit(sqlDbPath + StringConstants.OIC_SQL_DB_FILE); + } catch (OcException e) { + Log.d(TAG, "provisionInit error: " + e.getMessage()); + Log.e(TAG, e.getMessage()); + } + } + + class GetDiscoveredItems extends AsyncTask> { + + ProgressDialog pDialog; + + @Override + protected void onPreExecute() { + pDialog = new ProgressDialog(MainActivity.this); + pDialog.setMessage("Getting Discovered Items"); + pDialog.setCancelable(false); + pDialog.setCanceledOnTouchOutside(false); + pDialog.show(); + } + + ; + + @Override + protected List doInBackground(Void... params) { + try { + OcPlatform.findDirectPairingDevices(5, finddirectPairing); + } catch (OcException e) { + Log.e(TAG, e.getMessage()); + } + return null; + } + + @Override + protected void onPostExecute(List discoveredItems) { + pDialog.dismiss(); + for (Iterator iterator = discoveredListObj.iterator(); iterator.hasNext(); ) { + OcDirectPairDevice ledResource = (OcDirectPairDevice) iterator.next(); + List lightTypes = new LinkedList<>(); + lightTypes.add("core.led"); + try { + Log.d(TAG, "Constructing Led Resource"); + led = OcPlatform.constructResourceObject(ledResource.getHost(), + "/a/led", ledResource.getConnectivityTypeSet(), + false, //isObservable + lightTypes, + resourceInterfaces); + Log.d(TAG, "Constructed Led Resource"); + } catch (OcException e) { + Log.e(TAG, e.getMessage()); + } + } + } + + } +} diff --git a/android/examples/DirectPairing/src/main/java/org/iotivity/base/examples/DirectPairing/StringConstants.java b/android/examples/DirectPairing/src/main/java/org/iotivity/base/examples/DirectPairing/StringConstants.java new file mode 100644 index 0000000..c793422 --- /dev/null +++ b/android/examples/DirectPairing/src/main/java/org/iotivity/base/examples/DirectPairing/StringConstants.java @@ -0,0 +1,40 @@ +/* + * //****************************************************************** + * // + * // Copyright 2016 Samsung Electronics All Rights Reserved. + * // + * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + * // + * // Licensed under the Apache License, Version 2.0 (the "License"); + * // you may not use this file except in compliance with the License. + * // You may obtain a copy of the License at + * // + * // http://www.apache.org/licenses/LICENSE-2.0 + * // + * // Unless required by applicable law or agreed to in writing, software + * // distributed under the License is distributed on an "AS IS" BASIS, + * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * // See the License for the specific language governing permissions and + * // limitations under the License. + * // + * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + */ +package org.iotivity.base.examples.DirectPairing; + +public interface StringConstants { + + public static final int NUMBER_ZERO = 0; + public static final int DISCOVERY_TIMEOUT_10 = 10; + public static final int DISCOVERY_TIMEOUT_20 = 20; + public static final int SUCCES_CODE = 0; + public static final String DEFAULT_ROWNER_ID = "61646d69-6e44-6576-6963-655555494430"; + public static final String DEFAULT_RESOURCES = "*"; + public static final String DEFAULT_RECURRENCES = "Daily"; + public static final String DEFAULT_PERIOD = "12-12-16"; + public static final int DEFAULT_PERMISSION = 31; + public static final String OIC_CLIENT_CBOR_DB_FILE = "oic_svr_db_client_directpairing.dat"; + public static final String MESSAGE = "message"; + public static final String OIC_SQL_DB_FILE = "Pdm.db"; + public static final int CREDENTIAL_TYPE = 1; + public static final int OWNER_PSK_LENGTH_128 = 128 / 8; +} diff --git a/android/examples/DirectPairing/src/main/res/drawable-hdpi/arrow_down.png b/android/examples/DirectPairing/src/main/res/drawable-hdpi/arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..2e69816bd85d91a194c9d9541ea8411306e6ed5e GIT binary patch literal 567 zcmV-70?7S|P)L+-%Da*p7lKEg&WLj!ZKOG|r zazR6pih|aE1ThpaC?WQ~Siht>(ssMwJxAJw1&71oa5x+eMOs(R?D5G6f($ z8ZEC4AfGo{y>g}ljaIKLNMA-p2+7A;B9h1p(wCX#EuQME2;!?eBa|`)A^A93p07OB zS$UPbWlQmDYy<_(qu9o{@}- zmx7diel(*EWT@g)wJ8ch#!{Kl^91h2f@&I=Z)9-!0bJYL<002ovPDHLk FV1oX{2WS8Q literal 0 HcmV?d00001 diff --git a/android/examples/DirectPairing/src/main/res/drawable-hdpi/arrow_right.png b/android/examples/DirectPairing/src/main/res/drawable-hdpi/arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..91667d5c7b2277213625b8dd5f2d902d80521f0e GIT binary patch literal 406 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 literal 0 HcmV?d00001 diff --git a/android/examples/DirectPairing/src/main/res/drawable-xhdpi/ic_launcher.png b/android/examples/DirectPairing/src/main/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d4fb7cd9d868f1d7d9964f1686dcbc018ef9495a GIT binary patch literal 12516 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 literal 0 HcmV?d00001 diff --git a/android/examples/DirectPairing/src/main/res/layout/activity_main.xml b/android/examples/DirectPairing/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..1ee1a2b --- /dev/null +++ b/android/examples/DirectPairing/src/main/res/layout/activity_main.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + +