From 3e9402ad71cb3e93266a77796f44d17bab9853fd Mon Sep 17 00:00:00 2001 From: Youngjae Shin Date: Mon, 4 Jan 2016 15:26:00 +0900 Subject: [PATCH] Imported Upstream version 1.0.1 --- Readme.scons.txt | 168 +++- android/android_api/base/jni/JniCaInterface.c | 7 - android/android_api/base/jni/JniOcPlatform.cpp | 56 +- .../android_api/base/jni/JniOcRepresentation.cpp | 16 + android/android_api/base/jni/JniOcRepresentation.h | 8 + android/android_api/base/jni/JniOcResource.cpp | 43 +- android/android_api/base/jni/JniOcResource.h | 8 - .../android_api/base/jni/JniOnObserveListener.cpp | 5 + .../main/java/org/iotivity/base/OcPlatform.java | 18 +- .../java/org/iotivity/base/OcRepresentation.java | 2 + .../main/java/org/iotivity/base/OcResource.java | 4 +- build_common/SConscript | 2 +- examples/OICMiddle/SConscript | 2 +- examples/OICSensorBoard/Makefile | 2 +- extlibs/tinydtls/README_Iotivity | 26 + extlibs/tinydtls/SConscript | 2 +- extlibs/tinydtls/crypto.c | 40 +- extlibs/tinydtls/crypto.h | 81 +- extlibs/tinydtls/dtls.c | 46 +- extlibs/tinydtls/tests/dtls-client.c | 6 +- resource/c_common/SConscript | 19 +- .../{csdk => c_common}/ocrandom/include/ocrandom.h | 0 .../{csdk => c_common}/ocrandom/src/ocrandom.c | 17 +- .../{csdk => c_common}/ocrandom/test/SConscript | 2 +- .../ocrandom/test/android/randomtest.cpp | 0 .../ocrandom/test/arduino/randomtest.cpp | 0 .../ocrandom/test/linux/randomtest.cpp | 0 resource/csdk/SConscript | 6 +- resource/csdk/connectivity/SConscript | 2 +- resource/csdk/connectivity/build/SConscript | 3 +- resource/csdk/connectivity/build/tizen/SConscript | 3 +- resource/csdk/connectivity/build/tizen/gbsbuild.sh | 6 +- .../build/tizen/packaging/com.oic.ca.spec | 3 +- .../csdk/connectivity/build/tizen/scons/SConscript | 7 + resource/csdk/connectivity/common/inc/logger.h | 8 +- .../csdk/connectivity/common/src/caremotehandler.c | 14 + resource/csdk/connectivity/common/src/ulinklist.c | 2 + resource/csdk/connectivity/inc/caadapterutils.h | 12 +- .../csdk/connectivity/inc/cablockwisetransfer.h | 14 +- .../csdk/connectivity/lib/libcoap-4.1.1/SConscript | 2 +- resource/csdk/connectivity/lib/libcoap-4.1.1/pdu.c | 3 + resource/csdk/connectivity/lib/libcoap-4.1.1/pdu.h | 2 +- .../sampleService/src/main/jni/ResourceModel.c | 53 +- .../csdk/connectivity/samples/linux/sample_main.c | 17 +- .../csdk/connectivity/samples/tizen/casample.c | 19 +- resource/csdk/connectivity/src/SConscript | 6 +- .../src/adapter_util/caadapternetdtls.c | 10 +- .../connectivity/src/adapter_util/caadapterutils.c | 9 +- .../csdk/connectivity/src/cablockwisetransfer.c | 95 +- .../csdk/connectivity/src/caconnectivitymanager.c | 6 + resource/csdk/connectivity/src/camessagehandler.c | 4 +- resource/csdk/connectivity/src/caprotocolmessage.c | 49 +- .../csdk/connectivity/src/ip_adapter/caipserver.c | 11 +- .../csdk/connectivity/src/tcp_adapter/SConscript | 2 +- .../connectivity/src/tcp_adapter/catcpserver.c | 2 +- resource/csdk/doc/Doxyfile | 2 +- resource/csdk/routing/SConscript | 2 +- resource/csdk/routing/src/routingtablemanager.c | 2 +- resource/csdk/routing/src/routingutility.c | 2 +- resource/csdk/security/SConscript | 2 +- .../csdk/security/include/internal/credresource.h | 9 + resource/csdk/security/provisioning/SConscript | 2 +- .../provisioning/ck_manager/sample/SConscript | 2 +- .../csdk/security/provisioning/src/pmutility.c | 15 +- resource/csdk/security/src/amsmgr.c | 4 +- resource/csdk/security/src/credresource.c | 36 +- resource/csdk/stack/include/ocpayload.h | 85 +- resource/csdk/stack/include/octypes.h | 43 +- resource/csdk/stack/include/payload_logging.h | 6 +- .../linux/SimpleClientServer/occlientbasicops.cpp | 16 +- resource/csdk/stack/src/ocpayload.c | 210 ++++- resource/csdk/stack/src/ocpayloadconvert.c | 611 ++++++------- resource/csdk/stack/src/ocpayloadparse.c | 954 ++++++++++----------- resource/csdk/stack/src/ocresource.c | 11 +- resource/csdk/stack/src/ocserverrequest.c | 6 - resource/csdk/stack/src/ocstack.c | 59 +- resource/csdk/stack/src/oicgroup.c | 5 - resource/csdk/stack/src/rdpayload.c | 37 +- resource/csdk/stack/test/SConscript | 2 +- resource/examples/SConscript | 2 +- resource/include/OCRepresentation.h | 38 +- resource/include/OCSerialization.h | 21 +- resource/src/InProcClientWrapper.cpp | 1 + resource/src/OCRepresentation.cpp | 42 +- resource/src/OCResource.cpp | 7 - resource/src/SConscript | 2 +- resource/unit_tests.scons | 2 +- .../unittests/OCRepresentationEncodingTest.cpp | 60 +- resource/unittests/OCRepresentationTest.cpp | 82 +- resource/unittests/SConscript | 2 +- .../BMISensorBundle/include/BMISensorResource.h | 2 + .../src/BMISensorBundleActivator.cpp | 14 +- .../examples/ContainerSample.cpp | 3 +- .../examples/ContainerSampleClient.cpp | 7 +- .../include/DiscomfortIndexSensorResource.h | 2 + .../src/DISensorBundleActivator.cpp | 14 +- .../src/DiscomfortIndexSensorResource.cpp | 2 +- .../src/HueSampleBundleActivator.cpp | 14 +- .../examples/tizen/ContainerClientApp/.cproject | 1 - .../tizen/ContainerClientApp/src/clientmain.cpp | 2 +- .../ContainerClientApp/src/containerclient.cpp | 2 +- .../examples/tizen/ContainerServerApp/.cproject | 1 - .../tizen/ContainerServerApp/inc/container.h | 2 - .../examples/tizen/ContainerServerApp/inc/rcmain.h | 2 +- .../tizen/ContainerServerApp/src/container.cpp | 15 +- .../tizen/ContainerServerApp/src/rcmain.cpp | 7 +- .../resource-container/src/DiscoverResourceUnit.h | 2 + .../resource-directory/src/internal/rd_storage.c | 12 +- .../resource-directory/src/internal/rd_storage.h | 3 +- service/resource-directory/src/rd_client.c | 3 + service/resource-directory/src/rd_server.c | 2 +- .../service/src/main/jni/JniRcsResourceObject.cpp | 22 +- .../examples/linux/SampleResourceClient.cpp | 2 +- .../examples/linux/SampleResourceServer.cpp | 0 .../tizen/RESampleClientApp/inc/reclient.h | 11 + .../tizen/RESampleClientApp/inc/reclientmain.h | 4 +- .../tizen/RESampleClientApp/src/reclient.cpp | 92 +- .../tizen/RESampleClientApp/src/reclientmain.cpp | 7 +- .../examples/tizen/RESampleServerApp/inc/remain.h | 6 +- .../tizen/RESampleServerApp/inc/reserver.h | 14 +- .../tizen/RESampleServerApp/src/remain.cpp | 5 +- .../tizen/RESampleServerApp/src/reserver.cpp | 137 ++- .../primitiveResource/include/PrimitiveResource.h | 4 + .../include/PrimitiveResourceImpl.h | 19 +- .../unittests/PrimitiveResourceTest.cpp | 3 + .../src/serverBuilder/src/RCSResourceObject.cpp | 2 +- service/simulator/SConscript | 2 +- .../simulator/examples/server/service_provider.cpp | 92 +- service/simulator/inc/simulator_resource_model.h | 6 +- service/simulator/inc/simulator_resource_server.h | 5 +- .../ClientControllerPlugin/META-INF/MANIFEST.MF | 2 +- .../clientcontroller/manager/ResourceManager.java | 15 +- .../view/dialogs/FindResourcePage.java | 3 +- .../view/dialogs/PostRequestDialog.java | 42 +- .../serviceprovider/manager/ImageManager.java | 2 +- .../serviceprovider/manager/ResourceManager.java | 17 +- .../simulator/serviceprovider/utils/Constants.java | 2 +- .../view/dialogs/DeleteResourcePage.java | 9 +- .../simulator/java/jni/resource_attributes_jni.cpp | 3 +- service/simulator/java/jni/simulator_common_jni.h | 2 + .../java/jni/simulator_device_info_jni.cpp | 8 +- .../simulator/java/jni/simulator_manager_jni.cpp | 10 + .../java/jni/simulator_remote_resource_jni.cpp | 8 +- .../java/jni/simulator_remote_resource_jni.h | 4 + .../java/jni/simulator_resource_model_jni.cpp | 6 + .../java/jni/simulator_resource_server_jni.cpp | 34 +- .../java/jni/simulator_resource_server_jni.h | 4 +- .../org/oic/simulator/SimulatorResourceModel.java | 4 +- .../clientcontroller/SimulatorRemoteResource.java | 4 +- .../serviceprovider/SimulatorResourceServer.java | 21 +- .../ramlparser/raml/jsonSchemaParser/Definitions.h | 2 +- .../ramlparser/raml/jsonSchemaParser/Items.h | 2 +- .../src/client-controller/attribute_generator.cpp | 103 ++- .../src/client-controller/attribute_generator.h | 23 +- .../client-controller/put_request_generator.cpp | 75 +- .../simulator_remote_resource_impl.cpp | 18 +- .../src/common/simulator_resource_model.cpp | 21 +- .../resource_update_automation.cpp | 81 +- .../service-provider/resource_update_automation.h | 8 +- .../simulator_resource_server_impl.cpp | 8 +- .../simulator_resource_server_impl.h | 4 +- .../test/SimulatorRemoteResourceTest.java | 67 +- .../test/SimlatorResourceServerTest.java | 20 +- .../oic/simulator/test/SimulatorManagerTest.java | 86 +- .../simulator/test/SimulatorResourceModelTest.java | 32 +- .../tizen/TMSampleApp/src/configuration.cpp | 72 +- .../things-manager/sdk/src/ThingsConfiguration.cpp | 12 +- service/third_party_libs.scons | 2 +- tools/darwin/mkfwk_ios.sh | 2 +- tools/darwin/mkfwk_osx.sh | 2 +- tools/tizen/iotivity.spec | 2 +- 171 files changed, 2860 insertions(+), 1859 deletions(-) create mode 100644 extlibs/tinydtls/README_Iotivity rename resource/{csdk => c_common}/ocrandom/include/ocrandom.h (100%) rename resource/{csdk => c_common}/ocrandom/src/ocrandom.c (96%) rename resource/{csdk => c_common}/ocrandom/test/SConscript (97%) rename resource/{csdk => c_common}/ocrandom/test/android/randomtest.cpp (100%) rename resource/{csdk => c_common}/ocrandom/test/arduino/randomtest.cpp (100%) rename resource/{csdk => c_common}/ocrandom/test/linux/randomtest.cpp (100%) mode change 100644 => 100755 resource/csdk/security/provisioning/src/pmutility.c mode change 100755 => 100644 resource/csdk/stack/include/ocpayload.h mode change 100755 => 100644 service/resource-encapsulation/examples/linux/SampleResourceClient.cpp mode change 100755 => 100644 service/resource-encapsulation/examples/linux/SampleResourceServer.cpp mode change 100755 => 100644 service/simulator/SConscript diff --git a/Readme.scons.txt b/Readme.scons.txt index bc0c411..aac7c90 100644 --- a/Readme.scons.txt +++ b/Readme.scons.txt @@ -133,39 +133,137 @@ tool isn't installed. An message will be displayed, please follow the message to skip it. -=== Build IoTivity project on Linux(Ubuntu) === +=== Build IoTivity project === -1. Build IoTivity project for Linux - $ cd - $ sudo apt-get install libboost-dev libexpat1-dev libboost-thread-dev libssl-dev - $ scons +Linux: + * Possible values for are: ALL, IP, BLE -2. Build IoTivity project for Android - $ cd - $ scons TARGET_OS=android TARGET_ARCH=xxx -(xxx can be x86, armeabi, armeabi-v7a, armeabi-v7a-hard. To see all of its -allowed value, please execute command 'scons TARGET_OS=android -Q -h') - -3. Build IoTivity project for Arduino - $ cd - $ sudo apt-get install dos2unix - $ scons TARGET_OS=arduino TARGET_ARCH=xxx BOARD=yyy SHIELD=zzz -(xxx can be avr, arm; yyy is the name of the board, zzz is the shield type, to -get allowed values run: scons TARGET_OS=arduino TARGET_ARCH=xxx SHIELD=zzz -h. -You may see a option 'CPU' in the output of above command line, that's due to -some boards have different processors, to specify the processor, add 'CPU=zzz' -in the command line. If no 'CPU' option exists, that means the board only -support one kind of processor, it's unnecessary to specify it) +1. Go to root directory + $ cd + $ sudo apt-get install libboost-dev libboost-thread-dev libssl-dev libtool + +2. Execute following command(s) to start build based on transport selection required + + -> Building for all transports : + $ scons TARGET_OS=linux TARGET_TRANSPORT=ALL + + -> Building for a specific transport : + $ scons TARGET_OS=linux TARGET_TRANSPORT=IP + + -> Building for multiple transports : + $ scons TARGET_OS=linux TARGET_TRANSPORT=IP,BLE TARGET_ARCH=xxx + + -> Clean Build (all transports) : + $ scons TARGET_OS=linux TARGET_TRANSPORT=ALL -c (for clean) + +Android: + * Possible values for are: ALL, IP, BT, BLE + * Possible values for are: x86, armeabi, armeabi-v7a, armeabi-v7a-hard + (To see all of its allowed value, please execute command 'scons TARGET_OS=android -Q -h') + +1. Go to root directory + $ cd + +2. Execute following command(s) to start build based on transport selection required + + -> Building for all transports : + $ scons TARGET_OS=android TARGET_TRANSPORT=ALL TARGET_ARCH=xxx + + -> Building for a specific transport : + $ scons TARGET_OS=android TARGET_TRANSPORT=IP TARGET_ARCH=xxx + + -> Building for multiple transports : + $ scons TARGET_OS=android TARGET_TRANSPORT=IP,BT,BLE TARGET_ARCH=xxx + + -> Clean Build (all transports) : + $ scons TARGET_OS=android TARGET_TRANSPORT=ALL -c (for clean) + +Tizen: + * Possible values for are: ALL, IP, BT, BLE + + 1. Go to root directory + $ cd + + 2. Execute following command(s) to start build based on transport selection required + + -> Building for all transports : + $ scons TARGET_OS=tizen TARGET_TRANSPORT=ALL + + -> Building for a specific transport : + $ scons TARGET_OS=tizen TARGET_TRANSPORT=IP + + -> Building for multiple transports : + $ scons TARGET_OS=tizen TARGET_TRANSPORT=IP,BT,BLE TARGET_ARCH=xxx + + -> Clean Build (all transports) : + $ scons TARGET_OS=tizen TARGET_TRANSPORT=ALL -c (for clean) -4. Build Iotivity project for Tizen - $ cd - $ sh gbsbuild.sh (we provide the spec file required by gbs tool at toools/tizen directory. gbs is default build tool for Tizen platfrom, we can refer the following wiki to setup Tizen development environment: https://source.tizen.org/documentation/developer-guide/getting-started-guide) -Note: Currently most IoTivity project doesn't support Windows, so you can't set +Arduino: + * Possible values for are: IP, BLE + * Possible values for are: arv, arm + (arv: arduino due, arm: arduino mega) + * Possible values for are: arduino_due_x_dbg, arduino_due_x, mega + * Possible values for are: ETH, WIFI + (It is required in the case of the arduino due.) + + 1. Go to root directory + $ cd + $ sudo apt-get install dos2unix + + 2. Execute following command(s) to start build based on transport selection required + + -> Building for a specific transport : + $ scons TARGET_OS=arduino TARGET_ARCH=xxx BOARD=yyy SHIELD=zzz + +(To get allowed values run: scons TARGET_OS=arduino TARGET_ARCH=xxx SHIELD=zzz -h. +You may see a option 'CPU' in the output of above command line, that's due to +some boards have different processors, to specify the processor, add 'CPU=zzz' +in the command line. If no 'CPU' option exists, that means the board only +support one kind of processor, it's unnecessary to specify it) + +Mac OSX: + * Possible values for are: OSX version, e.g. 10.9 + + 1. Go to root directory + $ cd + + 2. Execute following command(s) to start build based on transport selection required + + -> Building for a specific transport : + $ scons SYS_VERSION=yyy + +IOS: + * Possible values for are: i386, x86_64, armv7, armv7s, arm64 + * Possible values for are: IOS version, e.g. 7.0 + + 1. Go to root directory + $ cd + + 2. Execute following command(s) to start build based on transport selection required + + -> Building for a specific transport : + $ scons TARGET_OS=ios TARGET_ARCH=xxx SYS_VERSION=yyy + +* Additional options + * VERBOSE=true or false (Show compilation) + * RELEASE=true or false (Build for release?) + * LOGGING=true or false (Enable stack logging) + * SECURED=1 or 0 (Build with DTLS) + * TEST=1 or 0 (Run unit tests) + * SECURED=1 or 0 (Build with DTLS) + * BUILD_SAMPLE=ON or OFF (Build with sample) + * ROUTING=GW or EP (Enable routing) + * WITH_TCP=true or false (Enable CoAP over TCP Transport, arduino is not supported) + * WITH_RA=true or false (Build with Remote Access module) + * WITH_RD=1 or 0 (Build including Resource Directory) + * SIMULATOR=true or false (Build with simulator module) + +Note1: Currently most IoTivity project doesn't support Windows, so you can't set TARGET_OS to 'windows' except the project support Windows. That's to say if the project doesn't support Windows, run: @@ -174,25 +272,7 @@ or run on Windows $ scons may always fail. - -=== Build IoTivity project on Mac OSX === - -1. Build IoTivity project for Mac OSX - $ cd - $ scons SYS_VERSION=yyy -(yyy is the OSX version, e.g. 10.9) - -2. Build IoTivity project for Android(It's the same as on Ubuntu) - $ cd - $ scons TARGET_OS=android TARGET_ARCH=xxx -(xxx can be x86, armeabi, armeabi-v7a, armeabi-v7a-hard) - -3. Build IoTivity project for IOS - $ cd - $ scons TARGET_OS=ios TARGET_ARCH=xxx SYS_VERSION=yyy -(xxx can be i386, x86_64, armv7, armv7s, arm64, yyy is IOS version, e.g. 7.0) - -Note: +Note2: 1) for convenience, a script (auto_build.sh) is provided to run possible build at once. Following is the usage: diff --git a/android/android_api/base/jni/JniCaInterface.c b/android/android_api/base/jni/JniCaInterface.c index eb1e07a..0972278 100644 --- a/android/android_api/base/jni/JniCaInterface.c +++ b/android/android_api/base/jni/JniCaInterface.c @@ -50,11 +50,4 @@ Java_org_iotivity_ca_CaInterface_initialize LOGI("CaInterface_initialize"); CANativeJNISetContext(env, context); - - CAResult_t res = CAInitialize(); - - if (CA_STATUS_OK != res) - { - LOGE("Could not Initialize"); - } } \ No newline at end of file diff --git a/android/android_api/base/jni/JniOcPlatform.cpp b/android/android_api/base/jni/JniOcPlatform.cpp index e3a6cd5..93029c9 100644 --- a/android/android_api/base/jni/JniOcPlatform.cpp +++ b/android/android_api/base/jni/JniOcPlatform.cpp @@ -347,6 +347,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_configure { port = static_cast(jPort); } + PlatformConfig cfg{ JniUtils::getServiceType(env, jServiceType), JniUtils::getModeType(env, jModeType), @@ -355,7 +356,6 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_configure JniUtils::getQOS(env, static_cast(jQOS)), JniOcSecurity::getOCPersistentStorage() }; - OCPlatform::Configure(cfg); } @@ -392,7 +392,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyAllObservers0 catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); } } @@ -433,7 +433,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyAllObservers1 catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); } } @@ -506,7 +506,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyListOfObservers2( catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); } } @@ -581,7 +581,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyListOfObservers3( catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); } } @@ -639,7 +639,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findResource0( catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); } } @@ -698,7 +698,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findResource1( catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); } } @@ -755,7 +755,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getDeviceInfo0( catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); } } @@ -814,7 +814,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getDeviceInfo1( catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); } } @@ -871,7 +871,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getPlatformInfo0( catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); } } @@ -930,7 +930,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getPlatformInfo1( catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); } } @@ -966,7 +966,7 @@ JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_registerResource0( catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); return nullptr; } JniOcResourceHandle* jniHandle = new JniOcResourceHandle(resourceHandle); @@ -1045,7 +1045,7 @@ jobject jListener, jint jResourceProperty) { LOGE("%s", e.reason().c_str()); delete entityHandler; - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); return nullptr; } @@ -1106,7 +1106,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_registerDeviceInfo0( catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); } } @@ -1237,7 +1237,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_registerPlatformInfo0( catch (OCException& e) { LOGE("Error is due to %s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); } } @@ -1274,7 +1274,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unregisterResource0( catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); } } @@ -1323,7 +1323,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindResource0 catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); } } @@ -1395,7 +1395,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindResources0( catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); } } @@ -1450,7 +1450,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unbindResource0( catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); } } @@ -1521,7 +1521,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unbindResources0( catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); } } @@ -1567,7 +1567,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindTypeToResource0( catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); } } @@ -1613,7 +1613,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindInterfaceToResource catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); } } @@ -1639,7 +1639,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_startPresence0( catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); } } @@ -1665,7 +1665,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_stopPresence0( catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); } } @@ -1720,7 +1720,7 @@ JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_subscribePresence0( catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); return nullptr; } @@ -1794,7 +1794,7 @@ JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_subscribePresence1( catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); return nullptr; } @@ -1853,7 +1853,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unsubscribePresence0( catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); } } @@ -1965,6 +1965,6 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_sendResponse0( catch (OCException& e) { LOGE("%s", e.reason().c_str()); - ThrowOcException(OC_STACK_ERROR, e.reason().c_str()); + ThrowOcException(e.code(), e.reason().c_str()); } } diff --git a/android/android_api/base/jni/JniOcRepresentation.cpp b/android/android_api/base/jni/JniOcRepresentation.cpp index 3c69be6..c3c37ad 100644 --- a/android/android_api/base/jni/JniOcRepresentation.cpp +++ b/android/android_api/base/jni/JniOcRepresentation.cpp @@ -793,6 +793,22 @@ JNIEXPORT jstring JNICALL Java_org_iotivity_base_OcRepresentation_getUri /* * Class: org_iotivity_base_OcRepresentation +* Method: getHost +* Signature: ()Ljava/lang/String; +*/ +JNIEXPORT jstring JNICALL Java_org_iotivity_base_OcRepresentation_getHost +(JNIEnv *env, jobject thiz) +{ + LOGD("OcRepresentation_getHost"); + OCRepresentation *rep = JniOcRepresentation::getOCRepresentationPtr(env, thiz); + if (!rep) return nullptr; + + std::string uri(rep->getHost()); + return env->NewStringUTF(uri.c_str()); +} + +/* +* Class: org_iotivity_base_OcRepresentation * Method: setUri * Signature: (Ljava/lang/String;)V */ diff --git a/android/android_api/base/jni/JniOcRepresentation.h b/android/android_api/base/jni/JniOcRepresentation.h index 2ac86ff..ee8f222 100644 --- a/android/android_api/base/jni/JniOcRepresentation.h +++ b/android/android_api/base/jni/JniOcRepresentation.h @@ -653,6 +653,14 @@ extern "C" { /* * Class: org_iotivity_base_OcRepresentation + * Method: getHost + * Signature: ()Ljava/lang/String; + */ + JNIEXPORT jstring JNICALL Java_org_iotivity_base_OcRepresentation_getHost + (JNIEnv *, jobject); + + /* + * Class: org_iotivity_base_OcRepresentation * Method: setUri * Signature: (Ljava/lang/String;)V */ diff --git a/android/android_api/base/jni/JniOcResource.cpp b/android/android_api/base/jni/JniOcResource.cpp index f8b8977..4d15fe0 100644 --- a/android/android_api/base/jni/JniOcResource.cpp +++ b/android/android_api/base/jni/JniOcResource.cpp @@ -284,17 +284,12 @@ OCStackResult JniOcResource::observe(JNIEnv* env, ObserveType observeType, return m_sharedResource->observe(observeType, queryParametersMap, observeCallback, QoS); } -OCStackResult JniOcResource::cancelObserve(JNIEnv* env) -{ - this->m_onObserveManager.removeAllListeners(env); - return m_sharedResource->cancelObserve(); -} - OCStackResult JniOcResource::cancelObserve(JNIEnv* env, QualityOfService qos) { - //TODO confirm behavior - //add removal of java listeners by qos - this->m_onObserveManager.removeAllListeners(env); + if (QualityOfService::HighQos != qos) + { + this->m_onObserveManager.removeAllListeners(env); + } return m_sharedResource->cancelObserve(qos); } @@ -1279,34 +1274,6 @@ jobject jListener, jint jQoS) /* * Class: org_iotivity_base_OcResource -* Method: cancelObserve -* Signature: ()V -*/ -JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_cancelObserve -(JNIEnv *env, jobject thiz) -{ - LOGD("OcResource_cancelObserve"); - JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz); - if (!resource) return; - - try - { - OCStackResult result = resource->cancelObserve(env); - - if (OC_STACK_OK != result) - { - ThrowOcException(result, "OcResource_cancelObserve"); - } - } - catch (OCException& e) - { - LOGE("%s", e.reason().c_str()); - ThrowOcException(e.code(), e.reason().c_str()); - } -} - -/* -* Class: org_iotivity_base_OcResource * Method: cancelObserve1 * Signature: I)V */ @@ -1518,4 +1485,4 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_dispose LOGD("OcResource_dispose"); JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz); delete resource; -} \ No newline at end of file +} diff --git a/android/android_api/base/jni/JniOcResource.h b/android/android_api/base/jni/JniOcResource.h index cb36691..a038312 100644 --- a/android/android_api/base/jni/JniOcResource.h +++ b/android/android_api/base/jni/JniOcResource.h @@ -251,14 +251,6 @@ extern "C" { /* * Class: org_iotivity_base_OcResource - * Method: cancelObserve - * Signature: ()V - */ - JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_cancelObserve - (JNIEnv *, jobject); - - /* - * Class: org_iotivity_base_OcResource * Method: cancelObserve1 * Signature: (I)V */ diff --git a/android/android_api/base/jni/JniOnObserveListener.cpp b/android/android_api/base/jni/JniOnObserveListener.cpp index 0b2c28f..3ad1d11 100644 --- a/android/android_api/base/jni/JniOnObserveListener.cpp +++ b/android/android_api/base/jni/JniOnObserveListener.cpp @@ -127,6 +127,11 @@ void JniOnObserveListener::onObserveCallback(const HeaderOptions headerOptions, m_ownerResource->removeOnObserveListener(env, m_jwListener); env->Throw((jthrowable)ex); } + + if (OC_OBSERVE_DEREGISTER == sequenceNumber) + { + checkExAndRemoveListener(env); + } } if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); 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 5b2388d..8733878 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 @@ -70,6 +70,7 @@ public final class OcPlatform { public static final String PRESENCE_URI = "/oic/ad"; private static volatile boolean sIsPlatformInitialized = false; + private static QualityOfService sPlatformQualityOfService = QualityOfService.NA; private OcPlatform() { } @@ -86,6 +87,8 @@ public final class OcPlatform { if (!sIsPlatformInitialized) { CaInterface.initialize(platformConfig.getContext()); + sPlatformQualityOfService = platformConfig.getQualityOfService(); + OcPlatform.configure( platformConfig.getServiceType().getValue(), platformConfig.getModeType().getValue(), @@ -463,7 +466,7 @@ public final class OcPlatform { /** * This API registers a resource with the server - *

+ *

* Note: This API applies to server & client side. *

* @@ -482,9 +485,10 @@ public final class OcPlatform { /** * This API registers a resource with the server NOTE: This API applies to server side only. - *

+ *

* Note: This API applies to server side only. *

+ * * @param resourceUri The URI of the resource. Example: "a/light" * @param resourceTypeName The resource type. Example: "light" * @param resourceInterface The resource interface (whether it is collection etc). @@ -933,4 +937,14 @@ public final class OcPlatform { "OcPlatform.Configure before any other API calls are permitted"); } } + + /** + * Gets platform quality of service + * + * @return quality of service + */ + public static QualityOfService getPlatformQualityOfService() { + OcPlatform.initCheck(); + return sPlatformQualityOfService; + } } diff --git a/android/android_api/base/src/main/java/org/iotivity/base/OcRepresentation.java b/android/android_api/base/src/main/java/org/iotivity/base/OcRepresentation.java index eba1001..309ab70 100644 --- a/android/android_api/base/src/main/java/org/iotivity/base/OcRepresentation.java +++ b/android/android_api/base/src/main/java/org/iotivity/base/OcRepresentation.java @@ -278,6 +278,8 @@ public class OcRepresentation { public native String getUri(); + public native String getHost(); + public native void setUri(String uri); /** diff --git a/android/android_api/base/src/main/java/org/iotivity/base/OcResource.java b/android/android_api/base/src/main/java/org/iotivity/base/OcResource.java index 333c5b2..bb22465 100644 --- a/android/android_api/base/src/main/java/org/iotivity/base/OcResource.java +++ b/android/android_api/base/src/main/java/org/iotivity/base/OcResource.java @@ -411,7 +411,9 @@ public class OcResource { * * @throws OcException */ - public native void cancelObserve() throws OcException; + public void cancelObserve() throws OcException{ + this.cancelObserve(OcPlatform.getPlatformQualityOfService()); + } /** * Method to cancel the observation on the resource diff --git a/build_common/SConscript b/build_common/SConscript index d808228..a73adab 100644 --- a/build_common/SConscript +++ b/build_common/SConscript @@ -70,7 +70,7 @@ else: ###################################################################### # Common build options (release, target os, target arch) ###################################################################### -targets_disallow_multitransport = ['arduino', 'android'] +targets_disallow_multitransport = ['arduino'] help_vars = Variables() help_vars.Add(BoolVariable('VERBOSE', 'Show compilation', False)) diff --git a/examples/OICMiddle/SConscript b/examples/OICMiddle/SConscript index 6748493..8c1152d 100644 --- a/examples/OICMiddle/SConscript +++ b/examples/OICMiddle/SConscript @@ -34,7 +34,7 @@ examples_env = lib_env.Clone() examples_env.AppendUnique(CPPPATH = [ '../../resource/include/', '../../resource/csdk/stack/include', - '../../resource/csdk/ocrandom/include', + '../../resource/c_common/ocrandom/include', '../../resource/csdk/logger/include', '../../resource/oc_logger/include' ]) diff --git a/examples/OICSensorBoard/Makefile b/examples/OICSensorBoard/Makefile index 8a6939b..ab12e21 100644 --- a/examples/OICSensorBoard/Makefile +++ b/examples/OICSensorBoard/Makefile @@ -7,7 +7,7 @@ YOCTOCXXFLAGS=-I$(SDKTARGETSYSROOT)/usr/include/iotivity/resource/ -I$(SDKTARGET YOCTOLDFLAGS=-loc -loctbstack -loc_logger -lmraa -CXXFLAGS=-I../../resource/include -I../../resource/csdk/stack/include -I../../resource/csdk/ocrandom/include -I../../resource/csdk/logger/include -I../../resource/oc_logger/include +CXXFLAGS=-I../../resource/include -I../../resource/csdk/stack/include -I../../resource/c_common/ocrandom/include -I../../resource/csdk/logger/include -I../../resource/oc_logger/include LDFLAGS=-L../../out/linux/$(CLIENTARCH)/$(BUILDTYPE) -loc -loctbstack -loc_logger diff --git a/extlibs/tinydtls/README_Iotivity b/extlibs/tinydtls/README_Iotivity new file mode 100644 index 0000000..3d18404 --- /dev/null +++ b/extlibs/tinydtls/README_Iotivity @@ -0,0 +1,26 @@ +SUPPORTED CIPHER-SUITES + TLS_PSK_WITH_AES_128_CCM_8(0xC0A8) + TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8(0xC0AE) + TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256(0xC037) + TLS_ECDH_anon_WITH_AES_128_CBC_SHA256(0xC018) + +TEST APPLICATIONS +These applications can be build from Iotivity's root directory using below commands: +scons extlibs/tinydtls/dtls-client SECURED=1 RELEASE=0 +scons extlibs/tinydtls/dtls-server SECURED=1 RELEASE=0 + + +INTER-OPERABILITY TESTING +tinyDTLS's cipher-suite implementations can be verified for compatibility against other +SSL libraries. +Use below commands to perform compatibility testing against mBed SSL library. +./ssl_server2 debug_level=5 dtls=1 psk=73656372657450534b psk_identity=Client_identity \ + force_version=dtls1_2 force_ciphersuite=TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA256 +./dtls-client -v 6 -c 4 localhost 4433 + +./ssl_client2 debug_level=5 dtls=1 psk=73656372657450534b psk_identity=Client_identity \ + force_version=dtls1_2 force_ciphersuite=TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA256 +./dtls-server -v 6 localhost -p 4433 + +Above commands can also be tested with TLS-PSK-WITH-AES-128-CCM-8 cipher suite. + diff --git a/extlibs/tinydtls/SConscript b/extlibs/tinydtls/SConscript index 1f3c2a7..64d5d08 100644 --- a/extlibs/tinydtls/SConscript +++ b/extlibs/tinydtls/SConscript @@ -68,7 +68,7 @@ if not env.get('RELEASE'): else: env.AppendUnique(CPPDEFINES = ['NDEBUG']) -env.AppendUnique(CPPDEFINES = ['DTLSV12', 'WITH_SHA256', 'DTLS_CHECK_CONTENTTYPE']) +env.AppendUnique(CPPDEFINES = ['DTLSV12', 'WITH_SHA256', 'DTLS_CHECK_CONTENTTYPE', 'SHA2_USE_INTTYPES_H']) libtinydtls = env.StaticLibrary('libtinydtls', env.get('TINYDTLS_SRC'), OBJPREFIX='libtinydtls_') diff --git a/extlibs/tinydtls/crypto.c b/extlibs/tinydtls/crypto.c index 77a8e04..de07f49 100644 --- a/extlibs/tinydtls/crypto.c +++ b/extlibs/tinydtls/crypto.c @@ -330,7 +330,7 @@ dtls_ccm_decrypt(aes128_t *ccm_ctx, const unsigned char *src, static size_t dtls_cbc_encrypt(aes128_t *aes_ctx, - unsigned char *key, size_t keylen, + unsigned char *mac_key, size_t mac_keylen, const unsigned char *iv, const unsigned char *src, size_t srclen, unsigned char *buf) { @@ -349,7 +349,7 @@ dtls_cbc_encrypt(aes128_t *aes_ctx, dtls_hdr = src - DTLS_CBC_IV_LENGTH - sizeof(dtls_record_header_t); //Calculate MAC : Append the MAC code to end of content - hmac_ctx = dtls_hmac_new(key, keylen); + hmac_ctx = dtls_hmac_new(mac_key, mac_keylen); dtls_mac(hmac_ctx, dtls_hdr, src, srclen, @@ -389,7 +389,7 @@ dtls_cbc_encrypt(aes128_t *aes_ctx, static size_t dtls_cbc_decrypt(aes128_t *aes_ctx, - unsigned char *key, size_t keylen, + unsigned char *mac_key, size_t mac_keylen, const unsigned char *iv, const unsigned char *src, size_t srclen, unsigned char *buf) { @@ -403,6 +403,7 @@ dtls_cbc_decrypt(aes128_t *aes_ctx, int i, j; int blocks; int depaddinglen = 0; + uint8_t wrongpadding_flag = 0; dtls_hmac_context_t* hmac_ctx = NULL; pos = buf; @@ -429,8 +430,19 @@ dtls_cbc_decrypt(aes128_t *aes_ctx, //de-padding depaddinglen = buf[srclen -1]; + /** + * message validation check in case of wrong key. + * In case of wrong padding legnth was detected + * set depadding length to zero in order to resist the padding oracle attack + * and prevent invalid memory access. + */ + if(srclen <= DTLS_HMAC_DIGEST_SIZE + depaddinglen + 1) { + depaddinglen = 0; + wrongpadding_flag = 1; + } + //Calculate MAC - hmac_ctx = dtls_hmac_new(key, keylen); + hmac_ctx = dtls_hmac_new(mac_key, mac_keylen); if(!hmac_ctx) { return -1; } @@ -449,7 +461,7 @@ dtls_cbc_decrypt(aes128_t *aes_ctx, //verify the MAC if(memcmp(mac_buf, buf + (srclen - DTLS_HMAC_DIGEST_SIZE - depaddinglen - 1), - DTLS_HMAC_DIGEST_SIZE) != 0) + DTLS_HMAC_DIGEST_SIZE) != 0 || wrongpadding_flag) { dtls_crit("Failed to verification of MAC\n"); return -1; @@ -702,7 +714,8 @@ int dtls_encrypt(const unsigned char *src, size_t length, unsigned char *buf, unsigned char *nounce, - unsigned char *key, size_t keylen, + unsigned char *write_key, size_t write_keylen, + unsigned char *mac_key, size_t mac_keylen, const unsigned char *aad, size_t la, const dtls_cipher_t cipher) { @@ -711,7 +724,7 @@ dtls_encrypt(const unsigned char *src, size_t length, if(cipher == TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 || cipher == TLS_PSK_WITH_AES_128_CCM_8) { - ret = rijndael_set_key_enc_only(&ctx->data.ctx, key, 8 * keylen); + ret = rijndael_set_key_enc_only(&ctx->data.ctx, write_key, 8 * write_keylen); if (ret < 0) { /* cleanup everything in case the key has the wrong size */ dtls_warn("cannot set rijndael key\n"); @@ -724,7 +737,7 @@ dtls_encrypt(const unsigned char *src, size_t length, } if(cipher == TLS_ECDH_anon_WITH_AES_128_CBC_SHA_256 || cipher == TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA_256) { - ret = rijndael_set_key(&ctx->data.ctx, key, 8 * keylen); + ret = rijndael_set_key(&ctx->data.ctx, write_key, 8 * write_keylen); if (ret < 0) { /* cleanup everything in case the key has the wrong size */ dtls_warn("cannot set rijndael key\n"); @@ -733,7 +746,7 @@ dtls_encrypt(const unsigned char *src, size_t length, if (src != buf) memmove(buf, src, length); - ret = dtls_cbc_encrypt(&ctx->data, key, keylen, nounce, src, length, buf); + ret = dtls_cbc_encrypt(&ctx->data, mac_key, mac_keylen, nounce, src, length, buf); } error: @@ -745,7 +758,8 @@ int dtls_decrypt(const unsigned char *src, size_t length, unsigned char *buf, unsigned char *nounce, - unsigned char *key, size_t keylen, + unsigned char *read_key, size_t read_keylen, + unsigned char *mac_key, size_t mac_keylen, const unsigned char *aad, size_t la, const dtls_cipher_t cipher) { @@ -754,7 +768,7 @@ dtls_decrypt(const unsigned char *src, size_t length, if(cipher == TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 || cipher == TLS_PSK_WITH_AES_128_CCM_8) { - ret = rijndael_set_key_enc_only(&ctx->data.ctx, key, 8 * keylen); + ret = rijndael_set_key_enc_only(&ctx->data.ctx, read_key, 8 * read_keylen); if (ret < 0) { /* cleanup everything in case the key has the wrong size */ dtls_warn("cannot set rijndael key\n"); @@ -768,7 +782,7 @@ dtls_decrypt(const unsigned char *src, size_t length, if(cipher == TLS_ECDH_anon_WITH_AES_128_CBC_SHA_256 || cipher == TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA_256) { - ret = rijndael_set_key(&ctx->data.ctx, key, 8 * keylen); + ret = rijndael_set_key(&ctx->data.ctx, read_key, 8 * read_keylen); if (ret < 0) { /* cleanup everything in case the key has the wrong size */ dtls_warn("cannot set rijndael key\n"); @@ -777,7 +791,7 @@ dtls_decrypt(const unsigned char *src, size_t length, if (src != buf) memmove(buf, src, length); - ret = dtls_cbc_decrypt(&ctx->data, key, keylen, nounce, src, length, buf); + ret = dtls_cbc_decrypt(&ctx->data, mac_key, mac_keylen, nounce, src, length, buf); } error: diff --git a/extlibs/tinydtls/crypto.h b/extlibs/tinydtls/crypto.h index e101a11..8ea83f2 100644 --- a/extlibs/tinydtls/crypto.h +++ b/extlibs/tinydtls/crypto.h @@ -42,11 +42,12 @@ #include "ecc/ecc.h" /* TLS_PSK_WITH_AES_128_CCM_8 */ -#define DTLS_MAC_KEY_LENGTH 0 +#define DTLS_CCM_MAC_KEY_LENGTH 0 /* MAC Key length for AES-CCM cipher suites */ +#define DTLS_CBC_MAC_KEY_LENGTH 32 /* MAC Key length for AES-CBC Cipher suites */ #define DTLS_KEY_LENGTH 16 /* AES-128 */ #define DTLS_BLK_LENGTH 16 /* AES-128 */ #define DTLS_MAC_LENGTH DTLS_HMAC_DIGEST_SIZE -#define DTLS_IV_LENGTH 4 /* length of nonce_explicit */ +#define DTLS_CCM_IV_LENGTH 4 /* length of nonce_explicit */ #define DTLS_CBC_IV_LENGTH 16 /** @@ -54,8 +55,14 @@ * be large enough to hold the pre_master_secret, i.e. twice the length of the * pre-shared key + 1. */ +#define CCM_KB_LENGTH \ + (2 * DTLS_KEY_LENGTH + 2 * DTLS_CCM_IV_LENGTH) + +#define CBC_KB_LENGTH \ + (2 * DTLS_CBC_MAC_KEY_LENGTH + 2 * DTLS_KEY_LENGTH ) + #define MAX_KEYBLOCK_LENGTH \ - (2 * DTLS_MAC_KEY_LENGTH + 2 * DTLS_KEY_LENGTH + 2 * DTLS_IV_LENGTH) + ((CCM_KB_LENGTH) > (CBC_KB_LENGTH) ? (CCM_KB_LENGTH) : (CBC_KB_LENGTH) ) /** Length of DTLS master_secret */ #define DTLS_MASTER_SECRET_LENGTH 48 @@ -151,9 +158,59 @@ typedef struct { /* The following macros provide access to the components of the * key_block in the security parameters. */ +static inline int dtls_kb_mac_secret_size(dtls_cipher_t cipher) +{ + switch(cipher) + { + case TLS_NULL_WITH_NULL_NULL: + + return 0; + break; + + case TLS_ECDH_anon_WITH_AES_128_CBC_SHA_256: + case TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA_256: + + return DTLS_CBC_MAC_KEY_LENGTH; + break; + + case TLS_PSK_WITH_AES_128_CCM_8: + case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8: + + return DTLS_CCM_MAC_KEY_LENGTH; + break; + } + + return -1; +} + + +static inline int dtls_kb_iv_size(dtls_cipher_t cipher) +{ + switch(cipher) + { + case TLS_NULL_WITH_NULL_NULL: + case TLS_ECDH_anon_WITH_AES_128_CBC_SHA_256: + case TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA_256: + + return 0; + break; + + case TLS_PSK_WITH_AES_128_CCM_8: + case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8: + + return DTLS_CCM_IV_LENGTH; + break; + } + + return -1; +} + + + + #define dtls_kb_client_mac_secret(Param, Role) ((Param)->key_block) #define dtls_kb_server_mac_secret(Param, Role) \ - (dtls_kb_client_mac_secret(Param, Role) + DTLS_MAC_KEY_LENGTH) + (dtls_kb_client_mac_secret(Param, Role) + dtls_kb_mac_secret_size((Param)->cipher)) #define dtls_kb_remote_mac_secret(Param, Role) \ ((Role) == DTLS_SERVER \ ? dtls_kb_client_mac_secret(Param, Role) \ @@ -162,9 +219,8 @@ typedef struct { ((Role) == DTLS_CLIENT \ ? dtls_kb_client_mac_secret(Param, Role) \ : dtls_kb_server_mac_secret(Param, Role)) -#define dtls_kb_mac_secret_size(Param, Role) DTLS_MAC_KEY_LENGTH #define dtls_kb_client_write_key(Param, Role) \ - (dtls_kb_server_mac_secret(Param, Role) + DTLS_MAC_KEY_LENGTH) + (dtls_kb_server_mac_secret(Param, Role) + dtls_kb_mac_secret_size((Param)->cipher)) #define dtls_kb_server_write_key(Param, Role) \ (dtls_kb_client_write_key(Param, Role) + DTLS_KEY_LENGTH) #define dtls_kb_remote_write_key(Param, Role) \ @@ -179,7 +235,7 @@ typedef struct { #define dtls_kb_client_iv(Param, Role) \ (dtls_kb_server_write_key(Param, Role) + DTLS_KEY_LENGTH) #define dtls_kb_server_iv(Param, Role) \ - (dtls_kb_client_iv(Param, Role) + DTLS_IV_LENGTH) + (dtls_kb_client_iv(Param, Role) + dtls_kb_iv_size((Param)->cipher)) #define dtls_kb_remote_iv(Param, Role) \ ((Role) == DTLS_SERVER \ ? dtls_kb_client_iv(Param, Role) \ @@ -188,11 +244,10 @@ typedef struct { ((Role) == DTLS_CLIENT \ ? dtls_kb_client_iv(Param, Role) \ : dtls_kb_server_iv(Param, Role)) -#define dtls_kb_iv_size(Param, Role) DTLS_IV_LENGTH #define dtls_kb_size(Param, Role) \ - (2 * (dtls_kb_mac_secret_size(Param, Role) + \ - dtls_kb_key_size(Param, Role) + dtls_kb_iv_size(Param, Role))) + (2 * (dtls_kb_mac_secret_size((Param)->cipher) + \ + dtls_kb_key_size(Param, Role) + dtls_kb_iv_size((Param)->cipher))) /* just for consistency */ #define dtls_kb_digest_size(Param, Role) DTLS_MAC_LENGTH @@ -275,7 +330,8 @@ void dtls_mac(dtls_hmac_context_t *hmac_ctx, int dtls_encrypt(const unsigned char *src, size_t length, unsigned char *buf, unsigned char *nounce, - unsigned char *key, size_t keylen, + unsigned char *write_key, size_t write_keylen, + unsigned char *mac_key, size_t mac_keylen, const unsigned char *aad, size_t aad_length, const dtls_cipher_t cipher); @@ -300,7 +356,8 @@ int dtls_encrypt(const unsigned char *src, size_t length, int dtls_decrypt(const unsigned char *src, size_t length, unsigned char *buf, unsigned char *nounce, - unsigned char *key, size_t keylen, + unsigned char *read_key, size_t read_keylen, + unsigned char *mac_key, size_t mac_keylen, const unsigned char *a_data, size_t a_data_length, const dtls_cipher_t cipher); diff --git a/extlibs/tinydtls/dtls.c b/extlibs/tinydtls/dtls.c index 7815c66..2869aca 100644 --- a/extlibs/tinydtls/dtls.c +++ b/extlibs/tinydtls/dtls.c @@ -660,11 +660,11 @@ static void dtls_debug_keyblock(dtls_security_parameters_t *config) dtls_debug("key_block (%d bytes):\n", dtls_kb_size(config, peer->role)); dtls_debug_dump(" client_MAC_secret", dtls_kb_client_mac_secret(config, peer->role), - dtls_kb_mac_secret_size(config, peer->role)); + dtls_kb_mac_secret_size(config->cipher)); dtls_debug_dump(" server_MAC_secret", dtls_kb_server_mac_secret(config, peer->role), - dtls_kb_mac_secret_size(config, peer->role)); + dtls_kb_mac_secret_size(config->cipher)); dtls_debug_dump(" client_write_key", dtls_kb_client_write_key(config, peer->role), @@ -676,11 +676,11 @@ static void dtls_debug_keyblock(dtls_security_parameters_t *config) dtls_debug_dump(" client_IV", dtls_kb_client_iv(config, peer->role), - dtls_kb_iv_size(config, peer->role)); + dtls_kb_iv_size(config->cipher)); dtls_debug_dump(" server_IV", dtls_kb_server_iv(config, peer->role), - dtls_kb_iv_size(config, peer->role)); + dtls_kb_iv_size(config->cipher)); } /** returns the name of the goven handshake type number. @@ -835,6 +835,9 @@ calculate_key_block(dtls_context_t *ctx, /* create key_block from master_secret * key_block = PRF(master_secret, "key expansion" + tmp.random.server + tmp.random.client) */ + security->cipher = handshake->cipher; + security->compression = handshake->compression; + security->rseq = 0; dtls_prf(master_secret, DTLS_MASTER_SECRET_LENGTH, @@ -847,9 +850,6 @@ calculate_key_block(dtls_context_t *ctx, memcpy(handshake->tmp.master_secret, master_secret, DTLS_MASTER_SECRET_LENGTH); dtls_debug_keyblock(security); - security->cipher = handshake->cipher; - security->compression = handshake->compression; - security->rseq = 0; return 0; } @@ -1471,6 +1471,8 @@ dtls_prepare_record(dtls_peer_t *peer, dtls_security_parameters_t *security, start + DTLS_CBC_IV_LENGTH, nonce, dtls_kb_local_write_key(security, peer->role), dtls_kb_key_size(security, peer->role), + dtls_kb_local_mac_secret(security, peer->role), + dtls_kb_mac_secret_size(security->cipher), NULL, 0, security->cipher); if (res < 0) @@ -1553,8 +1555,8 @@ dtls_prepare_record(dtls_peer_t *peer, dtls_security_parameters_t *security, memset(nonce, 0, DTLS_CCM_BLOCKSIZE); memcpy(nonce, dtls_kb_local_iv(security, peer->role), - dtls_kb_iv_size(security, peer->role)); - memcpy(nonce + dtls_kb_iv_size(security, peer->role), start, 8); /* epoch + seq_num */ + dtls_kb_iv_size(security->cipher)); + memcpy(nonce + dtls_kb_iv_size(security->cipher), start, 8); /* epoch + seq_num */ dtls_debug_dump("nonce:", nonce, DTLS_CCM_BLOCKSIZE); dtls_debug_dump("key:", dtls_kb_local_write_key(security, peer->role), @@ -1572,6 +1574,8 @@ dtls_prepare_record(dtls_peer_t *peer, dtls_security_parameters_t *security, res = dtls_encrypt(start + 8, res - 8, start + 8, nonce, dtls_kb_local_write_key(security, peer->role), dtls_kb_key_size(security, peer->role), + dtls_kb_local_mac_secret(security, peer->role), + dtls_kb_mac_secret_size(security->cipher), A_DATA, A_DATA_LEN, security->cipher); @@ -2815,8 +2819,8 @@ dtls_send_client_hello(dtls_context_t *ctx, dtls_peer_t *peer, uint8 cookie[], size_t cookie_length) { uint8 buf[DTLS_CH_LENGTH_MAX]; uint8 *p = buf; - uint8_t cipher_size; - uint8_t extension_size; + uint8_t cipher_size = 0; + uint8_t extension_size = 0; int psk = 0; int ecdsa = 0; int ecdh_anon = 0; @@ -2850,7 +2854,13 @@ dtls_send_client_hello(dtls_context_t *ctx, dtls_peer_t *peer, } cipher_size = 2 + ((ecdsa || x509) ? 2 : 0) + (psk ? 2 : 0) + (ecdh_anon ? 2 : 0) + (ecdhe_psk ? 2 : 0); - extension_size = (ecdsa || x509) ? (2 + 6 + 6 + 8 + 6) : 0; + + /* Is extension needed? */ + extension_size = (ecdsa || x509 || ecdhe_psk || ecdh_anon) ? 2 : 0; + /* Supported EC and Supported Point Formats */ + extension_size += (ecdsa || x509 || ecdhe_psk | ecdh_anon) ? ( 8 + 6) : 0; + /* Supported Client and Server Cert Types */ + extension_size += (ecdsa || x509) ? ( 6 + 6) : 0; if (cipher_size == 0) { dtls_crit("no cipher callbacks implemented\n"); @@ -2944,7 +2954,7 @@ dtls_send_client_hello(dtls_context_t *ctx, dtls_peer_t *peer, p += sizeof(uint8); - /* client certificate type extension */ + /* server certificate type extension */ dtls_int_to_uint16(p, TLS_EXT_SERVER_CERTIFICATE_TYPE); p += sizeof(uint16); @@ -2964,7 +2974,9 @@ dtls_send_client_hello(dtls_context_t *ctx, dtls_peer_t *peer, dtls_int_to_uint8(p, TLS_CERT_TYPE_RAW_PUBLIC_KEY); p += sizeof(uint8); + } + if (ecdsa || x509 || ecdhe_psk || ecdh_anon ) { /* elliptic_curves */ dtls_int_to_uint16(p, TLS_EXT_ELLIPTIC_CURVES); p += sizeof(uint16); @@ -3646,6 +3658,8 @@ decrypt_verify(dtls_peer_t *peer, uint8 *packet, size_t length, clen = dtls_decrypt(*cleartext, clen, *cleartext, nonce, dtls_kb_remote_write_key(security, peer->role), dtls_kb_key_size(security, peer->role), + dtls_kb_remote_mac_secret(security, peer->role), + dtls_kb_mac_secret_size(security->cipher), NULL, 0, security->cipher); @@ -3663,10 +3677,10 @@ decrypt_verify(dtls_peer_t *peer, uint8 *packet, size_t length, memset(nonce, 0, DTLS_CCM_BLOCKSIZE); memcpy(nonce, dtls_kb_remote_iv(security, peer->role), - dtls_kb_iv_size(security, peer->role)); + dtls_kb_iv_size(security->cipher)); /* read epoch and seq_num from message */ - memcpy(nonce + dtls_kb_iv_size(security, peer->role), *cleartext, 8); + memcpy(nonce + dtls_kb_iv_size(security->cipher), *cleartext, 8); *cleartext += 8; clen -= 8; @@ -3687,6 +3701,8 @@ decrypt_verify(dtls_peer_t *peer, uint8 *packet, size_t length, clen = dtls_decrypt(*cleartext, clen, *cleartext, nonce, dtls_kb_remote_write_key(security, peer->role), dtls_kb_key_size(security, peer->role), + dtls_kb_remote_mac_secret(security, peer->role), + dtls_kb_mac_secret_size(security->cipher), A_DATA, A_DATA_LEN, security->cipher); } diff --git a/extlibs/tinydtls/tests/dtls-client.c b/extlibs/tinydtls/tests/dtls-client.c index 2c4eff9..279d91a 100644 --- a/extlibs/tinydtls/tests/dtls-client.c +++ b/extlibs/tinydtls/tests/dtls-client.c @@ -252,9 +252,9 @@ get_psk_info(struct dtls_context_t *ctx UNUSED_PARAM, return psk_client_id_length; case DTLS_PSK_KEY: if (id_len != psk_server_id_length || memcmp(psk_server_id, id, id_len) != 0) { - dtls_warn("PSK for unknown id requested, exiting\n"); - return dtls_alert_fatal_create(DTLS_ALERT_ILLEGAL_PARAMETER); - } else if (result_length < psk_key_length) { + dtls_debug("PSK for unknown id requested\n"); + } + if (result_length < psk_key_length) { dtls_warn("cannot set psk -- buffer too small\n"); return dtls_alert_fatal_create(DTLS_ALERT_INTERNAL_ERROR); } diff --git a/resource/c_common/SConscript b/resource/c_common/SConscript index d018d88..9bb80dc 100644 --- a/resource/c_common/SConscript +++ b/resource/c_common/SConscript @@ -22,18 +22,24 @@ Import('env') import os +target_os = env.get('TARGET_OS') + env.AppendUnique(CPPPATH = [ os.path.join(Dir('.').abspath), os.path.join(Dir('.').abspath, 'oic_malloc/include'), - os.path.join(Dir('.').abspath, 'oic_string/include') + os.path.join(Dir('.').abspath, 'oic_string/include'), + os.path.join(Dir('.').abspath, 'ocrandom/include') ]) -if env.get('TARGET_OS') == 'tizen': +if target_os == 'tizen': env.AppendUnique(LIBPATH = [env.get('BUILD_DIR')]) else: env.AppendUnique(LIBPATH = [os.path.join(env.get('BUILD_DIR'), 'resource/c_common')]) -env.AppendUnique(LIBS = ['c_common']) +if target_os in ['tizen', 'linux']: + env.ParseConfig("pkg-config --cflags --libs uuid") + +env.PrependUnique(LIBS = ['c_common']) common_env = env.Clone() @@ -45,9 +51,10 @@ common_env = env.Clone() # Source files and Targets ###################################################################### common_src = [ - 'oic_string/src/oic_string.c', - 'oic_malloc/src/oic_malloc.c' - ] + 'oic_string/src/oic_string.c', + 'oic_malloc/src/oic_malloc.c', + 'ocrandom/src/ocrandom.c', + ] commonlib = common_env.StaticLibrary('c_common', common_src) common_env.InstallTarget(commonlib, 'c_common') diff --git a/resource/csdk/ocrandom/include/ocrandom.h b/resource/c_common/ocrandom/include/ocrandom.h similarity index 100% rename from resource/csdk/ocrandom/include/ocrandom.h rename to resource/c_common/ocrandom/include/ocrandom.h diff --git a/resource/csdk/ocrandom/src/ocrandom.c b/resource/c_common/ocrandom/src/ocrandom.c similarity index 96% rename from resource/csdk/ocrandom/src/ocrandom.c rename to resource/c_common/ocrandom/src/ocrandom.c index debbee1..ff09112 100644 --- a/resource/csdk/ocrandom/src/ocrandom.c +++ b/resource/c_common/ocrandom/src/ocrandom.c @@ -50,6 +50,11 @@ #ifdef ARDUINO #include "Arduino.h" +// ARM GCC compiler doesnt define srandom function. +#if defined(ARDUINO) && !defined(ARDUINO_ARCH_SAM) +#define HAVE_SRANDOM 1 +#endif + uint8_t GetRandomBitRaw() { return analogRead((uint8_t)ANALOG_IN) & 0x1; @@ -143,7 +148,11 @@ int8_t OCSeedRandom() { result += result + GetRandomBit(); } - randomSeed(result); +#if HAVE_SRANDOM + srandom(result); +#else + srand(result); +#endif return 0; #endif @@ -173,7 +182,11 @@ uint8_t OCGetRandomByte(void) #if defined(__ANDROID__) || defined(__linux__) || defined(__APPLE__) return rand() & 0x00FF; #elif defined ARDUINO - return random(256) & 0x00FF; +#ifdef HAVE_SRANDOM + return random() & 0x00FF; +#else + return rand() & 0x00FF; +#endif #endif } diff --git a/resource/csdk/ocrandom/test/SConscript b/resource/c_common/ocrandom/test/SConscript similarity index 97% rename from resource/csdk/ocrandom/test/SConscript rename to resource/c_common/ocrandom/test/SConscript index 2e7bc52..86e08a1 100644 --- a/resource/csdk/ocrandom/test/SConscript +++ b/resource/c_common/ocrandom/test/SConscript @@ -63,4 +63,4 @@ if env.get('TEST') == '1': from tools.scons.RunTest import * run_test(randomtest_env, 'resource_csdk_random_test.memcheck', - 'resource/csdk/ocrandom/test/randomtests') + 'resource/c_common/ocrandom/test/randomtests') diff --git a/resource/csdk/ocrandom/test/android/randomtest.cpp b/resource/c_common/ocrandom/test/android/randomtest.cpp similarity index 100% rename from resource/csdk/ocrandom/test/android/randomtest.cpp rename to resource/c_common/ocrandom/test/android/randomtest.cpp diff --git a/resource/csdk/ocrandom/test/arduino/randomtest.cpp b/resource/c_common/ocrandom/test/arduino/randomtest.cpp similarity index 100% rename from resource/csdk/ocrandom/test/arduino/randomtest.cpp rename to resource/c_common/ocrandom/test/arduino/randomtest.cpp diff --git a/resource/csdk/ocrandom/test/linux/randomtest.cpp b/resource/c_common/ocrandom/test/linux/randomtest.cpp similarity index 100% rename from resource/csdk/ocrandom/test/linux/randomtest.cpp rename to resource/c_common/ocrandom/test/linux/randomtest.cpp diff --git a/resource/csdk/SConscript b/resource/csdk/SConscript index df647b8..fbbad61 100644 --- a/resource/csdk/SConscript +++ b/resource/csdk/SConscript @@ -43,7 +43,6 @@ liboctbstack_env.PrependUnique(CPPPATH = [ '../../extlibs/cjson/', '../../extlibs/timer/', 'logger/include', - 'ocrandom/include', 'stack/include', 'stack/include/internal', '../oc_logger/include', @@ -79,8 +78,8 @@ if target_os in ['android', 'linux', 'tizen']: liboctbstack_env.AppendUnique(LIBS = ['coap', 'm']) -if target_os == 'tizen': - liboctbstack_env.ParseConfig("pkg-config --cflags --libs uuid") +if target_os in ['tizen', 'linux']: + liboctbstack_env.ParseConfig("pkg-config --cflags --libs uuid") if target_os not in ['android', 'arduino', 'windows', 'winrt']: liboctbstack_env.AppendUnique(LIBS = ['pthread']) @@ -128,7 +127,6 @@ liboctbstack_src = [ OCTBSTACK_SRC + 'occollection.c', OCTBSTACK_SRC + 'oicgroup.c', 'logger/src/logger.c', - 'ocrandom/src/ocrandom.c', OCTBSTACK_SRC + "rdpayload.c" ] diff --git a/resource/csdk/connectivity/SConscript b/resource/csdk/connectivity/SConscript index 0e37d4b..5de9342 100644 --- a/resource/csdk/connectivity/SConscript +++ b/resource/csdk/connectivity/SConscript @@ -60,7 +60,7 @@ else: env.AppendUnique(CPPDEFINES = ['NO_IP_ADAPTER']) if with_tcp == True: - if target_os in['linux']: + if target_os in ['linux', 'tizen']: env.AppendUnique(CPPDEFINES = ['TCP_ADAPTER']) print "CA Transport is TCP" else: diff --git a/resource/csdk/connectivity/build/SConscript b/resource/csdk/connectivity/build/SConscript index 045faab..953f3f3 100644 --- a/resource/csdk/connectivity/build/SConscript +++ b/resource/csdk/connectivity/build/SConscript @@ -60,12 +60,13 @@ help_vars = Variables() help_vars.Add(BoolVariable('RELEASE', 'Build for release?', True)) # set to 'no', 'false' or 0 for debug help_vars.Add(BoolVariable('LOGGING', 'Enable stack logging', False)) help_vars.Add(EnumVariable('TARGET_OS', 'Target platform', host, host_target_map[host])) -help_vars.Add(ListVariable('TARGET_TRANSPORT', 'Target transport', 'ALL', ['ALL', 'BT', 'BLE', 'IP', 'TCP'])) +help_vars.Add(ListVariable('TARGET_TRANSPORT', 'Target transport', 'ALL', ['ALL', 'BT', 'BLE', 'IP'])) help_vars.Add(EnumVariable('TARGET_ARCH', 'Target architecture', default_arch, os_arch_map[target_os])) help_vars.Add(EnumVariable('SECURED', 'Build with DTLS', '0', allowed_values=('0', '1'))) help_vars.Add(BoolVariable('UPLOAD', 'Upload binary ? (For Arduino)', require_upload)) help_vars.Add(EnumVariable('ROUTING', 'Enable routing', 'EP', allowed_values=('GW', 'EP'))) help_vars.Add(EnumVariable('BUILD_SAMPLE', 'Build with sample', 'ON', allowed_values=('ON', 'OFF'))) +help_vars.Add(BoolVariable('WITH_TCP', 'Enable TCP', False)) help_vars.AddVariables(('DEVICE_NAME', 'Network display name for device', 'OIC-DEVICE', None, None),) diff --git a/resource/csdk/connectivity/build/tizen/SConscript b/resource/csdk/connectivity/build/tizen/SConscript index c8c105c..57a4e90 100644 --- a/resource/csdk/connectivity/build/tizen/SConscript +++ b/resource/csdk/connectivity/build/tizen/SConscript @@ -12,12 +12,13 @@ buildsample = env.get('BUILD_SAMPLE') release_mode = env.get('RELEASE') secured = env.get('SECURED') logging = env.get('LOGGING') +with_tcp = env.get('WITH_TCP') print "Given Transport is %s" % transport print "Given OS is %s" % target_os if target_os == 'tizen': - command = "sh resource/csdk/connectivity/build/tizen/gbsbuild.sh %s %s %s %s %s" % (transport, secured, buildsample, release_mode, logging) + command = "sh resource/csdk/connectivity/build/tizen/gbsbuild.sh %s %s %s %s %s %s" % (transport, secured, buildsample, release_mode, logging, with_tcp) print "Created Command is %s" % command gbs_script = env.Command('gbs_build', None, command) AlwaysBuild ('gbs_script') \ No newline at end of file diff --git a/resource/csdk/connectivity/build/tizen/gbsbuild.sh b/resource/csdk/connectivity/build/tizen/gbsbuild.sh index ac2ba58..6ab0e87 100755 --- a/resource/csdk/connectivity/build/tizen/gbsbuild.sh +++ b/resource/csdk/connectivity/build/tizen/gbsbuild.sh @@ -25,8 +25,12 @@ export RELEASE=$4 echo $5 export LOGGING=$5 +echo $6 +export WITH_TCP=$6 + echo $TARGET_TRANSPORT echo $BUILD_SAMPLE +echo $WITH_TCP rm -rf $name-$version @@ -90,7 +94,7 @@ if [ ! -d .git ]; then fi echo "Calling core gbs build command" -gbscommand="gbs build -A armv7l --include-all --repository ./ --define 'TARGET_TRANSPORT $1' --define 'SECURED $2' --define 'RELEASE $4' --define 'LOGGING $5'" +gbscommand="gbs build -A armv7l --include-all --repository ./ --define 'TARGET_TRANSPORT $1' --define 'SECURED $2' --define 'RELEASE $4' --define 'LOGGING $5' --define 'WITH_TCP $6'" echo $gbscommand if eval $gbscommand; then echo "Core build is successful" diff --git a/resource/csdk/connectivity/build/tizen/packaging/com.oic.ca.spec b/resource/csdk/connectivity/build/tizen/packaging/com.oic.ca.spec index 1602200..8c3a25b 100644 --- a/resource/csdk/connectivity/build/tizen/packaging/com.oic.ca.spec +++ b/resource/csdk/connectivity/build/tizen/packaging/com.oic.ca.spec @@ -20,6 +20,7 @@ BuildRequires: boost-thread BuildRequires: boost-system BuildRequires: boost-filesystem BuildRequires: scons +BuildRequires: pkgconfig(uuid) %description @@ -34,7 +35,7 @@ SLP oicca application echo %{ROOTDIR} scons TARGET_OS=tizen -c -scons TARGET_OS=tizen TARGET_TRANSPORT=%{TARGET_TRANSPORT} SECURED=%{SECURED} RELEASE=%{RELEASE} LOGGING=%{LOGGING} +scons TARGET_OS=tizen TARGET_TRANSPORT=%{TARGET_TRANSPORT} SECURED=%{SECURED} RELEASE=%{RELEASE} LOGGING=%{LOGGING} WITH_TCP=%{WITH_TCP} %install mkdir -p %{DEST_INC_DIR} diff --git a/resource/csdk/connectivity/build/tizen/scons/SConscript b/resource/csdk/connectivity/build/tizen/scons/SConscript index 9a9644d..a06d5ee 100644 --- a/resource/csdk/connectivity/build/tizen/scons/SConscript +++ b/resource/csdk/connectivity/build/tizen/scons/SConscript @@ -7,6 +7,7 @@ Import('env') target_os = env.get('TARGET_OS') transport = env.get('TARGET_TRANSPORT') +with_tcp = env.get('WITH_TCP') print "Given Transport is %s" % transport @@ -41,6 +42,12 @@ else: else: env.AppendUnique(CPPDEFINES = ['NO_WIFI_ADAPTER']) + if with_tcp == True: + env.AppendUnique(CPPDEFINES = ['TCP_ADAPTER']) + print "CA Transport is TCP" + else: + env.AppendUnique(CPPDEFINES = ['NO_TCP_ADAPTER']) + env.SConscript(['../con/lib/libcoap-4.1.1/SConscript']) env.SConscript(['../con/SConscript']) diff --git a/resource/csdk/connectivity/common/inc/logger.h b/resource/csdk/connectivity/common/inc/logger.h index e48ee7c..558b1c5 100644 --- a/resource/csdk/connectivity/common/inc/logger.h +++ b/resource/csdk/connectivity/common/inc/logger.h @@ -179,8 +179,6 @@ void OICLogv(LogLevel level, PROGMEM const char *tag, const int16_t lineNum, #define OIC_LOG_BUFFER(level, tag, buffer, bufferSize) #else // These macros are defined for Linux, Android, and Arduino #define OIC_LOG_INIT() OICLogInit() -#define OIC_LOG_BUFFER(level, tag, buffer, bufferSize)\ - OICLogBuffer((level), (tag), (buffer), (bufferSize)) #ifdef ARDUINO #define OIC_LOG_CONFIG(ctx) @@ -189,11 +187,15 @@ void OICLogv(LogLevel level, PROGMEM const char *tag, const int16_t lineNum, #define OIC_LOG_V(level, tag, ...) // To enable OIC_LOG_V, uncomment the below //#define OIC_LOG_V(level, tag, format, ...) OICLogv((level), PCF(tag), __LINE__, PCF(format), __VA_ARGS__) +#define OIC_LOG_BUFFER(level, tag, buffer, bufferSize)\ + OICLogBuffer((level), PCF(tag), (buffer), (bufferSize)) #else #define OIC_LOG_CONFIG(ctx) OICLogConfig((ctx)) #define OIC_LOG_SHUTDOWN() OICLogShutdown() #define OIC_LOG(level, tag, logStr) OICLog((level), (tag), (logStr)) #define OIC_LOG_V(level, tag, ...) OICLogv((level), (tag), __VA_ARGS__) +#define OIC_LOG_BUFFER(level, tag, buffer, bufferSize)\ + OICLogBuffer((level), tag, (buffer), (bufferSize)) #endif //ARDUINO #endif //__TIZEN__ #else //TB_LOG @@ -211,4 +213,4 @@ void OICLogv(LogLevel level, PROGMEM const char *tag, const int16_t lineNum, #ifdef __cplusplus } #endif // __cplusplus -#endif /* U_LOGGER_H_ */ \ No newline at end of file +#endif /* U_LOGGER_H_ */ diff --git a/resource/csdk/connectivity/common/src/caremotehandler.c b/resource/csdk/connectivity/common/src/caremotehandler.c index a39b7d4..1315dae 100644 --- a/resource/csdk/connectivity/common/src/caremotehandler.c +++ b/resource/csdk/connectivity/common/src/caremotehandler.c @@ -55,6 +55,20 @@ CARequestInfo_t *CACloneRequestInfo(const CARequestInfo_t *rep) return NULL; } + // check the method type of request info. + // Keep this check in sync with CAMethod_t + switch (rep->method) + { + case CA_GET: + case CA_POST: + case CA_PUT: + case CA_DELETE: + break; + default: + OIC_LOG_V(ERROR, TAG, "Method %u is invalid", rep->method); + return NULL; + } + // allocate the request info structure. CARequestInfo_t *clone = (CARequestInfo_t *) OICMalloc(sizeof(CARequestInfo_t)); if (!clone) diff --git a/resource/csdk/connectivity/common/src/ulinklist.c b/resource/csdk/connectivity/common/src/ulinklist.c index e75c49f..e796f4b 100644 --- a/resource/csdk/connectivity/common/src/ulinklist.c +++ b/resource/csdk/connectivity/common/src/ulinklist.c @@ -124,6 +124,8 @@ CAResult_t u_linklist_free(u_linklist_t **linklist) (*linklist)->size -= 1; } + + OICFree(*linklist); *linklist=NULL; return CA_STATUS_OK; diff --git a/resource/csdk/connectivity/inc/caadapterutils.h b/resource/csdk/connectivity/inc/caadapterutils.h index 7c9611b..d146678 100644 --- a/resource/csdk/connectivity/inc/caadapterutils.h +++ b/resource/csdk/connectivity/inc/caadapterutils.h @@ -212,13 +212,16 @@ void CAClearNetInterfaceInfoList(u_arraylist_t *infoList); */ void CAClearServerInfoList(u_arraylist_t *serverInfoList); +#ifndef WITH_ARDUINO /** * Convert address from binary to string. - * @param[in] ipaddr IP address info. - * @param[out] host address string (must be CA_IPADDR_SIZE). - * @param[out] port host order port number. + * @param[in] sockAddr IP address info. + * @param[in] sockAddrLen size of sockAddr. + * @param[out] host address string (must be CA_IPADDR_SIZE). + * @param[out] port host order port number. */ -void CAConvertAddrToName(const struct sockaddr_storage *sockaddr, char *host, uint16_t *port); +void CAConvertAddrToName(const struct sockaddr_storage *sockAddr, socklen_t sockAddrLen, + char *host, uint16_t *port); /** * Convert address from string to binary. @@ -227,6 +230,7 @@ void CAConvertAddrToName(const struct sockaddr_storage *sockaddr, char *host, ui * @param[out] ipaddr IP address info. */ void CAConvertNameToAddr(const char *host, uint16_t port, struct sockaddr_storage *sockaddr); +#endif /* WITH_ARDUINO */ #ifdef __ANDROID__ /** diff --git a/resource/csdk/connectivity/inc/cablockwisetransfer.h b/resource/csdk/connectivity/inc/cablockwisetransfer.h index 49461f8..3b2878b 100644 --- a/resource/csdk/connectivity/inc/cablockwisetransfer.h +++ b/resource/csdk/connectivity/inc/cablockwisetransfer.h @@ -329,16 +329,24 @@ CAResult_t CAAddBlockOption1(coap_pdu_t **pdu, const CAInfo_t *info, size_t data const CABlockDataID_t *blockID, coap_list_t **options); /** - * Add the block option in pdu data. - * @param[in] pdu pdu object. + * Add the block option in option list. * @param[out] block block data. * @param[in] blockType block option type. + * @param[out] options option list. * @return ::CASTATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h). */ -CAResult_t CAAddBlockOptionImpl(coap_pdu_t *pdu, coap_block_t *block, uint8_t blockType, +CAResult_t CAAddBlockOptionImpl(coap_block_t *block, uint8_t blockType, coap_list_t **options); /** + * Add the option list in pdu data. + * @param[out] pdu pdu object. + * @param[out] options option list. + * @return ::CASTATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h). + */ +CAResult_t CAAddOptionToPDU(coap_pdu_t *pdu, coap_list_t **options); + +/** * Add the size option in pdu data. * @param[in/out] pdu pdu object. * @param[in] sizeType size option type. diff --git a/resource/csdk/connectivity/lib/libcoap-4.1.1/SConscript b/resource/csdk/connectivity/lib/libcoap-4.1.1/SConscript index ded6fd0..876bc03 100644 --- a/resource/csdk/connectivity/lib/libcoap-4.1.1/SConscript +++ b/resource/csdk/connectivity/lib/libcoap-4.1.1/SConscript @@ -37,7 +37,7 @@ if target_os not in ['windows', 'winrt']: libcoap_env.AppendUnique(CFLAGS = ['-Wall', '-ffunction-sections', '-fdata-sections', '-fno-exceptions']) -if target_os == 'linux': +if target_os in ['linux', 'tizen']: if with_tcp == True: libcoap_env.AppendUnique(CPPDEFINES = ['WITH_TCP']) diff --git a/resource/csdk/connectivity/lib/libcoap-4.1.1/pdu.c b/resource/csdk/connectivity/lib/libcoap-4.1.1/pdu.c index 175394b..e4f40d6 100644 --- a/resource/csdk/connectivity/lib/libcoap-4.1.1/pdu.c +++ b/resource/csdk/connectivity/lib/libcoap-4.1.1/pdu.c @@ -330,6 +330,9 @@ unsigned int coap_get_length_from_header(const unsigned char *header, coap_trans unsigned int length_field_data = 0; switch(transport) { + case coap_tcp: + length = header[0] >> 4; + break; case coap_tcp_8bit: length = header[1] + COAP_TCP_LENGTH_FIELD_8_BIT; break; diff --git a/resource/csdk/connectivity/lib/libcoap-4.1.1/pdu.h b/resource/csdk/connectivity/lib/libcoap-4.1.1/pdu.h index 87f6044..1e19c85 100644 --- a/resource/csdk/connectivity/lib/libcoap-4.1.1/pdu.h +++ b/resource/csdk/connectivity/lib/libcoap-4.1.1/pdu.h @@ -194,7 +194,7 @@ typedef enum #ifdef WORDS_BIGENDIAN typedef union { - typedef struct + struct { unsigned int version:2; /* protocol version */ unsigned int type:2; /* type flag */ diff --git a/resource/csdk/connectivity/samples/android/casample/sampleService/src/main/jni/ResourceModel.c b/resource/csdk/connectivity/samples/android/casample/sampleService/src/main/jni/ResourceModel.c index 9e032ee..5e08bb4 100644 --- a/resource/csdk/connectivity/samples/android/casample/sampleService/src/main/jni/ResourceModel.c +++ b/resource/csdk/connectivity/samples/android/casample/sampleService/src/main/jni/ResourceModel.c @@ -597,7 +597,13 @@ Java_org_iotivity_ca_service_RMInterface_RMSendResponse(JNIEnv *env, jobject obj CAResponseInfo_t responseInfo = { 0 }; - if (msgType != CA_MSG_RESET) + if (CA_MSG_RESET == msgType || + (CA_MSG_ACKNOWLEDGE == msgType && CA_EMPTY == responseValue)) + { + printf("RESET or ACK/EMPTY. there will be not payload/option\n"); + responseInfo.result = CA_EMPTY; + } + else { responseData.token = g_clientToken; responseData.tokenLength = g_clientTokenLength; @@ -607,23 +613,18 @@ Java_org_iotivity_ca_service_RMInterface_RMSendResponse(JNIEnv *env, jobject obj { uint32_t length = strlen(SECURE_INFO_DATA) + strlen(g_resourceUri) + 1; responseData.payload = (CAPayload_t) malloc(length); - sprintf((char *) responseData.payload, SECURE_INFO_DATA, g_resourceUri, - g_localSecurePort); + snprintf((char *) responseData.payload, length, SECURE_INFO_DATA, + g_resourceUri, g_localSecurePort); responseData.payloadSize = length; } else { uint32_t length = strlen(NORMAL_INFO_DATA) + strlen(g_resourceUri) + 1; responseData.payload = (CAPayload_t) malloc(length); - sprintf((char *) responseData.payload, NORMAL_INFO_DATA, g_resourceUri); + snprintf((char *) responseData.payload, length, NORMAL_INFO_DATA, g_resourceUri); responseData.payloadSize = length; } } - //msgType is RESET - else - { - responseInfo.result = CA_EMPTY; - } responseInfo.info = responseData; @@ -642,6 +643,7 @@ Java_org_iotivity_ca_service_RMInterface_RMSendResponse(JNIEnv *env, jobject obj // destroy remote endpoint CADestroyEndpoint(g_clientEndpoint); g_clientEndpoint = NULL; + free(responseData.payload); } JNIEXPORT void JNICALL @@ -743,7 +745,8 @@ Java_org_iotivity_ca_service_RMInterface_RMSendNotification(JNIEnv *env, jobject free(requestData.resourceUri); return; } - snprintf((char *) requestData.payload, length, SECURE_INFO_DATA, resourceURI, g_localSecurePort); + snprintf((char *) requestData.payload, length, SECURE_INFO_DATA, + resourceURI, g_localSecurePort); requestData.payloadSize = length; } else @@ -861,12 +864,12 @@ Java_org_iotivity_ca_service_RMInterface_RMGetNetworkInfomation(JNIEnv *env, job { char networkInfo[NETWORK_INFO_LENGTH]; LOGI("Type: %d", tempInfo[index].adapter); - sprintf(networkInfo, "%d",tempInfo[index].adapter); + snprintf(networkInfo, NETWORK_INFO_LENGTH, "%d",tempInfo[index].adapter); callback("Type :", networkInfo); if (CA_ADAPTER_IP == tempInfo[index].adapter) { LOGI("Port: %d", tempInfo[index].port); - sprintf(networkInfo, "%d",tempInfo[index].port); + snprintf(networkInfo, NETWORK_INFO_LENGTH, "%d",tempInfo[index].port); callback("Port: ", networkInfo); } LOGI("Secured: %d", (tempInfo[index].flags & CA_SECURE)); @@ -979,7 +982,7 @@ void request_handler(const CAEndpoint_t* object, const CARequestInfo_t* requestI free(g_remoteAddress); char portInfo[PORT_LENGTH] = { 0, }; - sprintf(portInfo, "%d", object->port); + snprintf(portInfo, PORT_LENGTH, "%d", object->port); callback("Remote Port: ", portInfo); //clone g_clientEndpoint @@ -1070,9 +1073,10 @@ void request_handler(const CAEndpoint_t* object, const CARequestInfo_t* requestI if (NULL != g_responseListenerObject) { char optionInfo[OPTION_INFO_LENGTH] = { 0, }; - sprintf(optionInfo, "Num[%d] - ID : %d, Option Length : %d", i + 1, - requestInfo->info.options[i].optionID, - requestInfo->info.options[i].optionLength); + snprintf(optionInfo, OPTION_INFO_LENGTH, + "Num[%d] - ID : %d, Option Length : %d", i + 1, + requestInfo->info.options[i].optionID, + requestInfo->info.options[i].optionLength); callback("Option info: ", optionInfo); @@ -1177,7 +1181,7 @@ void response_handler(const CAEndpoint_t* object, const CAResponseInfo_t* respon free(g_remoteAddress); char portInfo[PORT_LENGTH] = { 0, }; - sprintf(portInfo, "%d", object->port); + snprintf(portInfo, PORT_LENGTH, "%d", object->port); callback("Remote Port: ", portInfo); if (NULL != responseInfo->info.payload && responseInfo->info.payloadSize) @@ -1219,9 +1223,10 @@ void response_handler(const CAEndpoint_t* object, const CAResponseInfo_t* respon if (NULL != g_responseListenerObject) { char optionInfo[OPTION_INFO_LENGTH] = { 0, }; - sprintf(optionInfo, "Num[%d] - ID : %d, Option Length : %d", i + 1, - responseInfo->info.options[i].optionID, - responseInfo->info.options[i].optionLength); + snprintf(optionInfo, OPTION_INFO_LENGTH, + "Num[%d] - ID : %d, Option Length : %d", i + 1, + responseInfo->info.options[i].optionID, + responseInfo->info.options[i].optionLength); callback("Option info: ", optionInfo); @@ -1641,6 +1646,12 @@ bool read_file(const char* name, char** bytes, size_t* length) // Get file length fseek(file, 0, SEEK_END); fileLen = ftell(file); + if (-1 == fileLen) + { + fprintf(stderr, "Failed to read file length"); + fclose(file); + return false; + } fseek(file, 0, SEEK_SET); LOGI("file size: %d", fileLen); @@ -1693,7 +1704,7 @@ void saveFile(const char *payload, size_t payloadSize) char* path = calloc(1, sizeof(char) * path_length); if (path != NULL) { - sprintf(path, RECEIVED_FILE_PATH, day, timeString); + snprintf(path, path_length, RECEIVED_FILE_PATH, day, timeString); LOGI("received file path: %s", path); FILE *fp = fopen(path, "wt"); diff --git a/resource/csdk/connectivity/samples/linux/sample_main.c b/resource/csdk/connectivity/samples/linux/sample_main.c index 5e10a8d..8332183 100644 --- a/resource/csdk/connectivity/samples/linux/sample_main.c +++ b/resource/csdk/connectivity/samples/linux/sample_main.c @@ -994,6 +994,7 @@ void request_handler(const CAEndpoint_t *object, const CARequestInfo_t *requestI } printf("Data: %s\n", requestInfo->info.payload); printf("Message type: %s\n", MESSAGE_TYPE[requestInfo->info.type]); + printf("Resource URI: %s \n", requestInfo->info.resourceUri); if (requestInfo->info.options) { @@ -1061,6 +1062,8 @@ void response_handler(const CAEndpoint_t *object, const CAResponseInfo_t *respon printf("Data: %s\n", responseInfo->info.payload); printf("Message type: %s\n", MESSAGE_TYPE[responseInfo->info.type]); printf("Token: %s\n", responseInfo->info.token); + printf("Resource URI: %s \n", responseInfo->info.resourceUri); + if (responseInfo->info.options) { uint32_t len = responseInfo->info.numOptions; @@ -1203,7 +1206,13 @@ void send_response(const CAEndpoint_t *endpoint, const CAInfo_t *info) .payloadSize = 0, .resourceUri = resourceUri }; - if(CA_MSG_RESET != messageType) + if (CA_MSG_RESET == messageType || + (CA_MSG_ACKNOWLEDGE == messageType && CA_EMPTY == responseCode)) + { + printf("RESET or ACK/EMPTY. there will be not payload/option\n"); + + } + else { responseData.token = (info != NULL) ? info->token : NULL; responseData.tokenLength = (info != NULL) ? info->tokenLength : 0; @@ -1638,6 +1647,12 @@ bool read_file(const char* name, CAPayload_t* bytes, size_t* length) // Get file length fseek(file, 0, SEEK_END); fileLen = ftell(file); + if (-1 == fileLen) + { + fprintf(stderr, "Failed to get file length\n"); + fclose(file); + return false; + } fseek(file, 0, SEEK_SET); // Allocate memory diff --git a/resource/csdk/connectivity/samples/tizen/casample.c b/resource/csdk/connectivity/samples/tizen/casample.c index 162b512..7e0810f 100644 --- a/resource/csdk/connectivity/samples/tizen/casample.c +++ b/resource/csdk/connectivity/samples/tizen/casample.c @@ -59,6 +59,9 @@ #define COAPS_PREFIX "coaps://" #define COAPS_PREFIX_LEN 8 +#define COAP_TCP_PREFIX "coap+tcp://" +#define COAP_TCP_PREFIX_LEN 11 + // Iotivity Device Identity. const unsigned char IDENTITY[] = ("1111111111111111"); @@ -425,6 +428,7 @@ void send_request() printf("Enter the URI like below....\n"); printf("coap://10.11.12.13:4545/resource_uri ( for IP )\n"); printf("coap://10:11:12:13:45:45/resource_uri ( for BT )\n"); + printf("coap+tcp://10:11:12:13:45:45/resource_uri ( for TCP )\n"); } else { @@ -808,6 +812,7 @@ void select_network() printf("IP : 0\n"); printf("GATT : 1\n"); printf("RFCOMM : 2\n"); + printf("TCP : 4\n"); printf("select : "); char buf[MAX_BUF_LEN] = { 0 }; @@ -818,7 +823,7 @@ void select_network() int number = buf[0] - '0'; - if (number < 0 || number > 3) + if (number < 0 || number > 4) { printf("Invalid network type\n"); return; @@ -844,6 +849,7 @@ void unselect_network() printf("IP : 0\n"); printf("GATT : 1\n"); printf("RFCOMM : 2\n"); + printf("TCP : 4\n"); printf("select : "); char buf[MAX_BUF_LEN] = { 0 }; @@ -854,7 +860,7 @@ void unselect_network() int number = buf[0] - '0'; - if (number < 0 || number > 3) + if (number < 0 || number > 4) { printf("Invalid network type\n"); return; @@ -1311,6 +1317,7 @@ CAResult_t get_network_type() printf("IP : 0\n"); printf("GATT : 1\n"); printf("RFCOMM : 2\n"); + printf("TCP : 4\n"); printf("select : "); char buf[MAX_BUF_LEN] = { 0 }; @@ -1320,7 +1327,7 @@ CAResult_t get_network_type() } int number = buf[0] - '0'; - if (0 > number || 2 < number) + if (0 > number || 4 < number) { printf("\nInvalid Network type"); return CA_NOT_SUPPORTED; @@ -1372,6 +1379,12 @@ void parse_coap_uri(const char* uri, addressSet_t* address, CATransportFlags_t * startIndex = COAP_PREFIX_LEN; *flags = CA_IPV4; } + else if (strncmp(COAP_TCP_PREFIX, uri, COAP_TCP_PREFIX_LEN) == 0) + { + printf("uri has '%s' prefix\n", COAP_TCP_PREFIX); + startIndex = COAP_TCP_PREFIX_LEN; + *flags = CA_IPV4; + } // #2. copy uri for parse int32_t len = strlen(uri) - startIndex; diff --git a/resource/csdk/connectivity/src/SConscript b/resource/csdk/connectivity/src/SConscript index 8c4309c..367590a 100755 --- a/resource/csdk/connectivity/src/SConscript +++ b/resource/csdk/connectivity/src/SConscript @@ -112,9 +112,6 @@ env.AppendUnique(CA_SRC = ca_common_src) if 'ALL' in ca_transport: transports = [ 'ip_adapter', 'bt_edr_adapter', 'bt_le_adapter'] - if ca_os == 'linux': - if with_tcp: - transports.append ('tcp_adapter') if with_ra: transports.append ('ra_adapter') env.SConscript(dirs = [ @@ -129,6 +126,9 @@ if 'BT' in ca_transport: if 'BLE' in ca_transport: env.SConscript(os.path.join(ca_path, 'bt_le_adapter/SConscript')) +if ca_os in ['linux', 'tizen']: + if with_tcp == True: + env.SConscript(os.path.join(ca_path, 'tcp_adapter/SConscript')) print "Include path is %s" % env.get('CPPPATH') print "Files path is %s" % env.get('CA_SRC') diff --git a/resource/csdk/connectivity/src/adapter_util/caadapternetdtls.c b/resource/csdk/connectivity/src/adapter_util/caadapternetdtls.c index 599423c..7d7eba2 100644 --- a/resource/csdk/connectivity/src/adapter_util/caadapternetdtls.c +++ b/resource/csdk/connectivity/src/adapter_util/caadapternetdtls.c @@ -417,7 +417,7 @@ static int32_t CAReadDecryptedPayload(dtls_context_t *context, ((addrInfo->addr.st.ss_family == AF_INET) ? CA_IPV4 : CA_IPV6) | CA_SECURE, .port = 0 }, .identity = { 0 } }; - CAConvertAddrToName(&(addrInfo->addr.st), sep.endpoint.addr, &sep.endpoint.port); + CAConvertAddrToName(&(addrInfo->addr.st), addrInfo->size, sep.endpoint.addr, &sep.endpoint.port); if (NULL == g_caDtlsContext) { @@ -468,7 +468,7 @@ static int32_t CASendSecureData(dtls_context_t *context, CAEndpoint_t endpoint = {.adapter = CA_DEFAULT_ADAPTER}; - CAConvertAddrToName(&(addrInfo->addr.st), endpoint.addr, &endpoint.port); + CAConvertAddrToName(&(addrInfo->addr.st), addrInfo->size, endpoint.addr, &endpoint.port); endpoint.flags = addrInfo->addr.st.ss_family == AF_INET ? CA_IPV4 : CA_IPV6; endpoint.flags |= CA_SECURE; endpoint.adapter = CA_ADAPTER_IP; @@ -515,7 +515,7 @@ static int32_t CAHandleSecureEvent(dtls_context_t *context, stCADtlsAddrInfo_t *addrInfo = (stCADtlsAddrInfo_t *)session; char peerAddr[MAX_ADDR_STR_SIZE_CA] = { 0 }; uint16_t port = 0; - CAConvertAddrToName(&(addrInfo->addr.st), peerAddr, &port); + CAConvertAddrToName(&(addrInfo->addr.st), addrInfo->size, peerAddr, &port); CARemovePeerFromPeerInfoList(peerAddr, port); } @@ -553,7 +553,7 @@ static int32_t CAGetPskCredentials(dtls_context_t *ctx, stCADtlsAddrInfo_t *addrInfo = (stCADtlsAddrInfo_t *)session; char peerAddr[MAX_ADDR_STR_SIZE_CA] = { 0 }; uint16_t port = 0; - CAConvertAddrToName(&(addrInfo->addr.st), peerAddr, &port); + CAConvertAddrToName(&(addrInfo->addr.st), addrInfo->size, peerAddr, &port); if(CA_STATUS_OK != CAAddIdToPeerInfoList(peerAddr, port, desc, descLen) ) { @@ -933,7 +933,7 @@ static int CAVerifyCertificate(struct dtls_context_t *ctx, const session_t *sess stCADtlsAddrInfo_t *addrInfo = (stCADtlsAddrInfo_t *)session; char peerAddr[MAX_ADDR_STR_SIZE_CA] = { 0 }; uint16_t port = 0; - CAConvertAddrToName(&(addrInfo->addr.st), peerAddr, &port); + CAConvertAddrToName(&(addrInfo->addr.st), addrInfo->size, peerAddr, &port); CAResult_t result = CAAddIdToPeerInfoList(peerAddr, port, crtChain[0].subject.data + DER_SUBJECT_HEADER_LEN + 2, crtChain[0].subject.data[DER_SUBJECT_HEADER_LEN + 1]); diff --git a/resource/csdk/connectivity/src/adapter_util/caadapterutils.c b/resource/csdk/connectivity/src/adapter_util/caadapterutils.c index 4d8e442..3022e99 100644 --- a/resource/csdk/connectivity/src/adapter_util/caadapterutils.c +++ b/resource/csdk/connectivity/src/adapter_util/caadapterutils.c @@ -122,14 +122,15 @@ CAResult_t CAParseIPv4AddressInternal(const char *ipAddrStr, uint8_t *ipAddr, * These two conversion functions return void because errors can't happen * (because of NI_NUMERIC), and there's nothing to do if they do happen. */ -void CAConvertAddrToName(const struct sockaddr_storage *sockAddr, char *host, uint16_t *port) +void CAConvertAddrToName(const struct sockaddr_storage *sockAddr, socklen_t sockAddrLen, + char *host, uint16_t *port) { VERIFY_NON_NULL_VOID(sockAddr, CA_ADAPTER_UTILS_TAG, "sockAddr is null"); VERIFY_NON_NULL_VOID(host, CA_ADAPTER_UTILS_TAG, "host is null"); VERIFY_NON_NULL_VOID(port, CA_ADAPTER_UTILS_TAG, "port is null"); int r = getnameinfo((struct sockaddr *)sockAddr, - sizeof (struct sockaddr_storage), + sockAddrLen, host, MAX_ADDR_STR_SIZE_CA, NULL, 0, NI_NUMERICHOST|NI_NUMERICSERV); @@ -138,12 +139,12 @@ void CAConvertAddrToName(const struct sockaddr_storage *sockAddr, char *host, ui if (EAI_SYSTEM == r) { OIC_LOG_V(ERROR, CA_ADAPTER_UTILS_TAG, - "getaddrinfo failed: errno %s", strerror(errno)); + "getnameinfo failed: errno %s", strerror(errno)); } else { OIC_LOG_V(ERROR, CA_ADAPTER_UTILS_TAG, - "getaddrinfo failed: %s", gai_strerror(r)); + "getnameinfo failed: %s", gai_strerror(r)); } return; } diff --git a/resource/csdk/connectivity/src/cablockwisetransfer.c b/resource/csdk/connectivity/src/cablockwisetransfer.c index 488686c..6fc3443 100644 --- a/resource/csdk/connectivity/src/cablockwisetransfer.c +++ b/resource/csdk/connectivity/src/cablockwisetransfer.c @@ -1508,10 +1508,8 @@ CAResult_t CAAddBlockOption2(coap_pdu_t **pdu, const CAInfo_t *info, size_t data VERIFY_NON_NULL(options, TAG, "options"); // get set block data from CABlock list-set. - coap_block_t *block1 = CAGetBlockOption(blockID, - COAP_OPTION_BLOCK1); - coap_block_t *block2 = CAGetBlockOption(blockID, - COAP_OPTION_BLOCK2); + coap_block_t *block1 = CAGetBlockOption(blockID, COAP_OPTION_BLOCK1); + coap_block_t *block2 = CAGetBlockOption(blockID, COAP_OPTION_BLOCK2); if (!block1 || !block2) { OIC_LOG(ERROR, TAG, "getting has failed"); @@ -1525,29 +1523,13 @@ CAResult_t CAAddBlockOption2(coap_pdu_t **pdu, const CAInfo_t *info, size_t data (CA_MSG_NONCONFIRM == (*pdu)->hdr->coap_hdr_udp_t.type && CA_GET != (*pdu)->hdr->coap_hdr_udp_t.code)) { - int32_t res = coap_write_block_opt(block2, COAP_OPTION_BLOCK2, *pdu, dataLength); - switch (res) - { - case -2: /* illegal block */ - code = COAP_RESPONSE_CODE(CA_BAD_REQ); - OIC_LOG(ERROR, TAG, "write block option : -2"); - goto error; - case -1: /* should really not happen */ - OIC_LOG(ERROR, TAG, "write block option : -1"); - break; - case -3: /* cannot handle request */ - code = COAP_RESPONSE_CODE(CA_INTERNAL_SERVER_ERROR); - OIC_LOG(ERROR, TAG, "write block option : -3"); - goto error; - default: - OIC_LOG(INFO, TAG, "success write block option"); - } + CAGetMoreBitFromBlock(dataLength, block2); CALogBlockInfo(block2); // if block number is 0, add size2 option if (0 == block2->num) { - res = CAAddBlockSizeOption(*pdu, COAP_OPTION_SIZE2, dataLength, options); + CAResult_t res = CAAddBlockSizeOption(*pdu, COAP_OPTION_SIZE2, dataLength, options); if (CA_STATUS_OK != res) { OIC_LOG(ERROR, TAG, "add has failed"); @@ -1556,10 +1538,18 @@ CAResult_t CAAddBlockOption2(coap_pdu_t **pdu, const CAInfo_t *info, size_t data } } + CAResult_t res = CAAddBlockOptionImpl(block2, COAP_OPTION_BLOCK2, options); + if (CA_STATUS_OK != res) + { + OIC_LOG(ERROR, TAG, "add has failed"); + CARemoveBlockDataFromList(blockID); + return res; + } + if (block1->num) { OIC_LOG(DEBUG, TAG, "combining block1 and block2"); - CAResult_t res = CAAddBlockOptionImpl(*pdu, block1, COAP_OPTION_BLOCK1, options); + res = CAAddBlockOptionImpl(block1, COAP_OPTION_BLOCK1, options); if (CA_STATUS_OK != res) { OIC_LOG(ERROR, TAG, "add has failed"); @@ -1570,6 +1560,14 @@ CAResult_t CAAddBlockOption2(coap_pdu_t **pdu, const CAInfo_t *info, size_t data block1->num = 0; } + res = CAAddOptionToPDU(*pdu, options); + if (CA_STATUS_OK != res) + { + OIC_LOG(ERROR, TAG, "add has failed"); + CARemoveBlockDataFromList(blockID); + return res; + } + if (!coap_add_block(*pdu, dataLength, (const unsigned char *) info->payload, block2->num, block2->szx)) { @@ -1604,7 +1602,15 @@ CAResult_t CAAddBlockOption2(coap_pdu_t **pdu, const CAInfo_t *info, size_t data else { OIC_LOG(DEBUG, TAG, "option2, not ACK msg"); - CAResult_t res = CAAddBlockOptionImpl(*pdu, block2, COAP_OPTION_BLOCK2, options); + CAResult_t res = CAAddBlockOptionImpl(block2, COAP_OPTION_BLOCK2, options); + if (CA_STATUS_OK != res) + { + OIC_LOG(ERROR, TAG, "add has failed"); + CARemoveBlockDataFromList(blockID); + return res; + } + + res = CAAddOptionToPDU(*pdu, options); if (CA_STATUS_OK != res) { OIC_LOG(ERROR, TAG, "add has failed"); @@ -1651,7 +1657,15 @@ CAResult_t CAAddBlockOption1(coap_pdu_t **pdu, const CAInfo_t *info, size_t data if (CA_MSG_ACKNOWLEDGE == (*pdu)->hdr->coap_hdr_udp_t.type) { OIC_LOG(DEBUG, TAG, "option1 and ACK msg.."); - CAResult_t res = CAAddBlockOptionImpl(*pdu, block1, COAP_OPTION_BLOCK1, options); + CAResult_t res = CAAddBlockOptionImpl(block1, COAP_OPTION_BLOCK1, options); + if (CA_STATUS_OK != res) + { + OIC_LOG(ERROR, TAG, "add has failed"); + CARemoveBlockDataFromList(blockID); + return res; + } + + res = CAAddOptionToPDU(*pdu, options); if (CA_STATUS_OK != res) { OIC_LOG(ERROR, TAG, "add has failed"); @@ -1694,13 +1708,22 @@ CAResult_t CAAddBlockOption1(coap_pdu_t **pdu, const CAInfo_t *info, size_t data } } - res = CAAddBlockOptionImpl(*pdu, block1, COAP_OPTION_BLOCK1, options); + res = CAAddBlockOptionImpl(block1, COAP_OPTION_BLOCK1, options); if (CA_STATUS_OK != res) { OIC_LOG(ERROR, TAG, "add has failed"); CARemoveBlockDataFromList(blockID); return res; } + + res = CAAddOptionToPDU(*pdu, options); + if (CA_STATUS_OK != res) + { + OIC_LOG(ERROR, TAG, "add has failed"); + CARemoveBlockDataFromList(blockID); + return res; + } + CALogBlockInfo(block1); if (!coap_add_block(*pdu, dataLength, (const unsigned char *) info->payload, @@ -1740,11 +1763,10 @@ CAResult_t CAAddBlockOption1(coap_pdu_t **pdu, const CAInfo_t *info, size_t data return CA_STATUS_OK; } -CAResult_t CAAddBlockOptionImpl(coap_pdu_t *pdu, coap_block_t *block, uint8_t blockType, +CAResult_t CAAddBlockOptionImpl(coap_block_t *block, uint8_t blockType, coap_list_t **options) { OIC_LOG(DEBUG, TAG, "IN-AddBlockOptionImpl"); - VERIFY_NON_NULL(pdu, TAG, "pdu"); VERIFY_NON_NULL(block, TAG, "block"); VERIFY_NON_NULL(options, TAG, "options"); @@ -1762,6 +1784,12 @@ CAResult_t CAAddBlockOptionImpl(coap_pdu_t *pdu, coap_block_t *block, uint8_t bl return CA_STATUS_INVALID_PARAM; } + OIC_LOG(DEBUG, TAG, "OUT-AddBlockOptionImpl"); + return CA_STATUS_OK; +} + +CAResult_t CAAddOptionToPDU(coap_pdu_t *pdu, coap_list_t **options) +{ // after adding the block option to option list, add option list to pdu. if (*options) { @@ -1771,15 +1799,18 @@ CAResult_t CAAddBlockOptionImpl(coap_pdu_t *pdu, coap_block_t *block, uint8_t bl COAP_OPTION_DATA(*(coap_option *) opt->data)); OIC_LOG_V(DEBUG, TAG, "[%d] pdu length", pdu->length); - coap_add_option(pdu, COAP_OPTION_KEY(*(coap_option *) opt->data), - COAP_OPTION_LENGTH(*(coap_option *) opt->data), - COAP_OPTION_DATA(*(coap_option *) opt->data), coap_udp); + int ret = coap_add_option(pdu, COAP_OPTION_KEY(*(coap_option *) opt->data), + COAP_OPTION_LENGTH(*(coap_option *) opt->data), + COAP_OPTION_DATA(*(coap_option *) opt->data), coap_udp); + if (!ret) + { + return CA_STATUS_FAILED; + } } } OIC_LOG_V(DEBUG, TAG, "[%d] pdu length after option", pdu->length); - OIC_LOG(DEBUG, TAG, "OUT-AddBlockOptionImpl"); return CA_STATUS_OK; } diff --git a/resource/csdk/connectivity/src/caconnectivitymanager.c b/resource/csdk/connectivity/src/caconnectivitymanager.c index 9f6aef8..a71b849 100644 --- a/resource/csdk/connectivity/src/caconnectivitymanager.c +++ b/resource/csdk/connectivity/src/caconnectivitymanager.c @@ -63,6 +63,11 @@ CAResult_t CAInitialize() if (!g_isInitialized) { + if (0 != OCSeedRandom()) + { + OIC_LOG(ERROR, TAG, "Seed Random Failed"); + } + CAResult_t res = CAInitializeMessageHandler(); if (res != CA_STATUS_OK) { @@ -71,6 +76,7 @@ CAResult_t CAInitialize() } g_isInitialized = true; } + return CA_STATUS_OK; } diff --git a/resource/csdk/connectivity/src/camessagehandler.c b/resource/csdk/connectivity/src/camessagehandler.c index fd0be7e..e007d87 100644 --- a/resource/csdk/connectivity/src/camessagehandler.c +++ b/resource/csdk/connectivity/src/camessagehandler.c @@ -1275,7 +1275,7 @@ static void CALogPayloadInfo(CAInfo_t *info) { for (uint32_t i = 0; i < info->numOptions; i++) { - OIC_LOG_V(DEBUG, TAG, "optionID: %d", info->options[i].optionID); + OIC_LOG_V(DEBUG, TAG, "optionID: %u", info->options[i].optionID); OIC_LOG_V(DEBUG, TAG, "list: %s", info->options[i].optionData); } @@ -1293,7 +1293,7 @@ static void CALogPayloadInfo(CAInfo_t *info) OIC_LOG_BUFFER(DEBUG, TAG, (const uint8_t *) info->token, info->tokenLength); } - OIC_LOG_V(DEBUG, TAG, "msgID: %d", info->messageId); + OIC_LOG_V(DEBUG, TAG, "msgID: %u", info->messageId); } else { diff --git a/resource/csdk/connectivity/src/caprotocolmessage.c b/resource/csdk/connectivity/src/caprotocolmessage.c index 227543d..0cb8a18 100644 --- a/resource/csdk/connectivity/src/caprotocolmessage.c +++ b/resource/csdk/connectivity/src/caprotocolmessage.c @@ -24,7 +24,6 @@ // For glibc information on feature test macros, // Refer http://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html // -// This file requires #define use due to random() and srandom() // For details on compatibility and glibc support, // Refer http://www.gnu.org/software/libc/manual/html_node/BSD-Random.html #define _DEFAULT_SOURCE @@ -41,11 +40,7 @@ #include "logger.h" #include "oic_malloc.h" #include "oic_string.h" - -// ARM GCC compiler doesnt define srandom function. -#if defined(ARDUINO) && !defined(ARDUINO_ARCH_SAM) -#define HAVE_SRANDOM 1 -#endif +#include "ocrandom.h" #define TAG "CA_PRTCL_MSG" @@ -65,8 +60,6 @@ static const char COAP_URI_HEADER[] = "coap://[::]/"; -static unsigned int SEED = 0; - CAResult_t CAGetRequestInfoFromPDU(const coap_pdu_t *pdu, const CAEndpoint_t *endpoint, CARequestInfo_t *outReqInfo) { @@ -127,6 +120,13 @@ coap_pdu_t *CAGeneratePDU(uint32_t code, const CAInfo_t *info, const CAEndpoint_ // and ACKNOWLEDGE can use empty message when code is empty. if (CA_MSG_RESET == info->type || (CA_EMPTY == code && CA_MSG_ACKNOWLEDGE == info->type)) { + if ((CA_EMPTY == code) && (info->payloadSize > 0 || info->payload + || info->token || info->tokenLength > 0)) + { + OIC_LOG(ERROR, TAG, "Empty message has unnecessary data after messageID"); + return NULL; + } + OIC_LOG(DEBUG, TAG, "code is empty"); if (!(pdu = CAGeneratePDUImpl((code_t) code, info, endpoint, NULL, transport))) { @@ -136,7 +136,7 @@ coap_pdu_t *CAGeneratePDU(uint32_t code, const CAInfo_t *info, const CAEndpoint_ } else { - if (CA_MSG_ACKNOWLEDGE != info->type && info->resourceUri) + if (info->resourceUri) { uint32_t length = strlen(info->resourceUri); if (CA_MAX_URI_LENGTH < length) @@ -1035,26 +1035,6 @@ CAResult_t CAGenerateTokenInternal(CAToken_t *token, uint8_t tokenLength) return CA_STATUS_INVALID_PARAM; } - if (SEED == 0) - { -#ifdef ARDUINO - SEED = now(); -#else - SEED = time(NULL); -#endif - if (SEED == (unsigned int)((time_t)-1)) - { - OIC_LOG(ERROR, TAG, "seed is not made"); - SEED = 0; - return CA_STATUS_FAILED; - } -#if HAVE_SRANDOM - srandom(SEED); -#else - srand(SEED); -#endif - } - // memory allocation char *temp = (char *) OICCalloc(tokenLength, sizeof(char)); if (NULL == temp) @@ -1063,16 +1043,7 @@ CAResult_t CAGenerateTokenInternal(CAToken_t *token, uint8_t tokenLength) return CA_MEMORY_ALLOC_FAILED; } - // set random byte - for (uint8_t index = 0; index < tokenLength; index++) - { - // use valid characters -#ifdef ARDUINO - temp[index] = rand() & 0x00FF; -#else - temp[index] = random() & 0x00FF; -#endif - } + OCFillRandomMem((uint8_t *)temp, tokenLength); // save token *token = temp; diff --git a/resource/csdk/connectivity/src/ip_adapter/caipserver.c b/resource/csdk/connectivity/src/ip_adapter/caipserver.c index 5dd5b87..08c46b0 100644 --- a/resource/csdk/connectivity/src/ip_adapter/caipserver.c +++ b/resource/csdk/connectivity/src/ip_adapter/caipserver.c @@ -120,7 +120,6 @@ static void CAReceiveHandler(void *data) { (void)data; OIC_LOG(DEBUG, TAG, "IN"); - while (!caglobals.ip.terminate) { CAFindReadyMessage(); @@ -196,8 +195,10 @@ static void CASelectReturned(fd_set *readFds, int ret) CAHandleNetlink(); break; } - else + else if (FD_ISSET(caglobals.ip.shutdownFds[0], readFds)) { + char buf[10]; + (void)read(caglobals.ip.shutdownFds[0], buf, sizeof (buf)); CAInterface_t *ifchanged = CAFindInterfaceChange(); if (ifchanged) { @@ -206,6 +207,10 @@ static void CASelectReturned(fd_set *readFds, int ret) } break; } + else + { + break; + } (void)CAReceiveMessage(fd, flags); FD_CLR(fd, readFds); @@ -299,7 +304,7 @@ static CAResult_t CAReceiveMessage(int fd, CATransportFlags_t flags) } } - CAConvertAddrToName(&srcAddr, sep.endpoint.addr, &sep.endpoint.port); + CAConvertAddrToName(&srcAddr, msg.msg_namelen, sep.endpoint.addr, &sep.endpoint.port); if (flags & CA_SECURE) { diff --git a/resource/csdk/connectivity/src/tcp_adapter/SConscript b/resource/csdk/connectivity/src/tcp_adapter/SConscript index 5e55c1f..d2dcf44 100644 --- a/resource/csdk/connectivity/src/tcp_adapter/SConscript +++ b/resource/csdk/connectivity/src/tcp_adapter/SConscript @@ -15,7 +15,7 @@ src_dir = './tcp_adapter/' # Source files to build common for all platforms common_files = None -if target_os == 'linux': +if target_os in ['linux', 'tizen']: common_files = [ os.path.join(src_dir, 'catcpadapter.c'), os.path.join(src_dir, 'catcpserver.c') ] diff --git a/resource/csdk/connectivity/src/tcp_adapter/catcpserver.c b/resource/csdk/connectivity/src/tcp_adapter/catcpserver.c index 2054a01..b0fca46 100644 --- a/resource/csdk/connectivity/src/tcp_adapter/catcpserver.c +++ b/resource/csdk/connectivity/src/tcp_adapter/catcpserver.c @@ -478,7 +478,7 @@ static void CAAcceptHandler(void *data) } svritem->u4tcp.fd = sockfd; - CAConvertAddrToName((struct sockaddr_storage *)&clientaddr, + CAConvertAddrToName((struct sockaddr_storage *)&clientaddr, clientlen, (char *) &svritem->addr, &svritem->u4tcp.port); ca_mutex_lock(g_mutexObjectList); diff --git a/resource/csdk/doc/Doxyfile b/resource/csdk/doc/Doxyfile index a95101f..5b6b38b 100644 --- a/resource/csdk/doc/Doxyfile +++ b/resource/csdk/doc/Doxyfile @@ -662,7 +662,7 @@ WARN_LOGFILE = INPUT = . \ ../stack/include \ ../ocsocket/include \ - ../ocrandom/include \ + ../../c_common/ocrandom/include \ ../occoap/include \ # This tag can be used to specify the character encoding of the source files diff --git a/resource/csdk/routing/SConscript b/resource/csdk/routing/SConscript index d3d68ba..1d2a067 100644 --- a/resource/csdk/routing/SConscript +++ b/resource/csdk/routing/SConscript @@ -18,7 +18,7 @@ if env.get('ROUTING') == 'GW': os.path.join(Dir('.').abspath, './../stack/include/internal'), os.path.join(Dir('.').abspath, './../logger'), os.path.join(Dir('.').abspath, './../../oc_logger/include'), - os.path.join(Dir('.').abspath, './../ocrandom/include'), + os.path.join(Dir('.').abspath, './../../c_common/ocrandom/include'), os.path.join(Dir('.').abspath, './../connectivity/api'), os.path.join(Dir('.').abspath, './../connectivity/common/inc'), os.path.join(Dir('.').abspath, './../security/include'), diff --git a/resource/csdk/routing/src/routingtablemanager.c b/resource/csdk/routing/src/routingtablemanager.c index d9d76f7..b611490 100644 --- a/resource/csdk/routing/src/routingtablemanager.c +++ b/resource/csdk/routing/src/routingtablemanager.c @@ -609,7 +609,7 @@ bool RTMIsObserverPresent(CAEndpoint_t devAddr, OCObservationId *obsID, while (NULL != iterTable) { RTMGatewayEntry_t *entry = u_linklist_get_data(iterTable); - if (NULL == entry && NULL == entry->destination) + if (NULL == entry || NULL == entry->destination) { OC_LOG(ERROR, TAG, "entry is NULL"); return false; diff --git a/resource/csdk/routing/src/routingutility.c b/resource/csdk/routing/src/routingutility.c index 7f342a7..a0925c2 100644 --- a/resource/csdk/routing/src/routingutility.c +++ b/resource/csdk/routing/src/routingutility.c @@ -203,7 +203,7 @@ void RMGetRouteOptionIndex(const CAHeaderOption_t *options, uint8_t numOptions, RM_NULL_CHECK_VOID(index, TAG, "index"); for (uint32_t i = 0; i < numOptions; i++) { - OC_LOG_V(DEBUG, TAG, "Request- optionID: %d", options[i].optionID); + OC_LOG_V(DEBUG, TAG, "Request- optionID: %u", options[i].optionID); if (RM_OPTION_MESSAGE_SWITCHING == options[i].optionID) { OC_LOG_V(INFO, TAG, "Found Option at %d", i); diff --git a/resource/csdk/security/SConscript b/resource/csdk/security/SConscript index 6d83044..4dcb4c2 100755 --- a/resource/csdk/security/SConscript +++ b/resource/csdk/security/SConscript @@ -42,7 +42,7 @@ libocsrm_env.PrependUnique(CPPPATH = [ '../../../extlibs/cjson/', '../../../extlibs/tinydtls/', '../logger/include', - '../ocrandom/include', + '../../c_common/ocrandom/include', '../stack/include', '../stack/include/internal', '../../oc_logger/include', diff --git a/resource/csdk/security/include/internal/credresource.h b/resource/csdk/security/include/internal/credresource.h index ae092df..74ea373 100644 --- a/resource/csdk/security/include/internal/credresource.h +++ b/resource/csdk/security/include/internal/credresource.h @@ -110,6 +110,15 @@ OCStackResult AddCredential(OicSecCred_t * cred); */ OCStackResult RemoveCredential(const OicUuid_t* credId); +/** + * Remove all credential data on credential resource and persistent storage + * + * @retval + * OC_STACK_OK - no errors + * OC_STACK_ERROR - stack process error + */ +OCStackResult RemoveAllCredentials(void); + #if defined(__WITH_DTLS__) /** * This internal callback is used by lower stack (i.e. CA layer) to diff --git a/resource/csdk/security/provisioning/SConscript b/resource/csdk/security/provisioning/SConscript index 65d7855..06cd5bb 100644 --- a/resource/csdk/security/provisioning/SConscript +++ b/resource/csdk/security/provisioning/SConscript @@ -30,7 +30,7 @@ root_dir = './../../../../' provisioning_env.AppendUnique(CPPPATH = [ '../../stack/include', '../../stack/include/internal', - '../../ocrandom/include', + '../../../c_common/ocrandom/include', '../../logger/include', '../../../oc_logger/include', '../../ocmalloc/include', diff --git a/resource/csdk/security/provisioning/ck_manager/sample/SConscript b/resource/csdk/security/provisioning/ck_manager/sample/SConscript index f1d251c..b368fe3 100644 --- a/resource/csdk/security/provisioning/ck_manager/sample/SConscript +++ b/resource/csdk/security/provisioning/ck_manager/sample/SConscript @@ -28,7 +28,7 @@ provisioning_env = env.Clone() ###################################################################### provisioning_env.AppendUnique(CPPPATH = [ '../../../../stack/include', - '../../../../ocrandom/include', + '../../../../../c_common/ocrandom/include', '../../../../logger/include', '../../../../security/include', '../../../../../oc_logger/include', diff --git a/resource/csdk/security/provisioning/src/pmutility.c b/resource/csdk/security/provisioning/src/pmutility.c old mode 100644 new mode 100755 index f6e2ff3..60daa64 --- a/resource/csdk/security/provisioning/src/pmutility.c +++ b/resource/csdk/security/provisioning/src/pmutility.c @@ -343,7 +343,7 @@ bool PMGenerateQuery(bool isSecure, switch(connType & CT_MASK_ADAPTER) { case CT_ADAPTER_IP: - switch(connType & CT_MASK_FLAGS) + switch(connType & CT_MASK_FLAGS & ~CT_FLAG_SECURE) { case CT_IP_USE_V4: snRet = snprintf(buffer, bufferSize, "%s%s:%d%s", @@ -534,13 +534,20 @@ static OCStackApplicationResult DeviceDiscoveryHandler(void *ctx, OCDoHandle UNU DeleteDoxmBinData(ptrDoxm); return OC_STACK_KEEP_TRANSACTION; } - + char rsrc_uri[MAX_URI_LENGTH+1] = {0}; + int wr_len = snprintf(rsrc_uri, sizeof(rsrc_uri), "%s?%s=%s", + OC_RSRVD_WELL_KNOWN_URI, OC_RSRVD_RESOURCE_TYPE, OIC_RSRC_TYPE_SEC_DOXM); + if(wr_len <= 0 || (size_t)wr_len >= sizeof(rsrc_uri)) + { + OC_LOG(ERROR, TAG, "rsrc_uri_string_print failed"); + return OC_STACK_ERROR; + } //Try to the unicast discovery to getting secure port - char query[MAX_URI_LENGTH + MAX_QUERY_LENGTH] = { 0, }; + char query[MAX_URI_LENGTH+MAX_QUERY_LENGTH+1] = {0}; if(!PMGenerateQuery(false, clientResponse->devAddr.addr, clientResponse->devAddr.port, clientResponse->connType, - query, sizeof(query), OC_RSRVD_WELL_KNOWN_URI)) + query, sizeof(query), rsrc_uri)) { OC_LOG(ERROR, TAG, "DeviceDiscoveryHandler : Failed to generate query"); return OC_STACK_KEEP_TRANSACTION; diff --git a/resource/csdk/security/src/amsmgr.c b/resource/csdk/security/src/amsmgr.c index c0f7377..7e4e301 100644 --- a/resource/csdk/security/src/amsmgr.c +++ b/resource/csdk/security/src/amsmgr.c @@ -200,7 +200,9 @@ static OCStackApplicationResult SecurePortDiscoveryCallback(void *ctx, OCDoHandl //Verifying if the ID of the sender is an AMS service that this device trusts. if(resPayload && - memcmp(context->amsMgrContext->amsDeviceId.id, resPayload->sid, + memcmp(context->amsMgrContext->amsDeviceId.id, + ((OCDiscoveryPayload*)clientResponse->payload)->sid, + // resPayload->sid, sizeof(context->amsMgrContext->amsDeviceId.id)) != 0) { context->retVal = ACCESS_DENIED_AMS_SERVICE_ERROR; diff --git a/resource/csdk/security/src/credresource.c b/resource/csdk/security/src/credresource.c index e7235b5..660164b 100644 --- a/resource/csdk/security/src/credresource.c +++ b/resource/csdk/security/src/credresource.c @@ -570,6 +570,14 @@ exit: return 0; } +/** + * Get the default value + * @retval NULL for now. Update it when we finalize the default info. + */ +static OicSecCred_t* GetCredDefault() +{ + return NULL; +} /** * This function adds the new cred to the credential list. @@ -631,6 +639,25 @@ OCStackResult RemoveCredential(const OicUuid_t *subject) } +/** + * Remove all credential data on credential resource and persistent storage + * + * @retval + * OC_STACK_OK - no errors + * OC_STACK_ERROR - stack process error + */ +OCStackResult RemoveAllCredentials(void) +{ + DeleteCredList(gCred); + gCred = GetCredDefault(); + + if(!UpdatePersistentStorage(gCred)) + { + return OC_STACK_ERROR; + } + return OC_STACK_OK; +} + static OCEntityHandlerResult HandlePostRequest(const OCEntityHandlerRequest * ehRequest) { OCEntityHandlerResult ret = OC_EH_ERROR; @@ -758,15 +785,6 @@ OCStackResult CreateCredResource() } /** - * Get the default value - * @retval NULL for now. Update it when we finalize the default info. - */ -static OicSecCred_t* GetCredDefault() -{ - return NULL; -} - -/** * Initialize Cred resource by loading data from persistent storage. * * @retval diff --git a/resource/csdk/stack/include/ocpayload.h b/resource/csdk/stack/include/ocpayload.h old mode 100755 new mode 100644 index d453621..57e077a --- a/resource/csdk/stack/include/ocpayload.h +++ b/resource/csdk/stack/include/ocpayload.h @@ -60,6 +60,43 @@ bool OCRepPayloadGetPropInt(const OCRepPayload* payload, const char* name, int64 bool OCRepPayloadSetPropDouble(OCRepPayload* payload, const char* name, double value); bool OCRepPayloadGetPropDouble(const OCRepPayload* payload, const char* name, double* value); +/** + * This function allocates memory for the byte string and sets it in the payload. + * + * @param payload Pointer to the payload to which byte string needs to be added. + * @param name Name of the byte string. + * @param value Byte string and it's length. + * + * @return true on success, false upon failure. + */ +bool OCRepPayloadSetPropByteString(OCRepPayload* payload, const char* name, OCByteString value); + +/** + * This function sets the byte string in the payload. + * + * @param payload Pointer to the payload to which byte string needs to be added. + * @param name Name of the byte string. + * @param value Byte string and it's length. + * + * @return true on success, false upon failure. + */ +bool OCRepPayloadSetPropByteStringAsOwner(OCRepPayload* payload, const char* name, + OCByteString* value); + +/** + * This function gets the byte string from the payload. + * + * @param payload Pointer to the payload from which byte string needs to be retrieved. + * @param name Name of the byte string. + * @param value Byte string and it's length. + * + * @note: Caller needs to invoke OCFree on value.bytes after it is finished using the byte string. + * + * @return true on success, false upon failure. + */ +bool OCRepPayloadGetPropByteString(const OCRepPayload* payload, const char* name, + OCByteString* value); + bool OCRepPayloadSetPropString(OCRepPayload* payload, const char* name, const char* value); bool OCRepPayloadSetPropStringAsOwner(OCRepPayload* payload, const char* name, char* value); bool OCRepPayloadGetPropString(const OCRepPayload* payload, const char* name, char** value); @@ -72,6 +109,48 @@ bool OCRepPayloadSetPropObjectAsOwner(OCRepPayload* payload, const char* name, OCRepPayload* value); bool OCRepPayloadGetPropObject(const OCRepPayload* payload, const char* name, OCRepPayload** value); +/** + * This function allocates memory for the byte string array and sets it in the payload. + * + * @param payload Pointer to the payload to which byte string array needs to be added. + * @param name Name of the byte string. + * @param array Byte string array. + * @param dimensions Number of byte strings in above array. + * + * @return true on success, false upon failure. + */ +bool OCRepPayloadSetByteStringArrayAsOwner(OCRepPayload* payload, const char* name, + OCByteString* array, size_t dimensions[MAX_REP_ARRAY_DEPTH]); + +/** + * This function sets the byte string array in the payload. + * + * @param payload Pointer to the payload to which byte string array needs to be added. + * @param name Name of the byte string. + * @param array Byte string array. + * @param dimensions Number of byte strings in above array. + * + * @return true on success, false upon failure. + */ +bool OCRepPayloadSetByteStringArray(OCRepPayload* payload, const char* name, + const OCByteString* array, size_t dimensions[MAX_REP_ARRAY_DEPTH]); + +/** + * This function gets the byte string array from the payload. + * + * @param payload Pointer to the payload from which byte string array needs to be retrieved. + * @param name Name of the byte string array. + * @param value Byte string array. + * @param dimensions Number of byte strings in above array. + * + * @note: Caller needs to invoke OICFree on 'bytes' field of all array elements after it is + * finished using the byte string array. + * + * @return true on success, false upon failure. + */ +bool OCRepPayloadGetByteStringArray(const OCRepPayload* payload, const char* name, + OCByteString** array, size_t dimensions[MAX_REP_ARRAY_DEPTH]); + bool OCRepPayloadSetIntArrayAsOwner(OCRepPayload* payload, const char* name, int64_t* array, size_t dimensions[MAX_REP_ARRAY_DEPTH]); bool OCRepPayloadSetIntArray(OCRepPayload* payload, const char* name, @@ -127,13 +206,13 @@ OCResourcePayload* OCDiscoveryPayloadGetResource(OCDiscoveryPayload* payload, si void OCDiscoveryPayloadDestroy(OCDiscoveryPayload* payload); // Device Payload -OCDevicePayload* OCDevicePayloadCreate(const char* uri, const uint8_t* sid, const char* dname, +OCDevicePayload* OCDevicePayloadCreate(const uint8_t* sid, const char* dname, const char* specVer, const char* dmVer); void OCDevicePayloadDestroy(OCDevicePayload* payload); // Platform Payload -OCPlatformPayload* OCPlatformPayloadCreate(const char* uri, const OCPlatformInfo* platformInfo); -OCPlatformPayload* OCPlatformPayloadCreateAsOwner(char* uri, OCPlatformInfo* platformInfo); +OCPlatformPayload* OCPlatformPayloadCreate(const OCPlatformInfo* platformInfo); +OCPlatformPayload* OCPlatformPayloadCreateAsOwner(OCPlatformInfo* platformInfo); void OCPlatformPayloadDestroy(OCPlatformPayload* payload); diff --git a/resource/csdk/stack/include/octypes.h b/resource/csdk/stack/include/octypes.h index 9e67e78..4125f4d 100644 --- a/resource/csdk/stack/include/octypes.h +++ b/resource/csdk/stack/include/octypes.h @@ -137,6 +137,12 @@ extern "C" { /** To represent resource type with presence.*/ #define OC_RSRVD_RESOURCE_TYPE_PRESENCE "oic.wk.ad" +/** To represent resource type with device.*/ +#define OC_RSRVD_RESOURCE_TYPE_DEVICE "oic.wk.d" + +/** To represent resource type with platform.*/ +#define OC_RSRVD_RESOURCE_TYPE_PLATFORM "oic.wk.p" + /** To represent interface.*/ #define OC_RSRVD_INTERFACE "if" @@ -155,6 +161,9 @@ extern "C" { /** To represent default interface.*/ #define OC_RSRVD_INTERFACE_DEFAULT "oic.if.baseline" +/** To represent read-only interface.*/ +#define OC_RSRVD_INTERFACE_READ "oic.if.r" + /** To represent ll interface.*/ #define OC_RSRVD_INTERFACE_LL "oic.if.ll" @@ -245,10 +254,10 @@ extern "C" { #define OC_RSRVD_DATA_MODEL_VERSION "dmv" /** Device specification version.*/ -#define OC_SPEC_VERSION "0.9.0" +#define OC_SPEC_VERSION "core.1.0.0" /** Device Data Model version.*/ -#define OC_DATA_MODEL_VERSION "sec.0.95" +#define OC_DATA_MODEL_VERSION "res.1.0.0" /** * These provide backward compatibility - their use is deprecated. @@ -336,11 +345,8 @@ typedef enum /**Remote Access over XMPP.*/ OC_ADAPTER_REMOTE_ACCESS = (1 << 3), #endif - -#ifdef TCP_ADAPTER /** CoAP over TCP.*/ OC_ADAPTER_TCP = (1 << 4) -#endif } OCTransportAdapter; @@ -462,11 +468,8 @@ typedef enum /** Remote Access over XMPP.*/ CT_ADAPTER_REMOTE_ACCESS = (1 << 19), #endif - -#ifdef TCP_ADAPTER /** CoAP over TCP.*/ CT_ADAPTER_TCP = (1 << 20), -#endif /** Insecure transport is the default (subject to change).*/ @@ -937,10 +940,21 @@ typedef enum OCREP_PROP_DOUBLE, OCREP_PROP_BOOL, OCREP_PROP_STRING, + OCREP_PROP_BYTE_STRING, OCREP_PROP_OBJECT, OCREP_PROP_ARRAY }OCRepPayloadPropType; +/** This structure will be used to represent a binary string for CBOR payloads.*/ +typedef struct +{ + /** pointer to data bytes.*/ + uint8_t* bytes; + + /** number of data bytes.*/ + size_t len; +} OCByteString; + #define MAX_REP_ARRAY_DEPTH 3 typedef struct { @@ -953,6 +967,10 @@ typedef struct double* dArray; bool* bArray; char** strArray; + + /** pointer to ByteString array.*/ + OCByteString* ocByteStrArray; + struct OCRepPayload** objArray; }; } OCRepPayloadValueArray; @@ -967,6 +985,10 @@ typedef struct OCRepPayloadValue double d; bool b; char* str; + + /** ByteString object.*/ + OCByteString ocByteStr; + struct OCRepPayload* obj; OCRepPayloadValueArray arr; }; @@ -995,7 +1017,6 @@ typedef struct OCRepPayload typedef struct OCResourcePayload { char* uri; - uint8_t* sid; OCStringLL* types; OCStringLL* interfaces; uint8_t bitmap; @@ -1089,6 +1110,9 @@ typedef struct OCResourceCollectionPayload typedef struct { OCPayload base; + + uint8_t* sid; + /** This structure holds the old /oic/res response. */ OCResourcePayload *resources; /** This structure holds the collection response for the /oic/res. */ @@ -1123,7 +1147,6 @@ typedef struct typedef struct { OCPayload base; - char* uri; uint8_t* sid; char* deviceName; char* specVersion; diff --git a/resource/csdk/stack/include/payload_logging.h b/resource/csdk/stack/include/payload_logging.h index 1269779..4c4dfbb 100644 --- a/resource/csdk/stack/include/payload_logging.h +++ b/resource/csdk/stack/include/payload_logging.h @@ -158,15 +158,14 @@ static inline void OCPayloadLogDiscovery(LogLevel level, OCDiscoveryPayload* pay OC_LOG(level, PL_TAG, "\tNO Resources"); return; } - + OC_LOG(level, PL_TAG, "\tSID:"); + OC_LOG_BUFFER(level, PL_TAG, payload->sid, UUID_SIZE); OCResourcePayload* res = payload->resources; while(res) { OC_LOG_V(level, PL_TAG, "\tResource #%d", i); OC_LOG_V(level, PL_TAG, "\tURI:%s", res->uri); - OC_LOG(level, PL_TAG, "\tSID:"); - OC_LOG_BUFFER(level, PL_TAG, res->sid, UUID_SIZE); OC_LOG(level, PL_TAG, "\tResource Types:"); OCStringLL* strll = res->types; while(strll) @@ -194,7 +193,6 @@ static inline void OCPayloadLogDiscovery(LogLevel level, OCDiscoveryPayload* pay static inline void OCPayloadLogDevice(LogLevel level, OCDevicePayload* payload) { OC_LOG(level, PL_TAG, "Payload Type: Device"); - OC_LOG_V(level, PL_TAG, "\tURI:%s", payload->uri); OC_LOG(level, PL_TAG, "\tSID:"); OC_LOG_BUFFER(level, PL_TAG, payload->sid, UUID_SIZE); OC_LOG_V(level, PL_TAG, "\tDevice Name:%s", payload->deviceName); diff --git a/resource/csdk/stack/samples/linux/SimpleClientServer/occlientbasicops.cpp b/resource/csdk/stack/samples/linux/SimpleClientServer/occlientbasicops.cpp index d396db1..419593a 100644 --- a/resource/csdk/stack/samples/linux/SimpleClientServer/occlientbasicops.cpp +++ b/resource/csdk/stack/samples/linux/SimpleClientServer/occlientbasicops.cpp @@ -393,17 +393,23 @@ void queryResource() void collectUniqueResource(const OCClientResponse * clientResponse) { - OCResourcePayload* res = ((OCDiscoveryPayload*)clientResponse->payload)->resources; + OCDiscoveryPayload* pay = (OCDiscoveryPayload*) clientResponse->payload; + OCResourcePayload* res = pay->resources; + + // Including the NUL terminator, length of UUID string of the form: + // "a62389f7-afde-00b6-cd3e-12b97d2fcf09" +# define UUID_LENGTH 37 + char sidStr[UUID_LENGTH]; while(res) { int ret = snprintf(sidStr, UUID_LENGTH, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", - res->sid[0], res->sid[1], res->sid[2], res->sid[3], - res->sid[4], res->sid[5], res->sid[6], res->sid[7], - res->sid[8], res->sid[9], res->sid[10], res->sid[11], - res->sid[12], res->sid[13], res->sid[14], res->sid[15] + pay->sid[0], pay->sid[1], pay->sid[2], pay->sid[3], + pay->sid[4], pay->sid[5], pay->sid[6], pay->sid[7], + pay->sid[8], pay->sid[9], pay->sid[10], pay->sid[11], + pay->sid[12], pay->sid[13], pay->sid[14], pay->sid[15] ); if (ret == UUID_LENGTH - 1) diff --git a/resource/csdk/stack/src/ocpayload.c b/resource/csdk/stack/src/ocpayload.c index cf7d754..485eda3 100755 --- a/resource/csdk/stack/src/ocpayload.c +++ b/resource/csdk/stack/src/ocpayload.c @@ -197,6 +197,10 @@ static void OCFreeRepPayloadValueContents(OCRepPayloadValue* val) { OICFree(val->str); } + else if(val->type == OCREP_PROP_BYTE_STRING) + { + OICFree(val->ocByteStr.bytes); + } else if (val->type == OCREP_PROP_OBJECT) { OCRepPayloadDestroy(val->obj); @@ -220,6 +224,13 @@ static void OCFreeRepPayloadValueContents(OCRepPayloadValue* val) } OICFree(val->arr.strArray); break; + case OCREP_PROP_BYTE_STRING: + for (size_t i = 0; i< dimTotal; ++i) + { + OICFree(val->arr.ocByteStrArray[i].bytes); + } + OICFree(val->arr.ocByteStrArray); + break; case OCREP_PROP_OBJECT: for(size_t i = 0; i< dimTotal;++i) { @@ -479,6 +490,9 @@ static bool OCRepPayloadSetProp(OCRepPayload* payload, const char* name, case OCREP_PROP_STRING: val->str = (char*)value; return val->str != NULL; + case OCREP_PROP_BYTE_STRING: + val->ocByteStr = *(OCByteString*)value; + break; case OCREP_PROP_NULL: return val != NULL; case OCREP_PROP_ARRAY: @@ -562,6 +576,62 @@ bool OCRepPayloadGetPropString(const OCRepPayload* payload, const char* name, ch return *value != NULL; } +bool OCRepPayloadSetPropByteString(OCRepPayload* payload, const char* name, OCByteString value) +{ + if (!value.bytes || !value.len) + { + return false; + } + + OCByteString ocByteStr = { + .bytes = (uint8_t*)OICMalloc(value.len * sizeof(uint8_t)), + .len = value.len }; + + if(!ocByteStr.bytes) + { + return false; + } + memcpy(ocByteStr.bytes, value.bytes, ocByteStr.len); + + bool b = OCRepPayloadSetPropByteStringAsOwner(payload, name, &ocByteStr); + + if(!b) + { + OICFree(ocByteStr.bytes); + } + return b; +} + +bool OCRepPayloadSetPropByteStringAsOwner(OCRepPayload* payload, const char* name, OCByteString* value) +{ + return OCRepPayloadSetProp(payload, name, value, OCREP_PROP_BYTE_STRING); +} + +bool OCRepPayloadGetPropByteString(const OCRepPayload* payload, const char* name, OCByteString* value) +{ + OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name); + + if (!val || val->type != OCREP_PROP_BYTE_STRING) + { + return false; + } + + if (!value) + { + return false; + } + + value->bytes = (uint8_t*)OICMalloc(val->ocByteStr.len * sizeof(uint8_t)); + if (!value->bytes) + { + return false; + } + value->len = val->ocByteStr.len; + memcpy(value->bytes, val->ocByteStr.bytes, value->len); + + return true; +} + bool OCRepPayloadSetPropBool(OCRepPayload* payload, const char* name, bool value) { @@ -626,6 +696,123 @@ size_t calcDimTotal(const size_t dimensions[MAX_REP_ARRAY_DEPTH]) return total; } + +bool OCRepPayloadSetByteStringArrayAsOwner(OCRepPayload* payload, const char* name, + OCByteString* array, size_t dimensions[MAX_REP_ARRAY_DEPTH]) +{ + OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, OCREP_PROP_ARRAY); + + if (!val) + { + return false; + } + + val->arr.type = OCREP_PROP_BYTE_STRING; + memcpy(val->arr.dimensions, dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t)); + val->arr.ocByteStrArray = array; + + return true; +} + +bool OCRepPayloadSetByteStringArray(OCRepPayload* payload, const char* name, + const OCByteString* array, size_t dimensions[MAX_REP_ARRAY_DEPTH]) +{ + if (!array) + { + return NULL; + } + + size_t dimTotal = calcDimTotal(dimensions); + if (dimTotal == 0) + { + return false; + } + + OCByteString* newArray = (OCByteString*)OICCalloc(dimTotal, sizeof(OCByteString)); + + if (!newArray) + { + return false; + } + + for (size_t i = 0; i < dimTotal; ++i) + { + newArray[i].bytes = (uint8_t*)OICMalloc(array[i].len * sizeof(uint8_t)); + if (NULL == newArray[i].bytes) + { + for (size_t j = 0; j < i; ++j) + { + OICFree(newArray[j].bytes); + } + + OICFree(newArray); + return false; + } + newArray[i].len = array[i].len; + memcpy(newArray[i].bytes, array[i].bytes, newArray[i].len); + } + + bool b = OCRepPayloadSetByteStringArrayAsOwner(payload, name, newArray, dimensions); + if (!b) + { + for (size_t i = 0; i < dimTotal; ++i) + { + OICFree(newArray[i].bytes); + } + + OICFree(newArray); + } + return b; +} + +bool OCRepPayloadGetByteStringArray(const OCRepPayload* payload, const char* name, + OCByteString** array, size_t dimensions[MAX_REP_ARRAY_DEPTH]) +{ + OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name); + + if (!val || val->type != OCREP_PROP_ARRAY || val->arr.type != OCREP_PROP_BYTE_STRING + || !val->arr.ocByteStrArray) + { + return false; + } + + size_t dimTotal = calcDimTotal(val->arr.dimensions); + if (dimTotal == 0) + { + return false; + } + + *array = (OCByteString*)OICCalloc(dimTotal, sizeof(OCByteString)); + if (!*array) + { + return false; + } + + for (size_t i = 0; i < dimTotal; ++i) + { + OCByteString* tmp = &(*array)[i]; + tmp->bytes = (uint8_t*)OICMalloc(val->arr.ocByteStrArray[i].len * sizeof(uint8_t)); + if (NULL == tmp->bytes) + { + for (size_t j = 0; j < i; ++j) + { + OCByteString* tmp = &(*array)[j]; + OICFree(tmp->bytes); + } + OICFree(*array); + *array = NULL; + + return false; + } + tmp->len = val->arr.ocByteStrArray[i].len; + memcpy(tmp->bytes, val->arr.ocByteStrArray[i].bytes, tmp->len); + } + + memcpy(dimensions, val->arr.dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t)); + return true; +} + + bool OCRepPayloadSetIntArrayAsOwner(OCRepPayload* payload, const char* name, int64_t* array, size_t dimensions[MAX_REP_ARRAY_DEPTH]) { @@ -1166,13 +1353,12 @@ static OCResourcePayload* OCCopyResource(const OCResource* res, uint16_t port) } pl->uri = OICStrdup(res->uri); - pl->sid = (uint8_t*)OICCalloc(1, UUID_SIZE); - if(!pl->uri || ! pl->sid) + + if(!pl->uri) { FreeOCDiscoveryResource(pl); return NULL; } - memcpy(pl->sid, OCGetServerInstanceID(), UUID_SIZE); // types OCResourceType* typePtr = res->rsrcType; @@ -1387,7 +1573,6 @@ static void FreeOCDiscoveryResource(OCResourcePayload* payload) } OICFree(payload->uri); - OICFree(payload->sid); OCFreeOCStringLL(payload->types); OCFreeOCStringLL(payload->interfaces); FreeOCDiscoveryResource(payload->next); @@ -1400,12 +1585,12 @@ void OCDiscoveryPayloadDestroy(OCDiscoveryPayload* payload) { return; } - + OICFree(payload->sid); FreeOCDiscoveryResource(payload->resources); OICFree(payload); } -OCDevicePayload* OCDevicePayloadCreate(const char* uri, const uint8_t* sid, const char* dname, +OCDevicePayload* OCDevicePayloadCreate(const uint8_t* sid, const char* dname, const char* specVer, const char* dmVer) { @@ -1418,12 +1603,6 @@ OCDevicePayload* OCDevicePayloadCreate(const char* uri, const uint8_t* sid, cons payload->base.type = PAYLOAD_TYPE_DEVICE; - payload->uri = OICStrdup(uri); - if(uri && !payload->uri) - { - goto exit; - } - if(sid) { payload->sid = (uint8_t*)OICMalloc(UUID_SIZE); @@ -1466,7 +1645,6 @@ void OCDevicePayloadDestroy(OCDevicePayload* payload) return; } - OICFree(payload->uri); OICFree(payload->sid); OICFree(payload->deviceName); OICFree(payload->specVersion); @@ -1494,7 +1672,7 @@ static void OCCopyPlatformInfo(const OCPlatformInfo* platformInfo, OCPlatformPay target->info.systemTime = OICStrdup(platformInfo->systemTime); } -OCPlatformPayload* OCPlatformPayloadCreateAsOwner(char* uri, OCPlatformInfo* platformInfo) +OCPlatformPayload* OCPlatformPayloadCreateAsOwner(OCPlatformInfo* platformInfo) { OCPlatformPayload* payload = (OCPlatformPayload*)OICCalloc(1, sizeof(OCPlatformPayload)); if(!payload) @@ -1503,13 +1681,12 @@ OCPlatformPayload* OCPlatformPayloadCreateAsOwner(char* uri, OCPlatformInfo* pla } payload->base.type = PAYLOAD_TYPE_PLATFORM; - payload->uri = uri; payload->info = *platformInfo; return payload; } -OCPlatformPayload* OCPlatformPayloadCreate(const char* uri, const OCPlatformInfo* platformInfo) +OCPlatformPayload* OCPlatformPayloadCreate(const OCPlatformInfo* platformInfo) { OCPlatformPayload* payload = (OCPlatformPayload*)OICCalloc(1, sizeof(OCPlatformPayload)); @@ -1519,7 +1696,6 @@ OCPlatformPayload* OCPlatformPayloadCreate(const char* uri, const OCPlatformInfo } payload->base.type = PAYLOAD_TYPE_PLATFORM; - payload->uri = OICStrdup(uri); OCCopyPlatformInfo(platformInfo, payload); return payload; diff --git a/resource/csdk/stack/src/ocpayloadconvert.c b/resource/csdk/stack/src/ocpayloadconvert.c index 588dd55..7b46b36 100644 --- a/resource/csdk/stack/src/ocpayloadconvert.c +++ b/resource/csdk/stack/src/ocpayloadconvert.c @@ -50,6 +50,7 @@ static int64_t OCConvertDevicePayload(OCDevicePayload* payload, uint8_t* outPayl static int64_t OCConvertPlatformPayload(OCPlatformPayload* payload, uint8_t* outPayload, size_t* size); static int64_t OCConvertRepPayload(OCRepPayload* payload, uint8_t* outPayload, size_t* size); +static int64_t OCConvertRepMap(CborEncoder *map, const OCRepPayload* payload); static int64_t OCConvertPresencePayload(OCPresencePayload* payload, uint8_t* outPayload, size_t* size); static int64_t OCConvertSecurityPayload(OCSecurityPayload* payload, uint8_t* outPayload, @@ -183,22 +184,17 @@ static int64_t OCConvertSecurityPayload(OCSecurityPayload* payload, uint8_t* out cbor_encoder_init(&encoder, outPayload, *size, 0); - CborEncoder rootArray; - err = err | cbor_encoder_create_array(&encoder, &rootArray, 1); CborEncoder map; - err = err | cbor_encoder_create_map(&rootArray, &map, CborIndefiniteLength); + err = err | cbor_encoder_create_map(&encoder, &map, CborIndefiniteLength); if(payload->securityData) { - err = err | AddTextStringToMap(&map, OC_RSRVD_REPRESENTATION, - sizeof(OC_RSRVD_REPRESENTATION) - 1, - payload->securityData); + err = err | cbor_encode_text_string(&map, payload->securityData, + strlen(payload->securityData)); } - err = err | cbor_encoder_close_container(&rootArray, &map); - - err = err | cbor_encoder_close_container(&encoder, &rootArray); + err = err | cbor_encoder_close_container(&encoder, &map); return checkError(err, &encoder, outPayload, size); } @@ -287,12 +283,50 @@ static int64_t OCConvertDiscoveryPayload(OCDiscoveryPayload* payload, uint8_t* o } else if (payload->resources) { + /* + The format for the payload is "modelled" as JSON. + + [ // rootArray + { // rootMap + "di" : UUID, // device ID + links :[ // linksArray contains maps of resources + { + href, rt, if, policy // Resource 1 + }, + { + href, rt, if, policy // Resource 2 + }, + . + . + . + ] + } + ] + */ + CborEncoder rootMap = {}; size_t resourceCount = OCDiscoveryPayloadGetResourceCount(payload); - err = err | cbor_encoder_create_array(&encoder, &rootArray, resourceCount); + + // Open the main root array + err = err | cbor_encoder_create_array(&encoder, &rootArray, 1); + + // Open the root map in the root array + err = err | cbor_encoder_create_map(&rootArray, &rootMap, DISCOVERY_CBOR_RES_MAP_LEN); + + // Insert Device ID into the root map + err = err | cbor_encode_text_string(&rootMap, OC_RSRVD_DEVICE_ID, + sizeof(OC_RSRVD_DEVICE_ID) - 1); + err = err | cbor_encode_byte_string(&rootMap, payload->sid, UUID_SIZE); + + + // Insert Links into the root map. + CborEncoder linkArray = {}; + err = err | cbor_encode_text_string(&rootMap, OC_RSRVD_LINKS, + sizeof(OC_RSRVD_LINKS) - 1); + err = err | cbor_encoder_create_array(&rootMap, &linkArray, resourceCount); for(size_t i = 0; i < resourceCount; ++i) { - CborEncoder map; + CborEncoder resourceMapElement = {}; OCResourcePayload* resource = OCDiscoveryPayloadGetResource(payload, i); if(!resource) { @@ -300,97 +334,85 @@ static int64_t OCConvertDiscoveryPayload(OCDiscoveryPayload* payload, uint8_t* o return OC_STACK_INVALID_PARAM; } - err = err | cbor_encoder_create_map(&rootArray, &map, DISCOVERY_CBOR_RES_MAP_LEN); + // resource map inside the links array. + err = err | cbor_encoder_create_map(&linkArray, &resourceMapElement, + DISCOVERY_CBOR_LINKS_MAP_LEN); + + // Below are insertions of the resource properties into the map. + // Uri + err = err | AddTextStringToMap(&resourceMapElement, OC_RSRVD_HREF, + sizeof(OC_RSRVD_HREF) - 1, + resource->uri); + // Resource Type + if (resource->types) + { + char* joinedTypes = OCStringLLJoin(resource->types); + if (joinedTypes) + { + err = err | cbor_encode_text_string(&resourceMapElement, OC_RSRVD_RESOURCE_TYPE, + sizeof(OC_RSRVD_RESOURCE_TYPE) - 1); + err = err | cbor_encode_text_string(&resourceMapElement, joinedTypes, + strlen(joinedTypes)); + OICFree(joinedTypes); + } + else + { + return OC_STACK_NO_MEMORY; + } + } + // Interface Types + if (resource->interfaces) + { + char* joinedInterfaces = OCStringLLJoin(resource->interfaces); + if (joinedInterfaces) + { + err = err | cbor_encode_text_string(&resourceMapElement, OC_RSRVD_INTERFACE, + sizeof(OC_RSRVD_INTERFACE) - 1); + err = err | cbor_encode_text_string(&resourceMapElement, joinedInterfaces, + strlen(joinedInterfaces)); + OICFree(joinedInterfaces); + } + else + { + return OC_STACK_NO_MEMORY; + } + } + + // Policy + CborEncoder policyMap; + err = err | cbor_encode_text_string(&resourceMapElement, OC_RSRVD_POLICY, + sizeof(OC_RSRVD_POLICY) - 1); + err = err | cbor_encoder_create_map(&resourceMapElement, &policyMap, CborIndefiniteLength); - // Device ID - err = err | cbor_encode_text_string(&map, OC_RSRVD_DEVICE_ID, - sizeof(OC_RSRVD_DEVICE_ID) - 1); - err = err | cbor_encode_byte_string(&map, resource->sid, UUID_SIZE); + // Bitmap + err = err | cbor_encode_text_string(&policyMap, OC_RSRVD_BITMAP, + sizeof(OC_RSRVD_BITMAP) - 1); + err = err | cbor_encode_uint(&policyMap, resource->bitmap); + if(resource->secure) { - CborEncoder linkArray; - err = err | cbor_encode_text_string(&map, OC_RSRVD_LINKS, sizeof(OC_RSRVD_LINKS) -1); - err = err | cbor_encoder_create_array(&map, &linkArray, CborIndefiniteLength); + err = err | cbor_encode_text_string(&policyMap, OC_RSRVD_SECURE, + sizeof(OC_RSRVD_SECURE) - 1); + err = err | cbor_encode_boolean(&policyMap, OC_RESOURCE_SECURE); - // Link Map + if(resource->port != 0) { - CborEncoder linkMap; - err = err | cbor_encoder_create_map(&linkArray, &linkMap, DISCOVERY_CBOR_LINKS_MAP_LEN); - - // Uri - err = err | AddTextStringToMap(&linkMap, OC_RSRVD_HREF, - sizeof(OC_RSRVD_HREF) - 1, - resource->uri); - // Resource Type - if (resource->types) - { - char* joinedTypes = OCStringLLJoin(resource->types); - if (joinedTypes) - { - err = err | cbor_encode_text_string(&linkMap, OC_RSRVD_RESOURCE_TYPE, - sizeof(OC_RSRVD_RESOURCE_TYPE) - 1); - err = err | cbor_encode_text_string(&linkMap, joinedTypes, - strlen(joinedTypes)); - OICFree(joinedTypes); - } - else - { - return OC_STACK_NO_MEMORY; - } - } - // Interface Types - if (resource->interfaces) - { - char* joinedInterfaces = OCStringLLJoin(resource->interfaces); - if (joinedInterfaces) - { - err = err | cbor_encode_text_string(&linkMap, OC_RSRVD_INTERFACE, - sizeof(OC_RSRVD_INTERFACE) - 1); - err = err | cbor_encode_text_string(&linkMap, joinedInterfaces, - strlen(joinedInterfaces)); - OICFree(joinedInterfaces); - } - else - { - return OC_STACK_NO_MEMORY; - } - } - // Policy - { - CborEncoder policyMap; - err = err | cbor_encode_text_string(&linkMap, OC_RSRVD_POLICY, - sizeof(OC_RSRVD_POLICY) - 1); - err = err | cbor_encoder_create_map(&linkMap, &policyMap, CborIndefiniteLength); - - // Bitmap - err = err | cbor_encode_text_string(&policyMap, OC_RSRVD_BITMAP, - sizeof(OC_RSRVD_BITMAP) - 1); - err = err | cbor_encode_uint(&policyMap, resource->bitmap); - - if(resource->secure) - { - err = err | cbor_encode_text_string(&policyMap, OC_RSRVD_SECURE, - sizeof(OC_RSRVD_SECURE) - 1); - err = err | cbor_encode_boolean(&policyMap, OC_RESOURCE_SECURE); - - if(resource->port != 0) - { - err = err | cbor_encode_text_string(&policyMap, OC_RSRVD_HOSTING_PORT, - sizeof(OC_RSRVD_HOSTING_PORT) - 1); - err = err | cbor_encode_uint(&policyMap, resource->port); - } - } - - err = err | cbor_encoder_close_container(&linkMap, &policyMap); - } - // Close - err = err | cbor_encoder_close_container(&linkArray, &linkMap); + err = err | cbor_encode_text_string(&policyMap, OC_RSRVD_HOSTING_PORT, + sizeof(OC_RSRVD_HOSTING_PORT) - 1); + err = err | cbor_encode_uint(&policyMap, resource->port); } - err = err | cbor_encoder_close_container(&map, &linkArray); } - err = err | cbor_encoder_close_container(&rootArray, &map); + + err = err | cbor_encoder_close_container(&resourceMapElement, &policyMap); + + // Finsihed encoding a resource, close the map. + err = err | cbor_encoder_close_container(&linkArray, &resourceMapElement); } - // Close main array + // Close links array inside the root map. + err = err | cbor_encoder_close_container(&rootMap, &linkArray); + // close root map inside the root array. + err = err | cbor_encoder_close_container(&rootArray, &rootMap); + // Close the final root array. err = err | cbor_encoder_close_container(&encoder, &rootArray); } @@ -407,53 +429,30 @@ static int64_t OCConvertDevicePayload(OCDevicePayload* payload, uint8_t* outPayl int64_t err = 0; cbor_encoder_init(&encoder, outPayload, *size, 0); - CborEncoder rootArray; - err = err | cbor_encoder_create_array(&encoder, &rootArray, 1); + CborEncoder repMap; + err = err | cbor_encoder_create_map(&encoder, &repMap, CborIndefiniteLength); - { - CborEncoder map; - err = err | cbor_encoder_create_map(&rootArray, &map, CborIndefiniteLength); + // Device ID + err = err | cbor_encode_text_string(&repMap, OC_RSRVD_DEVICE_ID, + sizeof(OC_RSRVD_DEVICE_ID) - 1); + err = err | cbor_encode_byte_string(&repMap, payload->sid, UUID_SIZE); - // uri - err = err | ConditionalAddTextStringToMap(&map, OC_RSRVD_HREF, sizeof(OC_RSRVD_HREF) - 1, - payload->uri); + // Device Name + err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_DEVICE_NAME, + sizeof(OC_RSRVD_DEVICE_NAME) - 1, + payload->deviceName); - // Rep Map - { - CborEncoder repMap; - err = err | cbor_encode_text_string(&map, OC_RSRVD_REPRESENTATION, - sizeof(OC_RSRVD_REPRESENTATION) - 1); - err = err | cbor_encoder_create_map(&map, &repMap, CborIndefiniteLength); - - // Device ID - err = err | cbor_encode_text_string(&repMap, OC_RSRVD_DEVICE_ID, - sizeof(OC_RSRVD_DEVICE_ID) - 1); - err = err | cbor_encode_byte_string(&repMap, payload->sid, UUID_SIZE); - - // Device Name - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_DEVICE_NAME, - sizeof(OC_RSRVD_DEVICE_NAME) - 1, - payload->deviceName); - - // Device Spec Version - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_SPEC_VERSION, - sizeof(OC_RSRVD_SPEC_VERSION) - 1, - payload->specVersion); - - // Device data Model Version - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_DATA_MODEL_VERSION, - sizeof(OC_RSRVD_DATA_MODEL_VERSION) - 1, - payload->dataModelVersion); - - err = err | cbor_encoder_close_container(&map, &repMap); - } + // Device Spec Version + err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_SPEC_VERSION, + sizeof(OC_RSRVD_SPEC_VERSION) - 1, + payload->specVersion); - // Close Map - err = err | cbor_encoder_close_container(&rootArray, &map); - } + // Device data Model Version + err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_DATA_MODEL_VERSION, + sizeof(OC_RSRVD_DATA_MODEL_VERSION) - 1, + payload->dataModelVersion); - // Close main array - err = err | cbor_encoder_close_container(&encoder, &rootArray); + err = err | cbor_encoder_close_container(&encoder, &repMap); return checkError(err, &encoder, outPayload, size); } @@ -465,87 +464,69 @@ static int64_t OCConvertPlatformPayload(OCPlatformPayload* payload, uint8_t* out int64_t err = 0; cbor_encoder_init(&encoder, outPayload, *size, 0); - CborEncoder rootArray; - err = err | cbor_encoder_create_array(&encoder, &rootArray, 1); { - CborEncoder map; - err = err | cbor_encoder_create_map(&rootArray, &map, CborIndefiniteLength); - - // uri - err = err | ConditionalAddTextStringToMap(&map, OC_RSRVD_HREF, sizeof(OC_RSRVD_HREF) - 1, - payload->uri); - - // Rep Map - { - CborEncoder repMap; - err = err | cbor_encode_text_string(&map, OC_RSRVD_REPRESENTATION, - sizeof(OC_RSRVD_REPRESENTATION) - 1); - err = err | cbor_encoder_create_map(&map, &repMap, CborIndefiniteLength); - - // Platform ID - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_PLATFORM_ID, - sizeof(OC_RSRVD_PLATFORM_ID) - 1, - payload->info.platformID); - - // MFG Name - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_MFG_NAME, - sizeof(OC_RSRVD_MFG_NAME) - 1, - payload->info.manufacturerName); - - // MFG Url - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_MFG_URL, - sizeof(OC_RSRVD_MFG_URL) - 1, - payload->info.manufacturerUrl); - - // Model Num - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_MODEL_NUM, - sizeof(OC_RSRVD_MODEL_NUM) - 1, - payload->info.modelNumber); - - // Date of Mfg - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_MFG_DATE, - sizeof(OC_RSRVD_MFG_DATE) - 1, - payload->info.dateOfManufacture); - - // Platform Version - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_PLATFORM_VERSION, - sizeof(OC_RSRVD_PLATFORM_VERSION) - 1, - payload->info.platformVersion); - - // OS Version - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_OS_VERSION, - sizeof(OC_RSRVD_OS_VERSION) - 1, - payload->info.operatingSystemVersion); - - // Hardware Version - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_HARDWARE_VERSION, - sizeof(OC_RSRVD_HARDWARE_VERSION) - 1, - payload->info.hardwareVersion); - - // Firmware Version - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_FIRMWARE_VERSION, - sizeof(OC_RSRVD_FIRMWARE_VERSION) - 1, - payload->info.firmwareVersion); - - // Support URL - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_SUPPORT_URL, - sizeof(OC_RSRVD_SUPPORT_URL) - 1, - payload->info.supportUrl); - - // System Time - err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_SYSTEM_TIME, - sizeof(OC_RSRVD_SYSTEM_TIME) - 1, - payload->info.systemTime); - err = err | cbor_encoder_close_container(&map, &repMap); - } + CborEncoder repMap; + err = err | cbor_encoder_create_map(&encoder, &repMap, CborIndefiniteLength); + + // Platform ID + err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_PLATFORM_ID, + sizeof(OC_RSRVD_PLATFORM_ID) - 1, + payload->info.platformID); + + // MFG Name + err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_MFG_NAME, + sizeof(OC_RSRVD_MFG_NAME) - 1, + payload->info.manufacturerName); + + // MFG Url + err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_MFG_URL, + sizeof(OC_RSRVD_MFG_URL) - 1, + payload->info.manufacturerUrl); + + // Model Num + err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_MODEL_NUM, + sizeof(OC_RSRVD_MODEL_NUM) - 1, + payload->info.modelNumber); + + // Date of Mfg + err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_MFG_DATE, + sizeof(OC_RSRVD_MFG_DATE) - 1, + payload->info.dateOfManufacture); + + // Platform Version + err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_PLATFORM_VERSION, + sizeof(OC_RSRVD_PLATFORM_VERSION) - 1, + payload->info.platformVersion); + + // OS Version + err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_OS_VERSION, + sizeof(OC_RSRVD_OS_VERSION) - 1, + payload->info.operatingSystemVersion); + + // Hardware Version + err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_HARDWARE_VERSION, + sizeof(OC_RSRVD_HARDWARE_VERSION) - 1, + payload->info.hardwareVersion); + + // Firmware Version + err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_FIRMWARE_VERSION, + sizeof(OC_RSRVD_FIRMWARE_VERSION) - 1, + payload->info.firmwareVersion); + + // Support URL + err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_SUPPORT_URL, + sizeof(OC_RSRVD_SUPPORT_URL) - 1, + payload->info.supportUrl); + + // System Time + err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_SYSTEM_TIME, + sizeof(OC_RSRVD_SYSTEM_TIME) - 1, + payload->info.systemTime); // Close Map - err = err | cbor_encoder_close_container(&rootArray, &map); + err = err | cbor_encoder_close_container(&encoder, &repMap); } - // Close main array - err = err | cbor_encoder_close_container(&encoder, &rootArray); - return checkError(err, &encoder, outPayload, size); } @@ -586,7 +567,7 @@ static int64_t OCConvertArrayItem(CborEncoder* array, const OCRepPayloadValueArr } else { - err = OCConvertSingleRepPayload(array, valArray->objArray[index]); + err = OCConvertRepMap(array, valArray->objArray[index]); } break; case OCREP_PROP_ARRAY: @@ -645,117 +626,64 @@ static int64_t OCConvertArray(CborEncoder* parent, const OCRepPayloadValueArray* return err; } -static int64_t OCConvertSingleRepPayload(CborEncoder* parent, const OCRepPayload* payload) +static int64_t OCConvertRepMap(CborEncoder *map, const OCRepPayload* payload) { int64_t err = 0; - CborEncoder map; - err = err | cbor_encoder_create_map(parent, &map, CborIndefiniteLength); - - // Uri - err = err | ConditionalAddTextStringToMap(&map, OC_RSRVD_HREF, - sizeof(OC_RSRVD_HREF) - 1, - payload->uri); - - // Prop Map - // resource types, interfaces - if(payload->types || payload->interfaces) - { - OC_LOG(INFO, TAG, "Payload has types or interfaces"); - err = err | cbor_encode_text_string(&map, - OC_RSRVD_PROPERTY, - sizeof(OC_RSRVD_PROPERTY) - 1); - CborEncoder propMap; - err = err | cbor_encoder_create_map(&map, &propMap, 2); - - if (payload->types) - { - char* joinedTypes = OCStringLLJoin(payload->types); - if (joinedTypes) - { - err = err | cbor_encode_text_string(&propMap, OC_RSRVD_RESOURCE_TYPE, - sizeof(OC_RSRVD_RESOURCE_TYPE) - 1); - err = err | cbor_encode_text_string(&propMap, joinedTypes, - strlen(joinedTypes)); - OICFree(joinedTypes); - } - else - { - return OC_STACK_NO_MEMORY; - } - } - if (payload->interfaces) - { - char* joinedInterfaces = OCStringLLJoin(payload->interfaces); - if (joinedInterfaces) - { - err = err | cbor_encode_text_string(&propMap, OC_RSRVD_INTERFACE, - sizeof(OC_RSRVD_INTERFACE) - 1); - err = err | cbor_encode_text_string(&propMap, joinedInterfaces, - strlen(joinedInterfaces)); - OICFree(joinedInterfaces); - } - else - { - return OC_STACK_NO_MEMORY; - } - } - err = err | cbor_encoder_close_container(&map, &propMap); - } + CborEncoder repMap; + err = err | cbor_encoder_create_map(map, &repMap, CborIndefiniteLength); + err = err | OCConvertSingleRepPayload(&repMap, payload); + err = err | cbor_encoder_close_container(map, &repMap); + return err; +} - // Rep Map +static int64_t OCConvertSingleRepPayload(CborEncoder* repMap, const OCRepPayload* payload) +{ + int64_t err = 0; + OCRepPayloadValue* value = payload->values; + while(value) { - CborEncoder repMap; - err = err | cbor_encode_text_string(&map, - OC_RSRVD_REPRESENTATION, - sizeof(OC_RSRVD_REPRESENTATION) - 1); - err = err | cbor_encoder_create_map(&map, &repMap, CborIndefiniteLength); - OCRepPayloadValue* value = payload->values; - while(value) + err = err | cbor_encode_text_string(repMap, + value->name, + strlen(value->name)); + switch(value->type) { - err = err | cbor_encode_text_string(&repMap, - value->name, - strlen(value->name)); - switch(value->type) - { - case OCREP_PROP_NULL: - err = err | cbor_encode_null(&repMap); - break; - case OCREP_PROP_INT: - err = err | cbor_encode_int(&repMap, - value->i); - break; - case OCREP_PROP_DOUBLE: - err = err | cbor_encode_double(&repMap, - value->d); - break; - case OCREP_PROP_BOOL: - err = err | cbor_encode_boolean(&repMap, - value->b); - break; - case OCREP_PROP_STRING: - err = err | cbor_encode_text_string(&repMap, - value->str, strlen(value->str)); - break; - case OCREP_PROP_OBJECT: - err = err | OCConvertSingleRepPayload(&repMap, value->obj); - break; - case OCREP_PROP_ARRAY: - err = err | OCConvertArray(&repMap, &value->arr); - break; - default: - OC_LOG_V(ERROR, TAG, "Invalid Prop type: %d", - value->type); - break; - } - value = value->next; + case OCREP_PROP_NULL: + err = err | cbor_encode_null(repMap); + break; + case OCREP_PROP_INT: + err = err | cbor_encode_int(repMap, + value->i); + break; + case OCREP_PROP_DOUBLE: + err = err | cbor_encode_double(repMap, + value->d); + break; + case OCREP_PROP_BOOL: + err = err | cbor_encode_boolean(repMap, + value->b); + break; + case OCREP_PROP_STRING: + err = err | cbor_encode_text_string(repMap, + value->str, strlen(value->str)); + break; + case OCREP_PROP_BYTE_STRING: + err = err | cbor_encode_byte_string(repMap, + value->ocByteStr.bytes, value->ocByteStr.len); + break; + case OCREP_PROP_OBJECT: + err = err | OCConvertRepMap(repMap, value->obj); + break; + case OCREP_PROP_ARRAY: + err = err | OCConvertArray(repMap, &value->arr); + break; + default: + OC_LOG_V(ERROR, TAG, "Invalid Prop type: %d", + value->type); + break; } - - err = err | cbor_encoder_close_container(&map, &repMap); + value = value->next; } - // Close Map - err = err | cbor_encoder_close_container(parent, &map); - return err; } @@ -765,17 +693,51 @@ static int64_t OCConvertRepPayload(OCRepPayload* payload, uint8_t* outPayload, s int64_t err = 0; cbor_encoder_init(&encoder, outPayload, *size, 0); - CborEncoder rootArray; - err = err | cbor_encoder_create_array(&encoder, &rootArray, CborIndefiniteLength); + CborEncoder rootMap; + err = err | cbor_encoder_create_map(&encoder, &rootMap, CborIndefiniteLength); + + if (payload->types) + { + OC_LOG(INFO, TAG, "Payload has types or interfaces"); + char* joinedTypes = OCStringLLJoin(payload->types); + if (joinedTypes) + { + err = err | cbor_encode_text_string(&rootMap, OC_RSRVD_RESOURCE_TYPE, + sizeof(OC_RSRVD_RESOURCE_TYPE) - 1); + err = err | cbor_encode_text_string(&rootMap, joinedTypes, + strlen(joinedTypes)); + OICFree(joinedTypes); + } + else + { + return OC_STACK_NO_MEMORY; + } + } + if (payload->interfaces) + { + char* joinedInterfaces = OCStringLLJoin(payload->interfaces); + if (joinedInterfaces) + { + err = err | cbor_encode_text_string(&rootMap, OC_RSRVD_INTERFACE, + sizeof(OC_RSRVD_INTERFACE) - 1); + err = err | cbor_encode_text_string(&rootMap, joinedInterfaces, + strlen(joinedInterfaces)); + OICFree(joinedInterfaces); + } + else + { + return OC_STACK_NO_MEMORY; + } + } while(payload != NULL && (err == 0 || err == CborErrorOutOfMemory)) { - err = err | OCConvertSingleRepPayload(&rootArray, payload); + err = err | OCConvertSingleRepPayload(&rootMap, payload); payload = payload->next; } // Close main array - err = err | cbor_encoder_close_container(&encoder, &rootArray); + err = err | cbor_encoder_close_container(&encoder, &rootMap); return checkError(err, &encoder, outPayload, size); } @@ -787,12 +749,8 @@ static int64_t OCConvertPresencePayload(OCPresencePayload* payload, int64_t err = 0; cbor_encoder_init(&encoder, outPayload, *size, 0); - CborEncoder rootArray; - - err = err | cbor_encoder_create_array(&encoder, &rootArray, 1); - CborEncoder map; - err = err | cbor_encoder_create_map(&rootArray, &map, CborIndefiniteLength); + err = err | cbor_encoder_create_map(&encoder, &map, CborIndefiniteLength); // Sequence Number err = err | cbor_encode_text_string(&map, @@ -819,8 +777,7 @@ static int64_t OCConvertPresencePayload(OCPresencePayload* payload, } // Close Map - err = err | cbor_encoder_close_container(&rootArray, &map); - err = err | cbor_encoder_close_container(&encoder, &rootArray); + err = err | cbor_encoder_close_container(&encoder, &map); return checkError(err, &encoder, outPayload, size); } diff --git a/resource/csdk/stack/src/ocpayloadparse.c b/resource/csdk/stack/src/ocpayloadparse.c index d2aaf6a..4dc71ee 100644 --- a/resource/csdk/stack/src/ocpayloadparse.c +++ b/resource/csdk/stack/src/ocpayloadparse.c @@ -63,45 +63,29 @@ OCStackResult OCParsePayload(OCPayload** outPayload, OCPayloadType payloadType, return OC_STACK_ERROR; } - if(!cbor_value_is_array(&rootValue)) - { - OC_LOG_V(ERROR, TAG, "CBOR payload root object is not an array :%x", rootValue.type); - return OC_STACK_MALFORMED_RESPONSE; - } - - CborValue arrayValue; - // enter the array - err = err || cbor_value_enter_container(&rootValue, &arrayValue); - - if(err) - { - OC_LOG_V(ERROR, TAG, "CBOR payload parse failed :%d", err); - return OC_STACK_MALFORMED_RESPONSE; - } - OCStackResult result = OC_STACK_ERROR; switch(payloadType) { case PAYLOAD_TYPE_DISCOVERY: - result = OCParseDiscoveryPayload(outPayload, &arrayValue); + result = OCParseDiscoveryPayload(outPayload, &rootValue); break; case PAYLOAD_TYPE_DEVICE: - result = OCParseDevicePayload(outPayload, &arrayValue); + result = OCParseDevicePayload(outPayload, &rootValue); break; case PAYLOAD_TYPE_PLATFORM: - result = OCParsePlatformPayload(outPayload, &arrayValue); + result = OCParsePlatformPayload(outPayload, &rootValue); break; case PAYLOAD_TYPE_REPRESENTATION: - result = OCParseRepPayload(outPayload, &arrayValue); + result = OCParseRepPayload(outPayload, &rootValue); break; case PAYLOAD_TYPE_PRESENCE: - result = OCParsePresencePayload(outPayload, &arrayValue); + result = OCParsePresencePayload(outPayload, &rootValue); break; case PAYLOAD_TYPE_SECURITY: - result = OCParseSecurityPayload(outPayload, &arrayValue); + result = OCParseSecurityPayload(outPayload, &rootValue); break; case PAYLOAD_TYPE_RD: - result = OCRDCborToPayload(&arrayValue, outPayload); + result = OCRDCborToPayload(&rootValue, outPayload); break; default: OC_LOG_V(ERROR, TAG, "ParsePayload Type default: %d", payloadType); @@ -109,15 +93,7 @@ OCStackResult OCParsePayload(OCPayload** outPayload, OCPayloadType payloadType, break; } - if(result == OC_STACK_OK) - { - err = err || cbor_value_leave_container(&rootValue, &arrayValue); - if(err != CborNoError) - { - return OC_STACK_MALFORMED_RESPONSE; - } - } - else + if(result != OC_STACK_OK) { OC_LOG_V(INFO, TAG, "Finished parse payload, result is %d", result); } @@ -127,7 +103,7 @@ OCStackResult OCParsePayload(OCPayload** outPayload, OCPayloadType payloadType, void OCFreeOCStringLL(OCStringLL* ll); -static OCStackResult OCParseSecurityPayload(OCPayload** outPayload, CborValue* arrayVal) +static OCStackResult OCParseSecurityPayload(OCPayload** outPayload, CborValue* rootValue) { if (!outPayload) { @@ -136,25 +112,12 @@ static OCStackResult OCParseSecurityPayload(OCPayload** outPayload, CborValue* a bool err = false; char * securityData = NULL; + CborValue map; + size_t len; - if(cbor_value_is_map(arrayVal)) - { - CborValue curVal; - err = err || cbor_value_map_find_value(arrayVal, OC_RSRVD_REPRESENTATION, &curVal); - - if(cbor_value_is_valid(&curVal)) - { - size_t len; - err = err || cbor_value_dup_text_string(&curVal, &securityData, &len, NULL); - } - } - else - { - OC_LOG(ERROR, TAG, "Cbor main value not a map"); - return OC_STACK_MALFORMED_RESPONSE; - } - - err = err || cbor_value_advance(arrayVal); + err = err || cbor_value_enter_container(rootValue, &map); + err = err || cbor_value_dup_text_string(&map, &securityData, &len, NULL); + err = err || cbor_value_leave_container(rootValue, &map); if(err) { @@ -188,7 +151,7 @@ static char* InPlaceStringTrim(char* str) return str; } -static OCStackResult OCParseDiscoveryPayload(OCPayload** outPayload, CborValue* arrayVal) +static OCStackResult OCParseDiscoveryPayload(OCPayload** outPayload, CborValue* rootValue) { if (!outPayload) { @@ -197,6 +160,8 @@ static OCStackResult OCParseDiscoveryPayload(OCPayload** outPayload, CborValue* bool err = false; OCResourcePayload* resource = NULL; + uint16_t resourceCount = 0; + CborValue resourceMap = {}; OCDiscoveryPayload* out = OCDiscoveryPayloadCreate(); if(!out) @@ -204,271 +169,219 @@ static OCStackResult OCParseDiscoveryPayload(OCPayload** outPayload, CborValue* return OC_STACK_NO_MEMORY; } - if (cbor_value_is_array(arrayVal)) + // Root value is already inside the main root array + CborValue rootMap = {}; + + // Enter the main root map + err = err || cbor_value_enter_container(rootValue, &rootMap); + // Look for DI + CborValue curVal = {}; + err = cbor_value_map_find_value(&rootMap, OC_RSRVD_DEVICE_ID, &curVal); + if (CborNoError != err) { - OCLinksPayload *linksPayload = NULL; - OCTagsPayload *tagsPayload = NULL; - while (cbor_value_is_container(arrayVal)) - { - linksPayload = NULL; - tagsPayload = NULL; - CborValue colResources; - CborError cborFindResult = cbor_value_enter_container(arrayVal, &colResources); - if (CborNoError != cborFindResult) - { - goto cbor_error; - } + OC_LOG(ERROR, TAG, "Cbor find value failed."); + goto malformed_cbor; + } + size_t len; + err = cbor_value_dup_byte_string(&curVal, &(out->sid), &len, NULL); - if (OC_STACK_OK != OCTagsCborToPayload(&colResources, &tagsPayload)) - { - OC_LOG(ERROR, TAG, "Tags cbor parsing failed."); - OCFreeTagsResource(tagsPayload); - goto cbor_error; - } + // Look for Links which will have an array as the value + err = cbor_value_map_find_value(&rootMap, OC_RSRVD_LINKS, &curVal); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor find value failed."); + goto malformed_cbor; + } - if (OC_STACK_OK != OCLinksCborToPayload(&colResources, &linksPayload)) - { - OC_LOG(ERROR, TAG, "Links cbor parsing failed."); - OCFreeTagsResource(tagsPayload); - OCFreeLinksResource(linksPayload); - goto cbor_error; - } + // Enter the links array and start iterating through the array processing + // each resource which shows up as a map. + err = err || cbor_value_enter_container(&curVal, &resourceMap); - if (OC_STACK_OK != OCDiscoveryCollectionPayloadAddResource(out, tagsPayload, linksPayload)) - { - OC_LOG(ERROR, TAG, "Memory allocation failed"); - OCFreeLinksResource(linksPayload); - OCFreeTagsResource(tagsPayload); - OCDiscoveryPayloadDestroy(out); - return OC_STACK_NO_MEMORY; - } - if (CborNoError != cbor_value_advance(arrayVal)) - { - OC_LOG(ERROR, TAG, "Cbor value advanced failed."); - goto cbor_error; - } - } - } - if (cbor_value_is_map(arrayVal)) + while (cbor_value_is_map(&resourceMap)) { - size_t resourceCount = 0; - while (cbor_value_is_map(arrayVal)) + resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload)); + if(!resource) { - resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload)); - if(!resource) - { - OC_LOG(ERROR, TAG, "Memory allocation failed"); - OCDiscoveryPayloadDestroy(out); - return OC_STACK_NO_MEMORY; - } - CborValue curVal; - // DI - err = cbor_value_map_find_value(arrayVal, OC_RSRVD_DEVICE_ID, &curVal); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor find value failed."); - goto malformed_cbor; - } - size_t len; - err = cbor_value_dup_byte_string(&curVal, &(resource->sid), &len, NULL); + OC_LOG(ERROR, TAG, "Memory allocation failed"); + OCDiscoveryPayloadDestroy(out); + return OC_STACK_NO_MEMORY; + } + + // Uri + CborValue uriVal = {}; + err = cbor_value_map_find_value(&resourceMap, OC_RSRVD_HREF, &uriVal); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor finding href type failed."); + goto malformed_cbor; + } + err = cbor_value_dup_text_string(&uriVal, &(resource->uri), &len, NULL); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor finding href value failed."); + goto malformed_cbor; + } + // ResourceTypes + CborValue rtVal = {}; + err = cbor_value_map_find_value(&resourceMap, OC_RSRVD_RESOURCE_TYPE, &rtVal); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor finding rt type failed."); + goto malformed_cbor; + } + if (cbor_value_is_text_string(&rtVal)) + { + char* input = NULL; + char* savePtr; + err = cbor_value_dup_text_string(&rtVal, &input, &len, NULL); if (CborNoError != err) { - OC_LOG(ERROR, TAG, "Cbor di finding failed."); + OC_LOG(ERROR, TAG, "Cbor finding rt value failed."); goto malformed_cbor; } - // Links TAG + if (input) { - CborValue linkArray; - err = cbor_value_map_find_value(arrayVal, OC_RSRVD_LINKS, &linkArray); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor links finding failed."); - goto malformed_cbor; - } - CborValue linkMap; - err = cbor_value_enter_container(&linkArray, &linkMap); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor entering map failed."); - goto malformed_cbor; - } - // Uri - err = cbor_value_map_find_value(&linkMap, OC_RSRVD_HREF, &curVal); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor finding href type failed."); - goto malformed_cbor; - } - err = cbor_value_dup_text_string(&curVal, &(resource->uri), &len, NULL); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor finding href value failed."); - goto malformed_cbor; - } - // ResourceTypes - CborValue rtVal; - err = cbor_value_map_find_value(&linkMap, OC_RSRVD_RESOURCE_TYPE, &rtVal); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor finding rt type failed."); - goto malformed_cbor; - } - if (cbor_value_is_text_string(&rtVal)) + char* curPtr = strtok_r(input, " ", &savePtr); + + while (curPtr) { - char* input = NULL; - char* savePtr; - err = cbor_value_dup_text_string(&rtVal, &input, &len, NULL); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor finding rt value failed."); - goto malformed_cbor; - } - if (input) + char* trimmed = InPlaceStringTrim(curPtr); + if (trimmed[0] !='\0') { - char* curPtr = strtok_r(input, " ", &savePtr); - - while (curPtr) + if (!OCResourcePayloadAddResourceType(resource, trimmed)) { - char* trimmed = InPlaceStringTrim(curPtr); - if (trimmed[0] !='\0') - { - if (!OCResourcePayloadAddResourceType(resource, trimmed)) - { - OICFree(resource->uri); - OICFree(resource->sid); - OCFreeOCStringLL(resource->types); - OICFree(resource); - OCDiscoveryPayloadDestroy(out); - return OC_STACK_NO_MEMORY; - } - } - curPtr = strtok_r(NULL, " ", &savePtr); + OICFree(resource->uri); + OCFreeOCStringLL(resource->types); + OICFree(resource); + OCDiscoveryPayloadDestroy(out); + return OC_STACK_NO_MEMORY; } - OICFree(input); } + curPtr = strtok_r(NULL, " ", &savePtr); } + OICFree(input); + } + } - // Interface Types - CborValue ifVal; - err = cbor_value_map_find_value(&linkMap, OC_RSRVD_INTERFACE, &ifVal); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor finding if type failed."); - goto malformed_cbor; - } - if (!err && cbor_value_is_text_string(&ifVal)) - { - char* input = NULL; - char* savePtr; - err = cbor_value_dup_text_string(&ifVal, &input, &len, NULL); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor finding if value failed."); - goto malformed_cbor; - } - if (input) - { - char* curPtr = strtok_r(input, " ", &savePtr); + // Interface Types + CborValue ifVal = {}; + err = cbor_value_map_find_value(&resourceMap, OC_RSRVD_INTERFACE, &ifVal); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor finding if type failed."); + goto malformed_cbor; + } + if (!err && cbor_value_is_text_string(&ifVal)) + { + char* input = NULL; + char* savePtr; + err = cbor_value_dup_text_string(&ifVal, &input, &len, NULL); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor finding if value failed."); + goto malformed_cbor; + } + if (input) + { + char* curPtr = strtok_r(input, " ", &savePtr); - while (curPtr) - { - char* trimmed = InPlaceStringTrim(curPtr); - if (trimmed[0] !='\0') - { - if (!OCResourcePayloadAddInterface(resource, trimmed)) - { - OICFree(resource->uri); - OICFree(resource->sid); - OCFreeOCStringLL(resource->types); - OICFree(resource); - OCDiscoveryPayloadDestroy(out); - return OC_STACK_NO_MEMORY; - } - } - curPtr = strtok_r(NULL, " ", &savePtr); - } - OICFree(input); - } - } - // Policy + while (curPtr) { - CborValue policyMap; - err = cbor_value_map_find_value(&linkMap, OC_RSRVD_POLICY, &policyMap); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor finding policy type failed."); - goto malformed_cbor; - } - // Bitmap - CborValue val; - err = cbor_value_map_find_value(&policyMap, OC_RSRVD_BITMAP, &val); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor finding bitmap type failed."); - goto malformed_cbor; - } - uint64_t temp = 0; - err = cbor_value_get_uint64(&val, &temp); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor finding bitmap value failed."); - goto malformed_cbor; - } - resource->bitmap = (uint8_t)temp; - // Secure Flag - err = cbor_value_map_find_value(&policyMap, OC_RSRVD_SECURE, &val); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor finding secure type failed."); - goto malformed_cbor; - } - if(cbor_value_is_valid(&val)) + char* trimmed = InPlaceStringTrim(curPtr); + if (trimmed[0] !='\0') { - err = cbor_value_get_boolean(&val, &(resource->secure)); - if (CborNoError != err) + if (!OCResourcePayloadAddInterface(resource, trimmed)) { - OC_LOG(ERROR, TAG, "Cbor finding secure value failed."); - goto malformed_cbor; - } - // Port - CborValue port; - err = cbor_value_map_find_value(&policyMap, OC_RSRVD_HOSTING_PORT, - &port); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor finding port type failed."); - goto malformed_cbor; - } - if(cbor_value_is_valid(&port)) - { - err = cbor_value_get_uint64(&port, &temp); - if (CborNoError != err) - { - OC_LOG(ERROR, TAG, "Cbor finding port value failed."); - goto malformed_cbor; - } - resource->port = (uint16_t)temp; + OICFree(resource->uri); + OCFreeOCStringLL(resource->types); + OICFree(resource); + OCDiscoveryPayloadDestroy(out); + return OC_STACK_NO_MEMORY; } } + curPtr = strtok_r(NULL, " ", &savePtr); } + OICFree(input); + } + } + + // Policy + CborValue policyMap = {}; + err = cbor_value_map_find_value(&resourceMap, OC_RSRVD_POLICY, &policyMap); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor finding policy type failed."); + goto malformed_cbor; + } + // Bitmap + CborValue val = {}; + err = cbor_value_map_find_value(&policyMap, OC_RSRVD_BITMAP, &val); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor finding bitmap type failed."); + goto malformed_cbor; + } + uint64_t temp = 0; + err = cbor_value_get_uint64(&val, &temp); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor finding bitmap value failed."); + goto malformed_cbor; + } + resource->bitmap = (uint8_t)temp; + // Secure Flag + err = cbor_value_map_find_value(&policyMap, OC_RSRVD_SECURE, &val); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor finding secure type failed."); + goto malformed_cbor; + } + if(cbor_value_is_valid(&val)) + { + err = cbor_value_get_boolean(&val, &(resource->secure)); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor finding secure value failed."); + goto malformed_cbor; } - err = cbor_value_advance(arrayVal); + // Port + CborValue port; + err = cbor_value_map_find_value(&policyMap, OC_RSRVD_HOSTING_PORT, + &port); if (CborNoError != err) { - OC_LOG(ERROR, TAG, "Cbor advance value failed."); + OC_LOG(ERROR, TAG, "Cbor finding port type failed."); goto malformed_cbor; } - ++resourceCount; - OCDiscoveryPayloadAddNewResource(out, resource); + if(cbor_value_is_valid(&port)) + { + err = cbor_value_get_uint64(&port, &temp); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor finding port value failed."); + goto malformed_cbor; + } + resource->port = (uint16_t)temp; + } + } + + err = cbor_value_advance(&resourceMap); + if (CborNoError != err) + { + OC_LOG(ERROR, TAG, "Cbor advance value failed."); + goto malformed_cbor; } + ++resourceCount; + OCDiscoveryPayloadAddNewResource(out, resource); } + err = err || cbor_value_leave_container(rootValue, &resourceMap); + *outPayload = (OCPayload*)out; return OC_STACK_OK; malformed_cbor: OICFree(resource->uri); - OICFree(resource->sid); OCFreeOCStringLL(resource->types); OCFreeOCStringLL(resource->interfaces); OICFree(resource); @@ -480,7 +393,7 @@ cbor_error: return OC_STACK_MALFORMED_RESPONSE; } -static OCStackResult OCParseDevicePayload(OCPayload** outPayload, CborValue* arrayVal) +static OCStackResult OCParseDevicePayload(OCPayload** outPayload, CborValue* rootValue) { if (!outPayload) { @@ -489,55 +402,44 @@ static OCStackResult OCParseDevicePayload(OCPayload** outPayload, CborValue* arr bool err = false; - if(cbor_value_is_map(arrayVal)) + if(cbor_value_is_map(rootValue)) { - char* uri = NULL; uint8_t* sid = NULL; char* dname = NULL; char* specVer = NULL; char* dmVer = NULL; - CborValue curVal; - err = err || cbor_value_map_find_value(arrayVal, OC_RSRVD_HREF, &curVal); - size_t len; - err = err || cbor_value_dup_text_string(&curVal, &uri, &len, NULL); - // Representation + CborValue repVal; + // Device ID + err = err || cbor_value_map_find_value(rootValue, OC_RSRVD_DEVICE_ID, &repVal); + size_t len; + if(cbor_value_is_valid(&repVal)) { - err = err || cbor_value_map_find_value(arrayVal, OC_RSRVD_REPRESENTATION, &curVal); - - CborValue repVal; - // Device ID - err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_DEVICE_ID, &repVal); - if(cbor_value_is_valid(&repVal)) - { - err = err || cbor_value_dup_byte_string(&repVal, &sid, &len, NULL); - } - // Device Name - err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_DEVICE_NAME, &repVal); - if(cbor_value_is_valid(&repVal)) - { - err = err || cbor_value_dup_text_string(&repVal, &dname, &len, NULL); - } - // Device Spec Version - err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_SPEC_VERSION, &repVal); - if(cbor_value_is_valid(&repVal)) - { - err = err || cbor_value_dup_text_string(&repVal, &specVer, &len, NULL); - } - - // Data Model Version - err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_DATA_MODEL_VERSION, &repVal); - if (cbor_value_is_valid(&repVal)) - { - err = err || cbor_value_dup_text_string(&repVal, &dmVer, &len, NULL); - } + err = err || cbor_value_dup_byte_string(&repVal, &sid, &len, NULL); + } + // Device Name + err = err || cbor_value_map_find_value(rootValue, OC_RSRVD_DEVICE_NAME, &repVal); + if(cbor_value_is_valid(&repVal)) + { + err = err || cbor_value_dup_text_string(&repVal, &dname, &len, NULL); + } + // Device Spec Version + err = err || cbor_value_map_find_value(rootValue, OC_RSRVD_SPEC_VERSION, &repVal); + if(cbor_value_is_valid(&repVal)) + { + err = err || cbor_value_dup_text_string(&repVal, &specVer, &len, NULL); + } + // Data Model Version + err = err || cbor_value_map_find_value(rootValue, OC_RSRVD_DATA_MODEL_VERSION, &repVal); + if (cbor_value_is_valid(&repVal)) + { + err = err || cbor_value_dup_text_string(&repVal, &dmVer, &len, NULL); } - err = err || cbor_value_advance(arrayVal); + err = err || cbor_value_advance(rootValue); if(err) { - OICFree(uri); OICFree(sid); OICFree(dname); OICFree(specVer); @@ -546,9 +448,8 @@ static OCStackResult OCParseDevicePayload(OCPayload** outPayload, CborValue* arr return OC_STACK_MALFORMED_RESPONSE; } - *outPayload = (OCPayload*)OCDevicePayloadCreate(uri, sid, dname, specVer, dmVer); + *outPayload = (OCPayload*)OCDevicePayloadCreate(sid, dname, specVer, dmVer); - OICFree(uri); OICFree(sid); OICFree(dname); OICFree(specVer); @@ -568,7 +469,7 @@ static OCStackResult OCParseDevicePayload(OCPayload** outPayload, CborValue* arr } -static OCStackResult OCParsePlatformPayload(OCPayload** outPayload, CborValue* arrayVal) +static OCStackResult OCParsePlatformPayload(OCPayload** outPayload, CborValue* rootValue) { if (!outPayload) { @@ -577,104 +478,94 @@ static OCStackResult OCParsePlatformPayload(OCPayload** outPayload, CborValue* a bool err = false; - if(cbor_value_is_map(arrayVal)) + if(cbor_value_is_map(rootValue)) { - char* uri = NULL; OCPlatformInfo info = {0}; - CborValue curVal; - err = err || cbor_value_map_find_value(arrayVal, OC_RSRVD_HREF, &curVal); - size_t len; - err = err || cbor_value_dup_text_string(&curVal, &uri, &len, NULL); - // Representation + CborValue repVal; + size_t len; + // Platform ID + err = err || cbor_value_map_find_value(rootValue, OC_RSRVD_PLATFORM_ID, &repVal); + if(cbor_value_is_valid(&repVal)) + { + err = err || cbor_value_dup_text_string(&repVal, &(info.platformID), &len, NULL); + } + + // MFG Name + err = err || cbor_value_map_find_value(rootValue, OC_RSRVD_MFG_NAME, &repVal); + if(cbor_value_is_valid(&repVal)) + { + err = err || cbor_value_dup_text_string(&repVal, &(info.manufacturerName), &len, NULL); + } + + // MFG URL + err = err || cbor_value_map_find_value(rootValue, OC_RSRVD_MFG_URL, &repVal); + if(cbor_value_is_valid(&repVal)) { - err = err || cbor_value_map_find_value(arrayVal, OC_RSRVD_REPRESENTATION, &curVal); - - CborValue repVal; - // Platform ID - err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_PLATFORM_ID, &repVal); - if(cbor_value_is_valid(&repVal)) - { - err = err || cbor_value_dup_text_string(&repVal, &(info.platformID), &len, NULL); - } - - // MFG Name - err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_MFG_NAME, &repVal); - if(cbor_value_is_valid(&repVal)) - { - err = err || cbor_value_dup_text_string(&repVal, &(info.manufacturerName), &len, NULL); - } - - // MFG URL - err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_MFG_URL, &repVal); - if(cbor_value_is_valid(&repVal)) - { - err = err || cbor_value_dup_text_string(&repVal, &(info.manufacturerUrl), &len, NULL); - } + err = err || cbor_value_dup_text_string(&repVal, &(info.manufacturerUrl), &len, NULL); + } - // Model Num - err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_MODEL_NUM, &repVal); - if(cbor_value_is_valid(&repVal)) - { - err = err || cbor_value_dup_text_string(&repVal, &(info.modelNumber), &len, NULL); - } + // Model Num + err = err || cbor_value_map_find_value(rootValue, OC_RSRVD_MODEL_NUM, &repVal); + if(cbor_value_is_valid(&repVal)) + { + err = err || cbor_value_dup_text_string(&repVal, &(info.modelNumber), &len, NULL); + } - // Date of Mfg - err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_MFG_DATE, &repVal); - if(cbor_value_is_valid(&repVal)) - { - err = err || cbor_value_dup_text_string(&repVal, &(info.dateOfManufacture), &len, - NULL); - } + // Date of Mfg + err = err || cbor_value_map_find_value(rootValue, OC_RSRVD_MFG_DATE, &repVal); + if(cbor_value_is_valid(&repVal)) + { + err = err || cbor_value_dup_text_string(&repVal, &(info.dateOfManufacture), &len, + NULL); + } - // Platform Version - err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_PLATFORM_VERSION, &repVal); - if(cbor_value_is_valid(&repVal)) - { - err = err || cbor_value_dup_text_string(&repVal, &(info.platformVersion), &len, - NULL); - } + // Platform Version + err = err || cbor_value_map_find_value(rootValue, OC_RSRVD_PLATFORM_VERSION, &repVal); + if(cbor_value_is_valid(&repVal)) + { + err = err || cbor_value_dup_text_string(&repVal, &(info.platformVersion), &len, NULL); + } - // OS Version - err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_OS_VERSION, &repVal); - if(cbor_value_is_valid(&repVal)) - { - err = err || cbor_value_dup_text_string(&repVal, &(info.operatingSystemVersion), - &len, NULL); - } + // OS Version + err = err || cbor_value_map_find_value(rootValue, OC_RSRVD_OS_VERSION, &repVal); + if(cbor_value_is_valid(&repVal)) + { + err = err || cbor_value_dup_text_string(&repVal, &(info.operatingSystemVersion), + &len, NULL); + } - // Hardware Version - err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_HARDWARE_VERSION, &repVal); - if(cbor_value_is_valid(&repVal)) - { - err = err || cbor_value_dup_text_string(&repVal, &(info.hardwareVersion), &len, - NULL); - } + // Hardware Version + err = err || cbor_value_map_find_value(rootValue, OC_RSRVD_HARDWARE_VERSION, &repVal); + if(cbor_value_is_valid(&repVal)) + { + err = err || cbor_value_dup_text_string(&repVal, &(info.hardwareVersion), &len, + NULL); + } - // Firmware Version - err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_FIRMWARE_VERSION, &repVal); - if(cbor_value_is_valid(&repVal)) - { - err = err || cbor_value_dup_text_string(&repVal, &(info.firmwareVersion), &len, - NULL); - } + // Firmware Version + err = err || cbor_value_map_find_value(rootValue, OC_RSRVD_FIRMWARE_VERSION, &repVal); + if(cbor_value_is_valid(&repVal)) + { + err = err || cbor_value_dup_text_string(&repVal, &(info.firmwareVersion), &len, + NULL); + } - // Support URL - err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_SUPPORT_URL, &repVal); - if(cbor_value_is_valid(&repVal)) - { - err = err || cbor_value_dup_text_string(&repVal, &(info.supportUrl), &len, NULL); - } + // Support URL + err = err || cbor_value_map_find_value(rootValue, OC_RSRVD_SUPPORT_URL, &repVal); + if(cbor_value_is_valid(&repVal)) + { + err = err || cbor_value_dup_text_string(&repVal, &(info.supportUrl), &len, NULL); + } - // System Time - err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_SYSTEM_TIME, &repVal); - if(cbor_value_is_valid(&repVal)) - { - err = err || cbor_value_dup_text_string(&repVal, &(info.systemTime), &len, NULL); - } + // System Time + err = err || cbor_value_map_find_value(rootValue, OC_RSRVD_SYSTEM_TIME, &repVal); + if(cbor_value_is_valid(&repVal)) + { + err = err || cbor_value_dup_text_string(&repVal, &(info.systemTime), &len, NULL); } - err = err || cbor_value_advance(arrayVal); + err = err || cbor_value_advance(rootValue); if(err) { @@ -693,7 +584,7 @@ static OCStackResult OCParsePlatformPayload(OCPayload** outPayload, CborValue* a return OC_STACK_MALFORMED_RESPONSE; } - *outPayload = (OCPayload*)OCPlatformPayloadCreateAsOwner(uri, &info); + *outPayload = (OCPayload*)OCPlatformPayloadCreateAsOwner(&info); if(!*outPayload) { @@ -838,6 +729,7 @@ static bool OCParseArrayFillArray(const CborValue* parent, size_t dimensions[MAX while (!err && i < dimensions[0] && cbor_value_is_valid(&insideArray)) { + bool noAdvance = false; if (cbor_value_get_type(&insideArray) != CborNullType) { switch (type) @@ -906,6 +798,7 @@ static bool OCParseArrayFillArray(const CborValue* parent, size_t dimensions[MAX err = err || OCParseSingleRepPayload(&tempPl, &insideArray); ((OCRepPayload**)targetArray)[i] = tempPl; tempPl = NULL; + noAdvance = true; } else { @@ -922,7 +815,10 @@ static bool OCParseArrayFillArray(const CborValue* parent, size_t dimensions[MAX } } ++i; - err = err || cbor_value_advance(&insideArray); + if (!noAdvance && cbor_value_is_valid(&insideArray)) + { + err = err || cbor_value_advance(&insideArray); + } } return err; @@ -1013,145 +909,103 @@ static bool OCParseArray(OCRepPayload* out, const char* name, CborValue* contain return err; } -static bool OCParseSingleRepPayload(OCRepPayload** outPayload, CborValue* repParent) +static bool OCParseSingleRepPayload(OCRepPayload** outPayload, CborValue *objMap) { if (!outPayload) { return false; } - *outPayload = OCRepPayloadCreate(); - OCRepPayload* curPayload = *outPayload; bool err = false; - if(!*outPayload) - { - return CborErrorOutOfMemory; - } - - size_t len; - CborValue curVal; - err = err || cbor_value_map_find_value(repParent, OC_RSRVD_HREF, &curVal); - if(cbor_value_is_valid(&curVal)) - { - err = err || cbor_value_dup_text_string(&curVal, &curPayload->uri, &len, - NULL); - } - err = err || cbor_value_map_find_value(repParent, OC_RSRVD_PROPERTY, &curVal); - if(cbor_value_is_valid(&curVal)) + if (cbor_value_is_map(objMap)) { - CborValue insidePropValue = {0}; - err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_RESOURCE_TYPE, - &insidePropValue); - - if(cbor_value_is_text_string(&insidePropValue)) + if (!*outPayload) { - char* allRt = NULL; - err = err || cbor_value_dup_text_string(&insidePropValue, &allRt, &len, NULL); - - char* savePtr; - - if (allRt) + *outPayload = OCRepPayloadCreate(); + if(!*outPayload) { - char* curPtr = strtok_r(allRt, " ", &savePtr); - - while (curPtr) - { - char* trimmed = InPlaceStringTrim(curPtr); - if (trimmed[0] != '\0') - { - OCRepPayloadAddResourceType(curPayload, curPtr); - } - curPtr = strtok_r(NULL, " ", &savePtr); - } + return CborErrorOutOfMemory; } - OICFree(allRt); } - err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_INTERFACE, &insidePropValue); - - if(cbor_value_is_text_string(&insidePropValue)) - { - char* allIf = NULL; - err = err || cbor_value_dup_text_string(&insidePropValue, &allIf, &len, NULL); - - char* savePtr; - - if (allIf) - { - char* curPtr = strtok_r(allIf, " ", &savePtr); - - while (curPtr) - { - char* trimmed = InPlaceStringTrim(curPtr); - if (trimmed[0] != '\0') - { - OCRepPayloadAddInterface(curPayload, curPtr); - } - curPtr = strtok_r(NULL, " ", &savePtr); - } - } - OICFree(allIf); - } - } + OCRepPayload* curPayload = *outPayload; - err = err || cbor_value_map_find_value(repParent, OC_RSRVD_REPRESENTATION, &curVal); - if(cbor_value_is_map(&curVal)) - { + size_t len; CborValue repMap; - err = err || cbor_value_enter_container(&curVal, &repMap); + err = err || cbor_value_enter_container(objMap, &repMap); while(!err && cbor_value_is_valid(&repMap)) { char* name; err = err || cbor_value_dup_text_string(&repMap, &name, &len, NULL); - err = err || cbor_value_advance(&repMap); - int64_t intval = 0; - bool boolval = false; - char* strval = NULL; - double doubleval = 0; - OCRepPayload* pl; - - switch(cbor_value_get_type(&repMap)) + CborType type = cbor_value_get_type(&repMap); + switch(type) { case CborNullType: err = !OCRepPayloadSetNull(curPayload, name); break; case CborIntegerType: - err = err || cbor_value_get_int64(&repMap, &intval); - if (!err) { - err = !OCRepPayloadSetPropInt(curPayload, name, intval); + int64_t intval = 0; + err = err || cbor_value_get_int64(&repMap, &intval); + if (!err) + { + err = !OCRepPayloadSetPropInt(curPayload, name, intval); + } } break; case CborDoubleType: - err = err || cbor_value_get_double(&repMap, &doubleval); - if (!err) { - err = !OCRepPayloadSetPropDouble(curPayload, name, doubleval); + double doubleval = 0; + err = err || cbor_value_get_double(&repMap, &doubleval); + if (!err) + { + err = !OCRepPayloadSetPropDouble(curPayload, name, doubleval); + } } break; case CborBooleanType: - err = err || cbor_value_get_boolean(&repMap, &boolval); - if (!err) { - err = !OCRepPayloadSetPropBool(curPayload, name, boolval); + bool boolval = false; + err = err || cbor_value_get_boolean(&repMap, &boolval); + if (!err) + { + err = !OCRepPayloadSetPropBool(curPayload, name, boolval); + } } break; case CborTextStringType: - err = err || cbor_value_dup_text_string(&repMap, &strval, &len, NULL); - if (!err) { - err = !OCRepPayloadSetPropStringAsOwner(curPayload, name, strval); + char* strval = NULL; + err = err || cbor_value_dup_text_string(&repMap, &strval, &len, NULL); + if (!err) + { + err = !OCRepPayloadSetPropStringAsOwner(curPayload, name, strval); + } + } + break; + case CborByteStringType: + { + uint8_t* bytestrval = NULL; + err = err || cbor_value_dup_byte_string(&repMap, &bytestrval, &len, NULL); + if (!err) + { + OCByteString tmp = {.bytes = bytestrval, .len = len}; + err = !OCRepPayloadSetPropByteStringAsOwner(curPayload, name, &tmp); + } } break; case CborMapType: - err = err || OCParseSingleRepPayload(&pl, &repMap); - if (!err) { - err = !OCRepPayloadSetPropObjectAsOwner(curPayload, name, pl); + OCRepPayload *pl = NULL; + err = err || OCParseSingleRepPayload(&pl, &repMap); + if (!err) + { + err = !OCRepPayloadSetPropObjectAsOwner(curPayload, name, pl); + } } break; case CborArrayType: @@ -1162,35 +1016,90 @@ static bool OCParseSingleRepPayload(OCRepPayload** outPayload, CborValue* repPar err = true; } - err = err || cbor_value_advance(&repMap); + if (type != CborMapType && cbor_value_is_valid(&repMap)) + { + err = err || cbor_value_advance(&repMap); + } OICFree(name); } - err = err || cbor_value_leave_container(&curVal, &repMap); - } - if(err) - { - OCRepPayloadDestroy(*outPayload); - *outPayload = NULL; + err = err || cbor_value_leave_container(objMap, &repMap); + + if(err) + { + OCRepPayloadDestroy(*outPayload); + *outPayload = NULL; + } } return err; } -static OCStackResult OCParseRepPayload(OCPayload** outPayload, CborValue* arrayVal) + +static OCStackResult OCParseRepPayload(OCPayload** outPayload, CborValue* rootMap) { if (!outPayload) { return OC_STACK_INVALID_PARAM; } + OCRepPayload *rootPayload = NULL; + OCRepPayload *curPayload = NULL; + OCRepPayload *temp = OCRepPayloadCreate(); + if (!temp) + { + return OC_STACK_NO_MEMORY; + } + + CborValue curVal; bool err = false; + size_t len; + err = err || cbor_value_map_find_value(rootMap, OC_RSRVD_RESOURCE_TYPE, &curVal); + if(cbor_value_is_text_string(&curVal)) + { + char* allRt = NULL; + err = err || cbor_value_dup_text_string(&curVal, &allRt, &len, NULL); + if (allRt) + { + char* savePtr; + char* curPtr = strtok_r(allRt, " ", &savePtr); + while (curPtr) + { + char* trimmed = InPlaceStringTrim(curPtr); + if (trimmed[0] != '\0') + { + OCRepPayloadAddResourceType(temp, curPtr); + } + curPtr = strtok_r(NULL, " ", &savePtr); + } + } + OICFree(allRt); + } - OCRepPayload* rootPayload = NULL; - OCRepPayload* curPayload = NULL; - OCRepPayload* temp = NULL; - while(!err && cbor_value_is_map(arrayVal)) + err = err || cbor_value_map_find_value(rootMap, OC_RSRVD_INTERFACE, &curVal); + if(cbor_value_is_text_string(&curVal)) { - err = err || OCParseSingleRepPayload(&temp, arrayVal); + char* allIf = NULL; + err = err || cbor_value_dup_text_string(&curVal, &allIf, &len, NULL); + if (allIf) + { + char* savePtr; + char* curPtr = strtok_r(allIf, " ", &savePtr); + while (curPtr) + { + char* trimmed = InPlaceStringTrim(curPtr); + if (trimmed[0] != '\0') + { + OCRepPayloadAddInterface(temp, curPtr); + } + curPtr = strtok_r(NULL, " ", &savePtr); + } + } + OICFree(allIf); + } + + while (!err && cbor_value_is_map(rootMap)) + { + err = err || OCParseSingleRepPayload(&temp, rootMap); if(rootPayload == NULL) { @@ -1203,8 +1112,11 @@ static OCStackResult OCParseRepPayload(OCPayload** outPayload, CborValue* arrayV curPayload = curPayload->next; } + if (cbor_value_is_valid(rootMap)) + { + err = err || cbor_value_advance(rootMap); + } - err = err || cbor_value_advance(arrayVal); if(err) { OCRepPayloadDestroy(rootPayload); @@ -1218,7 +1130,7 @@ static OCStackResult OCParseRepPayload(OCPayload** outPayload, CborValue* arrayV return OC_STACK_OK; } -static OCStackResult OCParsePresencePayload(OCPayload** outPayload, CborValue* arrayVal) +static OCStackResult OCParsePresencePayload(OCPayload** outPayload, CborValue* rootValue) { if (!outPayload) { @@ -1226,7 +1138,7 @@ static OCStackResult OCParsePresencePayload(OCPayload** outPayload, CborValue* a } bool err = false; - if(cbor_value_is_map(arrayVal)) + if(cbor_value_is_map(rootValue)) { uint64_t seqNum = 0; uint64_t maxAge = 0; @@ -1236,28 +1148,28 @@ static OCStackResult OCParsePresencePayload(OCPayload** outPayload, CborValue* a CborValue curVal; // Sequence Number - err = err || cbor_value_map_find_value(arrayVal, OC_RSRVD_NONCE, &curVal); + err = err || cbor_value_map_find_value(rootValue, OC_RSRVD_NONCE, &curVal); err = err || cbor_value_get_uint64(&curVal, &seqNum); // Max Age - err = err || cbor_value_map_find_value(arrayVal, OC_RSRVD_TTL, &curVal); + err = err || cbor_value_map_find_value(rootValue, OC_RSRVD_TTL, &curVal); err = err || cbor_value_get_uint64(&curVal, &maxAge); // Trigger - err = err || cbor_value_map_find_value(arrayVal, OC_RSRVD_TRIGGER, &curVal); + err = err || cbor_value_map_find_value(rootValue, OC_RSRVD_TRIGGER, &curVal); err = err || cbor_value_dup_text_string(&curVal, &tempStr, &len, NULL); trigger = convertTriggerStringToEnum(tempStr); OICFree(tempStr); tempStr = NULL; // Resource type name - err = err || cbor_value_map_find_value(arrayVal, OC_RSRVD_RESOURCE_TYPE, &curVal); + err = err || cbor_value_map_find_value(rootValue, OC_RSRVD_RESOURCE_TYPE, &curVal); if(cbor_value_is_valid(&curVal)) { err = err || cbor_value_dup_text_string(&curVal, &tempStr, &len, NULL); } - err = err || cbor_value_advance(arrayVal); + err = err || cbor_value_advance(rootValue); if(!err) { diff --git a/resource/csdk/stack/src/ocresource.c b/resource/csdk/stack/src/ocresource.c index 20cfd72..a6b62ad 100644 --- a/resource/csdk/stack/src/ocresource.c +++ b/resource/csdk/stack/src/ocresource.c @@ -615,6 +615,10 @@ static OCStackResult HandleVirtualResource (OCServerRequest *request, OCResource if(payload) { + ((OCDiscoveryPayload*)payload)->sid = (uint8_t*)OICCalloc(1, UUID_SIZE); + memcpy(((OCDiscoveryPayload*)payload)->sid, + OCGetServerInstanceID(), UUID_SIZE); + bool foundResourceAtRD = false; for(;resource && discoveryResult == OC_STACK_OK; resource = resource->next) { @@ -665,8 +669,7 @@ static OCStackResult HandleVirtualResource (OCServerRequest *request, OCResource } else { - payload = (OCPayload*) OCDevicePayloadCreate(OC_RSRVD_DEVICE_URI, - (const uint8_t*) &deviceId->id, savedDeviceInfo.deviceName, + payload = (OCPayload*) OCDevicePayloadCreate((const uint8_t*) &deviceId->id, savedDeviceInfo.deviceName, OC_SPEC_VERSION, OC_DATA_MODEL_VERSION); if (!payload) { @@ -680,9 +683,7 @@ static OCStackResult HandleVirtualResource (OCServerRequest *request, OCResource } else if (virtualUriInRequest == OC_PLATFORM_URI) { - payload = (OCPayload*)OCPlatformPayloadCreate( - OC_RSRVD_PLATFORM_URI, - &savedPlatformInfo); + payload = (OCPayload*)OCPlatformPayloadCreate(&savedPlatformInfo); if (!payload) { discoveryResult = OC_STACK_NO_MEMORY; diff --git a/resource/csdk/stack/src/ocserverrequest.c b/resource/csdk/stack/src/ocserverrequest.c index a15fcc1..6e44d4c 100644 --- a/resource/csdk/stack/src/ocserverrequest.c +++ b/resource/csdk/stack/src/ocserverrequest.c @@ -634,10 +634,7 @@ OCStackResult HandleSingleResponse(OCEntityHandlerResponse * ehResponse) #ifdef RA_ADAPTER , CA_ADAPTER_REMOTE_ACCESS #endif - -#ifdef TCP_ADAPTER , CA_ADAPTER_TCP -#endif }; size_t size = sizeof(CAConnTypes)/ sizeof(CATransportAdapter_t); @@ -655,10 +652,7 @@ OCStackResult HandleSingleResponse(OCEntityHandlerResponse * ehResponse) #ifdef RA_ADAP | CA_ADAPTER_REMOTE_ACCESS #endif - -#ifdef TCP_ADAPTER | CA_ADAPTER_TCP -#endif ); } diff --git a/resource/csdk/stack/src/ocstack.c b/resource/csdk/stack/src/ocstack.c index 46a110b..24486de 100755 --- a/resource/csdk/stack/src/ocstack.c +++ b/resource/csdk/stack/src/ocstack.c @@ -99,6 +99,8 @@ static OCStackState stackState = OC_STACK_UNINITIALIZED; OCResource *headResource = NULL; static OCResource *tailResource = NULL; +static OCResourceHandle platformResource = {0}; +static OCResourceHandle deviceResource = {0}; #ifdef WITH_PRESENCE static OCPresenceState presenceState = OC_PRESENCE_UNINITIALIZED; static PresenceResource presenceResource; @@ -113,10 +115,7 @@ static bool gRASetInfo = false; #endif OCDeviceEntityHandler defaultDeviceHandler; void* defaultDeviceHandlerCallbackParameter = NULL; - -#ifdef TCP_ADAPTER static const char COAP_TCP[] = "coap+tcp:"; -#endif //----------------------------------------------------------------------------- // Macros @@ -128,7 +127,7 @@ static const char COAP_TCP[] = "coap+tcp:"; TAG, #arg " is NULL"); return (retVal); } } #define VERIFY_NON_NULL_NR(arg, logLevel) { if (!(arg)) { OC_LOG((logLevel), \ TAG, #arg " is NULL"); return; } } -#define VERIFY_NON_NULL_V(arg) { if (!arg) {OC_LOG_V(FATAL, TAG, "%s is NULL", #arg);\ +#define VERIFY_NON_NULL_V(arg) { if (!arg) {OC_LOG(FATAL, TAG, #arg " is NULL");\ goto exit;} } //TODO: we should allow the server to define this @@ -1877,20 +1876,8 @@ OCStackResult OCInit1(OCMode mode, OCTransportFlags serverFlags, OCTransportFlag caglobals.clientFlags = (CATransportFlags_t)(caglobals.clientFlags|CA_IPV4|CA_IPV6); } -#ifdef TCP_ADAPTER - if (!(caglobals.serverFlags & CA_IPFAMILY_MASK)) - { - caglobals.serverFlags = (CATransportFlags_t)(caglobals.serverFlags|CA_IPV4); - } - if (!(caglobals.clientFlags & CA_IPFAMILY_MASK)) - { - caglobals.clientFlags = (CATransportFlags_t)(caglobals.clientFlags|CA_IPV4); - } -#endif - defaultDeviceHandler = NULL; defaultDeviceHandlerCallbackParameter = NULL; - OCSeedRandom(); result = CAResultToOCResult(CAInitialize()); VERIFY_SUCCESS(result, OC_STACK_OK); @@ -2130,7 +2117,6 @@ static OCStackResult ParseRequestUri(const char *fullUri, return OC_STACK_INVALID_URI; } -#ifdef TCP_ADAPTER // process url scheme size_t prefixLen = slash2 - fullUri; bool istcp = false; @@ -2141,7 +2127,6 @@ static OCStackResult ParseRequestUri(const char *fullUri, istcp = true; } } -#endif // TODO: this logic should come in with unit tests exercising the various strings // processs url prefix, if any @@ -2173,13 +2158,12 @@ static OCStackResult ParseRequestUri(const char *fullUri, { // ipv4 address colon = strchr(start, ':'); end = (colon && colon < slash) ? colon : slash; -#ifdef TCP_ADAPTER + if (istcp) { // coap over tcp adapter = (OCTransportAdapter)(adapter | OC_ADAPTER_TCP); } else -#endif { adapter = (OCTransportAdapter)(adapter | OC_ADAPTER_IP); flags = (OCTransportFlags)(flags | OC_IP_USE_V4); @@ -3743,11 +3727,44 @@ OCStackResult initResources() &(((OCResource *) presenceResource.handle)->resourceProperties), OC_ACTIVE, 0); #endif - +#ifndef WITH_ARDUINO if (result == OC_STACK_OK) { result = SRMInitSecureResources(); } +#endif + + if(result == OC_STACK_OK) + { + result = OCCreateResource(&deviceResource, + OC_RSRVD_RESOURCE_TYPE_DEVICE, + OC_RSRVD_INTERFACE_DEFAULT, + OC_RSRVD_DEVICE_URI, + NULL, + NULL, + OC_DISCOVERABLE); + if(result == OC_STACK_OK) + { + result = BindResourceInterfaceToResource((OCResource *)deviceResource, + OC_RSRVD_INTERFACE_READ); + } + } + + if(result == OC_STACK_OK) + { + result = OCCreateResource(&platformResource, + OC_RSRVD_RESOURCE_TYPE_PLATFORM, + OC_RSRVD_INTERFACE_DEFAULT, + OC_RSRVD_PLATFORM_URI, + NULL, + NULL, + OC_DISCOVERABLE); + if(result == OC_STACK_OK) + { + result = BindResourceInterfaceToResource((OCResource *)platformResource, + OC_RSRVD_INTERFACE_READ); + } + } return result; } diff --git a/resource/csdk/stack/src/oicgroup.c b/resource/csdk/stack/src/oicgroup.c index 864cced..20d8735 100755 --- a/resource/csdk/stack/src/oicgroup.c +++ b/resource/csdk/stack/src/oicgroup.c @@ -713,11 +713,6 @@ OCStackResult BuildActionSetFromString(OCActionSet **set, char* actiondesc) { OC_LOG(INFO, TAG, "Build OCAction Instance."); - if(action) - { - OICFree(action->resourceUri); - OICFree(action); - } action = (OCAction*) OICMalloc(sizeof(OCAction)); VARIFY_POINTER_NULL(action, result, exit) memset(action, 0, sizeof(OCAction)); diff --git a/resource/csdk/stack/src/rdpayload.c b/resource/csdk/stack/src/rdpayload.c index b2453b5..5a97219 100644 --- a/resource/csdk/stack/src/rdpayload.c +++ b/resource/csdk/stack/src/rdpayload.c @@ -49,19 +49,11 @@ int64_t OCRDPayloadToCbor(const OCRDPayload *rdPayload, uint8_t *outPayload, siz int flags = 0; cbor_encoder_init(&encoder, outPayload, *size, flags); - CborEncoder rootArray; CborError cborEncoderResult; - cborEncoderResult = cbor_encoder_create_array(&encoder, &rootArray, CBOR_ROOT_ARRAY_LENGTH); - if (CborNoError != cborEncoderResult) - { - OC_LOG(ERROR, TAG, "Failed creating cbor array."); - goto cbor_error; - } - if (rdPayload->rdDiscovery) { CborEncoder map; - cborEncoderResult = cbor_encoder_create_map(&rootArray, &map, CborIndefiniteLength); + cborEncoderResult = cbor_encoder_create_map(&encoder, &map, CborIndefiniteLength); if (CborNoError != cborEncoderResult) { OC_LOG(ERROR, TAG, "Failed creating discovery map."); @@ -86,7 +78,7 @@ int64_t OCRDPayloadToCbor(const OCRDPayload *rdPayload, uint8_t *outPayload, siz OC_LOG(ERROR, TAG, "Failed setting OC_RSRVD_RD_DISCOVERY_SEL."); goto cbor_error; } - cborEncoderResult = cbor_encoder_close_container(&rootArray, &map); + cborEncoderResult = cbor_encoder_close_container(&encoder, &map); if (CborNoError != cborEncoderResult) { OC_LOG(ERROR, TAG, "Failed closing discovery map."); @@ -96,7 +88,7 @@ int64_t OCRDPayloadToCbor(const OCRDPayload *rdPayload, uint8_t *outPayload, siz else if (rdPayload->rdPublish) { CborEncoder colArray; - cborEncoderResult = cbor_encoder_create_array(&rootArray, &colArray, CborIndefiniteLength); + cborEncoderResult = cbor_encoder_create_array(&encoder, &colArray, CborIndefiniteLength); if (CborNoError != cborEncoderResult) { OC_LOG(ERROR, TAG, "Failed creating collection array."); @@ -118,23 +110,32 @@ int64_t OCRDPayloadToCbor(const OCRDPayload *rdPayload, uint8_t *outPayload, siz } rdPublish = rdPublish->next; } - cborEncoderResult = cbor_encoder_close_container(&rootArray, &colArray); + cborEncoderResult = cbor_encoder_close_container(&encoder, &colArray); if (CborNoError != cborEncoderResult) { OC_LOG(ERROR, TAG, "Failed closing collection array."); goto cbor_error; } } - cborEncoderResult = cbor_encoder_close_container(&encoder, &rootArray); - if (CborNoError != cborEncoderResult) + else { - OC_LOG(ERROR, TAG, "Failed closing root array container. "); - goto cbor_error; + CborEncoder map; + cborEncoderResult = cbor_encoder_create_map(&encoder, &map, CborIndefiniteLength); + if (CborNoError != cborEncoderResult) + { + OC_LOG(ERROR, TAG, "Failed creating discovery map."); + goto cbor_error; + } + cborEncoderResult = cbor_encoder_close_container(&encoder, &map); + if (CborNoError != cborEncoderResult) + { + OC_LOG(ERROR, TAG, "Failed creating discovery map."); + goto cbor_error; + } } - *size = encoder.ptr - outPayload; - return OC_STACK_OK; + return OC_STACK_OK; cbor_error: OICFree(outPayload); return OC_STACK_ERROR; diff --git a/resource/csdk/stack/test/SConscript b/resource/csdk/stack/test/SConscript index ade8f3f..d75d459 100644 --- a/resource/csdk/stack/test/SConscript +++ b/resource/csdk/stack/test/SConscript @@ -32,7 +32,7 @@ stacktest_env.PrependUnique(CPPPATH = [ '../../security/include', '../../ocsocket/include', '../../logger/include', - '../../ocrandom/include', + '../../../c_common/ocrandom/include', '../../stack/include', '../../stack/include/internal', '../../connectivity/api', diff --git a/resource/examples/SConscript b/resource/examples/SConscript index 731b203..ffb284a 100644 --- a/resource/examples/SConscript +++ b/resource/examples/SConscript @@ -34,7 +34,7 @@ examples_env = lib_env.Clone() examples_env.AppendUnique(CPPPATH = [ '../include/', '../csdk/stack/include', - '../csdk/ocrandom/include', + '../c_common/ocrandom/include', '../csdk/logger/include', '../oc_logger/include' ]) diff --git a/resource/include/OCRepresentation.h b/resource/include/OCRepresentation.h index 84e88e5..e7bbccb 100644 --- a/resource/include/OCRepresentation.h +++ b/resource/include/OCRepresentation.h @@ -109,6 +109,10 @@ namespace OC virtual ~OCRepresentation(){} + void setDevAddr(const OCDevAddr addr); + + const std::string getHost() const; + OCRepPayload* getPayload() const; void addChild(const OCRepresentation&); @@ -164,8 +168,16 @@ namespace OC if(x!= m_values.end()) { - val = boost::get(x->second); - return true; + try + { + val = boost::get(x->second); + return true; + } + catch (boost::bad_get& e) + { + val = T(); + return false; + } } else { @@ -189,7 +201,14 @@ namespace OC auto x = m_values.find(str); if(x != m_values.end()) { - val = boost::get(x->second); + try + { + val = boost::get(x->second); + } + catch (boost::bad_get& e) + { + return val; + } } return val; } @@ -224,6 +243,9 @@ namespace OC bool isNULL(const std::string& str) const; + private: + std::string m_host; + // STL Container stuff public: class iterator; @@ -243,7 +265,15 @@ namespace OC template T getValue() const { - return boost::get(m_values[m_attrName]); + try + { + return boost::get(m_values[m_attrName]); + } + catch (boost::bad_get& e) + { + T val = T(); + return val; + } } std::string getValueToString() const; diff --git a/resource/include/OCSerialization.h b/resource/include/OCSerialization.h index b112af1..b681eee 100644 --- a/resource/include/OCSerialization.h +++ b/resource/include/OCSerialization.h @@ -21,6 +21,7 @@ #include #include "ocpayload.h" #include "ocrandom.h" +#include "oic_string.h" namespace OC { @@ -50,7 +51,7 @@ namespace OC while(res) { char uuidString[UUID_STRING_SIZE]; - if(OCConvertUuidToString(res->sid, uuidString) != RAND_UUID_OK) + if(OCConvertUuidToString(payload->sid, uuidString) != RAND_UUID_OK) { uuidString[0]= '\0'; } @@ -81,19 +82,29 @@ namespace OC { while(colRes) { + // currently support for ipv4 is provided. + OCDevAddr colAddr; + colAddr.adapter = OC_ADAPTER_IP; + colAddr.flags = OC_IP_USE_V4; + char *ptr = strtok(colRes->tags->baseURI, ":"); + OICStrcpy(colAddr.addr, sizeof(colAddr.addr), ptr); + if (colRes->tags->bitmap & OC_SECURE) { - m_devAddr.flags = + colAddr.flags = (OCTransportFlags)(OC_FLAG_SECURE | m_devAddr.flags); } - if (colRes->tags->port != 0) { - m_devAddr.port = colRes->tags->port; + colAddr.port = colRes->tags->port; + } + else + { + colAddr.port = atoi(ptr+1); } m_resources.push_back(std::shared_ptr( - new OC::OCResource(m_clientWrapper, m_devAddr, + new OC::OCResource(m_clientWrapper, colAddr, std::string(colRes->setLinks->href), std::string((char*)colRes->tags->di.id), (colRes->tags->bitmap & OC_OBSERVABLE) == OC_OBSERVABLE, diff --git a/resource/src/InProcClientWrapper.cpp b/resource/src/InProcClientWrapper.cpp index 4f1dd62..f441ca9 100644 --- a/resource/src/InProcClientWrapper.cpp +++ b/resource/src/InProcClientWrapper.cpp @@ -123,6 +123,7 @@ namespace OC // first one is considered the root, everything else is considered a child of this one. OCRepresentation root = *it; + root.setDevAddr(clientResponse->devAddr); ++it; std::for_each(it, oc.representations().end(), diff --git a/resource/src/OCRepresentation.cpp b/resource/src/OCRepresentation.cpp index 315f83b..2c91437 100644 --- a/resource/src/OCRepresentation.cpp +++ b/resource/src/OCRepresentation.cpp @@ -37,6 +37,9 @@ namespace OC { + static const char COAP[] = "coap://"; + static const char COAPS[] = "coaps://"; + static const char COAP_TCP[] = "coap+tcp://"; void MessageContainer::setPayload(const OCPayload* rep) { @@ -60,7 +63,6 @@ namespace OC void MessageContainer::setPayload(const OCDevicePayload* payload) { OCRepresentation rep; - rep.setUri(payload->uri); char uuidString[UUID_STRING_SIZE]; if(payload->sid && RAND_UUID_OK == OCConvertUuidToString(payload->sid, uuidString)) { @@ -85,8 +87,6 @@ namespace OC void MessageContainer::setPayload(const OCPlatformPayload* payload) { OCRepresentation rep; - rep.setUri(payload->uri); - rep[OC_RSRVD_PLATFORM_ID] = payload->info.platformID ? std::string(payload->info.platformID) : std::string(); @@ -641,6 +641,42 @@ namespace OC { m_children = children; } + + void OCRepresentation::setDevAddr(const OCDevAddr m_devAddr) + { + std::ostringstream ss; + if (m_devAddr.flags & OC_SECURE) + { + ss << COAPS; + } + else if (m_devAddr.adapter & OC_ADAPTER_TCP) + { + ss << COAP_TCP; + } + else + { + ss << COAP; + } + if (m_devAddr.flags & OC_IP_USE_V6) + { + ss << '[' << m_devAddr.addr << ']'; + } + else + { + ss << m_devAddr.addr; + } + if (m_devAddr.port) + { + ss << ':' << m_devAddr.port; + } + m_host = ss.str(); + } + + const std::string OCRepresentation::getHost() const + { + return m_host; + } + void OCRepresentation::setUri(const char* uri) { m_uri = uri ? uri : ""; diff --git a/resource/src/OCResource.cpp b/resource/src/OCResource.cpp index 204b0da..2d11e46 100644 --- a/resource/src/OCResource.cpp +++ b/resource/src/OCResource.cpp @@ -28,10 +28,7 @@ namespace OC { static const char COAP[] = "coap://"; static const char COAPS[] = "coaps://"; - -#ifdef TCP_ADAPTER static const char COAP_TCP[] = "coap+tcp://"; -#endif using OC::nil_guard; using OC::result_guard; @@ -127,13 +124,11 @@ void OCResource::setHost(const std::string& host) prefix_len = sizeof(COAPS) - 1; m_devAddr.flags = static_cast(m_devAddr.flags & OC_SECURE); } -#ifdef TCP_ADAPTER else if (host.compare(0, sizeof(COAP_TCP) - 1, COAP_TCP) == 0) { prefix_len = sizeof(COAP_TCP) - 1; m_devAddr.adapter = static_cast(m_devAddr.adapter & OC_ADAPTER_TCP); } -#endif else { throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(), @@ -417,12 +412,10 @@ std::string OCResource::host() const { ss << COAPS; } -#ifdef TCP_ADAPTER else if (m_devAddr.adapter & OC_ADAPTER_TCP) { ss << COAP_TCP; } -#endif else { ss << COAP; diff --git a/resource/src/SConscript b/resource/src/SConscript index df2f209..b3d92ca 100644 --- a/resource/src/SConscript +++ b/resource/src/SConscript @@ -34,7 +34,7 @@ oclib_env = lib_env.Clone() oclib_env.AppendUnique(CPPPATH = [ '../include/', '../csdk/stack/include', - '../csdk/ocrandom/include', + '../c_common/ocrandom/include', '../csdk/logger/include', '../oc_logger/include', '../csdk/connectivity/lib/libcoap-4.1.1' diff --git a/resource/unit_tests.scons b/resource/unit_tests.scons index c254785..a638e4b 100644 --- a/resource/unit_tests.scons +++ b/resource/unit_tests.scons @@ -41,10 +41,10 @@ if target_os == 'linux': # Build Common unit tests SConscript('c_common/oic_string/test/SConscript') SConscript('c_common/oic_malloc/test/SConscript') + SConscript('c_common/ocrandom/test/SConscript') # Build C unit tests SConscript('csdk/stack/test/SConscript') - SConscript('csdk/ocrandom/test/SConscript') SConscript('csdk/connectivity/test/SConscript') diff --git a/resource/unittests/OCRepresentationEncodingTest.cpp b/resource/unittests/OCRepresentationEncodingTest.cpp index c679495..e1b0807 100644 --- a/resource/unittests/OCRepresentationEncodingTest.cpp +++ b/resource/unittests/OCRepresentationEncodingTest.cpp @@ -47,8 +47,6 @@ namespace OC // CBOR->OCPayload and OCPayload->OCRepresentation conversions namespace OCRepresentationEncodingTest { - - static const char uri1[] = "/testuri"; static const uint8_t sid1[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; static const char devicename1[] = "device name"; static const char specver1[] = "spec version"; @@ -57,13 +55,11 @@ namespace OCRepresentationEncodingTest TEST(DeviceDiscoveryEncoding, Normal) { OCDevicePayload* device = OCDevicePayloadCreate( - uri1, sid1, devicename1, specver1, dmver1); - EXPECT_STREQ(uri1, device->uri); EXPECT_STREQ(devicename1, device->deviceName); EXPECT_STREQ(specver1, device->specVersion); EXPECT_STREQ(dmver1, device->dataModelVersion); @@ -82,7 +78,6 @@ namespace OCRepresentationEncodingTest cborData, cborSize)); OICFree(cborData); - EXPECT_STREQ(device->uri, ((OCDevicePayload*)parsedDevice)->uri); EXPECT_STREQ(device->deviceName, ((OCDevicePayload*)parsedDevice)->deviceName); EXPECT_STREQ(device->specVersion, ((OCDevicePayload*)parsedDevice)->specVersion); EXPECT_STREQ(device->dataModelVersion, ((OCDevicePayload*)parsedDevice)->dataModelVersion); @@ -94,15 +89,14 @@ namespace OCRepresentationEncodingTest mc.setPayload(parsedDevice); EXPECT_EQ(1u, mc.representations().size()); const OC::OCRepresentation& r = mc.representations()[0]; - EXPECT_STREQ(uri1, r.getUri().c_str()); EXPECT_STREQ(devicename1, r.getValue(OC_RSRVD_DEVICE_NAME).c_str()); EXPECT_STREQ(specver1, r.getValue(OC_RSRVD_SPEC_VERSION).c_str()); EXPECT_STREQ(dmver1, r.getValue(OC_RSRVD_DATA_MODEL_VERSION).c_str()); - OCPayloadDestroy(parsedDevice); } + static const char uri1[] = "/testuri"; static char pfid1[] = "pfid"; static char mfgnm1[] = "mfgnm"; static char mfgurl1[] = "mfgurl"; @@ -120,9 +114,8 @@ namespace OCRepresentationEncodingTest { OCPlatformInfo info {pfid1, mfgnm1, mfgurl1, modelnum1, dom1, pfver1, osver1, hwver1, fwver1, url1, time1}; - OCPlatformPayload* platform = OCPlatformPayloadCreate(uri1, &info); + OCPlatformPayload* platform = OCPlatformPayloadCreate(&info); EXPECT_EQ(PAYLOAD_TYPE_PLATFORM, ((OCPayload*)platform)->type); - EXPECT_STREQ(uri1, platform->uri); EXPECT_STREQ(pfid1, platform->info.platformID); EXPECT_STREQ(mfgnm1, platform->info.manufacturerName); EXPECT_STREQ(mfgurl1, platform->info.manufacturerUrl); @@ -145,7 +138,6 @@ namespace OCRepresentationEncodingTest EXPECT_EQ(platform->base.type, ((OCPlatformPayload*)parsedPlatform)->base.type); OCPlatformPayload* platform2 = (OCPlatformPayload*)parsedPlatform; - EXPECT_STREQ(platform->uri, platform2->uri); EXPECT_STREQ(platform->info.platformID, platform2->info.platformID); EXPECT_STREQ(platform->info.manufacturerName, platform->info.manufacturerName); EXPECT_STREQ(platform->info.manufacturerUrl, platform->info.manufacturerUrl); @@ -164,7 +156,6 @@ namespace OCRepresentationEncodingTest mc.setPayload(parsedPlatform); EXPECT_EQ(1u, mc.representations().size()); const OC::OCRepresentation& r = mc.representations()[0]; - EXPECT_STREQ(uri1, r.getUri().c_str()); EXPECT_STREQ(pfid1, r.getValue(OC_RSRVD_PLATFORM_ID).c_str()); EXPECT_STREQ(mfgnm1, r.getValue(OC_RSRVD_MFG_NAME).c_str()); EXPECT_STREQ(mfgurl1, r.getValue(OC_RSRVD_MFG_URL).c_str()); @@ -179,7 +170,30 @@ namespace OCRepresentationEncodingTest OCPayloadDestroy(parsedPlatform); } + TEST(PresencePayload, Normal) + { + uint32_t maxAge = 0; + uint32_t sequenceNumber = 0; + OCPresenceTrigger trigger = OC_PRESENCE_TRIGGER_CREATE; + OCPresencePayload *presence = OCPresencePayloadCreate(sequenceNumber, maxAge, trigger, uri1); + + uint8_t* cborData; + size_t cborSize; + OCPayload* cparsed; + EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*)presence, &cborData, &cborSize)); + EXPECT_EQ(OC_STACK_OK, OCParsePayload(&cparsed, PAYLOAD_TYPE_PRESENCE, + cborData, cborSize)); + OCPayloadDestroy((OCPayload*)presence); + OICFree(cborData); + OCPresencePayload* parsed = ((OCPresencePayload*)cparsed); + EXPECT_EQ(sequenceNumber, parsed->sequenceNumber); + EXPECT_EQ(maxAge, parsed->maxAge); + EXPECT_EQ(trigger, parsed->trigger); + EXPECT_STREQ(uri1, parsed->resourceType); + + OCPayloadDestroy(cparsed); + } // Representation Payloads TEST(RepresentationEncoding, BaseAttributeTypes) { @@ -633,12 +647,12 @@ namespace OCRepresentationEncodingTest { OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate(); OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload)); + payload->sid = (uint8_t*)OICMalloc(16); payload->resources = resource; OCResourcePayloadAddResourceType(resource, "rt.singleitem"); OCResourcePayloadAddInterface(resource, "if.singleitem"); resource->uri = OICStrdup("/uri/thing"); - resource->sid = (uint8_t*)OICMalloc(16); uint8_t* cborData; size_t cborSize; @@ -666,13 +680,13 @@ namespace OCRepresentationEncodingTest TEST(DiscoveryRTandIF, SingleItemFrontTrim) { OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate(); + payload->sid = (uint8_t*)OICMalloc(16); OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload)); payload->resources = resource; OCResourcePayloadAddResourceType(resource, " rt.singleitem"); OCResourcePayloadAddInterface(resource, " if.singleitem"); resource->uri = OICStrdup("/uri/thing"); - resource->sid = (uint8_t*)OICMalloc(16); uint8_t* cborData; size_t cborSize; @@ -699,13 +713,13 @@ namespace OCRepresentationEncodingTest TEST(DiscoveryRTandIF, SingleItemBackTrim) { OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate(); + payload->sid = (uint8_t*)OICMalloc(16); OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload)); payload->resources = resource; OCResourcePayloadAddResourceType(resource, "rt.singleitem "); OCResourcePayloadAddInterface(resource, "if.singleitem "); resource->uri = OICStrdup("/uri/thing"); - resource->sid = (uint8_t*)OICMalloc(16); uint8_t* cborData; size_t cborSize; @@ -732,13 +746,13 @@ namespace OCRepresentationEncodingTest TEST(DiscoveryRTandIF, SingleItemBothTrim) { OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate(); + payload->sid = (uint8_t*)OICMalloc(16); OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload)); payload->resources = resource; OCResourcePayloadAddResourceType(resource, " rt.singleitem "); OCResourcePayloadAddInterface(resource, " if.singleitem "); resource->uri = OICStrdup("/uri/thing"); - resource->sid = (uint8_t*)OICMalloc(16); uint8_t* cborData; size_t cborSize; @@ -765,6 +779,7 @@ namespace OCRepresentationEncodingTest TEST(DiscoveryRTandIF, MultiItemsNormal) { OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate(); + payload->sid = (uint8_t*)OICMalloc(16); OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload)); payload->resources = resource; @@ -773,7 +788,6 @@ namespace OCRepresentationEncodingTest OCResourcePayloadAddInterface(resource, "if.firstitem"); OCResourcePayloadAddInterface(resource, "if.seconditem"); resource->uri = OICStrdup("/uri/thing"); - resource->sid = (uint8_t*)OICMalloc(16); uint8_t* cborData; size_t cborSize; @@ -802,6 +816,7 @@ namespace OCRepresentationEncodingTest TEST(DiscoveryRTandIF, MultiItemExtraLeadSpaces) { OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate(); + payload->sid = (uint8_t*)OICMalloc(16); OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload)); payload->resources = resource; @@ -810,7 +825,6 @@ namespace OCRepresentationEncodingTest OCResourcePayloadAddInterface(resource, " if.firstitem"); OCResourcePayloadAddInterface(resource, " if.seconditem"); resource->uri = OICStrdup("/uri/thing"); - resource->sid = (uint8_t*)OICMalloc(16); uint8_t* cborData; size_t cborSize; @@ -839,6 +853,7 @@ namespace OCRepresentationEncodingTest TEST(DiscoveryRTandIF, MultiItemExtraTrailSpaces) { OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate(); + payload->sid = (uint8_t*)OICMalloc(16); OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload)); payload->resources = resource; @@ -847,7 +862,6 @@ namespace OCRepresentationEncodingTest OCResourcePayloadAddInterface(resource, "if.firstitem "); OCResourcePayloadAddInterface(resource, "if.seconditem "); resource->uri = OICStrdup("/uri/thing"); - resource->sid = (uint8_t*)OICMalloc(16); uint8_t* cborData; size_t cborSize; @@ -876,6 +890,7 @@ namespace OCRepresentationEncodingTest TEST(DiscoveryRTandIF, MultiItemBothSpaces) { OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate(); + payload->sid = (uint8_t*)OICMalloc(16); OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload)); payload->resources = resource; @@ -884,7 +899,6 @@ namespace OCRepresentationEncodingTest OCResourcePayloadAddInterface(resource, " if.firstitem "); OCResourcePayloadAddInterface(resource, " if.seconditem "); resource->uri = OICStrdup("/uri/thing"); - resource->sid = (uint8_t*)OICMalloc(16); uint8_t* cborData; size_t cborSize; @@ -913,7 +927,6 @@ namespace OCRepresentationEncodingTest TEST(RepresentationEncodingRTandIF, SingleItemNormal) { OCRepPayload* payload = OCRepPayloadCreate(); - OCRepPayloadSetUri(payload, "/this/uri"); OCRepPayloadAddResourceType(payload, "rt.firstitem"); OCRepPayloadAddInterface(payload, "if.firstitem"); @@ -940,7 +953,6 @@ namespace OCRepresentationEncodingTest TEST(RepresentationEncodingRTandIF, SingleItemFrontTrim) { OCRepPayload* payload = OCRepPayloadCreate(); - OCRepPayloadSetUri(payload, "/this/uri"); OCRepPayloadAddResourceType(payload, " rt.firstitem"); OCRepPayloadAddInterface(payload, " if.firstitem"); @@ -967,7 +979,6 @@ namespace OCRepresentationEncodingTest TEST(RepresentationEncodingRTandIF, SingleItemBackTrim) { OCRepPayload* payload = OCRepPayloadCreate(); - OCRepPayloadSetUri(payload, "/this/uri"); OCRepPayloadAddResourceType(payload, "rt.firstitem "); OCRepPayloadAddInterface(payload, "if.firstitem "); @@ -994,7 +1005,6 @@ namespace OCRepresentationEncodingTest TEST(RepresentationEncodingRTandIF, SingleItemBothTrim) { OCRepPayload* payload = OCRepPayloadCreate(); - OCRepPayloadSetUri(payload, "/this/uri"); OCRepPayloadAddResourceType(payload, " rt.firstitem "); OCRepPayloadAddInterface(payload, " if.firstitem "); @@ -1021,7 +1031,6 @@ namespace OCRepresentationEncodingTest TEST(RepresentationEncodingRTandIF, MultiItemsNormal) { OCRepPayload* payload = OCRepPayloadCreate(); - OCRepPayloadSetUri(payload, "/this/uri"); OCRepPayloadAddResourceType(payload, "rt.firstitem"); OCRepPayloadAddResourceType(payload, "rt.seconditem"); OCRepPayloadAddInterface(payload, "if.firstitem"); @@ -1052,7 +1061,6 @@ namespace OCRepresentationEncodingTest TEST(RepresentationEncodingRTandIF, MultiItemExtraLeadSpaces) { OCRepPayload* payload = OCRepPayloadCreate(); - OCRepPayloadSetUri(payload, "/this/uri"); OCRepPayloadAddResourceType(payload, " rt.firstitem"); OCRepPayloadAddResourceType(payload, " rt.seconditem"); OCRepPayloadAddInterface(payload, " if.firstitem"); @@ -1083,7 +1091,6 @@ namespace OCRepresentationEncodingTest TEST(RepresentationEncodingRTandIF, MultiItemExtraTrailSpaces) { OCRepPayload* payload = OCRepPayloadCreate(); - OCRepPayloadSetUri(payload, "/this/uri"); OCRepPayloadAddResourceType(payload, "rt.firstitem "); OCRepPayloadAddResourceType(payload, "rt.seconditem "); OCRepPayloadAddInterface(payload, "if.firstitem "); @@ -1114,7 +1121,6 @@ namespace OCRepresentationEncodingTest TEST(RepresentationEncodingRTandIF, MultiItemExtraMiddleSpaces) { OCRepPayload* payload = OCRepPayloadCreate(); - OCRepPayloadSetUri(payload, "/this/uri"); OCRepPayloadAddResourceType(payload, " rt.firstitem "); OCRepPayloadAddResourceType(payload, " rt.seconditem "); OCRepPayloadAddInterface(payload, " if.firstitem "); diff --git a/resource/unittests/OCRepresentationTest.cpp b/resource/unittests/OCRepresentationTest.cpp index befcdcb..5701fc2 100644 --- a/resource/unittests/OCRepresentationTest.cpp +++ b/resource/unittests/OCRepresentationTest.cpp @@ -421,9 +421,9 @@ namespace OCRepresentationTest EXPECT_EQ(nullptr, repout2); double badout; - EXPECT_THROW(badout = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badout)); string badoutstr; - EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badoutstr)); (void)badout; (void)badoutstr; } @@ -442,9 +442,9 @@ namespace OCRepresentationTest EXPECT_EQ(repsource, repout2); double badout; - EXPECT_THROW(badout = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badout)); string badoutstr; - EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badoutstr)); (void)badout; (void)badoutstr; } @@ -463,9 +463,9 @@ namespace OCRepresentationTest EXPECT_EQ(repsource, repout2); int badout; - EXPECT_THROW(badout = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badout)); string badoutstr; - EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badoutstr)); (void)badout; (void)badoutstr; } @@ -492,9 +492,9 @@ namespace OCRepresentationTest EXPECT_EQ(repsource, repout); int badout; - EXPECT_THROW(badout = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badout)); string badoutstr; - EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badoutstr)); (void)badout; (void)badoutstr; } @@ -513,7 +513,7 @@ namespace OCRepresentationTest EXPECT_EQ(repsource, repout2); double badout; - EXPECT_THROW(badout = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badout)); (void)badout; } @@ -535,9 +535,9 @@ namespace OCRepresentationTest EXPECT_EQ(repsource.getUri(), repout2.getUri()); double badout; - EXPECT_THROW(badout = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badout)); string badoutstr; - EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badoutstr)); (void)badout; (void)badoutstr; } @@ -556,9 +556,9 @@ namespace OCRepresentationTest EXPECT_EQ(repsource, repout2); double badout; - EXPECT_THROW(badout = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badout)); string badoutstr; - EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badoutstr)); (void)badout; (void)badoutstr; } @@ -577,9 +577,9 @@ namespace OCRepresentationTest EXPECT_EQ(repsource, repout2); double badout; - EXPECT_THROW(badout = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badout)); string badoutstr; - EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badoutstr)); (void)badout; (void)badoutstr; } @@ -598,9 +598,9 @@ namespace OCRepresentationTest EXPECT_EQ(repsource, repout2); double badout; - EXPECT_THROW(badout = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badout)); string badoutstr; - EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badoutstr)); (void)badout; (void)badoutstr; } @@ -619,9 +619,9 @@ namespace OCRepresentationTest EXPECT_EQ(repsource, repout2); double badout; - EXPECT_THROW(badout = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badout)); string badoutstr; - EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badoutstr)); (void)badout; (void)badoutstr; } @@ -640,9 +640,9 @@ namespace OCRepresentationTest EXPECT_EQ(repsource, repout2); double badout; - EXPECT_THROW(badout = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badout)); string badoutstr; - EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badoutstr)); (void)badout; (void)badoutstr; } @@ -662,9 +662,9 @@ namespace OCRepresentationTest EXPECT_EQ(repsource, repout2); double badout; - EXPECT_THROW(badout = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badout)); string badoutstr; - EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badoutstr)); (void)badout; (void)badoutstr; } @@ -683,9 +683,9 @@ namespace OCRepresentationTest EXPECT_EQ(repsource, repout2); double badout; - EXPECT_THROW(badout = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badout)); string badoutstr; - EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badoutstr)); (void)badout; (void)badoutstr; } @@ -704,9 +704,9 @@ namespace OCRepresentationTest EXPECT_EQ(repsource, repout2); double badout; - EXPECT_THROW(badout = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badout)); string badoutstr; - EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badoutstr)); (void)badout; (void)badoutstr; } @@ -726,9 +726,9 @@ namespace OCRepresentationTest EXPECT_EQ(repsource, repout2); double badout; - EXPECT_THROW(badout = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badout)); string badoutstr; - EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badoutstr)); (void)badout; (void)badoutstr; } @@ -747,9 +747,9 @@ namespace OCRepresentationTest EXPECT_EQ(repsource, repout2); double badout; - EXPECT_THROW(badout = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badout)); string badoutstr; - EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badoutstr)); (void)badout; (void)badoutstr; } @@ -768,9 +768,9 @@ namespace OCRepresentationTest EXPECT_EQ(repsource, repout2); double badout; - EXPECT_THROW(badout = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badout)); string badoutstr; - EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badoutstr)); (void)badout; (void)badoutstr; } @@ -790,9 +790,9 @@ namespace OCRepresentationTest EXPECT_EQ(repsource, repout2); double badout; - EXPECT_THROW(badout = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badout)); string badoutstr; - EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badoutstr)); (void)badout; (void)badoutstr; } @@ -818,9 +818,9 @@ namespace OCRepresentationTest EXPECT_EQ(inner2.getUri(), repout2[1].getUri()); double badout; - EXPECT_THROW(badout = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badout)); string badoutstr; - EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badoutstr)); (void)badout; (void)badoutstr; } @@ -860,9 +860,9 @@ namespace OCRepresentationTest EXPECT_EQ(inner4.getUri(), repout2[1][1].getUri()); double badout; - EXPECT_THROW(badout = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badout)); string badoutstr; - EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badoutstr)); (void)badout; (void)badoutstr; } @@ -922,9 +922,9 @@ namespace OCRepresentationTest EXPECT_EQ(inner8.getUri(), repout2[1][1][1].getUri()); double badout; - EXPECT_THROW(badout = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badout)); string badoutstr; - EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get); + EXPECT_FALSE(rep.getValue(AttrName, badoutstr)); (void)badout; (void)badoutstr; } diff --git a/resource/unittests/SConscript b/resource/unittests/SConscript index 0506303..65b0921 100644 --- a/resource/unittests/SConscript +++ b/resource/unittests/SConscript @@ -36,7 +36,7 @@ unittests_env.PrependUnique(CPPPATH = [ '../csdk/connectivity/api', '../csdk/connectivity/external/inc', '../csdk/ocsocket/include', - '../csdk/ocrandom/include', + '../c_common/ocrandom/include', '../csdk/logger/include', '#extlibs/gtest/gtest-1.7.0/include', '#extlibs/hippomocks-master/HippoMocks', diff --git a/service/resource-container/examples/BMISensorBundle/include/BMISensorResource.h b/service/resource-container/examples/BMISensorBundle/include/BMISensorResource.h index c35facf..e264962 100644 --- a/service/resource-container/examples/BMISensorBundle/include/BMISensorResource.h +++ b/service/resource-container/examples/BMISensorBundle/include/BMISensorResource.h @@ -31,6 +31,8 @@ class BMISensorResource : public SoftSensorResource { public: BMISensorResource(); + BMISensorResource(const BMISensorResource &other)=delete; + BMISensorResource& operator=( const BMISensorResource& rhs )=delete; ~BMISensorResource(); virtual void handleSetAttributesRequest(RCSResourceAttributes &attrs); diff --git a/service/resource-container/examples/BMISensorBundle/src/BMISensorBundleActivator.cpp b/service/resource-container/examples/BMISensorBundle/src/BMISensorBundleActivator.cpp index b54622b..f322834 100644 --- a/service/resource-container/examples/BMISensorBundle/src/BMISensorBundleActivator.cpp +++ b/service/resource-container/examples/BMISensorBundle/src/BMISensorBundleActivator.cpp @@ -25,7 +25,7 @@ #include "BMISensorResource.h" -BMISensorBundleActivator *bundle; +BMISensorBundleActivator *g_bundleBMI; BMISensorBundleActivator::BMISensorBundleActivator() { @@ -105,22 +105,22 @@ void BMISensorBundleActivator::destroyResource(BundleResource::Ptr resource) extern "C" void bmisensor_externalActivateBundle(ResourceContainerBundleAPI *resourceContainer, std::string bundleId) { - bundle = new BMISensorBundleActivator(); - bundle->activateBundle(resourceContainer, bundleId); + g_bundleBMI = new BMISensorBundleActivator(); + g_bundleBMI->activateBundle(resourceContainer, bundleId); } extern "C" void bmisensor_externalDeactivateBundle() { - bundle->deactivateBundle(); - delete bundle; + g_bundleBMI->deactivateBundle(); + delete g_bundleBMI; } extern "C" void bmisensor_externalCreateResource(resourceInfo resourceInfo) { - bundle->createResource(resourceInfo); + g_bundleBMI->createResource(resourceInfo); } extern "C" void bmisensor_externalDestroyResource(BundleResource::Ptr pBundleResource) { - bundle->destroyResource(pBundleResource); + g_bundleBMI->destroyResource(pBundleResource); } diff --git a/service/resource-container/examples/ContainerSample.cpp b/service/resource-container/examples/ContainerSample.cpp index 5d029b9..e223629 100644 --- a/service/resource-container/examples/ContainerSample.cpp +++ b/service/resource-container/examples/ContainerSample.cpp @@ -33,12 +33,11 @@ using OC::oc_log_stream; #define MAX_PATH 2048 -/* Annother way to create a context: */ +/* Another way to create a context: */ auto info_logger = []() -> boost::iostreams::stream & { static OC::oc_log_stream ols(oc_make_ostream_logger); static boost::iostreams::stream os(ols); - return os; }; diff --git a/service/resource-container/examples/ContainerSampleClient.cpp b/service/resource-container/examples/ContainerSampleClient.cpp index cc97d1d..e7ce3f3 100644 --- a/service/resource-container/examples/ContainerSampleClient.cpp +++ b/service/resource-container/examples/ContainerSampleClient.cpp @@ -1,6 +1,6 @@ //****************************************************************** // -// Copyright 2014 Intel Mobile Communications GmbH All Rights Reserved. +// Copyright 2015 Samsung Electronics All Rights Reserved. // //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // @@ -18,8 +18,7 @@ // //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// OCClient.cpp : Defines the entry point for the console application. -// + #include #include #include @@ -204,7 +203,7 @@ void postLightRepresentation(std::shared_ptr resource) std::cout << "Posting light representation..." << std::endl; - mylight.m_on_off = "false"; + mylight.m_on_off = false; rep.setValue("on-off", mylight.m_on_off); diff --git a/service/resource-container/examples/DiscomfortIndexSensorBundle/include/DiscomfortIndexSensorResource.h b/service/resource-container/examples/DiscomfortIndexSensorBundle/include/DiscomfortIndexSensorResource.h index 6780715..583094e 100644 --- a/service/resource-container/examples/DiscomfortIndexSensorBundle/include/DiscomfortIndexSensorResource.h +++ b/service/resource-container/examples/DiscomfortIndexSensorBundle/include/DiscomfortIndexSensorResource.h @@ -32,6 +32,8 @@ class DiscomfortIndexSensorResource : public SoftSensorResource public: DiscomfortIndexSensorResource(); ~DiscomfortIndexSensorResource(); + DiscomfortIndexSensorResource(const DiscomfortIndexSensorResource &other)=delete; + DiscomfortIndexSensorResource& operator=( const DiscomfortIndexSensorResource& rhs )=delete; virtual void handleSetAttributesRequest(RCSResourceAttributes &attrs); diff --git a/service/resource-container/examples/DiscomfortIndexSensorBundle/src/DISensorBundleActivator.cpp b/service/resource-container/examples/DiscomfortIndexSensorBundle/src/DISensorBundleActivator.cpp index 147e3c4..27ac1cf 100644 --- a/service/resource-container/examples/DiscomfortIndexSensorBundle/src/DISensorBundleActivator.cpp +++ b/service/resource-container/examples/DiscomfortIndexSensorBundle/src/DISensorBundleActivator.cpp @@ -24,7 +24,7 @@ #include #include "DiscomfortIndexSensorResource.h" -DISensorBundleActivator *bundle; +DISensorBundleActivator *g_bundleDI; DISensorBundleActivator::DISensorBundleActivator() { @@ -106,22 +106,22 @@ void DISensorBundleActivator::destroyResource(BundleResource::Ptr resource) extern "C" void disensor_externalActivateBundle(ResourceContainerBundleAPI *resourceContainer, std::string bundleId) { - bundle = new DISensorBundleActivator(); - bundle->activateBundle(resourceContainer, bundleId); + g_bundleDI = new DISensorBundleActivator(); + g_bundleDI->activateBundle(resourceContainer, bundleId); } extern "C" void disensor_externalDeactivateBundle() { - bundle->deactivateBundle(); - delete bundle; + g_bundleDI->deactivateBundle(); + delete g_bundleDI; } extern "C" void disensor_externalCreateResource(resourceInfo resourceInfo) { - bundle->createResource(resourceInfo); + g_bundleDI->createResource(resourceInfo); } extern "C" void disensor_externalDestroyResource(BundleResource::Ptr pBundleResource) { - bundle->destroyResource(pBundleResource); + g_bundleDI->destroyResource(pBundleResource); } diff --git a/service/resource-container/examples/DiscomfortIndexSensorBundle/src/DiscomfortIndexSensorResource.cpp b/service/resource-container/examples/DiscomfortIndexSensorBundle/src/DiscomfortIndexSensorResource.cpp index bc65a4e..d51febb 100644 --- a/service/resource-container/examples/DiscomfortIndexSensorBundle/src/DiscomfortIndexSensorResource.cpp +++ b/service/resource-container/examples/DiscomfortIndexSensorBundle/src/DiscomfortIndexSensorResource.cpp @@ -90,4 +90,4 @@ void DiscomfortIndexSensorResource::onUpdatedInputResource(const std::string att { executeLogic(); } -} \ No newline at end of file +} diff --git a/service/resource-container/examples/HueSampleBundle/src/HueSampleBundleActivator.cpp b/service/resource-container/examples/HueSampleBundle/src/HueSampleBundleActivator.cpp index 903f6ba..36fad24 100644 --- a/service/resource-container/examples/HueSampleBundle/src/HueSampleBundleActivator.cpp +++ b/service/resource-container/examples/HueSampleBundle/src/HueSampleBundleActivator.cpp @@ -26,7 +26,7 @@ using namespace OIC::Service; -HueSampleBundleActivator *bundle; +HueSampleBundleActivator *g_bundleHUE; HueSampleBundleActivator::HueSampleBundleActivator() { @@ -108,22 +108,22 @@ void HueSampleBundleActivator::destroyResource(BundleResource::Ptr pBundleResour extern "C" void huesample_externalActivateBundle(ResourceContainerBundleAPI *resourceContainer, std::string bundleId) { - bundle = new HueSampleBundleActivator(); - bundle->activateBundle(resourceContainer, bundleId); + g_bundleHUE = new HueSampleBundleActivator(); + g_bundleHUE->activateBundle(resourceContainer, bundleId); } extern "C" void huesample_externalDeactivateBundle() { - bundle->deactivateBundle(); - delete bundle; + g_bundleHUE->deactivateBundle(); + delete g_bundleHUE; } extern "C" void huesample_externalCreateResource(resourceInfo resourceInfo) { - bundle->createResource(resourceInfo); + g_bundleHUE->createResource(resourceInfo); } extern "C" void huesample_externalDestroyResource(BundleResource::Ptr pBundleResource) { - bundle->destroyResource(pBundleResource); + g_bundleHUE->destroyResource(pBundleResource); } diff --git a/service/resource-container/examples/tizen/ContainerClientApp/.cproject b/service/resource-container/examples/tizen/ContainerClientApp/.cproject index f656f95..7bd6df1 100644 --- a/service/resource-container/examples/tizen/ContainerClientApp/.cproject +++ b/service/resource-container/examples/tizen/ContainerClientApp/.cproject @@ -98,7 +98,6 @@