From: Jihun Ha Date: Thu, 11 Aug 2016 02:06:17 +0000 (+0900) Subject: Merge remote-tracking branch 'origin/extended-easysetup' X-Git-Tag: 1.2.0+RC1~136^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f49a4d62e6180a49de0f52114884fa33df099b82;hp=137a307a2fd6c26452d20051000ac586523b97d0;p=platform%2Fupstream%2Fiotivity.git Merge remote-tracking branch 'origin/extended-easysetup' Change-Id: I9d846ee6afcfa18a53081c606401ffe4b8d4d18c Signed-off-by: Jihun Ha --- diff --git a/android/android_api/SConscript b/android/android_api/SConscript index f3431d4..5680548 100644 --- a/android/android_api/SConscript +++ b/android/android_api/SConscript @@ -69,3 +69,4 @@ cmdBuildExamples=jdk_env.Gradle(target="../examples/devicediscoveryclient/apk", # android examples require android api to be built before being invoked Depends(cmdBuildExamples, cmdBuildApi) +env.AppendUnique(baseAAR = cmdBuildApi) diff --git a/build_common/SConscript b/build_common/SConscript index ca26680..cc98457 100644 --- a/build_common/SConscript +++ b/build_common/SConscript @@ -112,12 +112,6 @@ help_vars.AddVariables(('DEVICE_NAME', 'Network display name for device (For Ard help_vars.Add(PathVariable('ANDROID_NDK', 'Android NDK path', None, PathVariable.PathAccept)) help_vars.Add(PathVariable('ANDROID_HOME', 'Android SDK path', None, PathVariable.PathAccept)) help_vars.Add(PathVariable('ANDROID_GRADLE', 'Gradle binary file', None, PathVariable.PathIsFile)) -#ES_TARGET_ENROLLEE is for specifying what is our target enrollee (Arduino or rest of platforms which support Multicast) -help_vars.Add(EnumVariable('ES_TARGET_ENROLLEE', 'Target Enrollee', 'arduino', allowed_values=('arduino', 'tizen', 'linux'))) -#ES_ROLE is for specifying the role (Enrollee or Mediator) for which scons is being executed -help_vars.Add(EnumVariable('ES_ROLE', 'Target build mode', 'mediator', allowed_values=('mediator', 'enrollee'))) -#ES_SOFT_MODE is for specifying MODE (Mode 1 : Enrollee with Soft AP or Mode 2 : Mediator with Soft AP) -help_vars.Add(EnumVariable('ES_SOFTAP_MODE', 'Target build mode', 'ENROLLEE_SOFTAP', allowed_values=('ENROLLEE_SOFTAP', 'MEDIATOR_SOFTAP'))) AddOption('--prefix', dest='prefix', diff --git a/resource/docs/c-doc/Doxyfile b/resource/docs/c-doc/Doxyfile index 92144a3..dcd6bd7 100644 --- a/resource/docs/c-doc/Doxyfile +++ b/resource/docs/c-doc/Doxyfile @@ -681,8 +681,8 @@ INPUT = . \ ../../csdk/stack/include/internal/oicgroup.h \ ../../csdk/stack/include/internal/oickeepalive.h \ guides \ + ../../../service/easy-setup/inc \ ../../../service/easy-setup/enrollee/inc \ - ../../../service/easy-setup/enrollee/src/softap.h \ ../../../service/resource-directory/include \ diff --git a/service/easy-setup/Build_Instructions_Android_Arduino.txt b/service/easy-setup/Build_Instructions_Android_Arduino.txt index 80bfd14..e6081fa 100644 --- a/service/easy-setup/Build_Instructions_Android_Arduino.txt +++ b/service/easy-setup/Build_Instructions_Android_Arduino.txt @@ -43,8 +43,7 @@ Steps to build and deploy Easysetup Mediator in Android platform export ANDROID_NDK= a) In the IoTivity root source folder execute - scons TARGET_OS=android TARGET_ARCH=armeabi TARGET_TRANSPORT=IP ES_ROLE=mediator ES_TARGET_ENROLLEE={Platform} RELEASE=0 - Note : {Platform} can be -> arduino , linux, tizen + scons TARGET_OS=android TARGET_ARCH=armeabi TARGET_TRANSPORT=IP RELEASE=0 b) If the project is setup correctly, you should see a BUILD SUCCESSFUL message on the terminal You should see the .aar files generated inside of '/android/android_api/base/build/outputs/aar' directory. The .aar files contain jni directory and also a .jar file @@ -121,7 +120,7 @@ Steps to build and deploy Easysetup Mediator in Arduino platform Possible values for are: [Only ip is currently supported] -> IP : - $ scons service TARGET_OS=arduino BOARD=arduino_due_x_dbg TARGET_ARCH=arm SHIELD=WIFI ES_ROLE=enrollee RELEASE=0 + $ scons service TARGET_OS=arduino BOARD=arduino_due_x_dbg TARGET_ARCH=arm SHIELD=WIFI RELEASE=0 -> BLE : $ scons service TARGET_OS=arduino BOARD=arduino_due_x_dbg TARGET_ARCH=arm SHIELD=BLE RELEASE=0 [Currently not supporting] diff --git a/service/easy-setup/SConscript b/service/easy-setup/SConscript index 3028c08..12e985a 100755 --- a/service/easy-setup/SConscript +++ b/service/easy-setup/SConscript @@ -24,28 +24,13 @@ Import('env') es_target = env.get ('TARGET_OS') -es_role = env.get('ES_ROLE') -es_target_enrollee = env.get('ES_TARGET_ENROLLEE') -print "************************************************************************************" -print "Easysetup device role --> %s " % es_role -print "Target Platform --> %s " % es_target -print "Target Enrollee platform --> %s " % es_target_enrollee -print "************************************************************************************" +if es_target in ['linux']: + SConscript('mediator/SConscript') + SConscript('enrollee/SConscript') -#Go to build sample apps -if ('mediator' in es_role) : - print "Building Easysetup mediator SDKs [CSDK & RichSDK]" +if es_target in ['android']: + SConscript('mediator/SConscript') - if es_target in ['linux','android']: - SConscript('mediator/SConscript') - else : - print "****************************Mediator supports Linux and Android platform****************************" - -if ('enrollee' in es_role) : - print "Building Easysetup enrollee SDK" - - if es_target in ['linux', 'arduino', 'tizen']: - SConscript('enrollee/SConscript') - else : - print "****************************Enrollee supports linux, tizen and arduino platform****************************" \ No newline at end of file +if es_target in ['tizen']: + SConscript('enrollee/SConscript') diff --git a/service/easy-setup/enrollee/SConscript b/service/easy-setup/enrollee/SConscript index 31a144f..b353aa8 100644 --- a/service/easy-setup/enrollee/SConscript +++ b/service/easy-setup/enrollee/SConscript @@ -35,14 +35,6 @@ else: if enrollee_env.get('LOGGING'): enrollee_env.AppendUnique(CPPDEFINES = ['TB_LOG']) -# Enrollees are implemented for IP transport only. -if 'IP' in enrollee_env.get('TARGET_TRANSPORT'): - print "Enrollees are implemented for IP transport only" - enrollee_env.AppendUnique(CPPDEFINES = ['ESWIFI']) - -if enrollee_env.get('ES_SOFTAP_MODE') == 'ENROLLEE_SOFTAP': - enrollee_env.AppendUnique(CPPDEFINES = ['ENROLLEE_SOFTAP']) - ###################################################################### # Build flags ###################################################################### @@ -51,16 +43,14 @@ enrollee_env.PrependUnique(CPPPATH = [ enrollee_env.get('SRC_DIR') + '/resource/include', enrollee_env.get('SRC_DIR') + '/resource/csdk/logger/include', enrollee_env.get('SRC_DIR') + '/resource/oc_logger/include', - enrollee_env.get('SRC_DIR') + '/resource/csdk/stack/include', - enrollee_env.get('SRC_DIR') + '/resource/csdk/logger/include', + enrollee_env.get('SRC_DIR') + '/resource/csdk/stack/include', + enrollee_env.get('SRC_DIR') + '/resource/csdk/logger/include', enrollee_env.get('SRC_DIR') + '/resource/csdk/security/include', enrollee_env.get('SRC_DIR') + '/extlibs/cjson', enrollee_env.get('SRC_DIR') + '/extlibs/sqlite3', enrollee_env.get('SRC_DIR') + '/service/easy-setup/inc', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/linux/wifi', enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/inc', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/arduino']) + enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src']) if enrollee_env.get('SECURED') == '1': enrollee_env.AppendUnique(CPPPATH = [ @@ -71,13 +61,14 @@ if enrollee_env.get('SECURED') == '1': if target_os not in ['windows']: enrollee_env.AppendUnique(CXXFLAGS = ['-Wall', '-std=c++0x']) +if not env.get('RELEASE'): + enrollee_env.PrependUnique(LIBS = ['gcov']) + enrollee_env.AppendUnique(CCFLAGS = ['--coverage']) + ###################################################################### # Linux Enrollee ###################################################################### if target_os in ['linux']: - enrollee_env.PrependUnique(CPPPATH = [ - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/linux/wifi']) - enrollee_env.AppendUnique(LIBS = ['pthread', 'dl']) enrollee_env.AppendUnique(LIBPATH = [enrollee_env.get('BUILD_DIR')]) enrollee_env.AppendUnique(RPATH = [enrollee_env.get('BUILD_DIR')]) @@ -90,12 +81,11 @@ if target_os in ['linux']: # Tizen Enrollee ###################################################################### if target_os == 'tizen': - enrollee_env.AppendUnique(LIBPATH = [enrollee_env.get('BUILD_DIR')]) - enrollee_env.AppendUnique(RPATH = [enrollee_env.get('BUILD_DIR')]) - enrollee_env.AppendUnique(CXXFLAGS = ['-pthread']) - enrollee_env.PrependUnique(LIBS = ['oc', 'octbstack', 'oc_logger', 'pthread', 'connectivity_abstraction']) - enrollee_env.AppendUnique(CPPPATH = [ - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/tizen/wifi']) + enrollee_env.AppendUnique(LIBPATH = [enrollee_env.get('BUILD_DIR')]) + enrollee_env.AppendUnique(RPATH = [enrollee_env.get('BUILD_DIR')]) + enrollee_env.AppendUnique(CXXFLAGS = ['-pthread']) + enrollee_env.PrependUnique(LIBS = ['oc', 'octbstack', 'oc_logger', 'pthread', 'connectivity_abstraction']) + enrollee_env.AppendUnique(CPPPATH = [enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/tizen/wifi']) ###################################################################### # Arduino Enrollee @@ -104,50 +94,27 @@ if target_os == 'arduino': enrollee_env.AppendUnique(LIBPATH = [enrollee_env.get('BUILD_DIR')]) enrollee_env.AppendUnique(RPATH = [enrollee_env.get('BUILD_DIR')]) enrollee_env.PrependUnique(LIBS = ['oc', 'octbstack', 'oc_logger', 'pthread', 'connectivity_abstraction']) - enrollee_env.AppendUnique(CPPPATH = [ - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/arduino/wifi']) ###################################################################### # Source files and Targets ###################################################################### es_enrollee_src = None -if target_os in ['linux']: - es_enrollee_common_src = [enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/easysetup.c', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/onboarding.c', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/resourcehandler.c', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/softap.c', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/linux/wifi/softapnative.c', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/linux/wifi/networkhandler.c'] - - enrollee_env.AppendUnique(es_enrollee_src = es_enrollee_common_src) - - enrollee_sdk_shared = enrollee_env.SharedLibrary('ESEnrolleeSDK', enrollee_env.get('es_enrollee_src')) +if target_os in ['linux', 'tizen']: + es_enrollee_common_src = ['./src/easysetup.c','./src/resourcehandler.c'] + enrollee_sdk_shared = enrollee_env.SharedLibrary('ESEnrolleeSDK', es_enrollee_common_src) enrollee_env.InstallTarget(enrollee_sdk_shared, 'libESEnrollee') - -if target_os == 'tizen': - enrollee_sdk_shared = enrollee_env.SharedLibrary('ESEnrolleeSDK', [ - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/easysetup.c', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/onboarding.c', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/softap.c', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/resourcehandler.c', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/tizen/wifi/networkhandler.c', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/tizen/wifi/softapnative.c']) - enrollee_env.InstallTarget(enrollee_sdk_shared, 'libESEnrolleeSDK') - enrollee_env.UserInstallTargetLib(enrollee_sdk_shared, 'libESEnrolleeSDK') + enrollee_env.UserInstallTargetLib(enrollee_sdk_shared, 'libESEnrollee') if target_os == 'arduino': - es_sdk_static = enrollee_env.StaticLibrary('ESEnrolleeSDK', [ - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/arduino/easysetup.cpp', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/arduino/onboarding.cpp', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/arduino/softap.cpp', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/arduino/resourcehandler.cpp', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/arduino/wifi/networkhandler.cpp']) - enrollee_env.InstallTarget(es_sdk_static, 'libESEnrolleeSDK') + es_enrollee_common_src = ['./src/easysetup.c','./src/resourcehandler.c'] + enrollee_sdk_static = enrollee_env.StaticLibrary('ESEnrolleeSDK', es_enrollee_common_src) + enrollee_env.InstallTarget(enrollee_sdk_static, 'libESEnrolleeSDK') + enrollee_env.UserInstallTargetLib(enrollee_sdk_static, 'libESEnrollee') #Go to build sample apps -if target_os == 'arduino': - SConscript('../sampleapp/enrollee/arduino/SConscript') +#if target_os == 'arduino': +# SConscript('../sampleapp/enrollee/arduino/SConscript') if target_os in ['linux']: SConscript('../sampleapp/enrollee/linux/SConscript') diff --git a/service/easy-setup/enrollee/arduino/easysetup.cpp b/service/easy-setup/enrollee/arduino/easysetup.cpp deleted file mode 100644 index b3f0aff..0000000 --- a/service/easy-setup/enrollee/arduino/easysetup.cpp +++ /dev/null @@ -1,207 +0,0 @@ -//****************************************************************** -// -// Copyright 2015 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -/** - * @file - * - * This file contains the implementation for EasySetup Enrollee device - */ - -#include "easysetup.h" -#include "softap.h" -#include "onboarding.h" -#include "logger.h" -#include "resourcehandler.h" - -/** - * @var ES_ENROLLEE_TAG - * @brief Logging tag for module name. - */ -#define ES_ENROLLEE_TAG "ES" - -//----------------------------------------------------------------------------- -// Private variables -//----------------------------------------------------------------------------- - -/** - * @var gTargetSsid - * @brief Target SSID of the Soft Access point to which the device has to connect - */ -static char gTargetSsid[MAXSSIDLEN]; - -/** - * @var gTargetPass - * @brief Password of the target access point to which the device has to connect - */ -static char gTargetPass[MAXNETCREDLEN]; - -/** - * @var gEnrolleeStatusCb - * @brief Fucntion pointer holding the callback for intimation of EasySetup Enrollee status callback - */ -static ESEnrolleeEventCallback gEnrolleeStatusCb = NULL; - -/** - * @var gIsSecured - * @brief Variable to check if secure mode is enabled or not. - */ -static bool gIsSecured = false; - -//----------------------------------------------------------------------------- -// Private internal function prototypes -//----------------------------------------------------------------------------- -void ESOnboardingCallback(ESResult esResult); -void ESProvisioningCallback(ESResult esResult); -void ESOnboardingCallbackTargetNet(ESResult esResult); -static bool ESEnrolleeValidateParam(OCConnectivityType networkType, const char *ssid, - const char *passwd, ESEnrolleeEventCallback cb); - - -void ESOnboardingCallback(ESResult esResult) -{ - OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, "ESOnboardingCallback with result = %d", esResult); - if(esResult == ES_OK) - { - gEnrolleeStatusCb(esResult, ES_ON_BOARDED_STATE); - } - else - { - OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, - "Onboarding is failed callback result is = %d", esResult); - gEnrolleeStatusCb(esResult, ES_INIT_STATE); - } -} - -void ESProvisioningCallback(ESResult esResult) -{ - OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, "ESProvisioningCallback with result = %d", esResult); - - if (esResult == ES_RECVTRIGGEROFPROVRES) - { - GetTargetNetworkInfoFromProvResource(gTargetSsid, gTargetPass); - gEnrolleeStatusCb(ES_OK, ES_PROVISIONED_STATE); - OIC_LOG(DEBUG, ES_ENROLLEE_TAG, "Connecting with target network"); - - // Connecting/onboarding to target network - ConnectToWiFiNetwork(gTargetSsid, gTargetPass, ESOnboardingCallbackTargetNet); - } - else - { - OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, "Provisioning is failed callback result is = %d", esResult); - // Resetting Enrollee to ONBOARDED_STATE as Enrollee is alreday onboarded in previous step - gEnrolleeStatusCb(ES_OK, ES_ON_BOARDED_STATE); - } -} - -void ESOnboardingCallbackTargetNet(ESResult esResult) -{ - OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, "ESOnboardingCallback on target network with result = %d", - esResult); - if(esResult == ES_OK) - { - gEnrolleeStatusCb(esResult, ES_ON_BOARDED_TARGET_NETWORK_STATE); - } - else - { - OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, - "Onboarding is failed on target network and callback result is = %d", esResult); - // Resetting Enrollee state to the ES_PROVISIONED_STATE - // as device is already being provisioned with target network creds. - gEnrolleeStatusCb(esResult, ES_PROVISIONED_STATE); - } -} - -ESResult ESInitEnrollee(OCConnectivityType networkType, const char *ssid, const char *passwd, - bool isSecured, - ESEnrolleeEventCallback cb) -{ - OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESInitEnrollee IN"); - if(!ESEnrolleeValidateParam(networkType,ssid,passwd,cb)) - { - OIC_LOG(ERROR, ES_ENROLLEE_TAG, - "ESInitEnrollee::Stopping Easy setup due to invalid parameters"); - return ES_ERROR; - } - - //Init callback - gEnrolleeStatusCb = cb; - - gIsSecured = isSecured; - - // TODO : This onboarding state has to be set by lower layer, as they better - // knows when actually on-boarding started. - cb(ES_ERROR,ES_ON_BOARDING_STATE); - - OIC_LOG(INFO, ES_ENROLLEE_TAG, "received callback"); - OIC_LOG(INFO, ES_ENROLLEE_TAG, "onboarding now.."); - - if(!ESOnboard(ssid, passwd, ESOnboardingCallback)) - { - OIC_LOG(ERROR, ES_ENROLLEE_TAG, "ESInitEnrollee::On-boarding failed"); - cb(ES_ERROR, ES_INIT_STATE); - return ES_ERROR; - } - - OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESInitEnrollee OUT"); - return ES_OK; -} - -ESResult ESTerminateEnrollee() -{ - UnRegisterResourceEventCallBack(); - - //Delete Prov resource - if (DeleteProvisioningResource() != OC_STACK_OK) - { - OIC_LOG(ERROR, ES_ENROLLEE_TAG, "Deleting prov resource error!!"); - return ES_ERROR; - } - - OIC_LOG(ERROR, ES_ENROLLEE_TAG, "ESTerminateEnrollee success"); - return ES_OK; -} - -ESResult ESInitProvisioning() -{ - OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESInitProvisioning <>"); - - if (CreateProvisioningResource(gIsSecured) != OC_STACK_OK) - { - OIC_LOG(ERROR, ES_ENROLLEE_TAG, "CreateProvisioningResource error"); - return ES_ERROR; - } - - RegisterResourceEventCallBack(ESProvisioningCallback); - - OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESInitProvisioning <>"); - return ES_RESOURCECREATED; -} - -static bool ESEnrolleeValidateParam(OCConnectivityType /*networkType*/, const char *ssid, - const char *passwd, ESEnrolleeEventCallback cb) -{ - if (!ssid || !passwd || !cb) - { - OIC_LOG(ERROR, ES_ENROLLEE_TAG, "ESEnrolleeValidateParam - Invalid parameters"); - return false; - } - return true; -} - diff --git a/service/easy-setup/enrollee/arduino/onboarding.cpp b/service/easy-setup/enrollee/arduino/onboarding.cpp deleted file mode 100644 index aaf1509..0000000 --- a/service/easy-setup/enrollee/arduino/onboarding.cpp +++ /dev/null @@ -1,86 +0,0 @@ -//****************************************************************** -// -// Copyright 2015 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -/** - * @file - * - * This file has methods for on-boarding the Enrollee device. - * This will contain template methods that will have core business logic & negotiation algorithm - * on various on-boarding methods. - */ - -#include "easysetup.h" -#include "softap.h" -#include "onboarding.h" - -#include "logger.h" -#include "resourcehandler.h" - -/** - * @var ES_ENROLLEE_TAG - * @brief Logging tag for module name. - */ -#define ES_ENROLLEE_TAG "ES_SOFTAP" - -/** - * It will return true on-boarding type is soft AP - */ -bool ESSoftapOnboarding() -{ - // TODO: To be changed based on user config. Current version, hardcoded to SoftAp onboarding - return true; -} - -/** - * It will return true on-boarding type is BLE - */ -bool ESBleOnboarding() -{ - //BLE onboarding is not supported with current version. - return false; -} - -/** - * It will do onboarding based on the user's configuration. - */ -bool ESOnboard(const char * ssid, const char* passwd, ESEnrolleeNetworkEventCallback cb) -{ - OIC_LOG(DEBUG, ES_ENROLLEE_TAG, "ESOnboard IN"); - - if (ESSoftapOnboarding()) - { - OIC_LOG(DEBUG, ES_ENROLLEE_TAG, "Connecting to Mediator SoftAp"); - ConnectToWiFiNetwork(ssid, passwd, cb); - return true; - } - else if (ESBleOnboarding()) - { - OIC_LOG(ERROR, ES_ENROLLEE_TAG, "ESOnboard::Ble onboarding is not supported"); - // TODO: - return false; - } - else - { - // TODO: - OIC_LOG(ERROR, ES_ENROLLEE_TAG, "ESOnboard::Invalid onboarding option"); - return false; - } -} - diff --git a/service/easy-setup/enrollee/arduino/resourcehandler.cpp b/service/easy-setup/enrollee/arduino/resourcehandler.cpp deleted file mode 100755 index 0d32276..0000000 --- a/service/easy-setup/enrollee/arduino/resourcehandler.cpp +++ /dev/null @@ -1,392 +0,0 @@ -//****************************************************************** -// -// Copyright 2015 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -#include "resourcehandler.h" - -#include - -#include "ocpayload.h" -#include "oic_string.h" - -/** - * @var ES_RH_TAG - * @brief Logging tag for module name. - */ -#define ES_RH_TAG "ES_RH" -//----------------------------------------------------------------------------- -// Private variables -//----------------------------------------------------------------------------- - -/** - * @var gProvResource - * @brief Structure for holding the Provisioning status and target information required to - * connect to the target network - */ -static ProvResource gProvResource; - -/** - * @var gNetResource - * @brief Structure forr holding the Provisioning status of network information - */ -static NetResource gNetResource; - -//----------------------------------------------------------------------------- -// Private internal function prototypes -//----------------------------------------------------------------------------- -OCEntityHandlerResult OCEntityHandlerCb(OCEntityHandlerFlag flag, OCEntityHandlerRequest *ehRequest, - void *callback); -const char *getResult(OCStackResult result); -OCEntityHandlerResult ProcessGetRequest(OCEntityHandlerRequest *ehRequest, OCRepPayload** payload); -OCEntityHandlerResult ProcessPutRequest(OCEntityHandlerRequest *ehRequest, OCRepPayload** payload); -OCEntityHandlerResult ProcessPostRequest(OCEntityHandlerRequest *ehRequest, OCRepPayload** payload); -OCRepPayload* constructResponse(OCEntityHandlerRequest *ehRequest); - -ESEnrolleeResourceEventCallback gNetworkInfoProvEventCb = NULL; - -void RegisterResourceEventCallBack(ESEnrolleeResourceEventCallback cb) -{ - gNetworkInfoProvEventCb = cb; -} - -void UnRegisterResourceEventCallBack() -{ - if (gNetworkInfoProvEventCb) - { - gNetworkInfoProvEventCb = NULL; - } -} - -void GetTargetNetworkInfoFromProvResource(char *name, char *pass) -{ - if (name != NULL && pass != NULL) - { - OICStrcpy(name, MAXSSIDLEN, gProvResource.tnn); - OICStrcpy(pass, MAXNETCREDLEN, gProvResource.cd); - } -} - -OCStackResult CreateProvisioningResource(bool isSecured) -{ - gProvResource.ps = ES_PS_NEED_PROVISIONING; - gProvResource.tr = ES_PS_TRIGGER_INIT_VALUE; - - gProvResource.tnt = CT_ADAPTER_IP; - OICStrcpy(gProvResource.tnn, sizeof(gProvResource.tnn), "Unknown"); - OICStrcpy(gProvResource.cd, sizeof(gProvResource.cd), "Unknown"); - - OCStackResult res = OC_STACK_ERROR; - if (isSecured) - { - res = OCCreateResource(&gProvResource.handle, OC_RSRVD_ES_PROV_RES_TYPE, - OC_RSRVD_INTERFACE_DEFAULT, - OC_RSRVD_ES_URI_PROV, OCEntityHandlerCb, - NULL, OC_DISCOVERABLE | OC_OBSERVABLE | OC_SECURE); - } - else - { - res = OCCreateResource(&gProvResource.handle, OC_RSRVD_ES_PROV_RES_TYPE, - OC_RSRVD_INTERFACE_DEFAULT, - OC_RSRVD_ES_URI_PROV, OCEntityHandlerCb, - NULL, OC_DISCOVERABLE | OC_OBSERVABLE); - } - - OIC_LOG_V(INFO, ES_RH_TAG, "Created Prov resource with result: %s", getResult(res)); - return res; -} - -OCStackResult DeleteProvisioningResource() -{ - OCStackResult res = OCDeleteResource(gProvResource.handle); - if (res != OC_STACK_OK) - { - OIC_LOG_V(INFO, ES_RH_TAG, "Deleting Prov resource error with result: %s", getResult(res)); - } - - return res; -} - -OCEntityHandlerResult ProcessGetRequest(OCEntityHandlerRequest *ehRequest, OCRepPayload **payload) -{ - OCEntityHandlerResult ehResult = OC_EH_ERROR; - if (!ehRequest) - { - OIC_LOG(ERROR, ES_RH_TAG, "Request is Null"); - return ehResult; - } - if (ehRequest->payload && ehRequest->payload->type != PAYLOAD_TYPE_REPRESENTATION) - { - OIC_LOG(ERROR, ES_RH_TAG, "Incoming payload not a representation"); - return ehResult; - } - - OCRepPayload *getResp = constructResponse(ehRequest); - if (!getResp) - { - OIC_LOG(ERROR, ES_RH_TAG, "constructResponse failed"); - return OC_EH_ERROR; - } - - *payload = getResp; - ehResult = OC_EH_OK; - - return ehResult; -} - -OCEntityHandlerResult ProcessPostRequest(OCEntityHandlerRequest *ehRequest, OCRepPayload** payload) -{ - OIC_LOG(INFO, ES_RH_TAG, "ProcessPostRequest enter"); - OCEntityHandlerResult ehResult = OC_EH_ERROR; - if (ehRequest->payload && ehRequest->payload->type != PAYLOAD_TYPE_REPRESENTATION) - { - OIC_LOG(ERROR, ES_RH_TAG, "Incoming payload not a representation"); - return ehResult; - } - - OCRepPayload* input = (OCRepPayload*) (ehRequest->payload); - if (!input) - { - OIC_LOG(ERROR, ES_RH_TAG, "Failed to parse"); - return ehResult; - } - - char* tnn; - if (OCRepPayloadGetPropString(input, OC_RSRVD_ES_TNN, &tnn)) - { - OICStrcpy(gProvResource.tnn, sizeof(gProvResource.tnn), tnn); - OIC_LOG_V(INFO, ES_RH_TAG, "gProvResource.tnn %s", gProvResource.tnn); - - gProvResource.ps = ES_PS_PROVISIONING_COMPLETED; - } - - char* cd; - if (OCRepPayloadGetPropString(input, OC_RSRVD_ES_CD, &cd)) - { - OICStrcpy(gProvResource.cd, sizeof(gProvResource.cd), cd); - OIC_LOG_V(INFO, ES_RH_TAG, "gProvResource.cd %s", gProvResource.cd); - } - - OIC_LOG_V(INFO, ES_RH_TAG, "gProvResource.ps %lld", gProvResource.ps); - - int64_t tr; - if (OCRepPayloadGetPropInt(input, OC_RSRVD_ES_TR, &tr)) - { - // Triggering - gProvResource.tr = tr; - } - - //ES_PS_PROVISIONING_COMPLETED state indicates that already provisioning is completed. - // A new request for provisioning means overriding existing network provisioning information. - if (gProvResource.ps == ES_PS_PROVISIONING_COMPLETED && tr == ES_PS_TRIGGER_CONNECTION) - { - OIC_LOG(DEBUG, ES_RH_TAG, "Provisioning already completed." - "Tiggering the network connection"); - - if (gNetworkInfoProvEventCb) - { - gNetworkInfoProvEventCb(ES_RECVTRIGGEROFPROVRES); - ehResult = OC_EH_OK; - } - else - { - gProvResource.tr = ES_PS_TRIGGER_INIT_VALUE; - OIC_LOG(ERROR, ES_RH_TAG, "gNetworkInfoProvEventCb is NULL." - "Network handler not registered. Failed to connect to the network"); - ehResult = OC_EH_ERROR; - } - - return ehResult; - } - else if (gProvResource.ps == ES_PS_PROVISIONING_COMPLETED) - { - OIC_LOG(DEBUG, ES_RH_TAG, "Provisioning already completed. " - "This a request to override the existing the network provisioning information"); - } - else - { - OIC_LOG(DEBUG, ES_RH_TAG, "Provisioning the network information to the Enrollee."); - } - - OCRepPayload *getResp = constructResponse(ehRequest); - if (!getResp) - { - OIC_LOG(ERROR, ES_RH_TAG, "constructResponse failed"); - return OC_EH_ERROR; - } - - *payload = getResp; - ehResult = OC_EH_OK; - - return ehResult; -} - -OCEntityHandlerResult ProcessPutRequest(OCEntityHandlerRequest * /*ehRequest*/, - OCRepPayload** /*payload*/) -{ - OCEntityHandlerResult ehResult = OC_EH_ERROR; - - return ehResult; -} - -OCRepPayload* constructResponse(OCEntityHandlerRequest *ehRequest) -{ - OCRepPayload* payload = OCRepPayloadCreate(); - if (!payload) - { - OIC_LOG(ERROR, ES_RH_TAG, "Failed to allocate Payload"); - return NULL; - } - - if (ehRequest->resource == gProvResource.handle) - { - OIC_LOG(INFO, ES_RH_TAG, "constructResponse prov res"); - OCRepPayloadSetUri(payload, OC_RSRVD_ES_URI_PROV); - OCRepPayloadSetPropInt(payload, OC_RSRVD_ES_PS, gProvResource.ps); - OCRepPayloadSetPropInt(payload, OC_RSRVD_ES_TNT, gProvResource.tnt); - } - else if (ehRequest->requestHandle == gNetResource.handle) - { - - OCRepPayloadSetUri(payload, OC_RSRVD_ES_URI_NET); - OCRepPayloadSetPropInt(payload, "ant", gNetResource.ant[0]); - } - return payload; -} - -/** - * This is the entity handler for the registered resource. - * This is invoked by OCStack whenever it recevies a request for this resource. - */ -OCEntityHandlerResult OCEntityHandlerCb(OCEntityHandlerFlag flag, - OCEntityHandlerRequest* entityHandlerRequest, void *callback) -{ - (void) callback; - OCEntityHandlerResult ehRet = OC_EH_OK; - OCEntityHandlerResponse response = - { 0, 0, OC_EH_ERROR, 0, 0, - { }, - { 0 }, false }; - OCRepPayload* payload = NULL; - - if (entityHandlerRequest && (flag & OC_REQUEST_FLAG)) - { - if (OC_REST_GET == entityHandlerRequest->method) - { - OIC_LOG(INFO, ES_RH_TAG, "Received GET request"); - ehRet = ProcessGetRequest(entityHandlerRequest, &payload); - } - else if (OC_REST_PUT == entityHandlerRequest->method) - { - OIC_LOG(INFO, ES_RH_TAG, "Received PUT request"); - - //PUT request will be handled in the internal implementation - if (gProvResource.handle != NULL - && entityHandlerRequest->resource == gProvResource.handle) - { - ehRet = ProcessPutRequest(entityHandlerRequest, &payload); - } - else - { - OIC_LOG(ERROR, ES_RH_TAG, "Cannot process put"); - ehRet = OC_EH_ERROR; - } - } - else if (OC_REST_POST == entityHandlerRequest->method) - { - OIC_LOG(INFO, ES_RH_TAG, "Received OC_REST_POST from client"); - if (gProvResource.handle != NULL - && entityHandlerRequest->resource == gProvResource.handle) - { - ehRet = ProcessPostRequest(entityHandlerRequest, &payload); - } - else - { - OIC_LOG(ERROR, ES_RH_TAG, "Cannot process put"); - ehRet = OC_EH_ERROR; - } - } - - if (ehRet == OC_EH_OK) - { - // Format the response. Note this requires some info about the request - response.requestHandle = entityHandlerRequest->requestHandle; - response.resourceHandle = entityHandlerRequest->resource; - response.ehResult = ehRet; - //response uses OCPaylod while all get,put methodes use OCRepPayload - response.payload = (OCPayload*) (payload); - response.numSendVendorSpecificHeaderOptions = 0; - memset(response.sendVendorSpecificHeaderOptions, 0, - sizeof(response.sendVendorSpecificHeaderOptions)); - memset(response.resourceUri, 0, sizeof(response.resourceUri)); - // Indicate that response is NOT in a persistent buffer - response.persistentBufferFlag = 0; - - // Send the response - if (OCDoResponse(&response) != OC_STACK_OK) - { - OIC_LOG(ERROR, ES_RH_TAG, "Error sending response"); - ehRet = OC_EH_ERROR; - } - } - } - - return ehRet; -} - -const char *getResult(OCStackResult result) -{ - switch (result) - { - case OC_STACK_OK: - return "OC_STACK_OK"; - case OC_STACK_INVALID_URI: - return "OC_STACK_INVALID_URI"; - case OC_STACK_INVALID_QUERY: - return "OC_STACK_INVALID_QUERY"; - case OC_STACK_INVALID_IP: - return "OC_STACK_INVALID_IP"; - case OC_STACK_INVALID_PORT: - return "OC_STACK_INVALID_PORT"; - case OC_STACK_INVALID_CALLBACK: - return "OC_STACK_INVALID_CALLBACK"; - case OC_STACK_INVALID_METHOD: - return "OC_STACK_INVALID_METHOD"; - case OC_STACK_NO_MEMORY: - return "OC_STACK_NO_MEMORY"; - case OC_STACK_COMM_ERROR: - return "OC_STACK_COMM_ERROR"; - case OC_STACK_INVALID_PARAM: - return "OC_STACK_INVALID_PARAM"; - case OC_STACK_NOTIMPL: - return "OC_STACK_NOTIMPL"; - case OC_STACK_NO_RESOURCE: - return "OC_STACK_NO_RESOURCE"; - case OC_STACK_RESOURCE_ERROR: - return "OC_STACK_RESOURCE_ERROR"; - case OC_STACK_SLOW_RESOURCE: - return "OC_STACK_SLOW_RESOURCE"; - case OC_STACK_NO_OBSERVERS: - return "OC_STACK_NO_OBSERVERS"; - case OC_STACK_ERROR: - return "OC_STACK_ERROR"; - default: - return "UNKNOWN"; - } -} - diff --git a/service/easy-setup/enrollee/arduino/softap.cpp b/service/easy-setup/enrollee/arduino/softap.cpp deleted file mode 100644 index 4199e9a..0000000 --- a/service/easy-setup/enrollee/arduino/softap.cpp +++ /dev/null @@ -1,89 +0,0 @@ -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -/** - * These are adapter APIs will make caller modules agnostic to platform. - */ - -#include "softapnative.h" -#include "easysetup.h" -#include "softap.h" -#include "networkhandler.h" - -void ESCreateSoftapCallback(int result, const char *ip, const char* mac_addr, - const char* device_name ); - -ESEnrolleeNetworkEventCallback gCallback; - -/** - * It will return Device which is creating Soft AP. - * i.e.Enrollee or Mediator. - * This decesion is based on, what is the value set for ES_SOFTAP_MODE in build command as well as - * in iotivity.spec file. - */ -DeviceRole ESSoftapHost() -{ -#ifdef ENROLLEE_SOFTAP - //SoftAp at enrollee - return ENROLLEE; -#else - //SoftAp at mediator - return MEDIATOR; -#endif -} - -/** - * It will return true if the Soft AP is created at Enrollee device - */ -bool ESSoftapAtEnrollee() -{ - return ( ESSoftapHost() == ENROLLEE) ? true : false; -} - -/** - * It will return true if the Soft AP is created at Mediator device - */ -bool ESSoftapAtMediator() -{ - return (ESSoftapHost() == MEDIATOR) ? true : false; -} - -/** - * This API will map result returned from the native to the caller. - * Callback API's signature needs to be modified under build switch according - * to the underline platform. - */ -void ESCreateSoftapCallback(int result, const char *ip, const char* mac_addr, - const char* device_name) -{ - if(SOFTAP_SUCCESS == result) //on Success - { - gCallback(ES_OK); - } - else //on Failure - { - gCallback(ES_ERROR); - } -} - -/** - * This API will create the softap at enrollee - */ -void ESCreateSoftap(const char * ssid, const char* passwd, ESEnrolleeNetworkEventCallback cb) -{ - gCallback = cb; - - // TODO: To be implemented - // Create Soft AP through native APIs -- start - // native API call by and pass ESCreateSoftapCallback() as callback - ESCreateSoftapNative(ssid, passwd,ESCreateSoftapCallback); - // Create Soft AP through native APIs -- end -} - diff --git a/service/easy-setup/enrollee/arduino/wifi/networkhandler.cpp b/service/easy-setup/enrollee/arduino/wifi/networkhandler.cpp deleted file mode 100644 index fae1fd5..0000000 --- a/service/easy-setup/enrollee/arduino/wifi/networkhandler.cpp +++ /dev/null @@ -1,249 +0,0 @@ -//****************************************************************** -// -// Copyright 2015 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -#include "networkhandler.h" - -// Arduino WiFi Shield includes -#include -#include -#include - -#include - -#include "logger.h" - -/** - * @var ES_NH_TAG - * @brief Logging tag for module name. - */ -#define ES_NH_TAG "ES_NH" - -//----------------------------------------------------------------------------- -// Defines -//----------------------------------------------------------------------------- -/** - * ES_MAX_NETWORK_RETRY sets the default number of retry count for network connection. - */ -#define ES_MAX_NETWORK_RETRY (5) - -//----------------------------------------------------------------------------- -// Private variables -//----------------------------------------------------------------------------- -static IPAddress enrolleeIP; - -/** - * @var g_retryCounter - * @brief Retry counter for cancelling network retry. Currently network retry is - * limited to 5 attempts - */ -static uint16_t g_retryCounter = 0; - - - -//----------------------------------------------------------------------------- -// Private internal function prototypes -//----------------------------------------------------------------------------- -int findNetwork(const char *ssid); -int ConnectToNetwork(const char *ssid, const char *pass); -void printEncryptionType(int thisType); - -// Arduino WiFi Shield -// Note : Arduino WiFi Shield currently does NOT support multicast and therefore -// this server will NOT be listening on 224.0.1.187 multicast address. -static const char ARDUINO_WIFI_SHIELD_UDP_FW_VER[] = "1.1.0"; - -ESResult ConnectToWiFiNetwork(const char *ssid, const char *pass, - ESEnrolleeNetworkEventCallback cb) -{ - char *fwVersion; - int status = WL_IDLE_STATUS; - int res; - - // check for the presence of the shield: - if (WiFi.status() == WL_NO_SHIELD) - { - OIC_LOG(ERROR, ES_NH_TAG, "WiFi shield not present"); - return ES_ERROR; - } - - // Verify that WiFi Shield is running the firmware with all UDP fixes - fwVersion = WiFi.firmwareVersion(); - OIC_LOG_V(INFO, ES_NH_TAG, "WiFi Shield Firmware version %s", fwVersion); - if (strncmp(fwVersion, ARDUINO_WIFI_SHIELD_UDP_FW_VER, sizeof(ARDUINO_WIFI_SHIELD_UDP_FW_VER)) - != 0) - { - OIC_LOG(DEBUG, ES_NH_TAG, "!!!!! Upgrade WiFi Shield Firmware version !!!!!!"); - return ES_ERROR; - } - - //Retry counter is reset everytime the ConnectToWiFiNetwork is invoked - g_retryCounter = 0; - - OIC_LOG_V(INFO, ES_NH_TAG, "Finding SSID: %s", ssid); - - while ((findNetwork(ssid) == 0) && g_retryCounter < ES_MAX_NETWORK_RETRY) // found - { - delay(1000); - g_retryCounter++; - } - - if(g_retryCounter == ES_MAX_NETWORK_RETRY){ - OIC_LOG_V(ERROR, ES_NH_TAG, "Connection to network failed after %d attempts", - g_retryCounter); - return ES_ERROR; - } - - if (cb != NULL) - { - cb(ES_OK); - } - - if (WiFi.status() == WL_CONNECTED) - WiFi.disconnect(); - - //Retry counter is reset everytime the ConnectToWiFiNetwork is invoked - g_retryCounter = 0; - - res = ConnectToNetwork(ssid, pass); - - if (res == 0) - { - return ES_NETWORKCONNECTED; - } - else - { - return ES_NETWORKNOTCONNECTED; - } -} - -int findNetwork(const char *ssid) -{ - int res = 0; - // scan for nearby networks: - Serial.println("** Scan Networks **"); - int numSsid = WiFi.scanNetworks(); - if (numSsid == -1) - { - Serial.println("Couldn't get a wifi connection"); - - return res; - } - - // print the list of networks seen: - Serial.print("number of available networks:"); - Serial.println(numSsid); - - // print the network number and name for each network found: - for (int thisNet = 0; thisNet < numSsid; thisNet++) - { - Serial.print(thisNet); - Serial.print(") "); - Serial.print(WiFi.SSID(thisNet)); - Serial.print("\tEncryption: "); - printEncryptionType(WiFi.encryptionType(thisNet)); - - if (strcmp(WiFi.SSID(thisNet), ssid) == 0) - { - res = 1; - } - } - - return res; -} - -int ConnectToNetwork(const char *ssid, const char *pass) -{ - int status = WL_IDLE_STATUS; - - // attempt to connect to Wifi network: - while (status != WL_CONNECTED && g_retryCounter < ES_MAX_NETWORK_RETRY) - { - OIC_LOG_V(INFO, ES_NH_TAG, "Attempting to connect to SSID: %s", ssid); - - status = WiFi.begin((char *) ssid, (char *) pass); - - // wait 10 seconds for connection: - delay(10000); - - g_retryCounter++; - } - - if(g_retryCounter == ES_MAX_NETWORK_RETRY){ - OIC_LOG_V(ERROR, ES_NH_TAG, "Connection to network failed after %d attempts", - g_retryCounter); - return ES_ERROR; - } - - OIC_LOG(DEBUG, ES_NH_TAG, "Connected to wifi"); - - enrolleeIP = WiFi.localIP(); - OIC_LOG_V(INFO, ES_NH_TAG, "IP Address: %d.%d.%d.%d", enrolleeIP[0], enrolleeIP[1], - enrolleeIP[2], enrolleeIP[3]); - - char buf[50]; - sprintf(buf, "IP Address: %d.%d.%d.%d", enrolleeIP[0], enrolleeIP[1], - enrolleeIP[2], enrolleeIP[3]); - Serial.println(buf); - - return 0; -} - -ESResult getCurrentNetworkInfo(OCConnectivityType targetType, NetworkInfo *info) -{ - if (targetType == CT_ADAPTER_IP && WiFi.status() == WL_CONNECTED) - { - info->type = CT_ADAPTER_IP; - info->ipaddr = WiFi.localIP(); - if((sizeof(info->ssid) >= MAXSSIDLEN) && (strlen(WiFi.SSID()) <= MAXSSIDLEN)) - { - strcpy(info->ssid, WiFi.SSID()); - return ES_OK; - } - else - { - return ES_ERROR; - } - } - - return ES_ERROR; -} - -void printEncryptionType(int thisType) -{ - // read the encryption type and print out the name: - switch (thisType) - { - case ENC_TYPE_WEP: - Serial.println("WEP"); - break; - case ENC_TYPE_TKIP: - Serial.println("WPA"); - break; - case ENC_TYPE_CCMP: - Serial.println("WPA2"); - break; - case ENC_TYPE_NONE: - Serial.println("None"); - break; - case ENC_TYPE_AUTO: - Serial.println("Auto"); - break; - } -} diff --git a/service/easy-setup/enrollee/arduino/wifi/networkhandler.h b/service/easy-setup/enrollee/arduino/wifi/networkhandler.h deleted file mode 100644 index f1503e1..0000000 --- a/service/easy-setup/enrollee/arduino/wifi/networkhandler.h +++ /dev/null @@ -1,68 +0,0 @@ -//****************************************************************** -// -// Copyright 2015 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -/** - * @file - * - * This file contains IP network handling functionality for Enrollee device - */ - -#ifndef ES_NETWORK_HANDLER_H_ -#define ES_NETWORK_HANDLER_H_ - -// Do not remove the include below -#include "Arduino.h" - -// Arduino WiFi Shield includes -#include -#include -#include - -#include -#include "logger.h" -#include "escommon.h" - -#define MAXSSIDLEN 33 -#define MAXNETCREDLEN 20 -#define MAXNUMTYPE 5 -#define MAXADDRLEN 15 - -/* - * Callback function for updating the Network status to the subscribers - * - * @param esResult ESResult provides the current state of the network connection status - */ -typedef void (*ESEnrolleeNetworkEventCallback)(ESResult esResult); - -typedef struct -{ - OCConnectivityType type; - // for WiFI - IPAddress ipaddr; - char ssid[MAXSSIDLEN]; - // for BT, BLE - byte mac[6]; -} NetworkInfo; - -ESResult ConnectToWiFiNetwork(const char *ssid, const char *pass, - ESEnrolleeNetworkEventCallback); -ESResult getCurrentNetworkInfo(OCConnectivityType targetType, NetworkInfo *info); - -#endif diff --git a/service/easy-setup/enrollee/inc/ESEnrolleeCommon.h b/service/easy-setup/enrollee/inc/ESEnrolleeCommon.h new file mode 100755 index 0000000..911d44b --- /dev/null +++ b/service/easy-setup/enrollee/inc/ESEnrolleeCommon.h @@ -0,0 +1,105 @@ +//****************************************************************** +// +// Copyright 2016 Samsung Electronics All Rights Reserved. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +#ifndef ES_ENROLLEE_COMMON_H_ +#define ES_ENROLLEE_COMMON_H_ + +#include "ocstack.h" +#include "octypes.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @brief Data structure delivered from mediator, which provides WiFi information + */ +typedef struct +{ + char ssid[MAX_SSIDLEN]; /**< Ssid of the Enroller**/ + char pwd[MAX_CREDLEN]; /**< Pwd of the Enroller**/ + WIFI_AUTHTYPE authtype; /**< Auth type of the Enroller**/ + WIFI_ENCTYPE enctype; /**< Encryption type of the Enroller**/ + void *userdata; /**< Vender-specific data**/ +} ESWiFiProvData; + +/** + * @brief Data structure delivered from mediator, which provides device configuration information + */ +typedef struct +{ + char language[OIC_STRING_MAX_VALUE]; /**< IETF language tag using ISO 639X **/ + char country[OIC_STRING_MAX_VALUE]; /**< ISO Country Code (ISO 3166-1 Alpha-2) **/ + void *userdata; /**< Vender-specific data**/ +} ESDevConfProvData; + +/** + * @brief Data structure delivered from mediator, which provides Cloud server information + */ +typedef struct +{ + char authCode[OIC_STRING_MAX_VALUE]; /**< Auth code issued by OAuth2.0-compatible account server **/ + char authProvider[OIC_STRING_MAX_VALUE]; /**< Auth provider ID **/ + char ciServer[OIC_STRING_MAX_VALUE]; /**< Cloud interface server URL which an Enrollee is going to registered **/ + void *userdata; /**< Vender-specific data**/ +} ESCloudProvData; + +/** + * @brief Data structure stored for Device property which includes a WiFi and device configuration. + */ +typedef struct +{ + /** + * @brief Data structure indicating WiFi configuration of Enrollee + */ + struct + { + WIFI_MODE mode[NUM_WIFIMODE]; + WIFI_FREQ freq; + } WiFi; + + /** + * @brief Data structure indicating device configuration of Enrollee + */ + struct + { + char deviceName[MAX_DEVICELEN]; + } DevConf; +} ESDeviceProperty; + +/** + * A set of functions pointers for callback functions which are called after provisioning data is + * received from Mediator. + */ +typedef struct +{ + void (*WiFiProvCb) (ESWiFiProvData *); + void (*DevConfProvCb) (ESDevConfProvData *); + void (*CloudDataProvCb) (ESCloudProvData *); +} ESProvisioningCallbacks; + + +#ifdef __cplusplus +} +#endif + +#endif //ES_ENROLLEE_COMMON_H_ + diff --git a/service/easy-setup/enrollee/inc/easysetup.h b/service/easy-setup/enrollee/inc/easysetup.h index 00102a9..5c993cc 100755 --- a/service/easy-setup/enrollee/inc/easysetup.h +++ b/service/easy-setup/enrollee/inc/easysetup.h @@ -23,6 +23,7 @@ #define EASYSETUP_ENROLLEE_H__ #include "escommon.h" +#include "ESEnrolleeCommon.h" /** * @file @@ -34,35 +35,72 @@ extern "C" { #endif // __cplusplus -/* - * Callback function for updating the Enrollee OnBoarding and Provisioning status result - * to the application - * - * @param esResult ESResult provides the current state of the Enrollee Device +/** + * A function pointer for registering a user-defined function to set user-specific properties to a + * response going back to a client. + * @param payload Represents a response. You can set a specific value with specific property key + * to the payload. If a client receives the response and know the property key, then it can + * extract the value. + * @param resourceType Used to distinguish which resource the received property belongs to. + */ +typedef void (*ESWriteUserdataCb)(OCRepPayload* payload, char* resourceType); + +/** + * A function pointer for registering a user-defined function to parse user-specific properties from + * received POST request. + * @param payload Represents a received POST request. If you know user-specific property key, + * then you can extract a corresponding value if it exists. + * @param resourceType Used to distinguish which resource the received property belongs to + * @param userdata User-specific data you want to deliver to desired users, i.e. application. + * The user should know a data structure of passed userdata. */ -typedef void (*ESEnrolleeEventCallback)(ESResult esResult, ESEnrolleeState enrolleeState); +typedef void (*ESReadUserdataCb)(OCRepPayload* payload, char* resourceType, void** userdata); /** * This function Initializes the EasySetup. This API must be called prior to invoking any other API * - * @param networkType NetworkType on which OnBoarding has to be performed. - * @param ssid SSID of the target SoftAP network to which the Enrollee is connecting. - * @param passwd Password of the target SoftAP network to which the Enrollee is - * connecting * @param isSecured True if the Enrollee is operating in secured mode. - * @param eventCallback ESEnrolleeEventCallback for for updating the Enrollee OnBoarding status - * result to the application + * @param resourceMask Provisining Resource Type which application wants to make. + * ES_WIFI_RESOURCE = 0x01, + * ES_CLOUD_RESOURCE = 0x02, + * ES_DEVCONF_RESOURCE = 0x04 + * @param callbacks ESProvisioningCallbacks for updating Provisioning Resources' data to the application * @return ::ES_OK on success, some other value upon failure. */ -ESResult ESInitEnrollee(OCConnectivityType networkType, const char *ssid, const char *passwd, - bool isSecured, ESEnrolleeEventCallback eventCallback); +ESResult ESInitEnrollee(bool isSecured, ESResourceMask resourceMask, ESProvisioningCallbacks callbacks); + /** - * This function performs initialization of Provisioning and Network resources needed for EasySetup - * process. + * This function Sets Device Information. + * + * @param deviceProperty Contains device information composed of WiFi Structure & DevConf Structure * @return ::ES_OK on success, some other value upon failure. + * + * @see ESDeviceProperty */ -ESResult ESInitProvisioning(); +ESResult ESSetDeviceProperty(ESDeviceProperty *deviceProperty); + + +/** + * This function Sets Enrollee's State. + * + * @param esState Contains current enrollee's state. + * @return ::ES_OK on success, some other value upon failure. + * + * @see ESEnrolleeState + */ +ESResult ESSetState(ESEnrolleeState esState); + + +/** + * This function Sets Enrollee's Error Code. + * + * @param esErrCode Contains enrollee's error code. + * @return ::ES_OK on success, some other value upon failure. + * + * @see ESErrorCode + */ +ESResult ESSetErrorCode(ESErrorCode esErrCode); /** * This function performs termination of Provisioning and Network resources. @@ -72,6 +110,22 @@ ESResult ESInitProvisioning(); */ ESResult ESTerminateEnrollee(); +/** + * This function is to set two function pointer to handle user-specific properties in in-comming + * POST request and to out-going response for GET or POST request. + * If you register certain functions with this API, you have to handle OCRepPayload structure to + * set and get properties you want. + * + * @param readCb a callback for parsing properties from POST request + * @param writeCb a callback for putting properties to a response to be sent + * + * @return ::ES_OK on success, some other value upon failure. + * + * @see ESReadUserdataCb + * @see ESWriteUserdataCb + */ +ESResult ESSetCallbackForUserdata(ESReadUserdataCb readCb, ESWriteUserdataCb writeCb); + #ifdef __cplusplus } #endif // __cplusplus diff --git a/service/easy-setup/enrollee/linux/wifi/networkhandler.c b/service/easy-setup/enrollee/linux/wifi/networkhandler.c deleted file mode 100644 index 24b7dea..0000000 --- a/service/easy-setup/enrollee/linux/wifi/networkhandler.c +++ /dev/null @@ -1,80 +0,0 @@ -/****************************************************************** - * - * Copyright 2015 Samsung Electronics All Rights Reserved. - * - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************/ - -#include "networkhandler.h" - -#include - -#include "logger.h" -#include "easysetup.h" -#include "oic_string.h" - -#define LOG_TAG "LINUX ES" - -const char *gSsid = "DLNA_LISMORE1"; -const char *gPass = "dlna@010203"; -char *gIpAddress; -ESEnrolleeNetworkEventCallback gNetworkEventCb; - -/* - * All the functions defined in this file are stub functions to be implemented by the end user of - * Easysetup Enrollee applications. - */ -static void ESActivateWifi() -{ - -} - -static void start() -{ - OIC_LOG(INFO, LOG_TAG, "START"); - ESActivateWifi(); -} - -void ConnectToWiFiNetwork(const char *ssid, const char *pass, - ESEnrolleeNetworkEventCallback cb) -{ - OIC_LOG_V(INFO, LOG_TAG, "ConnectToWiFiNetwork %s %s",ssid,pass); - gPass = pass; - gSsid = ssid; - gNetworkEventCb = cb; - start(); -} - -ESResult getCurrentNetworkInfo(OCConnectivityType targetType, NetworkInfo *info) -{ - if (targetType == CT_ADAPTER_IP) - { - info->type = CT_ADAPTER_IP; - info->ipaddr = gIpAddress; - if (strlen(gSsid) <= MAXSSIDLEN) - { - OICStrcpy(info->ssid, sizeof(info->ssid), gSsid); - return ES_OK; - } - else - { - return ES_ERROR; - } - } - - return ES_ERROR; -} - diff --git a/service/easy-setup/enrollee/linux/wifi/networkhandler.h b/service/easy-setup/enrollee/linux/wifi/networkhandler.h deleted file mode 100644 index b70be01..0000000 --- a/service/easy-setup/enrollee/linux/wifi/networkhandler.h +++ /dev/null @@ -1,63 +0,0 @@ -//****************************************************************** -// -// Copyright 2015 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -/** - * @file - * - * This file contains IP network handling functionality for Enrollee device - */ - -#ifndef ES_NETWORK_HANDLER_H_ -#define ES_NETWORK_HANDLER_H_ - - -#include -#include "easysetup.h" -#include "logger.h" -#include "escommon.h" - -#define MAXSSIDLEN 33 -#define MAXNETCREDLEN 20 -#define MAXNUMTYPE 5 -#define MAXADDRLEN 15 - -/* - * Callback function for updating the Network status to the subscribers - * - * @param esResult ESResult provides the current state of the network connection status - */ -typedef void (*ESEnrolleeNetworkEventCallback)(ESResult esResult); - -typedef struct -{ - OCConnectivityType type; - // for WiFI - //IPAddress ipaddr; - char *ipaddr; - char ssid[MAXSSIDLEN]; - // for BT, BLE - //byte mac[6]; -} NetworkInfo; - -void ConnectToWiFiNetwork(const char *ssid, const char *pass, - ESEnrolleeNetworkEventCallback); -ESResult getCurrentNetworkInfo(OCConnectivityType targetType, NetworkInfo *info); - -#endif diff --git a/service/easy-setup/enrollee/linux/wifi/softapnative.c b/service/easy-setup/enrollee/linux/wifi/softapnative.c deleted file mode 100644 index d6861a0..0000000 --- a/service/easy-setup/enrollee/linux/wifi/softapnative.c +++ /dev/null @@ -1,38 +0,0 @@ -//****************************************************************** -// -// Copyright 2015 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - - -#include "softapnative.h" - -/** - * This API will create the Soft AP at Enrollee device. - */ -void ESCreateSoftapNative(const char * ssid, const char* passwd, SoftAPCallbackNative cb) -{ - const char *ip, *macaddr, *devicename; - - // Soft is created successfully. This callback may be send from other cascaded callbacks - cb(SOFTAP_SUCCESS, ip, macaddr, devicename); - - // TODO: Use below code to indicate failed on-boarding / softap creation - // Soft creation is failed. This callback may be send from other cascaded callbacks - //cb(SOFTAP_FAILED, nullptr,nullptr,nullptr); -} - diff --git a/service/easy-setup/enrollee/src/easysetup.c b/service/easy-setup/enrollee/src/easysetup.c old mode 100644 new mode 100755 index cb6d260..38959c3 --- a/service/easy-setup/enrollee/src/easysetup.c +++ b/service/easy-setup/enrollee/src/easysetup.c @@ -25,11 +25,9 @@ */ #include "easysetup.h" -#include "softap.h" -#include "onboarding.h" #include "logger.h" #include "resourcehandler.h" -#include "easysetupcallbacks.h" +#include "oic_string.h" /** * @var ES_ENROLLEE_TAG @@ -41,158 +39,232 @@ // Private variables //----------------------------------------------------------------------------- -/** - * @var gTargetSsid - * @brief Target SSID of the Soft Access point to which the device has to connect - */ -static char gTargetSsid[MAXSSIDLEN]; +static bool gIsSecured = false; -/** - * @var gTargetPass - * @brief Password of the target access point to which the device has to connect - */ -static char gTargetPass[MAXNETCREDLEN]; +static ESProvisioningCallbacks gESProvisioningCb; +static ESDeviceProperty gESDeviceProperty; -/** - * @var gEnrolleeStatusCb - * @brief Fucntion pointer holding the callback for intimation of EasySetup Enrollee status callback - */ -static ESEnrolleeEventCallback gEnrolleeStatusCb = NULL; +void ESWiFiRsrcCallback(ESResult esResult, ESWiFiProvData *eventData) +{ + OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, "ESWiFiRsrcCallback IN"); -/** - * @var gIsSecured - * @brief Variable to check if secure mode is enabled or not. - */ -static bool gIsSecured = false; + if(esResult != ES_OK) + { + OIC_LOG_V(ERROR, ES_ENROLLEE_TAG, "ESWiFiRsrcCallback Error Occured"); + return; + } -void ESOnboardingCallback(ESResult esResult) -{ - OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, "ESOnboardingCallback with result = %d", esResult); - if(esResult == ES_OK) - { - gEnrolleeStatusCb(esResult, ES_ON_BOARDED_STATE); - } - else - { - OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, - "Onboarding is failed callback result is = %d", esResult); - gEnrolleeStatusCb(esResult, ES_INIT_STATE); - } + // deliver data to ESProvisioningCallbacks + if(gESProvisioningCb.WiFiProvCb != NULL) + { + gESProvisioningCb.WiFiProvCb(eventData); + } + else + { + OIC_LOG_V(ERROR, ES_ENROLLEE_TAG, "WiFiProvCb is NULL"); + return; + } } -void ESProvisioningCallback(ESResult esResult) +void ESCloudRsrcCallback(ESResult esResult, ESCloudProvData *eventData) { - OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, "ESProvisioningCallback with result = %d", esResult); + OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, "ESCloudRsrcCallback IN"); - if (esResult == ES_RECVTRIGGEROFPROVRES) + if(esResult != ES_OK) { - GetTargetNetworkInfoFromProvResource(gTargetSsid, gTargetPass); - gEnrolleeStatusCb(ES_OK, ES_PROVISIONED_STATE); - OIC_LOG(DEBUG, ES_ENROLLEE_TAG, "Connecting with target network"); + OIC_LOG_V(ERROR, ES_ENROLLEE_TAG, "ESCloudRsrcCallback Error Occured"); + return; + } - // Connecting/onboarding to target network - ConnectToWiFiNetwork(gTargetSsid, gTargetPass, ESOnboardingCallbackTargetNet); + if(gESProvisioningCb.CloudDataProvCb != NULL) + { + gESProvisioningCb.CloudDataProvCb(eventData); } else { - OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, "Provisioning is failed callback result is = %d", esResult); - // Resetting Enrollee to ONBOARDED_STATE as Enrollee is alreday onboarded in previous step - gEnrolleeStatusCb(ES_OK, ES_ON_BOARDED_STATE); + OIC_LOG_V(ERROR, ES_ENROLLEE_TAG, "CloudDataProvCb is NULL"); + return; } } -void ESOnboardingCallbackTargetNet(ESResult esResult) +void ESDevconfRsrcallback(ESResult esResult, ESDevConfProvData *eventData) { - OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, "ESOnboardingCallback on target network with result = %d", - esResult); - if(esResult == ES_OK) + OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, "ESDevconfRsrcallback IN"); + + if(esResult != ES_OK) { - gEnrolleeStatusCb(esResult, ES_ON_BOARDED_TARGET_NETWORK_STATE); + OIC_LOG_V(ERROR, ES_ENROLLEE_TAG, "ESDevconfRsrcallback Error Occured"); + return; + } + + if(gESProvisioningCb.DevConfProvCb != NULL) + { + gESProvisioningCb.DevConfProvCb(eventData); } else { - OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, - "Onboarding is failed on target network and callback result is = %d", esResult); - // Resetting Enrollee state to the ES_PROVISIONED_STATE - // as device is already being provisioned with target network creds. - gEnrolleeStatusCb(esResult, ES_PROVISIONED_STATE); + OIC_LOG_V(ERROR, ES_ENROLLEE_TAG, "DevConfProvCb is NULL"); + return; } } -ESResult ESInitEnrollee(OCConnectivityType networkType, const char *ssid, const char *passwd, - bool isSecured, - ESEnrolleeEventCallback cb) +ESResult ESInitEnrollee(bool isSecured, ESResourceMask resourceMask, ESProvisioningCallbacks callbacks) { OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESInitEnrollee IN"); - if(!ESEnrolleeValidateParam(networkType,ssid,passwd,cb)) + + gIsSecured = isSecured; + + if((resourceMask & ES_WIFI_RESOURCE) == ES_WIFI_RESOURCE) { - OIC_LOG(ERROR, ES_ENROLLEE_TAG, - "ESInitEnrollee::Stopping Easy setup due to invalid parameters"); - return ES_ERROR; + if(callbacks.WiFiProvCb != NULL) + { + gESProvisioningCb.WiFiProvCb = callbacks.WiFiProvCb; + RegisterWifiRsrcEventCallBack(ESWiFiRsrcCallback); + } + else + { + OIC_LOG(ERROR, ES_ENROLLEE_TAG, "WiFiProvCb NULL"); + return ES_ERROR; + } + } + if((resourceMask & ES_DEVCONF_RESOURCE) == ES_DEVCONF_RESOURCE) + { + if(callbacks.DevConfProvCb != NULL) + { + gESProvisioningCb.DevConfProvCb = callbacks.DevConfProvCb; + RegisterDevConfRsrcEventCallBack(ESDevconfRsrcallback); + } + else + { + OIC_LOG(ERROR, ES_ENROLLEE_TAG, "DevConfProvCb NULL"); + return ES_ERROR; + } + } + if((resourceMask & ES_CLOUD_RESOURCE) == ES_CLOUD_RESOURCE) + { + if(callbacks.CloudDataProvCb != NULL) + { + gESProvisioningCb.CloudDataProvCb = callbacks.CloudDataProvCb; + RegisterCloudRsrcEventCallBack(ESCloudRsrcCallback); + } + else + { + OIC_LOG(ERROR, ES_ENROLLEE_TAG, "CloudDataProvCb NULL"); + return ES_ERROR; + } } - //Init callback - gEnrolleeStatusCb = cb; + if(CreateEasySetupResources(gIsSecured, resourceMask) != OC_STACK_OK) + { + UnRegisterResourceEventCallBack(); - gIsSecured = isSecured; + if (DeleteEasySetupResources() != OC_STACK_OK) + { + OIC_LOG(ERROR, ES_ENROLLEE_TAG, "Deleting prov resource error!!"); + } + + return ES_ERROR; + } - // TODO : This onboarding state has to be set by lower layer, as they better - // knows when actually on-boarding started. - cb(ES_ERROR,ES_ON_BOARDING_STATE); - OIC_LOG(INFO, ES_ENROLLEE_TAG, "received callback"); - OIC_LOG(INFO, ES_ENROLLEE_TAG, "onboarding now.."); + OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESInitEnrollee OUT"); + return ES_OK; +} - if(!ESOnboard(ssid, passwd, ESOnboardingCallback)) +ESResult ESSetDeviceProperty(ESDeviceProperty *deviceProperty) +{ + OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESSetDeviceProperty IN"); + + if(SetDeviceProperty(deviceProperty) != OC_STACK_OK) { - OIC_LOG(ERROR, ES_ENROLLEE_TAG, "ESInitEnrollee::On-boarding failed"); - cb(ES_ERROR, ES_INIT_STATE); + OIC_LOG(ERROR, ES_ENROLLEE_TAG, "ESSetDeviceProperty Error"); return ES_ERROR; } - OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESInitEnrollee OUT"); + int modeIdx = 0; + while((deviceProperty->WiFi).mode[modeIdx] != WiFi_EOF) + { + (gESDeviceProperty.WiFi).mode[modeIdx] = (deviceProperty->WiFi).mode[modeIdx]; + OIC_LOG_V(INFO, ES_ENROLLEE_TAG, "WiFi Mode : %d", (gESDeviceProperty.WiFi).mode[modeIdx]); + modeIdx ++; + } + (gESDeviceProperty.WiFi).freq = (deviceProperty->WiFi).freq; + OIC_LOG_V(INFO, ES_ENROLLEE_TAG, "WiFi Freq : %d", (gESDeviceProperty.WiFi).freq); + + OICStrcpy((gESDeviceProperty.DevConf).deviceName, MAX_DEVICELEN, (deviceProperty->DevConf).deviceName); + OIC_LOG_V(INFO, ES_ENROLLEE_TAG, "Device Name : %s", (gESDeviceProperty.DevConf).deviceName); + + OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESSetDeviceProperty OUT"); return ES_OK; } -ESResult ESTerminateEnrollee() +ESResult ESSetState(ESEnrolleeState esState) { - UnRegisterResourceEventCallBack(); + OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESSetState IN"); - //Delete Prov resource - if (DeleteProvisioningResource() != OC_STACK_OK) + if(esState < ES_STATE_INIT || esState > ES_STATE_REGISTRRED_FAIL_TO_CLOUD) { - OIC_LOG(ERROR, ES_ENROLLEE_TAG, "Deleting prov resource error!!"); + OIC_LOG_V(ERROR, ES_ENROLLEE_TAG, "Invalid ESEnrolleeState : %d", esState); return ES_ERROR; } - OIC_LOG(ERROR, ES_ENROLLEE_TAG, "ESTerminateEnrollee success"); + if(SetEnrolleeState(esState) != OC_STACK_OK) + { + OIC_LOG(ERROR, ES_ENROLLEE_TAG, "ESSetState ES_ERROR"); + return ES_ERROR; + } + + OIC_LOG_V(INFO, ES_ENROLLEE_TAG, "Set ESState succesfully : %d", esState); + OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESSetState OUT"); return ES_OK; } -ESResult ESInitProvisioning() +ESResult ESSetErrorCode(ESErrorCode esErrCode) { - OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESInitProvisioning <>"); + OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESSetErrorCode IN"); - if (CreateProvisioningResource(gIsSecured) != OC_STACK_OK) + if(esErrCode < ES_ERRCODE_NO_ERROR || esErrCode > ES_ERRCODE_UNKNOWN) { - OIC_LOG(ERROR, ES_ENROLLEE_TAG, "CreateProvisioningResource error"); - return ES_ERROR; + OIC_LOG_V(ERROR, ES_ENROLLEE_TAG, "Invalid ESSetErrorCode : %d", esErrCode); + return ES_ERROR; } - RegisterResourceEventCallBack(ESProvisioningCallback); + if(SetEnrolleeErrCode(esErrCode) != OC_STACK_OK) + { + OIC_LOG(ERROR, ES_ENROLLEE_TAG, "ESSetErrorCode ES_ERROR"); + return ES_ERROR; + } - OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESInitProvisioning <>"); - return ES_RESOURCECREATED; + OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, "Set ESErrorCode succesfully : %d", esErrCode); + OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESSetErrorCode OUT"); + return ES_OK; } -static bool ESEnrolleeValidateParam(OCConnectivityType networkType, const char *ssid, - const char *passwd, ESEnrolleeEventCallback cb) +ESResult ESTerminateEnrollee() { - if (!ssid || !passwd || !cb) + OIC_LOG(INFO, ES_ENROLLEE_TAG, "ESTerminateEnrollee IN"); + + UnRegisterResourceEventCallBack(); + + //Delete Prov resource + if (DeleteEasySetupResources() != OC_STACK_OK) { - OIC_LOG(ERROR, ES_ENROLLEE_TAG, "ESEnrolleeValidateParam - Invalid parameters"); - return false; + OIC_LOG(ERROR, ES_ENROLLEE_TAG, "Deleting prov resource error!!"); + return ES_ERROR; } - return true; + + OIC_LOG(ERROR, ES_ENROLLEE_TAG, "ESTerminateEnrollee success"); + return ES_OK; } +ESResult ESSetCallbackForUserdata(ESReadUserdataCb readCb, ESWriteUserdataCb writeCb) +{ + if(!readCb && !writeCb) + { + OIC_LOG(INFO, ES_ENROLLEE_TAG, "Both of callbacks for user data are null"); + return ES_ERROR; + } + + SetCallbackForUserData(readCb, writeCb); + return ES_OK; +} \ No newline at end of file diff --git a/service/easy-setup/enrollee/src/easysetupcallbacks.h b/service/easy-setup/enrollee/src/easysetupcallbacks.h deleted file mode 100644 index dc8303b..0000000 --- a/service/easy-setup/enrollee/src/easysetupcallbacks.h +++ /dev/null @@ -1,69 +0,0 @@ -//****************************************************************** -// -// Copyright 2016 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -/** - * @file - * - * This file contains private internal callback function - * prototypes for Easy setup [Enrollee] - */ - -#ifndef EASYSETUP_ENROLLEE_CALLBACKS_H__ -#define EASYSETUP_ENROLLEE_CALLBACKS_H__ - -#include "escommon.h" - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -//----------------------------------------------------------------------------- -// Private internal callback function prototypes for Easy setup [Enrollee] -//----------------------------------------------------------------------------- - - /* - * Callback for on boarding - */ -void ESOnboardingCallback(ESResult esResult); - - /* - * Callback for provisioning - */ -void ESProvisioningCallback(ESResult SSSS); - - /* - * Callback for on boarding target Network - */ -void ESOnboardingCallbackTargetNet(ESResult esResult); - - /* - * Function for validating the parameter for ESInitEnrollee API - */ -static bool ESEnrolleeValidateParam(OCConnectivityType networkType, const char *ssid, - const char *passwd, ESEnrolleeEventCallback cb); - -#ifdef __cplusplus -} -#endif // __cplusplus - - -#endif /* EASYSETUP_ENROLLEE_CALLBACKS_H__ */ - - diff --git a/service/easy-setup/enrollee/src/onboarding.c b/service/easy-setup/enrollee/src/onboarding.c deleted file mode 100644 index da9acaa..0000000 --- a/service/easy-setup/enrollee/src/onboarding.c +++ /dev/null @@ -1,94 +0,0 @@ -//****************************************************************** -// -// Copyright 2015 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -/** - * @file - * - * This file has methods for on-boarding the Enrollee device. - * This will contain template methods that will have core business logic & negotiation algorithm - * on various on-boarding methods. - */ - -#include "easysetup.h" -#include "softap.h" -#include "onboarding.h" - -#include "logger.h" -#include "resourcehandler.h" - -/** - * @var ES_ENROLLEE_TAG - * @brief Logging tag for module name. - */ -#define ES_ENROLLEE_TAG "ES_SOFTAP" - -/** - * It will return true on-boarding type is soft AP - */ -bool ESSoftapOnboarding() -{ - // TODO: To be changed based on user config. Current version, hardcoded to SoftAp onboarding - return true; -} - -/** - * It will return true on-boarding type is BLE - */ -bool ESBleOnboarding() -{ - //BLE onboarding is not supported with current version. - return false; -} - -/** - * It will do onboarding based on the user's configuration. - */ -bool ESOnboard(const char * ssid, const char* passwd, ESEnrolleeNetworkEventCallback cb) -{ - OIC_LOG(DEBUG, ES_ENROLLEE_TAG, "ESOnboard IN"); - - if (ESSoftapOnboarding()) - { - if (ESSoftapAtEnrollee()) - { - OIC_LOG(DEBUG, ES_ENROLLEE_TAG, "Create SoftAp at enrollee"); - ESCreateSoftap(ssid, passwd, cb); - } - else - { - OIC_LOG(DEBUG, ES_ENROLLEE_TAG, "Connecting to Mediator SoftAp"); - ConnectToWiFiNetwork(ssid, passwd, cb); - } - return true; - } - else if (ESBleOnboarding()) - { - OIC_LOG(ERROR, ES_ENROLLEE_TAG, "ESOnboard::Ble onboarding is not supported"); - // TODO: - return false; - } - else - { - // TODO: - OIC_LOG(ERROR, ES_ENROLLEE_TAG, "ESOnboard::Invalid onboarding option"); - return false; - } -} - diff --git a/service/easy-setup/enrollee/src/onboarding.h b/service/easy-setup/enrollee/src/onboarding.h deleted file mode 100644 index dc0ecd6..0000000 --- a/service/easy-setup/enrollee/src/onboarding.h +++ /dev/null @@ -1,70 +0,0 @@ -//****************************************************************** -// -// Copyright 2015 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - - -#ifndef EASYSETUP_ENROLLEE_ONBOARDING_H__ -#define EASYSETUP_ENROLLEE_ONBOARDING_H__ - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus:$ - -#include "networkhandler.h" - -/** - * @file - * - * This file contains APIs to on-board ( connect ) Enrollee device into Ad-hoc network - * @Note : Some of the APIs of this file need to be modified by the OEM according to the - * device configuration - */ - -/** - * This function on-board Enrollee device onto ad-hoc network. - * @param ssid SSID of the target SoftAP network to which the Enrollee - * is connecting. - * @param passwd Password of the target SoftAP network to which the - * Enrollee is connecting. - * @param ESEnrolleeNetworkEventCallback Callback function for result update - * @return ::True, if on-boarding is successful. - */ - -bool ESOnboard(const char * ssid, const char* passwd, ESEnrolleeNetworkEventCallback cb); - -/** - * This function verify if the on-boarding is through SoftAP. - * @return ::True, if Soft AP on-boarding enabled. - * @Note : This API to be modified by the OEM according to the device configuration - */ -bool ESSoftapOnboarding(); - -/** - * This function verify if the on-boarding is through Ble beacons. - * @return ::True, if Ble beacons enabled. - * @Note : This API to be modified by the OEM according to the device configuration - */ -bool ESBleOnboarding(); - -#ifdef __cplusplus -} -#endif // __cplusplus - - -#endif /* EASYSETUP_ENROLLEE_ONBOARDING_H__ */ diff --git a/service/easy-setup/enrollee/src/resourcehandler.c b/service/easy-setup/enrollee/src/resourcehandler.c index 249d586..53ff8ec 100755 --- a/service/easy-setup/enrollee/src/resourcehandler.c +++ b/service/easy-setup/enrollee/src/resourcehandler.c @@ -20,10 +20,9 @@ #include "resourcehandler.h" -#include - #include "ocpayload.h" #include "oic_string.h" +#include "oic_malloc.h" /** * @var ES_RH_TAG @@ -40,36 +39,71 @@ * connect to the target network */ static ProvResource gProvResource; - -/** - * @var gNetResource - * @brief Structure forr holding the Provisioning status of network information - */ -static NetResource gNetResource; +static WiFiResource gWiFiResource; +static CloudResource gCloudResource; +static DevConfResource gDevConfResource; //----------------------------------------------------------------------------- // Private internal function prototypes //----------------------------------------------------------------------------- OCEntityHandlerResult OCEntityHandlerCb(OCEntityHandlerFlag flag, OCEntityHandlerRequest *ehRequest, void *callback); -const char *getResult(OCStackResult result); OCEntityHandlerResult ProcessGetRequest(OCEntityHandlerRequest *ehRequest, OCRepPayload** payload); OCEntityHandlerResult ProcessPutRequest(OCEntityHandlerRequest *ehRequest, OCRepPayload** payload); OCEntityHandlerResult ProcessPostRequest(OCEntityHandlerRequest *ehRequest, OCRepPayload** payload); -OCRepPayload* constructResponse(OCEntityHandlerRequest *ehRequest); +void updateProvResource(OCEntityHandlerRequest* ehRequest, OCRepPayload* input); +void updateWiFiResource(OCRepPayload* input); +void updateCloudResource(OCRepPayload* input); +void updateDevConfResource(OCRepPayload* input); +const char *getResult(OCStackResult result); + +ESWiFiCB gWifiRsrcEvtCb = NULL; +ESCloudCB gCloudRsrcEvtCb = NULL; +ESDevConfCB gDevConfRsrcEvtCb = NULL; -ESEnrolleeResourceEventCallback gNetworkInfoProvEventCb = NULL; +ESReadUserdataCb gReadUserdataCb = NULL; +ESWriteUserdataCb gWriteUserdataCb = NULL; -void RegisterResourceEventCallBack(ESEnrolleeResourceEventCallback cb) +ESResult SetCallbackForUserData(ESReadUserdataCb readCb, ESWriteUserdataCb writeCb) { - gNetworkInfoProvEventCb = cb; + if(!readCb && !writeCb) + { + OIC_LOG(INFO, ES_RH_TAG, "Both of callbacks for user data are null"); + return ES_ERROR; + } + gReadUserdataCb = readCb; + gWriteUserdataCb = writeCb; + return ES_OK; +} + +void RegisterWifiRsrcEventCallBack(ESWiFiCB cb) +{ + gWifiRsrcEvtCb = cb; +} + +void RegisterCloudRsrcEventCallBack(ESCloudCB cb) +{ + gCloudRsrcEvtCb = cb; +} + +void RegisterDevConfRsrcEventCallBack(ESDevConfCB cb) +{ + gDevConfRsrcEvtCb = cb; } void UnRegisterResourceEventCallBack() { - if (gNetworkInfoProvEventCb) + if (gWifiRsrcEvtCb) + { + gWifiRsrcEvtCb = NULL; + } + if (gCloudRsrcEvtCb) + { + gCloudRsrcEvtCb = NULL; + } + if (gDevConfRsrcEvtCb) { - gNetworkInfoProvEventCb = NULL; + gDevConfRsrcEvtCb = NULL; } } @@ -77,40 +111,561 @@ void GetTargetNetworkInfoFromProvResource(char *name, char *pass) { if (name != NULL && pass != NULL) { - OICStrcpy(name, MAXSSIDLEN, gProvResource.tnn); - OICStrcpy(pass, MAXNETCREDLEN, gProvResource.cd); + OICStrcpy(name, MAX_SSIDLEN, gWiFiResource.ssid); + OICStrcpy(pass, MAX_CREDLEN, gWiFiResource.cred); } } -OCStackResult CreateProvisioningResource(bool isSecured) +OCStackResult initProvResource(bool isSecured) { - gProvResource.ps = ES_PS_NEED_PROVISIONING; - gProvResource.tr = ES_PS_TRIGGER_INIT_VALUE; - - gProvResource.tnt = CT_ADAPTER_IP; - OICStrcpy(gProvResource.tnn, sizeof(gProvResource.tnn), "Unknown"); - OICStrcpy(gProvResource.cd, sizeof(gProvResource.cd), "Unknown"); + gProvResource.status = ES_STATE_INIT; + gProvResource.lastErrCode = ES_ERRCODE_NO_ERROR; + OICStrcpy(gProvResource.ocfWebLinks, MAX_WEBLINKLEN, ""); OCStackResult res = OC_STACK_ERROR; if (isSecured) { - res = OCCreateResource(&gProvResource.handle, OC_RSRVD_ES_PROV_RES_TYPE, + res = OCCreateResource(&gProvResource.handle, OC_RSRVD_ES_RES_TYPE_PROV, OC_RSRVD_INTERFACE_DEFAULT, OC_RSRVD_ES_URI_PROV, OCEntityHandlerCb, NULL, OC_DISCOVERABLE | OC_OBSERVABLE | OC_SECURE); - } - else + }else { - res = OCCreateResource(&gProvResource.handle, OC_RSRVD_ES_PROV_RES_TYPE, + res = OCCreateResource(&gProvResource.handle, OC_RSRVD_ES_RES_TYPE_PROV, OC_RSRVD_INTERFACE_DEFAULT, OC_RSRVD_ES_URI_PROV, OCEntityHandlerCb, NULL, OC_DISCOVERABLE | OC_OBSERVABLE); } + if(res) + { + OIC_LOG_V(INFO, ES_RH_TAG, "Created Prov resource with result: %s", getResult(res)); + return res; + } + + res = OCBindResourceInterfaceToResource(gProvResource.handle, OC_RSRVD_INTERFACE_LL); + if(res) + { + OIC_LOG_V(INFO, ES_RH_TAG, "Binding Resource interface with result: %s", getResult(res)); + return res; + } + res = OCBindResourceInterfaceToResource(gProvResource.handle, OC_RSRVD_INTERFACE_BATCH); + if(res) + { + OIC_LOG_V(INFO, ES_RH_TAG, "Binding Resource interface with result: %s", getResult(res)); + return res; + } OIC_LOG_V(INFO, ES_RH_TAG, "Created Prov resource with result: %s", getResult(res)); return res; } +OCStackResult initWiFiResource(bool isSecured) +{ + OCStackResult res = OC_STACK_ERROR; + + gWiFiResource.supportedFreq = WIFI_BOTH; + gWiFiResource.supportedMode[0] = WIFI_11A; + gWiFiResource.supportedMode[1] = WIFI_11B; + gWiFiResource.supportedMode[2] = WIFI_11G; + gWiFiResource.supportedMode[3] = WIFI_11N; + gWiFiResource.numMode = 4; + gWiFiResource.authType = NONE_AUTH; + gWiFiResource.encType = NONE_ENC; + OICStrcpy(gWiFiResource.ssid, sizeof(gWiFiResource.ssid), ""); + OICStrcpy(gWiFiResource.cred, sizeof(gWiFiResource.cred), ""); + + if (isSecured) + { + res = OCCreateResource(&gWiFiResource.handle, OC_RSRVD_ES_RES_TYPE_WIFI, + OC_RSRVD_INTERFACE_DEFAULT, + OC_RSRVD_ES_URI_WIFI, OCEntityHandlerCb, + NULL, OC_DISCOVERABLE | OC_OBSERVABLE | OC_SECURE); + }else + { + res = OCCreateResource(&gWiFiResource.handle, OC_RSRVD_ES_RES_TYPE_WIFI, + OC_RSRVD_INTERFACE_DEFAULT, + OC_RSRVD_ES_URI_WIFI, OCEntityHandlerCb, + NULL, OC_DISCOVERABLE | OC_OBSERVABLE); + } + + OIC_LOG_V(INFO, ES_RH_TAG, "Created WiFi resource with result: %s", getResult(res)); + return res; + +} + +OCStackResult initCloudServerResource(bool isSecured) +{ + OCStackResult res = OC_STACK_ERROR; + + OICStrcpy(gCloudResource.authCode, sizeof(gCloudResource.authCode), ""); + OICStrcpy(gCloudResource.authProvider, sizeof(gCloudResource.authProvider), ""); + OICStrcpy(gCloudResource.ciServer, sizeof(gCloudResource.ciServer), ""); + + if (isSecured) + { + res = OCCreateResource(&gCloudResource.handle, OC_RSRVD_ES_RES_TYPE_CLOUDSERVER, + OC_RSRVD_INTERFACE_DEFAULT, + OC_RSRVD_ES_URI_CLOUDSERVER, OCEntityHandlerCb, + NULL, OC_DISCOVERABLE | OC_OBSERVABLE | OC_SECURE); + }else + { + res = OCCreateResource(&gCloudResource.handle, OC_RSRVD_ES_RES_TYPE_CLOUDSERVER, + OC_RSRVD_INTERFACE_DEFAULT, + OC_RSRVD_ES_URI_CLOUDSERVER, OCEntityHandlerCb, + NULL, OC_DISCOVERABLE | OC_OBSERVABLE); + } + + OIC_LOG_V(INFO, ES_RH_TAG, "Created CloudServer resource with result: %s", getResult(res)); + return res; + +} + +OCStackResult initDevConfResource(bool isSecured) +{ + OCStackResult res = OC_STACK_ERROR; + + OICStrcpy(gDevConfResource.devName, sizeof(gDevConfResource.devName), ""); + OICStrcpy(gDevConfResource.country, sizeof(gDevConfResource.country), ""); + OICStrcpy(gDevConfResource.language, sizeof(gDevConfResource.language), ""); + + if (isSecured) + { + res = OCCreateResource(&gDevConfResource.handle, OC_RSRVD_ES_RES_TYPE_DEVCONF, + OC_RSRVD_INTERFACE_DEFAULT, + OC_RSRVD_ES_URI_DEVCONF, OCEntityHandlerCb, + NULL, OC_DISCOVERABLE | OC_OBSERVABLE | OC_SECURE); + }else + { + res = OCCreateResource(&gDevConfResource.handle, OC_RSRVD_ES_RES_TYPE_DEVCONF, + OC_RSRVD_INTERFACE_DEFAULT, + OC_RSRVD_ES_URI_DEVCONF, OCEntityHandlerCb, + NULL, OC_DISCOVERABLE | OC_OBSERVABLE); + } + + OIC_LOG_V(INFO, ES_RH_TAG, "Created DevConf resource with result: %s", getResult(res)); + return res; + +} + +void updateProvResource(OCEntityHandlerRequest* ehRequest, OCRepPayload* input) +{ + OIC_LOG_V(INFO, ES_RH_TAG, "gProvResource.status %d", gProvResource.status); + + if(ehRequest->query) + { + if(strstr(ehRequest->query, OC_RSRVD_INTERFACE_BATCH)) + { + // When Provisioning resource has a POST with BatchInterface + updateCloudResource(input); + updateWiFiResource(input); + updateDevConfResource(input); + } + } +} + +void updateWiFiResource(OCRepPayload* input) +{ + ESWiFiProvData* wiFiData = (ESWiFiProvData*)OICMalloc(sizeof(ESWiFiProvData)); + + if(wiFiData == NULL) + { + OIC_LOG(DEBUG, ES_RH_TAG, "OICMalloc is failed"); + return ; + } + + memset(wiFiData->ssid, 0, MAX_SSIDLEN); + memset(wiFiData->pwd, 0, MAX_CREDLEN); + wiFiData->authtype = NONE_AUTH; + wiFiData->enctype = NONE_AUTH; + wiFiData->userdata = NULL; + + char* ssid = NULL; + if (OCRepPayloadGetPropString(input, OC_RSRVD_ES_SSID, &ssid)) + { + OICStrcpy(gWiFiResource.ssid, sizeof(gWiFiResource.ssid), ssid); + OICStrcpy(wiFiData->ssid, sizeof(wiFiData->ssid), ssid); + OIC_LOG_V(INFO, ES_RH_TAG, "gWiFiResource.ssid : %s", gWiFiResource.ssid); + } + + char* cred = NULL; + if (OCRepPayloadGetPropString(input, OC_RSRVD_ES_CRED, &cred)) + { + OICStrcpy(gWiFiResource.cred, sizeof(gWiFiResource.cred), cred); + OICStrcpy(wiFiData->pwd, sizeof(wiFiData->pwd), cred); + OIC_LOG_V(INFO, ES_RH_TAG, "gWiFiResource.cred %s", gWiFiResource.cred); + } + + int64_t authType = -1; + if (OCRepPayloadGetPropInt(input, OC_RSRVD_ES_AUTHTYPE, &authType)) + { + gWiFiResource.authType = authType; + wiFiData->authtype = gWiFiResource.authType; + OIC_LOG_V(INFO, ES_RH_TAG, "gWiFiResource.authType %u", gWiFiResource.authType); + } + + int64_t encType = -1; + if (OCRepPayloadGetPropInt(input, OC_RSRVD_ES_ENCTYPE, &encType)) + { + gWiFiResource.encType = encType; + wiFiData->enctype = gWiFiResource.encType; + OIC_LOG_V(INFO, ES_RH_TAG, "gWiFiResource.encType %u", gWiFiResource.encType); + } + + if(gReadUserdataCb) + { + gReadUserdataCb(input, OC_RSRVD_ES_RES_TYPE_WIFI, &wiFiData->userdata); + } + + if(ssid || cred || authType!= -1 || encType != -1) + { + OIC_LOG(INFO, ES_RH_TAG, "Send WiFiRsrc Callback To ES"); + + // TODO : Need to check appropriateness of gWiFiData + if(gWifiRsrcEvtCb != NULL) + { + gWifiRsrcEvtCb(ES_OK, wiFiData); + } + else + { + OIC_LOG(ERROR, ES_RH_TAG, "gWifiRsrcEvtCb is NULL"); + } + } + + OICFree(wiFiData); +} + +void updateCloudResource(OCRepPayload* input) +{ + ESCloudProvData* cloudData = (ESCloudProvData*)OICMalloc(sizeof(ESCloudProvData)); + + if(cloudData == NULL) + { + OIC_LOG(DEBUG, ES_RH_TAG, "OICMalloc is failed"); + return; + } + + memset(cloudData->authCode, 0, OIC_STRING_MAX_VALUE); + memset(cloudData->authProvider, 0, OIC_STRING_MAX_VALUE); + memset(cloudData->ciServer, 0, OIC_STRING_MAX_VALUE); + cloudData->userdata = NULL; + + char *authCode = NULL; + if (OCRepPayloadGetPropString(input, OC_RSRVD_ES_AUTHCODE, &authCode)) + { + OICStrcpy(gCloudResource.authCode, sizeof(gCloudResource.authCode), authCode); + OICStrcpy(cloudData->authCode, sizeof(cloudData->authCode), authCode); + OIC_LOG_V(INFO, ES_RH_TAG, "gCloudResource.authCode %s", gCloudResource.authCode); + } + + char *authProvider = NULL; + if (OCRepPayloadGetPropString(input, OC_RSRVD_ES_AUTHPROVIDER, &authProvider)) + { + OICStrcpy(gCloudResource.authProvider, sizeof(gCloudResource.authProvider), authProvider); + OICStrcpy(cloudData->authProvider, sizeof(cloudData->authProvider), authProvider); + OIC_LOG_V(INFO, ES_RH_TAG, "gCloudResource.authServerUrl %s", gCloudResource.authProvider); + } + + char *ciServer = NULL; + if (OCRepPayloadGetPropString(input, OC_RSRVD_ES_CISERVER, &ciServer)) + { + OICStrcpy(gCloudResource.ciServer, sizeof(gCloudResource.ciServer), ciServer); + OICStrcpy(cloudData->ciServer, sizeof(cloudData->ciServer), ciServer); + OIC_LOG_V(INFO, ES_RH_TAG, "gCloudResource.ciServer %s", gCloudResource.ciServer); + } + + if(gReadUserdataCb) + { + gReadUserdataCb(input, OC_RSRVD_ES_RES_TYPE_CLOUDSERVER, &cloudData->userdata); + } + + if(authCode || authProvider || ciServer) + { + OIC_LOG(INFO, ES_RH_TAG, "Send CloudRsrc Callback To ES"); + + // TODO : Need to check appropriateness of gCloudData + if(gCloudRsrcEvtCb != NULL) + { + gCloudRsrcEvtCb(ES_OK, cloudData); + } + else + { + OIC_LOG(ERROR, ES_RH_TAG, "gCloudRsrcEvtCb is NULL"); + } + } + + OICFree(cloudData); +} + +void updateDevConfResource(OCRepPayload* input) +{ + ESDevConfProvData* devConfData = (ESDevConfProvData*)OICMalloc(sizeof(ESDevConfProvData)); + + if(devConfData == NULL) + { + OIC_LOG(DEBUG, ES_RH_TAG, "OICMalloc is failed"); + return; + } + memset(devConfData->language, 0, OIC_STRING_MAX_VALUE); + memset(devConfData->country, 0, OIC_STRING_MAX_VALUE); + devConfData->userdata = NULL; + + char *country = NULL; + if (OCRepPayloadGetPropString(input, OC_RSRVD_ES_COUNTRY, &country)) + { + OICStrcpy(gDevConfResource.country, sizeof(gDevConfResource.country), country); + OICStrcpy(devConfData->country, sizeof(devConfData->country), country); + OIC_LOG_V(INFO, ES_RH_TAG, "gDevConfResource.country %s", gDevConfResource.country); + } + + char *language = NULL; + if (OCRepPayloadGetPropString(input, OC_RSRVD_ES_LANGUAGE, &language)) + { + OICStrcpy(gDevConfResource.language, sizeof(gDevConfResource.language), language); + OICStrcpy(devConfData->language, sizeof(devConfData->language), language); + OIC_LOG_V(INFO, ES_RH_TAG, "gDevConfResource.language %s", gDevConfResource.language); + } + + if(gReadUserdataCb) + { + gReadUserdataCb(input, OC_RSRVD_ES_RES_TYPE_DEVCONF, &devConfData->userdata); + } + + if(country || language) + { + OIC_LOG(INFO, ES_RH_TAG, "Send DevConfRsrc Callback To ES"); + + // TODO : Need to check appropriateness of gDevConfData + if(gDevConfRsrcEvtCb != NULL) + { + gDevConfRsrcEvtCb(ES_OK, devConfData); + } + else + { + OIC_LOG(ERROR, ES_RH_TAG, "gDevConfRsrcEvtCb is NULL"); + } + } + + OICFree(devConfData); +} + +OCRepPayload* constructResponseOfWiFi() +{ + OCRepPayload* payload = OCRepPayloadCreate(); + if (!payload) + { + OIC_LOG(ERROR, ES_RH_TAG, "Failed to allocate Payload"); + return NULL; + } + + OIC_LOG(INFO, ES_RH_TAG, "constructResponse wifi res"); + OCRepPayloadSetUri(payload, OC_RSRVD_ES_URI_WIFI); + + size_t dimensions[MAX_REP_ARRAY_DEPTH] = {gWiFiResource.numMode, 0, 0}; + int64_t *modes_64 = (int64_t *)OICMalloc(gWiFiResource.numMode * sizeof(int64_t)); + for(int i = 0 ; i < gWiFiResource.numMode ; ++i) + { + modes_64[i] = gWiFiResource.supportedMode[i]; + } + OCRepPayloadSetIntArray(payload, OC_RSRVD_ES_SUPPORTEDWIFIMODE, (int64_t *)modes_64, dimensions); + + OCRepPayloadSetPropInt(payload, OC_RSRVD_ES_SUPPORTEDWIFIFREQ, gWiFiResource.supportedFreq); + OCRepPayloadSetPropString(payload, OC_RSRVD_ES_SSID, gWiFiResource.ssid); + OCRepPayloadSetPropString(payload, OC_RSRVD_ES_CRED, gWiFiResource.cred); + OCRepPayloadSetPropInt(payload, OC_RSRVD_ES_AUTHTYPE, (int) gWiFiResource.authType); + OCRepPayloadSetPropInt(payload, OC_RSRVD_ES_ENCTYPE, (int) gWiFiResource.encType); + + if(gWriteUserdataCb) + { + gWriteUserdataCb(payload, OC_RSRVD_ES_RES_TYPE_WIFI); + } + + return payload; +} + +OCRepPayload* constructResponseOfCloud() +{ + OCRepPayload* payload = OCRepPayloadCreate(); + if (!payload) + { + OIC_LOG(ERROR, ES_RH_TAG, "Failed to allocate Payload"); + return NULL; + } + + OIC_LOG(INFO, ES_RH_TAG, "constructResponse prov res"); + OCRepPayloadSetUri(payload, OC_RSRVD_ES_URI_CLOUDSERVER); + OCRepPayloadSetPropString(payload, OC_RSRVD_ES_AUTHCODE, gCloudResource.authCode); + OCRepPayloadSetPropString(payload, OC_RSRVD_ES_AUTHPROVIDER, gCloudResource.authProvider); + OCRepPayloadSetPropString(payload, OC_RSRVD_ES_CISERVER, gCloudResource.ciServer); + + if(gWriteUserdataCb) + { + gWriteUserdataCb(payload, OC_RSRVD_ES_RES_TYPE_CLOUDSERVER); + } + + return payload; +} + +OCRepPayload* constructResponseOfDevConf() +{ + OCRepPayload* payload = OCRepPayloadCreate(); + if (!payload) + { + OIC_LOG(ERROR, ES_RH_TAG, "Failed to allocate Payload"); + return NULL; + } + + OIC_LOG(INFO, ES_RH_TAG, "constructResponse prov res"); + OCRepPayloadSetUri(payload, OC_RSRVD_ES_URI_DEVCONF); + OCRepPayloadSetPropString(payload, OC_RSRVD_ES_DEVNAME, gDevConfResource.devName); + OCRepPayloadSetPropString(payload, OC_RSRVD_ES_LANGUAGE, gDevConfResource.language); + OCRepPayloadSetPropString(payload, OC_RSRVD_ES_COUNTRY, gDevConfResource.country); + + if(gWriteUserdataCb) + { + gWriteUserdataCb(payload, OC_RSRVD_ES_RES_TYPE_DEVCONF); + } + + return payload; +} + +OCRepPayload* constructResponseOfProv(OCEntityHandlerRequest *ehRequest) +{ + OCRepPayload* payload = OCRepPayloadCreate(); + if (!payload) + { + OIC_LOG(ERROR, ES_RH_TAG, "Failed to allocate Payload"); + return NULL; + } + + OIC_LOG(INFO, ES_RH_TAG, "constructResponse prov res"); + OCRepPayloadSetUri(payload, OC_RSRVD_ES_URI_PROV); + OCRepPayloadSetPropInt(payload, OC_RSRVD_ES_PROVSTATUS, gProvResource.status); + OCRepPayloadSetPropInt(payload, OC_RSRVD_ES_LAST_ERRORCODE, gProvResource.lastErrCode); + OCRepPayloadSetPropString(payload, OC_RSRVD_ES_LINKS, gProvResource.ocfWebLinks); + + if(gWriteUserdataCb) + { + gWriteUserdataCb(payload, OC_RSRVD_ES_RES_TYPE_PROV); + } + + if(ehRequest->query) + { + if(strstr(ehRequest->query, OC_RSRVD_INTERFACE_BATCH)) + {// When Provisioning resource has a GET with BatchInterface + OCRepPayload* head = payload; + OCRepPayload* nextPayload = NULL; + + nextPayload = constructResponseOfWiFi(); + if(nextPayload != NULL) + { + payload->next = nextPayload; + payload = payload->next; + } + + nextPayload = constructResponseOfCloud(); + if(nextPayload != NULL) + { + payload->next = nextPayload; + payload = payload->next; + } + + nextPayload = constructResponseOfDevConf(); + if(nextPayload != NULL) + { + payload->next = nextPayload; + payload = payload->next; + } + + payload = head; + } + } + + return payload; +} + + +OCStackResult CreateEasySetupResources(bool isSecured, ESResourceMask resourceMask) +{ + OCStackResult res = OC_STACK_ERROR; + bool maskFlag = false; + + res = initProvResource(isSecured); + if(res != OC_STACK_OK) + { + // TODO: destroy logic will be added + OIC_LOG_V(ERROR, ES_RH_TAG, "initProvResource result: %s", getResult(res)); + + return res; + } + + if((resourceMask & ES_WIFI_RESOURCE) == ES_WIFI_RESOURCE) + { + maskFlag = true; + res = initWiFiResource(isSecured); + if(res != OC_STACK_OK) + { + OIC_LOG_V(ERROR, ES_RH_TAG, "initWiFiResource result: %s", getResult(res)); + return res; + } + + res = OCBindResource(gProvResource.handle, gWiFiResource.handle); + if(res != OC_STACK_OK) + { + OIC_LOG_V(ERROR, ES_RH_TAG, "Bind WiFiResource result: %s", getResult(res)); + return res; + } + + } + + if((resourceMask & ES_CLOUD_RESOURCE) == ES_CLOUD_RESOURCE) + { + maskFlag = true; + res = initCloudServerResource(isSecured); + if(res != OC_STACK_OK) + { + OIC_LOG_V(ERROR, ES_RH_TAG, "initCloudResource result: %s", getResult(res)); + return res; + } + + res = OCBindResource(gProvResource.handle, gCloudResource.handle); + if(res != OC_STACK_OK) + { + OIC_LOG_V(ERROR, ES_RH_TAG, "Bind CloudResource result: %s", getResult(res)); + return res; + } + } + + if((resourceMask & ES_DEVCONF_RESOURCE) == ES_DEVCONF_RESOURCE) + { + maskFlag = true; + res = initDevConfResource(isSecured); + if(res != OC_STACK_OK) + { + OIC_LOG_V(ERROR, ES_RH_TAG, "initDevConf result: %s", getResult(res)); + return res; + } + + res = OCBindResource(gProvResource.handle, gDevConfResource.handle); + if(res != OC_STACK_OK) + { + OIC_LOG_V(ERROR, ES_RH_TAG, "Bind DevConfResource result: %s", getResult(res)); + return res; + } + } + + + if(maskFlag == false) + { + OIC_LOG_V(ERROR, ES_RH_TAG, "Invalid ResourceMask"); + return OC_STACK_ERROR; + + } + + OIC_LOG_V(INFO, ES_RH_TAG, "Created all resources with result: %s", getResult(res)); + + return res; +} + OCStackResult DeleteProvisioningResource() { OCStackResult res = OCDeleteResource(gProvResource.handle); @@ -122,6 +677,73 @@ OCStackResult DeleteProvisioningResource() return res; } +OCStackResult DeleteEasySetupResources() +{ + OCStackResult res = OC_STACK_ERROR; + if (gWiFiResource.handle != NULL) + { + res = OCUnBindResource(gProvResource.handle, gWiFiResource.handle); + if(res != OC_STACK_OK) + { + OIC_LOG_V(ERROR, ES_RH_TAG, "Unbind WiFi resource error with result: %s", getResult(res)); + } + } + if (gCloudResource.handle != NULL) + { + res = OCUnBindResource(gProvResource.handle, gCloudResource.handle); + if(res != OC_STACK_OK) + { + OIC_LOG_V(ERROR, ES_RH_TAG, "Unbind CloudServer resource error with result: %s", getResult(res)); + } + } + if (gDevConfResource.handle != NULL) + { + res = OCUnBindResource(gProvResource.handle, gDevConfResource.handle); + if(res != OC_STACK_OK) + { + OIC_LOG_V(ERROR, ES_RH_TAG, "Unbind DevConf resource error with result: %s", getResult(res)); + } + } + + if (gWiFiResource.handle != NULL) + { + res = OCDeleteResource(gWiFiResource.handle); + if (res != OC_STACK_OK) + { + OIC_LOG_V(ERROR, ES_RH_TAG, "Deleting WiFi resource error with result: %s", getResult(res)); + } + } + + if(gCloudResource.handle != NULL) + { + res = OCDeleteResource(gCloudResource.handle); + if (res != OC_STACK_OK) + { + OIC_LOG_V(ERROR, ES_RH_TAG, "Deleting CloudServer resource error with result: %s", getResult(res)); + } + } + + if(gDevConfResource.handle != NULL) + { + res = OCDeleteResource(gDevConfResource.handle); + if (res != OC_STACK_OK) + { + OIC_LOG_V(ERROR, ES_RH_TAG, "Deleting DevConf resource error with result: %s", getResult(res)); + } + } + + if(gProvResource.handle != NULL) + { + res = OCDeleteResource(gProvResource.handle); + if (res != OC_STACK_OK) + { + OIC_LOG_V(ERROR, ES_RH_TAG, "Deleting Prov resource error with result: %s", getResult(res)); + } + } + + return res; +} + OCEntityHandlerResult ProcessGetRequest(OCEntityHandlerRequest *ehRequest, OCRepPayload **payload) { OCEntityHandlerResult ehResult = OC_EH_ERROR; @@ -136,7 +758,25 @@ OCEntityHandlerResult ProcessGetRequest(OCEntityHandlerRequest *ehRequest, OCRep return ehResult; } - OCRepPayload *getResp = constructResponse(ehRequest); + OCRepPayload *getResp = NULL; + + if(ehRequest->resource == gProvResource.handle) + { + getResp = constructResponseOfProv(ehRequest); + } + else if(ehRequest->resource == gWiFiResource.handle) + { + getResp = constructResponseOfWiFi(); + } + else if(ehRequest->resource == gCloudResource.handle) + { + getResp = constructResponseOfCloud(); + } + else if(ehRequest->resource == gDevConfResource.handle) + { + getResp = constructResponseOfDevConf(); + } + if (!getResp) { OIC_LOG(ERROR, ES_RH_TAG, "constructResponse failed"); @@ -166,64 +806,41 @@ OCEntityHandlerResult ProcessPostRequest(OCEntityHandlerRequest *ehRequest, OCRe return ehResult; } - char* tnn; - if (OCRepPayloadGetPropString(input, OC_RSRVD_ES_TNN, &tnn)) + if(ehRequest->resource == gProvResource.handle) { - OICStrcpy(gProvResource.tnn, sizeof(gProvResource.tnn), tnn); - OIC_LOG_V(INFO, ES_RH_TAG, "gProvResource.tnn %s", gProvResource.tnn); - - gProvResource.ps = ES_PS_PROVISIONING_COMPLETED; + updateProvResource(ehRequest, input); } - - char* cd; - if (OCRepPayloadGetPropString(input, OC_RSRVD_ES_CD, &cd)) + else if(ehRequest->resource == gWiFiResource.handle) { - OICStrcpy(gProvResource.cd, sizeof(gProvResource.cd), cd); - OIC_LOG_V(INFO, ES_RH_TAG, "gProvResource.cd %s", gProvResource.cd); + updateWiFiResource(input); } - - OIC_LOG_V(INFO, ES_RH_TAG, "gProvResource.ps %lld", gProvResource.ps); - - int64_t tr; - if (OCRepPayloadGetPropInt(input, OC_RSRVD_ES_TR, &tr)) + else if(ehRequest->resource == gCloudResource.handle) { - // Triggering - gProvResource.tr = tr; + updateCloudResource(input); } - - //ES_PS_PROVISIONING_COMPLETED state indicates that already provisioning is completed. - // A new request for provisioning means overriding existing network provisioning information. - if (gProvResource.ps == ES_PS_PROVISIONING_COMPLETED && tr == ES_PS_TRIGGER_CONNECTION) + else if(ehRequest->resource == gDevConfResource.handle) { - OIC_LOG(DEBUG, ES_RH_TAG, "Provisioning already completed." - "Tiggering the network connection"); - - if (gNetworkInfoProvEventCb) - { - gNetworkInfoProvEventCb(ES_RECVTRIGGEROFPROVRES); - ehResult = OC_EH_OK; - } - else - { - gProvResource.tr = ES_PS_TRIGGER_INIT_VALUE; - OIC_LOG(ERROR, ES_RH_TAG, "gNetworkInfoProvEventCb is NULL." - "Network handler not registered. Failed to connect to the network"); - ehResult = OC_EH_ERROR; - } + updateDevConfResource(input); + } - return ehResult; + OCRepPayload *getResp = NULL; + if(ehRequest->resource == gProvResource.handle) + { + getResp = constructResponseOfProv(ehRequest); } - else if (gProvResource.ps == ES_PS_PROVISIONING_COMPLETED) + else if(ehRequest->resource == gWiFiResource.handle) { - OIC_LOG(DEBUG, ES_RH_TAG, "Provisioning already completed. " - "This a request to override the existing the network provisioning information"); + getResp = constructResponseOfWiFi(); } - else + else if(ehRequest->resource == gCloudResource.handle) { - OIC_LOG(DEBUG, ES_RH_TAG, "Provisioning the network information to the Enrollee."); + getResp = constructResponseOfCloud(); + } + else if(ehRequest->resource == gDevConfResource.handle) + { + getResp = constructResponseOfDevConf(); } - OCRepPayload *getResp = constructResponse(ehRequest); if (!getResp) { OIC_LOG(ERROR, ES_RH_TAG, "constructResponse failed"); @@ -239,36 +856,12 @@ OCEntityHandlerResult ProcessPostRequest(OCEntityHandlerRequest *ehRequest, OCRe OCEntityHandlerResult ProcessPutRequest(OCEntityHandlerRequest * ehRequest, OCRepPayload** payload) { + (void) ehRequest; + (void) payload; OCEntityHandlerResult ehResult = OC_EH_ERROR; return ehResult; } - -OCRepPayload* constructResponse(OCEntityHandlerRequest *ehRequest) -{ - OCRepPayload* payload = OCRepPayloadCreate(); - if (!payload) - { - OIC_LOG(ERROR, ES_RH_TAG, "Failed to allocate Payload"); - return NULL; - } - - if (ehRequest->resource == gProvResource.handle) - { - OIC_LOG(INFO, ES_RH_TAG, "constructResponse prov res"); - OCRepPayloadSetUri(payload, OC_RSRVD_ES_URI_PROV); - OCRepPayloadSetPropInt(payload, OC_RSRVD_ES_PS, gProvResource.ps); - OCRepPayloadSetPropInt(payload, OC_RSRVD_ES_TNT, gProvResource.tnt); - } - else if (ehRequest->requestHandle == gNetResource.handle) - { - - OCRepPayloadSetUri(payload, OC_RSRVD_ES_URI_NET); - OCRepPayloadSetPropInt(payload, "ant", gNetResource.ant[0]); - } - return payload; -} - /** * This is the entity handler for the registered resource. * This is invoked by OCStack whenever it recevies a request for this resource. @@ -296,8 +889,7 @@ OCEntityHandlerResult OCEntityHandlerCb(OCEntityHandlerFlag flag, OIC_LOG(INFO, ES_RH_TAG, "Received PUT request"); //PUT request will be handled in the internal implementation - if (gProvResource.handle != NULL - && entityHandlerRequest->resource == gProvResource.handle) + if (gProvResource.handle != NULL) { ehRet = ProcessPutRequest(entityHandlerRequest, &payload); } @@ -310,8 +902,7 @@ OCEntityHandlerResult OCEntityHandlerCb(OCEntityHandlerFlag flag, else if (OC_REST_POST == entityHandlerRequest->method) { OIC_LOG(INFO, ES_RH_TAG, "Received OC_REST_POST from client"); - if (gProvResource.handle != NULL - && entityHandlerRequest->resource == gProvResource.handle) + if (gProvResource.handle != NULL) { ehRet = ProcessPostRequest(entityHandlerRequest, &payload); } @@ -349,6 +940,51 @@ OCEntityHandlerResult OCEntityHandlerCb(OCEntityHandlerFlag flag, return ehRet; } +OCStackResult SetDeviceProperty(ESDeviceProperty *deviceProperty) +{ + OIC_LOG(INFO, ES_RH_TAG, "SetDeviceProperty IN"); + + gWiFiResource.supportedFreq = (deviceProperty->WiFi).freq; + OIC_LOG_V(INFO, ES_RH_TAG, "WiFi Freq : %d", gWiFiResource.supportedFreq); + + int modeIdx = 0; + while((deviceProperty->WiFi).mode[modeIdx] != WiFi_EOF) + { + gWiFiResource.supportedMode[modeIdx] = (deviceProperty->WiFi).mode[modeIdx]; + OIC_LOG_V(INFO, ES_RH_TAG, "WiFi Mode : %d", gWiFiResource.supportedMode[modeIdx]); + modeIdx ++; + } + gWiFiResource.numMode = modeIdx; + + OICStrcpy(gDevConfResource.devName, MAX_DEVICELEN, (deviceProperty->DevConf).deviceName); + OIC_LOG_V(INFO, ES_RH_TAG, "Device Name : %s", gDevConfResource.devName); + + OIC_LOG(INFO, ES_RH_TAG, "SetDeviceProperty OUT"); + return OC_STACK_OK; +} + +OCStackResult SetEnrolleeState(ESEnrolleeState esState) +{ + OIC_LOG(INFO, ES_RH_TAG, "SetEnrolleeState IN"); + + gProvResource.status = esState; + OIC_LOG_V(INFO, ES_RH_TAG, "Enrollee Status : %d", gProvResource.status); + + OIC_LOG(INFO, ES_RH_TAG, "SetEnrolleeState OUT"); + return OC_STACK_OK; +} + +OCStackResult SetEnrolleeErrCode(ESErrorCode esErrCode) +{ + OIC_LOG(INFO, ES_RH_TAG, "SetEnrolleeErrCode IN"); + + gProvResource.lastErrCode = esErrCode; + OIC_LOG_V(INFO, ES_RH_TAG, "Enrollee ErrorCode : %d", gProvResource.lastErrCode); + + OIC_LOG(INFO, ES_RH_TAG, "SetEnrolleeErrCode OUT"); + return OC_STACK_OK; +} + const char *getResult(OCStackResult result) { switch (result) @@ -389,4 +1025,3 @@ const char *getResult(OCStackResult result) return "UNKNOWN"; } } - diff --git a/service/easy-setup/enrollee/src/resourcehandler.h b/service/easy-setup/enrollee/src/resourcehandler.h old mode 100644 new mode 100755 index ad470dc..ba4b36d --- a/service/easy-setup/enrollee/src/resourcehandler.h +++ b/service/easy-setup/enrollee/src/resourcehandler.h @@ -24,7 +24,7 @@ #include "logger.h" #include "ocstack.h" #include "escommon.h" -#include "networkhandler.h" +#include "ESEnrolleeCommon.h" #include "octypes.h" #ifndef ES_RESOURCE_HANDLER_H_ @@ -34,38 +34,66 @@ extern "C" { #endif -typedef void (*ESEnrolleeResourceEventCallback)(ESResult); +typedef void (*ESWiFiCB) (ESResult, ESWiFiProvData *); +typedef void (*ESCloudCB) (ESResult, ESCloudProvData *); +typedef void (*ESDevConfCB) (ESResult, ESDevConfProvData *); + +typedef void (*ESWriteUserdataCb)(OCRepPayload* payload, char* resourceType); +typedef void (*ESReadUserdataCb)(OCRepPayload* payload, char* resourceType, void** userdata); /* Structure to represent a Light resource */ typedef struct PROVRESOURCE { OCResourceHandle handle; - int64_t ps; // provisiong status, 1 : need to provisioning, 2 : Connected to Enroller. - int64_t tr; // Trigger network connection, 0 : Init value, 1 : Connected to the target network. - int64_t tnt; // target network type, 1: WLAN, 2: BT, 3: BLE, 4: Zigbee. - char tnn[MAXSSIDLEN]; // target network name, i.e. SSID for WLAN, MAC address for BT. - char cd[MAXNETCREDLEN]; // credential information. + ProvStatus status; // provisiong status + ESErrorCode lastErrCode; + char ocfWebLinks[MAX_WEBLINKLEN]; } ProvResource; -/* Structure to represent a Light resource */ -typedef struct NETRESOURCE +typedef struct +{ + OCResourceHandle handle; + WIFI_MODE supportedMode[NUM_WIFIMODE]; + uint8_t numMode; // the number of device's supported wifi modes + WIFI_FREQ supportedFreq; + char ssid[MAX_SSIDLEN]; // SSID + char cred[MAX_CREDLEN]; // credential information. + WIFI_AUTHTYPE authType; + WIFI_ENCTYPE encType; +} WiFiResource; + +typedef struct { OCResourceHandle handle; - int64_t cnt; // current network type, 1: WLAN, 2: BT, 3: BLE, 4: Zigbee. - int64_t ant[MAXNUMTYPE]; // available network type, 1: WLAN, 2: BT, 3: BLE, 4: Zigbee. - char ipaddr[MAXADDRLEN]; // ip address. - char cnn[MAXSSIDLEN]; // current network name. -} NetResource; + char authCode[OIC_STRING_MAX_VALUE]; + char authProvider[OIC_STRING_MAX_VALUE]; + char ciServer[OIC_STRING_MAX_VALUE]; +} CloudResource; + +typedef struct +{ + OCResourceHandle handle; + char devName[MAX_DEVICELEN]; + char language[OIC_STRING_MAX_VALUE]; + char country[OIC_STRING_MAX_VALUE]; +} DevConfResource; + +OCStackResult CreateEasySetupResources(bool isSecured, ESResourceMask resourceMask); +OCStackResult DeleteEasySetupResources(); -OCStackResult CreateProvisioningResource(bool isSecured); -OCStackResult DeleteProvisioningResource(); +OCStackResult SetDeviceProperty(ESDeviceProperty *deviceProperty); +OCStackResult SetEnrolleeState(ESEnrolleeState esState); +OCStackResult SetEnrolleeErrCode(ESErrorCode esErrCode); void GetTargetNetworkInfoFromProvResource(char *, char *); -void RegisterResourceEventCallBack(ESEnrolleeResourceEventCallback); +void RegisterWifiRsrcEventCallBack(ESWiFiCB); +void RegisterCloudRsrcEventCallBack(ESCloudCB); +void RegisterDevConfRsrcEventCallBack(ESDevConfCB); void UnRegisterResourceEventCallBack(void); +ESResult SetCallbackForUserData(ESReadUserdataCb readCb, ESWriteUserdataCb writeCb); #ifdef __cplusplus } #endif -#endif //ES_RESOURCE_HANDLER_H_ \ No newline at end of file +#endif //ES_RESOURCE_HANDLER_H_ diff --git a/service/easy-setup/enrollee/src/softap.c b/service/easy-setup/enrollee/src/softap.c deleted file mode 100644 index 00df2a9..0000000 --- a/service/easy-setup/enrollee/src/softap.c +++ /dev/null @@ -1,89 +0,0 @@ -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -/** - * These are adapter APIs will make caller modules agnostic to platform. - */ - -#include "softapnative.h" -#include "easysetup.h" -#include "softap.h" -#include "networkhandler.h" - -void ESCreateSoftapCallback(int result, const char *ip, const char* mac_addr, - const char* device_name ); - -ESEnrolleeNetworkEventCallback gCallback; - -/** - * It will return Device which is creating Soft AP. - * i.e.Enrollee or Mediator. - * This decision is based on, what is the value set for ES_SOFTAP_MODE in build command as well as - * in iotivity.spec file. - */ -DeviceRole ESSoftapHost() -{ -#ifdef ENROLLEE_SOFTAP - //SoftAp at enrollee - return ENROLLEE; -#else - //SoftAp at mediator - return MEDIATOR; -#endif -} - -/** - * It will return true if the Soft AP is created at Enrollee device - */ -bool ESSoftapAtEnrollee() -{ - return ( ESSoftapHost() == ENROLLEE) ? true : false; -} - -/** - * It will return true if the Soft AP is created at Mediator device - */ -bool ESSoftapAtMediator() -{ - return (ESSoftapHost() == MEDIATOR) ? true : false; -} - -/** - * This API will map result returned from the native to the caller. - * Callback API's signature needs to be modified under build switch according - * to the underline platform. - */ -void ESCreateSoftapCallback(int result, const char *ip, const char* mac_addr, - const char* device_name) -{ - if(SOFTAP_SUCCESS == result) //on Success - { - gCallback(ES_OK); - } - else //on Failure - { - gCallback(ES_ERROR); - } -} - -/** - * This API will create the softap at enrollee - */ -void ESCreateSoftap(const char * ssid, const char* passwd, ESEnrolleeNetworkEventCallback cb) -{ - gCallback = cb; - - // TODO: To be implemented - // Create Soft AP through native APIs -- start - // native API call by and pass ESCreateSoftapCallback() as callback - ESCreateSoftapNative(ssid, passwd,ESCreateSoftapCallback); - // Create Soft AP through native APIs -- end -} - diff --git a/service/easy-setup/enrollee/src/softap.h b/service/easy-setup/enrollee/src/softap.h deleted file mode 100644 index df532de..0000000 --- a/service/easy-setup/enrollee/src/softap.h +++ /dev/null @@ -1,85 +0,0 @@ -//****************************************************************** -// -// Copyright 2015 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - - -#ifndef EASYSETUP_ENROLLEE_SOFTAP_H__ -#define EASYSETUP_ENROLLEE_SOFTAP_H__ - -#include "escommon.h" -#include "networkhandler.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @file - * - * This file contains platform agnostic API for creation of Soft AP - * @Note : Some of the APIs of this file need to be modified by the OEM according to the device - * configuration - */ - -/** - * This function verify if the Soft AP is created at Enrollee device. - * @return ::True, if Soft AP is created at Enrollee device. - * @Note : This API needs to be modified by the OEM according to the device configuration - */ - -bool ESSoftapAtEnrollee(); - -/** - * This function verify if the Soft AP is created at Mediator device. - * @return ::True, if Soft AP is created at Mediator device. - * @Note : This API needs to be modified by the OEM according to the device configuration - */ - -bool ESSoftapAtMediator(); - - -/** - * This function finds which Device (Enrollee or Mediator) is creating Soft AP. - * @return ::DeviceRole (ENROLLEE or MEDIATOR) - * @Note : This API needs to be modified by the OEM according to the device configuration - */ - -DeviceRole ESSoftapHost(); - -/** - * This function Initializes the EasySetup. This API must be called prior to invoking any other API - * - * @param ssid SSID of the target SoftAP network to which the Enrollee is - * connecting. - * @param passwd Password of the target SoftAP network to which the Enrollee is - * connecting - * @param ESEnrolleeNetworkEventCallback Callback function for result update - * @return ::void. - */ -void ESCreateSoftap(const char * ssid, const char* passwd, ESEnrolleeNetworkEventCallback cb); - - -#ifdef __cplusplus -} -#endif - -#endif /* EASYSETUP_ENROLLEE_SOFTAP_H__ */ - - - diff --git a/service/easy-setup/enrollee/tizen/wifi/networkhandler.c b/service/easy-setup/enrollee/tizen/wifi/networkhandler.c deleted file mode 100644 index ef83e92..0000000 --- a/service/easy-setup/enrollee/tizen/wifi/networkhandler.c +++ /dev/null @@ -1,184 +0,0 @@ -/****************************************************************** - * - * Copyright 2015 Samsung Electronics All Rights Reserved. - * - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************/ - -#include "networkhandler.h" - -#include -#include - -#include "logger.h" -#include "easysetup.h" -#include "oic_string.h" - -#define LOG_TAG "TIZEN ES" - -const char *gSsid = "DLNA_LISMORE1"; -const char *gPass = "dlna@010203"; -char *gIpAddress = NULL; -wifi_ap_h connectedWifi; -ESEnrolleeNetworkEventCallback gNetworkEventCb; -static void ESActivateWifi(); - -static const char* -print_state(wifi_connection_state_e state) -{ - switch (state) - { - case WIFI_CONNECTION_STATE_DISCONNECTED: - return "Disconnected"; - case WIFI_CONNECTION_STATE_ASSOCIATION: - return "Association"; - case WIFI_CONNECTION_STATE_CONNECTED: - return "Connected"; - case WIFI_CONNECTION_STATE_CONFIGURATION: - return "Configuration"; - } -} - -void __wifi_connected_cb(wifi_error_e error_code, void *user_data) -{ - OIC_LOG(INFO,LOG_TAG,"#### __connected "); - - if (gIpAddress) - free(gIpAddress); - - wifi_ap_get_ip_address(connectedWifi, WIFI_ADDRESS_FAMILY_IPV4, &gIpAddress); - OIC_LOG_V(INFO,LOG_TAG,"#### __connected, Ipaddress=%s", gIpAddress); - gNetworkEventCb(ES_OK); - -} - -bool __wifi_found_ap_cb(wifi_ap_h ap, void *user_data) -{ - OIC_LOG(INFO,LOG_TAG,"#### __wifi_found_ap_cb received "); - - int error_code = 0; - char *ap_name = NULL; - wifi_connection_state_e state; - - error_code = wifi_ap_get_essid(ap, &ap_name); - if (error_code != WIFI_ERROR_NONE) - { - OIC_LOG(ERROR,LOG_TAG,"#### Fail to get AP name."); - - return false; - } - error_code = wifi_ap_get_connection_state(ap, &state); - if (error_code != WIFI_ERROR_NONE) - { - OIC_LOG(ERROR,LOG_TAG,"#### Fail to get state."); - free(ap_name); - - return false; - } - OIC_LOG_V(INFO,LOG_TAG,"#### AP name : %s, state : %s", ap_name, print_state(state)); - - if (strcmp(ap_name, gSsid) == 0) - { - OIC_LOG(INFO,LOG_TAG,"#### network found"); - wifi_ap_set_passphrase(ap, gPass); - connectedWifi = ap; - error_code = wifi_connect(ap, __wifi_connected_cb, NULL); - OIC_LOG_V(INFO,LOG_TAG,"Code=%d", error_code); - } - OIC_LOG(INFO,LOG_TAG,"#### __wifi_found_ap_cb received "); - free(ap_name); - return true; -} -void __scan_request_cb(wifi_error_e error_code, void *user_data) -{ - OIC_LOG(INFO, LOG_TAG, "__scan_request_cb"); - int error_code1; - error_code1 = wifi_foreach_found_aps(__wifi_found_ap_cb, NULL); - if (error_code1 != WIFI_ERROR_NONE) - OIC_LOG(INFO,LOG_TAG,"#### Fail to scan"); - - OIC_LOG(INFO, LOG_TAG,"#### __scan_request_cb exit "); -} - -static void __wifi_activated_cb(wifi_error_e result, void *user_data) -{ - OIC_LOG(INFO, LOG_TAG, "__wifi_activated_cb"); - if (result == WIFI_ERROR_NONE) - { - OIC_LOG(INFO,LOG_TAG,"#### Success to activate Wi-Fi device!"); - } - wifi_scan(__scan_request_cb, NULL); - -} -static void ESActivateWifi() -{ - int error_code; - error_code = wifi_initialize(); - OIC_LOG_V(INFO,LOG_TAG,"#### WIFI INITIALIZED WITH STATUS :%d", error_code); - - error_code = wifi_activate(__wifi_activated_cb, NULL); - OIC_LOG_V(INFO,LOG_TAG,"#### WIFI ACTIVATED WITH STATUS :%d", error_code); - - bool wifi_activated = false; - wifi_is_activated(&wifi_activated); - if (wifi_activated) - { - OIC_LOG(INFO,LOG_TAG,"#### Success to get Wi-Fi device state."); - int scan_result = wifi_scan(__scan_request_cb, NULL); - OIC_LOG_V(INFO,LOG_TAG,"#### Wifi scan result:%d", scan_result); - } - else - { - OIC_LOG(ERROR,LOG_TAG, "#### Fail to get Wi-Fi device state."); - } -} - -static void start() -{ - OIC_LOG(INFO, LOG_TAG, "START"); - ESActivateWifi(); -} - -void ConnectToWiFiNetwork(const char *ssid, const char *pass, - ESEnrolleeNetworkEventCallback cb) -{ - OIC_LOG_V(INFO, LOG_TAG, "ConnectToWiFiNetwork %s %s",ssid,pass); - gPass = pass; - gSsid = ssid; - gNetworkEventCb = cb; - start(); -} - -ESResult getCurrentNetworkInfo(OCConnectivityType targetType, NetworkInfo *info) -{ - if (targetType == CT_ADAPTER_IP) - { - info->type = CT_ADAPTER_IP; - info->ipaddr = gIpAddress; - if (strlen(gSsid) <= MAXSSIDLEN) - { - OICStrcpy(info->ssid, sizeof(info->ssid), gSsid); - return ES_OK; - } - else - { - return ES_ERROR; - } - } - - return ES_ERROR; -} - diff --git a/service/easy-setup/enrollee/tizen/wifi/networkhandler.h b/service/easy-setup/enrollee/tizen/wifi/networkhandler.h deleted file mode 100644 index 410b665..0000000 --- a/service/easy-setup/enrollee/tizen/wifi/networkhandler.h +++ /dev/null @@ -1,63 +0,0 @@ -//****************************************************************** -// -// Copyright 2015 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -/** - * @file - * - * This file contains IP network handling functionality for Enrollee device - */ - -#ifndef ES_NETWORK_HANDLER_H_ -#define ES_NETWORK_HANDLER_H_ - - -#include -#include "easysetup.h" -#include "logger.h" -#include "escommon.h" - -#define MAXSSIDLEN 33 -#define MAXNETCREDLEN 20 -#define MAXNUMTYPE 5 -#define MAXADDRLEN 15 - -/* - * Callback function for updating the Network status to the subscribers - * - * @param esResult ESResult provides the current state of the network connection status - */ -typedef void (*ESEnrolleeNetworkEventCallback)(ESResult esResult); - -typedef struct -{ - OCConnectivityType type; - // for WiFI - //IPAddress ipaddr; - char *ipaddr; - char ssid[MAXSSIDLEN]; - // for BT, BLE - //byte mac[6]; -} NetworkInfo; - -void ConnectToWiFiNetwork(const char *ssid, const char *pass, - ESEnrolleeNetworkEventCallback); -ESResult getCurrentNetworkInfo(OCConnectivityType targetType, NetworkInfo *info); - -#endif diff --git a/service/easy-setup/enrollee/tizen/wifi/softapnative.c b/service/easy-setup/enrollee/tizen/wifi/softapnative.c deleted file mode 100644 index ae47dda..0000000 --- a/service/easy-setup/enrollee/tizen/wifi/softapnative.c +++ /dev/null @@ -1,42 +0,0 @@ -//****************************************************************** -// -// Copyright 2015 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - - -#include "softapnative.h" - -/** - * This API will create the Soft AP at Enrollee device. - */ -void ESCreateSoftapNative(const char * ssid, const char* passwd, SoftAPCallbackNative cb) -{ - // TODO: Assign proper values after hardware integration is supported to create SoftAp - //We are not using this now. Assiging NULL to remove SVACE error - const char *ip = (char *)0; - const char *macaddr = (char *)0; - const char *devicename = (char *)0; - - // Soft is created successfully. This callback may be send from other cascaded callbacks - cb(SOFTAP_SUCCESS, ip, macaddr, devicename); - - // TODO: Use below code to indicate failed on-boarding / softap creation - // Soft creation is failed. This callback may be send from other cascaded callbacks - //cb(SOFTAP_FAILED, nullptr,nullptr,nullptr); -} - diff --git a/service/easy-setup/enrollee/tizen/wifi/softapnative.h b/service/easy-setup/enrollee/tizen/wifi/softapnative.h deleted file mode 100644 index 10774ed..0000000 --- a/service/easy-setup/enrollee/tizen/wifi/softapnative.h +++ /dev/null @@ -1,66 +0,0 @@ -//****************************************************************** -// -// Copyright 2015 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - - - -#ifndef EASYSETUP_ENROLLEE_SOFTAP_H__ -#define EASYSETUP_ENROLLEE_SOFTAP_H__ - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - - -#define SOFTAP_SUCCESS 1 -#define SOFTAP_FAILED 0 - -/** - * @file - * - * This file contains the API declaration for creating & configuration for SoftAP - */ - -//This callback signagure may get changed as per the native implementation. -typedef void (*SoftAPCallbackNative)(int result, const char *ip, const char* mac_addr, - const char*device_name); -/** - * This API creats the Soft AP using the platform specific native system calls. - * @Note This API to be implemented by the OEM if Enrollee device SoC supports SoftAP - * - * @param networkType NetworkType on which OnBoarding has to be performed. - * @param ssid SSID of the target SoftAP network to which the Enrollee is - * connecting. - * @param passwd Password of the target SoftAP network to which the Enrollee is - * connecting - * @param SoftAPCallbackNative EventCallback for for updating the Enrollee OnBoarding status - * result to the application - */ - -void ESCreateSoftapNative(const char * ssid, const char* passwd, SoftAPCallbackNative cb); - -#ifdef __cplusplus -} -#endif // __cplusplus - - -#endif /* EASYSETUP_ENROLLEE_SOFTAP_H__ */ - - - diff --git a/service/easy-setup/enrollee/unittests/ESEnrolleeTest.cpp b/service/easy-setup/enrollee/unittests/ESEnrolleeTest.cpp new file mode 100755 index 0000000..6232bce --- /dev/null +++ b/service/easy-setup/enrollee/unittests/ESEnrolleeTest.cpp @@ -0,0 +1,413 @@ +//****************************************************************** +// +// Copyright 2016 Samsung Electronics All Rights Reserved. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +#include +#include +#include +#include +#include +#include +#include + +#include "ESMediatorSimulator.h" +#include "easysetup.h" + +using namespace OC; + +namespace +{ + std::atomic_bool g_isStartedStack(false); + + std::chrono::milliseconds g_waitForResponse(1000); + + std::condition_variable responseCon; + std::mutex mutexForCondition; + + ESMediatorSimulator g_mediatorSimul; +} + +class TestWithMock: public testing::Test +{ +public: + MockRepository mocks; + +protected: + virtual ~TestWithMock() noexcept(noexcept(std::declval().~Test())) + { + } + + virtual void TearDown() + { + try + { + mocks.VerifyAll(); + } + catch (...) + { + mocks.reset(); + throw; + } + } +}; + +class EasysetupEnrolleeTest : public TestWithMock +{ +public: + EasysetupEnrolleeTest() = default; + ~EasysetupEnrolleeTest() = default; + + static void discoveredResource(std::shared_ptr) + { + std::cout << __func__ << std::endl; + } + + static void onGetStatus(std::shared_ptr< GetEnrolleeStatus >) + { + std::cout << __func__ << std::endl; + } + + static void onGetConfiguration(std::shared_ptr< GetConfigurationStatus >) + { + std::cout << __func__ << std::endl; + } + + static void deviceProvisioningStatusCallback(std::shared_ptr< DevicePropProvisioningStatus >) + { + std::cout << __func__ << std::endl; + } + + static void cloudProvisioningStatusCallback(std::shared_ptr< CloudPropProvisioningStatus >) + { + std::cout << __func__ << std::endl; + } + + static void WiFiProvCbInApp(ESWiFiProvData *) + { + std::cout << __func__ << std::endl; + } + + static void DevConfProvCbInApp(ESDevConfProvData *) + { + std::cout << __func__ << std::endl; + } + + static void CloudDataCbInApp(ESCloudProvData *) + { + std::cout << __func__ << std::endl; + } + + ESResult startEnrollee() + { + ESResourceMask resourcemMask = (ESResourceMask)(ES_WIFI_RESOURCE | + ES_CLOUD_RESOURCE | + ES_DEVCONF_RESOURCE); + ESProvisioningCallbacks callbacks; + callbacks.WiFiProvCb = &EasysetupEnrolleeTest::WiFiProvCbInApp; + callbacks.DevConfProvCb = &EasysetupEnrolleeTest::DevConfProvCbInApp; + callbacks.CloudDataProvCb = &EasysetupEnrolleeTest::CloudDataCbInApp; + + return ESInitEnrollee(false, resourcemMask, callbacks); + } + + ESResult setDeviceProperty() + { + ESDeviceProperty deviceProperty = { + {{WIFI_11G, WiFi_EOF}, WIFI_5G}, {"Test Device"} + }; + + return ESSetDeviceProperty(&deviceProperty); + } + +protected: + + void SetUp() + { + TestWithMock::SetUp(); + + if (g_isStartedStack == false) + { + if (OCInit(NULL, 0, OC_SERVER) != OC_STACK_OK) + { + printf("OCStack init error!!\n"); + return; + } + + g_isStartedStack = true; + } + } + + void TearDown() + { + TestWithMock::TearDown(); + } + +}; + +TEST_F(EasysetupEnrolleeTest, ESInitEnrolleeSuccess) +{ + ESResult ret = startEnrollee(); + EXPECT_EQ(ret, ES_OK); + ESTerminateEnrollee(); +} + +TEST_F(EasysetupEnrolleeTest, ESInitEnrolleeFailedByWiFiCbIsNull) +{ + ESResourceMask resourcemMask = (ESResourceMask)(ES_WIFI_RESOURCE | + ES_CLOUD_RESOURCE | + ES_DEVCONF_RESOURCE); + ESProvisioningCallbacks callbacks; + callbacks.WiFiProvCb = NULL; + callbacks.DevConfProvCb = &EasysetupEnrolleeTest::DevConfProvCbInApp; + callbacks.CloudDataProvCb = &EasysetupEnrolleeTest::CloudDataCbInApp; + + ESResult ret = ESInitEnrollee(false, resourcemMask, callbacks); + EXPECT_EQ(ret, ES_ERROR); + ESTerminateEnrollee(); +} + +TEST_F(EasysetupEnrolleeTest, ESInitEnrolleeFailedByDevConfCbIsNull) +{ + ESResourceMask resourcemMask = (ESResourceMask)(ES_WIFI_RESOURCE | + ES_CLOUD_RESOURCE | + ES_DEVCONF_RESOURCE); + ESProvisioningCallbacks callbacks; + callbacks.WiFiProvCb = &EasysetupEnrolleeTest::WiFiProvCbInApp; + callbacks.DevConfProvCb = NULL; + callbacks.CloudDataProvCb = &EasysetupEnrolleeTest::CloudDataCbInApp; + + ESResult ret = ESInitEnrollee(false, resourcemMask, callbacks); + EXPECT_EQ(ret, ES_ERROR); + ESTerminateEnrollee(); +} + +TEST_F(EasysetupEnrolleeTest, ESInitEnrolleeFailedByCloudCbIsNull) +{ + ESResourceMask resourcemMask = (ESResourceMask)(ES_WIFI_RESOURCE | + ES_CLOUD_RESOURCE | + ES_DEVCONF_RESOURCE); + ESProvisioningCallbacks callbacks; + callbacks.WiFiProvCb = &EasysetupEnrolleeTest::WiFiProvCbInApp; + callbacks.DevConfProvCb = &EasysetupEnrolleeTest::DevConfProvCbInApp; + callbacks.CloudDataProvCb = NULL; + + ESResult ret = ESInitEnrollee(false, resourcemMask, callbacks); + EXPECT_EQ(ret, ES_ERROR); + ESTerminateEnrollee(); +} + +TEST_F(EasysetupEnrolleeTest, FindProvisioningResourceAtEnrolleeWithSuccess) +{ + mocks.ExpectCallFunc(discoveredResource).Do( + [](std::shared_ptr resource) + { + try + { + std::cout<<"DISCOVERED Resource:"<uri(); + std::cout << "\tURI of the resource: " << uri << std::endl; + } catch (OCException &e) + { + std::cout << e.reason() << std::endl; + } + + }); + + ESResult ret = startEnrollee(); + + g_mediatorSimul.discoverRemoteEnrollee(discoveredResource); + + std::unique_lock< std::mutex > lock{ mutexForCondition }; + responseCon.wait_for(lock, g_waitForResponse); + + EXPECT_EQ(ret, ES_OK); + + ESTerminateEnrollee(); +} + +TEST_F(EasysetupEnrolleeTest, SetDevicePropertyWithSuccess) +{ + ESResult ret = startEnrollee(); + ret = setDeviceProperty(); + EXPECT_EQ(ret, ES_OK); + ESTerminateEnrollee(); +} + +TEST_F(EasysetupEnrolleeTest, SetProvStatusWithSuccess) +{ + ESResult ret = startEnrollee(); + ret = ESSetState(ES_STATE_CONNECTED_TO_ENROLLER); + EXPECT_EQ(ret, ES_OK); + ESTerminateEnrollee(); +} + +TEST_F(EasysetupEnrolleeTest, SetErrorCodeWithSuccess) +{ + ESResult ret = startEnrollee(); + ret = ESSetErrorCode(ES_ERRCODE_PW_WRONG); + EXPECT_EQ(ret, ES_OK); + ESTerminateEnrollee(); +} + +TEST_F(EasysetupEnrolleeTest, DevicePropertyIsWellConstructedInResponsePayload) +{ + bool isWellConstructed = false; + mocks.ExpectCallFunc(onGetConfiguration).Do( + [& isWellConstructed](std::shared_ptr< GetConfigurationStatus > status) + { + if(status->getESResult() == ES_OK) + { + EnrolleeConf conf = status->getEnrolleeConf(); + if(conf.getWiFiModes().at(0) == WIFI_11G && + conf.getWiFiFreq() == WIFI_5G && + !strcmp(conf.getDeviceName().c_str(), "Test Device")) + { + isWellConstructed = true; + } + } + }); + ESResult ret = startEnrollee(); + ret = setDeviceProperty(); + + g_mediatorSimul.getConfiguration(onGetConfiguration); + + std::unique_lock< std::mutex > lock{ mutexForCondition }; + responseCon.wait_for(lock, g_waitForResponse); + + EXPECT_EQ(ret, ES_OK); + + ESTerminateEnrollee(); +} + +TEST_F(EasysetupEnrolleeTest, ProvisioningPropertiesIsWellConstructedInResponsePayload) +{ + bool isWellConstructed = false; + mocks.ExpectCallFunc(onGetStatus).Do( + [& isWellConstructed](std::shared_ptr< GetEnrolleeStatus > status) + { + if(status->getESResult() == ES_OK) + { + EnrolleeStatus enrolleeStatus = status->getEnrolleeStatus(); + + + if(enrolleeStatus.getProvStatus() == ES_STATE_CONNECTED_TO_ENROLLER && + enrolleeStatus.getLastErrCode() == ES_ERRCODE_NO_INTERNETCONNECTION) + { + isWellConstructed = true; + } + } + }); + ESResult ret = startEnrollee(); + ret = setDeviceProperty(); + ret = ESSetState(ES_STATE_CONNECTED_TO_ENROLLER); + ret = ESSetErrorCode(ES_ERRCODE_NO_INTERNETCONNECTION); + + g_mediatorSimul.getStatus(onGetStatus); + + std::unique_lock< std::mutex > lock{ mutexForCondition }; + responseCon.wait_for(lock, g_waitForResponse); + + EXPECT_EQ(ret, ES_OK); + + ESTerminateEnrollee(); +} + +TEST_F(EasysetupEnrolleeTest, WiFiAndDevConfProperiesProvisionedWithSuccess) +{ + int cntForReceivedCallbackWithSuccess = 0; + + mocks.OnCallFunc(deviceProvisioningStatusCallback).Do( + [& cntForReceivedCallbackWithSuccess](std::shared_ptr< DevicePropProvisioningStatus > status) + { + if(status->getESResult() == ES_OK) + cntForReceivedCallbackWithSuccess++; + }); + + mocks.OnCallFunc(WiFiProvCbInApp).Do( + [& cntForReceivedCallbackWithSuccess](ESWiFiProvData *data) + { + if(!strcmp(data->ssid, "Iotivity_SSID") && + !strcmp(data->pwd, "Iotivity_PWD") && + data->authtype == WPA2_PSK && + data->enctype == TKIP_AES) + { + cntForReceivedCallbackWithSuccess++; + } + }); + mocks.OnCallFunc(DevConfProvCbInApp).Do( + [& cntForReceivedCallbackWithSuccess](ESDevConfProvData *data) + { + if(!strcmp(data->language, "korean") && + !strcmp(data->country, "Korea")) + { + cntForReceivedCallbackWithSuccess++; + } + }); + + startEnrollee(); + + g_mediatorSimul.provisionDeviceProperties(deviceProvisioningStatusCallback); + + std::unique_lock< std::mutex > lock{ mutexForCondition }; + responseCon.wait_for(lock, g_waitForResponse); + + EXPECT_EQ(cntForReceivedCallbackWithSuccess, 3); + + ESTerminateEnrollee(); +} + +TEST_F(EasysetupEnrolleeTest, CloudServerProperiesProvisionedWithSuccess) +{ + int cntForReceivedCallbackWithSuccess = 0; + + mocks.OnCallFunc(cloudProvisioningStatusCallback).Do( + [& cntForReceivedCallbackWithSuccess](std::shared_ptr< CloudPropProvisioningStatus > status) + { + // Will called twice + if(status->getESResult() == ES_OK) + { + cntForReceivedCallbackWithSuccess++; + } + }); + + mocks.OnCallFunc(CloudDataCbInApp).Do( + [& cntForReceivedCallbackWithSuccess](ESCloudProvData *data) + { + if(!strcmp(data->authCode, "authCode") && + !strcmp(data->authProvider, "authProvider") && + !strcmp(data->ciServer, "ciServer")) + { + cntForReceivedCallbackWithSuccess++; + } + }); + + startEnrollee(); + + g_mediatorSimul.provisionCloudProperties(cloudProvisioningStatusCallback); + + std::unique_lock< std::mutex > lock{ mutexForCondition }; + responseCon.wait_for(lock, g_waitForResponse); + + EXPECT_EQ(cntForReceivedCallbackWithSuccess, 3); + + ESTerminateEnrollee(); +} + + diff --git a/service/easy-setup/enrollee/unittests/ESMediatorSimulator.h b/service/easy-setup/enrollee/unittests/ESMediatorSimulator.h new file mode 100755 index 0000000..938a43e --- /dev/null +++ b/service/easy-setup/enrollee/unittests/ESMediatorSimulator.h @@ -0,0 +1,241 @@ +//****************************************************************** +// +// Copyright 2016 Samsung Electronics All Rights Reserved. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +#ifndef _ES_MEDIATOR_SIMULATOR_H_ +#define _ES_MEDIATOR_SIMULATOR_H_ + +#include + +#include "OCPlatform.h" +#include "OCApi.h" +#include "oic_malloc.h" + +#include "EasySetup.h" +#include "ESRichCommon.h" + +#define PROV_RESOURCE_TYPE "ocf.wk.prov" + +using namespace OIC::Service; + +class ESMediatorSimulator +{ +private: + std::function resource)> m_discoveryCb; + std::function status)> m_getConfigurationCb; + std::function)> m_getStatusCb; + std::function)> m_DevicePropProvisioningCb; + std::function)> m_CloudPropProvisioningCb; + + std::shared_ptr m_remoteEnrollee; + +public: + ESMediatorSimulator() + : m_remoteEnrollee(), m_discoveryCb(), m_getConfigurationCb(), m_getStatusCb(), + m_DevicePropProvisioningCb(), m_CloudPropProvisioningCb() + { + }; + ~ESMediatorSimulator() = default; + + ESMediatorSimulator(const ESMediatorSimulator &) = delete; + ESMediatorSimulator & operator = (const ESMediatorSimulator &) = delete; + + ESMediatorSimulator(ESMediatorSimulator &&) = delete; + ESMediatorSimulator & operator = (ESMediatorSimulator &&) = delete; + + void discoverRemoteEnrollee(std::function resource)> cb) + { + m_discoveryCb = cb; + std::string uri = std::string("/oic/res?rt=") + PROV_RESOURCE_TYPE; + OC::OCPlatform::findResource("", uri, + OCConnectivityType::CT_DEFAULT, + std::bind(&ESMediatorSimulator::discoverRemoteEnrolleeCb, + this, std::placeholders::_1)); + + } + + void getConfiguration(std::function)> cb) + { + m_getConfigurationCb = cb; + m_remoteEnrollee = NULL; + std::string uri = std::string("/oic/res?rt=") + PROV_RESOURCE_TYPE; + OC::OCPlatform::findResource("", uri, + OCConnectivityType::CT_DEFAULT, + std::bind(&ESMediatorSimulator::discoverRemoteEnrolleeCbToGetConfiguration, + this, std::placeholders::_1)); + } + + void getStatus(std::function)> cb) + { + m_getStatusCb = cb; + m_remoteEnrollee = NULL; + std::string uri = std::string("/oic/res?rt=") + PROV_RESOURCE_TYPE; + OC::OCPlatform::findResource("", uri, + OCConnectivityType::CT_DEFAULT, + std::bind(&ESMediatorSimulator::discoverRemoteEnrolleeCbToGetStatus, + this, std::placeholders::_1)); + } + + void provisionDeviceProperties(std::function)> cb) + { + m_DevicePropProvisioningCb = cb; + m_remoteEnrollee = NULL; + std::string uri = std::string("/oic/res?rt=") + PROV_RESOURCE_TYPE; + OC::OCPlatform::findResource("", uri, + OCConnectivityType::CT_DEFAULT, + std::bind(&ESMediatorSimulator::discoverRemoteEnrolleeCbToProvisionDeviceProperties, + this, std::placeholders::_1)); + } + + void provisionCloudProperties(std::function)> cb) + { + m_CloudPropProvisioningCb = cb; + m_remoteEnrollee = NULL; + std::string uri = std::string("/oic/res?rt=") + PROV_RESOURCE_TYPE; + OC::OCPlatform::findResource("", uri, + OCConnectivityType::CT_DEFAULT, + std::bind(&ESMediatorSimulator::discoverRemoteEnrolleeCbToProvisionCloudProperties, + this, std::placeholders::_1)); + } + +private: + + void discoverRemoteEnrolleeCb(std::shared_ptr resource) + { + if(!resource->getResourceTypes().at(0).compare(PROV_RESOURCE_TYPE) && m_discoveryCb) + { + m_discoveryCb(resource); + m_discoveryCb = NULL; + } + } + + void getConfigurationCallback(std::shared_ptr< GetConfigurationStatus > getConfigurationStatus) + { + if(m_getConfigurationCb != NULL) + { + m_getConfigurationCb(getConfigurationStatus); + m_getConfigurationCb = NULL; + } + } + + void discoverRemoteEnrolleeCbToGetConfiguration(std::shared_ptr resource) + { + if(!resource->getResourceTypes().at(0).compare(PROV_RESOURCE_TYPE) && m_getConfigurationCb + && !m_remoteEnrollee) + { + m_remoteEnrollee = EasySetup::getInstance()->createRemoteEnrollee(resource); + + if(m_remoteEnrollee != NULL) + { + m_remoteEnrollee->getConfiguration(std::bind( + &ESMediatorSimulator::getConfigurationCallback, this, std::placeholders::_1)); + } + } + } + + void getStatusCallback(std::shared_ptr< GetEnrolleeStatus > getEnrolleeStatus) + { + if(m_getStatusCb != NULL) + { + m_getStatusCb(getEnrolleeStatus); + m_getStatusCb = NULL; + } + } + + void discoverRemoteEnrolleeCbToGetStatus(std::shared_ptr resource) + { + if(!resource->getResourceTypes().at(0).compare(PROV_RESOURCE_TYPE) && m_getStatusCb + && !m_remoteEnrollee) + { + m_remoteEnrollee = EasySetup::getInstance()->createRemoteEnrollee(resource); + + if(m_remoteEnrollee != NULL) + { + m_remoteEnrollee->getStatus(std::bind( + &ESMediatorSimulator::getStatusCallback, this, std::placeholders::_1)); + } + } + } + + void deviceProvisioningStatusCallback(std::shared_ptr< DevicePropProvisioningStatus > + devicePropProvisioningStatus) + { + if(m_DevicePropProvisioningCb != NULL) + { + m_DevicePropProvisioningCb(devicePropProvisioningStatus); + m_DevicePropProvisioningCb = NULL; + } + } + + void discoverRemoteEnrolleeCbToProvisionDeviceProperties(std::shared_ptr resource) + { + if(!resource->getResourceTypes().at(0).compare(PROV_RESOURCE_TYPE) && + m_DevicePropProvisioningCb && !m_remoteEnrollee) + { + m_remoteEnrollee = EasySetup::getInstance()->createRemoteEnrollee(resource); + + if(m_remoteEnrollee != NULL) + { + DeviceProp devProp; + devProp.setWiFiProp("Iotivity_SSID", "Iotivity_PWD", WPA2_PSK, TKIP_AES); + devProp.setDevConfProp("korean", "Korea"); + + m_remoteEnrollee->provisionDeviceProperties(devProp, + std::bind(&ESMediatorSimulator::deviceProvisioningStatusCallback, + this, std::placeholders::_1)); + } + } + } + + void cloudProvisioningStatusCallback(std::shared_ptr< CloudPropProvisioningStatus > + cloudPropProvisioningStatus) + { + if(m_CloudPropProvisioningCb != NULL) + { + m_CloudPropProvisioningCb(cloudPropProvisioningStatus); + if(cloudPropProvisioningStatus->getESCloudState() == ES_CLOUD_PROVISIONING_SUCCESS) + { + m_CloudPropProvisioningCb = NULL; + } + } + } + + void discoverRemoteEnrolleeCbToProvisionCloudProperties(std::shared_ptr resource) + { + if(!resource->getResourceTypes().at(0).compare(PROV_RESOURCE_TYPE) && + m_CloudPropProvisioningCb && !m_remoteEnrollee) + { + m_remoteEnrollee = EasySetup::getInstance()->createRemoteEnrollee(resource); + + if(m_remoteEnrollee != NULL) + { + CloudProp cloudProp; + cloudProp.setCloudProp("authCode", "authProvider", "ciServer"); + + m_remoteEnrollee->provisionCloudProperties(cloudProp, + std::bind(&ESMediatorSimulator::cloudProvisioningStatusCallback, + this, std::placeholders::_1)); + } + } + } +}; + + +#endif //_NS_CONSUMER_SIMULATOR_H_ + diff --git a/service/easy-setup/enrollee/unittests/SConscript b/service/easy-setup/enrollee/unittests/SConscript index 009f3f1..0a25af4 100644 --- a/service/easy-setup/enrollee/unittests/SConscript +++ b/service/easy-setup/enrollee/unittests/SConscript @@ -1,4 +1,5 @@ -####################################################################### +#****************************************************************** +# # Copyright 2016 Samsung Electronics All Rights Reserved. # #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= @@ -17,73 +18,70 @@ # #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -import os -import os.path +## +# Notification Unit Test build script +## + +Import('env') + +if env.get('RELEASE'): + env.AppendUnique(CCFLAGS = ['-Os']) + env.AppendUnique(CPPDEFINES = ['NDEBUG']) +else: + env.AppendUnique(CCFLAGS = ['-g']) + +if env.get('LOGGING'): + env.AppendUnique(CPPDEFINES = ['TB_LOG']) + +lib_env = env.Clone() +SConscript(env.get('SRC_DIR') + '/service/third_party_libs.scons', 'lib_env') + +###################################################################### +#unit test setting +###################################################################### +src_dir = lib_env.get('SRC_DIR') +gtest_dir = src_dir + '/extlibs/gtest/gtest-1.7.0' -# SConscript file for Local PKI google tests -gtest_env = SConscript('#extlibs/gtest/SConscript') -enrollee_test_env = gtest_env.Clone() -src_dir = enrollee_test_env.get('SRC_DIR') -target_os = enrollee_test_env.get('TARGET_OS') +easysetup_test_env = lib_env.Clone() +target_os = env.get('TARGET_OS') ###################################################################### # Build flags ###################################################################### +GTest = File(gtest_dir + '/lib/.libs/libgtest.a') +GTest_Main = File(gtest_dir + '/lib/.libs/libgtest_main.a') + +easysetup_test_env.AppendUnique(LIBPATH = [lib_env.get('BUILD_DIR')]) +easysetup_test_env.AppendUnique(LIBS = [ + 'connectivity_abstraction', 'oc', 'octbstack', 'oc_logger', 'coap', + GTest_Main, GTest]) + +if target_os not in ['windows', 'winrt']: + easysetup_test_env.AppendUnique(CXXFLAGS = ['-O2', '-g', '-Wall', '-fmessage-length=0', '-std=c++0x']) + +easysetup_test_env.AppendUnique(CXXFLAGS = ['-pthread']) +easysetup_test_env.AppendUnique(LIBS = ['pthread']) + +easysetup_test_env.PrependUnique(CPPPATH = [ src_dir + '/extlibs/hippomocks-master', gtest_dir + '/include']) -enrollee_test_env.PrependUnique(CPPPATH = [ - enrollee_test_env.get('SRC_DIR') + '/resource/c_common/ocrandom/include', - enrollee_test_env.get('SRC_DIR') + '/resource/csdk/stack/include/internal', - enrollee_test_env.get('SRC_DIR') + '/resource/csdk/connectivity/api', - enrollee_test_env.get('SRC_DIR') + '/resource/c_common/oic_malloc/include', - enrollee_test_env.get('SRC_DIR') + '/resource/include', - enrollee_test_env.get('SRC_DIR') + '/resource/csdk/logger/include', - enrollee_test_env.get('SRC_DIR') + '/resource/oc_logger/include', - enrollee_test_env.get('SRC_DIR') + '/resource/csdk/stack/include', - enrollee_test_env.get('SRC_DIR') + '/resource/csdk/stack/include/internal', - enrollee_test_env.get('SRC_DIR') + '/resource/csdk/logger/include', - enrollee_test_env.get('SRC_DIR') + '/resource/csdk/security/include', - enrollee_test_env.get('SRC_DIR') + '/extlibs/cjson', - enrollee_test_env.get('SRC_DIR') + '/extlibs/sqlite3', - enrollee_test_env.get('SRC_DIR') + '/service/easy-setup/inc', - enrollee_test_env.get('SRC_DIR') + '/service/easy-setup/enrollee/linux/wifi', - enrollee_test_env.get('SRC_DIR') + '/service/easy-setup/enrollee/inc', - enrollee_test_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src']) - -enrollee_test_env.AppendUnique(LIBPATH = [enrollee_test_env.get('BUILD_DIR')]) -enrollee_test_env.PrependUnique(LIBS = [ 'octbstack', - 'ocsrm', - 'connectivity_abstraction', - 'coap']) -if target_os not in ['windows']: - enrollee_test_env.AppendUnique(LIBS = ['m']) - -if target_os != 'darwin': - enrollee_test_env.PrependUnique(LIBS = ['oc_logger']) - -if enrollee_test_env.get('SECURED') == '1': - enrollee_test_env.AppendUnique(LIBS = ['tinydtls']) - -if enrollee_test_env.get('LOGGING'): - enrollee_test_env.AppendUnique(CPPDEFINES = ['TB_LOG']) - -if enrollee_test_env.get('ES_SOFTAP_MODE') == 'ENROLLEE_SOFTAP': - print "ES_SOFTAP_MODE == ENROLLEE_SOFTAP" - enrollee_test_env.AppendUnique(CPPDEFINES = ['ENROLLEE_SOFTAP']) - -enrollee_test_env.PrependUnique(LIBS = ['ESEnrolleeSDK']) +easysetup_test_env.AppendUnique(CPPPATH = ['../../../../resource/include', + '../inc', + '../../inc', + '../../mediator/richsdk/inc']) ###################################################################### -# Source files and Targets +# Build Test ###################################################################### -enrolleetests = enrollee_test_env.Program('enrolleetests', ['enrolleetests.cpp']) -Alias("test", [enrolleetests]) +easysetup_enrollee_test_env = easysetup_test_env.Clone() +easysetup_enrollee_test_env.AppendUnique(LIBS = ['ESEnrolleeSDK', 'ESMediatorRich']) -enrolleetests.AppendTarget('test') -if enrollee_test_env.get('TEST') == '1': - if target_os in ['linux']: - from tools.scons.RunTest import * - run_test(enrollee_test_env, - '', - 'service/easy-setup/enrollee/unittests/enrolleetests') +easysetup_enrollee_test_src = env.Glob('./ESEnrolleeTest.cpp') +easysetup_enrollee_test = easysetup_enrollee_test_env.Program('easysetup_enrollee_test', easysetup_enrollee_test_src) +Alias("easysetup_enrollee_test", easysetup_enrollee_test) +env.AppendTarget('easysetup_enrollee_test') +if env.get('TEST') == '1': + if target_os == 'linux': + from tools.scons.RunTest import * + run_test(easysetup_enrollee_test_env, '', 'service/easy-setup/enrollee/unittests/easysetup_enrollee_test') diff --git a/service/easy-setup/enrollee/unittests/enrolleetests.cpp b/service/easy-setup/enrollee/unittests/enrolleetests.cpp deleted file mode 100644 index 9732b20..0000000 --- a/service/easy-setup/enrollee/unittests/enrolleetests.cpp +++ /dev/null @@ -1,303 +0,0 @@ -//****************************************************************** -// -// Copyright 2016 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -/** - * @file - * - * This file contains the implementation for EasySetup Enrollee testcases - */ - -#include "gtest/gtest.h" -#include -#include -#include -#include -#include -#include - -//----------------------------------------------------------------------------- -// Includes -//----------------------------------------------------------------------------- -#include -#include - -#include -#include - -#include "ocstack.h" -#include "logger.h" -#include "oic_malloc.h" -#include "escommon.h" -#include "easysetup.h" -#include "onboarding.h" -#include "resourcehandler.h" -#include "softap.h" -#include "easysetupcallbacks.h" - -#include "gtesthelper.h" - -using namespace std; - -namespace itst = iotivity::test; - -#define DEFAULT_CONTEXT_VALUE 0x99 - -//----------------------------------------------------------------------------- -// Private variables -//----------------------------------------------------------------------------- -static const char TAG[] = "TestHarness"; - -char ssid[] = "EasySetup123"; -char passwd[] = "EasySetup123"; - -//----------------------------------------------------------------------------- -// Callback functions -//----------------------------------------------------------------------------- -extern "C" void EventCallbackInApplication(ESResult esResult, - ESEnrolleeState enrolleeState) -{ - OIC_LOG(INFO, TAG, "Entering EventCallbackInApplication"); - - if(esResult != ES_OK) - { - cout<<"Easy stup is failed at Enrollee state = "< -#include -#include -#include -#include -#include - -namespace iotivity -{ - namespace test - { - /** - * Simple implementation of a deadman's timer that can be used to - * terminate a test that hangs. - * - * Since there is no standard way to terminate an individual thread, - * the entire process will be killed once time has been exceeded. - * - * @note provisions for watchdog thread cleanup are not currently added. - * Testing has not yet shown any need for such complexity. - */ - class DeadmanTimer - { - public: - - /** - * Creates an instance of a timer set to kill the running process - * after the specified timeout. - * - * If the destructor is invoked before time is up (aka this instance - * goes out of scope) the timeout will not cause the program to be - * terminated. - * - * @param time to wait before assuming the process is hung and must be - * killed. - * Examples of values that can be passed include - * std::chrono::milliseconds(250), std::chrono::seconds(5), - * std::chrono::minutes(3). - */ - DeadmanTimer(std::chrono::milliseconds timeout) : - m_ctx(new DeadmanCtx(timeout)), - m_thread() - { - m_thread = std::thread([this](){run(m_ctx);}); - { - std::unique_lock lock(m_ctx->m_mutex); - while (!m_ctx->m_isArmed) - { - m_ctx->m_cond.wait(lock); - } - } - // Now that the thread is live, we can stop tracking it. - m_thread.detach(); - } - - /** - * Destructor that also will cancel the termination of the - * running process. - */ - ~DeadmanTimer() - { - std::unique_lock lock(m_ctx->m_mutex); - m_ctx->m_isArmed = false; - } - - private: - - /** - * Shared data that main and child thread might both need to - * access. - * - * Avoids referencing data in class instances that have been - * deleted. - */ - class DeadmanCtx - { - public: - - DeadmanCtx(std::chrono::milliseconds timeout) : - m_mutex(), - m_cond(), - m_isArmed(false), - m_timeout(timeout) - { - } - - std::mutex m_mutex; - std::condition_variable m_cond; - bool m_isArmed; - std::chrono::milliseconds m_timeout; - }; - - // Explicitly block assignment and copy ctor - DeadmanTimer &operator=(const DeadmanTimer &rhs); - DeadmanTimer(const iotivity::test::DeadmanTimer &rhs); - - std::shared_ptr m_ctx; - std::thread m_thread; - - - static void run(std::shared_ptr ctx) - { - // Let the calling thread know it can stop waiting: - { - std::unique_lock lock(ctx->m_mutex); - ctx->m_isArmed = true; - ctx->m_cond.notify_all(); - } - - std::this_thread::sleep_for(ctx->m_timeout); - - std::unique_lock lock(ctx->m_mutex); - if (ctx->m_isArmed) - { - try { - throw std::runtime_error("deadman timer expired"); - } - catch (std::exception&) - { - std::terminate(); - } - } - } - }; - } // namespace test -} // namespace iotivity - -#endif // IOTY_GTEST_HELPER_H diff --git a/service/easy-setup/inc/escommon.h b/service/easy-setup/inc/escommon.h index 17ec815..1aa1a3a 100755 --- a/service/easy-setup/inc/escommon.h +++ b/service/easy-setup/inc/escommon.h @@ -24,12 +24,15 @@ #include "ocstack.h" #include "octypes.h" +#ifdef __cplusplus +extern "C" +{ +#endif + // Defines #define OIC_STRING_MAX_VALUE 100 #define IPV4_ADDR_SIZE 16 #define IP_PORT 55555 -#define NET_WIFI_SSID_SIZE 100 -#define NET_WIFI_PWD_SIZE 100 /** * @brief Mac address length for BT port @@ -39,47 +42,90 @@ /** * Attributes used to form a proper easysetup conforming JSON message. */ -#define OC_RSRVD_ES_PS "ps" -#define OC_RSRVD_ES_TNN "tnn" -#define OC_RSRVD_ES_CD "cd" -#define OC_RSRVD_ES_TR "tr" -#define OC_RSRVD_ES_TNT "tnt" -#define OC_RSRVD_ES_ANT "ant" +#define OC_RSRVD_ES_PROVSTATUS "ps" +#define OC_RSRVD_ES_LAST_ERRORCODE "lec" +#define OC_RSRVD_ES_LINKS "links" +#define OC_RSRVD_ES_SUPPORTEDWIFIMODE "swmt" +#define OC_RSRVD_ES_SUPPORTEDWIFIFREQ "swf" +#define OC_RSRVD_ES_SSID "tnn" +#define OC_RSRVD_ES_CRED "cd" +#define OC_RSRVD_ES_AUTHTYPE "wat" +#define OC_RSRVD_ES_ENCTYPE "wet" +#define OC_RSRVD_ES_AUTHCODE "ac" +#define OC_RSRVD_ES_AUTHPROVIDER "apn" +#define OC_RSRVD_ES_CISERVER "cis" +#define OC_RSRVD_ES_SERVERID "sid" +#define OC_RSRVD_ES_DEVNAME "dn" +#define OC_RSRVD_ES_LANGUAGE "lang" +#define OC_RSRVD_ES_COUNTRY "ctry" /** * Easysetup defined resoruce types and uris. */ -#define OC_RSRVD_ES_PROV_RES_TYPE "oic.r.prov" -#define OC_RSRVD_ES_URI_PROV "/oic/prov" -#define OC_RSRVD_ES_URI_NET "/oic/net" +#define OC_RSRVD_ES_RES_TYPE_PROV "ocf.wk.prov" +#define OC_RSRVD_ES_URI_PROV "/ProvisioningResURI" +#define OC_RSRVD_ES_RES_TYPE_WIFI "ocf.wk.wifi" +#define OC_RSRVD_ES_URI_WIFI "/WiFiProvisioningResURI" +#define OC_RSRVD_ES_RES_TYPE_CLOUDSERVER "ocf.wk.cloudserver" +#define OC_RSRVD_ES_URI_CLOUDSERVER "/CloudServerProvisioningResURI" +#define OC_RSRVD_ES_RES_TYPE_DEVCONF "ocf.wk.devconf" +#define OC_RSRVD_ES_URI_DEVCONF "/DevConfProvisioningResURI" + +#define NUM_WIFIMODE 10 +#define MAX_SSIDLEN 33 +#define MAX_CREDLEN 20 + +#define MAX_DEVICELEN 100 +#define MAX_WEBLINKLEN 100 /** - * @brief Defines for Provisioning status accepted values + * @brief Supported WIFI frequency like 2.4G and 5G */ -#define ES_PS_NEED_PROVISIONING 1 -#define ES_PS_PROVISIONING_COMPLETED 2 -#define ES_PS_TRIGGER_INIT_VALUE 0 -#define ES_PS_TRIGGER_CONNECTION 1 +typedef enum +{ + WIFI_24G = 0, /**< 2.4G **/ + WIFI_5G, /**< 5G **/ + WIFI_BOTH, /**< 2.4G and 5G **/ + WIFI_FREQ_NONE /**< EOF **/ +} WIFI_FREQ; + +/** + * @brief Supported WIFI mode like 802.11g and 802.11n + */ +typedef enum +{ + WIFI_11A = 0, /**< 802.11a **/ + WIFI_11B, /**< 802.11b **/ + WIFI_11G, /**< 802.11g **/ + WIFI_11N, /**< 802.11n **/ + WIFI_11AC, /**< 802.11ac **/ + WiFi_EOF = 999 +} WIFI_MODE; /** -* Device Roles defined for each device type used in easy setup -*/ + * @brief WIFI Authentication tlype of the Enroller + */ typedef enum { - ENROLLEE, - MEDIATOR, - ENROLLER, -} DeviceRole; + NONE_AUTH = 0, /**< NO authentication **/ + WEP, /**< WEP **/ + WPA_PSK, /**< WPA-PSK **/ + WPA2_PSK /**< WPA2-PSK **/ +} WIFI_AUTHTYPE; /** -* On-boarding connection to create Adhoc network. -*/ + * @brief WIFI encryption type of the Enroller + */ typedef enum { - SOFTAP, - BLE, -} OBConnection; + NONE_ENC = 0, /**< NO encryption **/ + WEP_64, /**< WEP-64 **/ + WEP_128, /**< WEP-128**/ + TKIP, /**< TKIP **/ + AES, /**< AES **/ + TKIP_AES /**< TKIP-AES **/ +} WIFI_ENCTYPE; typedef enum { @@ -93,157 +139,100 @@ typedef enum ES_RECVREQOFNETRES, ES_RECVUPDATEOFPROVRES, ES_RECVTRIGGEROFPROVRES, + ES_UNAUTHORIZED = 31, + ES_UNSUPPORTED_OPERATION = 41 } ESResult; +/** + * @brief Indicate which resource is created in Enrollee + */ typedef enum { - /** - * Default state of the device - */ - ES_INIT_STATE, - - /** - * Device will move to this state once the on boarding begins - */ - ES_ON_BOARDING_STATE, + ES_WIFI_RESOURCE = 0x01, + ES_CLOUD_RESOURCE = 0x02, + ES_DEVCONF_RESOURCE = 0x04 +} ESResourceMask; +/** + * @brief Indicate enrollee and provisioning status. Provisioning status is shown in "provisioning + * status" property in provisioning resource. + */ +typedef enum +{ /** - * Device will move to this state after successful on-boarding of the device + * Default state of the device */ - ES_ON_BOARDED_STATE, + ES_STATE_INIT = 0, /** - * Device will move to this state once the on boarding is done - */ - ES_PROVISIONING_STATE, + * Status indicating being cnnecting to target network + */ + ES_STATE_CONNECTING_TO_ENROLLER, /** - * Easy setup process is successful. - */ - ES_PROVISIONED_STATE, + * Status indicating successful conection to target network + */ + ES_STATE_CONNECTED_TO_ENROLLER, /** - * This state is arbitrary one, any time device can come into this state - * Device will move to this state if the ownership transfer initiated by the Application - */ - ES_OWNERSHIP_TRANSFERRING_STATE, + * Status indicating failure connection to target network + */ + ES_STATE_CONNECTED_FAIL_TO_ENROLLER, /** - * This state is arbitrary one, any time device can come into this state - * Device will move to this state if the ownership transfer is completed - */ - ES_OWNERSHIP_TRANSFERRED_STATE, + * Status indicating successful registration to cloud + */ + ES_STATE_REGISTERED_TO_CLOUD, /** - * This state is arbitrary one, any time device can come into this state - * Device will move to this state once the Application factory reset the device - */ - ES_FACTORY_RESET_STATE, - - /** - * Enrollee moves to this state after connecting to target network - */ - ES_ON_BOARDED_TARGET_NETWORK_STATE, -}ESEnrolleeState; - -/** - * Provisioning Device Status - */ -typedef struct -{ - // Address of remote server - OCDevAddr * addr; - // Indicates adaptor type on which the response was received - OCConnectivityType connType; -} EasySetupDeviceInfo; + * Status indicating failure registeration to cloud + */ + ES_STATE_REGISTRRED_FAIL_TO_CLOUD +} ESEnrolleeState, ProvStatus; /** - * Provosioning Status + * @brief Indicate last error code to describe a reason of error during easy setup. */ typedef enum { - DEVICE_PROVISIONED = 0, - DEVICE_NOT_PROVISIONED, - DEVICE_OWNED, - DEVICE_NOT_OWNED -} EasySetupState, ProvStatus; - -/** - * Response from queries to remote servers. - */ -typedef struct -{ - // EasySetup Status - EasySetupState provStatus; - // EasySetup Device Info - EasySetupDeviceInfo provDeviceInfo; -} EasySetupInfo, ProvisioningInfo; - -/** - * @brief Network information of the Enroller - */ -typedef union -{ /** - * @brief BT Mac Information + * Init Error Code */ - struct - { - char btMacAddress[NET_MACADDR_SIZE]; /**< BT mac address **/ - } BT; + ES_ERRCODE_NO_ERROR = 0, /** - * @brief LE MAC Information - */ - struct - { - char leMacAddress[NET_MACADDR_SIZE]; /**< BLE mac address **/ - } LE; + * Error Code that given WiFi's SSID is not found + */ + ES_ERRCODE_SSID_NOT_FOUND, /** - * @brief IP Information - */ - struct - { - char ssid[NET_WIFI_SSID_SIZE]; /**< ssid of the Enroller**/ - char pwd[NET_WIFI_PWD_SIZE]; /**< pwd of the Enroller**/ - } WIFI; -} ProvData; - -/** - * @brief Network Information - */ -typedef struct -{ - ProvData provData; /**< Enroller Network Info**/ - OCConnectivityType connType; /**< Connectivity Type**/ -} ProvConfig; - -/** - * Client applications implement this callback to consume responses received from Servers. - */ -typedef void (*OCProvisioningStatusCB)(EasySetupInfo *easySetupInfo); + * Error Code that given WiFi's Password is wrong + */ + ES_ERRCODE_PW_WRONG, -/** - * @brief This structure represent configuration information to create wifi onboarding SoftAP or connection. -*/ + /** + * Error Code that IP address is not allocated + */ + ES_ERRCODE_IP_NOT_ALLOCATED, + /** + * Error Code that there is no Internet connection + */ + ES_ERRCODE_NO_INTERNETCONNECTION, -// Note : Below structure is not currently used but added for future purpose. -typedef struct { - char ssid[NET_WIFI_SSID_SIZE]; /**< ssid of the onboarding Adhoc Wifi network**/ - char pwd[NET_WIFI_PWD_SIZE]; /**< pwd of the onboarding Adhoc wifi network**/ - bool isSecured; /**< Secure connection**/ -}WiFiOnboardingConfig; + /** + * Error Code that Timeout occured + */ + ES_ERRCODE_TIMEOUT, -/** - * @brief This structure represent onboarding connection instance. -*/ -typedef struct { - /*Actual use of ipAddress is for unicast discovery, but also used to identify the Enrollee device as of now, - device identification should be based on DeviceID in next release.*/ - char ipAddress[IPV4_ADDR_SIZE]; /**< IP Address of the Enrollee **/ - bool isSecured; /**< Secure connection**/ -}WiFiOnboadingConnection; + /** + * Error Code that Unknown error occured + */ + ES_ERRCODE_UNKNOWN +} ESErrorCode; + +#ifdef __cplusplus +} +#endif #endif //ES_COMMON_H_ diff --git a/service/easy-setup/mediator/SConscript b/service/easy-setup/mediator/SConscript index 0e35382..060afac 100644 --- a/service/easy-setup/mediator/SConscript +++ b/service/easy-setup/mediator/SConscript @@ -25,9 +25,6 @@ Import('env') target_os = env.get('TARGET_OS') -# Build easy-setup Mediator C SDK -SConscript('csdk/SConscript') - # Build easy-setup Mediator Rich [C++] SDK SConscript('richsdk/SConscript') diff --git a/service/easy-setup/mediator/csdk/SConscript b/service/easy-setup/mediator/csdk/SConscript deleted file mode 100644 index 434520e..0000000 --- a/service/easy-setup/mediator/csdk/SConscript +++ /dev/null @@ -1,137 +0,0 @@ -#****************************************************************** -# -# Copyright 2016 Samsung Electronics All Rights Reserved. -# -#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -###################################################################### -# easy-setup Mediator CSDK build script -###################################################################### - -import os - -Import('env') - -env.AppendUnique(CPPDEFINES = ['EASY_SETUP_CA_INIT']) - -if env.get('RELEASE'): - env.AppendUnique(CCFLAGS = ['-Os']) - env.AppendUnique(CPPDEFINES = ['NDEBUG']) -else: - env.AppendUnique(CCFLAGS = ['-g']) - -if env.get('LOGGING'): - env.AppendUnique(CPPDEFINES = ['TB_LOG']) - -# Easysetup provides reference implemenation of Arduino Enrollee. -# Mediator applications developed on different platforms will be default defining the -# flag 'REMOTE_ARDUINO_ENROLEE'. If the target Enrollee is not Arduino, the below commented -# modifications must be enabled instead (and the existing define must be commented). -# -##### The following lines must be uncommented, if target Enrollee is not Arduino -target_enrollee = env.get('ES_TARGET_ENROLLEE') -if target_enrollee == 'arduino': - print "REMOTE_ARDUINO_ENROLEE flag is defined." - print "The Mediator application will be working only with Arduino Enrollee." - env.AppendUnique(CPPDEFINES = ['REMOTE_ARDUINO_ENROLEE']) - -lib_env = env.Clone() -easy_setup_env = env.Clone() - -target_os = env.get('TARGET_OS') - -if target_os in ['android']: - # Add third party libraries - SConscript('#service/third_party_libs.scons', 'lib_env') - -###################################################################### -# Build flags -###################################################################### - -easy_setup_env.AppendUnique(CPPPATH = ['inc', 'src','../../inc']) -easy_setup_env.AppendUnique(CXXFLAGS = ['-std=c++0x', '-Wall']) -if target_os in ['linux']: - easy_setup_env.AppendUnique(LIBS = ['pthread', 'dl']) - - -###################################################################### -# Linux Mediator -###################################################################### -if target_os in ['linux']: - easy_setup_env.AppendUnique(LIBPATH = [env.get('BUILD_DIR')]) - easy_setup_env.AppendUnique(RPATH = [env.get('BUILD_DIR')]) - easy_setup_env.AppendUnique(CXXFLAGS = ['-pthread']) - easy_setup_env.PrependUnique(LIBS = ['oc', 'octbstack', 'oc_logger', 'pthread', 'connectivity_abstraction']) - -###################################################################### -# Android Mediator -###################################################################### -if target_os == 'android': - easy_setup_env.AppendUnique(LIBPATH = [env.get('BUILD_DIR')]) - easy_setup_env.AppendUnique(RPATH = [env.get('BUILD_DIR')]) - easy_setup_env.AppendUnique(CXXFLAGS = ['-frtti', '-fexceptions']) - easy_setup_env.PrependUnique(LIBS = ['oc', 'octbstack', 'oc_logger', 'connectivity_abstraction', 'gnustl_shared']) - if not env.get('RELEASE'): - easy_setup_env.AppendUnique(LIBS = ['log']) - - -if target_os in ['android','linux']: - easy_setup_env.PrependUnique(CPPPATH = [ - env.get('SRC_DIR') + '/resource/c_common/oic_malloc/include', - env.get('SRC_DIR') + '/resource/csdk/connectivity/common/inc', - env.get('SRC_DIR') + '/resource/csdk/connectivity/api', - env.get('SRC_DIR') + '/resource/csdk/stack/include', - env.get('SRC_DIR') + '/resource/csdk/security/include', - env.get('SRC_DIR') + '/extlibs/cjson', - env.get('SRC_DIR') + '/service/easy-setup/inc', - 'inc']) - -###################################################################### -# Source files and Targets -###################################################################### - -if target_os == 'android': - es_m_csdk_static = easy_setup_env.StaticLibrary('libESMediatorCSDK', - ['src/provisioningapi.cpp', - 'src/wifiprovisioning.cpp', - 'src/provisioning.cpp']) - easy_setup_env.InstallTarget(es_m_csdk_static, 'libESMediatorCSDK') - -if target_os in ['linux']: - es_m_csdk_shared = easy_setup_env.SharedLibrary('ESMediatorCSDK', - ['src/provisioningapi.cpp', - 'src/wifiprovisioning.cpp', - 'src/provisioning.cpp']) - easy_setup_env.InstallTarget(es_m_csdk_shared, 'libESMediatorCSDK') - - #Go to build sample apps - SConscript('../../sampleapp/mediator/linux/csdk_sample/SConscript') - -###################################################################### -#Build UnitTestcases for Mediator[CSDK] -################################################ ###################### -if target_os in ['linux']: - SConscript('unittests/SConscript') - - - - - - - - - diff --git a/service/easy-setup/mediator/csdk/inc/provisioning.h b/service/easy-setup/mediator/csdk/inc/provisioning.h deleted file mode 100755 index f9a6d61..0000000 --- a/service/easy-setup/mediator/csdk/inc/provisioning.h +++ /dev/null @@ -1,119 +0,0 @@ -//****************************************************************** -// -// Copyright 2015 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -#ifndef __ES_PROVISIONING_HANDLER_H_ -#define __ES_PROVISIONING_HANDLER_H_ - -#include "octypes.h" - -#include "logger.h" -#include "ocstack.h" -#include "escommon.h" - -//----------------------------------------------------------------------------- -// Defines -//----------------------------------------------------------------------------- -#define EASY_SETUP_DEFAULT_CONTEXT_VALUE 0x99 - -/** - * List of methods that can be inititated from the client - */ -OCStackResult InitProvisioningHandler(); - -OCStackResult TerminateProvisioningHandler(); - -OCStackResult GetProvisioningStatus(OCQualityOfService qos, const char *query, - const OCDevAddr *destination); - -OCStackResult StartProvisioningProcess(const ProvConfig *netInfo, - WiFiOnboadingConnection *onboardConn, OCProvisioningStatusCB provisioningStatusCallback, - char *findResQuery); - -void StopProvisioningProcess(); - -/** - * Internal worker functions. - */ -OCStackResult TriggerNetworkConnection(OCQualityOfService qos, const char *query, - const char *resUri, OCDevAddr *destination, int /*pauseBeforeStart*/); - -OCStackApplicationResult TriggerNetworkConnectionResponse(void *ctx, OCDoHandle handle, - OCClientResponse *clientResponse); - -OCStackApplicationResult ProvisionEnrolleeResponse(void *ctx, OCDoHandle handle, - OCClientResponse *clientResponse); - -OCStackResult ProvisionEnrollee(OCQualityOfService qos, const char *query, const char *resUri, - OCDevAddr *destination, int pauseBeforeStart); - -OCStackApplicationResult GetProvisioningStatusResponse(void *ctx, OCDoHandle handle, - OCClientResponse *clientResponse); - -OCStackResult InvokeOCDoResource(const char *query, OCMethod method, const OCDevAddr *dest, - OCQualityOfService qos, OCClientResponseHandler cb, OCRepPayload *payload, - OCHeaderOption *options, uint8_t numOptions); - -OCStackApplicationResult FindProvisioningResourceResponse(void *ctx, OCDoHandle handle, - OCClientResponse *clientResponse); - -void *FindProvisioningResource(void *data); - -ProvisioningInfo *PrepareProvisioingStatusCB(OCClientResponse *clientResponse, - ProvStatus provStatus); - -/** - * Internal Util functions. - */ -void LogProvisioningResponse(OCRepPayloadValue * val); - -bool ConfigEnrolleeObject(const ProvConfig *netInfo, WiFiOnboadingConnection *onboardConn); - -bool ClearMemory(); - -void SuccessCallback(OCClientResponse * clientResponse); - -void ErrorCallback(ProvStatus status); - -bool ValidateEnrolleeResponse(OCClientResponse * clientResponse); - -bool ValidateFindResourceResponse(OCClientResponse * clientResponse); - -bool ValidateEnrolleeBasicResponse(OCClientResponse * clientResponse); - -ProvisioningInfo *GetCallbackObjectOnSuccess(OCClientResponse *clientResponse, - ProvStatus provStatus); - -ProvisioningInfo *GetCallbackObjectOnError(ProvStatus status); - -ProvisioningInfo *CreateCallBackObject(); - -bool ResetProgress(); - -bool SetProgress(OCProvisioningStatusCB provisioningStatusCallback); - -bool InProgress(); - -bool ValidateEasySetupParams(const ProvConfig *netInfo, WiFiOnboadingConnection *onboardConn, - OCProvisioningStatusCB provisioningStatusCallback); - -bool IsSetupStopped(); - -#endif //__ES_PROVISIONING_HANDLER_H_ - diff --git a/service/easy-setup/mediator/csdk/inc/provisioningapi.h b/service/easy-setup/mediator/csdk/inc/provisioningapi.h deleted file mode 100755 index 5fa60fa..0000000 --- a/service/easy-setup/mediator/csdk/inc/provisioningapi.h +++ /dev/null @@ -1,56 +0,0 @@ -//****************************************************************** -// -// Copyright 2015 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -#ifndef __EASYSETUP_MGR_H_ -#define __EASYSETUP_MGR_H_ - -#include - -#include "logger.h" -#include "ocstack.h" -#include "octypes.h" -#include "escommon.h" - -#include "provisioning.h" - -//----------------------------------------------------------------------------- -// Defines -//----------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" -{ -#endif - OCStackResult InitProvProcess(); - - OCStackResult ResetProvProcess(); - - OCStackResult RegisterCallback(OCProvisioningStatusCB provisioningStatusCallback); - - void UnRegisterCallback(); - - OCStackResult StartProvisioning(const ProvConfig *netInfo, - WiFiOnboadingConnection *onboardConn); - - OCStackResult StopProvisioning(OCConnectivityType connectivityType); -#ifdef __cplusplus -} -#endif - -#endif diff --git a/service/easy-setup/mediator/csdk/src/provisioning.cpp b/service/easy-setup/mediator/csdk/src/provisioning.cpp deleted file mode 100755 index 00d89cf..0000000 --- a/service/easy-setup/mediator/csdk/src/provisioning.cpp +++ /dev/null @@ -1,577 +0,0 @@ -//****************************************************************** -// -// Copyright 2015 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -#include "provisioning.h" - -//Standard includes -#include -#include -#include -#include -#include -#include - -//EasySetup include files -#include "ocpayload.h" -#include "escommon.h" - -// External includes -#include "logger.h" -#include "oic_malloc.h" -#include "oic_string.h" - -#define ES_PROV_TAG "EASY_SETUP_PROVISIONING" - -bool gProvisioningCondFlag = false; - -static ProvConfig *gProvConfig; -static WiFiOnboadingConnection *gOnboardConn; -static char gSzFindResourceQueryUri[MAX_QUERY_LENGTH] = -{ 0 }; - -/** - * @var cbData - * @brief Callback for providing provisioning status callback to application - */ -static OCProvisioningStatusCB cbData = NULL; - -/** - * Utility function for error callback. - */ -void ErrorCallback(ProvStatus status) -{ - ProvisioningInfo *provInfo = GetCallbackObjectOnError(status); - if(cbData != NULL) - { - cbData(provInfo); - } -} - -/** - * Functions implementing the exposed APIs. - */ -OCStackResult InitProvisioningHandler() -{ - OCStackResult ret = OC_STACK_ERROR; - /* Initialize OCStack*/ - if (OCInit(NULL, 0, OC_CLIENT) != OC_STACK_OK) - { - OIC_LOG(ERROR, ES_PROV_TAG, "OCStack init error"); - return ret; - } - - return OC_STACK_OK; -} - -OCStackResult StartProvisioningProcess(const ProvConfig *netInfo, - WiFiOnboadingConnection *onboardConn, OCProvisioningStatusCB provisioningStatusCallback, - char *findResQuery) -{ - - if (findResQuery != NULL) - { - OICStrcpy(gSzFindResourceQueryUri, sizeof(gSzFindResourceQueryUri) - 1, findResQuery); - } - else - { - OIC_LOG(ERROR, ES_PROV_TAG, PCF("Find resource query is NULL")); - goto Error; - } - - pthread_t thread_handle; - - if (!ValidateEasySetupParams(netInfo, onboardConn, provisioningStatusCallback)) - { - goto Error; - } - - if (!SetProgress(provisioningStatusCallback)) - { - // Device provisioning session is running already. - OIC_LOG(INFO, ES_PROV_TAG, PCF("Device provisioning session is running already")); - goto Error; - } - - if (!ConfigEnrolleeObject(netInfo, onboardConn)) - { - goto Error; - } - - if (pthread_create(&thread_handle, NULL, FindProvisioningResource, NULL)) - { - goto Error; - - } - - pthread_join(thread_handle, NULL); - - return OC_STACK_OK; - - Error: - { - ErrorCallback(DEVICE_NOT_PROVISIONED); - ClearMemory(); - return OC_STACK_ERROR; - } - -} - -void StopProvisioningProcess() -{ - ResetProgress(); -} - -OCStackResult TerminateProvisioningHandler() -{ - OCStackResult ret = OC_STACK_ERROR; - if (OCStop() != OC_STACK_OK) - { - OIC_LOG(ERROR, ES_PROV_TAG, "OCStack stop error"); - } - - gProvisioningCondFlag = true; - ResetProgress(); - - ret = OC_STACK_OK; - return ret; -} - -OCStackApplicationResult TriggerNetworkConnectionResponse(void* /*ctx*/, OCDoHandle /*handle*/, - OCClientResponse *clientResponse) -{ - OIC_LOG_V(DEBUG, ES_PROV_TAG, "INSIDE TriggerNetworkConnectionResponse"); - - // If user stopped the process then return from this function; - if (IsSetupStopped()) - { - ErrorCallback(DEVICE_NOT_PROVISIONED); - ClearMemory(); - return OC_STACK_DELETE_TRANSACTION; - } - - if (!ValidateEnrolleeBasicResponse(clientResponse)) - { - ErrorCallback(DEVICE_NOT_PROVISIONED); - return OC_STACK_DELETE_TRANSACTION; - } - - SuccessCallback(clientResponse); - return OC_STACK_KEEP_TRANSACTION; -} - -OCStackResult TriggerNetworkConnection(OCQualityOfService qos, const char *query, - const char *resUri, OCDevAddr *destination, int /*pauseBeforeStart*/) -{ - OIC_LOG_V(INFO, ES_PROV_TAG, "Inside TriggerNetworkConnection"); - - OCRepPayload *payload = OCRepPayloadCreate(); - - OCRepPayloadSetUri(payload, resUri); - OCRepPayloadSetPropInt(payload, OC_RSRVD_ES_TR, ES_PS_TRIGGER_CONNECTION); - - OIC_LOG_V(DEBUG, ES_PROV_TAG, "Triggering network connection from Mediator"); - - OCStackResult ret = InvokeOCDoResource(query, OC_REST_POST, destination, qos, - TriggerNetworkConnectionResponse, payload, NULL, 0); - - return ret; -} - - - -bool ClearMemory() -{ - - OIC_LOG(DEBUG, ES_PROV_TAG, "thread_pool_add_task of FindProvisioningResource failed"); - OICFree(gProvConfig); - OICFree(gOnboardConn); - - return true; - -} - -bool ConfigEnrolleeObject(const ProvConfig *netInfo, WiFiOnboadingConnection *connection) -{ - - //Copy Network Provisioning Information - gProvConfig = (ProvConfig *) OICCalloc(1, sizeof(ProvConfig)); - gOnboardConn = (WiFiOnboadingConnection *) OICCalloc(1, sizeof(WiFiOnboadingConnection)); - - if (gProvConfig == NULL) - { - OIC_LOG(ERROR, ES_PROV_TAG, "Invalid input.."); - return false; - } - - if (gOnboardConn == NULL) - { - OIC_LOG(ERROR, ES_PROV_TAG, "Invalid input.."); - return false; - } - - memcpy(gProvConfig, netInfo, sizeof(ProvConfig)); - memcpy(gOnboardConn, connection, sizeof(WiFiOnboadingConnection)); - - OIC_LOG_V(DEBUG, ES_PROV_TAG, "Network Provisioning Info. SSID = %s", - gProvConfig->provData.WIFI.ssid); - - OIC_LOG_V(DEBUG, ES_PROV_TAG, "Network Provisioning Info. PWD = %s", - gProvConfig->provData.WIFI.pwd); - - return true; - -} - -void LogProvisioningResponse(OCRepPayloadValue * val) -{ - - switch (val->type) - { - case OCREP_PROP_NULL: - OIC_LOG_V(DEBUG, ES_PROV_TAG, "\t\t%s: NULL", val->name); - break; - case OCREP_PROP_INT: - OIC_LOG_V(DEBUG, ES_PROV_TAG, "\t\t%s(int):%lld", val->name, val->i); - break; - case OCREP_PROP_DOUBLE: - OIC_LOG_V(DEBUG, ES_PROV_TAG, "\t\t%s(double):%f", val->name, val->d); - break; - case OCREP_PROP_BOOL: - OIC_LOG_V(DEBUG, ES_PROV_TAG, "\t\t%s(bool):%s", val->name, val->b ? "true" : "false"); - break; - case OCREP_PROP_STRING: - OIC_LOG_V(DEBUG, ES_PROV_TAG, "\t\t%s(string):%s", val->name, val->str); - break; - case OCREP_PROP_OBJECT: - // Note: Only prints the URI (if available), to print further, you'll - // need to dig into the object better! - OIC_LOG_V(DEBUG, ES_PROV_TAG, "\t\t%s(OCRep):%s", val->name, val->obj->uri); - break; - case OCREP_PROP_ARRAY: - switch (val->arr.type) - { - case OCREP_PROP_INT: - OIC_LOG_V(DEBUG, ES_PROV_TAG, "\t\t%s(int array):%zu x %zu x %zu", - val->name, - val->arr.dimensions[0], val->arr.dimensions[1], - val->arr.dimensions[2]); - break; - case OCREP_PROP_DOUBLE: - OIC_LOG_V(DEBUG, ES_PROV_TAG, "\t\t%s(double array):%zu x %zu x %zu", - val->name, - val->arr.dimensions[0], val->arr.dimensions[1], - val->arr.dimensions[2]); - break; - case OCREP_PROP_BOOL: - OIC_LOG_V(DEBUG, ES_PROV_TAG, "\t\t%s(bool array):%zu x %zu x %zu", - val->name, - val->arr.dimensions[0], val->arr.dimensions[1], - val->arr.dimensions[2]); - break; - case OCREP_PROP_STRING: - OIC_LOG_V(DEBUG, ES_PROV_TAG, "\t\t%s(string array):%zu x %zu x %zu", - val->name, - val->arr.dimensions[0], val->arr.dimensions[1], - val->arr.dimensions[2]); - break; - case OCREP_PROP_OBJECT: - OIC_LOG_V(DEBUG, ES_PROV_TAG, "\t\t%s(OCRep array):%zu x %zu x %zu", - val->name, - val->arr.dimensions[0], val->arr.dimensions[1], - val->arr.dimensions[2]); - break; - default: - break; - } - break; - default: - break; - } -} - -OCStackResult FindNetworkResource() -{ - OCStackResult ret = OC_STACK_ERROR; - if (OCStop() != OC_STACK_OK) - { - OIC_LOG(ERROR, ES_PROV_TAG, "OCStack stop error"); - } - - return ret; -} - -ProvisioningInfo *PrepareProvisioingStatusCB(OCClientResponse *clientResponse, - ProvStatus provStatus) -{ - - ProvisioningInfo *provInfo = (ProvisioningInfo *) OICCalloc(1, sizeof(ProvisioningInfo)); - - if (provInfo == NULL) - { - OIC_LOG_V(ERROR, ES_PROV_TAG, "Failed to allocate memory"); - return NULL; - } - - OCDevAddr *devAddr = (OCDevAddr *) OICCalloc(1, sizeof(OCDevAddr)); - - if (devAddr == NULL) - { - OIC_LOG_V(ERROR, ES_PROV_TAG, "Failed to allocate memory"); - OICFree(provInfo); - return NULL; - } - - OICStrcpy(devAddr->addr, sizeof(devAddr->addr), clientResponse->addr->addr); - - devAddr->port = clientResponse->addr->port; - - provInfo->provDeviceInfo.addr = devAddr; - - provInfo->provStatus = provStatus; - - return provInfo; -} - -bool InProgress() -{ - - // It means already Easy Setup provisioning session is going on. - if (NULL != cbData) - { - OIC_LOG(ERROR, ES_PROV_TAG, "Easy setup session is already in progress"); - return true; - } - - return false; -} - -bool SetProgress(OCProvisioningStatusCB provisioningStatusCallback) -{ - - if (InProgress()) - return false; - - cbData = provisioningStatusCallback; - - return true; -} - -bool ResetProgress() -{ - - cbData = NULL; - return true; -} - -ProvisioningInfo *CreateCallBackObject() -{ - - ProvisioningInfo *provInfo = (ProvisioningInfo *) OICCalloc(1, sizeof(ProvisioningInfo)); - - if (provInfo == NULL) - { - OIC_LOG_V(ERROR, ES_PROV_TAG, "Failed to allocate memory"); - return NULL; - } - - OCDevAddr *devAddr = (OCDevAddr *) OICCalloc(1, sizeof(OCDevAddr)); - - if (devAddr == NULL) - { - OIC_LOG_V(ERROR, ES_PROV_TAG, "Failed to allocate memory"); - OICFree(provInfo); - return NULL; - } - - provInfo->provDeviceInfo.addr = devAddr; - - return provInfo; - -} - -ProvisioningInfo *GetCallbackObjectOnError(ProvStatus status) -{ - - ProvisioningInfo *provInfo = CreateCallBackObject(); - OICStrcpy(provInfo->provDeviceInfo.addr->addr, sizeof(provInfo->provDeviceInfo.addr->addr), - gOnboardConn->ipAddress); - - provInfo->provDeviceInfo.addr->port = IP_PORT; - provInfo->provStatus = status; - return provInfo; -} - -ProvisioningInfo *GetCallbackObjectOnSuccess(OCClientResponse *clientResponse, - ProvStatus provStatus) -{ - ProvisioningInfo *provInfo = CreateCallBackObject(); - OICStrcpy(provInfo->provDeviceInfo.addr->addr, sizeof(provInfo->provDeviceInfo.addr->addr), - clientResponse->addr->addr); - - provInfo->provDeviceInfo.addr->port = clientResponse->addr->port; - provInfo->provStatus = provStatus; - return provInfo; -} - -bool ValidateFindResourceResponse(OCClientResponse * clientResponse) -{ - if (!(clientResponse) || !(clientResponse->payload)) - { - OIC_LOG_V(INFO, ES_PROV_TAG, "Received Null clientResponse"); - return false; - } - - if (clientResponse->payload->type != PAYLOAD_TYPE_DISCOVERY) - { - OIC_LOG_V(DEBUG, ES_PROV_TAG, "Payload is not discovery type"); - return false; - } - - return true; -} - -bool ValidateEnrolleeResponse(OCClientResponse * clientResponse) -{ - if (!(clientResponse) || !(clientResponse->payload)) - { - OIC_LOG_V(INFO, ES_PROV_TAG, "Received Null clientResponse"); - return false; - } - - if (clientResponse->payload->type != PAYLOAD_TYPE_REPRESENTATION) - { - OIC_LOG_V(DEBUG, ES_PROV_TAG, "Incoming payload is not a representation"); - return false; - } - - // If flow reachese here means no error condition hit. - return true; -} - -bool ValidateEnrolleeBasicResponse(OCClientResponse * clientResponse) -{ - if (!clientResponse) - { - OIC_LOG_V(INFO, ES_PROV_TAG, "Received Null clientResponse"); - return false; - } - - if(clientResponse->result != OC_STACK_OK) - { - OIC_LOG_V(INFO, ES_PROV_TAG, "Received error response"); - return false; - } - - // If flow reaches, then there no error condition hit. - return true; -} - - -void SuccessCallback(OCClientResponse * clientResponse) -{ - ProvisioningInfo *provInfo = GetCallbackObjectOnSuccess(clientResponse, DEVICE_PROVISIONED); - if(cbData != NULL) - { - cbData(provInfo); - } -} - -void* FindProvisioningResource(void* /*data*/) -{ - - // If user stopped the process before thread get scheduled then check and return from this function; - if (IsSetupStopped()) - { - ErrorCallback(DEVICE_NOT_PROVISIONED); - ClearMemory(); - return NULL; - } - - OCStackResult ret = OC_STACK_ERROR; - - OIC_LOG_V(DEBUG, ES_PROV_TAG, "szFindResourceQueryUri = %s", gSzFindResourceQueryUri); - - OCCallbackData ocCBData; - - ocCBData.cb = FindProvisioningResourceResponse; - ocCBData.context = (void *) EASY_SETUP_DEFAULT_CONTEXT_VALUE; - ocCBData.cd = NULL; - - ret = OCDoResource(NULL, OC_REST_DISCOVER, gSzFindResourceQueryUri, NULL, NULL, - gProvConfig->connType, OC_LOW_QOS, &ocCBData, NULL, 0); - - if (ret != OC_STACK_OK) - { - ErrorCallback(DEVICE_NOT_PROVISIONED); - ClearMemory(); - } - - return NULL; -} - -OCStackResult InvokeOCDoResource(const char *query, OCMethod method, const OCDevAddr *dest, - OCQualityOfService qos, OCClientResponseHandler cb, OCRepPayload *payload, - OCHeaderOption *options, uint8_t numOptions) -{ - OCStackResult ret; - OCCallbackData cbData; - - cbData.cb = cb; - cbData.context = (void *) EASY_SETUP_DEFAULT_CONTEXT_VALUE; - cbData.cd = NULL; - - ret = OCDoResource(NULL, method, query, dest, (OCPayload *) payload, gProvConfig->connType, qos, - &cbData, options, numOptions); - - if (ret != OC_STACK_OK) - { - OIC_LOG_V(ERROR, ES_PROV_TAG, "OCDoResource returns error %d with method %d", ret, method); - } - - return ret; -} - -OCStackResult ProvisionEnrollee(OCQualityOfService qos, const char *query, const char *resUri, - OCDevAddr *destination, int pauseBeforeStart) -{ - - // This sleep is required in case of BLE provisioning due to packet drop issue. - OIC_LOG_V(INFO, ES_PROV_TAG, "Sleeping for %d seconds", pauseBeforeStart); - sleep(pauseBeforeStart); - OIC_LOG_V(INFO, ES_PROV_TAG, "\n\nExecuting ProvisionEnrollee%s", __func__); - - OCRepPayload *payload = OCRepPayloadCreate(); - - OCRepPayloadSetUri(payload, resUri); - OCRepPayloadSetPropString(payload, OC_RSRVD_ES_TNN, gProvConfig->provData.WIFI.ssid); - OCRepPayloadSetPropString(payload, OC_RSRVD_ES_CD, gProvConfig->provData.WIFI.pwd); - - OIC_LOG_V(DEBUG, ES_PROV_TAG, "OCPayload ready for ProvisionEnrollee"); - - OCStackResult ret = InvokeOCDoResource(query, OC_REST_POST, destination, qos, - ProvisionEnrolleeResponse, payload, NULL, 0); - - return ret; -} - -bool IsSetupStopped() -{ - return (cbData == NULL) ? true : false; -} diff --git a/service/easy-setup/mediator/csdk/src/provisioningapi.cpp b/service/easy-setup/mediator/csdk/src/provisioningapi.cpp deleted file mode 100755 index 42acd83..0000000 --- a/service/easy-setup/mediator/csdk/src/provisioningapi.cpp +++ /dev/null @@ -1,127 +0,0 @@ -//****************************************************************** -// -// Copyright 2015 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -#include -#include -#include -#include -#include -#include -#include - -#include "provisioningapi.h" -#include "oic_string.h" - -#define ES_PROV_ADAP_TAG "ES_PROVISIONING_ADAPTER" - -//Use ipv4addr for both InitDiscovery and InitDeviceDiscovery -char ipv4addr[IPV4_ADDR_SIZE] = -{ 0 }; - -#ifdef REMOTE_ARDUINO_ENROLEE -//Arduino Enrollee needs mediator application provide IP and port55555 which is specific -// to Arduino WiFi enrollee -static const char * UNICAST_PROVISIONING_QUERY = "coap://%s:%d/oic/res?rt=oic.r.prov"; -#else -static const char * UNICAST_PROVISIONING_QUERY = "/oic/res?rt=oic.r.prov"; -#endif - -volatile static OCProvisioningStatusCB cbData = NULL; - -OCStackResult InitProvProcess() -{ - - OCStackResult result = OC_STACK_ERROR; - - if (InitProvisioningHandler() == OC_STACK_OK) - { - result = OC_STACK_OK; - OIC_LOG(DEBUG, ES_PROV_ADAP_TAG, "InitProvisioningHandler returned Success"); - } - else - { - result = OC_STACK_ERROR; - OIC_LOG_V(ERROR, ES_PROV_ADAP_TAG, "InitProvisioningHandler returned error = %d", - result); - } - - return result; -} - -OCStackResult ResetProvProcess() -{ - return TerminateProvisioningHandler(); -} - -OCStackResult RegisterCallback(OCProvisioningStatusCB provisioningStatusCallback) -{ - OCStackResult result = OC_STACK_OK; - - if (provisioningStatusCallback != NULL) - { - cbData = provisioningStatusCallback; - } - else - { - result = OC_STACK_ERROR; - OIC_LOG(ERROR, ES_PROV_ADAP_TAG, "provisioningStatusCallback is NULL"); - } - - return result; -} - -void UnRegisterCallback() -{ - if (cbData) - { - cbData = NULL; - } -} - -OCStackResult StartProvisioning(const ProvConfig *provConfig, WiFiOnboadingConnection *onboardConn) -{ - - char findQuery[MAX_QUERY_LENGTH] = - { 0 }; - - if (provConfig == NULL || onboardConn == NULL) - { - return OC_STACK_ERROR; - } - -#ifdef REMOTE_ARDUINO_ENROLEE - //Arduino Enrollee needs mediator application provide IP and port55555 which is specific - // to Arduino WiFi enrollee - snprintf(findQuery, sizeof(findQuery) - 1, UNICAST_PROVISIONING_QUERY, - onboardConn->ipAddress, IP_PORT); -#else - OICStrcpy(findQuery, sizeof(findQuery) - 1, UNICAST_PROVISIONING_QUERY); -#endif - - return StartProvisioningProcess(provConfig, onboardConn, cbData, findQuery); -} - -OCStackResult StopProvisioning(OCConnectivityType /*connectivityType*/) -{ - OCStackResult result = OC_STACK_OK; - - StopProvisioningProcess(); - - return result; -} diff --git a/service/easy-setup/mediator/csdk/src/wifiprovisioning.cpp b/service/easy-setup/mediator/csdk/src/wifiprovisioning.cpp deleted file mode 100755 index 08ecc20..0000000 --- a/service/easy-setup/mediator/csdk/src/wifiprovisioning.cpp +++ /dev/null @@ -1,274 +0,0 @@ -//****************************************************************** -// -// Copyright 2015 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -// NOTE : Keeping Wifi provisioning in this file to have adaptability while doing OOPs refactoring - -#include "provisioning.h" - -//Standard includes -#include -#include -#include -#include -#include -#include - -//EasySetup include files -#include "ocpayload.h" -#include "escommon.h" - -// External includes -#include "logger.h" -#include "oic_string.h" - -#define ES_WIFI_PROV_TAG "ES_WIFI_PROVISIONING" - -static const char * UNICAST_PROV_STATUS_QUERY = "coap://%s:%d%s"; - -OCStackApplicationResult ProvisionEnrolleeResponse(void* /*ctx*/, OCDoHandle /*handle*/, - OCClientResponse *clientResponse) -{ - OIC_LOG_V(DEBUG, ES_WIFI_PROV_TAG, "Inside ProvisionEnrolleeResponse"); - - // If user stopped the process then return from this function; - if (IsSetupStopped()) - { - ErrorCallback(DEVICE_NOT_PROVISIONED); - ClearMemory(); - return OC_STACK_DELETE_TRANSACTION; - } - - if (!ValidateEnrolleeResponse(clientResponse)) - { - ErrorCallback(DEVICE_NOT_PROVISIONED); - return OC_STACK_DELETE_TRANSACTION; - } - - char query[OIC_STRING_MAX_VALUE] = - { '\0' }; - char resUri[MAX_URI_LENGTH] = - { '\0' }; - - OIC_LOG_V(DEBUG, ES_WIFI_PROV_TAG, "Resource URI = %s", clientResponse->resourceUri); - - OICStrcpy(resUri, sizeof(resUri), clientResponse->resourceUri); - -#ifdef REMOTE_ARDUINO_ENROLEE - //Arduino Enrollee needs mediator application provide IP and port55555 which is specific - // to Arduino WiFi enrollee - // REMOTE_ARDUINO_ENROLEE has to be defined if Mediator is being tested with Arduino - snprintf(query, sizeof(query), UNICAST_PROV_STATUS_QUERY, clientResponse->addr->addr, IP_PORT, - resUri); -#else - snprintf(query, sizeof(query), UNICAST_PROV_STATUS_QUERY, clientResponse->addr->addr, - clientResponse->addr->port, resUri); -#endif - - if (TriggerNetworkConnection(OC_HIGH_QOS, query, OC_RSRVD_ES_URI_PROV, clientResponse->addr, 0) - != OC_STACK_OK) - { - OIC_LOG(INFO, ES_WIFI_PROV_TAG, "GetProvisioningStatusResponse received NULL clientResponse"); - - ErrorCallback(DEVICE_NOT_PROVISIONED); - ClearMemory(); - } - - return OC_STACK_DELETE_TRANSACTION; -} - -OCStackApplicationResult GetProvisioningStatusResponse(void* /*ctx*/, OCDoHandle /*handle*/, - OCClientResponse *clientResponse) -{ - // If user stopped the process then return from this function; - if (IsSetupStopped()) - { - ErrorCallback(DEVICE_NOT_PROVISIONED); - ClearMemory(); - return OC_STACK_DELETE_TRANSACTION; - } - - if (!ValidateEnrolleeResponse(clientResponse)) - { - ErrorCallback(DEVICE_NOT_PROVISIONED); - ClearMemory(); - return OC_STACK_DELETE_TRANSACTION; - } - - OCRepPayload *input = (OCRepPayload *) (clientResponse->payload); - - char resUri[MAX_URI_LENGTH] = { '\0' }; - - OIC_LOG_V(DEBUG, ES_WIFI_PROV_TAG, "resUri = %s", clientResponse->resourceUri); - - OICStrcpy(resUri, sizeof(resUri), clientResponse->resourceUri); - - while (input) - { - int64_t ps; - if (OCRepPayloadGetPropInt(input, OC_RSRVD_ES_PS, &ps)) - { - - if (ps == ES_PS_NEED_PROVISIONING) - { - input = input->next; - continue; - } - else - { - ErrorCallback(DEVICE_NOT_PROVISIONED); - ClearMemory(); - return OC_STACK_DELETE_TRANSACTION; - } - } - - LogProvisioningResponse(input->values); - input = input->next; - } - - char query[OIC_STRING_MAX_VALUE] = - { '\0' }; - -#ifdef REMOTE_ARDUINO_ENROLEE - //Arduino Enrollee needs mediator application provide IP and port55555 which is specific - // to Arduino WiFi enrollee - // REMOTE_ARDUINO_ENROLEE has to be defined if Mediator is being tested with Arduino - snprintf(query, sizeof(query), UNICAST_PROV_STATUS_QUERY, clientResponse->addr->addr, IP_PORT, - resUri); -#else - snprintf(query, sizeof(query), UNICAST_PROV_STATUS_QUERY, clientResponse->addr->addr, - clientResponse->addr->port, resUri); -#endif - - if (ProvisionEnrollee(OC_HIGH_QOS, query, OC_RSRVD_ES_URI_PROV, clientResponse->addr, 0) - != OC_STACK_OK) - { - OIC_LOG(INFO, ES_WIFI_PROV_TAG, "GetProvisioningStatusResponse received NULL clientResponse"); - - ErrorCallback(DEVICE_NOT_PROVISIONED); - ClearMemory(); - return OC_STACK_DELETE_TRANSACTION; - } - - return OC_STACK_KEEP_TRANSACTION; - -} - -OCStackResult GetProvisioningStatus(OCQualityOfService qos, const char *query, - const OCDevAddr *destination) -{ - OCStackResult ret = OC_STACK_ERROR; - OCHeaderOption options[MAX_HEADER_OPTIONS]; - - OIC_LOG(DEBUG, ES_WIFI_PROV_TAG, "Inside GetProvisioningStatus"); - - uint8_t option0[] = - { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; - uint8_t option1[] = - { 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; - memset(options, 0, sizeof(OCHeaderOption) * MAX_HEADER_OPTIONS); - options[0].protocolID = OC_COAP_ID; - options[0].optionID = 2048; - memcpy(options[0].optionData, option0, sizeof(option0)); - options[0].optionLength = 10; - options[1].protocolID = OC_COAP_ID; - options[1].optionID = 3000; - memcpy(options[1].optionData, option1, sizeof(option1)); - options[1].optionLength = 10; - - ret = InvokeOCDoResource(query, OC_REST_GET, destination, qos, GetProvisioningStatusResponse, - NULL, options, 2); - return ret; -} - -// This is a function called back when a device is discovered -OCStackApplicationResult FindProvisioningResourceResponse(void* /*ctx*/, OCDoHandle /*handle*/, - OCClientResponse *clientResponse) -{ - - OIC_LOG_V(INFO, ES_WIFI_PROV_TAG, "Entering FindProvisioningResourceResponse %s", - clientResponse->devAddr.addr); - - // If user stopped the process then return from this function; - if (IsSetupStopped()) - { - ErrorCallback(DEVICE_NOT_PROVISIONED); - ClearMemory(); - return OC_STACK_DELETE_TRANSACTION; - } - - if (!ValidateFindResourceResponse(clientResponse)) - { - ErrorCallback(DEVICE_NOT_PROVISIONED); - return OC_STACK_DELETE_TRANSACTION; - } - - char szQueryUri[MAX_QUERY_LENGTH] = - { 0 }; - - OCDiscoveryPayload *discoveryPayload = (OCDiscoveryPayload *) (clientResponse->payload); - - OIC_LOG_V(DEBUG, ES_WIFI_PROV_TAG, "resUri = %s", discoveryPayload->resources->uri); - -#ifdef REMOTE_ARDUINO_ENROLEE - //Arduino Enrollee needs mediator application provide IP and port55555 which is specific - // to Arduino WiFi enrollee - // REMOTE_ARDUINO_ENROLEE has to be defined if Mediator is being tested with Arduino - snprintf(szQueryUri, sizeof(szQueryUri), UNICAST_PROV_STATUS_QUERY, - clientResponse->addr->addr, - IP_PORT, - discoveryPayload->resources->uri); -#else - snprintf(szQueryUri, sizeof(szQueryUri), UNICAST_PROV_STATUS_QUERY, - clientResponse->devAddr.addr, clientResponse->devAddr.port, - discoveryPayload->resources->uri); -#endif - - OIC_LOG_V(DEBUG, ES_WIFI_PROV_TAG, "query before GetProvisioningStatus call = %s", szQueryUri); - - if (GetProvisioningStatus(OC_HIGH_QOS, szQueryUri, &clientResponse->devAddr) != OC_STACK_OK) - { - ErrorCallback(DEVICE_NOT_PROVISIONED); - return OC_STACK_DELETE_TRANSACTION; - } - - return OC_STACK_KEEP_TRANSACTION; - -} - -bool ValidateEasySetupParams(const ProvConfig */*netInfo*/, WiFiOnboadingConnection *onboardConn, - OCProvisioningStatusCB provisioningStatusCallback) -{ - - if (onboardConn == NULL || strlen(onboardConn->ipAddress) == 0) - { - OIC_LOG(ERROR, ES_WIFI_PROV_TAG, "Request URI is NULL"); - return false; - } - - if (provisioningStatusCallback == NULL) - { - OIC_LOG(ERROR, ES_WIFI_PROV_TAG, "ProvisioningStatusCallback is NULL"); - return false; - } - - return true; - -} - diff --git a/service/easy-setup/mediator/csdk/unittests/MediatorCSDKTest.cpp b/service/easy-setup/mediator/csdk/unittests/MediatorCSDKTest.cpp deleted file mode 100644 index e0aded4..0000000 --- a/service/easy-setup/mediator/csdk/unittests/MediatorCSDKTest.cpp +++ /dev/null @@ -1,124 +0,0 @@ -//****************************************************************** -// -// Copyright 2016 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -#include "UnitTestHelper.h" - -#include "ocstack.h" -#include "OCPlatform.h" -#include "OCApi.h" -#include "oic_string.h" -#include "logger.h" - -#include "provisioningapi.h" -#include "provisioning.h" -#include "escommon.h" - -#include -#include -#include -#include -#include - -class MediatorCSDKTest: public TestWithMock -{ - - protected: - void SetUp() - { - TestWithMock::SetUp(); - } - - void TearDown() - { - TestWithMock::TearDown(); - } - -}; - -//callbacks -void OCProvisioningStatusCallback(EasySetupInfo *easySetupInfo) -{ - (void) easySetupInfo; -} - -/* Test cases for prov_adapter*/ - -//InitProvProcess -TEST_F(MediatorCSDKTest, testInitProvProcess) -{ - OCStackResult result = InitProvProcess(); - ASSERT_EQ(OC_STACK_OK, result); -} - -//ResetProvProcess -TEST_F(MediatorCSDKTest, testResetProvProcess) -{ - OCStackResult result = ResetProvProcess(); - ASSERT_EQ(OC_STACK_OK, result); -} - -//RegisterCallback [positive] -TEST_F(MediatorCSDKTest, testRegisterCallback) -{ - OCStackResult result = RegisterCallback(&OCProvisioningStatusCallback); - ASSERT_EQ(OC_STACK_OK, result); -} - -//RegisterCallback [Negative] -TEST_F(MediatorCSDKTest, testRegisterCallbackNegative) -{ - OCStackResult result = RegisterCallback(NULL); - ASSERT_EQ(OC_STACK_ERROR, result); -} - -//StartProvisioning [positive] -TEST_F(MediatorCSDKTest, testStartProvisioning) -{ - ProvConfig provConfig; - WiFiOnboadingConnection onboardConn; - - strncpy(onboardConn.ipAddress, "1.1.1.1", IPV4_ADDR_SIZE - 1); - - strncpy(provConfig.provData.WIFI.ssid, "testAP", NET_WIFI_SSID_SIZE - 1); - strncpy(provConfig.provData.WIFI.pwd, "test@123", NET_WIFI_PWD_SIZE - 1); - provConfig.connType = CT_ADAPTER_IP; - - //API Call - OCStackResult result = StartProvisioning(&provConfig, &onboardConn); - - ASSERT_EQ(OC_STACK_OK, result); -} - -//StartProvisioning [Negative] -TEST_F(MediatorCSDKTest, testStartProvisioningNegative) -{ - OCStackResult result = StartProvisioning(NULL, NULL); - ASSERT_EQ(OC_STACK_ERROR, result); -} - -//StopProvisioning -TEST_F(MediatorCSDKTest, testStopProvisioning) -{ - // This API always return success - OCStackResult result = StopProvisioning(CT_ADAPTER_IP); - ASSERT_EQ(OC_STACK_OK, result); -} - - diff --git a/service/easy-setup/mediator/csdk/unittests/SConscript b/service/easy-setup/mediator/csdk/unittests/SConscript deleted file mode 100644 index 9ac9032..0000000 --- a/service/easy-setup/mediator/csdk/unittests/SConscript +++ /dev/null @@ -1,87 +0,0 @@ -#****************************************************************** -# -# Copyright 2016 Samsung Electronics All Rights Reserved. -# -#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -## -# Mediator[CSDK] Unit Test build script -## -import os - -# SConscript file for Local PKI google tests -gtest_env = SConscript('#extlibs/gtest/SConscript') -lib_env = gtest_env.Clone() - -if lib_env.get('RELEASE'): - lib_env.AppendUnique(CCFLAGS = ['-Os']) - lib_env.AppendUnique(CPPDEFINES = ['NDEBUG']) -else: - lib_env.AppendUnique(CCFLAGS = ['-g']) - -if lib_env.get('LOGGING'): - lib_env.AppendUnique(CPPDEFINES = ['TB_LOG']) - -# Add third party libraries -SConscript('#service/third_party_libs.scons', 'lib_env') - -target_os = lib_env.get('TARGET_OS') -if target_os in ['linux']: - # Verify that 'hippomocks' mocking code is installed. If not, - # get it and install it - SConscript('#extlibs/hippomocks.scons') - -mediator_csdk_test_env = lib_env.Clone() - -###################################################################### -#unit test setting -###################################################################### -src_dir = lib_env.get('SRC_DIR') - -###################################################################### -# Build flags -###################################################################### - -mediator_csdk_test_env.AppendUnique( - CPPPATH = [ - src_dir + '/extlibs/hippomocks-master', - '../inc', - '../../../inc', - ]) - -mediator_csdk_test_env.PrependUnique(LIBS = [ - 'ESMediatorCSDK', - 'oc', - 'octbstack', - 'oc_logger', - 'oc_logger_core', - 'connectivity_abstraction']) - -###################################################################### -# Build Test -###################################################################### -mediator_csdk_test_src = mediator_csdk_test_env.Glob('./*.cpp') - -mediator_csdk_test = mediator_csdk_test_env.Program('mediator_csdk_test', mediator_csdk_test_src) -Alias("mediator_csdk_test", mediator_csdk_test) -mediator_csdk_test_env.AppendTarget('mediator_csdk_test') - -if mediator_csdk_test_env.get('TEST') == '1': - target_os = mediator_csdk_test_env.get('TARGET_OS') - if target_os in ['linux']: - from tools.scons.RunTest import * - run_test(mediator_csdk_test_env, '', 'service/easy-setup/mediator/csdk/unittests/mediator_csdk_test') diff --git a/service/easy-setup/mediator/csdk/unittests/UnitTestHelper.h b/service/easy-setup/mediator/csdk/unittests/UnitTestHelper.h deleted file mode 100644 index 2bf7424..0000000 --- a/service/easy-setup/mediator/csdk/unittests/UnitTestHelper.h +++ /dev/null @@ -1,48 +0,0 @@ -//****************************************************************** -// -// Copyright 2016 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -#ifndef COMMON_UTILS_UNITTESTHELPER_H -#define COMMON_UTILS_UNITTESTHELPER_H - -#include -#include - -class TestWithMock: public testing::Test -{ - public: - MockRepository mocks; - - protected: - virtual ~TestWithMock() noexcept(noexcept(std::declval().~Test())) {} - - virtual void TearDown() - { - try - { - mocks.VerifyAll(); - } - catch (...) - { - mocks.reset(); - throw; - } - } -}; -#endif // COMMON_UTILS_UNITTESTHELPER_H diff --git a/service/easy-setup/mediator/richsdk/SConscript b/service/easy-setup/mediator/richsdk/SConscript index 3b3b4c7..4e79a4f 100644 --- a/service/easy-setup/mediator/richsdk/SConscript +++ b/service/easy-setup/mediator/richsdk/SConscript @@ -104,11 +104,14 @@ if target_os in ['android','linux']: env.get('SRC_DIR') + '/resource/csdk/security/provisioning/include/internal', env.get('SRC_DIR') + '/resource/csdk/security/provisioning/include/oxm']) +if not env.get('RELEASE'): + easy_setup_env.PrependUnique(LIBS = ['gcov']) + easy_setup_env.AppendUnique(CCFLAGS = ['--coverage']) + ###################################################################### # Source files and Targets ###################################################################### - print"easysetup_path %s" % easysetup_path es_src = None @@ -118,7 +121,8 @@ if target_os in ['android','linux']: env.AppendUnique(es_src = [os.path.join(easysetup_path, 'src/EnrolleeSecurity.cpp')]) es_common_src = ['src/RemoteEnrollee.cpp', - 'src/RemoteEnrolleeResource.cpp', + 'src/EnrolleeResource.cpp', + 'src/CloudResource.cpp', 'src/EasySetup.cpp', 'src/ESException.cpp'] @@ -126,18 +130,29 @@ if target_os in ['android','linux']: es_sdk_shared = easy_setup_env.SharedLibrary('ESMediatorRich', env.get('es_src')) easy_setup_env.InstallTarget(es_sdk_shared, 'libESMediatorRich') + easy_setup_env.AppendUnique(LINKFLAGS = ['-Wl,-soname,libESMediatorRich.so']) print "Files path is %s" % env.get('es_src') ###################################################################### +# Generate RichSDK Mediator AAR +################################################ ###################### +if target_os in ['android']: + SConscript('android/SConscript') + +###################################################################### # Build RichSDK Mediator Sample App ################################################ ###################### if target_os in ['linux']: SConscript('../../sampleapp/mediator/linux/richsdk_sample/SConscript') +if target_os in ['android']: + SConscript('../../sampleapp/mediator/android/SConscript') + + ###################################################################### #Build UnitTestcases for Mediator[RichSDK] ################################################ ###################### -if target_os in ['linux']: +if target_os == 'linux': SConscript('unittests/SConscript') diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/EasySetupCore.iml b/service/easy-setup/mediator/richsdk/android/EasySetupCore/EasySetupCore.iml new file mode 100644 index 0000000..9b1255e --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/EasySetupCore.iml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/build.gradle b/service/easy-setup/mediator/richsdk/android/EasySetupCore/build.gradle index 778bce9..78ef528 100644 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/build.gradle +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/build.gradle @@ -1,27 +1,32 @@ apply plugin: 'com.android.library' // Top-level build file where you can add configuration options common to all sub-projects/modules. -buildscript { - repositories { - jcenter() - } - dependencies { - classpath 'com.android.tools.build:gradle:1.2.3' - } -} - -allprojects { - repositories { - jcenter() - } -} android { compileSdkVersion 21 - buildToolsVersion '21.1.2' + buildToolsVersion '20.0.0' + archivesBaseName = "iotivity" + libraryVariants.all { variant -> + variant.outputs.each { output -> + def outputFile = output.outputFile + if (outputFile != null && outputFile.name.endsWith('.aar')) { + def fileName = "${outputFile.name}" + output.outputFile = new File(outputFile.parent, fileName) + } + } + } + defaultConfig { minSdkVersion 21 targetSdkVersion 21 + versionCode 1 + versionName "1.0" + } + + repositories { + flatDir { + dirs '../../../../../../android/android_api/base/build/outputs/aar' + } } buildTypes { @@ -30,7 +35,59 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } + + lintOptions { + abortOnError false + } sourceSets { - main { java.srcDirs = ['src/main/java', 'src/main/java/common', 'src/main/java/interface'] } + main { + manifest.srcFile 'src/main/AndroidManifest.xml' + jni.srcDirs = [] //disable automatic ndk-build call + jniLibs.srcDir new File(buildDir, 'native-libs') + } + //androidTest.setRoot('src/androidTest') + } +} + +dependencies { + compile ":iotivity-base-${TARGET_ARCH}-${RELEASE}@aar" + androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.0' + androidTestCompile 'com.google.dexmaker:dexmaker:1.0' + androidTestCompile 'org.mockito:mockito-core:1.10.19' +} + +//////////////// +////NDK Support +//////////////// +//If using this, Android studio will fail run the following to set the environment variable for android studio: +//launchctl setenv ANDROID_NDK_HOME +//otherwise remove the dependsOn part and run ./gradlew buildNative from the command line +task copyNativeLibs(type: Copy, dependsOn: 'buildNative') { + dependsOn 'buildNative' + from(new File('src/main/libs/armeabi')) { include '**/*.so' exclude '**/libgnustl_shared.so', '**/liboc.so', '**/libocstack-jni.so'} + into new File(buildDir, 'native-libs/armeabi') +} + +tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn copyNativeLibs } + +clean.dependsOn 'cleanCopyNativeLibs' + +tasks.withType(com.android.build.gradle.tasks.PackageApplication) { + pkgTask -> + pkgTask.jniFolders = new HashSet() + pkgTask.jniFolders.add(new File(buildDir, 'native-libs')) +} + +task buildNative(type: Exec) { + if (System.env.ANDROID_NDK_HOME != null) { + //for windows use 'ndk-build.cmd' + //def ndkBuild = new File(System.env.ANDROID_NDK_HOME, 'ndk-build.cmd') + def ndkBuild = new File(System.env.ANDROID_NDK_HOME, 'ndk-build') + commandLine ndkBuild, "APP_ABI=$TARGET_ARCH", "APP_OPTIM=$RELEASE", '-C', file('src/main').absolutePath + } else { + println '##################' + println 'Skipping NDK build' + println 'Reason: ANDROID_NDK_HOME not set.' + println '##################' } } \ No newline at end of file diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/proguard-rules.pro b/service/easy-setup/mediator/richsdk/android/EasySetupCore/proguard-rules.pro new file mode 100755 index 0000000..c5f9a5b --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in C:/android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/androidTest/androidTest.iml b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/androidTest/androidTest.iml deleted file mode 100644 index a862cc8..0000000 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/androidTest/androidTest.iml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/androidTest/java/org/iotivity/service/easysetup/mediator/EasySetupServiceConfigTest.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/androidTest/java/org/iotivity/service/easysetup/mediator/EasySetupServiceConfigTest.java deleted file mode 100644 index 3ee90fd..0000000 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/androidTest/java/org/iotivity/service/easysetup/mediator/EasySetupServiceConfigTest.java +++ /dev/null @@ -1,74 +0,0 @@ -/** - * *************************************************************** - *

- * Copyright 2015 Samsung Electronics All Rights Reserved. - *

- *

- *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *

- * **************************************************************** - */ - -package org.iotivity.service.easysetup.mediator; - -import android.test.AndroidTestCase; - - -public class EasySetupServiceConfigTest extends AndroidTestCase { - - - public void testConstruction() { - - EasySetupService service = EasySetupService.getInstance(getContext(), new EasySetupStatus() { - @Override - public void onFinished(EnrolleeDevice enrolledevice) { - - } - - @Override - public void onProgress(EnrolleeDevice enrolleeDevice) { - - } - }); - - assertTrue(service != null); - - - } - - public void testFinish() { - EasySetupService service = EasySetupService.getInstance(getContext(), new EasySetupStatus() { - @Override - public void onFinished(EnrolleeDevice enrolledevice) { - - } - - @Override - public void onProgress(EnrolleeDevice enrolleeDevice) { - - } - }); - service.finish(); - - // No runtime exception is thrown means test is successful - assertTrue(true); - - } - - public void testEnrolleeDeviceFacotryConstruction() { - EnrolleeDeviceFactory factory = EnrolleeDeviceFactory.newInstance(getContext()); - assertTrue(factory != null); - } - -} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/androidTest/java/org/iotivity/service/easysetup/mediator/EasySetupServiceTest.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/androidTest/java/org/iotivity/service/easysetup/mediator/EasySetupServiceTest.java deleted file mode 100755 index 5fb19cd..0000000 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/androidTest/java/org/iotivity/service/easysetup/mediator/EasySetupServiceTest.java +++ /dev/null @@ -1,158 +0,0 @@ -//****************************************************************** -// -// Copyright 2015 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -package org.iotivity.service.easysetup.mediator; - -import android.net.wifi.WifiConfiguration; -import android.test.AndroidTestCase; -import android.util.Log; - -import java.io.IOException; - -public class EasySetupServiceTest extends AndroidTestCase { - - - public void testStartSetupWithWiFiOnboarding() { - - EasySetupService mService; - EnrolleeDevice mDevice; - EnrolleeDeviceFactory mFactory; - - final Object lock = new Object(); - - - /* Create Easy Setup service */ - mService = EasySetupService.getInstance(getContext(), new EasySetupStatus() { - @Override - public void onFinished(EnrolleeDevice enrolledevice) { - - //countDownLatch.countDown(); - Utility.toNotify(lock); - - if (enrolledevice.isSetupSuccessful()) { - - if (enrolledevice.mOnBoardingConfig.getConnType() == WiFiOnBoardingConfig.ConnType.WiFi) { - IpOnBoardingConnection conn = (IpOnBoardingConnection) enrolledevice.getConnection(); - String ip = conn.getIp(); - if (ip == null || ip.isEmpty()) { - assertTrue(false); - return; - } - String mac = conn.getHardwareAddress(); - if (mac == null || mac.isEmpty()) { - assertTrue(false); - return; - } - // Device configured successfully - assertTrue(true); - } - - } else { - assertTrue(false); - } - } - - @Override - public void onProgress(EnrolleeDevice enrolleeDevice) { - // Handled in EasySetupStatusTest - } - }); - - - /* Create On boarding configuration */ - WiFiOnBoardingConfig mWiFiOnBoardingConfig = new WiFiOnBoardingConfig(); - mWiFiOnBoardingConfig.setSSId("EasySetup123"); - mWiFiOnBoardingConfig.setSharedKey("EasySetup123"); - mWiFiOnBoardingConfig.setAuthAlgo(WifiConfiguration.AuthAlgorithm.OPEN); - mWiFiOnBoardingConfig.setKms(WifiConfiguration.KeyMgmt.WPA_PSK); - - /* Create provisioning configuration */ - WiFiProvConfig mWiFiProvConfig = new WiFiProvConfig("hub2.4G", "11112222"); - - /* Create enrolling device factory instance */ - mFactory = EnrolleeDeviceFactory.newInstance(getContext()); - - /* Check if the factory created successfully */ - assertTrue(mFactory != null); - - /* Create enrolling device */ - mDevice = mFactory.newEnrolleeDevice(mWiFiProvConfig, mWiFiOnBoardingConfig); - - /* Check if the the device is created successfully*/ - assertTrue(mDevice != null); - - /* Check if the the correct device is created as per the given configuration*/ - assertTrue((mDevice instanceof EnrolleeDeviceWiFiOnboarding)); - - - try { - mService.startSetup(mDevice); - // If no exception is thrown means setup started successfully. - assertTrue(true); - - } catch (IOException e) { - assertTrue(false); - } - catch (ESException e) { - assertTrue(false); - } - - try { - - Utility.toWait(lock); - - Log.i("EasySetupTest", "Lock is released"); - - if (!mDevice.isSetupSuccessful()) { - assertTrue(false); - return; - } - - IpOnBoardingConnection conn = (IpOnBoardingConnection) mDevice.getConnection(); - if (conn == null) { - assertTrue(false); - return; - } - - String ip = conn.getIp(); - if (ip == null || ip.isEmpty()) { - assertTrue(false); - return; - } - - String mac = conn.getHardwareAddress(); - if (mac == null || mac.isEmpty()) { - assertTrue(false); - return; - } - - Log.i("EasySetupTest", "Ip" + conn.getIp()); - Log.i("EasySetupTest", "MAC" + conn.getHardwareAddress()); - - // Device configured successfully - assertTrue(true); - - } catch (Exception e) { - e.printStackTrace(); - assertTrue(false); - } - - } - -} \ No newline at end of file diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/androidTest/java/org/iotivity/service/easysetup/mediator/EasySetupStatusTest.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/androidTest/java/org/iotivity/service/easysetup/mediator/EasySetupStatusTest.java deleted file mode 100755 index f3d9d1a..0000000 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/androidTest/java/org/iotivity/service/easysetup/mediator/EasySetupStatusTest.java +++ /dev/null @@ -1,165 +0,0 @@ -//****************************************************************** -// -// Copyright 2015 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -package org.iotivity.service.easysetup.mediator; - -import android.net.wifi.WifiConfiguration; -import android.test.AndroidTestCase; -import android.util.Log; - -import java.io.IOException; - -public class EasySetupStatusTest extends AndroidTestCase { - - - public void testStartSetupWithWiFiOnboarding() { - - EasySetupService mService; - EnrolleeDevice mDevice; - EnrolleeDeviceFactory mFactory; - - final Object lock = new Object(); - - - /* Create Easy Setup service */ - mService = EasySetupService.getInstance(getContext(), new EasySetupStatus() { - EnrolleeState old_state = null; - - @Override - public void onFinished(EnrolleeDevice enrolledevice) { - - //countDownLatch.countDown(); - Utility.toNotify(lock); - - if (enrolledevice.isSetupSuccessful()) { - - if (enrolledevice.mOnBoardingConfig.getConnType() == WiFiOnBoardingConfig.ConnType.WiFi) { - IpOnBoardingConnection conn = (IpOnBoardingConnection) enrolledevice.getConnection(); - String ip = conn.getIp(); - if (ip == null || ip.isEmpty()) { - assertTrue(false); - return; - } - String mac = conn.getHardwareAddress(); - if (mac == null || mac.isEmpty()) { - assertTrue(false); - return; - } - // Device configured successfully - assertTrue(true); - } - - } else { - assertTrue(false); - } - } - - @Override - public void onProgress(EnrolleeDevice enrolleeDevice) { - EnrolleeState state = enrolleeDevice.mState; - // TODO - switch (state) { - case DEVICE_INIT_STATE: - Log.d("enrollee state", "DEVICE_INIT_STATE"); - assertTrue(false); - break; - case DEVICE_ON_BOARDING_STATE: - if (old_state == null) - assertTrue(true); - else assertTrue(false); - old_state = EnrolleeState.DEVICE_ON_BOARDING_STATE; - Log.d("enrollee state", "DEVICE_ON_BOARDING_STATE"); - break; - - case DEVICE_ON_BOARDED_STATE: - if (old_state == EnrolleeState.DEVICE_ON_BOARDING_STATE) - assertTrue(true); - else assertTrue(false); - old_state = EnrolleeState.DEVICE_ON_BOARDED_STATE; - Log.d("enrollee state", "DEVICE_ON_BOARDED_STATE"); - break; - - case DEVICE_PROVISIONING_STATE: - if (old_state == EnrolleeState.DEVICE_ON_BOARDED_STATE) - assertTrue(true); - else assertTrue(false); - old_state = EnrolleeState.DEVICE_PROVISIONING_STATE; - Log.d("enrollee state", "DEVICE_PROVISIONING_STATE"); - break; - - case DEVICE_PROVISIONED_STATE: - if (old_state == EnrolleeState.DEVICE_PROVISIONING_STATE) - assertTrue(true); - else assertTrue(false); - Log.d("enrollee state", "DEVICE_PROVISIONING_SUCCESS_STATE"); - break; - - default: - Log.d("enrollee state", "unknown state"); - assertTrue(false); - break; - } - - } - }); - - - /* Create On boarding configuration */ - WiFiOnBoardingConfig mWiFiOnBoardingConfig = new WiFiOnBoardingConfig(); - mWiFiOnBoardingConfig.setSSId("EasySetup123"); - mWiFiOnBoardingConfig.setSharedKey("EasySetup123"); - mWiFiOnBoardingConfig.setAuthAlgo(WifiConfiguration.AuthAlgorithm.OPEN); - mWiFiOnBoardingConfig.setKms(WifiConfiguration.KeyMgmt.WPA_PSK); - - /* Create provisioning configuration */ - WiFiProvConfig mWiFiProvConfig = new WiFiProvConfig("hub2.4G", "11112222"); - - /* Create enrolling device factory instance */ - mFactory = EnrolleeDeviceFactory.newInstance(getContext()); - - /* Create enrolling device */ - mDevice = mFactory.newEnrolleeDevice(mWiFiProvConfig, mWiFiOnBoardingConfig); - - try { - mService.startSetup(mDevice); - } catch (ESException e) { - } - catch (IOException e) { - } - - try { - - Utility.toWait(lock); - - Log.i("EasySetupTest", "Lock is released"); - - IpOnBoardingConnection conn = (IpOnBoardingConnection) mDevice.getConnection(); - - Log.i("EasySetupTest", "Ip" + conn.getIp()); - Log.i("EasySetupTest", "MAC" + conn.getHardwareAddress()); - - // Device configured successfully - - } catch (Exception e) { - e.printStackTrace(); - } - - } - -} \ No newline at end of file diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/androidTest/java/org/iotivity/service/easysetup/mediator/EnrolleeDeviceFactoryTest.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/androidTest/java/org/iotivity/service/easysetup/mediator/EnrolleeDeviceFactoryTest.java deleted file mode 100755 index f513fa0..0000000 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/androidTest/java/org/iotivity/service/easysetup/mediator/EnrolleeDeviceFactoryTest.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * *************************************************************** - *

- * Copyright 2015 Samsung Electronics All Rights Reserved. - *

- *

- *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *

- * **************************************************************** - */ - -package org.iotivity.service.easysetup.mediator; - -import android.net.wifi.WifiConfiguration; -import android.test.AndroidTestCase; - -public class EnrolleeDeviceFactoryTest extends AndroidTestCase { - - EnrolleeDeviceFactory mFactory; - - @Override - protected void setUp() throws Exception { - super.setUp(); - mFactory = EnrolleeDeviceFactory.newInstance(getContext()); - assertTrue(mFactory != null); - - } - - @Override - protected void tearDown() throws Exception { - super.tearDown(); - mFactory = null; - } - - - public void testNewEnrolleeDevice_with_WiFiOnboarding() { - - /* Create On boarding configuration */ - WiFiOnBoardingConfig mWiFiOnBoardingConfig = new WiFiOnBoardingConfig(); - mWiFiOnBoardingConfig.setSSId("EasySetup123"); - mWiFiOnBoardingConfig.setSharedKey("EasySetup123"); - mWiFiOnBoardingConfig.setAuthAlgo(WifiConfiguration.AuthAlgorithm.OPEN); - mWiFiOnBoardingConfig.setKms(WifiConfiguration.KeyMgmt.WPA_PSK); - - /* Create provisioning configuration */ - WiFiProvConfig mWiFiProvConfig = new WiFiProvConfig("hub2.4G", "11112222"); - - /* Create enrolling device */ - EnrolleeDevice device = mFactory.newEnrolleeDevice(mWiFiProvConfig, mWiFiOnBoardingConfig); - - /* Check if the the device is created */ - assertTrue(device != null); - - /* Check if the the correct device is created as per the given configuration*/ - assertTrue((device instanceof EnrolleeDeviceWiFiOnboarding)); - - } - -} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/core/EnrolleeInfo.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/core/EnrolleeInfo.java deleted file mode 100644 index 29b7432..0000000 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/core/EnrolleeInfo.java +++ /dev/null @@ -1,64 +0,0 @@ -/** - * *************************************************************** - *

- * Copyright 2015 Samsung Electronics All Rights Reserved. - *

- *

- *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *

- * **************************************************************** - */ - -package org.iotivity.service.easysetup.core; - -public class EnrolleeInfo { - - private String IpAddr; - private String HWAddr; - private String Device; - private boolean isReachable; - - public String getIpAddr() { - return IpAddr; - } - - public void setIpAddr(String ipAddr) { - IpAddr = ipAddr; - } - - public String getHWAddr() { - return HWAddr; - } - - public void setHWAddr(String hWAddr) { - HWAddr = hWAddr; - } - - public String getDevice() { - return Device; - } - - public void setDevice(String device) { - Device = device; - } - - public boolean isReachable() { - return isReachable; - } - - public void setReachable(boolean isReachable) { - this.isReachable = isReachable; - } - -} \ No newline at end of file diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/core/EnrolleeOnBoardingInfo.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/core/EnrolleeOnBoardingInfo.java deleted file mode 100644 index cb67017..0000000 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/core/EnrolleeOnBoardingInfo.java +++ /dev/null @@ -1,92 +0,0 @@ -/** - * *************************************************************** - *

- * Copyright 2015 Samsung Electronics All Rights Reserved. - *

- *

- *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *

- * **************************************************************** - */ -package org.iotivity.service.easysetup.core; - -public class EnrolleeOnBoardingInfo { - - private String IpAddr; - private String HWAddr; - private String Device; - private boolean isReachable; - private boolean isAdditionNotified; - private boolean isRemovalNotified; - - public EnrolleeOnBoardingInfo(String ipAddr, String hWAddr, String device, - boolean isReachable, boolean isRemovalNotified, - boolean isAdditionNotified) { - this.IpAddr = ipAddr; - this.HWAddr = hWAddr; - this.Device = device; - this.isReachable = isReachable; - this.isRemovalNotified = isRemovalNotified; - this.isAdditionNotified = isAdditionNotified; - } - - public String getIpAddr() { - return IpAddr; - } - - public void setIpAddr(String ipAddr) { - IpAddr = ipAddr; - } - - public String getHWAddr() { - return HWAddr; - } - - public void setHWAddr(String hWAddr) { - HWAddr = hWAddr; - } - - public String getDevice() { - return Device; - } - - public void setDevice(String device) { - Device = device; - } - - public boolean isReachable() { - return isReachable; - } - - public void setReachable(boolean isReachable) { - this.isReachable = isReachable; - } - - public boolean isRemovalNotified() { - return isRemovalNotified; - } - - public void setRemovalNotified(boolean isRemovalNotified) { - this.isRemovalNotified = isRemovalNotified; - } - - public boolean isAdditionNotified() { - return isAdditionNotified; - } - - public void setAdditionNotified(boolean isAdditionNotified) { - this.isAdditionNotified = isAdditionNotified; - } - -} \ No newline at end of file diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/core/ip/WiFiSoftAPManager.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/core/ip/WiFiSoftAPManager.java deleted file mode 100644 index 40bfd12..0000000 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/core/ip/WiFiSoftAPManager.java +++ /dev/null @@ -1,301 +0,0 @@ -/** - * *************************************************************** - *

- * Copyright 2015 Samsung Electronics All Rights Reserved. - *

- *

- *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *

- * **************************************************************** - */ - -package org.iotivity.service.easysetup.core.ip; - -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.lang.reflect.Method; -import java.net.InetAddress; -import java.util.ArrayList; - -import android.content.Context; -import android.net.wifi.WifiConfiguration; -import android.net.wifi.WifiManager; -import android.util.Log; - -import org.iotivity.service.easysetup.core.EnrolleeInfo; -import org.iotivity.service.easysetup.core.EnrolleeOnBoardingInfo; -import org.iotivity.service.easysetup.core.IOnBoardingStatus; - -/** - * WiFiSoftAPManager provides wrapper methods for accessing Android Soft Access Point functionality. - * This is a convenient class, providing Android "WiFiManager" kind of equivalent class for Soft AP. - *

- * Note: Android doesn't provide public APIs for Soft Access Point feature access. - * This class provides only reference implementation to use the Soft AP and it uses Java reflection - * for access Soft Access point features. - *

- */ -public class WiFiSoftAPManager { - private static final String TAG = WiFiSoftAPManager.class.getName(); - private final WifiManager mWifiManager; - private Context context; - static ArrayList appNotification = - new ArrayList(); - IOnBoardingStatus finishListener = null; - - public enum WIFI_AP_STATE { - WIFI_AP_STATE_DISABLING, - WIFI_AP_STATE_DISABLED, - WIFI_AP_STATE_ENABLING, - WIFI_AP_STATE_ENABLED, - WIFI_AP_STATE_FAILED - } - - public WiFiSoftAPManager(Context context) { - this.context = context; - mWifiManager = (WifiManager) this.context - .getSystemService(Context.WIFI_SERVICE); - } - - /* - * Utility API to check the validity of the MAC Address read from the ARP cache - */ - private boolean CheckIfValidMacAddress(String macAddr) { - if (macAddr.matches("..:..:..:..:..:..")) { - return true; - } else { - return false; - } - } - - /* - * The API is used for checking the device entry in the list maintained for the device - * notifications. - * If device entry is not found in the list, app is notified. - * If the device entry is found in the device, as application is already notified it will - * continue - */ - private boolean CheckForDeviceEntryAndNotify(String ipAddr, - String macAddr, boolean isReachable) { - final EnrolleeInfo result = new EnrolleeInfo(); - boolean deviceAddedToList = false; - - if (appNotification.size() > 0) { - for (EnrolleeOnBoardingInfo ipDeviceOnBoardingNotification : appNotification) { - EnrolleeOnBoardingInfo ipEnrolleeDevice = (EnrolleeOnBoardingInfo) - ipDeviceOnBoardingNotification; - boolean macAddressComparison = ipEnrolleeDevice.getHWAddr().equalsIgnoreCase( - macAddr) ? true : false; - - if (macAddressComparison) { - deviceAddedToList = true; - - if (ipDeviceOnBoardingNotification - .isAdditionNotified() - && isReachable) { - continue; - } else if (ipDeviceOnBoardingNotification - .isRemovalNotified() - && !isReachable) { - continue; - } else { - result.setIpAddr(ipAddr); - result.setHWAddr(macAddr); - result.setReachable(isReachable); - - appNotification - .remove(ipDeviceOnBoardingNotification); - if (isReachable) { - appNotification - .add(new EnrolleeOnBoardingInfo(ipAddr, macAddr, "", - isReachable, - false, true)); - } else { - //This case will happen during the transition from connected to - // disconneted. This case need not be notified to application. - // Notifying this state will cause failure of OnBoarding - } - NotifyApplication(result); - return true; - } - } - } - if (!deviceAddedToList) { - if (isReachable) { - appNotification - .add(new EnrolleeOnBoardingInfo(ipAddr, macAddr, "", isReachable, false, - true)); - - result.setIpAddr(ipAddr); - result.setHWAddr(macAddr); - result.setReachable(isReachable); - - NotifyApplication(result); - } else { - //This case will happen for the first time device is listed, but reachability - // is false. This case need not be notified to application. Notifying this - // state will cause failure of OnBoarding - } - return true; - } - } else { - if (isReachable) { - appNotification - .add(new EnrolleeOnBoardingInfo(ipAddr, macAddr, "", isReachable, false, - true)); - result.setIpAddr(ipAddr); - result.setHWAddr(macAddr); - result.setReachable(isReachable); - - NotifyApplication(result); - } else { - //This case will happen for the first time device is listed, but - // reachability is false. This case need not be notified to - // application. Notifying this state will cause failure of OnBoarding - } - - return true; - } - return false; - } - - /** - * Start WiFi Soft AccessPoint mode with the specified configuration. - * If the Soft AP is already running, this API call will update the new configuration. - *

- * Note: Starting Wi-Fi Soft Access Point will disable the Wi-Fi normal operation. - *

- * - * @param wifiConfig SSID, security and channel details as part of WifiConfiguration - * @return {@code true} if the operation succeeds, {@code false} otherwise - */ - public boolean setWifiApEnabled(WifiConfiguration wifiConfig, - boolean enabled) { - try { - appNotification.clear(); - // Stopping Wi-Fi mode - if (enabled) { - mWifiManager.setWifiEnabled(false); - } - - Method method = mWifiManager.getClass().getMethod( - "setWifiApEnabled", WifiConfiguration.class, boolean.class); - return (Boolean) method.invoke(mWifiManager, wifiConfig, enabled); - } catch (Exception e) { - Log.e(this.getClass().toString(), "", e); - return false; - } - } - - /** - * Gets a list of the Soft AP clients connected to the Wi-Fi Soft Access point - * - * @param finishListener Interface called when the scan method finishes - * @param reachableTimeout Reachable Timeout in miliseconds - */ - public synchronized void getClientList(IOnBoardingStatus finishListener, final int - reachableTimeout) { - this.finishListener = finishListener; - //Clearing the scan list for providing u - appNotification.clear(); - Runnable runnable = new Runnable() { - public void run() { - Log.i(TAG, "Scanning enrolling device in the network"); - - BufferedReader bufferedReader = null; - - try { - // Note : This is a reference implementation for getting the list of Enrollee's - // connected to the Soft AP. - // There is no Android API for getting list of connected devices to the Soft AP. - // The connected device information is fetched from Arp cache for Soft AP and - // it is maintained in the file "/proc/net/arp" - // This holds an ASCII readable dump of the kernel ARP table used - // for address resolutions. It will show both dynamically learned - // and preprogrammed ARP entries. The format is: - // IP address HW type Flags HW address Mask Device - // 192.168.0.50 0x1 0x2 00:50:BF:25:68:F3 * eth0 - // 192.168.0.250 0x1 0xc 00:00:00:00:00:00 * eth0 - bufferedReader = new BufferedReader(new InputStreamReader( - new FileInputStream("/proc/net/arp"), "UTF-8")); - String line; - while ((line = bufferedReader.readLine()) != null) { - //ARP entries are splitted using Regex for getting the IP and MAC Address - // info - String[] arpEntry = line.split(" +"); - - if ((arpEntry != null) && (arpEntry.length >= 4)) { - String ipAddr = arpEntry[0]; - String macAddr = arpEntry[3]; - - - // Checking if the string is matching MAC Address is matching the - // standard MAC address format. - // If the entry is not matching with MAC address format, - // it will continue - if (CheckIfValidMacAddress(macAddr)) { - boolean isReachable = InetAddress.getByName( - ipAddr).isReachable( - reachableTimeout); - - Log.i("exec statement", ipAddr); - Log.i("Return Value", " " + isReachable); - - // Checking if the app notification entries are available in the - // list for the current device - // API returns true is there is a notification to the application. - // API returns false if there is no entry or if device is - // already notified - if (CheckForDeviceEntryAndNotify(ipAddr, macAddr, isReachable)) { - break; - } - } - } - } - } catch (Exception e) { - Log.e(this.getClass().toString(), e.toString()); - } finally { - try { - bufferedReader.close(); - } catch (IOException e) { - Log.e(this.getClass().toString(), e.getMessage()); - } - } - } - }; - - Thread mythread = new Thread(runnable); - mythread.start(); - } - - void NotifyApplication(final EnrolleeInfo result) { - // Get a handler that can be used to post to the main thread -/* - Handler mainHandler = new Handler(context.getMainLooper()); - Runnable myRunnable = new Runnable() { - @Override - public void run() { - finishListener.deviceOnBoardingStatus(result); - } - }; - mainHandler.post(myRunnable); -*/ - Log.i(TAG, "Scanning is finished with result, IP : " + result.getIpAddr() + "Notifying " + - "to Application"); - finishListener.deviceOnBoardingStatus(result); - - } -} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/CloudProp.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/CloudProp.java new file mode 100644 index 0000000..6f4d5be --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/CloudProp.java @@ -0,0 +1,118 @@ +/** + * *************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * **************************************************************** + */ + +package org.iotivity.service.easysetup.mediator; + +import android.util.Log; + +import org.iotivity.base.OcException; +import org.iotivity.base.OcRepresentation; + +/** + * This class contains cloud server properties to be delivered to Enrollee + */ +public class CloudProp { + private static final String TAG = CloudProp.class.getName(); + protected OcRepresentation mRep; + protected String mCloudID; + + /** + * Constructor + */ + public CloudProp() { + mRep = new OcRepresentation(); + mCloudID = ""; + } + + public void setCloudProp(String authCode, String authProvider, String ciServer) + { + try { + mRep.setValue(ESConstants.OC_RSRVD_ES_AUTHCODE, authCode); + mRep.setValue(ESConstants.OC_RSRVD_ES_AUTHPROVIDER, authProvider); + mRep.setValue(ESConstants.OC_RSRVD_ES_CISERVER, ciServer); + } catch (OcException e) { + Log.e(TAG, "setCloudProp is failed."); + } + } + + public void setCloudID(String cloudID) + { + mCloudID = cloudID; + } + + /** + * This method returns the authCode used for the first registration to IoTivity cloud + * @return AuthCode for sign-up to IoTivity cloud + */ + public String getAuthCode() + { + try { + if (mRep.hasAttribute(ESConstants.OC_RSRVD_ES_AUTHCODE)) + return mRep.getValue(ESConstants.OC_RSRVD_ES_AUTHCODE); + } catch (OcException e) { + Log.e(TAG, "getAuthCode is failed."); + } + return new String(""); + } + + /** + * This method returns the auth provider which issued the given AuthCode + * @return Auth provider which issued the given AuthCode + */ + public String getAuthProvider() + { + try { + if (mRep.hasAttribute(ESConstants.OC_RSRVD_ES_AUTHPROVIDER)) + return mRep.getValue(ESConstants.OC_RSRVD_ES_AUTHPROVIDER); + } catch (OcException e) { + Log.e(TAG, "getAuthProvider is failed."); + } + return new String(""); + } + + /** + * This method returns the Cloud Interface server's URL to be registered + * @return CI server's URL to be registered + */ + public String getCiServer() + { + try { + if (mRep.hasAttribute(ESConstants.OC_RSRVD_ES_CISERVER)) + return mRep.getValue(ESConstants.OC_RSRVD_ES_CISERVER); + } catch (OcException e) { + Log.e(TAG, "getCiServer is failed."); + } + return new String(""); + } + + /** + * This method returns the Cloud Interface server's UUID + * @return CI server's UUID + */ + public String getCloudID() + { + return mCloudID; + } + + public OcRepresentation toOCRepresentation() + { + return mRep; + } +} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/OnBoardingCallback.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/CloudPropProvisioningCallback.java old mode 100644 new mode 100755 similarity index 51% rename from service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/OnBoardingCallback.java rename to service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/CloudPropProvisioningCallback.java index 08c75f9..f0583d1 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/OnBoardingCallback.java +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/CloudPropProvisioningCallback.java @@ -1,27 +1,42 @@ /** * *************************************************************** - *

- * Copyright 2015 Samsung Electronics All Rights Reserved. - *

- *

- *

+ * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - *

+ * * http://www.apache.org/licenses/LICENSE-2.0 - *

+ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - *

+ * * **************************************************************** */ package org.iotivity.service.easysetup.mediator; -public abstract class OnBoardingCallback { - public abstract void onFinished(OnBoardingConnection connection); +import org.iotivity.service.easysetup.mediator.CloudPropProvisioningStatus; + +/** + * This interface class is used as a callback function called after receiving + * a response of cloud property provisioning result + * + * @see CloudPropProvisioningStatus + */ +public abstract class CloudPropProvisioningCallback { + + /** + * Called after receiving a response of cloud property provisioning result + * + * @param status + * a result of cloud property provisioning + * a state of cloud property provisioning + */ + public abstract void onProgress(CloudPropProvisioningStatus status); } + diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/CloudPropProvisioningStatus.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/CloudPropProvisioningStatus.java new file mode 100644 index 0000000..bd557e4 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/CloudPropProvisioningStatus.java @@ -0,0 +1,72 @@ +/** + * *************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * **************************************************************** + */ + +package org.iotivity.service.easysetup.mediator; + +import org.iotivity.service.easysetup.mediator.enums.ESCloudProvState; +import org.iotivity.service.easysetup.mediator.enums.ESResult; + +/** + * This interface facilitates Application to get progress & result of Cloud provisioning + * process in easy setup + */ +public class CloudPropProvisioningStatus +{ + private ESResult m_result; + private ESCloudProvState m_esCloudState; + + /** + * Constructor + * + * @param result a result of cloud property provisioning + * @param state a state of cloud property provisioning. + * ES_CLOUD_PROVISIONING_ERROR(-1), ES_CLOUD_PROVISIONING_SUCCESS(0), + * ES_CLOUD_ENROLLEE_FOUND(1), ES_CLOUD_ENROLLEE_NOT_FOUND(2) + * + * @see ESCloudProvState + */ + public CloudPropProvisioningStatus(int result, int state) + { + m_result = ESResult.fromInt(result); + m_esCloudState = ESCloudProvState.fromInt(state); + } + + /** + * Get a result of cloud property provisioning + * + * @result ESResult a result of cloud property provisioning + */ + public ESResult getESResult() + { + return m_result; + } + + /** + * Get a state of cloud property provisioning + * + * @result ESCloudProvState a state of cloud property provisioning + * + * @see ESCloudProvState + */ + public ESCloudProvState getESCloudState() + { + return m_esCloudState; + } +}; diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/DeviceProp.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/DeviceProp.java new file mode 100644 index 0000000..ea77df1 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/DeviceProp.java @@ -0,0 +1,170 @@ +/** + * *************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * **************************************************************** + */ + +package org.iotivity.service.easysetup.mediator; + +import android.util.Log; + +import org.iotivity.service.easysetup.mediator.enums.WIFI_AUTHTYPE; +import org.iotivity.service.easysetup.mediator.enums.WIFI_ENCTYPE; + +import org.iotivity.base.OcException; +import org.iotivity.base.OcRepresentation; + +/** + * This class contains device properties to be delivered to Enrollee + */ +public class DeviceProp { + private static final String TAG = DeviceProp.class.getName(); + protected OcRepresentation mRep; + + /** + * Constructor + */ + public DeviceProp() { + mRep = new OcRepresentation(); + } + + public void setWiFiProp(String ssid, String pwd, WIFI_AUTHTYPE authtype, WIFI_ENCTYPE enctype) + { + try + { + mRep.setValue(ESConstants.OC_RSRVD_ES_SSID, ssid); + mRep.setValue(ESConstants.OC_RSRVD_ES_CRED, pwd); + mRep.setValue(ESConstants.OC_RSRVD_ES_AUTHTYPE, authtype.getValue()); + mRep.setValue(ESConstants.OC_RSRVD_ES_ENCTYPE, enctype.getValue()); + } catch (OcException e) { + Log.e(TAG, "setWiFiProp is failed."); + } + } + + public void setDevConfProp(String language, String country) + { + try { + mRep.setValue(ESConstants.OC_RSRVD_ES_LANGUAGE, language); + mRep.setValue(ESConstants.OC_RSRVD_ES_COUNTRY, country); + } catch (OcException e) { + Log.e(TAG, "setDevConfProp is failed."); + } + } + + /** + * Get WiFi AP's SSID + * + * @return String WiFi AP's SSID + */ + public String getSsid() + { + try { + if(mRep.hasAttribute(ESConstants.OC_RSRVD_ES_SSID)) + return mRep.getValue(ESConstants.OC_RSRVD_ES_SSID); + } catch (OcException e) { + Log.e(TAG, "getSsid is failed."); + } + return new String(""); + } + + /** + * Get WiFi AP's password + * + * @return String WiFi AP's password + */ + public String getPassword() + { + try { + if(mRep.hasAttribute(ESConstants.OC_RSRVD_ES_CRED)) + return mRep.getValue(ESConstants.OC_RSRVD_ES_CRED); + } catch (OcException e) { + Log.e(TAG, "getPassword is failed."); + } + return new String(""); + } + + /** + * Get WiFi AP's authenticate type + * NONE_AUTH(0), WEP(1), WPA_PSK(2), WPA2_PSK(3) + * + * @return WIFI_AUTHTYPE WiFi AP's authenticate type + */ + public WIFI_AUTHTYPE getAuthType() + { + try { + if (mRep.hasAttribute(ESConstants.OC_RSRVD_ES_AUTHTYPE)) + return WIFI_AUTHTYPE.fromInt((int)mRep.getValue(ESConstants.OC_RSRVD_ES_AUTHTYPE)); + } catch (OcException e) { + Log.e(TAG, "getAuthType is failed."); + } + return WIFI_AUTHTYPE.NONE_AUTH; + } + + /** + * Get WiFi AP's encryption type + * NONE_ENC(0), WEP_64(1), WEP_128(2), TKIP(3), AES(4), TKIP_AES(5) + * + * @return WIFI_ENCTYPE WiFi AP's encryption type + */ + public WIFI_ENCTYPE getEncType() + { + try { + if (mRep.hasAttribute(ESConstants.OC_RSRVD_ES_ENCTYPE)) + return WIFI_ENCTYPE.fromInt((int)mRep.getValue(ESConstants.OC_RSRVD_ES_ENCTYPE)); + } catch (OcException e) { + Log.e(TAG, "getEncType is failed."); + } + return WIFI_ENCTYPE.NONE_ENC; + } + + /** + * Get IETF language tag using ISO 639X + * + * @return String IETF language tag using ISO 639X + */ + public String getLanguage() + { + try { + if(mRep.hasAttribute(ESConstants.OC_RSRVD_ES_LANGUAGE)) + return mRep.getValue(ESConstants.OC_RSRVD_ES_LANGUAGE); + } catch (OcException e) { + Log.e(TAG, "getLanguage is failed."); + } + return new String(""); + } + + /** + * Get ISO Country Code (ISO 3166-1 Alpha-2) + * + * @return String ISO Country Code (ISO 3166-1 Alpha-2) + */ + public String getCountry() + { + try { + if (mRep.hasAttribute(ESConstants.OC_RSRVD_ES_COUNTRY)) + return mRep.getValue(ESConstants.OC_RSRVD_ES_COUNTRY); + } catch (OcException e) { + Log.e(TAG, "getCountry is failed."); + } + return new String(""); + } + + public OcRepresentation toOCRepresentation() + { + return mRep; + } +} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/OnBoardingConnection.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/DevicePropProvisioningCallback.java similarity index 54% rename from service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/OnBoardingConnection.java rename to service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/DevicePropProvisioningCallback.java index 3267536..cc76f9f 100644 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/OnBoardingConnection.java +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/DevicePropProvisioningCallback.java @@ -1,50 +1,41 @@ /** * *************************************************************** - *

- * Copyright 2015 Samsung Electronics All Rights Reserved. - *

- *

- *

+ * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - *

+ * * http://www.apache.org/licenses/LICENSE-2.0 - *

+ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - *

+ * * **************************************************************** */ + package org.iotivity.service.easysetup.mediator; +import org.iotivity.service.easysetup.mediator.DevicePropProvisioningStatus; + /** - * This interface contains the connection details of the enrollee device + * This interface class is used as a callback function called after receiving + * a response of device property provisioning result + * + * @see DevicePropProvisioningStatus */ -public interface OnBoardingConnection { - - /** - * This method returns the implementation of the Connection - * - * @return implementation - */ - public Object getConnection(); +public abstract class DevicePropProvisioningCallback { /** - * This method returns description on the connectivity. + * Called after receiving a response of device property provisioning result * - * @return description - */ - public String getDesc(); - - /** - * This method is used to know if the device is connected or not + * @param status a result of device property provisioning * - * @return True if connected or False + * @see DevicePropProvisioningStatus */ - public boolean isConnected(); - + public abstract void onProgress(DevicePropProvisioningStatus status); } diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/DevicePropProvisioningStatus.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/DevicePropProvisioningStatus.java new file mode 100644 index 0000000..344b93f --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/DevicePropProvisioningStatus.java @@ -0,0 +1,51 @@ +/** + * *************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * **************************************************************** + */ + +package org.iotivity.service.easysetup.mediator; + +import org.iotivity.service.easysetup.mediator.enums.ESResult; + +/** + * This class indicates a result if a provisionDeviceProperties API succeed or fails + */ +public class DevicePropProvisioningStatus +{ + private ESResult m_result; + + /** + * Constructor + * + * @param result a result if a provisionDeviceProperties API succeed or fails + */ + public DevicePropProvisioningStatus(int result) + { + m_result = ESResult.fromInt(result); + } + + /** + * Get a result if a provisionDeviceProperties API succeed or fails + * + * @return ESResult a result if a provisionDeviceProperties API succeed or fails + */ + public ESResult getESResult() + { + return m_result; + } +}; diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/ESConstants.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/ESConstants.java new file mode 100644 index 0000000..a6061a1 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/ESConstants.java @@ -0,0 +1,37 @@ +package org.iotivity.service.easysetup.mediator; + +/** + * Created by jhha85 on 7/27/16. + */ +public class ESConstants { + + public static final String OC_RSRVD_ES_PROVSTATUS = "ps"; + public static final String OC_RSRVD_ES_LAST_ERRORCODE = "lec"; + public static final String OC_RSRVD_ES_LINKS = "links"; + public static final String OC_RSRVD_ES_SUPPORTEDWIFIMODE = "swmt"; + public static final String OC_RSRVD_ES_SUPPORTEDWIFIFREQ = "swf"; + public static final String OC_RSRVD_ES_SSID = "tnn"; + public static final String OC_RSRVD_ES_CRED = "cd"; + public static final String OC_RSRVD_ES_AUTHTYPE = "wat"; + public static final String OC_RSRVD_ES_ENCTYPE = "wet"; + public static final String OC_RSRVD_ES_AUTHCODE = "ac"; + public static final String OC_RSRVD_ES_AUTHPROVIDER = "apn"; + public static final String OC_RSRVD_ES_CISERVER = "cis"; + public static final String OC_RSRVD_ES_SERVERID = "sid"; + public static final String OC_RSRVD_ES_DEVNAME = "dn"; + public static final String OC_RSRVD_ES_LANGUAGE = "lang"; + public static final String OC_RSRVD_ES_COUNTRY = "ctry"; + +/** +* Easysetup defined resoruce types and uris +*/ + public static final String OC_RSRVD_ES_RES_TYPE_PROV = "ocf.wk.prov"; + public static final String OC_RSRVD_ES_URI_PROV = "/ProvisioningResURI"; + public static final String OC_RSRVD_ES_RES_TYPE_WIFI = "ocf.wk.wifi"; + public static final String OC_RSRVD_ES_URI_WIFI = "/WiFiProvisioningResURI"; + public static final String OC_RSRVD_ES_RES_TYPE_CLOUDSERVER = "ocf.wk.cloudserver"; + public static final String OC_RSRVD_ES_URI_CLOUDSERVER = "/CloudServerProvisioningResURI"; + public static final String OC_RSRVD_ES_RES_TYPE_DEVCONF = "ocf.wk.devconf"; + public static final String OC_RSRVD_ES_URI_DEVCONF = "/DevConfProvisioningResURI"; + +} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EasySetup.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EasySetup.java new file mode 100755 index 0000000..56a7d80 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EasySetup.java @@ -0,0 +1,108 @@ +/** + * *************************************************************** + * + * Copyright 2017 Samsung Electronics All Rights Reserved. + * + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * **************************************************************** + */ + +package org.iotivity.service.easysetup.mediator; + +import android.content.Context; +import android.util.Log; + +import org.iotivity.base.OcConnectivityType; +import org.iotivity.base.OcResource; +import org.iotivity.base.OcPlatform; + +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; + +/** + * This provides an API to instanciate a new RemoteEnrollee object correspondent to Enrollee + * Device to be setup. + */ +public class EasySetup { + + private static final String TAG = EasySetup.class.getName(); + public static final String PROV_RESOURCE_TYPE = "ocf.wk.prov"; + private static EasySetup sInstance; + + private static Context mContext; + + private ArrayList mRemoteEnrolleeList; + + protected RemoteEnrollee mRemoteEnrollee; + + // function to call the native nativeCreateRemoteEnrollee + private native RemoteEnrollee nativeCreateRemoteEnrollee(OcResource enrolleeResource); + static { + // Load Easy Setup JNI interface + try + { + System.loadLibrary("ocprovision"); + } catch (UnsatisfiedLinkError e) { + Log.i(TAG, "ocprovision library does not exist. (Unsecure mode)"); + } + + System.loadLibrary("ocstack-jni"); + System.loadLibrary("ESMediatorRich"); + System.loadLibrary("easysetup-jni"); + } + + private EasySetup() { + mRemoteEnrolleeList = new ArrayList(); + mContext = null; + } + + /** + * Gives a singleton instance of Easy setup and initialize the easy setup + */ + public synchronized static EasySetup getInstance(Context context) { + if (sInstance == null) { + sInstance = new EasySetup(); + mContext = context; + } + return sInstance; + } + + /** + * This API is used for creating a remote Enrollee instance + * + * @param enrolleeResource an OCResource object corresponding to enrollee resource + * discovered in a network. The OcResource object can be obtained by calling + * OcPlatform.findResource() API. What resource you have to discover with + * the OcPlatform.findResource() API is a "provisioning" resource with a certain + * resource type, i.e. ocf.wk.prov + * + * @return Pointer to RemoteEnrollee instance + */ + public synchronized RemoteEnrollee createRemoteEnrollee(OcResource enrolleeResource) + { + // native call + if(!enrolleeResource.getResourceTypes().contains(PROV_RESOURCE_TYPE) + || !enrolleeResource.getResourceInterfaces().contains(OcPlatform.BATCH_INTERFACE)) + { + Log.e(TAG, "Validation check for OcResource is failed."); + return null; + } + mRemoteEnrollee = nativeCreateRemoteEnrollee(enrolleeResource); + mRemoteEnrolleeList.add(mRemoteEnrollee); + return mRemoteEnrollee; + } +} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EasySetupService.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EasySetupService.java deleted file mode 100755 index 128dc14..0000000 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EasySetupService.java +++ /dev/null @@ -1,233 +0,0 @@ -/** - * *************************************************************** - *

- * Copyright 2015 Samsung Electronics All Rights Reserved. - *

- *

- *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *

- * **************************************************************** - */ - -package org.iotivity.service.easysetup.mediator; - -import android.content.Context; -import android.util.Log; - -import java.io.IOException; -import java.util.ArrayList; - -/** - * This is facade class, a single point of contact for Application. - * It contains set of APIs to do easy setup of the enrolling device. - * ON-BOARDING - This is a step to establish connectivity between the device & Mediator device. - * PROVISION - This is a step where the netowork's detail & credentials are given to the - * enrolling device. - */ -public class EasySetupService { - - private static final String TAG = EasySetupService.class.getName(); - - private static EasySetupService sInstance; - - private final EasySetupStatus mCallback; - - private ArrayList mEnrolleeDeviceList; - - private final ProvisioningCallback mProvisioningCallback; - - private static Context mContext; - - protected RemoteEnrollee mRemoteEnrollee; - - //function to call the native createEnrolleeDevice - private native RemoteEnrollee nativeCreateEnrolleeDevice(String ip, String ssid, - String password, int type, boolean isSecured ); - - static { - // Load Easy Setup JNI interface - System.loadLibrary("ESMediatorRich"); - System.loadLibrary("easysetup-jni"); - } - - private EasySetupService(EasySetupStatus callback) { - mCallback = callback; - mProvisioningCallback = new ProvisioningCallbackImpl(mCallback); - mEnrolleeDeviceList = new ArrayList(); - mContext = null; - } - - /** - * Gives a singleton instance of Easy setup service and initialize the service - * - * @param callback Application needs to provide this callback to receive the status of easy - * setup process. - */ - - public synchronized static EasySetupService getInstance(Context context, EasySetupStatus - callback) { - if (sInstance == null) { - sInstance = new EasySetupService(callback); - mContext = context; - } - return sInstance; - } - - /** - * Reset the Easy setup Service - */ - - public void finish() { - //Call the stop Provisioning - for (EnrolleeDevice enrolleeDevice : mEnrolleeDeviceList) { - enrolleeDevice.stopProvisioningProcess(); - } - } - - /** - * Starts Easy setup process for the enrolling device. - * - * @param enrolledevice Device to be enrolled in network - * @throws IOException Throws exception in case of any connection error. - */ - - public synchronized void startSetup(final EnrolleeDevice enrolledevice) throws IOException,ESException { - - if (null == enrolledevice) { - throw new ESException("enrolledevice is NULL"); - } - - mEnrolleeDeviceList.add(enrolledevice); - - // Starts the provisioning directly if the device is already on boarded on the network. - if (enrolledevice.onBoarded()) { - if(null == enrolledevice.mRemoteEnrollee){ - //create Native RemoteEnrollee - WiFiProvConfig config = (WiFiProvConfig)enrolledevice.mProvConfig; - String ip = ""; - String ssid = config.getSsId(); - String password = config.getPassword(); - int connectivityType = config.getConnType().getValue(); - boolean isSecured = config.isSecured(); - - //native call - mRemoteEnrollee = nativeCreateEnrolleeDevice(ip, ssid, password, - connectivityType, isSecured); - enrolledevice.mRemoteEnrollee = mRemoteEnrollee; - } - enrolledevice.startProvisioning(mProvisioningCallback); - return; - } - enrolledevice.mState = EnrolleeState.DEVICE_ON_BOARDING_STATE; - mCallback.onProgress(enrolledevice); - enrolledevice.startOnBoarding(new OnBoardingCallback() { - - @Override - public void onFinished(OnBoardingConnection connection) { - if (connection.isConnected()) { - Log.i(TAG, "On boarding is successful "); - // Start provisioning here - enrolledevice.mState = EnrolleeState.DEVICE_ON_BOARDED_STATE; - mCallback.onProgress(enrolledevice); - enrolledevice.setConnection(connection); - - //create a native RemoteEnrollee with network info - IpOnBoardingConnection conn = (IpOnBoardingConnection) connection; - WiFiProvConfig config = (WiFiProvConfig)enrolledevice.mProvConfig; - String ip = conn.getIp(); - String ssid = config.getSsId(); - String password = config.getPassword(); - int connectivityType = config.getConnType().getValue(); - boolean isSecured = config.isSecured(); - - //native call - mRemoteEnrollee = nativeCreateEnrolleeDevice(ip, ssid, password, - connectivityType, isSecured); - - enrolledevice.mRemoteEnrollee = mRemoteEnrollee; - - /* Delay is set according to Soft AP host and Mediator platform; - * For Android with Soft AP it is 2000 ms - */ - delayProvisioning(connection); - enrolledevice.startProvisioning(mProvisioningCallback); - } else { - enrolledevice.mState = EnrolleeState.DEVICE_INIT_STATE; - mProvisioningCallback.onFinished(enrolledevice); - } - } - }); - } - - /** - * Stops on-going Easy setup process for enrolling device. - * - * @param enrolleedevice Device to be enrolled in network - */ - public synchronized void stopSetup(EnrolleeDevice enrolleedevice) throws ESException { - - if (null == enrolleedevice) { - throw new ESException("enrolledevice is NULL"); - } - - if (mEnrolleeDeviceList.contains(enrolleedevice)) { - if (enrolleedevice.mState == EnrolleeState.DEVICE_ON_BOARDING_STATE) { - Log.i(TAG, "stopOnBoardingProcess for enrolleedevice"); - enrolleedevice.stopOnBoardingProcess(); - }else if (enrolleedevice.mState == EnrolleeState.DEVICE_PROVISIONING_STATE) { - Log.i(TAG, "stopEnrolleeProvisioning for enrolleedevice"); - enrolleedevice.stopProvisioningProcess(); - } - enrolleedevice.mState = EnrolleeState.DEVICE_INIT_STATE; - mCallback.onProgress(enrolleedevice); - mEnrolleeDeviceList.remove(enrolleedevice); - } - } - - class ProvisioningCallbackImpl extends ProvisioningCallback { - - private final EasySetupStatus mCallback; - - ProvisioningCallbackImpl(EasySetupStatus callback) { - mCallback = callback; - } - - @Override - public void onFinished(EnrolleeDevice enrolledevice) { - synchronized (EasySetupService.this) { - if (mEnrolleeDeviceList.contains(enrolledevice)) { - Log.i(TAG, "onFinished() is received " + enrolledevice.isSetupSuccessful()); - mCallback.onFinished(enrolledevice); - mEnrolleeDeviceList.remove(enrolledevice); - } - } - } - - @Override - public void onProgress(EnrolleeDevice enrolledevice) { - mCallback.onProgress(enrolledevice); - } - } - - private void delayProvisioning(OnBoardingConnection conn) { - if (((IpOnBoardingConnection)conn).getThrottlingDelay()>0) { - try { - Log.i(TAG, "waiting for 20 seconds to start provisioning"); - Thread.sleep(20000);//Sleep for allowing thin device to start the services - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } -} \ No newline at end of file diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EasySetupStatus.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EasySetupStatus.java deleted file mode 100644 index b9da262..0000000 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EasySetupStatus.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * *************************************************************** - *

- * Copyright 2015 Samsung Electronics All Rights Reserved. - *

- *

- *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *

- * **************************************************************** - */ - -package org.iotivity.service.easysetup.mediator; - -/** - * This interface facilitates Application to get progress & result of Easy setup - * process Easy setup process. - */ -public interface EasySetupStatus { - - /** - * This method is called back when easy setup process is finished. Easy - * setup process status can read from the APIs given in Enrollee class.This - * method is called on worker thread, UI operations to be executed on main / - * Ui Thread. - * - * @param enrolledevice Device to be enrolled in network through Easy setup process - */ - public void onFinished(EnrolleeDevice enrolledevice); - - /** - * This method is called back to give intermediate progress on the easy - * setup process This method is called on worker thread, UI operations to be - * executed on main / Ui Thread. - * - * @param enrolleeDevice Gives state of the device changed during easy setup process - */ - public void onProgress(EnrolleeDevice enrolleeDevice); - -} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EnrolleeConf.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EnrolleeConf.java new file mode 100755 index 0000000..dca0ef5 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EnrolleeConf.java @@ -0,0 +1,144 @@ +/** + * *************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * **************************************************************** + */ + +package org.iotivity.service.easysetup.mediator; + +import android.util.Log; + +import org.iotivity.base.OcException; +import org.iotivity.base.OcRepresentation; +import org.iotivity.service.easysetup.mediator.ESConstants; +import org.iotivity.service.easysetup.mediator.enums.WIFI_FREQ; +import org.iotivity.service.easysetup.mediator.enums.WIFI_MODE; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * This class stores Enrollee's configuration including WiFi and Device configuration + * including supported WiFi frequency and device name + */ +public class EnrolleeConf +{ + private static final String TAG = EnrolleeConf.class.getName(); + private OcRepresentation mProvRep = null, mWiFiRep = null, mDevConfRep = null, mCloudRep = null; + /** + * Constructor + * + * @param rep received properties in a form of OcRepresentation + * + */ + public EnrolleeConf(OcRepresentation rep) + { + mProvRep = rep; + + List children = rep.getChildren(); + + for (OcRepresentation child : children) { + List rts = child.getResourceTypes(); + + if(child.getUri().indexOf(ESConstants.OC_RSRVD_ES_URI_WIFI) != -1) + { + mWiFiRep = child; + } + else if(child.getUri().indexOf(ESConstants.OC_RSRVD_ES_URI_DEVCONF) != -1) + { + mDevConfRep = child; + } + else if(child.getUri().indexOf(ESConstants.OC_RSRVD_ES_URI_CLOUDSERVER) != -1) + { + mCloudRep = child; + } + } + } + + /** + * Get Device Name property in DevConf resource + * + * @return deviceName + */ + public String getDeviceName() + { + try + { + if(mDevConfRep != null && mDevConfRep.hasAttribute(ESConstants.OC_RSRVD_ES_DEVNAME)) { + return (String) mDevConfRep.getValue(ESConstants.OC_RSRVD_ES_DEVNAME); + } + } catch (OcException e) { + Log.e(TAG, "getWiFiModes is failed."); + } + return new String(""); + } + + /** + * Get Supported WiFi Modes property in WiFi resource + * + * @return a list of WiFi modes + */ + public ArrayList getWiFiModes() + { + ArrayList modes = new ArrayList(); + try { + if (mWiFiRep != null && mWiFiRep.hasAttribute(ESConstants.OC_RSRVD_ES_SUPPORTEDWIFIMODE)) { + int modes_int[] = mWiFiRep.getValue(ESConstants.OC_RSRVD_ES_SUPPORTEDWIFIMODE); + for (int i = 0 ; i < modes_int.length ; ++i) { + modes.add(WIFI_MODE.fromInt(modes_int[i])); + } + } + } catch (OcException e) { + Log.e(TAG, "getWiFiModes is failed."); + } + return modes; + } + + /** + * Get Supported WiFi frequency property in WiFi resource + * + * @return WiFi frequency + */ + public WIFI_FREQ getWiFiFreq() + { + try{ + if(mWiFiRep != null && mWiFiRep.hasAttribute(ESConstants.OC_RSRVD_ES_SUPPORTEDWIFIFREQ)) + return WIFI_FREQ.fromInt( + (int)mWiFiRep.getValue(ESConstants.OC_RSRVD_ES_SUPPORTEDWIFIFREQ)); + } catch (OcException e) { + Log.e(TAG, "getWiFiFreq is failed."); + } + return WIFI_FREQ.WIFI_FREQ_NONE; + } + + /** + * To check if Enrollee can access to cloud. To decide its preference, we check if a cloudserver + * resource is registered on Enrollee. + * + * @return boolean + */ + public boolean isCloudAccessible() + { + if(mCloudRep != null && mCloudRep.getUri().indexOf(ESConstants.OC_RSRVD_ES_URI_CLOUDSERVER) != -1) + return true; + + return false; + } +} + + diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EnrolleeDevice.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EnrolleeDevice.java deleted file mode 100644 index abb080d..0000000 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EnrolleeDevice.java +++ /dev/null @@ -1,173 +0,0 @@ -/** - * *************************************************************** - *

- * Copyright 2015 Samsung Electronics All Rights Reserved. - *

- *

- *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *

- * **************************************************************** - */ - -package org.iotivity.service.easysetup.mediator; - -/** - * This is an abstract class represents the device being provisioned into the network. The - * device being enrolled or provisioned into the network is called Enrollee. - * Application has to extend this class and provide implementation of abstract methods according - * to the ON-BOARDING & PROVISION connectivity i.e. WiFi etc. - */ - -public abstract class EnrolleeDevice { - - protected EnrolleeState mState; - private EnrolleeSetupError mError; - - OnBoardingConnection mConnection; - final ProvisioningConfig mProvConfig; - final OnBoardingConfig mOnBoardingConfig; - - protected OnBoardingCallback mOnBoardingCallback; - protected ProvisioningCallback mProvisioningCallback; - protected RemoteEnrollee mRemoteEnrollee; - - /** - * @param onBoardingConfig Contains details about the connectivity to be established between - * the Enrollee device & Mediator device in order to perform - * on-boarding - * @param provConfig Contains details about the network to which Enrollee device is - * going to connect. - */ - protected EnrolleeDevice(OnBoardingConfig onBoardingConfig, ProvisioningConfig provConfig) { - mProvConfig = provConfig; - mOnBoardingConfig = onBoardingConfig; - } - - /** - * Application has to implement it according to the on boarding connectivity the device is - * having. - * This method will be called back during the easy setup process. - */ - protected abstract void startOnBoardingProcess(); - - /** - * This method is called back during the easy setup process if Application cancels the setup. - * Easy setup service checks the state of device and calls this function accordingly. - * Application has to provide implementation for this method to cancel the on boarding step. - */ - protected abstract void stopOnBoardingProcess(); - - /** - * Application has to implement it according to the type of the network device is going to - * connect or provisioned. - * This method will be called back once on-boarding of the device is successful. - * - * @param conn Contains detail about the network established between the Enrollee device & - * Mediator device. Its implementation vary according to the connectivity type. - */ - protected abstract void startProvisioningProcess(OnBoardingConnection conn); - - /** - * Application has to implement it according to the type of the network device is going to - * connect or provisioned. - * This method will stop the provisioning process if it is in progress - * - */ - protected abstract void stopProvisioningProcess(); - - /** - * Once on boarding is successful concrete Enrollee class would call this method and set the - * Connection. - * - * @param conn Connectivity between Enrollee device & Mediator device. - */ - protected void setConnection(OnBoardingConnection conn) { - mConnection = conn; - } - - /** - * This method returns the OnBoardingConnection object depending on the connection type - * - * @return onBoardingConnection object - */ - public OnBoardingConnection getConnection() { - return mConnection; - } - - - /** - * This method is called back by Easy setup service if on boarding needs to be done. - * - * @param onBoardingCallback This is called back once the on boarding is completed. - */ - void startOnBoarding(OnBoardingCallback onBoardingCallback) { - mOnBoardingCallback = onBoardingCallback; - startOnBoardingProcess(); - } - - /** - * This method is called back by Easy setup service once on boarding is successful - * - * @param provisioningCallback This is called back once the provisioning process is completed - */ - void startProvisioning(ProvisioningCallback provisioningCallback) { - mProvisioningCallback = provisioningCallback; - startProvisioningProcess(mConnection); - } - - /** - * This method is used to check easy setup status - * - * @return true if successful or false - */ - - public boolean isSetupSuccessful() { - return (mState == EnrolleeState.DEVICE_PROVISIONED_STATE) ? true : false; - } - - /** - * sets error occured during easy setup process - */ - protected void setError(EnrolleeSetupError error) { - mError = error; - } - - /** - * Returns error occured during easy setup process - * - * @return True EnrolleeSetupError object - */ - public EnrolleeSetupError getError() { - return mError; - } - - /** - * Gives the state of the device being enrolled during the easy setup process. - * - * @return Returns EnrolleeState object - */ - public EnrolleeState getState() { - return mState; - } - - /** - * This method is used to know if the device is on boarded or not - * - * @return True if on-boarded successfully or False - */ - - protected boolean onBoarded() { - return (mState == EnrolleeState.DEVICE_ON_BOARDED_STATE) ? true : false; - } -} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EnrolleeDeviceFactory.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EnrolleeDeviceFactory.java deleted file mode 100644 index bcf8219..0000000 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EnrolleeDeviceFactory.java +++ /dev/null @@ -1,81 +0,0 @@ -/** - * *************************************************************** - *

- * Copyright 2015 Samsung Electronics All Rights Reserved. - *

- *

- *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *

- * **************************************************************** - */ - -package org.iotivity.service.easysetup.mediator; - -import android.content.Context; - -/** - * This a factory class provides the native implementation of the various Enrollee devices. - * Application can make use of Enrollee factory if it does not want to create its own Enrollee devices. - */ -public class EnrolleeDeviceFactory { - - Context mContext; - - /** - * This method create & returns instance of EnrolleeDeviceFactory - * - * @param context This is Android Application context - */ - public static EnrolleeDeviceFactory newInstance(Context context) { - return new EnrolleeDeviceFactory(context); - } - - private EnrolleeDeviceFactory(Context context) { - mContext = context; - } - - /** - * This method create & returns instance of Enrollee device of supported configuration - * - * @param onboardingConfig Contains details about the connectivity to be established between the Enrollee device & Mediator device in order to perform on-boarding - * @param provConfig Contains details about the network to which Enrollee device is going to connect. - * @return Instance of the Enrollee device created natively. - */ - - public EnrolleeDevice newEnrolleeDevice(ProvisioningConfig provConfig, OnBoardingConfig onboardingConfig) throws IllegalArgumentException { - - if (null == provConfig || null == onboardingConfig) { - throw new IllegalArgumentException("provConfig/onboardingConfig is NULL"); - } - else if (onboardingConfig.getConnType() != OnBoardingConfig.ConnType.WiFi) { - throw new IllegalArgumentException("OnBoarding configuration is not supported"); - } - return new EnrolleeDeviceWiFiOnboarding(mContext, onboardingConfig, provConfig); - } - - /** - * This method create & returns instance of Enrollee device of supported configuration - * [When SoftAP is going to be created on Enrollee side] - * - * @param provConfig Contains details about the network to which Enrollee device is going to connect. - * @return Instance of the Enrollee device created natively. - */ - public EnrolleeDevice newEnrolleeDevice(ProvisioningConfig provConfig) throws IllegalArgumentException { - - if (null == provConfig) { - throw new IllegalArgumentException("provConfig is NULL"); - } - return new EnrolleeDeviceWiFiOnboarding(mContext, new IpOnBoardingConnection(true), provConfig); - } -} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EnrolleeDeviceWiFiOnboarding.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EnrolleeDeviceWiFiOnboarding.java deleted file mode 100644 index 66f12d0..0000000 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EnrolleeDeviceWiFiOnboarding.java +++ /dev/null @@ -1,193 +0,0 @@ -/** - * *************************************************************** - *

- * Copyright 2015 Samsung Electronics All Rights Reserved. - *

- *

- *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *

- * **************************************************************** - */ - -package org.iotivity.service.easysetup.mediator; - -import java.util.Timer; -import java.util.TimerTask; - -import org.iotivity.service.easysetup.core.EnrolleeInfo; -import org.iotivity.service.easysetup.core.IOnBoardingStatus; -import org.iotivity.service.easysetup.core.ip.WiFiSoftAPManager; - -import android.content.Context; -import android.net.wifi.WifiConfiguration; -import android.util.Log; - -/** - * This is a ready to use class for Enrollee device having Soft AP as on-boarding connectivity. - */ -public class EnrolleeDeviceWiFiOnboarding extends EnrolleeDevice { - - public static final String TAG = EnrolleeDeviceWiFiOnboarding.class.getName(); - - final Context mContext; - final WiFiSoftAPManager mWifiSoftAPManager; - EnrolleeInfo connectedDevice; - Timer myTimer = null; - - IOnBoardingStatus deviceScanListener = new IOnBoardingStatus() { - - @Override - public void deviceOnBoardingStatus(EnrolleeInfo enrolleStatus) { - myTimer.cancel(); - Log.d("ESSoftAPOnBoarding", "Entered"); - if (mState == EnrolleeState.DEVICE_ON_BOARDING_STATE) { - Log.d("ESSoftAPOnBoarding", "Device in OnBoarding State"); - if (enrolleStatus != null && enrolleStatus.getIpAddr() != null) { - String finalResult = "Easy Connect : "; - - if (enrolleStatus.isReachable()) { - finalResult = "Device OnBoarded" + "[" - + enrolleStatus.getIpAddr() + "]"; - - connectedDevice = enrolleStatus; - IpOnBoardingConnection conn = new IpOnBoardingConnection(); - - conn.setConnectivity(true); - conn.setIp(connectedDevice.getIpAddr()); - conn.setHardwareAddress(enrolleStatus.getHWAddr()); - conn.setDeviceName(enrolleStatus.getDevice()); - - Log.d("ESSoftAPOnBoarding", "Entered" + finalResult); - mOnBoardingCallback.onFinished(conn); - return; - - } - } - - IpOnBoardingConnection conn = new IpOnBoardingConnection(); - conn.setConnectivity(false); - mOnBoardingCallback.onFinished(conn); - } else { - Log.e("ESSoftAPOnBoarding", "Device NOT in OnBoarding State. Ignoring the event"); - } - } - }; - - - protected EnrolleeDeviceWiFiOnboarding(Context context, OnBoardingConfig onBoardingConfig, - ProvisioningConfig provConfig) { - super(onBoardingConfig, provConfig); - mContext = context; - mState = EnrolleeState.DEVICE_INIT_STATE; - mWifiSoftAPManager = new WiFiSoftAPManager(mContext); - } - - protected EnrolleeDeviceWiFiOnboarding(Context context, IpOnBoardingConnection conn, - ProvisioningConfig provConfig) { - super(new WiFiOnBoardingConfig(), provConfig); - mContext = context; - mState = EnrolleeState.DEVICE_ON_BOARDED_STATE; - mConnection = conn; - mWifiSoftAPManager = new WiFiSoftAPManager(mContext); - } - - @Override - protected void startOnBoardingProcess() { - Log.i(TAG, "Starting on boarding process"); - - //1. Create Soft AP - boolean status = mWifiSoftAPManager.setWifiApEnabled((WifiConfiguration) - mOnBoardingConfig.getConfig(), true); - - mState = EnrolleeState.DEVICE_ON_BOARDING_STATE; - - Log.i(TAG, "Soft AP is created with status " + status); - - myTimer = new Timer(); - myTimer.schedule(new TimerTask() { - @Override - public void run() { - // Below function to be called after 5 seconds - mWifiSoftAPManager.getClientList(deviceScanListener, 300); - } - - }, 0, 5000); - } - - protected void stopOnBoardingProcess() { - Log.i(TAG, "Stopping on boarding process"); - if(myTimer != null) - { - myTimer.cancel(); - } - boolean status = mWifiSoftAPManager.setWifiApEnabled(null, false); - Log.i(TAG, "Soft AP is disabled with status " + status); - } - - @Override - protected void startProvisioningProcess(OnBoardingConnection conn) { - - mState = EnrolleeState.DEVICE_PROVISIONING_STATE; - mProvisioningCallback.onProgress(this); - final EnrolleeDevice device = this; - if (mProvConfig.getConnType() == ProvisioningConfig.ConnType.WiFi) { - try { - mRemoteEnrollee.registerProvisioningHandler(new IProvisionStatusNativeHandler() { - @Override - public void onStatusRecieved(int state) { - device.mState = convertIntToProvisioningState(state); - Log.i(TAG,"Device state changed :"+device.mState); - mProvisioningCallback.onProgress(device); - if(0==state) { - mProvisioningCallback.onFinished(EnrolleeDeviceWiFiOnboarding.this); - } - } - }); - //native call - mRemoteEnrollee.startProvision(); - }catch(ESException e) { - Log.i(TAG,"startProvisioningProcess Register Listener to native exception"); - } - } - } - - protected void stopProvisioningProcess(){ - if(mState == EnrolleeState.DEVICE_PROVISIONING_STATE) - { //native call - try { - mRemoteEnrollee.stopProvision(); - } catch (ESException e) { - Log.i(TAG,"stopProvisioningProcess exception"); - } - }else{ - Log.i(TAG,"stopProvisioningProcess : Provisioning is not in progress"); - } - } - - private EnrolleeState convertIntToProvisioningState(int state){ - - switch(state) - { - case 0 : - return EnrolleeState.DEVICE_PROVISIONED_STATE; - case 1: - return EnrolleeState.DEVICE_NOT_PROVISIONED; - case 2: - return EnrolleeState.DEVICE_PROVISIONED_STATE; - case 3: - return EnrolleeState.DEVICE_NOT_PROVISIONED; - } - return EnrolleeState.DEVICE_INIT_STATE; - } -} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EnrolleeState.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EnrolleeState.java deleted file mode 100644 index 91b8231..0000000 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EnrolleeState.java +++ /dev/null @@ -1,88 +0,0 @@ -/** - * *************************************************************** - *

- * Copyright 2015 Samsung Electronics All Rights Reserved. - *

- *

- *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *

- * **************************************************************** - */ - -package org.iotivity.service.easysetup.mediator; - -/** - * It defines various states of the Enrollee device during easy setup process - */ - -public enum EnrolleeState { - - /** - * Default state of the device - */ - DEVICE_INIT_STATE, - - /** - * Device will move to this state after successful on-boarding of the device - */ - DEVICE_ON_BOARDED_STATE, - - /** - * Device will move to this state once the on boarding begins - */ - DEVICE_ON_BOARDING_STATE, - - /** - * Device will move to this state once the on boarding is done - */ - DEVICE_PROVISIONING_STATE, - - /** - * Easy setup process is successful. - */ - DEVICE_PROVISIONED_STATE, - - /** - * Easy setup process failed. - */ - DEVICE_NOT_PROVISIONED, - - /** - * This state is arbitrary one, any time device can come into this state - * Device will move to this state if the ownership transfer initiated by the Application - */ - DEVICE_OWNERSHIP_TRANSFERRING_STATE, - - /** - * This state is arbitrary one, any time device can come into this state - * Device will move to this state if the ownership transfer is completed - */ - DEVICE_OWNERSHIP_TRANSFERRED_STATE, - - /** - * This state is arbitrary one, any time device can come into this state - * Device will move to this state if the ownership transfer is not completed - */ - DEVICE_NOT_OWNED, - - /** - * This state is arbitrary one, any time device can come into this state - * Device will move to this state once the Application factory reset the device - */ - DEVICE_FACTORY_RESET_STATE, - - - - -} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EnrolleeStatus.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EnrolleeStatus.java new file mode 100755 index 0000000..3421c40 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EnrolleeStatus.java @@ -0,0 +1,88 @@ +/** + * *************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * **************************************************************** + */ + +package org.iotivity.service.easysetup.mediator; + +import android.util.Log; + +import org.iotivity.base.OcException; +import org.iotivity.base.OcRepresentation; +import org.iotivity.service.easysetup.mediator.ESConstants; +import org.iotivity.service.easysetup.mediator.enums.ESErrorCode; +import org.iotivity.service.easysetup.mediator.enums.ProvStatus; + +/** + * This class stores Enrollee's status including provisioning status and last error code. + */ +public class EnrolleeStatus +{ + private static final String TAG = EnrolleeStatus.class.getName(); + private OcRepresentation mRep = null; + /** + * Constructor + * + * @param rep received properties in a form of OcRepresentation + * + */ + public EnrolleeStatus(OcRepresentation rep) + { + mRep = rep; + } + + /** + * Get a provisioning status property of Enrollee. + * + * @return a provisioning status property of Enrollee + */ + public ProvStatus getProvStatus() + { + try + { + if(mRep != null && mRep.hasAttribute(ESConstants.OC_RSRVD_ES_PROVSTATUS)) { + int provStatus = mRep.getValue(ESConstants.OC_RSRVD_ES_PROVSTATUS); + return ProvStatus.fromInt(provStatus); + } + } catch (OcException e) { + Log.e(TAG, "getProvStatus is failed."); + } + return ProvStatus.fromInt(0); + } + + /** + * Get a last error code property of Enrollee. + * + * @return a last error code property of Enrollee. + */ + public ESErrorCode getLastErrCode() + { + try + { + if(mRep != null && mRep.hasAttribute(ESConstants.OC_RSRVD_ES_LAST_ERRORCODE)) { + int errCode = mRep.getValue(ESConstants.OC_RSRVD_ES_LAST_ERRORCODE); + return ESErrorCode.fromInt(errCode); + } + } catch (OcException e) { + Log.e(TAG, "getLastErrCode is failed."); + } + return ESErrorCode.fromInt(0); + } +} + + diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EnrolleeSetupError.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/GetConfigurationCallback.java similarity index 57% rename from service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EnrolleeSetupError.java rename to service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/GetConfigurationCallback.java index 036d24d..60a6e01 100644 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EnrolleeSetupError.java +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/GetConfigurationCallback.java @@ -1,37 +1,39 @@ /** * *************************************************************** - *

- * Copyright 2015 Samsung Electronics All Rights Reserved. - *

- *

- *

+ * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - *

+ * * http://www.apache.org/licenses/LICENSE-2.0 - *

+ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - *

+ * * **************************************************************** */ package org.iotivity.service.easysetup.mediator; /** - * This class defines constants for Errors comes during Easy setup process + * This interface class is used as a callback function called after receiving + * Enrollee's configuration. + * + * @see GetConfigurationStatus */ -public enum EnrolleeSetupError { - /** - * Device setup successful - */ - DEVICE_SETUP_SUCCESSFUL, +public abstract class GetConfigurationCallback { + /** - * Device setup failed + * Called after receiving Enrollee's configuration + * + * @param status + * result if the request succeeds or fails + * Enrollee's configuration like supported WiFi freq and device name */ - DEVICE_SETUP_FAILED, + public abstract void onProgress(GetConfigurationStatus status); } diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/GetConfigurationStatus.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/GetConfigurationStatus.java new file mode 100644 index 0000000..14c3979 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/GetConfigurationStatus.java @@ -0,0 +1,69 @@ +/** + * *************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * **************************************************************** + */ + +package org.iotivity.service.easysetup.mediator; + +import org.iotivity.service.easysetup.mediator.enums.ESResult; + +/** + * This class indicates a result if a getConfiguartion API succeed or fails and + * Enrollee's configuration delivered by a response. + */ +public class GetConfigurationStatus +{ + private ESResult mResult; + private EnrolleeConf mEnrolleeConf; + + /** + * Constructor + * + * @param result a result if a getConfiguartion API succeed or fail + * @param conf Enrollee's configuration + * + */ + public GetConfigurationStatus(int result, EnrolleeConf conf) + { + mResult = ESResult.fromInt(result); + mEnrolleeConf = conf; + } + + /** + * Get a result of a getConfiguartion API call + * + * @return ESResult + * + */ + public ESResult getESResult() + { + return mResult; + } + + /** + * Get Enrollee's configuration + * + * @return EnrolleeConf includes a WiFi and Device configuration of Enrollee + * + * @see EnrolleeConf + */ + public EnrolleeConf getEnrolleeConf() + { + return mEnrolleeConf; + } +}; diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/GetEnrolleeStatus.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/GetEnrolleeStatus.java new file mode 100644 index 0000000..916a9c6 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/GetEnrolleeStatus.java @@ -0,0 +1,69 @@ +/** + * *************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * **************************************************************** + */ + +package org.iotivity.service.easysetup.mediator; + +import org.iotivity.service.easysetup.mediator.enums.ESResult; + +/** + * This class indicates a result if a getConfiguartion API succeed or fails and + * Enrollee's configuration delivered by a response. + */ +public class GetEnrolleeStatus +{ + private ESResult mResult; + private EnrolleeStatus mEnrolleeStatus; + + /** + * Constructor + * + * @param result a result if a getStatus API succeed or fail + * @param status Enrollee's status + * + */ + public GetEnrolleeStatus(int result, EnrolleeStatus status) + { + mResult = ESResult.fromInt(result); + mEnrolleeStatus = status; + } + + /** + * Get a result of a getStatus API call + * + * @return ESResult + * + */ + public ESResult getESResult() + { + return mResult; + } + + /** + * Get Enrollee's status + * + * @return EnrolleeStatus includes a provisioning status and last error code. + * + * @see EnrolleeStatus + */ + public EnrolleeStatus getEnrolleeStatus() + { + return mEnrolleeStatus; + } +}; diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/IProvisionStatusNativeHandler.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/GetStatusCallback.java similarity index 62% rename from service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/IProvisionStatusNativeHandler.java rename to service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/GetStatusCallback.java index 9ca1083..80ee811 100644 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/IProvisionStatusNativeHandler.java +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/GetStatusCallback.java @@ -1,29 +1,39 @@ /** * *************************************************************** - *

+ * * Copyright 2016 Samsung Electronics All Rights Reserved. - *

- *

- *

+ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - *

+ * * http://www.apache.org/licenses/LICENSE-2.0 - *

+ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - *

+ * * **************************************************************** */ package org.iotivity.service.easysetup.mediator; -public interface IProvisionStatusNativeHandler { - - public void onStatusRecieved(int state); +/** + * This interface class is used as a callback function called after receiving + * Enrollee's status. + * + * @see GetEnrolleeStatus + */ +public abstract class GetStatusCallback { + /** + * Called after receiving Enrollee's status + * + * @param status + * result if the request succeeds or fails + * Enrollee's status like a provisioning status and last error code + */ + public abstract void onProgress(GetEnrolleeStatus status); } diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/IpOnBoardingConnection.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/IpOnBoardingConnection.java deleted file mode 100644 index 64599f8..0000000 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/IpOnBoardingConnection.java +++ /dev/null @@ -1,94 +0,0 @@ -/** - * *************************************************************** - *

- * Copyright 2015 Samsung Electronics All Rights Reserved. - *

- *

- *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *

- * **************************************************************** - */ - -package org.iotivity.service.easysetup.mediator; - -public class IpOnBoardingConnection implements OnBoardingConnection { - - private boolean mIsConnected; - private String mIp; - private String mHardwareAddress; - private String mDeviceName; - - /** - * @mThrottlingDelay - * After creating the Soft AP at Mediator & on-boarding the- - * -Enrollee device on it provisioning needs to be delayed by at least 2000 ms for Android Mediator - */ - private int mThrottlingDelay = 2000 ; - - int getThrottlingDelay() { - return mThrottlingDelay; - } - - IpOnBoardingConnection(boolean enrolleeOnboarded) { - mThrottlingDelay = 0; - mIp = "0.0.0.01"; - mIsConnected = enrolleeOnboarded; // Always true for this constructor - } - - IpOnBoardingConnection(){} - - public void setHardwareAddress(String address) { - mHardwareAddress = address; - } - - public String getHardwareAddress() { - return mHardwareAddress; - } - - public void setDeviceName(String name) { - mDeviceName = name; - } - - public String getDeviceName() { - return mDeviceName; - } - - public void setConnectivity(boolean connected) { - mIsConnected = connected; - } - - public void setIp(String ip) { - mIp = ip; - } - - public String getIp() { - return mIp; - } - - @Override - public String getDesc() { - return "Description"; - } - - @Override - public boolean isConnected() { - return mIsConnected; - } - - @Override - public Object getConnection() { - return this; - } - -} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/OnBoardingConfig.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/OnBoardingConfig.java deleted file mode 100644 index db62640..0000000 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/OnBoardingConfig.java +++ /dev/null @@ -1,73 +0,0 @@ -/** - * *************************************************************** - *

- * Copyright 2015 Samsung Electronics All Rights Reserved. - *

- *

- *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *

- * **************************************************************** - */ - -package org.iotivity.service.easysetup.mediator; - -import android.util.Log; - -import org.iotivity.base.OcConnectivityType; - -/** - * It contains configuration details about the connectivity type between the Enrollee device & - * Mediator device in order to perform on-boarding. - */ - -public interface OnBoardingConfig { - /** - * It provides constants for connectivity types used for on-boarding Enrollee device - */ - public static enum ConnType { - // Note : Enum Ids should matched with Native Ids - WiFi(OcConnectivityType.CT_ADAPTER_IP.getValue()), - BLE(OcConnectivityType.CT_ADAPTER_GATT_BTLE.getValue()); - - private int mConnType; - - ConnType(int connType) { - mConnType = connType; - } - - public int getValue() { - return mConnType; - } - - } - - /** - * Gives configuration object specific to the on-boarding connectivity of the enrolling device. - * - * @return instance object of configuration according to connectivity type - */ - public Object getConfig(); - - /** - * Gives connectivity type of on-boarding device - * - * @return on-boarding connectivity type - */ - public ConnType getConnType(); - - public boolean isSecured(); - - public void setSecured(boolean isSecured); - -} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/ProvisioningCallback.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/ProvisioningCallback.java deleted file mode 100644 index 569f6fe..0000000 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/ProvisioningCallback.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * *************************************************************** - *

- * Copyright 2015 Samsung Electronics All Rights Reserved. - *

- *

- *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *

- * **************************************************************** - */ - -package org.iotivity.service.easysetup.mediator; - -public abstract class ProvisioningCallback { - public abstract void onFinished(EnrolleeDevice enrolledevice); - public abstract void onProgress(EnrolleeDevice enrolledevice); -} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/ProvisioningConfig.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/ProvisioningConfig.java deleted file mode 100644 index a1b96c8..0000000 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/ProvisioningConfig.java +++ /dev/null @@ -1,73 +0,0 @@ -/** - * *************************************************************** - *

- * Copyright 2015 Samsung Electronics All Rights Reserved. - *

- *

- *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *

- * **************************************************************** - */ - -package org.iotivity.service.easysetup.mediator; - -import android.util.Log; - -import org.iotivity.base.OcConnectivityType; -/** - * It contains configuration details about the the target network where Enrollee device is - * going to be enrolled. - */ -public interface ProvisioningConfig { - - /** - * It provides constants for connectivity types of target network - */ - public static enum ConnType { - // Note : Enum Ids should matched with Native Ids - WiFi(OcConnectivityType.CT_ADAPTER_IP.getValue()), - BLE(OcConnectivityType.CT_ADAPTER_GATT_BTLE.getValue()); - - private int mConnType; - - ConnType(int connType) { - mConnType = connType; - } - - public int getValue() { - return mConnType; - } - } - - /** - * Gives the instance of the configuration object created according to the connectivity - * type of target network. - * - * @return instance object of configuration according to connectivity type of target network - */ - Object getConfig(); - - - /** - * Gives connectivity type of target network - * - * @return Connectivity type of target network - */ - ConnType getConnType(); - - public boolean isSecured(); - - public void setSecured(boolean isSecured); - -} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/RemoteEnrollee.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/RemoteEnrollee.java old mode 100644 new mode 100755 index 38328bc..b32d6d9 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/RemoteEnrollee.java +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/RemoteEnrollee.java @@ -1,22 +1,22 @@ /** * *************************************************************** - *

+ * * Copyright 2016 Samsung Electronics All Rights Reserved. - *

- *

- *

+ * + * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - *

+ * * http://www.apache.org/licenses/LICENSE-2.0 - *

+ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - *

+ * * **************************************************************** */ @@ -25,35 +25,142 @@ package org.iotivity.service.easysetup.mediator; import android.util.Log; +import org.iotivity.base.OcRepresentation; + +/** + * This class represents Remote Enrollee device instance. What operations the class provides: + * 1) Ownership transfer for enabling secured communication between Mediator and Enrollee + * devices. + * 2) Provision WiFi AP information used for which Enrollee is going to connect to the AP + * 3) Provision Device confiruation setting, i.e. language, country, and etc + * 4) Provision Cloud information used for which Enrollee is going to register to the cloud + */ public class RemoteEnrollee{ public static final String TAG = RemoteEnrollee.class.getName(); private long m_nativeHandle; - private native void nativeStartProvision(); - private native void nativeStopProvision(); - private native void nativeRegisterProvisioningHandler(IProvisionStatusNativeHandler listener); + private native void nativeGetStatus(GetStatusCallback callback); + private native void nativeGetConfiguration(GetConfigurationCallback callback); + private native void nativeProvisionSecurity(SecurityProvisioningCallback callback); + private native void nativeProvisionDeviceProperties(OcRepresentation deviceProp, + DevicePropProvisioningCallback callback); + private native void nativeProvisionCloudProperties(OcRepresentation cloudProp, String cloudID, + CloudPropProvisioningCallback callback); /* constructor will be invoked from the native layer */ private RemoteEnrollee(long nativeHandle){ this.m_nativeHandle = nativeHandle; } - /* Register native Listener for the Provisioning state */ - public void registerProvisioningHandler( IProvisionStatusNativeHandler provisioningListener) throws ESException{ - // this.provisioningListener = provisioningListener; - nativeRegisterProvisioningHandler(provisioningListener); - Log.i(TAG, "JNI Callback is registered for getting provisioning status"); + /** + * Get an Enrollee's status which includes a provisioning status and last error code + * + * @param callback will give the requested status + * + * @throws ESException If some errors happen in this function + * + * @see GetStatusCallback + */ + public void getStatus(GetStatusCallback callback) throws ESException + { + if(callback != null) + { + nativeGetStatus(callback); + return; + } + Log.d(TAG, "GetStatusCallback is null "); } - /* native StartProvision */ - public void startProvision() throws ESException{ - nativeStartProvision(); -} + /** + * Get an Enrollee's configuration which includes WiFi supported frequency and device name + * + * @param callback will give the requested configuration + * + * @throws ESException If some errors happen in this function + * + * @see GetConfigurationCallback + */ + public void getConfiguration(GetConfigurationCallback callback) + throws ESException + { + if(callback != null) + { + nativeGetConfiguration(callback); + return; + } + Log.d(TAG, "GetConfigurationCallback is null "); + } - /* native stopProvision */ - public void stopProvision() throws ESException{ - nativeStopProvision(); -} + /** + * Do security provisioning such as ownership tranfer to Enrollee. + * + * @param callback will give the result if the security provisioning succeeds or fails for some reasons + * + * @throws ESException If some errors happen in this function + * + * @see SecurityProvisioningCallback + */ + public void provisionSecurity(SecurityProvisioningCallback callback) + throws ESException + { + if(callback != null) + { + nativeProvisionSecurity(callback); + return; + } + Log.d(TAG, "SecurityProvisioningCallback is null "); + } + /** + * Provision WiFi AP information and device configuration to Enrollee + * 1. WiFi AP information includes a SSID, password, auth type, and encryption type. + * 2. Device configuration includes a language (IETF language tags) and country (ISO 3166-1 Alpha-2) + * + * @param deviceProp a data structure storing the above information to be delivered + * @param callback will give the result if the provisioning succeeds or fails + * + * @throws ESException If some errors happen in this function + * + * @see DeviceProp + * @see DevicePropProvisioningCallback + */ + public void provisionDeviceProperties(DeviceProp deviceProp, + DevicePropProvisioningCallback callback) throws ESException{ + if(callback != null) + { + nativeProvisionDeviceProperties(deviceProp.toOCRepresentation(), + callback); + return; + } + Log.d(TAG, "DevicePropProvisioningCallback is null "); + } + + /** + * Provision Cloud information to Enrollee, which includes Auth code, auth provider, + * Cloud interface server URL, and etc. + * In this function, Discovery for the Enrollee will happen again in a given network. + * Because, this function is expected to call *AFTER* the Enrollee disconnects its Soft AP + * and successfully connects to the certain WiFi AP. In that case, Mediator should discover + * the Enrollee with a certain Device ID in the network. + * + * @param cloudProp a data structure storing the above information to be delivered + * @param callback will give the result if the provisioning succeeds or fails + * + * @throws ESException If some errors happen in this function + * + * @see CloudProp + * @see CloudPropProvisioningCallback + */ + public void provisionCloudProperties(CloudProp cloudProp, + CloudPropProvisioningCallback callback) throws ESException{ + if(callback != null) + { + nativeProvisionCloudProperties(cloudProp.toOCRepresentation(), + cloudProp.getCloudID(), + callback); + return; + } + Log.d(TAG, "CloudPropProvisioningCallback is null "); + } } diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/SecurityProvisioningCallback.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/SecurityProvisioningCallback.java new file mode 100644 index 0000000..9285d73 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/SecurityProvisioningCallback.java @@ -0,0 +1,44 @@ +/** + * *************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * **************************************************************** + */ + +package org.iotivity.service.easysetup.mediator; + +import org.iotivity.service.easysetup.mediator.SecurityProvisioningStatus; + +/** + * This interface class is used as a callback function called after receiving + * Security provisioning result + * + * @see SecurityProvisioningStatus + */ +public abstract class SecurityProvisioningCallback { + + /** + * Called after receiving Security provisioning result + * + * @param status + * a result of security provisioning + * a device ID of a target Enrollee even if security provisioning + * is failed for some reasons + * + * @see SecurityProvisioningStatus + */ + public abstract void onProgress(SecurityProvisioningStatus status); +} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/SecurityProvisioningStatus.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/SecurityProvisioningStatus.java new file mode 100755 index 0000000..9689fec --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/SecurityProvisioningStatus.java @@ -0,0 +1,67 @@ +/** + * *************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * **************************************************************** + */ + +package org.iotivity.service.easysetup.mediator; + +import android.util.Log; + +import org.iotivity.service.easysetup.mediator.enums.ESResult; + +/** + * This class indicates a result if a provisionSecurity API succeed or fails and + * a target Enrollee's device ID + */ +public class SecurityProvisioningStatus +{ + private ESResult mResult; + private String mDevUUID; + + /** + * Constructor + * + * @param result a result of security provisioning + * @param uuid a device ID of a target Enrollee + */ + public SecurityProvisioningStatus(int result, String uuid) + { + mResult = ESResult.fromInt(result); + mDevUUID = uuid; + } + + /** + * Get a Result of security provisioning + * + * @return ESResult a result of security provisioning + */ + public ESResult getESResult() + { + return mResult; + } + + /** + * Get a device ID of a target Enrollee + * + * @return String a device ID of a target Enrollee + */ + public String getDevUUID() + { + return mDevUUID; + } +}; diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/WiFiOnBoardingConfig.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/WiFiOnBoardingConfig.java deleted file mode 100644 index 4369cf4..0000000 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/WiFiOnBoardingConfig.java +++ /dev/null @@ -1,75 +0,0 @@ -/** - * *************************************************************** - *

- * Copyright 2015 Samsung Electronics All Rights Reserved. - *

- *

- *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *

- * **************************************************************** - */ - -package org.iotivity.service.easysetup.mediator; - -import org.iotivity.service.easysetup.mediator.OnBoardingConfig; - -import android.net.wifi.WifiConfiguration; - -/** - * This class contains on boarding configuration information for Soft AP on boarding connectivity. - * It implements OnBoardingConfig interface & provide implementation for WiFi Soft AP connectivity. - */ - -public class WiFiOnBoardingConfig implements OnBoardingConfig { - - private boolean isSecured; - private final WifiConfiguration config = new WifiConfiguration(); - private final ConnType mConnType = OnBoardingConfig.ConnType.WiFi; - - @Override - public Object getConfig() { - return config; - } - - public void setSSId(String ssid) { - config.SSID = ssid; - } - - public void setSharedKey(String sharedKey) { - config.preSharedKey = sharedKey; - } - - public void setAuthAlgo(int aurthAlgo) { - config.allowedAuthAlgorithms.set(aurthAlgo); - } - - public void setKms(int kms) { - config.allowedKeyManagement.set(kms); - } - - @Override - public ConnType getConnType() { - return mConnType; - } - - @Override - public boolean isSecured(){ - return isSecured; - } - - @Override - public void setSecured(boolean flag) { - isSecured = flag; - } -} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/WiFiProvConfig.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/WiFiProvConfig.java deleted file mode 100644 index 1087f6e..0000000 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/WiFiProvConfig.java +++ /dev/null @@ -1,79 +0,0 @@ -/** - * *************************************************************** - *

- * Copyright 2015 Samsung Electronics All Rights Reserved. - *

- *

- *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *

- * **************************************************************** - */ - -package org.iotivity.service.easysetup.mediator; - -import org.iotivity.service.easysetup.mediator.ProvisioningConfig; - -/** - * This class contains on provisioning configuration information for for target network. - * It implements ProvisioningConfig interface and provide configuration object specific to WiFi target network - */ -public class WiFiProvConfig implements ProvisioningConfig { - - private final ConnType mConnType = ProvisioningConfig.ConnType.WiFi; - private boolean isSecured; - - private final String mSsId; - private final String mPassword; - - public WiFiProvConfig(String ssid, String pass) { - mSsId = ssid; - mPassword = pass; - } - - @Override - public Object getConfig() { - return this; - } - - @Override - public ConnType getConnType() { - return mConnType; - } - - /** - * This method returns the SSID of the Target WIFI network - * @return SSID of Target Network - */ - public String getSsId() { - return mSsId; - } - - /** - * This method returns the password of the Target WIFI network - * @return password of Target Network - */ - public String getPassword() { - return mPassword; - } - - @Override - public boolean isSecured(){ - return isSecured; - } - - @Override - public void setSecured(boolean flag) { - isSecured = flag; - } -} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/enums/ESCloudProvState.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/enums/ESCloudProvState.java new file mode 100644 index 0000000..dc98dd0 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/enums/ESCloudProvState.java @@ -0,0 +1,65 @@ +/** + * *************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * **************************************************************** + */ + +package org.iotivity.service.easysetup.mediator.enums; + +/** + * It defines various states of the cloud provisioning during easy setup process + */ +public enum ESCloudProvState { + + /** + * Some error occurs during cloud data provisioning + */ + ES_CLOUD_PROVISIONING_ERROR(-1), + + /** + * Cloud data provisioning is successfully done + */ + ES_CLOUD_PROVISIONING_SUCCESS(0), + + /** + * Target enrollee which needs a cloud provisioning is found in a network + */ + ES_CLOUD_ENROLLEE_FOUND(1), + + /** + * Target enrollee which needs a cloud provisioning is NOT found in a network + */ + ES_CLOUD_ENROLLEE_NOT_FOUND(2); + + private int value; + + private ESCloudProvState(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + + public static ESCloudProvState fromInt(int i) { + for (ESCloudProvState b : ESCloudProvState.values()) { + if (b.getValue() == i) { return b; } + } + return null; + } +}; + diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/enums/ESErrorCode.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/enums/ESErrorCode.java new file mode 100644 index 0000000..a908748 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/enums/ESErrorCode.java @@ -0,0 +1,80 @@ +/** + * *************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * **************************************************************** + */ + +package org.iotivity.service.easysetup.mediator.enums; + +/** + * @brief Indicate last error code to describe a reason of error during easy setup. + */ +public enum ESErrorCode { + + /** + * Init Error Code + */ + ES_ERRCODE_NO_ERROR(0), + + /** + * Error Code that given WiFi's SSID is not found + */ + ES_ERRCODE_SSID_NOT_FOUND(1), + + /** + * Error Code that given WiFi's Password is wrong + */ + ES_ERRCODE_PW_WRONG(2), + + /** + * Error Code that IP address is not allocated + */ + ES_ERRCODE_IP_NOT_ALLOCATED(3), + + /** + * Error Code that there is no Internet connection + */ + ES_ERRCODE_NO_INTERNETCONNECTION(4), + + /** + * Error Code that Timeout occured + */ + ES_ERRCODE_TIMEOUT(5), + + /** + * Error Code that Unknown error occured + */ + ES_ERRCODE_UNKNOWN(6); + + private int value; + + private ESErrorCode(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + + public static ESErrorCode fromInt(int i) { + for (ESErrorCode b : ESErrorCode.values()) { + if (b.getValue() == i) { return b; } + } + return null; + } +}; + diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/enums/ESResult.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/enums/ESResult.java new file mode 100644 index 0000000..adf8f42 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/enums/ESResult.java @@ -0,0 +1,55 @@ +/** + * *************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * **************************************************************** + */ + +package org.iotivity.service.easysetup.mediator.enums; + +/** + * It defines an result during easy setup process, which is same as one in Easy Setup C++ SDK + */ +public enum ESResult { + ES_ERROR(-1), + ES_OK(0), + ES_NETWORKFOUND(1), + ES_NETWORKCONNECTED(2), + ES_NETWORKNOTCONNECTED(3), + ES_RESOURCECREATED(11), + ES_RECVREQOFPROVRES(21), + ES_RECVREQOFNETRES(22), + ES_RECVUPDATEOFPROVRES(23), + ES_RECVTRIGGEROFPROVRES(24), + ES_UNAUTHORIZED(25); + + private int value; + + private ESResult(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + + public static ESResult fromInt(int i) { + for (ESResult b : ESResult.values()) { + if (b.getValue() == i) { return b; } + } + return null; + } +}; \ No newline at end of file diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/enums/ProvStatus.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/enums/ProvStatus.java new file mode 100644 index 0000000..68d289c --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/enums/ProvStatus.java @@ -0,0 +1,75 @@ +/** + * *************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * **************************************************************** + */ + +package org.iotivity.service.easysetup.mediator.enums; + +/** + * It defines various states of the cloud provisioning during easy setup process + */ +public enum ProvStatus { + + /** + * Default state of the device + */ + ES_STATE_INIT(0), + + /** + * Status indicating being connecting to target network + */ + ES_STATE_CONNECTING_TO_ENROLLER(1), + + /** + * Status indicating successful connection to target network + */ + ES_STATE_CONNECTED_TO_ENROLLER(2), + + /** + * Status indicating failure connection to target network + */ + ES_STATE_CONNECTED_FAIL_TO_ENROLLER(3), + + /** + * Status indicating successful registration to cloud + */ + ES_STATE_REGISTERED_TO_CLOUD(4), + + /** + * Status indicating failure registration to cloud + */ + ES_STATE_REGISTRRED_FAIL_TO_CLOUD(5); + + private int value; + + private ProvStatus(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + + public static ProvStatus fromInt(int i) { + for (ProvStatus b : ProvStatus.values()) { + if (b.getValue() == i) { return b; } + } + return null; + } +}; + diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/core/IOnBoardingStatus.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/enums/WIFI_AUTHTYPE.java similarity index 50% rename from service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/core/IOnBoardingStatus.java rename to service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/enums/WIFI_AUTHTYPE.java index c709af8..f655048 100644 --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/core/IOnBoardingStatus.java +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/enums/WIFI_AUTHTYPE.java @@ -1,35 +1,56 @@ /** * *************************************************************** - *

- * Copyright 2015 Samsung Electronics All Rights Reserved. - *

- *

- *

+ * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - *

+ * * http://www.apache.org/licenses/LICENSE-2.0 - *

+ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - *

+ * * **************************************************************** */ -package org.iotivity.service.easysetup.core; -public interface IOnBoardingStatus { +package org.iotivity.service.easysetup.mediator.enums; - /** - * Interface called when the scan method finishes. Network operations should - * not execute on UI thread - * - * @param clients of {@link EnrolleeInfo} - */ +/** + * This enum class indicates a WiFi authentication type + */ +public enum WIFI_AUTHTYPE +{ + NONE_AUTH(0), + WEP(1), + WPA_PSK(2), + WPA2_PSK(3); + + private int value; + + private WIFI_AUTHTYPE(int value) + { + this.value = value; + } - public void deviceOnBoardingStatus(EnrolleeInfo clients); + public int getValue() + { + return value; + } + public static WIFI_AUTHTYPE fromInt(int i) + { + for (WIFI_AUTHTYPE b : WIFI_AUTHTYPE.values()) + { + if (b.getValue() == i) + return b; + } + return null; + } } diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/enums/WIFI_ENCTYPE.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/enums/WIFI_ENCTYPE.java new file mode 100644 index 0000000..dd1e605 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/enums/WIFI_ENCTYPE.java @@ -0,0 +1,58 @@ +/** + * *************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * **************************************************************** + */ + +package org.iotivity.service.easysetup.mediator.enums; + +/** + * This enum class indicates a WiFi encryption type + */ +public enum WIFI_ENCTYPE +{ + NONE_ENC(0), + WEP_64(1), + WEP_128(2), + TKIP(3), + AES(4), + TKIP_AES(5); + + private int value; + + private WIFI_ENCTYPE(int value) + { + this.value = value; + } + + public int getValue() + { + return value; + } + + public static WIFI_ENCTYPE fromInt(int i) + { + for (WIFI_ENCTYPE b : WIFI_ENCTYPE.values()) + { + if (b.getValue() == i) + return b; + } + return null; + } +} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/enums/WIFI_FREQ.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/enums/WIFI_FREQ.java new file mode 100644 index 0000000..dcc1e36 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/enums/WIFI_FREQ.java @@ -0,0 +1,66 @@ +/** + * *************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * **************************************************************** + */ + +package org.iotivity.service.easysetup.mediator.enums; + +/** + * This enum class indicates a WiFi frequency like 2.4G and 5G + */ +public enum WIFI_FREQ +{ + WIFI_24G(0), + WIFI_5G(1), + WIFI_BOTH(2), + WIFI_FREQ_NONE(999); + + private int value; + + private WIFI_FREQ(int value) + { + this.value = value; + } + + /** + * Get WiFi frequency as an integer value + * + * @return int WiFi freq. as an integer value + */ + public int getValue() + { + return value; + } + + /** + * Get WiFi frequency as an integer value + * + * @return WIFI_FREQ enum value corresponding to its integer value + */ + public static WIFI_FREQ fromInt(int i) + { + for (WIFI_FREQ b : WIFI_FREQ.values()) + { + if (b.getValue() == i) + return b; + } + return null; + } +} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/enums/WIFI_MODE.java b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/enums/WIFI_MODE.java new file mode 100755 index 0000000..f1d9149 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/enums/WIFI_MODE.java @@ -0,0 +1,87 @@ +/** + * *************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * **************************************************************** + */ + +package org.iotivity.service.easysetup.mediator.enums; + +/** + * This enum class indicates a WiFi mode like 11A and 11N. + */ +public enum WIFI_MODE +{ + /** + * 801.11A + */ + WIFI_11A(0), + + /** + * 801.11B + */ + WIFI_11B(1), + + /** + * 801.11G + */ + WIFI_11G(2), + + /** + * 801.11N + */ + WIFI_11N(3), + + /** + * 801.11AC + */ + WIFI_11AC(4); + + private int value; + + private WIFI_MODE(int value) + { + this.value = value; + } + + /** + * Get WiFi mode as an integer value + * + * @return int WiFi mode as an integer value + */ + public int getValue() + { + return value; + } + + /** + * Convert integer to WIFI_MODE enum value + * + * @param i An integer value converting + * @return WIFI_MODE enum value corresponding to its integer value + */ + public static WIFI_MODE fromInt(int i) + { + for (WIFI_MODE b : WIFI_MODE.values()) + { + if (b.getValue() == i) + return b; + } + return null; + } +} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/Android.mk b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/Android.mk new file mode 100644 index 0000000..819e8ed --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/Android.mk @@ -0,0 +1,98 @@ +#//****************************************************************** +#// +#// Copyright 2016 Samsung Electronics All Rights Reserved. +#// +#//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +#// +#// Licensed under the Apache License, Version 2.0 (the "License"); +#// you may not use this file except in compliance with the License. +#// You may obtain a copy of the License at +#// +#// http://www.apache.org/licenses/LICENSE-2.0 +#// +#// Unless required by applicable law or agreed to in writing, software +#// distributed under the License is distributed on an "AS IS" BASIS, +#// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +#// See the License for the specific language governing permissions and +#// limitations under the License. +#// +#//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +LOCAL_PATH := $(call my-dir) +SECURED := $(SECURE) + +include $(CLEAR_VARS) +OIC_LIB_PATH := ../../../../../../../../../out/android/$(TARGET_ARCH_ABI)/$(APP_OPTIM) +LOCAL_MODULE := android-oc +LOCAL_SRC_FILES := $(OIC_LIB_PATH)/liboc.so +include $(PREBUILT_SHARED_LIBRARY) + +include $(CLEAR_VARS) +OIC_LIB_PATH := ../../../../../../../../../out/android/$(TARGET_ARCH_ABI)/$(APP_OPTIM) +LOCAL_MODULE := android-easysetup +LOCAL_SRC_FILES := $(OIC_LIB_PATH)/libESMediatorRich.so +include $(PREBUILT_SHARED_LIBRARY) + +ifeq ($(SECURED), 1) +include $(CLEAR_VARS) +OIC_LIB_PATH := ../../../../../../../../../out/android/$(TARGET_ARCH_ABI)/$(APP_OPTIM) +LOCAL_MODULE := android-ocprovision +LOCAL_SRC_FILES := $(OIC_LIB_PATH)/libocprovision.so +include $(PREBUILT_SHARED_LIBRARY) +endif + +include $(CLEAR_VARS) +OIC_LIB_PATH := ../../../../../../../../../android/android_api/base/libs/armeabi +LOCAL_MODULE := android-ocstack +LOCAL_SRC_FILES := $(OIC_LIB_PATH)/libocstack-jni.so +include $(PREBUILT_SHARED_LIBRARY) + +include $(CLEAR_VARS) + +LOCAL_MODULE := easysetup-jni + +#Add Pre processor definitions +DEFINE_FLAG = -DWITH_POSIX -D__ANDROID__ + +#Add Debug flags here +DEBUG_FLAG = -DTB_LOG + +BUILD_FLAG = $(DEFINE_FLAG) $(DEBUG_FLAG) + +LOCAL_CPPFLAGS = $(BUILD_FLAG) +LOCAL_CPPFLAGS += -std=c++0x -frtti -fexceptions + +$(info CPPFLAGSUPDATED=$(LOCAL_CPPFLAGS)) + +LOCAL_C_INCLUDES := $(LOCAL_PATH) \ + $(LOCAL_PATH)/../../../../../inc \ + $(LOCAL_PATH)/../../../../../../../inc \ + $(LOCAL_PATH)/../../../../../../../../../resource/csdk/logger/include \ + $(LOCAL_PATH)/../../../../../../../../../resource/csdk/connectivity/common/inc \ + $(LOCAL_PATH)/../../../../../../../../../resource/c_common/oic_string/include \ + $(LOCAL_PATH)/../../../../../../../../../resource/include \ + $(LOCAL_PATH)/../../../../../../../../../resource/c_common \ + $(LOCAL_PATH)/../../../../../../../../../resource/oc_logger/include \ + $(LOCAL_PATH)/../../../../../../../../../resource/c_common/oic_malloc/include \ + $(LOCAL_PATH)/../../../../../../../../../resource/csdk/connectivity/api \ + $(LOCAL_PATH)/../../../../../../../../../resource/csdk/stack/include \ + $(LOCAL_PATH)/../../../../../../../../../resource/csdk/logger/include \ + $(LOCAL_PATH)/../../../../../../../../../resource/csdk/security/include \ + $(LOCAL_PATH)/../../../../../../../../../extlibs/cjson \ + $(LOCAL_PATH)/../../../../../../../../../extlibs/boost/boost_1_58_0 \ + $(LOCAL_PATH)/../../../../../../../../../extlibs/timer \ + $(LOCAL_PATH)/../../../../../../../../../android/android_api/base/jni \ + +LOCAL_SRC_FILES += $(patsubst $(LOCAL_PATH)/%, %, $(wildcard $(LOCAL_PATH)/*.cpp)) +LOCAL_SRC_FILES += $(patsubst $(LOCAL_PATH)/%, %, $(wildcard $(LOCAL_PATH)/*.h)) + +LOCAL_LDLIBS := -llog +#LOCAL_SHARED_LIBRARIES += android-connectivity_abstraction +LOCAL_SHARED_LIBRARIES += android-ocstack +ifeq ($(SECURED), 1) +LOCAL_SHARED_LIBRARIES += android-ocprovision +endif +LOCAL_SHARED_LIBRARIES += android-oc +LOCAL_SHARED_LIBRARIES += android-easysetup + +include $(BUILD_SHARED_LIBRARY) diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/Application.mk b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/Application.mk new file mode 100644 index 0000000..e193abb --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/Application.mk @@ -0,0 +1,24 @@ +#//****************************************************************** +#// +#// Copyright 2016 Samsung Electronics All Rights Reserved. +#// +#//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +#// +#// Licensed under the Apache License, Version 2.0 (the "License"); +#// you may not use this file except in compliance with the License. +#// You may obtain a copy of the License at +#// +#// http://www.apache.org/licenses/LICENSE-2.0 +#// +#// Unless required by applicable law or agreed to in writing, software +#// distributed under the License is distributed on an "AS IS" BASIS, +#// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +#// See the License for the specific language governing permissions and +#// limitations under the License. +#// +#//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +APP_STL := gnustl_shared +APP_PLATFORM = android-21 +NDK_TOOLCHAIN_VERSION := 4.8 + diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniCloudPropProvisioningStatusListener.cpp b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniCloudPropProvisioningStatusListener.cpp new file mode 100755 index 0000000..7708c1f --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniCloudPropProvisioningStatusListener.cpp @@ -0,0 +1,133 @@ +/****************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************/ + +#include "JniCloudPropProvisioningStatusListener.h" +#include "JniRemoteEnrollee.h" + +using namespace OIC::Service; + +JniCloudPropProvisioningStatusListener::JniCloudPropProvisioningStatusListener(JNIEnv *env, jobject jListener, + JniRemoteEnrollee *owner) + : m_ownerResource(owner) +{ + m_jwListener = env->NewWeakGlobalRef(jListener); +} + +JniCloudPropProvisioningStatusListener::~JniCloudPropProvisioningStatusListener() +{ + ES_LOGI("~JniCloudPropProvisioningStatusListener()"); + if (m_jwListener) + { + jint ret; + JNIEnv *env = GetESJNIEnv(ret); + if (NULL == env) return; + env->DeleteWeakGlobalRef(m_jwListener); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + } +} + +void JniCloudPropProvisioningStatusListener::onCloudPropProvisioningStatus(std::shared_ptr + cloudPropProvisioningStatus) +{ + + ES_LOGI("JniCloudPropProvisioningStatusListener::onCloudPropProvisioningStatus enter"); + + jint ret; + JNIEnv *env = GetESJNIEnv(ret); + if (NULL == env) return; + jobject jListener = env->NewLocalRef(m_jwListener); + if (!jListener) + { + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + return; + } + + jclass clsL = env->GetObjectClass(jListener); + if (!clsL) + { + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + return; + } + + jmethodID midL = env->GetMethodID(clsL, "onProgress", + "(Lorg/iotivity/service/easysetup/mediator/" + "CloudPropProvisioningStatus;" + ")V"); + if (!midL) + { + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + return; + } + + ESResult esResult = cloudPropProvisioningStatus->getESResult(); + ESCloudProvState cloudProvisionState = cloudPropProvisioningStatus->getESCloudState(); + + //create the java object + jobject jCloudPropProvisioningStatus = NULL; + jCloudPropProvisioningStatus = env->NewObject(g_cls_CloudPropProvisioningStatus, + g_mid_CloudPropProvisioningStatus_ctor, + (jint)esResult, + (jint)cloudProvisionState); + + ES_LOGI("JniCloudPropProvisioningStatus::onCloudPropProvisioningStatus - %d, %d", esResult, cloudProvisionState); + if (!jCloudPropProvisioningStatus) + { + ES_LOGE("JniCloudPropProvisioningStatus::onCloudPropProvisioningStatus Unable to create the java object"); + return ; + } + + env->CallVoidMethod(jListener, midL, jCloudPropProvisioningStatus); + + bool needRemoveListener = false; + + if(cloudProvisionState == ES_CLOUD_PROVISIONING_ERROR || + cloudProvisionState == ES_CLOUD_PROVISIONING_SUCCESS ) + { + needRemoveListener = true; + } + + if (env->ExceptionCheck()) + { + ES_LOGE("Java exception is thrown"); + if(needRemoveListener) + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + return; + } + + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); +} + +void JniCloudPropProvisioningStatusListener::checkExAndRemoveListener(JNIEnv *env) +{ + if (env->ExceptionCheck()) + { + jthrowable ex = env->ExceptionOccurred(); + env->ExceptionClear(); + m_ownerResource->removeStatusListener(env, m_jwListener); + env->Throw((jthrowable)ex); + } + else + { + m_ownerResource->removeStatusListener(env, m_jwListener); + } +} diff --git a/service/easy-setup/mediator/richsdk/android/jni/JniProvisioningStatusListener.h b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniCloudPropProvisioningStatusListener.h old mode 100644 new mode 100755 similarity index 67% rename from service/easy-setup/mediator/richsdk/android/jni/JniProvisioningStatusListener.h rename to service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniCloudPropProvisioningStatusListener.h index 8b37cac..a5f9fbf --- a/service/easy-setup/mediator/richsdk/android/jni/JniProvisioningStatusListener.h +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniCloudPropProvisioningStatusListener.h @@ -3,7 +3,6 @@ * Copyright 2016 Samsung Electronics All Rights Reserved. * * - * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -22,8 +21,8 @@ * @brief This file contains JNI Provisioing status Listener class */ -#ifndef __JNI_ES_PROVISIONING_STATUS_LISTENER_H_ -#define __JNI_ES_PROVISIONING_STATUS_LISTENER_H_ +#ifndef __JNI_ES_CLOUD_PROP_PROVISIONING_STATUS_LISTENER_H_ +#define __JNI_ES_CLOUD_PROP_PROVISIONING_STATUS_LISTENER_H_ #include @@ -37,27 +36,27 @@ class JniRemoteEnrollee; using namespace OIC::Service; /** - * @class JniProvisioningStatusListener - * @brief This class provides functions for handling the provisioning status callback between the Java and native layer + * @class JniCloudPropProvisioningStatusListener + * @brief This class provides functions for handling the cloud provisioning status callback between the Java and native layer * */ -class JniProvisioningStatusListener +class JniCloudPropProvisioningStatusListener { public: /** * @brief constructor */ - JniProvisioningStatusListener(JNIEnv *env, jobject jListener, JniRemoteEnrollee *resource); + JniCloudPropProvisioningStatusListener(JNIEnv *env, jobject jListener, JniRemoteEnrollee *resource); /** * @brief destructor */ - ~JniProvisioningStatusListener(); + ~JniCloudPropProvisioningStatusListener(); /** * @brief callback function that will be passed to Native layer */ - void provisionStatusCallback (std::shared_ptr easySetupStatus); + void onCloudPropProvisioningStatus (std::shared_ptr cloudPropProvisioningStatus); private: jweak m_jwListener; @@ -65,4 +64,5 @@ class JniProvisioningStatusListener void checkExAndRemoveListener(JNIEnv *env); }; -#endif //__JNI_ES_PROVISIONING_STATUS_LISTENER_H_ +#endif //__JNI_ES_CLOUD_PROP_PROVISIONING_STATUS_LISTENER_H_ + diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniDevicePropProvisioningStatusListener.cpp b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniDevicePropProvisioningStatusListener.cpp new file mode 100755 index 0000000..c65ce7c --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniDevicePropProvisioningStatusListener.cpp @@ -0,0 +1,123 @@ +/****************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************/ + +#include "JniDevicePropProvisioningStatusListener.h" +#include "JniRemoteEnrollee.h" + +using namespace OIC::Service; + +JniDevicePropProvisioningStatusListener::JniDevicePropProvisioningStatusListener(JNIEnv *env, jobject jListener, + JniRemoteEnrollee *owner) + : m_ownerResource(owner) +{ + m_jwListener = env->NewWeakGlobalRef(jListener); +} + +JniDevicePropProvisioningStatusListener::~JniDevicePropProvisioningStatusListener() +{ + ES_LOGI("~JniDevicePropProvisioningStatusListener()"); + if (m_jwListener) + { + jint ret; + JNIEnv *env = GetESJNIEnv(ret); + if (NULL == env) return; + env->DeleteWeakGlobalRef(m_jwListener); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + } +} + +void JniDevicePropProvisioningStatusListener::onDevicePropProvisioningStatusCallback (std::shared_ptr + devicePropProvStatusCb) +{ + + ES_LOGI("JniDevicePropProvisioningStatusListener::onDevicePropProvisioningStatusCallback enter"); + + jint ret; + JNIEnv *env = GetESJNIEnv(ret); + if (NULL == env) return; + jobject jListener = env->NewLocalRef(m_jwListener); + if (!jListener) + { + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + return; + } + + jclass clsL = env->GetObjectClass(jListener); + if (!clsL) + { + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + return; + } + //TODO: + jmethodID midL = env->GetMethodID(clsL, "onProgress", + "(Lorg/iotivity/service/easysetup/mediator/" + "DevicePropProvisioningStatus;" + ")V"); + + if (!midL) + { + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + return; + } + + int nativeESResult = convertNativeDeviceProvResultToInt(devicePropProvStatusCb->getESResult()); + + jobject jDevicePropProvisioningStatus = NULL; + jDevicePropProvisioningStatus = env->NewObject(g_cls_DevicePropProvisioningStatus, + g_mid_DevicePropProvisioningStatus_ctor, + (jint)nativeESResult); + + ES_LOGI("JniDevicePropProvisioningStatus::onDevicePropProvisioningStatus - %d", nativeESResult); + if (!jDevicePropProvisioningStatus) + { + ES_LOGE("JniDevicePropProvisioningStatus::onDevicePropProvisioningStatus Unable to create the java object"); + return ; + } + + env->CallVoidMethod(jListener, midL, jDevicePropProvisioningStatus); + + if (env->ExceptionCheck()) + { + ES_LOGE("Java exception is thrown"); + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + return; + } + + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); +} + +void JniDevicePropProvisioningStatusListener::checkExAndRemoveListener(JNIEnv *env) +{ + if (env->ExceptionCheck()) + { + jthrowable ex = env->ExceptionOccurred(); + env->ExceptionClear(); + m_ownerResource->removeStatusListener(env, m_jwListener); + env->Throw((jthrowable)ex); + } + else + { + m_ownerResource->removeStatusListener(env, m_jwListener); + } +} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniDevicePropProvisioningStatusListener.h b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniDevicePropProvisioningStatusListener.h new file mode 100644 index 0000000..dde3389 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniDevicePropProvisioningStatusListener.h @@ -0,0 +1,59 @@ +/****************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************/ + +#ifndef __JNI_ES_DEVICE_PROP_PROVISIONING_STATUS_LISTENER_H_ +#define __JNI_ES_DEVICE_PROP_PROVISIONING_STATUS_LISTENER_H_ + +#include + +#include "RemoteEnrollee.h" +#include "ESRichCommon.h" + +#include "JniJvm.h" + +class JniRemoteEnrollee; + +using namespace OIC::Service; + +class JniDevicePropProvisioningStatusListener +{ + public: + /** + * @brief constructor + */ + JniDevicePropProvisioningStatusListener(JNIEnv *env, jobject jListener, JniRemoteEnrollee *resource); + + /** + * @brief destructor + */ + ~JniDevicePropProvisioningStatusListener(); + + /** + * @brief callback function that will be passed to Native layer + */ + void onDevicePropProvisioningStatusCallback (std::shared_ptr devicePropProvisioningStatus); + + private: + jweak m_jwListener; + JniRemoteEnrollee *m_ownerResource; + void checkExAndRemoveListener(JNIEnv *env); +}; + +#endif //__JNI_ES_DEVICE_PROP_PROVISIONING_STATUS_LISTENER_H_ diff --git a/service/easy-setup/mediator/richsdk/android/jni/JniEasySetup.cpp b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniEasySetup.cpp old mode 100644 new mode 100755 similarity index 54% rename from service/easy-setup/mediator/richsdk/android/jni/JniEasySetup.cpp rename to service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniEasySetup.cpp index a237936..cae9ec5 --- a/service/easy-setup/mediator/richsdk/android/jni/JniEasySetup.cpp +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniEasySetup.cpp @@ -17,65 +17,61 @@ * limitations under the License. * ******************************************************************/ +#include +#include +#include "OCPlatform.h" +#include "OCResource.h" +#include "octypes.h" +#include "ESRichCommon.h" + +#include "JniOcResource.h" #include "JniEasySetup.h" +using namespace OC; using namespace OIC::Service; #ifdef __cplusplus extern "C" { #endif JNIEXPORT jobject JNICALL -Java_org_iotivity_service_easysetup_mediator_EasySetupService_nativeCreateEnrolleeDevice -(JNIEnv *env, jobject interfaceClass, jstring ip, jstring ssid, jstring password, - jint connectivityType, jboolean isSecured) +Java_org_iotivity_service_easysetup_mediator_EasySetup_nativeCreateRemoteEnrollee +(JNIEnv *env, jobject thiz, jobject jResource) { - - LOGI("JniEasySetup::nativeCreateEnrolleeDevice enter"); + ES_LOGI("JniEasySetup::nativeCreateRemoteEnrollee enter"); std::shared_ptr nativeRemoteEnrollee; jobject jRemoteEnrollee; - ProvConfig netInfo; - WiFiOnboadingConnection onboardConn; - - const char *cIp = (env)->GetStringUTFChars(ip, NULL); - const char *cSssid = (env)->GetStringUTFChars(ssid, NULL); - const char *cPassword = (env)->GetStringUTFChars(password, NULL); - - std::string sIp(cIp); - std::string sSssid(cSssid); - std::string sPassword(cPassword); - netInfo.connType = getOCConnectivityTypeFromInt(connectivityType); + JniOcResource* jniOcResource = JniOcResource::getJniOcResourcePtr(env, jResource); - onboardConn.isSecured = bool(isSecured); - - OICStrcpy(onboardConn.ipAddress, IPV4_ADDR_SIZE - 1, sIp.c_str()); - OICStrcpy(netInfo.provData.WIFI.ssid, NET_WIFI_SSID_SIZE - 1, sSssid.c_str()); - OICStrcpy(netInfo.provData.WIFI.pwd, NET_WIFI_PWD_SIZE - 1, sPassword.c_str()); + if (!jniOcResource) + { + ES_LOGE("JniEasySetup::nativeCreateRemoteEnrollee getJniOcResourcePtr returns nullptr."); + return nullptr; + } try { - nativeRemoteEnrollee = EasySetup::getInstance()->createEnrolleeDevice(netInfo,onboardConn); + nativeRemoteEnrollee = EasySetup::getInstance()->createRemoteEnrollee(jniOcResource->getOCResource()); //create the java object jRemoteEnrollee = env->NewObject(g_cls_RemoteEnrollee, g_mid_RemoteEnrollee_ctor); if (!jRemoteEnrollee) { - LOGE("JniEasySetup::nativeCreateEnrolleeDevice Unable to create the java object"); + ES_LOGE("JniEasySetup::nativeCreateRemoteEnrollee Unable to create the java object"); return NULL; } - JniRemoteEnrollee *jniRemoteEnrollee = new JniRemoteEnrollee(nativeRemoteEnrollee); ESSetHandle(env, jRemoteEnrollee, jniRemoteEnrollee); } catch (ESBadRequestException exception) { - LOGE("JniEasySetup::nativeCreateEnrolleeDevice Unable to create the Native EnrolleeDevice"); + ES_LOGE("JniEasySetup::nativeCreateRemoteEnrollee Unable to create the Native EnrolleeDevice"); //throw the exception to java layer throwESException( env, exception.what()); } - LOGI("JniEasySetup::nativeCreateEnrolleeDevice exit"); + ES_LOGI("JniEasySetup::nativeCreateRemoteEnrollee exit"); return jRemoteEnrollee; } diff --git a/service/easy-setup/mediator/richsdk/android/jni/JniEasySetup.h b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniEasySetup.h old mode 100644 new mode 100755 similarity index 74% rename from service/easy-setup/mediator/richsdk/android/jni/JniEasySetup.h rename to service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniEasySetup.h index 2af8935..d4e6391 --- a/service/easy-setup/mediator/richsdk/android/jni/JniEasySetup.h +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniEasySetup.h @@ -47,18 +47,12 @@ extern "C" { /** * API for creating and returning the RemoteEnrollee object to Java Layer * - * @param ip - ip address of Enrollee - * @param ssid - ssid of the Enroller - * @param password - password of the enroller - * @param connectivityType - Connectivity Type - * @param needSecuredEasysetup - need secured easy setup or not - * * @return jobject - RemoteEnrolleee */ JNIEXPORT jobject JNICALL -Java_org_iotivity_service_easysetup_mediator_EasySetupService_nativeCreateEnrolleeDevice -(JNIEnv *env, jobject interfaceClass, jstring ip, jstring ssid, jstring password, - jint connectivityType, jboolean needSecuredEasysetup); +Java_org_iotivity_service_easysetup_mediator_EasySetup_nativeCreateRemoteEnrollee +(JNIEnv *env, jobject thiz, jobject jResource); + #ifdef __cplusplus } diff --git a/service/easy-setup/mediator/richsdk/android/jni/JniEsListenerManager.h b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniEsListenerManager.h old mode 100644 new mode 100755 similarity index 92% rename from service/easy-setup/mediator/richsdk/android/jni/JniEsListenerManager.h rename to service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniEsListenerManager.h index a01ec8d..98daf1d --- a/service/easy-setup/mediator/richsdk/android/jni/JniEsListenerManager.h +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniEsListenerManager.h @@ -60,7 +60,7 @@ class JniEsListenerManager refPair.second++; it->second = refPair; m_listenerMap.insert(*it); - LOGD("OnEventListener: ref. count is incremented"); + ES_LOGD("OnEventListener: ref. count is incremented"); break; } } @@ -77,10 +77,10 @@ class JniEsListenerManager } else { - LOGD("OnEventListener: Failed to create global listener ref."); + ES_LOGD("OnEventListener: Failed to create global listener ref."); delete onEventListener; } - LOGD("OnEventListener: new listener"); + ES_LOGD("OnEventListener: new listener"); } m_mapMutex.unlock(); return onEventListener; @@ -102,7 +102,7 @@ class JniEsListenerManager refPair.second--; it->second = refPair; m_listenerMap.insert(*it); - LOGI("OnEventListener: ref. count is decremented"); + ES_LOGI("OnEventListener: ref. count is decremented"); } else { @@ -111,7 +111,7 @@ class JniEsListenerManager delete listener; m_listenerMap.erase(it); - LOGI("OnEventListener is removed"); + ES_LOGI("OnEventListener is removed"); } break; } diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniEsUtils.cpp b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniEsUtils.cpp new file mode 100755 index 0000000..4ab4da1 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniEsUtils.cpp @@ -0,0 +1,141 @@ +/****************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************/ + +#include "JniEsUtils.h" + +void throwESException(JNIEnv *env, std::string reason) +{ + jobject ex = env->NewObject(g_cls_ESException, g_mid_ESException_ctor, + env->NewStringUTF(reason.c_str())); + if (!ex) + { + ES_LOGI("throwException : jobject is NULL"); + } + env->Throw((jthrowable)ex); +} + +OCConnectivityType getOCConnectivityTypeFromInt(int connectivityType) +{ + switch (connectivityType) + { + case CT_DEFAULT: + return CT_DEFAULT; + case CT_ADAPTER_IP: + return CT_ADAPTER_IP; + + //May be need to add more types, if easy setup service support more transport. + } + return CT_DEFAULT; +} + +WIFI_AUTHTYPE getWifiAuthTypeFromInt(int authType) +{ + switch (authType) + { + case 0: + return WIFI_AUTHTYPE::NONE_AUTH; + case 1: + return WIFI_AUTHTYPE::WEP; + case 2: + return WIFI_AUTHTYPE::WPA_PSK; + case 3: + return WIFI_AUTHTYPE::WPA2_PSK; + } + return NONE_AUTH; +} + +WIFI_ENCTYPE getWifiEncTypeFromInt(int encType) +{ + switch (encType) + { + case 0: + return WIFI_ENCTYPE::NONE_ENC; + case 1: + return WIFI_ENCTYPE::WEP_64; + case 2: + return WIFI_ENCTYPE::WEP_128; + case 3: + return WIFI_ENCTYPE::TKIP; + case 4: + return WIFI_ENCTYPE::AES; + case 5: + return WIFI_ENCTYPE::TKIP_AES; + } + return NONE_ENC; +} + +int convertNativeWifiFreqToInt(WIFI_FREQ wifiFreq) +{ + switch (wifiFreq) + { + case WIFI_FREQ::WIFI_24G: + return 0; + case WIFI_FREQ::WIFI_5G: + return 1; + case WIFI_FREQ::WIFI_BOTH: + return 2; + } +} + +int convertNativeWifiModeToInt(WIFI_MODE wifiMode) +{ + switch (wifiMode) + { + case WIFI_MODE::WIFI_11A: + return 0; + case WIFI_MODE::WIFI_11B: + return 1; + case WIFI_MODE::WIFI_11G: + return 2; + case WIFI_MODE::WIFI_11N: + return 3; + case WIFI_MODE::WIFI_11AC: + return 4; + } +} + +int convertNativeDeviceProvResultToInt(ESResult nativeResult) +{ + switch (nativeResult) + { + case ESResult::ES_ERROR: + return -1; + case ESResult::ES_OK: + return 0; + case ESResult::ES_NETWORKFOUND: + return 1; + case ESResult::ES_NETWORKCONNECTED: + return 2; + case ESResult::ES_NETWORKNOTCONNECTED: + return 3; + case ESResult::ES_RESOURCECREATED: + return 11; + case ESResult::ES_RECVREQOFPROVRES: + return 21; + case ESResult::ES_RECVREQOFNETRES: + return 22; + case ESResult::ES_RECVUPDATEOFPROVRES: + return 23; + case ESResult::ES_RECVTRIGGEROFPROVRES: + return 24; + case ESResult::ES_UNAUTHORIZED: + return 31; + } +} \ No newline at end of file diff --git a/service/easy-setup/mediator/richsdk/android/jni/JniEsUtils.h b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniEsUtils.h old mode 100644 new mode 100755 similarity index 83% rename from service/easy-setup/mediator/richsdk/android/jni/JniEsUtils.h rename to service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniEsUtils.h index f65a68c..e966fbd --- a/service/easy-setup/mediator/richsdk/android/jni/JniEsUtils.h +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniEsUtils.h @@ -47,9 +47,9 @@ void throwESException(JNIEnv *env, std::string reason); */ OCConnectivityType getOCConnectivityTypeFromInt(int connectivityType); -/** -* @brief Convert EasySetupState Enum Value to int -*/ -int convertNativeProvisionStateToInt(EasySetupState nativeState); - +WIFI_AUTHTYPE getWifiAuthTypeFromInt(int authType); +WIFI_ENCTYPE getWifiEncTypeFromInt(int encType); +int convertNativeWifiFreqToInt(WIFI_FREQ wifiFreq); +int convertNativeWifiModeToInt(WIFI_MODE wifiMode); +int convertNativeDeviceProvResultToInt(ESResult nativeResult); #endif //__JNI_ES_UTILS_H_ diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniGetConfigurationStatusListener.cpp b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniGetConfigurationStatusListener.cpp new file mode 100755 index 0000000..ac02811 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniGetConfigurationStatusListener.cpp @@ -0,0 +1,148 @@ +/****************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************/ + +#include "JniGetConfigurationStatusListener.h" +#include "JniRemoteEnrollee.h" + +using namespace OC; +using namespace OIC::Service; + +JniGetConfigurationStatusListener::JniGetConfigurationStatusListener(JNIEnv *env, jobject jListener, + JniRemoteEnrollee *owner) + : m_ownerResource(owner) +{ + m_jwListener = env->NewWeakGlobalRef(jListener); +} + +JniGetConfigurationStatusListener::~JniGetConfigurationStatusListener() +{ + ES_LOGI("~JniGetConfigurationStatusListener()"); + if (m_jwListener) + { + jint ret; + JNIEnv *env = GetESJNIEnv(ret); + if (NULL == env) return; + env->DeleteWeakGlobalRef(m_jwListener); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + } +} + +void JniGetConfigurationStatusListener::getConfigurationStatusCallback ( + std::shared_ptr getConfigurationStatusCb) +{ + ES_LOGI("JniGetConfigurationStatusListener::provisioiningStatusCallback enter"); + + jint ret; + JNIEnv *env = GetESJNIEnv(ret); + if (NULL == env) return; + jobject jListener = env->NewLocalRef(m_jwListener); + if (!jListener) + { + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + return; + } + + jclass clsL = env->GetObjectClass(jListener); + if (!clsL) + { + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + return; + } + + jmethodID midL = env->GetMethodID(clsL, "onProgress", + "(Lorg/iotivity/service/easysetup/mediator/" + "GetConfigurationStatus;" + ")V"); + + if (!midL) + { + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + return; + } + + EnrolleeConf enrolleeConf = getConfigurationStatusCb->getEnrolleeConf(); + OCRepresentation m_ProvRep = enrolleeConf.getProvResRep(); + + OCRepresentation* rep = new OCRepresentation(m_ProvRep); + jlong handle = reinterpret_cast(rep); + jobject jRepresentation = env->NewObject(g_cls_OcRepresentation, g_mid_OcRepresentation_N_ctor_bool, + handle, true); + if (!jRepresentation) + { + delete rep; + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) + { + g_jvm->DetachCurrentThread(); + } + return; + } + + jobject jEnrolleeConf = NULL; + jEnrolleeConf = env->NewObject(g_cls_EnrolleeConf, g_mid_EnrolleeConf_ctor, (jobject)jRepresentation); + if (!jEnrolleeConf) { + ES_LOGE("JniGetConfigurationStatusListener::getConfigurationStatusCallback Unable to create the jEnrolleeConf"); + return ; + } + + ESResult esResult = getConfigurationStatusCb->getESResult(); + jobject jgetConfigurationStatus = NULL; + jgetConfigurationStatus = env->NewObject(g_cls_getConfigurationStatus, + g_mid_getConfigurationStatus_ctor, + (jint)esResult, + (jobject)jEnrolleeConf); + + if (!jgetConfigurationStatus) + { + ES_LOGE("JniGetConfigurationStatusListener::getConfigurationStatusCallback Unable to create the java object"); + return ; + } + + env->CallVoidMethod(jListener, midL, jgetConfigurationStatus); + + if (env->ExceptionCheck()) + { + ES_LOGE("Java exception is thrown"); + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + return; + } + + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); +} + +void JniGetConfigurationStatusListener::checkExAndRemoveListener(JNIEnv *env) +{ + if (env->ExceptionCheck()) + { + jthrowable ex = env->ExceptionOccurred(); + env->ExceptionClear(); + m_ownerResource->removeStatusListener(env, m_jwListener); + + env->Throw((jthrowable)ex); + } + else + { + m_ownerResource->removeStatusListener(env, m_jwListener); + } +} diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniGetConfigurationStatusListener.h b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniGetConfigurationStatusListener.h new file mode 100755 index 0000000..2651c8d --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniGetConfigurationStatusListener.h @@ -0,0 +1,60 @@ +/****************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************/ + +#ifndef __JNI_ES_GET_CONFIGURATION_STATUS_LISTENER_H_ +#define __JNI_ES_GET_CONFIGURATION_STATUS_LISTENER_H_ + +#include + +#include "OCPlatform.h" +#include "RemoteEnrollee.h" +#include "ESRichCommon.h" + +#include "JniJvm.h" + +class JniRemoteEnrollee; + +using namespace OIC::Service; + +class JniGetConfigurationStatusListener +{ + public: + /** + * @brief constructor + */ + JniGetConfigurationStatusListener(JNIEnv *env, jobject jListener, JniRemoteEnrollee *resource); + + /** + * @brief destructor + */ + ~JniGetConfigurationStatusListener(); + + /** + * @brief callback function that will be passed to Native layer + */ + void getConfigurationStatusCallback (std::shared_ptr getConfigurationStatus); + + private: + jweak m_jwListener; + JniRemoteEnrollee *m_ownerResource; + void checkExAndRemoveListener(JNIEnv *env); +}; + +#endif //__JNI_ES_GET_CONFIGURATION_STATUS_LISTENER_H_ diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniGetEnrolleeStatusListener.cpp b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniGetEnrolleeStatusListener.cpp new file mode 100755 index 0000000..f2ddee8 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniGetEnrolleeStatusListener.cpp @@ -0,0 +1,153 @@ +/****************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************/ + +#include "JniGetEnrolleeStatusListener.h" +#include "JniRemoteEnrollee.h" + +using namespace OC; +using namespace OIC::Service; + +JniGetEnrolleeStatusListener::JniGetEnrolleeStatusListener(JNIEnv *env, jobject jListener, + JniRemoteEnrollee *owner) + : m_ownerResource(owner) +{ + m_jwListener = env->NewWeakGlobalRef(jListener); +} + +JniGetEnrolleeStatusListener::~JniGetEnrolleeStatusListener() +{ + ES_LOGI("~JniGetEnrolleeStatusListener()"); + if (m_jwListener) + { + jint ret; + JNIEnv *env = GetESJNIEnv(ret); + if (NULL == env) return; + env->DeleteWeakGlobalRef(m_jwListener); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + } +} + +void JniGetEnrolleeStatusListener::getEnrolleeStatusCallback ( + std::shared_ptr getEnrolleeStatusCb) +{ + ES_LOGI("JniGetEnrolleeStatusListener::getEnrolleeStatusCallback enter"); + + jint ret; + JNIEnv *env = GetESJNIEnv(ret); + if (NULL == env) return; + jobject jListener = env->NewLocalRef(m_jwListener); + if (!jListener) + { + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + return; + } + + jclass clsL = env->GetObjectClass(jListener); + if (!clsL) + { + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + return; + } + + jmethodID midL = env->GetMethodID(clsL, "onProgress", + "(Lorg/iotivity/service/easysetup/mediator/" + "GetEnrolleeStatus;" + ")V"); + + if (!midL) + { + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + return; + } + + EnrolleeStatus enrolleeStatus = getEnrolleeStatusCb->getEnrolleeStatus(); + OCRepresentation m_Rep = enrolleeStatus.getRepresentation(); + OCRepresentation* rep = new OCRepresentation(m_Rep); + jlong handle = reinterpret_cast(rep); + jobject jRepresentation = env->NewObject(g_cls_OcRepresentation, + g_mid_OcRepresentation_N_ctor_bool, + handle, true); + if (!jRepresentation) + { + delete rep; + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) + { + g_jvm->DetachCurrentThread(); + } + return; + } + + jobject jEnrolleeStatus = NULL; + jEnrolleeStatus = env->NewObject(g_cls_EnrolleeStatus, + g_mid_EnrolleeStatus_ctor, + (jobject)jRepresentation); + if (!jEnrolleeStatus) { + ES_LOGE("JniGetEnrolleeStatusListener::getEnrolleeStatusCallback Unable to create the jEnrolleeStatus"); + return ; + } + + ESResult esResult = getEnrolleeStatusCb->getESResult(); + jobject jgetEnrolleeStatus = NULL; + jgetEnrolleeStatus = env->NewObject(g_cls_getEnrolleeStatus, + g_mid_getEnrolleeStatus_ctor, + (jint)esResult, + (jobject)jEnrolleeStatus); + + if (!jgetEnrolleeStatus) + { + ES_LOGE("JniGetEnrolleeStatusListener::getEnrolleeStatusCallback Unable to create the java object"); + return ; + } + + env->CallVoidMethod(jListener, midL, jgetEnrolleeStatus); + + if (env->ExceptionCheck()) + { + ES_LOGE("Java exception is thrown"); + checkExAndRemoveListener(env); + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); + return; + } + + if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); +} + +void JniGetEnrolleeStatusListener::checkExAndRemoveListener(JNIEnv *env) +{ + if (env->ExceptionCheck()) + { + jthrowable ex = env->ExceptionOccurred(); + env->ExceptionClear(); + m_ownerResource->removeStatusListener + (env, m_jwListener); + + env->Throw((jthrowable)ex); + } + else + { + m_ownerResource->removeStatusListener + (env, m_jwListener); + } +} + diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniGetEnrolleeStatusListener.h b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniGetEnrolleeStatusListener.h new file mode 100755 index 0000000..794d431 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniGetEnrolleeStatusListener.h @@ -0,0 +1,61 @@ +/****************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************/ + +#ifndef __JNI_ES_GET_ENROLLEE_STATUS_LISTENER_H_ +#define __JNI_ES_GET_ENROLLEE_STATUS_LISTENER_H_ + +#include + +#include "OCPlatform.h" +#include "RemoteEnrollee.h" +#include "ESRichCommon.h" + +#include "JniJvm.h" + +class JniRemoteEnrollee; + +using namespace OIC::Service; + +class JniGetEnrolleeStatusListener +{ + public: + /** + * @brief constructor + */ + JniGetEnrolleeStatusListener(JNIEnv *env, jobject jListener, JniRemoteEnrollee *resource); + + /** + * @brief destructor + */ + ~JniGetEnrolleeStatusListener(); + + /** + * @brief callback function that will be passed to Native layer + */ + void getEnrolleeStatusCallback (std::shared_ptr getEnrolleeStatus); + + private: + jweak m_jwListener; + JniRemoteEnrollee *m_ownerResource; + void checkExAndRemoveListener(JNIEnv *env); +}; + +#endif //__JNI_ES_GET_CONFIGURATION_STATUS_LISTENER_H_ + diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniJvm.cpp b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniJvm.cpp new file mode 100755 index 0000000..a686730 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniJvm.cpp @@ -0,0 +1,193 @@ +/****************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************/ +#include "JniJvm.h" + +JavaVM *g_jvm = NULL; + +jclass g_cls_RemoteEnrollee = NULL; +jclass g_cls_ESException = NULL; +jclass g_cls_EnrolleeStatus = NULL; +jclass g_cls_EnrolleeConf = NULL; +jclass g_cls_getEnrolleeStatus = NULL; +jclass g_cls_getConfigurationStatus = NULL; +jclass g_cls_SecurityProvisioningStatus = NULL; +jclass g_cls_DevicePropProvisioningStatus = NULL; +jclass g_cls_CloudPropProvisioningStatus = NULL; +jclass g_cls_Integer = NULL; +jclass g_cls_OcRepresentation = NULL; + +jmethodID g_mid_RemoteEnrollee_ctor = NULL; +jmethodID g_mid_ESException_ctor = NULL; +jmethodID g_mid_EnrolleeStatus_ctor = NULL; +jmethodID g_mid_EnrolleeConf_ctor = NULL; +jmethodID g_mid_getEnrolleeStatus_ctor = NULL; +jmethodID g_mid_getConfigurationStatus_ctor = NULL; +jmethodID g_mid_SecurityProvisioningStatus_ctor = NULL; +jmethodID g_mid_DevicePropProvisioningStatus_ctor = NULL; +jmethodID g_mid_CloudPropProvisioningStatus_ctor = NULL; +jmethodID g_mid_Integer_ctor = NULL; +jmethodID g_mid_OcRepresentation_N_ctor_bool = NULL; + +// JNI OnLoad +JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) +{ + ES_LOGI("JNI_OnLoad"); + JNIEnv *env; + g_jvm = vm; + + if (g_jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK) + { + ES_LOGE("Failed to get the environment using GetEnv()"); + return JNI_ERR; + } + + jclass clazz = nullptr; + + // Remote Enrollee + clazz = env->FindClass("org/iotivity/service/easysetup/mediator/RemoteEnrollee"); + if (!clazz) return JNI_ERR; + g_cls_RemoteEnrollee = (jclass)env->NewGlobalRef(clazz); + env->DeleteLocalRef(clazz); + + g_mid_RemoteEnrollee_ctor = env->GetMethodID(g_cls_RemoteEnrollee, "", + "(J)V"); + if (!g_mid_RemoteEnrollee_ctor) return JNI_ERR; + + // ESException + clazz = env->FindClass("org/iotivity/service/easysetup/mediator/ESException"); + if (!clazz) return JNI_ERR; + g_cls_ESException = (jclass)env->NewGlobalRef(clazz); + env->DeleteLocalRef(clazz); + + g_mid_ESException_ctor = env->GetMethodID(g_cls_ESException, "", "(Ljava/lang/String;)V"); + if (!g_mid_ESException_ctor) return JNI_ERR; + + // EnrolleeStatus + clazz = env->FindClass("org/iotivity/service/easysetup/mediator/EnrolleeStatus"); + if (!clazz) return JNI_ERR; + + g_cls_EnrolleeStatus = (jclass)env->NewGlobalRef(clazz); + env->DeleteLocalRef(clazz); + + g_mid_EnrolleeStatus_ctor = env->GetMethodID(g_cls_EnrolleeStatus, "", + "(Lorg/iotivity/base/OcRepresentation;)V"); + if (!g_mid_EnrolleeStatus_ctor) return JNI_ERR; + + // EnrolleeConf + clazz = env->FindClass("org/iotivity/service/easysetup/mediator/EnrolleeConf"); + if (!clazz) return JNI_ERR; + + g_cls_EnrolleeConf = (jclass)env->NewGlobalRef(clazz); + env->DeleteLocalRef(clazz); + + g_mid_EnrolleeConf_ctor = env->GetMethodID(g_cls_EnrolleeConf, "", + "(Lorg/iotivity/base/OcRepresentation;)V"); + if (!g_mid_EnrolleeConf_ctor) return JNI_ERR; + + // getEnrolleeStatus + clazz = env->FindClass("org/iotivity/service/easysetup/mediator/GetEnrolleeStatus"); + if (!clazz) return JNI_ERR; + + g_cls_getEnrolleeStatus = (jclass)env->NewGlobalRef(clazz); + env->DeleteLocalRef(clazz); + + g_mid_getEnrolleeStatus_ctor = env->GetMethodID(g_cls_getEnrolleeStatus, "", + "(ILorg/iotivity/service/easysetup/mediator/EnrolleeStatus;)V"); + if (!g_mid_getEnrolleeStatus_ctor) return JNI_ERR; + + // getConfigurationStatus + clazz = env->FindClass("org/iotivity/service/easysetup/mediator/GetConfigurationStatus"); + if (!clazz) return JNI_ERR; + + g_cls_getConfigurationStatus = (jclass)env->NewGlobalRef(clazz); + env->DeleteLocalRef(clazz); + + g_mid_getConfigurationStatus_ctor = env->GetMethodID(g_cls_getConfigurationStatus, "", + "(ILorg/iotivity/service/easysetup/mediator/EnrolleeConf;)V"); + if (!g_mid_getConfigurationStatus_ctor) return JNI_ERR; + + // SecurityProvisioningStatus + clazz = env->FindClass("org/iotivity/service/easysetup/mediator/SecurityProvisioningStatus"); + if (!clazz) return JNI_ERR; + + g_cls_SecurityProvisioningStatus = (jclass)env->NewGlobalRef(clazz); + env->DeleteLocalRef(clazz); + + g_mid_SecurityProvisioningStatus_ctor = env->GetMethodID(g_cls_SecurityProvisioningStatus, "", + "(ILjava/lang/String;)V"); + if (!g_mid_SecurityProvisioningStatus_ctor) return JNI_ERR; + + // DevicePropProvisioningStatus + clazz = env->FindClass("org/iotivity/service/easysetup/mediator/DevicePropProvisioningStatus"); + if (!clazz) return JNI_ERR; + + g_cls_DevicePropProvisioningStatus = (jclass)env->NewGlobalRef(clazz); + env->DeleteLocalRef(clazz); + + g_mid_DevicePropProvisioningStatus_ctor = env->GetMethodID(g_cls_DevicePropProvisioningStatus, "", + "(I)V"); + if (!g_mid_DevicePropProvisioningStatus_ctor) return JNI_ERR; + + // CloudPropProvisioningStatus + clazz = env->FindClass("org/iotivity/service/easysetup/mediator/CloudPropProvisioningStatus"); + if (!clazz) return JNI_ERR; + g_cls_CloudPropProvisioningStatus = (jclass)env->NewGlobalRef(clazz); + env->DeleteLocalRef(clazz); + + g_mid_CloudPropProvisioningStatus_ctor = env->GetMethodID(g_cls_CloudPropProvisioningStatus, "", + "(II)V"); + if (!g_mid_CloudPropProvisioningStatus_ctor) return JNI_ERR; + + // Integer + clazz = env->FindClass("java/lang/Integer"); + if (!clazz) return JNI_ERR; + g_cls_Integer = (jclass)env->NewGlobalRef(clazz); + env->DeleteLocalRef(clazz); + + g_mid_Integer_ctor = env->GetMethodID(g_cls_Integer, "", + "(I)V"); + if (!g_mid_Integer_ctor) return JNI_ERR; + + //OcRepresentation + clazz = env->FindClass("org/iotivity/base/OcRepresentation"); + if (!clazz) return JNI_ERR; + g_cls_OcRepresentation = (jclass)env->NewGlobalRef(clazz); + env->DeleteLocalRef(clazz); + + g_mid_OcRepresentation_N_ctor_bool = env->GetMethodID(g_cls_OcRepresentation, "", "(JZ)V"); + if (!g_mid_OcRepresentation_N_ctor_bool) return JNI_ERR; + + return JNI_CURRENT_VERSION; +} + +//JNI OnUnload +JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved) +{ + ES_LOGI("JNI_OnUnload"); + JNIEnv *env; + + if (g_jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK) + { + ES_LOGE("Failed to get the environment using GetEnv()"); + return; + } + env->DeleteGlobalRef(g_cls_RemoteEnrollee); + env->DeleteGlobalRef(g_cls_ESException); +} diff --git a/service/easy-setup/mediator/richsdk/android/jni/JniJvm.h b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniJvm.h old mode 100644 new mode 100755 similarity index 66% rename from service/easy-setup/mediator/richsdk/android/jni/JniJvm.h rename to service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniJvm.h index 8f69842..ce8111b --- a/service/easy-setup/mediator/richsdk/android/jni/JniJvm.h +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniJvm.h @@ -29,23 +29,41 @@ #define __JNI_ES_JVM_H #include -#include +#include #include #define ESTAG "ES-JNI" #define JNI_CURRENT_VERSION JNI_VERSION_1_6 -#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, ESTAG, __VA_ARGS__) -#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, ESTAG, __VA_ARGS__) -#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, ESTAG, __VA_ARGS__) +#define ES_LOGI(...) __android_log_print(ANDROID_LOG_INFO, ESTAG, __VA_ARGS__) +#define ES_LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, ESTAG, __VA_ARGS__) +#define ES_LOGE(...) __android_log_print(ANDROID_LOG_ERROR, ESTAG, __VA_ARGS__) extern JavaVM *g_jvm; extern jclass g_cls_RemoteEnrollee; extern jclass g_cls_ESException; - -extern jmethodID g_mid_RemoteEnrollee_ctor ; +extern jclass g_cls_EnrolleeStatus; +extern jclass g_cls_EnrolleeConf; +extern jclass g_cls_getEnrolleeStatus; +extern jclass g_cls_getConfigurationStatus; +extern jclass g_cls_SecurityProvisioningStatus; +extern jclass g_cls_DevicePropProvisioningStatus; +extern jclass g_cls_CloudPropProvisioningStatus; +extern jclass g_cls_Integer; +extern jclass g_cls_OcRepresentation; + +extern jmethodID g_mid_RemoteEnrollee_ctor; extern jmethodID g_mid_ESException_ctor; +extern jmethodID g_mid_EnrolleeStatus_ctor; +extern jmethodID g_mid_EnrolleeConf_ctor; +extern jmethodID g_mid_getEnrolleeStatus_ctor; +extern jmethodID g_mid_getConfigurationStatus_ctor; +extern jmethodID g_mid_SecurityProvisioningStatus_ctor; +extern jmethodID g_mid_DevicePropProvisioningStatus_ctor; +extern jmethodID g_mid_CloudPropProvisioningStatus_ctor; +extern jmethodID g_mid_Integer_ctor; +extern jmethodID g_mid_OcRepresentation_N_ctor_bool; typedef void(*RemoveListenerCallback)(JNIEnv *env, jobject jListener); @@ -94,7 +112,7 @@ static JNIEnv *GetESJNIEnv(jint &ret) case JNI_EDETACHED: if (g_jvm->AttachCurrentThread(&env, NULL) < 0) { - LOGE("Failed to get the environment"); + ES_LOGE("Failed to get the environment"); return nullptr; } else @@ -103,9 +121,9 @@ static JNIEnv *GetESJNIEnv(jint &ret) } case JNI_EVERSION: - LOGE("JNI version not supported"); + ES_LOGE("JNI version not supported"); default: - LOGE("Failed to get the environment"); + ES_LOGE("Failed to get the environment"); return nullptr; } } diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniRemoteEnrollee.cpp b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniRemoteEnrollee.cpp new file mode 100755 index 0000000..458bb4d --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniRemoteEnrollee.cpp @@ -0,0 +1,253 @@ +/****************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************/ + +#include "JniRemoteEnrollee.h" + +#include "JniOcRepresentation.h" + +using namespace OIC::Service; + +JniRemoteEnrollee::JniRemoteEnrollee(std::shared_ptr remoteEnrollee) + : m_sharedResource(remoteEnrollee) {} + +JniRemoteEnrollee::~JniRemoteEnrollee() +{ + ES_LOGD("JniRemoteEnrollee::~JniRemoteEnrollee()"); + m_sharedResource = NULL; + + jint envRet; + JNIEnv *env = GetESJNIEnv(envRet); + if (NULL == env) return; + + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); +} + +JniRemoteEnrollee *JniRemoteEnrollee::getJniRemoteEnrollee(JNIEnv *env, jobject thiz) +{ + JniRemoteEnrollee *remoteEnrollee = ESGetHandle(env, thiz); + if (env->ExceptionCheck()) + { + ES_LOGE("getJniRemoteEnrollee :: Failed to get native handle from RemoteEnrollee object"); + } + if (!remoteEnrollee) + { + ES_LOGE("getJniRemoteEnrollee :: no resource"); + } + return remoteEnrollee; +} + +void JniRemoteEnrollee::getStatus(JNIEnv *env, jobject jListener) +{ + JniGetEnrolleeStatusListener *onGetEnrolleeStatusReceived = + addStatusListener(env, jListener); + + GetStatusCb getEnrolleeStatusCallback = [onGetEnrolleeStatusReceived] + (std::shared_ptr getEnrolleeStatus) + { + onGetEnrolleeStatusReceived->getEnrolleeStatusCallback(getEnrolleeStatus); + }; + + try + { + m_sharedResource->getStatus(getEnrolleeStatusCallback); + } + catch (ESBadRequestException exception) + { + ES_LOGE("JNI getStatus :: Exception occured"); + //throw the exception to java + throwESException( env, exception.what()); + } +} + +void JniRemoteEnrollee::getConfiguration(JNIEnv *env, jobject jListener) +{ + JniGetConfigurationStatusListener *onGetConfigurationStatusReceived = + addStatusListener(env, jListener); + + GetConfigurationStatusCb getConfigurationStatusCallback = [onGetConfigurationStatusReceived] + (std::shared_ptr getConfigurationStatus) + { + onGetConfigurationStatusReceived->getConfigurationStatusCallback(getConfigurationStatus); + }; + + try + { + m_sharedResource->getConfiguration(getConfigurationStatusCallback); + } + catch (ESBadRequestException exception) + { + ES_LOGE("JNI getConfiguration :: Exception occured"); + //throw the exception to java + throwESException( env, exception.what()); + } +} + +void JniRemoteEnrollee::provisionSecurity(JNIEnv *env, jobject jListener) +{ + JniSecurityStatusListener *onSecurityProvStatusReceived = + addStatusListener(env, jListener); + + SecurityProvStatusCb secProvStatusCallback = [onSecurityProvStatusReceived] + (std::shared_ptr SecProvisioningStatus) + { + onSecurityProvStatusReceived->secProvisionStatusCallback(SecProvisioningStatus); + }; + + try + { + m_sharedResource->provisionSecurity(secProvStatusCallback); + } + catch (ESBadRequestException exception) + { + ES_LOGE("JNI provisionSecurity :: Exception occured"); + //throw the exception to java + throwESException( env, exception.what()); + } +} + +void JniRemoteEnrollee::provisionDeviceProperties(JNIEnv *env, + jobject jRepresentation, + jobject jListener) +{ + OCRepresentation *representation = JniOcRepresentation::getOCRepresentationPtr(env, jRepresentation); + if (!representation) + { + return; + } + + DeviceProp deviceProp(*representation); + JniDevicePropProvisioningStatusListener *onDevicePropProvStatusReceived = + addStatusListener(env, jListener); + + DevicePropProvStatusCb devicePropProvStatusCallback = [onDevicePropProvStatusReceived] + (std::shared_ptr devicePropProvisioningStatus) + { + onDevicePropProvStatusReceived->onDevicePropProvisioningStatusCallback(devicePropProvisioningStatus); + }; + + try + { + m_sharedResource->provisionDeviceProperties(deviceProp, devicePropProvStatusCallback); + } + catch (ESBadRequestException exception) + { + ES_LOGE("JNI provisionDeviceProperties :: Exception occured"); + //throw the exception to java + throwESException( env, exception.what()); + } +} + +void JniRemoteEnrollee::provisionCloudProperties(JNIEnv *env, + jobject jRepresentation, + jstring jCloudID, + jobject jListener) +{ + OCRepresentation *representation = JniOcRepresentation::getOCRepresentationPtr(env, jRepresentation); + if (!representation) + { + return; + } + + CloudProp cloudProp(*representation); + cloudProp.setCloudID(env->GetStringUTFChars(jCloudID, NULL)); + + JniCloudPropProvisioningStatusListener *onCloudPropProvisioningStatusReceived = + addStatusListener(env, jListener); + + CloudPropProvStatusCb cloudPropProvStatusCallback = [onCloudPropProvisioningStatusReceived] + (std::shared_ptr< OIC::Service::CloudPropProvisioningStatus > cloudPropProvisioningStatus) + + { + onCloudPropProvisioningStatusReceived->onCloudPropProvisioningStatus(cloudPropProvisioningStatus); + }; + + try + { + m_sharedResource->provisionCloudProperties(cloudProp, cloudPropProvStatusCallback); + } + catch (ESBadRequestException exception) + { + ES_LOGE("JNI startProvisioning :: Exception occured"); + //throw the exception to java + throwESException(env, exception.what()); + } +} + +//JNI +JNIEXPORT void JNICALL +Java_org_iotivity_service_easysetup_mediator_RemoteEnrollee_nativeGetStatus +(JNIEnv *env, jobject jClass, jobject jListener) +{ + ES_LOGD("nativeGetStatus Enter"); + + JniRemoteEnrollee *remoteEnrollee = JniRemoteEnrollee::getJniRemoteEnrollee(env, jClass); + remoteEnrollee->getStatus(env, jListener); + + ES_LOGD("nativeGetStatus Exit"); +} + +//JNI +JNIEXPORT void JNICALL +Java_org_iotivity_service_easysetup_mediator_RemoteEnrollee_nativeGetConfiguration +(JNIEnv *env, jobject jClass, jobject jListener) +{ + ES_LOGD("nativegetConfiguration Enter"); + + JniRemoteEnrollee *remoteEnrollee = JniRemoteEnrollee::getJniRemoteEnrollee(env, jClass); + remoteEnrollee->getConfiguration(env, jListener); + + ES_LOGD("nativegetConfiguration Exit"); +} + +JNIEXPORT void JNICALL +Java_org_iotivity_service_easysetup_mediator_RemoteEnrollee_nativeProvisionSecurity +(JNIEnv *env, jobject jClass, jobject jListener) +{ + ES_LOGD("nativeStartSecurityProvision Enter"); + + JniRemoteEnrollee *remoteEnrollee = JniRemoteEnrollee::getJniRemoteEnrollee(env, jClass); + remoteEnrollee->provisionSecurity(env, jListener); + + ES_LOGD("nativeStartSecurityProvision Exit"); +} + +JNIEXPORT void JNICALL +Java_org_iotivity_service_easysetup_mediator_RemoteEnrollee_nativeProvisionDeviceProperties +(JNIEnv *env, jobject jClass, jobject jRepresentation, jobject jListener) +{ + ES_LOGD("nativeProvisionDeviceProperties Enter"); + + JniRemoteEnrollee *remoteEnrollee = JniRemoteEnrollee::getJniRemoteEnrollee(env, jClass); + remoteEnrollee->provisionDeviceProperties(env, jRepresentation, jListener); + + ES_LOGD("nativeProvisionDeviceProperties Exit"); +} + +JNIEXPORT void JNICALL +Java_org_iotivity_service_easysetup_mediator_RemoteEnrollee_nativeProvisionCloudProperties +(JNIEnv *env, jobject jClass, jobject jRepresentation, jstring jCloudID, jobject jListener) +{ + ES_LOGD("nativeprovisionCloudProperties Enter"); + + JniRemoteEnrollee *remoteEnrollee = JniRemoteEnrollee::getJniRemoteEnrollee(env, jClass); + remoteEnrollee->provisionCloudProperties(env, jRepresentation, jCloudID, jListener); + + ES_LOGD("nativeprovisionCloudProperties Exit"); +} diff --git a/service/easy-setup/mediator/richsdk/android/jni/JniRemoteEnrollee.h b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniRemoteEnrollee.h old mode 100644 new mode 100755 similarity index 54% rename from service/easy-setup/mediator/richsdk/android/jni/JniRemoteEnrollee.h rename to service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniRemoteEnrollee.h index de1f297..483d2f6 --- a/service/easy-setup/mediator/richsdk/android/jni/JniRemoteEnrollee.h +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniRemoteEnrollee.h @@ -27,13 +27,17 @@ #ifndef __JNI_ES_REMOTEENROLLEE_H #define __JNI_ES_REMOTEENROLLEE_H -#include "RemoteEnrollee.h" #include "ESRichCommon.h" #include "ESException.h" +#include "RemoteEnrollee.h" #include "JniJvm.h" #include "JniEsUtils.h" -#include "JniProvisioningStatusListener.h" +#include "JniGetEnrolleeStatusListener.h" +#include "JniGetConfigurationStatusListener.h" +#include "JniSecurityStatusListener.h" +#include "JniDevicePropProvisioningStatusListener.h" +#include "JniCloudPropProvisioningStatusListener.h" #include "JniEsListenerManager.h" using namespace OIC::Service; @@ -59,49 +63,69 @@ class JniRemoteEnrollee ~JniRemoteEnrollee(); // ***** JNI APIs internally call the APIs of this class ***** // + void getStatus(JNIEnv *env, jobject jListener); + void getConfiguration(JNIEnv *env, jobject jListener); + void provisionSecurity(JNIEnv *env, jobject jListener); + void provisionDeviceProperties(JNIEnv *env, jobject jRepresentation, jobject jListener); + void provisionCloudProperties(JNIEnv *env, jobject jRepresentation, jstring jCloudID, jobject jListener); - void startProvisioning(JNIEnv *env); - void stopProvisioning(JNIEnv *env); - void registerProvisioningHandler(JNIEnv *env, jobject jListener); + static JniRemoteEnrollee *getJniRemoteEnrollee(JNIEnv *env, jobject thiz); - JniProvisioningStatusListener *addProvisioningStatusListener(JNIEnv *env, jobject jListener); - void removeProvisioningStatusListener(JNIEnv *env, jobject jListener); + template + T *addStatusListener(JNIEnv *env, jobject jListener) + { + return JniEsListenerManager().addListener(env, jListener, this); + }; - static JniRemoteEnrollee *getJniRemoteEnrollee(JNIEnv *env, jobject thiz); + template + void removeStatusListener(JNIEnv *env, jobject jListener) + { + JniEsListenerManager().removeListener(env, jListener); + }; private: - JniEsListenerManager m_provisioingStatus; std::shared_ptr m_sharedResource; }; - #ifdef __cplusplus extern "C" { #endif /** - * API for starting the provisioning process. + * API for starting the Request Enrollee status process. */ JNIEXPORT void JNICALL -Java_org_iotivity_service_easysetup_mediator_RemoteEnrollee_nativeStartProvision -(JNIEnv *env, jobject jClass); +Java_org_iotivity_service_easysetup_mediator_RemoteEnrollee_nativeGetStatus +(JNIEnv *env, jobject jClass, jobject jListener); /** - * API for stopping the provisioning process. + * API for starting the Request EnrolleeConf process. */ JNIEXPORT void JNICALL -Java_org_iotivity_service_easysetup_mediator_RemoteEnrollee_nativeStopProvision -(JNIEnv *env, jobject jClass); +Java_org_iotivity_service_easysetup_mediator_RemoteEnrollee_nativeGetConfiguration +(JNIEnv *env, jobject jClass, jobject jListener); /** - * API for setting the lisener for recieiving provisioning status. - * - * @param provisiongListener - Provisioning listener [callback from native layer will be passing to this listener] + * API for starting the Sequrity provisioning process. + */ +JNIEXPORT void JNICALL +Java_org_iotivity_service_easysetup_mediator_RemoteEnrollee_nativeProvisionSecurity +(JNIEnv *env, jobject jClass, jobject jListener); + +/** + * API for starting the Data provisioning process. + */ +JNIEXPORT void JNICALL +Java_org_iotivity_service_easysetup_mediator_RemoteEnrollee_nativeProvisionDeviceProperties +(JNIEnv *env, jobject jClass, jobject jRepresentation, jobject jListener); + +/** + * API for starting the cloud provisioning process. */ JNIEXPORT void JNICALL -Java_org_iotivity_service_easysetup_mediator_RemoteEnrollee_nativeRegisterProvisioningHandler -(JNIEnv *env, jobject jClass, jobject provisiongListener); +Java_org_iotivity_service_easysetup_mediator_RemoteEnrollee_nativeProvisionCloudProperties +(JNIEnv *env, jobject jClass, jobject jRepresentation, jstring jCloudID, jobject jListener); #ifdef __cplusplus } diff --git a/service/easy-setup/mediator/richsdk/android/jni/JniProvisioningStatusLisener.cpp b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniSecurityStatusListener.cpp old mode 100644 new mode 100755 similarity index 53% rename from service/easy-setup/mediator/richsdk/android/jni/JniProvisioningStatusLisener.cpp rename to service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniSecurityStatusListener.cpp index 94b15d2..bfa31a4 --- a/service/easy-setup/mediator/richsdk/android/jni/JniProvisioningStatusLisener.cpp +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniSecurityStatusListener.cpp @@ -18,21 +18,23 @@ * ******************************************************************/ -#include "JniProvisioningStatusListener.h" +#include "JniSecurityStatusListener.h" #include "JniRemoteEnrollee.h" +#include "oic_malloc.h" +#include "oic_string.h" using namespace OIC::Service; -JniProvisioningStatusListener::JniProvisioningStatusListener(JNIEnv *env, jobject jListener, +JniSecurityStatusListener::JniSecurityStatusListener(JNIEnv *env, jobject jListener, JniRemoteEnrollee *owner) : m_ownerResource(owner) { m_jwListener = env->NewWeakGlobalRef(jListener); } -JniProvisioningStatusListener::~JniProvisioningStatusListener() +JniSecurityStatusListener::~JniSecurityStatusListener() { - LOGI("~JniProvisioningStatusListener()"); + ES_LOGI("~JniSecurityStatusListener()"); if (m_jwListener) { jint ret; @@ -42,12 +44,11 @@ JniProvisioningStatusListener::~JniProvisioningStatusListener() if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); } } - -void JniProvisioningStatusListener::provisionStatusCallback (std::shared_ptr - easySetupStatus) +void JniSecurityStatusListener::secProvisionStatusCallback( + std::shared_ptr secProvisioningStatus) { - LOGI("JniProvisioningStatusListener::provisioiningStatusCallback enter"); + ES_LOGI("JniSecurityStatusListener::secProvisionStatusCallback enter"); jint ret; JNIEnv *env = GetESJNIEnv(ret); @@ -68,8 +69,11 @@ void JniProvisioningStatusListener::provisionStatusCallback (std::shared_ptrGetMethodID(clsL, "onStatusRecieved", - "(I)V"); + jmethodID midL = env->GetMethodID(clsL, "onProgress", + "(Lorg/iotivity/service/easysetup/mediator/" + "SecurityProvisioningStatus;" + ")V"); + if (!midL) { checkExAndRemoveListener(env); @@ -77,12 +81,29 @@ void JniProvisioningStatusListener::provisionStatusCallback (std::shared_ptrgetEasySetupState(); - int provisionState = convertNativeProvisionStateToInt(nativeProvisioningState); - env->CallVoidMethod(jListener, midL, provisionState); + ESResult esResult = secProvisioningStatus->getESResult(); + + //create the java object + jobject jSecurityProvisioningStatus = NULL; + jSecurityProvisioningStatus = env->NewObject(g_cls_SecurityProvisioningStatus, + g_mid_SecurityProvisioningStatus_ctor, + (jint)esResult, + env->NewStringUTF(secProvisioningStatus->getDeviceUUID().c_str())); + + ES_LOGE("JniSecurityStatusListener::onSecurityProvisioningStatus UUID : %s", + secProvisioningStatus->getDeviceUUID().c_str()); + + if (!jSecurityProvisioningStatus) + { + ES_LOGE("JniSecurityStatusListener::onSecurityProvisioningStatus Unable to create the java object"); + return ; + } + + env->CallVoidMethod(jListener, midL, jSecurityProvisioningStatus); + if (env->ExceptionCheck()) { - LOGE("Java exception is thrown"); + ES_LOGE("Java exception is thrown"); checkExAndRemoveListener(env); if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread(); return; @@ -91,17 +112,17 @@ void JniProvisioningStatusListener::provisionStatusCallback (std::shared_ptrDetachCurrentThread(); } -void JniProvisioningStatusListener::checkExAndRemoveListener(JNIEnv *env) +void JniSecurityStatusListener::checkExAndRemoveListener(JNIEnv *env) { if (env->ExceptionCheck()) { jthrowable ex = env->ExceptionOccurred(); env->ExceptionClear(); - m_ownerResource->removeProvisioningStatusListener(env, m_jwListener); + m_ownerResource->removeStatusListener(env, m_jwListener); env->Throw((jthrowable)ex); } else { - m_ownerResource->removeProvisioningStatusListener(env, m_jwListener); + m_ownerResource->removeStatusListener(env, m_jwListener); } } diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniSecurityStatusListener.h b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniSecurityStatusListener.h new file mode 100644 index 0000000..96cd896 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/main/jni/JniSecurityStatusListener.h @@ -0,0 +1,59 @@ +/****************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************/ + +#ifndef __JNI_ES_SECURITY_PROVISIONING_STATUS_LISTENER_H_ +#define __JNI_ES_SECURITY_PROVISIONING_STATUS_LISTENER_H_ + +#include + +#include "RemoteEnrollee.h" +#include "ESRichCommon.h" + +#include "JniJvm.h" + +class JniRemoteEnrollee; + +using namespace OIC::Service; + +class JniSecurityStatusListener +{ + public: + /** + * @brief constructor + */ + JniSecurityStatusListener(JNIEnv *env, jobject jListener, JniRemoteEnrollee *resource); + + /** + * @brief destructor + */ + ~JniSecurityStatusListener(); + + /** + * @brief callback function that will be passed to Native layer + */ + void secProvisionStatusCallback (std::shared_ptr secProvisioningStatus); + + private: + jweak m_jwListener; + JniRemoteEnrollee *m_ownerResource; + void checkExAndRemoveListener(JNIEnv *env); +}; + +#endif //__JNI_ES_SECURITY_PROVISIONING_STATUS_LISTENER_H_ diff --git a/service/easy-setup/mediator/richsdk/android/SConscript b/service/easy-setup/mediator/richsdk/android/SConscript new file mode 100755 index 0000000..7078def --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/SConscript @@ -0,0 +1,79 @@ +#//****************************************************************** +#// +#// Copyright 2016 Samsung Electronics All Rights Reserved. +#// +#//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +#// +#// Licensed under the Apache License, Version 2.0 (the "License"); +#// you may not use this file except in compliance with the License. +#// You may obtain a copy of the License at +#// +#// http://www.apache.org/licenses/LICENSE-2.0 +#// +#// Unless required by applicable law or agreed to in writing, software +#// distributed under the License is distributed on an "AS IS" BASIS, +#// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +#// See the License for the specific language governing permissions and +#// limitations under the License. +#// +#//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +import os +import platform +Import('env') + +android_home = env.get('ANDROID_HOME') + +ANDROID_TARGET_ARCH = env.get('TARGET_ARCH') +if env.get('RELEASE'): + ANDROID_RELEASE="release" +else: + ANDROID_RELEASE="debug" + +os.environ['ANDROID_HOME'] = env.get('ANDROID_HOME') +os.environ['ANDROID_NDK_HOME'] = env.get('ANDROID_NDK') + +if not os.path.exists(android_home + '/platforms/android-21') or not os.path.exists(android_home + '/build-tools/20.0.0'): + print ''' +***************************************** Info ******************************** +* Either 'Android API 21' is not installed or 'Android SDK Build Tools * +* 20.0.0' is not installed. The Android SDK Manager will now open. Please * +* be sure to deselect all options, then select the following 2 packages: * +* 1. Under "Tools" select "Android SDK Build-tools" Revision 20. * +* 2. Under "Android 5.0.1 (API 21)" select "SDK Platform" * +* 3. Continue by selecting "Install 2 Packages" * +* * +* NOTE: If you have an http proxy, please press ctrl+c now and edit/create * +* the following file in your $HOME directory as follows: * +* * +* Edit/Create file: "$HOME/.android/androidtool.cfg" * +* * +* http.proxyPort= * +* sdkman.monitor.density=108 * +* http.proxyHost= * +* sdkman.show.update.only=true * +* sdkman.ask.adb.restart=false * +* sdkman.force.http=true * +* sdkman.show.updateonly=true * +* * +******************************************************************************* + +...Opening Android SDK Manager now. Once you are finished, the build will continue. +''' + os.system(android_home + '/tools/android') + +#SConscript("../../../../../../android/android_api/SConscript") + +def ensure_libs(target, source, env): + return target, [source, env.get('BUILD_DIR') + 'liboc.so', env.get('BUILD_DIR') + 'liboc_logger.so'] + +jdk_env = Environment(ENV=os.environ) +jdk_env['BUILDERS']['Gradle'] = Builder(action = env.get('ANDROID_GRADLE') + + ' build -bservice/easy-setup/mediator/richsdk/android/build.gradle -PTARGET_ARCH=%s -PRELEASE=%s --stacktrace' %(ANDROID_TARGET_ARCH, ANDROID_RELEASE), + emitter = ensure_libs) +jdk_env['BUILD_DIR'] = env.get('BUILD_DIR') +cmdBuildEasysetup=jdk_env.Gradle(target="EasySetupCore/objs", + source="EasySetupCore/src/main/java/org/iotivity/service/easysetup/mediator/EasySetup.java") + +Depends(cmdBuildEasysetup, env.get('baseAAR')) + diff --git a/service/easy-setup/mediator/richsdk/android/android_api.iml b/service/easy-setup/mediator/richsdk/android/android_api.iml new file mode 100644 index 0000000..0bb6048 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/android_api.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + diff --git a/service/easy-setup/mediator/richsdk/android/build.gradle b/service/easy-setup/mediator/richsdk/android/build.gradle new file mode 100755 index 0000000..31e5eed --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/build.gradle @@ -0,0 +1,43 @@ +/****************************************************************** + * + * Copyright 2016 Samsung Electronics All Rights Reserved. + * + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************/ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:1.3.0' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + jcenter { + url "http://jcenter.bintray.com/" + } + flatDir { + dirs "../../../../../../android/android_api/base/build/outputs/aar/" + } + } +} diff --git a/service/easy-setup/mediator/richsdk/android/gradle.properties b/service/easy-setup/mediator/richsdk/android/gradle.properties new file mode 100644 index 0000000..dff37f4 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/gradle.properties @@ -0,0 +1,40 @@ +# +# //****************************************************************** +# // +# // Copyright 2015 Intel Corporation. +# // +# //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. +# // +# //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +# + +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx10248m -XX:MaxPermSize=256m +# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true diff --git a/service/easy-setup/mediator/richsdk/android/gradlew b/service/easy-setup/mediator/richsdk/android/gradlew new file mode 100644 index 0000000..91a7e26 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/service/easy-setup/mediator/richsdk/android/gradlew.bat b/service/easy-setup/mediator/richsdk/android/gradlew.bat new file mode 100644 index 0000000..8a0b282 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/android/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/service/easy-setup/mediator/richsdk/android/jni/Android.mk b/service/easy-setup/mediator/richsdk/android/jni/Android.mk deleted file mode 100644 index fe63791..0000000 --- a/service/easy-setup/mediator/richsdk/android/jni/Android.mk +++ /dev/null @@ -1,60 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) -OIC_LIB_PATH := ../../../../../../out/android/$(TARGET_ARCH_ABI)/debug -LOCAL_MODULE := android-oc -LOCAL_SRC_FILES := $(OIC_LIB_PATH)/liboc.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -OIC_LIB_PATH := ../../../../../../out/android/$(TARGET_ARCH_ABI)/debug -LOCAL_MODULE := android-easysetup -LOCAL_SRC_FILES := $(OIC_LIB_PATH)/libESMediatorRich.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) - -LOCAL_MODULE := easysetup-jni - -#Add Pre processor definitions -DEFINE_FLAG = -DWITH_POSIX -D__ANDROID__ - -#Add Debug flags here -DEBUG_FLAG = -DTB_LOG - -BUILD_FLAG = $(DEFINE_FLAG) $(DEBUG_FLAG) - -LOCAL_CPPFLAGS = $(BUILD_FLAG) -LOCAL_CPPFLAGS += -std=c++0x -frtti -fexceptions - -$(info CPPFLAGSUPDATED=$(LOCAL_CPPFLAGS)) - -LOCAL_C_INCLUDES := $(LOCAL_PATH) \ - $(LOCAL_PATH)/../../inc \ - $(LOCAL_PATH)/../../src \ - $(LOCAL_PATH)/../../../../inc \ - $(LOCAL_PATH)/../../../../../../resource/csdk/logger/include \ - $(LOCAL_PATH)/../../../../../../resource/csdk/connectivity/common/inc \ - $(LOCAL_PATH)/../../../../../../resource/c_common/oic_string/include \ - $(LOCAL_PATH)/../../../../../../resource/include \ - $(LOCAL_PATH)/../../../../../../resource/c_common \ - $(LOCAL_PATH)/../../../../../../resource/oc_logger/include \ - $(LOCAL_PATH)/../../../../../../resource/c_common/oic_malloc/include \ - $(LOCAL_PATH)/../../../../../../resource/csdk/connectivity/api \ - $(LOCAL_PATH)/../../../../../../resource/csdk/stack/include \ - $(LOCAL_PATH)/../../../../../../resource/csdk/logger/include \ - $(LOCAL_PATH)/../../../../../../resource/csdk/security/include \ - $(LOCAL_PATH)/../../../../../../extlibs/cjson \ - $(LOCAL_PATH)/../../../../../../extlibs/boost/boost_1_58_0 \ - $(LOCAL_PATH)/../../../../../../extlibs/timer \ - $(LOCAL_PATH)/../../../../../../android/android_api/base/jni \ - -LOCAL_SRC_FILES += $(patsubst $(LOCAL_PATH)/%, %, $(wildcard $(LOCAL_PATH)/*.cpp)) -LOCAL_SRC_FILES += $(patsubst $(LOCAL_PATH)/%, %, $(wildcard $(LOCAL_PATH)/*.h)) - -LOCAL_LDLIBS := -llog -#LOCAL_SHARED_LIBRARIES += android-connectivity_abstraction -LOCAL_SHARED_LIBRARIES += android-oc -LOCAL_SHARED_LIBRARIES += android-easysetup - -include $(BUILD_SHARED_LIBRARY) diff --git a/service/easy-setup/mediator/richsdk/android/jni/Application.mk b/service/easy-setup/mediator/richsdk/android/jni/Application.mk deleted file mode 100644 index d5fc03c..0000000 --- a/service/easy-setup/mediator/richsdk/android/jni/Application.mk +++ /dev/null @@ -1,4 +0,0 @@ -APP_STL := gnustl_shared -APP_PLATFORM = android-21 -NDK_TOOLCHAIN_VERSION := 4.8 - diff --git a/service/easy-setup/mediator/richsdk/android/jni/JniEsUtils.cpp b/service/easy-setup/mediator/richsdk/android/jni/JniEsUtils.cpp deleted file mode 100644 index 991ad31..0000000 --- a/service/easy-setup/mediator/richsdk/android/jni/JniEsUtils.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/****************************************************************** - * - * Copyright 2016 Samsung Electronics All Rights Reserved. - * - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************/ - -#include "JniEsUtils.h" - -void throwESException(JNIEnv *env, std::string reason) -{ - jobject ex = env->NewObject(g_cls_ESException, g_mid_ESException_ctor, - env->NewStringUTF(reason.c_str())); - if (!ex) - { - LOGI("throwException : jobject is NULL"); - } - env->Throw((jthrowable)ex); -} - -OCConnectivityType getOCConnectivityTypeFromInt(int connectivityType) -{ - switch (connectivityType) - { - case CT_DEFAULT: - return CT_DEFAULT; - case CT_ADAPTER_IP: - return CT_ADAPTER_IP; - - //May be need to add more types, if easy setup service support more transport. - } - return CT_DEFAULT; -} - -int convertNativeProvisionStateToInt(EasySetupState nativeState) -{ - switch (nativeState) - { - case EasySetupState::DEVICE_PROVISIONED: - return 0; - case EasySetupState::DEVICE_NOT_PROVISIONED: - return 1; - case EasySetupState::DEVICE_OWNED: - return 2; - case EasySetupState::DEVICE_NOT_OWNED: - return 3; - } - return -1; -} \ No newline at end of file diff --git a/service/easy-setup/mediator/richsdk/android/jni/JniJvm.cpp b/service/easy-setup/mediator/richsdk/android/jni/JniJvm.cpp deleted file mode 100644 index 2e02060..0000000 --- a/service/easy-setup/mediator/richsdk/android/jni/JniJvm.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/****************************************************************** - * - * Copyright 2016 Samsung Electronics All Rights Reserved. - * - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************/ -#include "JniJvm.h" - -JavaVM *g_jvm = NULL; - -jclass g_cls_RemoteEnrollee = NULL; -jclass g_cls_ESException = NULL; - -jmethodID g_mid_RemoteEnrollee_ctor = NULL; -jmethodID g_mid_ESException_ctor = NULL; - -// JNI OnLoad -JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) -{ - LOGI("JNI_OnLoad"); - JNIEnv *env; - g_jvm = vm; - - if (g_jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK) - { - LOGE("Failed to get the environment using GetEnv()"); - return JNI_ERR; - } - - jclass clazz = nullptr; - - //Remote Enrollee - clazz = env->FindClass("org/iotivity/service/easysetup/mediator/RemoteEnrollee"); - if (!clazz) return JNI_ERR; - g_cls_RemoteEnrollee = (jclass)env->NewGlobalRef(clazz); - env->DeleteLocalRef(clazz); - - g_mid_RemoteEnrollee_ctor = env->GetMethodID(g_cls_RemoteEnrollee, "", - "(J)V"); - if (!g_mid_RemoteEnrollee_ctor) return JNI_ERR; - - //ESException - clazz = env->FindClass("org/iotivity/service/easysetup/mediator/ESException"); - if (!clazz) return JNI_ERR; - g_cls_ESException = (jclass)env->NewGlobalRef(clazz); - env->DeleteLocalRef(clazz); - - g_mid_ESException_ctor = env->GetMethodID(g_cls_ESException, "", "(Ljava/lang/String;)V"); - if (!g_mid_ESException_ctor) return JNI_ERR; - - return JNI_CURRENT_VERSION; -} - -//JNI OnUnload -JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved) -{ - LOGI("JNI_OnUnload"); - JNIEnv *env; - - if (g_jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK) - { - LOGE("Failed to get the environment using GetEnv()"); - return; - } - env->DeleteGlobalRef(g_cls_RemoteEnrollee); - env->DeleteGlobalRef(g_cls_ESException); -} diff --git a/service/easy-setup/mediator/richsdk/android/jni/JniRemoteEnrollee.cpp b/service/easy-setup/mediator/richsdk/android/jni/JniRemoteEnrollee.cpp deleted file mode 100644 index 353d642..0000000 --- a/service/easy-setup/mediator/richsdk/android/jni/JniRemoteEnrollee.cpp +++ /dev/null @@ -1,159 +0,0 @@ -/****************************************************************** - * - * Copyright 2016 Samsung Electronics All Rights Reserved. - * - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************/ - -#include "JniRemoteEnrollee.h" - -using namespace OIC::Service; - -JniRemoteEnrollee::JniRemoteEnrollee(std::shared_ptr remoteEnrollee) - : m_sharedResource(remoteEnrollee) {} - -JniRemoteEnrollee::~JniRemoteEnrollee() -{ - LOGD("JniRemoteEnrollee::~JniRemoteEnrollee()"); - m_sharedResource = NULL; - - jint envRet; - JNIEnv *env = GetESJNIEnv(envRet); - if (NULL == env) return; - - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - -} - -JniRemoteEnrollee *JniRemoteEnrollee::getJniRemoteEnrollee(JNIEnv *env, jobject thiz) -{ - JniRemoteEnrollee *remoteEnrollee = ESGetHandle(env, thiz); - if (env->ExceptionCheck()) - { - LOGE("getJniRemoteEnrollee :: Failed to get native handle from RemoteEnrollee object"); - } - if (!remoteEnrollee) - { - LOGE("getJniRemoteEnrollee :: no resource"); - } - return remoteEnrollee; -} - -void JniRemoteEnrollee::startProvisioning(JNIEnv *env) -{ - try - { - m_sharedResource->startProvisioning(); - } - catch (ESBadRequestException exception) - { - LOGE("JNI startProvisioning :: Exception occured"); - //throw the exception to java - throwESException( env, exception.what()); - } -} -void JniRemoteEnrollee::stopProvisioning(JNIEnv *env) -{ - try - { - m_sharedResource->stopProvisioning(); - } - catch (ESBadRequestException exception) - { - LOGE("JNI stopProvisioning :: Exception occured"); - //throw the exception to java - throwESException( env, exception.what()); - } -} - -void JniRemoteEnrollee::registerProvisioningHandler(JNIEnv *env, jobject jListener) -{ - JniProvisioningStatusListener *onProvisioningStatusReceived = addProvisioningStatusListener(env, - jListener); - - RemoteEnrollee::EasySetupStatusCB provisionStatusCallback = [onProvisioningStatusReceived] - (std::shared_ptr< OIC::Service::EasySetupStatus > easySetupStatus) - - { - onProvisioningStatusReceived->provisionStatusCallback(easySetupStatus); - }; - - try - { - m_sharedResource->registerEasySetupStatusHandler(provisionStatusCallback); - } - catch (ESException exception) - { - LOGE("JNI stopProvisioning :: Exception occured"); - //throw the exception to java - throwESException( env, exception.what()); - } - -} - -JniProvisioningStatusListener *JniRemoteEnrollee::addProvisioningStatusListener(JNIEnv *env, - jobject jListener) -{ - return this->m_provisioingStatus.addListener(env, jListener, this); -} - -void JniRemoteEnrollee::removeProvisioningStatusListener(JNIEnv *env, jobject jListener) -{ - this->m_provisioingStatus.removeListener(env, jListener); -} - -JNIEXPORT void JNICALL -Java_org_iotivity_service_easysetup_mediator_RemoteEnrollee_nativeStartProvision -(JNIEnv *env, jobject jClass) -{ - LOGD("nativeStartProvision Enter"); - - JniRemoteEnrollee *remoteEnrollee = JniRemoteEnrollee::getJniRemoteEnrollee(env, jClass); - remoteEnrollee->startProvisioning(env); - - LOGD("nativeStartProvision Exit"); -} - -JNIEXPORT void JNICALL -Java_org_iotivity_service_easysetup_mediator_RemoteEnrollee_nativeStopProvision -(JNIEnv *env, jobject jClass) -{ - - LOGD("nativeStopProvision Enter"); - - JniRemoteEnrollee *remoteEnrollee = JniRemoteEnrollee::getJniRemoteEnrollee(env, jClass); - remoteEnrollee->stopProvisioning(env); - - LOGD("nativeStopProvision Exit"); -} - -JNIEXPORT void JNICALL -Java_org_iotivity_service_easysetup_mediator_RemoteEnrollee_nativeRegisterProvisioningHandler -(JNIEnv *env, jobject jClass, jobject provisiongListener) -{ - LOGD("nativeRegisterProvisioningHandler Enter"); - - if (!provisiongListener) - { - LOGE("nativeRegisterProvisioningHandler : listener is NULL"); - return; - } - JniRemoteEnrollee *remoteEnrollee = JniRemoteEnrollee::getJniRemoteEnrollee(env, jClass); - remoteEnrollee->registerProvisioningHandler(env, provisiongListener); - - LOGD("nativeRegisterProvisioningHandler Exit"); -} - diff --git a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/androidTest/java/org/iotivity/service/easysetup/mediator/Utility.java b/service/easy-setup/mediator/richsdk/android/settings.gradle old mode 100644 new mode 100755 similarity index 60% rename from service/easy-setup/mediator/richsdk/android/EasySetupCore/src/androidTest/java/org/iotivity/service/easysetup/mediator/Utility.java rename to service/easy-setup/mediator/richsdk/android/settings.gradle index 6b0484e..51f5fca --- a/service/easy-setup/mediator/richsdk/android/EasySetupCore/src/androidTest/java/org/iotivity/service/easysetup/mediator/Utility.java +++ b/service/easy-setup/mediator/richsdk/android/settings.gradle @@ -1,6 +1,6 @@ //****************************************************************** // -// Copyright 2015 Samsung Electronics All Rights Reserved. +// Copyright 2016 Samsung Electronics All Rights Reserved. // //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // @@ -18,25 +18,4 @@ // //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -package org.iotivity.service.easysetup.mediator; - - -public class Utility { - - public static void toNotify(Object toLock) { - synchronized (toLock) { - toLock.notify(); - } - } - - public static void toWait(Object toLock) { - synchronized (toLock) { - try { - toLock.wait(45000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } -} +include ':EasySetupCore' diff --git a/service/easy-setup/mediator/richsdk/inc/CloudResource.h b/service/easy-setup/mediator/richsdk/inc/CloudResource.h new file mode 100755 index 0000000..d9dc4a5 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/inc/CloudResource.h @@ -0,0 +1,62 @@ +//****************************************************************** +// +// Copyright 2016 Samsung Electronics All Rights Reserved. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +#ifndef CLOUD_RESOURCE_H_ +#define CLOUD_RESOURCE_H_ + +#include +#include + +#include "ESRichCommon.h" + +#include "OCApi.h" + +using namespace OC; + +namespace OIC +{ + namespace Service + { + class OCResource; + /** + * This class contains the resource discovery methods. + * + * @see CloudResource + */ + class CloudResource + { + public: + CloudResource(std::shared_ptr< OC::OCResource > resource); + ~CloudResource() = default; + + void registerCloudPropProvisioningStatusCallback (CloudPropProvStatusCb callback); + void provisionEnrollee(const CloudProp& CloudProp); + + private: + void onCloudProvResponse(const HeaderOptions& headerOptions, const OCRepresentation& rep, + const int eCode); + + private: + std::shared_ptr< OC::OCResource > m_ocResource; + CloudPropProvStatusCb m_cloudPropProvStatusCb; + }; + } +} +#endif diff --git a/service/easy-setup/mediator/richsdk/inc/ESRichCommon.h b/service/easy-setup/mediator/richsdk/inc/ESRichCommon.h index e9e344b..0a3300a 100755 --- a/service/easy-setup/mediator/richsdk/inc/ESRichCommon.h +++ b/service/easy-setup/mediator/richsdk/inc/ESRichCommon.h @@ -25,315 +25,559 @@ #include #ifndef WITH_ARDUINO #include +#include #endif +#include "OCPlatform.h" #include "ocstack.h" #include "octypes.h" -using namespace std; +#include "escommon.h" -// Defines -#define OIC_STRING_MAX_VALUE 100 -#define IPV4_ADDR_SIZE 16 -#define IP_PORT 55555 -#define NET_WIFI_SSID_SIZE 100 -#define NET_WIFI_PWD_SIZE 100 - -/** - * @brief Mac address length for BT port - */ -#define NET_MACADDR_SIZE 18 - -/** - * Attributes used to form a proper easysetup conforming JSON message. - */ -#define OC_RSRVD_ES_PS "ps" -#define OC_RSRVD_ES_TNN "tnn" -#define OC_RSRVD_ES_CD "cd" -#define OC_RSRVD_ES_TR "tr" -#define OC_RSRVD_ES_TNT "tnt" -#define OC_RSRVD_ES_ANT "ant" - -/** - * Easysetup defined resoruce types and uris. - */ -#define OC_RSRVD_ES_PROV_RES_TYPE "oic.r.prov" -#define OC_RSRVD_ES_URI_PROV "/oic/prov" -#define OC_RSRVD_ES_URI_NET "/oic/net" - -/** - * @brief Defines for Provisioning status accepted values - */ -#define ES_PS_NEED_PROVISIONING 1 -#define ES_PS_PROVISIONING_COMPLETED 2 -#define ES_PS_TRIGGER_INIT_VALUE 0 -#define ES_PS_TRIGGER_CONNECTION 1 +using namespace OC; +using namespace std; #ifndef WITH_ARDUINO namespace OIC { namespace Service { - /** - * Device Roles defined for each device type used in easy setup - */ - typedef enum + * @brief Properties of provisioning resource. It includes a provisioning status and last + * error code. + */ + class EnrolleeStatus { - ENROLLEE, - MEDIATOR, - ENROLLER, - } DeviceRole; + public: - /** - * On-boarding connection to create Adhoc network. - */ - typedef enum - { - SOFTAP, - BLE, - } OBConnection; + /** + * Constructor + */ + EnrolleeStatus(const OCRepresentation& rep) + { + m_rep = rep; + } - typedef enum - { - ES_ERROR = -1, - ES_OK = 0, - ES_NETWORKFOUND = 1, - ES_NETWORKCONNECTED, - ES_NETWORKNOTCONNECTED, - ES_RESOURCECREATED = 11, - ES_RECVREQOFPROVRES = 21, - ES_RECVREQOFNETRES, - ES_RECVUPDATEOFPROVRES, - ES_RECVTRIGGEROFPROVRES, - } ESResult; + EnrolleeStatus(const EnrolleeStatus& enrolleeStatus) : + m_rep(enrolleeStatus.getRepresentation()) + { + } - typedef enum + EnrolleeStatus(const EnrolleeStatus&& enrolleeStatus) : + m_rep(std::move(enrolleeStatus.getRepresentation())) + { + } + + /** + * Get a provisioning status property of Enrollee. + * + * @return a provisioning status property of Enrollee + */ + ProvStatus getProvStatus() + { + if(m_rep.hasAttribute(OC_RSRVD_ES_PROVSTATUS)) + { + return static_cast( + m_rep.getValue(OC_RSRVD_ES_PROVSTATUS)); + } + return ES_STATE_INIT; + } + + /** + * Get a last error code property of Enrollee. + * + * @return a last error code property of Enrollee. + */ + ESErrorCode getLastErrCode() + { + if(m_rep.hasAttribute(OC_RSRVD_ES_LAST_ERRORCODE)) + { + return static_cast( + m_rep.getValue(OC_RSRVD_ES_LAST_ERRORCODE)); + } + return ES_ERRCODE_NO_ERROR; + } + + /** + * Get OCRepresentation object + * + * @return OCRepresentation object + */ + const OCRepresentation& getRepresentation() const + { + return m_rep; + } + protected: + OCRepresentation m_rep; + }; + + /** + * @brief Data class stored for Cloud server property provisioning + */ + class CloudProp { + public: + /** - * Default state of the device + * Constructor */ - ES_INIT_STATE, + CloudProp() + { + }; /** - * Device will move to this state once the on boarding begins + * Constructor with OCRepresentation object. This is used for JNI communication. */ - ES_ON_BOARDING_STATE, + CloudProp(const OCRepresentation &rep) + { + m_rep = rep; + m_cloudID = ""; + } /** - * Device will move to this state after successful on-boarding of the device + * Set CloudServer resource properties to be delivered to Enrollee + * + * @param authCode Auth code issued by OAuth2.0-compatible account server + * @param authProvider Auth provider ID + * @param ciServer Cloud interface server URL which an Enrollee is going to registered */ - ES_ON_BOARDED_STATE, + void setCloudProp(string authCode, string authProvider, string ciServer) + { + m_rep.setValue(OC_RSRVD_ES_AUTHCODE, authCode); + m_rep.setValue(OC_RSRVD_ES_AUTHPROVIDER, authProvider); + m_rep.setValue(OC_RSRVD_ES_CISERVER, ciServer); + } /** - * Device will move to this state once the on boarding is done + * Set CloudServer's UUID + * + * @param cloudID Cloud Interface server's UUID */ - ES_PROVISIONING_STATE, + void setCloudID(string cloudID) + { + m_cloudID = cloudID; + } /** - * Easy setup process is successful. + * Get an auth code to be delivered. + * + * @return an auth code to be delivered. */ - ES_PROVISIONED_STATE, + std::string getAuthCode() const + { + if(m_rep.hasAttribute(OC_RSRVD_ES_AUTHCODE)) + { + return m_rep.getValue(OC_RSRVD_ES_AUTHCODE); + } + return std::string(""); + } /** - * This state is arbitrary one, any time device can come into this state - * Device will move to this state if the ownership transfer initiated by the Application + * Get an auth provider which issued an auth code + * + * @return an auth provider which issued an auth code */ - ES_OWNERSHIP_TRANSFERRING_STATE, + std::string getAuthProvider() const + { + if(m_rep.hasAttribute(OC_RSRVD_ES_AUTHPROVIDER)) + { + return m_rep.getValue(OC_RSRVD_ES_AUTHPROVIDER); + } + return std::string(""); + } /** - * This state is arbitrary one, any time device can come into this state - * Device will move to this state if the ownership transfer is completed + * Get a CI server to be delivered + * + * @return a CI server to be delivered */ - ES_OWNERSHIP_TRANSFERRED_STATE, + std::string getCiServer() const + { + if(m_rep.hasAttribute(OC_RSRVD_ES_CISERVER)) + { + return m_rep.getValue(OC_RSRVD_ES_CISERVER); + } + return std::string(""); + } /** - * This state is arbitrary one, any time device can come into this state - * Device will move to this state once the Application factory reset the device + * Get a CI server's Uuid to be delivered + * + * @return a CI server's Uuid to be delivered */ - ES_FACTORY_RESET_STATE, + std::string getCloudID() const + { + return m_cloudID; + } /** - * Enrollee moves to this state after connecting to target network + * Get OCRepresentation object + * + * @return OCRepresentation object */ - ES_ON_BOARDED_TARGET_NETWORK_STATE, - }EnrolleeState; + const OCRepresentation &toOCRepresentation() const + { + return m_rep; + } + protected: + OCRepresentation m_rep; + std::string m_cloudID; + }; /** - * Provisioning Device Status + * @brief Data class stored for Device property provisioning which includes a WiFi + * and device configuration provisioning */ - typedef struct + class DeviceProp { - // Address of remote server - OCDevAddr * addr; - // Indicates adaptor type on which the response was received - OCConnectivityType connType; - } EasySetupDeviceInfo; + public: - /** - * Provosioning Status - */ - typedef enum - { - DEVICE_PROVISIONED = 0, - DEVICE_NOT_PROVISIONED, - DEVICE_OWNED, - DEVICE_NOT_OWNED - } EasySetupState, ProvStatus; + /** + * Constructor + */ + DeviceProp() {} - /** - * Response from queries to remote servers. - */ - typedef struct - { - // EasySetup Status - EasySetupState provStatus; - // EasySetup Device Info - EasySetupDeviceInfo provDeviceInfo; - } EasySetupInfo, ProvisioningInfo; + /** + * Constructor with OCRepresentation object. This is used for JNI communication. + */ + DeviceProp(const OCRepresentation &rep) + { + m_rep = rep; + } - /** - * @brief Network information of the Enroller - */ - typedef union - { /** - * @brief BT Mac Information + * Set WiFi resource properties to be delivered to Enrollee + * + * @param ssid Ssid of the Enroller + * @param pwd Pwd of the Enrolle + * @param authtype Auth type of the Enroller + * @param enctype Encryption type of the Enroller + * + * @see WIFI_AUTHTYPE + * @see WIFI_ENCTYPE */ - struct + void setWiFiProp(string ssid, string pwd, WIFI_AUTHTYPE authtype, WIFI_ENCTYPE enctype) { - char btMacAddress[NET_MACADDR_SIZE]; /**< BT mac address **/ - } BT; + m_rep.setValue(OC_RSRVD_ES_SSID, ssid); + m_rep.setValue(OC_RSRVD_ES_CRED, pwd); + m_rep.setValue(OC_RSRVD_ES_AUTHTYPE, authtype); + m_rep.setValue(OC_RSRVD_ES_ENCTYPE, enctype); + } /** - * @brief LE MAC Information + * Set DevConf resource properties to be delivered to Enrollee + * + * @param language IETF language tag using ISO 639X + * @param country ISO Country Code (ISO 3166-1 Alpha-2) */ - struct + void setDevConfProp(string language, string country) { - char leMacAddress[NET_MACADDR_SIZE]; /**< BLE mac address **/ - } LE; + m_rep.setValue(OC_RSRVD_ES_LANGUAGE, language); + m_rep.setValue(OC_RSRVD_ES_COUNTRY, country); + } /** - * @brief IP Information + * Get a SSID of Enroller + * + * @return a SSID of enroller */ - struct + std::string getSsid() const { - char ssid[NET_WIFI_SSID_SIZE]; /**< ssid of the Enroller**/ - char pwd[NET_WIFI_PWD_SIZE]; /**< pwd of the Enroller**/ - } WIFI; - } ProvData; + if(m_rep.hasAttribute(OC_RSRVD_ES_SSID)) + { + return m_rep.getValue(OC_RSRVD_ES_SSID); + } + return std::string(""); + } - /** - * @brief Network Information - */ - typedef struct - { - ProvData provData; /**< Enroller Network Info**/ - OCConnectivityType connType; /**< Connectivity Type**/ - } ProvConfig; + /** + * Get a password of Enroller + * + * @return a password of enroller + */ + std::string getPassword() const + { + if(m_rep.hasAttribute(OC_RSRVD_ES_CRED)) + { + return m_rep.getValue(OC_RSRVD_ES_CRED); + } + return std::string(""); + } - /** - * Client applications implement this callback to consume responses received from Servers. - */ - typedef void (*OCProvisioningStatusCB)(EasySetupInfo *easySetupInfo); + /** + * Get an auth type of Enroller + * + * @return an auth type of enroller + * + * @see WIFI_AUTHTYPE + */ + WIFI_AUTHTYPE getAuthType() const + { + if(m_rep.hasAttribute(OC_RSRVD_ES_AUTHTYPE)) + { + return static_cast(m_rep.getValue(OC_RSRVD_ES_AUTHTYPE)); + } + return NONE_AUTH; + } - /** - * @brief This structure represent configuration information to create wifi onboarding SoftAP or connection. - */ + /** + * Get an encryption type of Enroller + * + * @return an encryption type of enroller + * + * @see WIFI_ENCTYPE + */ + WIFI_ENCTYPE getEncType() const + { + if(m_rep.hasAttribute(OC_RSRVD_ES_ENCTYPE)) + { + return static_cast(m_rep.getValue(OC_RSRVD_ES_ENCTYPE)); + } + return NONE_ENC; + } - // Note : Below structure is not currently used but added for future purpose. - typedef struct - { - char ssid[NET_WIFI_SSID_SIZE]; /**< ssid of the onboarding Adhoc Wifi network**/ - char pwd[NET_WIFI_PWD_SIZE]; /**< pwd of the onboarding Adhoc wifi network**/ - bool isSecured; /**< Secure connection**/ - }WiFiOnboardingConfig; + /** + * Get a language to be set. A language is expressed in IETF language tag + * using ISO 639X. + * + * @return a language to be set + */ + std::string getLanguage() const + { + if(m_rep.hasAttribute(OC_RSRVD_ES_LANGUAGE)) + { + return m_rep.getValue(OC_RSRVD_ES_LANGUAGE); + } + return std::string(""); + } - /** - * @brief This structure represent onboarding connection instance. - */ - typedef struct - { - /*Actual use of ipAddress is for unicast discovery, but also used to identify the Enrollee device as of now, - device identification should be based on DeviceID in next release.*/ - char ipAddress[IPV4_ADDR_SIZE]; /**< IP Address of the Enrollee **/ - bool isSecured; /**< Secure connection**/ - }WiFiOnboadingConnection; + /** + * Get a country to be set. A country is expressed in ISO Country Code + * (ISO 3166-1 Alpha-2) + * + * @return a country to be set + */ + std::string getCountry() const + { + if(m_rep.hasAttribute(OC_RSRVD_ES_COUNTRY)) + { + return m_rep.getValue(OC_RSRVD_ES_COUNTRY); + } + return std::string(""); + } - typedef enum - { - ES_PROVISIONING_ERROR = -1, - ES_NEED_PROVISIONING, - ES_PROVISIONED_ALREADY, - ES_PROVISIONING_SUCCESS - } ESState; + /** + * Get OCRepresentation object + * + * @return OCRepresentation object + */ + const OCRepresentation &toOCRepresentation() const + { + return m_rep; + } - typedef enum - { - ES_UNKNOWN = 0, - ES_ONBOARDED, - ES_OWNED, - ES_PROVISIONED - } CurrentESState; + protected: + OCRepresentation m_rep; + }; + /** + * @brief Provisioning state in cloud server property provisioning. + */ typedef enum { - ES_SEC_UNKNOWN = 0, - ES_SEC_OWNED, - ES_SEC_ACL_PROVISIONED, - ES_SEC_CREDS_PROVISIONED - } EnrolleeSecState; + ES_CLOUD_PROVISIONING_ERROR = -1, /**< An error in cloud provisioning happens **/ + ES_CLOUD_PROVISIONING_SUCCESS, /**< Cloud provisioning is successfully done **/ + ES_CLOUD_ENROLLEE_FOUND, /**< An enrollee is found in a given network **/ + ES_CLOUD_ENROLLEE_NOT_FOUND /**< NO enrollee is found in a given network **/ + }ESCloudProvState; /** * Security Provisioning Status */ - class SecProvisioningResult + class SecProvisioningStatus { public: - std::shared_ptr< SecProvisioningResult > shared_ptr; - SecProvisioningResult(std::string deviceUUID, ESResult result) : + SecProvisioningStatus(string deviceUUID, ESResult result) : m_devUUID(deviceUUID), m_result(result) { - } - std::string getDeviceUUID() + const string getDeviceUUID() { return m_devUUID; } - ESResult getResult() + ESResult getESResult() { return m_result; } private: - std::string m_devUUID; + string m_devUUID; ESResult m_result; }; /** - * Callback function definition for providing Enrollee security status . + * @breif This provide a set of getter APIs from received response for getConfiguration(). + * Received information includes a device name, WiFi supported mode, and frequency. + * Additionally, you can know if Enrollee can be access to cloud server with this + * object. */ - typedef std::function< void(std::shared_ptr) > EnrolleeSecStatusCb; + class EnrolleeConf + { + public: + /** + * Constructor + * The expected OCRepresentation is one for collection resource and has several child + * OCRepresentation object corresponding to WiFi, DevConf, and CloudServer resource's + * representation. + */ + EnrolleeConf(const OCRepresentation& rep) + { + m_ProvRep = rep; + + std::vector children = rep.getChildren(); + + for(auto child = children.begin(); child != children.end(); ++child) + { + if(child->getUri().find(OC_RSRVD_ES_URI_WIFI) != std::string::npos) + { + m_WiFiRep = *child; + } + else if(child->getUri().find(OC_RSRVD_ES_URI_DEVCONF) != std::string::npos) + { + m_DevConfRep = *child; + } + else if(child->getUri().find(OC_RSRVD_ES_URI_CLOUDSERVER) != std::string::npos) + { + m_CloudRep = *child; + } + } + } + + /** + * Get a device name of Enrollee. It is Device's human-friendly name like device model + * name. + * + * @return a device name of Enrollee + */ + std::string getDeviceName() const + { + if(m_DevConfRep.hasAttribute(OC_RSRVD_ES_DEVNAME)) + return m_DevConfRep.getValue(OC_RSRVD_ES_DEVNAME); + return std::string(""); + } + + /** + * Get a set of WiFi supported modes of Enrollee + * + * @return a set of WiFi supported modes of Enrollee + * + * @see WIFI_MODE + */ + vector getWiFiModes() const + { + vector modes; + modes.clear(); + + if(m_WiFiRep.hasAttribute(OC_RSRVD_ES_SUPPORTEDWIFIMODE)) + { + for(auto it : m_WiFiRep.getValue + >(OC_RSRVD_ES_SUPPORTEDWIFIMODE)) + { + modes.push_back(static_cast(it)); + } + } + return modes; + } + + /** + * Get a WiFi supported frequency of Enrollee + * + * @return a WiFi supported frequency of Enrollee + * + * @see WIFI_FREQ + */ + WIFI_FREQ getWiFiFreq() const + { + if(m_WiFiRep.hasAttribute(OC_RSRVD_ES_SUPPORTEDWIFIFREQ)) + return static_cast( + m_WiFiRep.getValue(OC_RSRVD_ES_SUPPORTEDWIFIFREQ)); + return WIFI_FREQ_NONE; + } + + /** + * Get an accessibility to cloud server of an Enrollee + * + * @return an accessibility to cloud server of an Enrollee + */ + bool isCloudAccessible() const + { + if(m_CloudRep.getUri().find(OC_RSRVD_ES_URI_CLOUDSERVER) != std::string::npos) + { + return true; + } + return false; + } + + /** + * Get OCRepresentation object + * + * @return OCRepresentation object + */ + const OCRepresentation& getProvResRep() + { + return m_ProvRep; + } + + protected: + OCRepresentation m_ProvRep, m_WiFiRep, m_DevConfRep, m_CloudRep; + }; /** - * Callback definition to be invoked when the security stack expects a pin from application. + * Status object for getStatus API. This object is given to application + * when a response for GET request to provisioning resource at Enrollee is arrived. + * It returns a result of the API and requested data delivered in the response which includes + * a provisioning status and last error code stored in Enrollee. + * + * @see EnrolleeStatus */ - typedef std::function< void(std::string&) > SecurityPinCb; + class GetEnrolleeStatus + { + public: + GetEnrolleeStatus(ESResult result, const EnrolleeStatus& status) : + m_result(result), m_enrolleeStatus(status) + { + } + + ESResult getESResult() + { + return m_result; + } + + const EnrolleeStatus& getEnrolleeStatus() + { + return m_enrolleeStatus; + } + + private: + ESResult m_result; + EnrolleeStatus m_enrolleeStatus; + }; /** - * Callback definition to be invoked when the stack expects a db path. + * Status object for getConfiguration API. This object is given to application + * when a response for GET request to provisioning resource at Enrollee is arrived. + * It returns a result of the API and requested data delivered in the response which includes + * WiFi configuration and device configuration stored in Enrollee. + * + * @see EnrolleeConf */ - typedef std::function< void(std::string&) > SecProvisioningDbPathCb; - - class ProvisioningStatus + class GetConfigurationStatus { public: - std::shared_ptr< ProvisioningStatus > shared_ptr; - ProvisioningStatus(ESResult result, ESState esState) : - m_result(result), m_esState(esState) + GetConfigurationStatus(ESResult result, const EnrolleeConf& conf) : + m_result(result), m_enrolleeConf(conf) { - } ESResult getESResult() @@ -341,39 +585,104 @@ namespace OIC return m_result; } - ESState getESState() + const EnrolleeConf& getEnrolleeConf() { - return m_esState; + return m_enrolleeConf; } + private: ESResult m_result; - ESState m_esState; + EnrolleeConf m_enrolleeConf; }; - class EasySetupStatus + /** + * Status object for provisionDeviceProperties API. This object is given to application + * when a response for GET request to provisioning resource at Enrollee is arrived. + * It returns a result of the request. + */ + class DevicePropProvisioningStatus { public: - std::shared_ptr< EasySetupStatus > shared_ptr; - EasySetupStatus(const EasySetupState& easySetupState, - const ProvConfig& provConfig) : - m_easySetupState(easySetupState), m_ProvConfig(provConfig) + DevicePropProvisioningStatus(ESResult result) : + m_result(result) { + } + ESResult getESResult() + { + return m_result; + } + + + private: + ESResult m_result; + }; + + /** + * Status object for provisionCloudProperties API. This object is given to application + * when a response for GET request to provisioning resource at Enrollee is arrived. + * It returns a result of the request and status of this provisioning. The status provides + * an information if the enrollee is found in a given network and the provisioning is + * successfully done. + */ + class CloudPropProvisioningStatus + { + public: + CloudPropProvisioningStatus(ESResult result, ESCloudProvState state) : + m_result(result), m_esCloudState(state) + { } - ProvConfig getProvConfig() + ESResult getESResult() { - return m_ProvConfig; + return m_result; } - EasySetupState getEasySetupState() + ESCloudProvState getESCloudState() { - return m_easySetupState; + return m_esCloudState; } + private: - EasySetupState m_easySetupState; - ProvConfig m_ProvConfig; + ESResult m_result; + ESCloudProvState m_esCloudState; }; + + /** + * Callback function definition for providing Enrollee status + */ + typedef function< void(shared_ptr< GetEnrolleeStatus >) > GetStatusCb; + + /** + * Callback function definition for providing Enrollee configuration status + */ + typedef function< void(shared_ptr< GetConfigurationStatus >) > GetConfigurationStatusCb; + + /** + * Callback function definition for providing Enrollee device property provisioning status + */ + typedef function< void(shared_ptr< DevicePropProvisioningStatus >) > DevicePropProvStatusCb; + + /** + * Callback function definition for providing Enrollee cloud property provisioning status + */ + typedef function< void(shared_ptr< CloudPropProvisioningStatus >) > CloudPropProvStatusCb; + + /** + * Callback function definition for providing Enrollee security provisioning status + */ + typedef function< void(shared_ptr) > SecurityProvStatusCb; + + /** + * Callback definition to be invoked when the security stack expects a pin from application + */ + typedef function< void(string&) > SecurityPinCb; + + /** + * Callback definition to be invoked when the stack expects a db path + */ + typedef function< void(string&) > SecProvisioningDbPathCb; + } } #endif //WITH_ARDUINO diff --git a/service/easy-setup/mediator/richsdk/inc/EasySetup.h b/service/easy-setup/mediator/richsdk/inc/EasySetup.h old mode 100644 new mode 100755 index b7914f4..68eb295 --- a/service/easy-setup/mediator/richsdk/inc/EasySetup.h +++ b/service/easy-setup/mediator/richsdk/inc/EasySetup.h @@ -27,6 +27,7 @@ #include "ESRichCommon.h" #include "RemoteEnrollee.h" +using namespace OC; namespace OIC { namespace Service @@ -34,11 +35,8 @@ namespace OIC class RemoteEnrollee; /** - * This provides methods for Mediator devices to perform EasySetup of Enrollee devices. - * EasySetup involves - * 1) Ownership transfer for enabling secured communication between Mediator and Enrollee - * devices. - * 2) Provisioning of Enrollee devices using the credentails of target Enroller devices. + * This provides an API to instanciate a new RemoteEnrollee object correspondent to Enrollee + * Device to be setup. */ class EasySetup { @@ -50,29 +48,28 @@ namespace OIC static EasySetup* getInstance(); /** - * This API is used for creating a remote Enrollee device instance. - * @param ProvConfig Provisioning information for configuring the Enrollee. - * @param WiFiOnboadingConnection Onboarding connection information for configuring the Enrollee. + * This API is used for creating a remote Enrollee instance. + * + * @param enrolleeResource an OCResource object corresponding to enrollee resource + * discovered in a network. The OCResource object can be obtained by calling + * OCPlatform.findResource() API. What resource you have to discover with + * the OCPlatform.findResource() API is a "provisioning" resource with a certain + * resource type, i.e. ocf.wk.prov * * @throws ESBadRequestException If createEnrolleeDevice is invoked with the same * provisioning information. * * @return Pointer to RemoteEnrollee instance. */ - std::shared_ptr createEnrolleeDevice ( - const ProvConfig& enrolleeNWProvInfo, - const WiFiOnboadingConnection& wifiOnboardingconn); + std::shared_ptr createRemoteEnrollee( + std::shared_ptr< OC::OCResource > enrolleeResource); + private: EasySetup(); ~EasySetup(); - RemoteEnrollee::shared_ptr findDeviceInProvisioningList( - const ProvConfig& enrolleeNWProvInfo, - const WiFiOnboadingConnection& wifiOnboardingconn); - bool addDeviceToProvisioningList(const RemoteEnrollee::shared_ptr remoteEnrollee); - bool deleteDeviceFromProvisioningList (const ProvConfig& enrolleeNWProvInfo); - - std::vector< RemoteEnrollee::shared_ptr > m_activeEnrolleeList; + private: + std::shared_ptr< OC::OCResource > m_ocResource; static EasySetup *s_instance; }; } diff --git a/service/easy-setup/mediator/richsdk/inc/EnrolleeResource.h b/service/easy-setup/mediator/richsdk/inc/EnrolleeResource.h new file mode 100755 index 0000000..ed6f06c --- /dev/null +++ b/service/easy-setup/mediator/richsdk/inc/EnrolleeResource.h @@ -0,0 +1,80 @@ +//****************************************************************** +// +// Copyright 2015 Samsung Electronics All Rights Reserved. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +#ifndef ENROLLEE_RESOURCE_H_ +#define ENROLLEE_RESOURCE_H_ + +#include +#include + +#include "ESRichCommon.h" + +#include "OCApi.h" + +using namespace OC; + +namespace OIC +{ + namespace Service + { + class OCResource; + class EnrolleeSecurity; + + /** + * This class contains the resource discovery methods. + * + * @see EnrolleeResource + */ + class EnrolleeResource + { + friend class EnrolleeSecurity; + + public: + EnrolleeResource(std::shared_ptr< OC::OCResource > resource); + + ~EnrolleeResource() = default; + + void registerGetStatusCallback (GetStatusCb callback); + void registerGetConfigurationStatusCallback (GetConfigurationStatusCb callback); + void registerDevicePropProvStatusCallback (DevicePropProvStatusCb callback); + + void getConfiguration(); + void getStatus(); + + void provisionEnrollee(const DeviceProp& deviceProp); + + private: + std::shared_ptr< OC::OCResource > m_ocResource; + + GetStatusCb m_getStatusCb; + GetConfigurationStatusCb m_getConfigurationStatusCb; + DevicePropProvStatusCb m_devicePropProvStatusCb; + + private: + void onGetStatusResponse(const HeaderOptions& headerOptions, const OCRepresentation& rep, + const int eCode); + void onGetConfigurationResponse(const HeaderOptions& headerOptions, const OCRepresentation& rep, + const int eCode); + void checkProvInformationCb(const HeaderOptions& headerOptions, const OCRepresentation& rep, + const int eCode); + }; + } +} +#endif diff --git a/service/easy-setup/mediator/richsdk/inc/EnrolleeSecurity.h b/service/easy-setup/mediator/richsdk/inc/EnrolleeSecurity.h index 5308b0b..4375810 100755 --- a/service/easy-setup/mediator/richsdk/inc/EnrolleeSecurity.h +++ b/service/easy-setup/mediator/richsdk/inc/EnrolleeSecurity.h @@ -22,6 +22,7 @@ #define ENROLLEE_SECURITY_H_ #include +#include #include "ESRichCommon.h" #include "OCProvisioningManager.h" @@ -32,9 +33,11 @@ namespace OIC { #define ENROLEE_SECURITY_TAG "ENROLEE_SECURITY" - class RemoteEnrolleeResource; + class EnrolleeResource; class OCSecureResource; + typedef std::vector PMResultList_t; + /** * This class contains the methods needed for security layer interaction. * @@ -43,24 +46,33 @@ namespace OIC class EnrolleeSecurity { public: - EnrolleeSecurity(std::shared_ptr< RemoteEnrolleeResource > remoteEnrolleeResource, + EnrolleeSecurity(std::shared_ptr< OC::OCResource > resource, std::string secDbPath); - ESResult registerCallbackHandler(EnrolleeSecStatusCb enrolleeSecStatusCb, + void registerCallbackHandler(SecurityProvStatusCb securityProvStatusCb, SecurityPinCb securityPinCb, SecProvisioningDbPathCb secProvisioningDbPathCb); - EasySetupState performOwnershipTransfer(); + void performOwnershipTransfer(); + ESResult performACLProvisioningForCloudServer(std::string cloudUuid); + std::string getUUID() const; private: - std::shared_ptr< RemoteEnrolleeResource > m_remoteEnrolleeResource; - EnrolleeSecStatusCb m_enrolleeSecStatusCb; + std::shared_ptr< OC::OCResource > m_ocResource; + SecurityProvStatusCb m_securityProvStatusCb; SecurityPinCb m_securityPinCb; SecProvisioningDbPathCb m_secProvisioningDbPathCb; std::shared_ptr< OC::OCSecureResource > m_unownedDevice; - EnrolleeSecState m_enrolleeSecState;std::shared_ptr< OC::OCSecureResource > m_securedResource; + std::mutex m_mtx; + std::condition_variable m_cond; + bool aclResult; + std::shared_ptr< OC::OCSecureResource > m_securedResource; std::shared_ptr< OC::OCSecureResource > getEnrollee(OC::DeviceList_t &list); void ownershipTransferCb(OC::PMResultList_t *result, int hasError); void convertUUIDToString(OicUuid_t uuid, std::string& uuidString); + void convertStringToUUID(OicUuid_t& uuid, std::string uuidString); + OicSecAcl_t* createAcl(OicUuid_t cloudUuid); + + void ACLProvisioningCb(PMResultList_t *result, int hasError); }; } } diff --git a/service/easy-setup/mediator/richsdk/inc/RemoteEnrollee.h b/service/easy-setup/mediator/richsdk/inc/RemoteEnrollee.h old mode 100644 new mode 100755 index 1fb83b3..6f5c6e4 --- a/service/easy-setup/mediator/richsdk/inc/RemoteEnrollee.h +++ b/service/easy-setup/mediator/richsdk/inc/RemoteEnrollee.h @@ -21,47 +21,37 @@ #ifndef REMOTE_ENROLLEE_H_ #define REMOTE_ENROLLEE_H_ +#include +#include +#include + #include "ESRichCommon.h" +#include "OCApi.h" + +using namespace OC; namespace OIC { namespace Service { - class RemoteEnrolleeResource; + class OCResource; + class EnrolleeResource; + class CloudResource; class EnrolleeSecurity; /** - * This class represents Remote Enrollee device instance. - * It will provide APIs for Mediator to perform operations to enable the Enrollee device - * to connect to the Enroller. + * This class represents Remote Enrollee device instance. What operation the class provides: + * 1) Ownership transfer for enabling secured communication between Mediator and Enrollee + * devices. + * 2) Provision WiFi AP information used for which Enrollee is going to connect to the AP + * 3) Provision Device confiruation setting, i.e. language, country, and etc + * 4) Provision Cloud information used for which Enrollee is going to register to the cloud */ class RemoteEnrollee { public: - /** - * RemoteEnrollee constructor - * - * @param enrolleeNWProvInfo Provisioning information for the Enrollee - * - * @throw ESBadRequestException is thrown if the parameters are invalid - */ - RemoteEnrollee(const ProvConfig& enrolleeNWProvInfo, const WiFiOnboadingConnection& connection) ; - ~RemoteEnrollee() = default; - typedef std::shared_ptr< RemoteEnrollee > shared_ptr; - - /** - * Callback definition to be invoked when EasySetup status is changed. - * The same callback will be invoked when there is an error in the - * EasySetup process. - * - * @see registerResourceHandler - * @see ResourceState - */ - typedef std::function< void(std::shared_ptr< EasySetupStatus >) > - EasySetupStatusCB; - #ifdef __WITH_DTLS__ /** * Register Security status and other information callback handlers. @@ -80,71 +70,107 @@ namespace OIC #endif //__WITH_DTLS__ /** - * Register EasySetup status handler. + * Get an Enrollee's status which includes provisioning status and last error code * - * @param callback Callback to get EasySetup status. - * @param secProvisioningDbCB Callback to be invoked when the stack expects a - * path for the provisioning db. + * @param callback will give the requested status * - * @throws InvalidParameterException If callback is an empty function or null. - * @throws ESBadRequestException If registration is already completed. + * @throws ESBadRequestException If RemoteEnrollee device not created prior to this call. * - * @see EasySetupStatus + * @see GetStatusCb */ - void registerEasySetupStatusHandler(EasySetupStatusCB callback); + void getStatus(GetStatusCb callback); /** - * Start provisioning of target Enrollers information to the Enrollee. + * Get an Enrollee's configuration which includes WiFi supported frequency and device name + * + * @param callback will give the requested configuration * * @throws ESBadRequestException If RemoteEnrollee device not created prior to this call. * - * @see RemoteEnrollee + * @see GetConfigurationStatusCb */ - void startProvisioning(); + void getConfiguration(GetConfigurationStatusCb callback); - /** - * Stop provisioning process that is currently in progress. + /** + * Do security provisioning such as ownership tranfer to Enrollee. * - * @throws BadRequestException If provisioning is not in progress. - */ - void stopProvisioning(); - - /** - * Check if the Enrollee device provisioned. + * @param callback will give the result if the security provisioning succeeds or fails for some reasons + * + * @throws ESBadRequestException If RemoteEnrollee device not created prior to this call. + * + * @see SecurityProvStatusCb */ - bool isEnrolleeProvisioned(); + void provisionSecurity(SecurityProvStatusCb callback); /** - * Get the Provisioning information provided for the current Enrollee. + * Provision WiFi AP information and device configuration to Enrollee + * 1. WiFi AP information includes a SSID, password, auth type, and encryption type. + * 2. Device configuration includes a language (IETF language tags) and country (ISO 3166-1 Alpha-2) + * + * @param devProp a data structure storing the above information to be delivered + * @param callback will give the result if the provisioning succeeds or fails * - * @return ProvConfig Provisioning information provided for the current Enrollee. + * @throws ESBadRequestException If RemoteEnrollee device not created prior to this call. + * + * @see DeviceProp + * @see DevicePropProvStatusCb */ - ProvConfig getProvConfig (); + void provisionDeviceProperties(const DeviceProp& devProp, + DevicePropProvStatusCb callback); /** - * Get the Onboarding connection information between Mediator and Enrollee. + * Provision Cloud information to Enrollee, which includes Auth code, auth provider, + * Cloud interface server URL, and etc. + * In this function, Discovery for the Enrollee will happen again in a given network. + * Because, this function is expected to call *AFTER* the Enrollee disconnects its Soft AP + * and successfully connects to the certain WiFi AP. In that case, Mediator should discover + * the Enrollee with a certain Device ID in the network. + * + * @param cloudProp a data structure storing the above information to be delivered + * @param callback will give the result if the provisioning succeeds or fails + * + * @throws ESBadRequestException If RemoteEnrollee device not created prior to this call. * - * @return WiFiOnboadingConnection information between Mediator and Enrollee. + * @see CloudProp + * @see CloudPropProvStatusCb */ + void provisionCloudProperties(const CloudProp& cloudProp, + CloudPropProvStatusCb callback); - WiFiOnboadingConnection getOnboardConn(); + private: + RemoteEnrollee(std::shared_ptr< OC::OCResource > resource); + + ESResult discoverResource(); + void onDeviceDiscovered(std::shared_ptr resource); + void initCloudResource(); + + void getStatusHandler (std::shared_ptr< GetEnrolleeStatus > status); + void getConfigurationStatusHandler (std::shared_ptr< GetConfigurationStatus > status); + void devicePropProvisioningStatusHandler (std::shared_ptr< DevicePropProvisioningStatus > status); + void cloudPropProvisioningStatusHandler (std::shared_ptr< CloudPropProvisioningStatus > status); + void securityStatusHandler(std::shared_ptr< SecProvisioningStatus > status); private: - std::shared_ptr< RemoteEnrolleeResource > m_remoteResource; - EasySetupStatusCB m_easySetupStatusCb; - EnrolleeSecStatusCb m_enrolleeSecStatusCb; + std::shared_ptr< OC::OCResource > m_ocResource; + std::shared_ptr< EnrolleeResource > m_enrolleeResource; + std::shared_ptr< EnrolleeSecurity > m_enrolleeSecurity; + std::shared_ptr< CloudResource > m_cloudResource; + + std::string m_deviceId; + bool m_discoveryResponse; + + std::mutex m_discoverymtx; + std::condition_variable m_cond; + + SecurityProvStatusCb m_securityProvStatusCb; + GetStatusCb m_getStatusCb; + GetConfigurationStatusCb m_getConfigurationStatusCb; SecurityPinCb m_securityPinCb; SecProvisioningDbPathCb m_secProvisioningDbPathCb; - ProvConfig m_ProvConfig; - WiFiOnboadingConnection m_wifiOnboardingconn; - - std::shared_ptr< EnrolleeSecurity > m_enrolleeSecurity; - CurrentESState m_currentESState; - bool m_isSecured; + DevicePropProvStatusCb m_devicePropProvStatusCb; + CloudPropProvStatusCb m_cloudPropProvStatusCb; - void provisioningStatusHandler (std::shared_ptr< ProvisioningStatus > provStatus); - void easySetupSecurityStatusCallback( - std::shared_ptr< SecProvisioningResult > secProvisioningResult); + friend class EasySetup; }; } } diff --git a/service/easy-setup/mediator/richsdk/inc/RemoteEnrolleeResource.h b/service/easy-setup/mediator/richsdk/inc/RemoteEnrolleeResource.h deleted file mode 100755 index 6828a9b..0000000 --- a/service/easy-setup/mediator/richsdk/inc/RemoteEnrolleeResource.h +++ /dev/null @@ -1,131 +0,0 @@ -//****************************************************************** -// -// Copyright 2015 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -#ifndef REMOTE_ENROLLEE_RESOURCE_H_ -#define REMOTE_ENROLLEE_RESOURCE_H_ - -#include -#include - -#include "ESRichCommon.h" - -#include "OCApi.h" - -using namespace OC; - -namespace OIC -{ - namespace Service - { - class OCResource; - class EnrolleeSecurity; - - /** - * This class contains the resource discovery methods. - * - * @see RemoteEnrolleeResource - */ - class RemoteEnrolleeResource - { - friend class EnrolleeSecurity; - - public: - typedef std::shared_ptr< RemoteEnrolleeResource > Ptr; - - typedef std::function< void(std::shared_ptr< ProvisioningStatus >) > ProvStatusCb; - - /** - * RemoteEnrolleeResource constructor - * - * @param enrolleeNWProvInfo Provisioning information for the Enrollee - * - * @throw ESBadRequestException is thrown if the parameters are invalid - */ - RemoteEnrolleeResource(const ProvConfig &enrolleeNWProvInfo, - const WiFiOnboadingConnection &onboardingconn); - - ~RemoteEnrolleeResource() = default; - - /** - * Register provisioning status handler. - * - * @param callback Callback to get Provisioning status. - * - * @throws InvalidParameterException If callback is an empty function or null. - * @throws ESBadRequestException If registration is already completed. - * - * @see ProvisioningStatus - */ - void registerProvStatusCallback (ProvStatusCb provStatusCb); - - /** - * Construct Remote OIC resource using the enrollee host and connectivity information - * provided in the constructor of RemoteEnrolleeResource. - * - * @throws InvalidParameterException If the provided information is invalid. - * @throws ESBadRequestException If resource is already constructed. - * - * @see ProvisioningStatus - */ - ESResult constructResourceObject(); - - /** - * Function for provisioning of Remote Enrollee resource using the information provided. - * - * @throws InvalidParameterException If cb is empty. - */ - void provisionEnrollee(); - - /** - * Function for unprovisioning of Remote Enrollee and bring to unprovisioned state - * - * @throws ESBadRequestException If device is not provisioned already. - */ - void unprovisionEnrollee(); - - - - private: - std::shared_ptr< OC::OCResource > m_ocResource; - std::mutex m_mutex; - ProvStatusCb m_provStatusCb; - ProvConfig m_ProvConfig; - WiFiOnboadingConnection m_wifiOnboardingconn; - bool m_discoveryResponse; - - void getProvStatusResponse(const HeaderOptions& headerOptions, const OCRepresentation& rep, - const int eCode); - - void checkProvInformationCb(const HeaderOptions& headerOptions, const OCRepresentation& rep, - const int eCode); - - ESResult ESDiscoveryTimeout(unsigned short waittime); - - void onDeviceDiscovered(std::shared_ptr resource); - - void triggerNetworkConnection(); - - void triggerNetworkConnectionCb( - const HeaderOptions& headerOptions, const OCRepresentation& rep, - const int eCode); - }; - } -} -#endif diff --git a/service/easy-setup/mediator/richsdk/src/CloudResource.cpp b/service/easy-setup/mediator/richsdk/src/CloudResource.cpp new file mode 100755 index 0000000..a0b327a --- /dev/null +++ b/service/easy-setup/mediator/richsdk/src/CloudResource.cpp @@ -0,0 +1,96 @@ +//****************************************************************** +// +// Copyright 2015 Samsung Electronics All Rights Reserved. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +#include + +#include "CloudResource.h" + +#include "OCPlatform.h" +#include "ESException.h" +#include "OCResource.h" +#include "logger.h" + +namespace OIC +{ + namespace Service + { + #define ES_CLOUD_RES_TAG "ES_CLOUD_RESOURCE" + + static const char ES_BASE_RES_URI[] = "/oic/res"; + + CloudResource::CloudResource(std::shared_ptr< OC::OCResource > resource) + { + m_ocResource = resource; + } + + void CloudResource::provisionEnrollee(const CloudProp& cloudProp) + { + OIC_LOG_V (DEBUG, ES_CLOUD_RES_TAG, "Enter provisionEnrollee."); + + OCRepresentation provisioningRepresentation = cloudProp.toOCRepresentation(); + + m_ocResource->post(OC_RSRVD_ES_RES_TYPE_PROV, BATCH_INTERFACE, + provisioningRepresentation, QueryParamsMap(), + std::function< + void(const HeaderOptions& headerOptions, + const OCRepresentation& rep, const int eCode) >( + std::bind(&CloudResource::onCloudProvResponse, this, + std::placeholders::_1, std::placeholders::_2, + std::placeholders::_3))); + } + + void CloudResource::onCloudProvResponse(const HeaderOptions& /*headerOptions*/, + const OCRepresentation& rep, const int eCode) + { + OIC_LOG_V (DEBUG, ES_CLOUD_RES_TAG, "onCloudProvResponse : %s, eCode = %d", + rep.getUri().c_str(), eCode); + + if (eCode > OCStackResult::OC_STACK_RESOURCE_CHANGED) + { + ESResult result = ESResult::ES_ERROR; + + OIC_LOG(DEBUG, ES_CLOUD_RES_TAG,"onCloudProvResponse : onCloudProvResponse is failed "); + + if (eCode == OCStackResult::OC_STACK_UNAUTHORIZED_REQ) + { + OIC_LOG(DEBUG, ES_CLOUD_RES_TAG, "Mediator is unauthorized from Enrollee."); + result = ESResult::ES_UNAUTHORIZED; + } + + std::shared_ptr< CloudPropProvisioningStatus > provStatus = std::make_shared< + CloudPropProvisioningStatus >(result, ESCloudProvState::ES_CLOUD_PROVISIONING_ERROR); + m_cloudPropProvStatusCb(provStatus); + } + else + { + OIC_LOG(DEBUG, ES_CLOUD_RES_TAG,"onCloudProvResponse : onCloudProvResponse is success "); + std::shared_ptr< CloudPropProvisioningStatus > provStatus = std::make_shared< + CloudPropProvisioningStatus >(ESResult::ES_OK, ESCloudProvState::ES_CLOUD_PROVISIONING_SUCCESS); + m_cloudPropProvStatusCb(provStatus); + } + } + + void CloudResource::registerCloudPropProvisioningStatusCallback(CloudPropProvStatusCb callback) + { + OIC_LOG_V (DEBUG, ES_CLOUD_RES_TAG, "Enter registerCloudPropProvisioningStatusCallback."); + m_cloudPropProvStatusCb = callback; + } + } +} diff --git a/service/easy-setup/mediator/richsdk/src/EasySetup.cpp b/service/easy-setup/mediator/richsdk/src/EasySetup.cpp old mode 100644 new mode 100755 index 3a6929e..01f151e --- a/service/easy-setup/mediator/richsdk/src/EasySetup.cpp +++ b/service/easy-setup/mediator/richsdk/src/EasySetup.cpp @@ -20,10 +20,13 @@ #include "EasySetup.h" +#include "OCPlatform.h" #include "logger.h" #include "ESException.h" #include "RemoteEnrollee.h" +using namespace OC; + namespace OIC { namespace Service @@ -46,82 +49,19 @@ namespace OIC return s_instance; } - RemoteEnrollee::shared_ptr EasySetup::findDeviceInProvisioningList ( - const ProvConfig& provConfig, const WiFiOnboadingConnection& onboardingconn) - { - OIC_LOG(DEBUG,EASYSETUP_TAG,"Entered findDeviceInProvisioningList ()"); - - std::vector< std::shared_ptr< RemoteEnrollee > >::iterator it; - - std::shared_ptr< RemoteEnrollee > remoteEnrollee = nullptr; - for(auto it : m_activeEnrolleeList) - { - OIC_LOG_V(DEBUG,EASYSETUP_TAG,"entered the iterator"); - - ProvConfig activeEnrolleConfig = it->getProvConfig(); - WiFiOnboadingConnection activeEnrolleConn = it->getOnboardConn(); - if ((0 == memcmp(&activeEnrolleConfig.provData, - &provConfig.provData, sizeof(ProvConfig))) && - (0 == memcmp(&activeEnrolleConn.ipAddress, - &onboardingconn.ipAddress, sizeof(onboardingconn.ipAddress)))) - { - remoteEnrollee = it; - return remoteEnrollee; - } - } - - OIC_LOG_V(DEBUG,EASYSETUP_TAG,"Return nullptr for findDeviceInProvisioningList call"); - return remoteEnrollee; - } - - bool EasySetup::addDeviceToProvisioningList(const RemoteEnrollee::shared_ptr remoteEnrollee) + std::shared_ptr EasySetup::createRemoteEnrollee (std::shared_ptr< OC::OCResource > resource) { - ProvConfig remoteEnrolleConfig = remoteEnrollee->getProvConfig(); - WiFiOnboadingConnection remoteEnrolleConn = remoteEnrollee->getOnboardConn(); - - for (auto it : m_activeEnrolleeList) + if(resource) { - ProvConfig activeEnrolleConfig = it->getProvConfig(); - WiFiOnboadingConnection activeEnrolleConn = it->getOnboardConn(); - if ( (0 == memcmp(&activeEnrolleConfig.provData, - &remoteEnrolleConfig.provData, - sizeof(ProvConfig))) && - (0 == memcmp(&activeEnrolleConn.ipAddress, - &remoteEnrolleConn.ipAddress, - sizeof(remoteEnrolleConn.ipAddress))) - ) + if(resource->getResourceTypes().at(0) != OC_RSRVD_ES_RES_TYPE_PROV) { - return false; + OIC_LOG_V (DEBUG, EASYSETUP_TAG, "createRemoteEnrollee : invalid reousrce"); + return nullptr; } + return std::shared_ptr< RemoteEnrollee > (new RemoteEnrollee(resource)); } - - OIC_LOG_V(DEBUG,EASYSETUP_TAG,"Adding new device RemoteEnrollee list"); - m_activeEnrolleeList.push_back(remoteEnrollee); - return true; - } - - std::shared_ptr EasySetup::createEnrolleeDevice ( - const ProvConfig& provConfig, const WiFiOnboadingConnection& wifiOnboardingconn) - { - if (findDeviceInProvisioningList(provConfig,wifiOnboardingconn) != nullptr) - { - throw ESBadRequestException { "Device already created exception" }; - } - - RemoteEnrollee::shared_ptr remoteEnrollee; - - remoteEnrollee = std::make_shared< RemoteEnrollee > (provConfig, wifiOnboardingconn); - - - if (!addDeviceToProvisioningList (remoteEnrollee)) - { - return nullptr; - } - - return remoteEnrollee; + return nullptr; } - - } } diff --git a/service/easy-setup/mediator/richsdk/src/EnrolleeResource.cpp b/service/easy-setup/mediator/richsdk/src/EnrolleeResource.cpp new file mode 100755 index 0000000..df9c15c --- /dev/null +++ b/service/easy-setup/mediator/richsdk/src/EnrolleeResource.cpp @@ -0,0 +1,238 @@ +//****************************************************************** +// +// Copyright 2015 Samsung Electronics All Rights Reserved. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +#include + +#include "EnrolleeResource.h" + +#include "OCPlatform.h" +#include "ESException.h" +#include "OCResource.h" +#include "logger.h" + +namespace OIC +{ + namespace Service + { + #define ES_REMOTE_ENROLLEE_RES_TAG "ES_ENROLLEE_RESOURCE" + + EnrolleeResource::EnrolleeResource(std::shared_ptr< OC::OCResource > resource) + { + m_ocResource = resource; + } + + void EnrolleeResource::checkProvInformationCb(const HeaderOptions& /*headerOptions*/, + const OCRepresentation& rep, const int eCode) + { + OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, "checkProvInformationCb : %s, eCode = %d", + rep.getUri().c_str(), + eCode); + + if (eCode > OCStackResult::OC_STACK_RESOURCE_CHANGED) + { + OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, + "checkProvInformationCb : Provisioning is failed "); + std::shared_ptr< DevicePropProvisioningStatus > provStatus = std::make_shared< + DevicePropProvisioningStatus >(ESResult::ES_ERROR); + m_devicePropProvStatusCb(provStatus); + return; + } + + OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, + "checkProvInformationCb : Provisioning is success. "); + + std::shared_ptr< DevicePropProvisioningStatus > provStatus = std::make_shared< + DevicePropProvisioningStatus >(ESResult::ES_OK); + m_devicePropProvStatusCb(provStatus); + } + + void EnrolleeResource::onGetStatusResponse(const HeaderOptions& /*headerOptions*/, + const OCRepresentation& rep, const int eCode) + { + OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, "onGetStatusResponse : %s, eCode = %d", + rep.getUri().c_str(), eCode); + + if (eCode > OCStackResult::OC_STACK_RESOURCE_CHANGED) + { + ESResult result = ESResult::ES_ERROR; + + OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, + "onGetStatusResponse : onGetStatusResponse is failed "); + + if (eCode == OCStackResult::OC_STACK_UNAUTHORIZED_REQ) + { + OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, + "Mediator is unauthorized from Enrollee."); + result = ESResult::ES_UNAUTHORIZED; + } + + EnrolleeStatus enrolleeStatus(rep); + std::shared_ptr< GetEnrolleeStatus > getEnrolleeStatus = std::make_shared< + GetEnrolleeStatus >(result, enrolleeStatus); + + m_getStatusCb(getEnrolleeStatus); + } + else + { + EnrolleeStatus enrolleeStatus(rep); + std::shared_ptr< GetEnrolleeStatus > getEnrolleeStatus = std::make_shared< + GetEnrolleeStatus >(ESResult::ES_OK, enrolleeStatus); + + m_getStatusCb(getEnrolleeStatus); + } + } + + void EnrolleeResource::onGetConfigurationResponse(const HeaderOptions& /*headerOptions*/, + const OCRepresentation& rep, const int eCode) + { + OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, "onGetConfigurationResponse : %s, eCode = %d", + rep.getUri().c_str(), eCode); + + if (eCode > OCStackResult::OC_STACK_RESOURCE_CHANGED) + { + ESResult result = ESResult::ES_ERROR; + + OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, + "onGetConfigurationResponse : onGetConfigurationResponse is failed "); + + if (eCode == OCStackResult::OC_STACK_UNAUTHORIZED_REQ) + { + OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, + "Mediator is unauthorized from Enrollee."); + result = ESResult::ES_UNAUTHORIZED; + } + + EnrolleeConf enrolleeConf(rep); + std::shared_ptr< GetConfigurationStatus > getConfigurationStatus = std::make_shared< + GetConfigurationStatus >(result, enrolleeConf); + m_getConfigurationStatusCb(getConfigurationStatus); + } + else + { + EnrolleeConf enrolleeConf(rep); + + std::shared_ptr< GetConfigurationStatus > getConfigurationStatus = std::make_shared< + GetConfigurationStatus >(ESResult::ES_OK, enrolleeConf); + m_getConfigurationStatusCb(getConfigurationStatus); + } + } + + void EnrolleeResource::registerGetStatusCallback(GetStatusCb callback) + { + m_getStatusCb = callback; + } + + void EnrolleeResource::registerGetConfigurationStatusCallback(GetConfigurationStatusCb callback) + { + m_getConfigurationStatusCb = callback; + } + + void EnrolleeResource::registerDevicePropProvStatusCallback(DevicePropProvStatusCb callback) + { + m_devicePropProvStatusCb = callback; + } + + void EnrolleeResource::getStatus() + { + if (m_ocResource == nullptr) + { + throw ESBadRequestException("Resource is not initialized"); + } + + OC::QueryParamsMap query; + OC::OCRepresentation rep; + + std::function< OCStackResult(void) > getStatus = [&] + { + return m_ocResource->get(m_ocResource->getResourceTypes().at(0), + DEFAULT_INTERFACE, query, std::function( + std::bind(&EnrolleeResource::onGetStatusResponse, this, + std::placeholders::_1, std::placeholders::_2, + std::placeholders::_3))); + }; + + OCStackResult result = getStatus(); + + if (result != OCStackResult::OC_STACK_OK) + { + EnrolleeStatus enrolleeStatus(rep);// = {ES_STATE_INIT, ES_ERRCODE_NO_ERROR}; + std::shared_ptr< GetEnrolleeStatus > getEnrolleeStatus = std::make_shared< + GetEnrolleeStatus >(ESResult::ES_ERROR, enrolleeStatus); + + m_getStatusCb(getEnrolleeStatus); + + return; + } + } + + void EnrolleeResource::getConfiguration() + { + if (m_ocResource == nullptr) + { + throw ESBadRequestException("Resource is not initialized"); + } + + OC::QueryParamsMap query; + OC::OCRepresentation rep; + + std::function< OCStackResult(void) > getConfigurationStatus = [&] + { + return m_ocResource->get(m_ocResource->getResourceTypes().at(0), + BATCH_INTERFACE, query, std::function( + std::bind(&EnrolleeResource::onGetConfigurationResponse, this, + std::placeholders::_1, std::placeholders::_2, + std::placeholders::_3))); + }; + + OCStackResult result = getConfigurationStatus(); + + if (result != OCStackResult::OC_STACK_OK) + { + EnrolleeConf enrolleeConf(rep); + std::shared_ptr< GetConfigurationStatus > getConfigurationStatus = std::make_shared< + GetConfigurationStatus >(ESResult::ES_ERROR, enrolleeConf); + m_getConfigurationStatusCb(getConfigurationStatus); + return; + } + } + + void EnrolleeResource::provisionEnrollee(const DeviceProp& deviceProp) + { + if (m_ocResource == nullptr) + { + throw ESBadRequestException("Resource is not initialized"); + } + + OC::QueryParamsMap query; + OC::OCRepresentation provisioningRepresentation = deviceProp.toOCRepresentation(); + + m_ocResource->post(OC_RSRVD_ES_RES_TYPE_PROV, BATCH_INTERFACE, + provisioningRepresentation, QueryParamsMap(), + std::function< + void(const HeaderOptions& headerOptions, + const OCRepresentation& rep, const int eCode) >( + std::bind(&EnrolleeResource::checkProvInformationCb, this, + std::placeholders::_1, std::placeholders::_2, + std::placeholders::_3))); + } + } +} diff --git a/service/easy-setup/mediator/richsdk/src/EnrolleeSecurity.cpp b/service/easy-setup/mediator/richsdk/src/EnrolleeSecurity.cpp index 0f35ce6..6e7bdf9 100755 --- a/service/easy-setup/mediator/richsdk/src/EnrolleeSecurity.cpp +++ b/service/easy-setup/mediator/richsdk/src/EnrolleeSecurity.cpp @@ -23,11 +23,12 @@ #include "EnrolleeSecurity.h" #include "oxmjustworks.h" #include "oxmrandompin.h" -#include "RemoteEnrolleeResource.h" +#include "EnrolleeResource.h" #include "logger.h" #include "ESException.h" #include "oic_malloc.h" #include "oic_string.h" +#include "utlist.h" namespace OIC { @@ -44,41 +45,35 @@ namespace OIC //TODO : Currently discovery timeout for owned and unowned devices is fixed as 5 // The value should be accepted from the application as a parameter during ocplatform // config call -#define ES_SEC_DISCOVERY_TIMEOUT 5 + #define ES_SEC_DISCOVERY_TIMEOUT 5 EnrolleeSecurity::EnrolleeSecurity( - std::shared_ptr< RemoteEnrolleeResource > remoteEnrolleeResource, + std::shared_ptr< OC::OCResource > resource, std::string secDbPath) { - m_enrolleeSecState = EnrolleeSecState::ES_SEC_UNKNOWN; - m_remoteEnrolleeResource = remoteEnrolleeResource; + (void) secDbPath; + m_ocResource = resource; } - ESResult EnrolleeSecurity::registerCallbackHandler(EnrolleeSecStatusCb enrolleeSecStatusCb, + void EnrolleeSecurity::registerCallbackHandler(SecurityProvStatusCb securityProvStatusCb, SecurityPinCb securityPinCb, SecProvisioningDbPathCb secProvisioningDbPathCb) - { - m_enrolleeSecStatusCb = enrolleeSecStatusCb; + m_securityProvStatusCb = securityProvStatusCb; m_securityPinCb = securityPinCb; m_secProvisioningDbPathCb = secProvisioningDbPathCb; - - return ES_ERROR; } std::shared_ptr< OC::OCSecureResource > EnrolleeSecurity::getEnrollee(DeviceList_t &list) { for (unsigned int i = 0; i < list.size(); i++) { - OIC_LOG_V(DEBUG, ENROLEE_SECURITY_TAG, "Device %d ID %s ", i + 1, - list[i]->getDeviceID().c_str()); - OIC_LOG_V(DEBUG, ENROLEE_SECURITY_TAG, "From IP :%s", list[i]->getDevAddr().c_str()); - - //Always return the first element of the unOwned devices. This is considering that Mediator is - // always connected with only one Enrollee for which ownership transfer is being performed. - // Incase of multiple Enrollee devices connected to the Mediator via any OnBoarding method (SoftAp - // for example), the Enrollee devices will be provisioned in the first come first serve basis in the order - // returned by the security layer. - return list[i]; + if(m_ocResource->sid() == list[i]->getDeviceID().c_str()) + { + OIC_LOG_V(DEBUG, ENROLEE_SECURITY_TAG, "Device %d ID %s ", i + 1, + list[i]->getDeviceID().c_str()); + OIC_LOG_V(DEBUG, ENROLEE_SECURITY_TAG, "From IP :%s", list[i]->getDevAddr().c_str()); + return list[i]; + } } OIC_LOG(ERROR, ENROLEE_SECURITY_TAG,"Error!!! DeviceList_t is NULL"); return NULL; @@ -102,19 +97,45 @@ namespace OIC uuidString = deviceId.str(); } + void EnrolleeSecurity::convertStringToUUID(OicUuid_t& uuid, std::string uuidString) + { + size_t outBufSize = B64DECODE_OUT_SAFESIZE((uuidString.length() + 1)); + uint8_t* outKey = (uint8_t*)OICCalloc(1, outBufSize); + uint32_t outKeySize = 0; + if(NULL == outKey) + { + OIC_LOG (ERROR, ENROLEE_SECURITY_TAG, "Failed to memoray allocation."); + throw ESBadRequestException ("Failed to memoray allocation."); + } + + if(B64_OK == b64Decode((char*)uuidString.c_str(), + uuidString.length(), + outKey, + outBufSize, + &outKeySize)) + { + memcpy(uuid.id, outKey, outKeySize); + } + else + { + OIC_LOG (ERROR, ENROLEE_SECURITY_TAG, "Failed to base64 decoding."); + throw ESBadRequestException ("Failed to base64 decoding."); + } + + OICFree(outKey); + } + void EnrolleeSecurity::ownershipTransferCb(OC::PMResultList_t *result, int hasError) { if (hasError) { OIC_LOG(ERROR, ENROLEE_SECURITY_TAG,"Error!!! in OwnershipTransfer"); - std::shared_ptr< SecProvisioningResult > securityProvisioningStatus = nullptr; std::string uuid; convertUUIDToString(result->at(0).deviceId, uuid); - securityProvisioningStatus = std::make_shared< SecProvisioningResult >(uuid, - ES_ERROR); - - m_enrolleeSecStatusCb(securityProvisioningStatus); + std::shared_ptr< SecProvisioningStatus > securityProvisioningStatus = + std::make_shared< SecProvisioningStatus >(uuid, ES_ERROR); + m_securityProvStatusCb(securityProvisioningStatus); return; } else @@ -127,11 +148,9 @@ namespace OIC convertUUIDToString(result->at(0).deviceId, uuid); OIC_LOG_V(DEBUG, ENROLEE_SECURITY_TAG, "UUID : %s",uuid.c_str()); - std::shared_ptr< SecProvisioningResult > securityProvisioningStatus = nullptr; - securityProvisioningStatus = std::make_shared< SecProvisioningResult >(uuid, - ES_OK); - - m_enrolleeSecStatusCb(securityProvisioningStatus); + std::shared_ptr< SecProvisioningStatus > securityProvisioningStatus = + std::make_shared< SecProvisioningStatus >(uuid, ES_OK); + m_securityProvStatusCb(securityProvisioningStatus); return; } @@ -139,51 +158,42 @@ namespace OIC } } - EasySetupState EnrolleeSecurity::performOwnershipTransfer() + void EnrolleeSecurity::performOwnershipTransfer() { - EasySetupState ownershipStatus = DEVICE_NOT_OWNED; - OC::DeviceList_t pUnownedDevList, pOwnedDevList; pOwnedDevList.clear(); pUnownedDevList.clear(); - OCStackResult result; + OCStackResult result = OC_STACK_ERROR; - //Developer note : Always test the mediator and enrollee applications on different devices. Running - // Mediator and Enrollee in same device will result in returning the same device as already owned. - /*result = OCSecure::discoverOwnedDevices(ES_SEC_DISCOVERY_TIMEOUT, + result = OCSecure::discoverOwnedDevices(ES_SEC_DISCOVERY_TIMEOUT, pOwnedDevList); if (result != OC_STACK_OK) { OIC_LOG(ERROR, ENROLEE_SECURITY_TAG, "Owned Discovery failed."); - ownershipStatus = DEVICE_NOT_OWNED; //Throw exception throw ESPlatformException(result); - return ownershipStatus; } else if (pOwnedDevList.size()) { OIC_LOG_V(DEBUG, ENROLEE_SECURITY_TAG, "Found owned devices. Count =%d", pOwnedDevList.size()); std::shared_ptr< OC::OCSecureResource > ownedDevice = getEnrollee(pOwnedDevList); + if (ownedDevice) { - ownershipStatus = DEVICE_OWNED; - return ownershipStatus; + std::shared_ptr< SecProvisioningStatus > securityProvisioningStatus = + std::make_shared< SecProvisioningStatus >(ownedDevice->getDeviceID(), ES_OK); + m_securityProvStatusCb(securityProvisioningStatus); + return; } } - else - { - OIC_LOG(ERROR, ENROLEE_SECURITY_TAG, "No owned devices found."); - ownershipStatus = DEVICE_NOT_OWNED; - }*/ result = OCSecure::discoverUnownedDevices(ES_SEC_DISCOVERY_TIMEOUT, pUnownedDevList); if (result != OC_STACK_OK) { OIC_LOG(ERROR, ENROLEE_SECURITY_TAG, "UnOwned Discovery failed."); - ownershipStatus = DEVICE_NOT_OWNED; //Throw exception throw ESPlatformException(result); } @@ -210,24 +220,176 @@ namespace OIC &EnrolleeSecurity::ownershipTransferCb, this, std::placeholders::_1, std::placeholders::_2); - if (m_unownedDevice->doOwnershipTransfer(ownershipTransferCb) != OC_STACK_OK) + result = m_unownedDevice->doOwnershipTransfer(ownershipTransferCb); + if (result != OC_STACK_OK) { OIC_LOG(ERROR, ENROLEE_SECURITY_TAG, "OwnershipTransferCallback is failed"); - ownershipStatus = DEVICE_NOT_OWNED; - return ownershipStatus; + throw ESPlatformException(result); } - ownershipStatus = DEVICE_NOT_OWNED; + } + else + { + OIC_LOG(ERROR, ENROLEE_SECURITY_TAG, "No matched unowned devices found."); + throw ESException("No matched unowned devices found."); } } else { - OIC_LOG(ERROR, ENROLEE_SECURITY_TAG, "No unSecure devices found."); - ownershipStatus = DEVICE_NOT_OWNED; + OIC_LOG(ERROR, ENROLEE_SECURITY_TAG, "No unowned devices found."); + throw ESException("No unowned devices found."); + } + } + + ESResult EnrolleeSecurity::performACLProvisioningForCloudServer(std::string cloudUuid) + { + ESResult res = ESResult::ES_ERROR; + + OicUuid_t uuid; + convertStringToUUID(uuid, cloudUuid); + + // Need to discover Owned device in a given network, again + OC::DeviceList_t pOwnedDevList; + std::shared_ptr< OC::OCSecureResource > ownedDevice = NULL; + + pOwnedDevList.clear(); + + OCStackResult result; - return ownershipStatus; + result = OCSecure::discoverOwnedDevices(ES_SEC_DISCOVERY_TIMEOUT, + pOwnedDevList); + if (result != OC_STACK_OK) + { + OIC_LOG(ERROR, ENROLEE_SECURITY_TAG, "Owned Discovery failed."); + //Throw exception + throw ESPlatformException(result); } + else if (pOwnedDevList.size()) + { + OIC_LOG_V(DEBUG, ENROLEE_SECURITY_TAG, "Found owned devices. Count =%d", + pOwnedDevList.size()); + ownedDevice = getEnrollee(pOwnedDevList); - return ownershipStatus; + if (!ownedDevice) + { + OIC_LOG(DEBUG, ENROLEE_SECURITY_TAG, "Not found owned devices."); + return res; + } + } + else + { + OIC_LOG(DEBUG, ENROLEE_SECURITY_TAG, "Not found owned devices."); + return res; + } + + // Create Acl for Cloud Server to be provisioned to Enrollee + OicSecAcl_t* acl = createAcl(uuid); + if(!acl) + { + OIC_LOG(ERROR, ENROLEE_SECURITY_TAG, "createAcl error return"); + return res; + } + + OC::ResultCallBack aclProvisioningCb = std::bind( + &EnrolleeSecurity::ACLProvisioningCb, this, std::placeholders::_1, + std::placeholders::_2); + // ACL provisioning to Enrollee + OCStackResult rst = ownedDevice->provisionACL(acl, aclProvisioningCb); + if(OC_STACK_OK != rst) + { + OIC_LOG_V(ERROR, ENROLEE_SECURITY_TAG, "OCProvisionACL API error: %d", rst); + return res; + } + + std::unique_lock lck(m_mtx); + m_cond.wait_for(lck, std::chrono::seconds(ES_SEC_DISCOVERY_TIMEOUT)); + + if(aclResult) + { + res = ESResult::ES_OK; + } + + return res; + } + + std::string EnrolleeSecurity::getUUID() const + { + return m_ocResource->sid(); + }; + + OicSecAcl_t* EnrolleeSecurity::createAcl(OicUuid_t cloudUuid) + { + // allocate memory for |acl| struct + OicSecAcl_t* acl = (OicSecAcl_t*) OICCalloc(1, sizeof(OicSecAcl_t)); + if(!acl) + { + OIC_LOG(DEBUG, ENROLEE_SECURITY_TAG, "createAcl: OICCalloc error return"); + return NULL; // not need to 'goto' |ERROR| before allocating |acl| + } + OicSecAce_t* ace = (OicSecAce_t*) OICCalloc(1, sizeof(OicSecAce_t)); + if(!ace) + { + OIC_LOG(DEBUG, ENROLEE_SECURITY_TAG, "createAcl: OICCalloc error return"); + return NULL; // not need to 'goto' |ERROR| before allocating |acl| + } + LL_APPEND(acl->aces, ace); + + memcpy(&ace->subjectuuid, &cloudUuid, UUID_LENGTH); + + OicSecRsrc_t* rsrc = (OicSecRsrc_t*)OICCalloc(1, sizeof(OicSecRsrc_t)); + if(!rsrc) + { + OIC_LOG(DEBUG, ENROLEE_SECURITY_TAG, "createAcl: OICCalloc error return"); + OCDeleteACLList(acl); + return NULL; + } + + char href[] = "*"; + size_t len = strlen(href)+1; // '1' for null termination + rsrc->href = (char*) OICCalloc(len, sizeof(char)); + if(!rsrc->href) + { + OIC_LOG(DEBUG, ENROLEE_SECURITY_TAG, "createAcl: OICCalloc error return"); + OCDeleteACLList(acl); + return NULL; + } + OICStrcpy(rsrc->href, len, href); + + size_t arrLen = 1; + rsrc->typeLen = arrLen; + rsrc->types = (char**)OICCalloc(arrLen, sizeof(char*)); + rsrc->interfaces = (char**)OICCalloc(arrLen, sizeof(char*)); + rsrc->types[0] = OICStrdup("rt"); // ignore + rsrc->interfaces[0] = OICStrdup("if"); // ignore + + LL_APPEND(ace->resources, rsrc); + + ace->permission = 31; // R/W/U/D + + return acl; + } + + void EnrolleeSecurity::ACLProvisioningCb(PMResultList_t *result, int hasError) + { + if (hasError) + { + OIC_LOG(DEBUG, ENROLEE_SECURITY_TAG, "Error in provisioning operation!"); + aclResult = false; + } + else + { + OIC_LOG(DEBUG, ENROLEE_SECURITY_TAG, "Received provisioning results: "); + + std::string devUuid; + for (unsigned int i = 0; i < result->size(); i++) + { + convertUUIDToString(result->at(i).deviceId, devUuid); + OIC_LOG_V(DEBUG, ENROLEE_SECURITY_TAG, "Result is = %d for device %s", + result->at(i).res, devUuid.c_str()); + } + delete result; + aclResult = true; + } + m_cond.notify_all(); } } } diff --git a/service/easy-setup/mediator/richsdk/src/RemoteEnrollee.cpp b/service/easy-setup/mediator/richsdk/src/RemoteEnrollee.cpp index cb6cb7a..3760875 100755 --- a/service/easy-setup/mediator/richsdk/src/RemoteEnrollee.cpp +++ b/service/easy-setup/mediator/richsdk/src/RemoteEnrollee.cpp @@ -19,26 +19,38 @@ //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= #include "RemoteEnrollee.h" -#include "RemoteEnrolleeResource.h" +#include "EnrolleeResource.h" +#include "CloudResource.h" +#include "OCPlatform.h" #include "ESException.h" #include "logger.h" +#include "OCResource.h" #ifdef __WITH_DTLS__ #include "EnrolleeSecurity.h" +#include "base64.h" +#include "oic_malloc.h" #endif //__WITH_DTLS namespace OIC { - #define ES_REMOTE_ENROLLEE_TAG "ES_REMOTE_ENROLLEE" - namespace Service { - RemoteEnrollee::RemoteEnrollee(const ProvConfig& provConfig, const WiFiOnboadingConnection& connection) : - m_ProvConfig(provConfig), m_wifiOnboardingconn(connection) - { - m_currentESState = CurrentESState::ES_UNKNOWN; - m_isSecured = connection.isSecured; //enrolleeNWProvInfo.needSecuredEasysetup; + static const char ES_BASE_RES_URI[] = "/oic/res"; + #define ES_REMOTE_ENROLLEE_TAG "ES_REMOTE_ENROLLEE" + #define DISCOVERY_TIMEOUT 5 - OIC_LOG ( DEBUG, ES_REMOTE_ENROLLEE_TAG, "Inside RemoteEnrollee constr"); + RemoteEnrollee::RemoteEnrollee(std::shared_ptr< OC::OCResource > resource) + { + m_ocResource = resource; + m_enrolleeResource = std::make_shared(m_ocResource); + m_securityProvStatusCb = nullptr; + m_getConfigurationStatusCb = nullptr; + m_securityPinCb = nullptr; + m_secProvisioningDbPathCb = nullptr; + m_devicePropProvStatusCb = nullptr; + m_cloudPropProvStatusCb = nullptr; + + m_deviceId = resource->sid(); } #ifdef __WITH_DTLS__ @@ -56,249 +68,388 @@ namespace OIC } #endif //__WITH_DTLS__ - void RemoteEnrollee::registerEasySetupStatusHandler(EasySetupStatusCB callback) + void RemoteEnrollee::securityStatusHandler( + std::shared_ptr< SecProvisioningStatus > status) { - OIC_LOG ( DEBUG, ES_REMOTE_ENROLLEE_TAG, "Entered registerStatusHandler"); - if(!callback) - { - throw ESInvalidParameterException("Callback is empty"); - } + OIC_LOG_V(DEBUG, ES_REMOTE_ENROLLEE_TAG, "easySetupStatusCallback status is, UUID = %s," + "Status = %d", status->getDeviceUUID().c_str(), + status->getESResult()); - if (m_easySetupStatusCb) + if(status->getESResult() == ES_OK) { - throw ESBadRequestException("Callback handler already registered"); + OIC_LOG(DEBUG, ES_REMOTE_ENROLLEE_TAG, "Ownership and ACL are successful. " + "Continue with Network information provisioning"); + + OIC_LOG(DEBUG,ES_REMOTE_ENROLLEE_TAG,"Before ProvisionEnrollee"); + + m_securityProvStatusCb(status); } else { - m_easySetupStatusCb = callback; + OIC_LOG(DEBUG, ES_REMOTE_ENROLLEE_TAG, "Ownership and ACL are fail"); - m_remoteResource = std::make_shared< RemoteEnrolleeResource >(m_ProvConfig, m_wifiOnboardingconn); + m_securityProvStatusCb(status); } } - void RemoteEnrollee::easySetupSecurityStatusCallback( - std::shared_ptr< SecProvisioningResult > secProvisioningResult) + void RemoteEnrollee::getStatusHandler(std::shared_ptr< GetEnrolleeStatus > status) { - OIC_LOG_V(DEBUG, ES_REMOTE_ENROLLEE_TAG, "easySetupStatusCallback status is, UUID = %s, " - "Status = %d", secProvisioningResult->getDeviceUUID().c_str(), - secProvisioningResult->getResult()); + OIC_LOG(DEBUG,ES_REMOTE_ENROLLEE_TAG,"Entering getStatusHandler"); - if(secProvisioningResult->getResult() == ES_OK) - { - OIC_LOG(DEBUG, ES_REMOTE_ENROLLEE_TAG, "Ownership and ACL are successful. " - "Continue with Network information provisioning"); + OIC_LOG_V(DEBUG,ES_REMOTE_ENROLLEE_TAG,"getStatusHandler = %d", status->getESResult()); - m_currentESState = CurrentESState::ES_OWNED; + m_getStatusCb(status); + } - OIC_LOG(DEBUG,ES_REMOTE_ENROLLEE_TAG,"Before ProvisionEnrollee"); + void RemoteEnrollee::getConfigurationStatusHandler ( + std::shared_ptr< GetConfigurationStatus > status) + { + OIC_LOG(DEBUG,ES_REMOTE_ENROLLEE_TAG,"Entering getConfigurationStatusHandler"); - RemoteEnrolleeResource::ProvStatusCb provStatusCb = std::bind( - &RemoteEnrollee::provisioningStatusHandler, this, std::placeholders::_1); + OIC_LOG_V(DEBUG,ES_REMOTE_ENROLLEE_TAG,"GetConfigurationStatus = %d", + status->getESResult()); - m_remoteResource->registerProvStatusCallback(provStatusCb); - m_remoteResource->provisionEnrollee(); - } - else + m_getConfigurationStatusCb(status); + } + + void RemoteEnrollee::devicePropProvisioningStatusHandler( + std::shared_ptr< DevicePropProvisioningStatus > status) + { + OIC_LOG(DEBUG,ES_REMOTE_ENROLLEE_TAG,"Entering DevicePropProvisioningStatusHandler"); + + OIC_LOG_V(DEBUG,ES_REMOTE_ENROLLEE_TAG,"ProvStatus = %d", status->getESResult()); + + m_devicePropProvStatusCb(status); + + return; + } + + void RemoteEnrollee::cloudPropProvisioningStatusHandler ( + std::shared_ptr< CloudPropProvisioningStatus > status) + { + OIC_LOG(DEBUG,ES_REMOTE_ENROLLEE_TAG,"Entering cloudPropProvisioningStatusHandler"); + + OIC_LOG_V(DEBUG,ES_REMOTE_ENROLLEE_TAG,"CloudProvStatus = %d", + status->getESCloudState()); + + m_cloudPropProvStatusCb(status); + return; + } + + void RemoteEnrollee::onDeviceDiscovered(std::shared_ptr resource) + { + OIC_LOG (DEBUG, ES_REMOTE_ENROLLEE_TAG, "onDeviceDiscovered"); + + std::string resourceURI; + std::string hostAddress; + std::string hostDeviceID; + + try { - OIC_LOG(DEBUG, ES_REMOTE_ENROLLEE_TAG, "Ownership and ACL are successful"); - std::shared_ptr< EasySetupStatus > easySetupStatus = nullptr; - easySetupStatus = std::make_shared< EasySetupStatus >(DEVICE_NOT_PROVISIONED, - m_ProvConfig); - if (m_easySetupStatusCb) + if(resource) { - if (easySetupStatus) + if(!(resource->connectivityType() & CT_ADAPTER_TCP)) { - m_easySetupStatusCb(easySetupStatus); - } - else - { - m_easySetupStatusCb(nullptr); + // Get the resource URI + resourceURI = resource->uri(); + OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_TAG, + "URI of the resource: %s", resourceURI.c_str()); + + // Get the resource host address + hostAddress = resource->host(); + OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_TAG, + "Host address of the resource: %s", hostAddress.c_str()); + + hostDeviceID = resource->sid(); + OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_TAG, + "Host DeviceID of the resource: %s", hostDeviceID.c_str()); + + if(!m_deviceId.empty() && m_deviceId == hostDeviceID) + { + OIC_LOG (DEBUG, ES_REMOTE_ENROLLEE_TAG, "Find matched CloudResource"); + m_ocResource = resource; + m_discoveryResponse = true; + m_cond.notify_all(); + } } } } + catch(std::exception& e) + { + OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_TAG, + "Exception in foundResource: %s", e.what()); + } } - void RemoteEnrollee::provisioningStatusHandler( - std::shared_ptr< ProvisioningStatus > provStatus) + ESResult RemoteEnrollee::discoverResource() { - OIC_LOG(DEBUG,ES_REMOTE_ENROLLEE_TAG,"Entering ProvisioningStatusHandler"); + OIC_LOG(DEBUG, ES_REMOTE_ENROLLEE_TAG, "Enter discoverResource"); + + std::string query(""); + query.append(ES_BASE_RES_URI); + query.append("?rt="); + query.append(OC_RSRVD_ES_RES_TYPE_PROV); + + OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_TAG, "query = %s", query.c_str()); - OIC_LOG_V(DEBUG,ES_REMOTE_ENROLLEE_TAG,"ProvStatus = %d", provStatus->getESResult()); + m_discoveryResponse = false; - std::shared_ptr< EasySetupStatus > easySetupStatus = nullptr; + std::function< void (std::shared_ptr) > onDeviceDiscoveredCb = + std::bind(&RemoteEnrollee::onDeviceDiscovered, this, + std::placeholders::_1); + OCStackResult result = OC::OCPlatform::findResource("", query, CT_DEFAULT, + onDeviceDiscoveredCb); - if (m_isSecured) + if (result != OCStackResult::OC_STACK_OK) { - if (m_currentESState >= CurrentESState::ES_OWNED) - { - goto CALLBACK_CHECK; - } - else - { - goto FAILURE; - } + OIC_LOG(ERROR,ES_REMOTE_ENROLLEE_TAG, + "Failed discoverResource"); + return ES_ERROR; } - else + + std::unique_lock lck(m_discoverymtx); + m_cond.wait_for(lck, std::chrono::seconds(DISCOVERY_TIMEOUT)); + + if (!m_discoveryResponse) { - goto CALLBACK_CHECK; + OIC_LOG(ERROR,ES_REMOTE_ENROLLEE_TAG, + "Failed discoverResource because timeout"); + return ES_ERROR; } + return ES_OK; + } - CALLBACK_CHECK: + void RemoteEnrollee::provisionSecurity(SecurityProvStatusCb callback) + { +#ifdef __WITH_DTLS__ + m_securityProvStatusCb = callback; + + SecurityProvStatusCb securityProvStatusCb = std::bind( + &RemoteEnrollee::securityStatusHandler, + this, + std::placeholders::_1); + //TODO : DBPath is passed empty as of now. Need to take dbpath from application. + m_enrolleeSecurity = std::make_shared (m_ocResource, ""); - if (provStatus->getESResult() == ES_OK) + m_enrolleeSecurity->registerCallbackHandler(securityProvStatusCb, m_securityPinCb, + m_secProvisioningDbPathCb); + + try { - if (provStatus->getESState() >= ESState::ES_PROVISIONED_ALREADY) - { - easySetupStatus = std::make_shared< EasySetupStatus >(DEVICE_PROVISIONED, - m_ProvConfig); - } - else - { - easySetupStatus = std::make_shared< EasySetupStatus >(DEVICE_NOT_PROVISIONED, - m_ProvConfig); - } + m_enrolleeSecurity->performOwnershipTransfer(); } - else + catch (const std::exception& e) { - easySetupStatus = std::make_shared< EasySetupStatus >(DEVICE_NOT_PROVISIONED, - m_ProvConfig); + OIC_LOG_V(ERROR, ES_REMOTE_ENROLLEE_TAG, + "Exception for performOwnershipTransfer : %s", e.what()); + + OIC_LOG(DEBUG,ES_REMOTE_ENROLLEE_TAG,"Fail performOwnershipTransfer"); + std::shared_ptr< SecProvisioningStatus > securityProvisioningStatus = + std::make_shared< SecProvisioningStatus > + (m_enrolleeSecurity->getUUID(), ES_ERROR); + m_securityProvStatusCb(securityProvisioningStatus); + return ; } +#else + OIC_LOG(DEBUG,ES_REMOTE_ENROLLEE_TAG,"Mediator is unsecured."); - if (m_easySetupStatusCb) + std::shared_ptr< SecProvisioningStatus > securityProvisioningStatus = + std::make_shared< SecProvisioningStatus > + ("", ES_UNSUPPORTED_OPERATION); + m_securityProvStatusCb(securityProvisioningStatus); +#endif + } + + void RemoteEnrollee::getStatus(GetStatusCb callback) + { + if(!callback) { - if (easySetupStatus) - { - m_easySetupStatusCb(easySetupStatus); - } - else - { - m_easySetupStatusCb(nullptr); - } + throw ESInvalidParameterException("Callback is empty"); } - return; + if (m_enrolleeResource == nullptr) + { + throw ESBadRequestException ("Device not created"); + } + + m_getStatusCb = callback; - FAILURE: + GetStatusCb getStatusCb = std::bind( + &RemoteEnrollee::getStatusHandler, this, std::placeholders::_1); + m_enrolleeResource->registerGetStatusCallback(getStatusCb); + m_enrolleeResource->getStatus(); - easySetupStatus = std::make_shared< EasySetupStatus >(DEVICE_NOT_PROVISIONED, - m_ProvConfig); + } - if (easySetupStatus) + void RemoteEnrollee::getConfiguration(GetConfigurationStatusCb callback) + { + if(!callback) { - m_easySetupStatusCb(easySetupStatus); + throw ESInvalidParameterException("Callback is empty"); } - else + + if (m_enrolleeResource == nullptr) { - m_easySetupStatusCb(nullptr); + throw ESBadRequestException ("Device not created"); } - return; + + m_getConfigurationStatusCb = callback; + + GetConfigurationStatusCb getConfigurationStatusCb = std::bind( + &RemoteEnrollee::getConfigurationStatusHandler, this, std::placeholders::_1); + m_enrolleeResource->registerGetConfigurationStatusCallback(getConfigurationStatusCb); + m_enrolleeResource->getConfiguration(); } - void RemoteEnrollee::startProvisioning() + void RemoteEnrollee::provisionDeviceProperties(const DeviceProp& deviceProp, + DevicePropProvStatusCb callback) { - OIC_LOG(DEBUG,ES_REMOTE_ENROLLEE_TAG,"Entering startProvisioning"); - if (m_remoteResource == nullptr) + OIC_LOG(DEBUG,ES_REMOTE_ENROLLEE_TAG,"Enter provisionDeviceProperties"); + + if(!callback) + { + throw ESInvalidParameterException("Callback is empty"); + } + + m_devicePropProvStatusCb = callback; + + if (m_enrolleeResource == nullptr) { throw ESBadRequestException ("Device not created"); } + if(deviceProp.getSsid().empty()) + { + throw ESBadRequestException ("Invalid Provisiong Data."); + } + + DevicePropProvStatusCb devicePropProvStatusCb = std::bind( + &RemoteEnrollee::devicePropProvisioningStatusHandler, + this, std::placeholders::_1); + + m_enrolleeResource->registerDevicePropProvStatusCallback(devicePropProvStatusCb); + m_enrolleeResource->provisionEnrollee(deviceProp); + } + + void RemoteEnrollee::initCloudResource() + { ESResult result = ES_ERROR; - result = m_remoteResource->constructResourceObject(); + if (m_cloudResource != nullptr) + { + throw ESBadRequestException ("Already created"); + } + + result = discoverResource(); if (result == ES_ERROR) { OIC_LOG(ERROR,ES_REMOTE_ENROLLEE_TAG, - "Failed to create device using constructResourceObject"); - throw ESBadRequestException ("Device not created"); + "Failed to create resource object using discoverResource"); + throw ESBadRequestException ("Resource object not created"); } - m_currentESState = CurrentESState::ES_ONBOARDED; - -#ifdef __WITH_DTLS__ - if (m_isSecured && m_currentESState < CurrentESState::ES_OWNED) + else { - EnrolleeSecStatusCb securityProvStatusCb = std::bind( - &RemoteEnrollee::easySetupSecurityStatusCallback, - this, - std::placeholders::_1); - //TODO : DBPath is passed empty as of now. Need to take dbpath from application. - m_enrolleeSecurity = std::make_shared (m_remoteResource, ""); - - m_enrolleeSecurity->registerCallbackHandler(securityProvStatusCb, - m_securityPinCb, m_secProvisioningDbPathCb); - - try + if(m_ocResource != nullptr) { - EasySetupState easySetupState = m_enrolleeSecurity->performOwnershipTransfer(); - if (easySetupState == DEVICE_NOT_OWNED) - { - OIC_LOG_V(DEBUG, ES_REMOTE_ENROLLEE_TAG, - "performOwnershipTransfer returned : %d", - easySetupState); - return; - } - else if (easySetupState == DEVICE_OWNED) - { - OIC_LOG_V(DEBUG, ES_REMOTE_ENROLLEE_TAG, - "performOwnershipTransfer returned : %d", - easySetupState); - OIC_LOG(DEBUG,ES_REMOTE_ENROLLEE_TAG,"Before ProvisionEnrollee"); + m_cloudResource = std::make_shared(m_ocResource); - RemoteEnrolleeResource::ProvStatusCb provStatusCb = std::bind( - &RemoteEnrollee::provisioningStatusHandler, - this, std::placeholders::_1); + std::shared_ptr< CloudPropProvisioningStatus > provStatus = std::make_shared< + CloudPropProvisioningStatus >(ESResult::ES_OK, + ESCloudProvState::ES_CLOUD_ENROLLEE_FOUND); - m_remoteResource->registerProvStatusCallback(provStatusCb); - m_remoteResource->provisionEnrollee(); - } + m_cloudPropProvStatusCb(provStatus); } - catch (OCException & e) + else { - OIC_LOG_V(ERROR, ES_REMOTE_ENROLLEE_TAG, - "Exception for performOwnershipTransfer : %s", e.reason().c_str()); - return ; + throw ESBadGetException ("Resource handle is invalid"); } } -#else - OIC_LOG(DEBUG,ES_REMOTE_ENROLLEE_TAG,"Before ProvisionEnrollee"); - - RemoteEnrolleeResource::ProvStatusCb provStatusCb = std::bind( - &RemoteEnrollee::provisioningStatusHandler, this, std::placeholders::_1); - - m_remoteResource->registerProvStatusCallback(provStatusCb); - m_remoteResource->provisionEnrollee(); -#endif } - void RemoteEnrollee::stopProvisioning() + void RemoteEnrollee::provisionCloudProperties(const CloudProp& cloudProp, + CloudPropProvStatusCb callback) { - m_currentESState = CurrentESState::ES_UNKNOWN; + OIC_LOG(DEBUG,ES_REMOTE_ENROLLEE_TAG,"Enter provisionCloudProperties"); + ESResult res = ES_OK; - m_remoteResource->unprovisionEnrollee(); - } + if(!callback) + { + throw ESInvalidParameterException("Callback is empty"); + } - bool RemoteEnrollee::isEnrolleeProvisioned() - { - if(m_currentESState >= CurrentESState::ES_PROVISIONED) + m_cloudPropProvStatusCb = callback; + + if(cloudProp.getAuthCode().empty() || + cloudProp.getAuthProvider().empty() || + cloudProp.getCiServer().empty()) { - return true; + throw ESBadRequestException ("Invalid Cloud Provisiong Info."); } - else + + try { - return false; + initCloudResource(); } - } - ProvConfig RemoteEnrollee::getProvConfig () - { - return m_ProvConfig; - } + catch (const std::exception& e) + { + OIC_LOG_V(ERROR, ES_REMOTE_ENROLLEE_TAG, + "Exception caught in provisionCloudProperties = %s", e.what()); + + std::shared_ptr< CloudPropProvisioningStatus > provStatus = std::make_shared< + CloudPropProvisioningStatus >(ESResult::ES_ERROR, + ESCloudProvState::ES_CLOUD_ENROLLEE_NOT_FOUND); + m_cloudPropProvStatusCb(provStatus); + return; + } + +#ifdef __WITH_DTLS__ + try + { + m_enrolleeSecurity = std::make_shared (m_ocResource, ""); + + if(cloudProp.getCloudID().empty()) + { + throw ESBadRequestException("Invalid Cloud Server UUID."); + } + + res = m_enrolleeSecurity->performACLProvisioningForCloudServer(cloudProp.getCloudID()); + + if(res == ESResult::ES_ERROR) + { + throw ESBadRequestException("Error in provisioning operation!"); + } + + } - WiFiOnboadingConnection RemoteEnrollee::getOnboardConn() - { - return m_wifiOnboardingconn; - } + catch (const std::exception& e) + { + OIC_LOG_V(ERROR, ES_REMOTE_ENROLLEE_TAG, + "Exception caught in provisionCloudProperties = %s", e.what()); + + m_cloudResource = nullptr; + + std::shared_ptr< CloudPropProvisioningStatus > provStatus = std::make_shared< + CloudPropProvisioningStatus >(ESResult::ES_ERROR, + ESCloudProvState::ES_CLOUD_PROVISIONING_ERROR); + m_cloudPropProvStatusCb(provStatus); + return; + } +#endif + if (m_cloudResource == nullptr) + { + throw ESBadRequestException ("Cloud Resource not created"); + } + + CloudPropProvStatusCb cloudPropProvStatusCb = std::bind( + &RemoteEnrollee::cloudPropProvisioningStatusHandler, + this, std::placeholders::_1); + + m_cloudResource->registerCloudPropProvisioningStatusCallback(cloudPropProvStatusCb); + m_cloudResource->provisionEnrollee(cloudProp); + } } } diff --git a/service/easy-setup/mediator/richsdk/src/RemoteEnrolleeResource.cpp b/service/easy-setup/mediator/richsdk/src/RemoteEnrolleeResource.cpp deleted file mode 100755 index 7d4ff41..0000000 --- a/service/easy-setup/mediator/richsdk/src/RemoteEnrolleeResource.cpp +++ /dev/null @@ -1,486 +0,0 @@ -//****************************************************************** -// -// Copyright 2015 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -#include -#include - -#include "RemoteEnrolleeResource.h" - -#include "OCPlatform.h" -#include "ESException.h" -#include "OCResource.h" -#include "logger.h" - -namespace OIC -{ - namespace Service - { - #define ES_REMOTE_ENROLLEE_RES_TAG "ES_REMOTE_ENROLLEE_RES" - #define DISCOVERY_TIMEOUT 5 - - static const char ES_BASE_RES_URI[] = "/oic/res"; - static const char ES_PROV_RES_URI[] = "/oic/prov"; - static const char ES_PROV_RES_TYPE[] = "oic.r.prov"; - - RemoteEnrolleeResource::RemoteEnrolleeResource(const ProvConfig &provConfig, - const WiFiOnboadingConnection &onboardingconn) - { - m_ProvConfig = provConfig; - m_wifiOnboardingconn = onboardingconn; - m_discoveryResponse = false; - } - - void RemoteEnrolleeResource::triggerNetworkConnectionCb( - const HeaderOptions& /*headerOptions*/, const OCRepresentation& rep, - const int eCode) - { - OC_UNUSED(rep); - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, "checkProvInformationCb : %s, eCode = %d", - rep.getUri().c_str(), - eCode); - - if (eCode != 0) - { - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, - "triggerNetworkConnectionCb : Trigger action failed "); - std::shared_ptr< ProvisioningStatus > provStatus = std::make_shared< - ProvisioningStatus >(ESResult::ES_ERROR, ESState::ES_PROVISIONING_ERROR); - m_provStatusCb(provStatus); - return; - } - else - { - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, - "triggerNetworkConnectionCb : Provisioning is success "); - std::shared_ptr< ProvisioningStatus > provStatus = std::make_shared< - ProvisioningStatus >(ESResult::ES_OK, ESState::ES_PROVISIONING_SUCCESS); - m_provStatusCb(provStatus); - return; - } - } - - void RemoteEnrolleeResource::triggerNetworkConnection() - { - if (m_ocResource == nullptr) - { - throw ESBadRequestException("Resource is not initialized"); - } - - OCRepresentation provisioningRepresentation; - - provisioningRepresentation.setValue(OC_RSRVD_ES_TR, 1); - - m_ocResource->post(provisioningRepresentation, QueryParamsMap(), - std::function< - void(const HeaderOptions& headerOptions, const OCRepresentation& rep, - const int eCode) >( - std::bind(&RemoteEnrolleeResource::triggerNetworkConnectionCb, this, - std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3))); - } - - void RemoteEnrolleeResource::checkProvInformationCb(const HeaderOptions& /*headerOptions*/, - const OCRepresentation& rep, const int eCode) - { - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, "checkProvInformationCb : %s, eCode = %d", - rep.getUri().c_str(), - eCode); - - if (eCode != 0) - { - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, - "checkProvInformationCb : Provisioning is failed "); - std::shared_ptr< ProvisioningStatus > provStatus = std::make_shared< - ProvisioningStatus >(ESResult::ES_ERROR, ESState::ES_PROVISIONING_ERROR); - m_provStatusCb(provStatus); - return; - } - - int ps = -1; - - rep.getValue(OC_RSRVD_ES_PS, ps); - - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, "checkProvInformationCb : ps - %d", ps); - - //Provisioning status check - if (ps == ES_PS_PROVISIONING_COMPLETED) - { - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, - "checkProvInformationCb : Provisioning is success. " - "Now trigger network connection "); - - #ifdef REMOTE_ARDUINO_ENROLEE - std::shared_ptr< ProvisioningStatus > provStatus = std::make_shared< - ProvisioningStatus >(ESResult::ES_OK, ESState::ES_PROVISIONING_SUCCESS); - m_provStatusCb(provStatus); - #endif - - triggerNetworkConnection(); - return; - } - else - { - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, - "checkProvInformationCb : Provisioning is failed "); - std::shared_ptr< ProvisioningStatus > provStatus = std::make_shared< - ProvisioningStatus >(ESResult::ES_ERROR, ESState::ES_PROVISIONING_ERROR); - m_provStatusCb(provStatus); - return; - } - } - - void RemoteEnrolleeResource::getProvStatusResponse(const HeaderOptions& /*headerOptions*/, - const OCRepresentation& rep, const int eCode) - { - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, "getProvStatusResponse : %s, eCode = %d", - rep.getUri().c_str(), - eCode); - - if (eCode != 0) - { - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, - "getProvStatusResponse : Provisioning is failed "); - std::shared_ptr< ProvisioningStatus > provStatus = std::make_shared< - ProvisioningStatus >(ESResult::ES_ERROR, ESState::ES_PROVISIONING_ERROR); - m_provStatusCb(provStatus); - return; - } - - int ps = -1; - - rep.getValue(OC_RSRVD_ES_PS, ps); - - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, "getProvStatusResponse : ps - %d", - ps); - - if (ps == ES_PS_NEED_PROVISIONING) //Indicates the need for provisioning - { - OCRepresentation provisioningRepresentation; - - provisioningRepresentation.setValue(OC_RSRVD_ES_TNN, - std::string(m_ProvConfig.provData.WIFI.ssid)); - provisioningRepresentation.setValue(OC_RSRVD_ES_CD, - std::string(m_ProvConfig.provData.WIFI.pwd)); - - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, "getProvStatusResponse : ssid - %s", - m_ProvConfig.provData.WIFI.ssid); - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, "getProvStatusResponse : pwd - %s", - m_ProvConfig.provData.WIFI.pwd); - - m_ocResource->post(provisioningRepresentation, QueryParamsMap(), - std::function< - void(const HeaderOptions& headerOptions, - const OCRepresentation& rep, const int eCode) >( - std::bind(&RemoteEnrolleeResource::checkProvInformationCb, this, - std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3))); - } - else if (ps == ES_PS_PROVISIONING_COMPLETED) //Indicates that provisioning is completed - { - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, - "getProvStatusResponse : Provisioning is successful"); - std::shared_ptr< ProvisioningStatus > provStatus = std::make_shared< - ProvisioningStatus >(ESResult::ES_OK, ESState::ES_PROVISIONED_ALREADY); - m_provStatusCb(provStatus); - } - } - - void RemoteEnrolleeResource::registerProvStatusCallback(ProvStatusCb provStatusCb) - { - m_provStatusCb = provStatusCb; - } - - ESResult RemoteEnrolleeResource::ESDiscoveryTimeout(unsigned short waittime) - { - struct timespec startTime; - startTime.tv_sec=0; - startTime.tv_sec=0; - struct timespec currTime; - currTime.tv_sec=0; - currTime.tv_nsec=0; - - ESResult res = ES_OK; - #ifdef _POSIX_MONOTONIC_CLOCK - int clock_res = clock_gettime(CLOCK_MONOTONIC, &startTime); - #else - int clock_res = clock_gettime(CLOCK_REALTIME, &startTime); - #endif - - if (0 != clock_res) - { - return ES_ERROR; - } - - while (ES_OK == res || m_discoveryResponse == false) - { - #ifdef _POSIX_MONOTONIC_CLOCK - clock_res = clock_gettime(CLOCK_MONOTONIC, &currTime); - #else - clock_res = clock_gettime(CLOCK_REALTIME, &currTime); - #endif - - if (0 != clock_res) - { - return ES_ERROR; - } - long elapsed = (currTime.tv_sec - startTime.tv_sec); - if (elapsed > waittime) - { - return ES_OK; - } - if (m_discoveryResponse) - { - res = ES_OK; - } - } - return res; - } - - void RemoteEnrolleeResource::onDeviceDiscovered(std::shared_ptr resource) - { - OIC_LOG (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, "onDeviceDiscovered"); - - std::string resourceURI; - std::string hostAddress; - try - { - if(resource) - { - // Get the resource URI - resourceURI = resource->uri(); - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, - "URI of the resource: %s", resourceURI.c_str()); - - // Get the resource host address - hostAddress = resource->host(); - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, - "Host address of the resource: %s", hostAddress.c_str()); - - /* - * Easysetup is always performed with a single Enrollee device and - * in a private network (SoftAP or BLE), so the assumption is that - * only the intended device will respond for the discovery. - * With the above assumption the below two statements are written. - */ - m_ocResource = resource; - m_discoveryResponse = true; - } - else - { - OIC_LOG (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, "Resource is invalid"); - } - - } - catch(std::exception& e) - { - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, - "Exception in foundResource: %s", e.what()); - } - } - - - ESResult RemoteEnrolleeResource::constructResourceObject() - { - if (m_ocResource != nullptr) - { - throw ESBadRequestException("Remote resource is already created"); - } - -#ifdef REMOTE_ARDUINO_ENROLEE - //This process will create OCResource with port 55555 which is specific - // to Arduino WiFi enrollee - try - { - - std::vector< std::string > interface = - { DEFAULT_INTERFACE}; - std::vector< std::string > resTypes = - { ES_PROV_RES_TYPE}; - - OIC_LOG(DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, "Before OCPlatform::constructResourceObject"); - - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, "m_host = %s", - m_wifiOnboardingconn.ipAddress); - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, "ES_PROV_RES_URI = %s", ES_PROV_RES_URI); - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, "m_connectivityType = %d", - m_ProvConfig.connType); - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, "resTypes = %s", - resTypes.at(0).c_str()); - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, "interface = %s", interface.at(0).c_str()); - - std::string host; - if(m_wifiOnboardingconn.isSecured) - { - host.append("coaps://"); - } - else - { - host.append("coap://"); - } - - if(m_ProvConfig.connType == CT_ADAPTER_IP) - { - // TODO : RemoteEnrollee is current handling easysetup on IP transport. - // WiFiRemoteEnrollee need to extend RemoteEnrollee for providing IP specific - // Enrollee easysetup. - - host.append(m_wifiOnboardingconn.ipAddress); - //TODO : If the target Enrollee is not a Arduino Wi-Fi device, - // then the port number will be found during resource discovery instead of - // using 55555 - host.append(":55555"); - } - - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, "HOST = %s", host.c_str()); - - m_ocResource = OC::OCPlatform::constructResourceObject(host, - ES_PROV_RES_URI, - m_ProvConfig.connType, - true, - resTypes, - interface); - OIC_LOG_V(DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, - "created OCResource : %s", m_ocResource->uri().c_str()); - - return ES_OK; - } - catch (OCException & e) - { - OIC_LOG_V(ERROR, ES_REMOTE_ENROLLEE_RES_TAG, - "Exception for constructResourceObject : %s", e.reason().c_str()); - return ES_ERROR; - } -#else - std::string host(""); - std::string query(""); - - if (m_wifiOnboardingconn.isSecured) - { - host.append("coaps://"); - } - else - { - host.append("coap://"); - } - - if (m_ProvConfig.connType == CT_ADAPTER_IP) - { - // TODO : RemoteEnrollee is current handling easysetup on IP transport. - // WiFiRemoteEnrollee need to extend RemoteEnrollee for providing IP specific - // Enrollee easysetup. - - host.append(m_wifiOnboardingconn.ipAddress); - } - - query.append(ES_BASE_RES_URI); - query.append("?rt="); - query.append(ES_PROV_RES_TYPE); - - OIC_LOG(DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, "Before OCPlatform::constructResourceObject"); - - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, "host = %s", - host.c_str()); - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, "query = %s", query.c_str()); - OIC_LOG_V (DEBUG, ES_REMOTE_ENROLLEE_RES_TAG, "m_connectivityType = %d", - m_ProvConfig.connType); - - m_discoveryResponse = false; - std::function< void (std::shared_ptr) > onDeviceDiscoveredCb = - std::bind(&RemoteEnrolleeResource::onDeviceDiscovered, this, - std::placeholders::_1); - OCStackResult result = OC::OCPlatform::findResource("", query, CT_DEFAULT, - onDeviceDiscoveredCb); - - if (result != OCStackResult::OC_STACK_OK) - { - OIC_LOG(ERROR,ES_REMOTE_ENROLLEE_RES_TAG, - "Failed to create device using constructResourceObject"); - return ES_ERROR; - } - - - ESResult foundResponse = ESDiscoveryTimeout (DISCOVERY_TIMEOUT); - - if (foundResponse ==ES_ERROR || !m_discoveryResponse) - { - OIC_LOG(ERROR,ES_REMOTE_ENROLLEE_RES_TAG, - "Failed to create device using constructResourceObject"); - return ES_ERROR; - } - - return ES_OK; -#endif - } - - void RemoteEnrolleeResource::provisionEnrollee() - - { - if (m_ocResource == nullptr) - { - throw ESBadRequestException("Resource is not initialized"); - } - - OC::QueryParamsMap query; - OC::OCRepresentation rep; - - std::function< OCStackResult(void) > getProvisioingStatus = [&] - { return m_ocResource->get(m_ocResource->getResourceTypes().at(0), - m_ocResource->getResourceInterfaces().at(0), query, - std::function< - void(const HeaderOptions& headerOptions, const OCRepresentation& rep, - const int eCode) >( - std::bind(&RemoteEnrolleeResource::getProvStatusResponse, this, - std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3))); - }; - - OCStackResult result = getProvisioingStatus(); - - if (result != OCStackResult::OC_STACK_OK) - { - std::shared_ptr< ProvisioningStatus > provStatus = std::make_shared< - ProvisioningStatus >(ESResult::ES_ERROR, ESState::ES_PROVISIONING_ERROR); - m_provStatusCb(provStatus); - return; - } - } - - void RemoteEnrolleeResource::unprovisionEnrollee() - { - if (m_ocResource == nullptr) - { - throw ESBadRequestException("Resource is not initialized"); - } - - OCRepresentation provisioningRepresentation; - - provisioningRepresentation.setValue(OC_RSRVD_ES_TNN, ""); - provisioningRepresentation.setValue(OC_RSRVD_ES_CD, ""); - - m_ocResource->post(provisioningRepresentation, QueryParamsMap(), - std::function< - void(const HeaderOptions& headerOptions, const OCRepresentation& rep, - const int eCode) >( - std::bind(&RemoteEnrolleeResource::checkProvInformationCb, this, - std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3))); - } - } -} diff --git a/service/easy-setup/mediator/richsdk/unittests/ESEnrolleeSimulator.h b/service/easy-setup/mediator/richsdk/unittests/ESEnrolleeSimulator.h new file mode 100644 index 0000000..fc91bbe --- /dev/null +++ b/service/easy-setup/mediator/richsdk/unittests/ESEnrolleeSimulator.h @@ -0,0 +1,97 @@ +//****************************************************************** +// +// Copyright 2016 Samsung Electronics All Rights Reserved. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +#ifndef _ES_MEDIATOR_SIMULATOR_H_ +#define _ES_MEDIATOR_SIMULATOR_H_ + +#include + +#include "OCPlatform.h" +#include "OCApi.h" +#include "oic_malloc.h" + +#include "escommon.h" +#include "ESEnrolleeCommon.h" +#include "easysetup.h" + +#define PROV_RESOURCE_TYPE "ocf.wk.prov" + +class ESEnrolleeSimulator +{ +public: + ESEnrolleeSimulator() + { + }; + ~ESEnrolleeSimulator() = default; + + ESEnrolleeSimulator(const ESEnrolleeSimulator &) = delete; + ESEnrolleeSimulator & operator = (const ESEnrolleeSimulator &) = delete; + + ESEnrolleeSimulator(ESEnrolleeSimulator &&) = delete; + ESEnrolleeSimulator & operator = (ESEnrolleeSimulator &&) = delete; + + ESResult initEnrollee() + { + ESResourceMask resourcemMask = (ESResourceMask)(ES_WIFI_RESOURCE | + ES_CLOUD_RESOURCE | + ES_DEVCONF_RESOURCE); + ESProvisioningCallbacks callbacks; + + callbacks.WiFiProvCb = &onWiFiProvisioning; + callbacks.DevConfProvCb = &onDevConfProvisioning; + callbacks.CloudDataProvCb = &onCloudProvisioning; + + return ESInitEnrollee(false, resourcemMask, callbacks); + } + + ESResult setDeviceProperty() + { + ESDeviceProperty deviceProperty = { + {{WIFI_11G, WiFi_EOF}, WIFI_5G}, {"Test Device"} + }; + + return ESSetDeviceProperty(&deviceProperty); + } + + ESResult setESState() + { + return ESSetState(ES_STATE_CONNECTED_TO_ENROLLER); + } + + ESResult setESErrorCode() + { + return ESSetErrorCode(ES_ERRCODE_NO_INTERNETCONNECTION); + } + +private: + static void onWiFiProvisioning(ESWiFiProvData* /*data*/) + { + } + + static void onDevConfProvisioning(ESDevConfProvData* /*data*/) + { + } + + static void onCloudProvisioning(ESCloudProvData* /*data*/) + { + } +}; + +#endif //_NS_CONSUMER_SIMULATOR_H_ diff --git a/service/easy-setup/mediator/richsdk/unittests/ESMediatorTest.cpp b/service/easy-setup/mediator/richsdk/unittests/ESMediatorTest.cpp new file mode 100644 index 0000000..0110b64 --- /dev/null +++ b/service/easy-setup/mediator/richsdk/unittests/ESMediatorTest.cpp @@ -0,0 +1,438 @@ +//****************************************************************** +// +// Copyright 2016 Samsung Electronics All Rights Reserved. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +#include +#include +#include +#include +#include +#include +#include + +#include "ESEnrolleeSimulator.h" +#include "escommon.h" +#include "ESRichCommon.h" +#include "EasySetup.h" +#include "RemoteEnrollee.h" + +#include "ESEnrolleeCommon.h" +#include "easysetup.h" + +#define PROV_RESOURCE_TYPE "ocf.wk.prov" + +using namespace OC; +using namespace OIC::Service; + +namespace +{ + std::atomic_bool g_isStartedStack(false); + + std::chrono::milliseconds g_waitForResponse(1000); + + std::condition_variable responseCon; + std::mutex mutexForCondition; + + ESEnrolleeSimulator g_enrolleeSimul; + std::shared_ptr g_remoteEnrollee; +} + +class TestWithMock: public testing::Test +{ +public: + MockRepository mocks; + +protected: + virtual ~TestWithMock() noexcept(noexcept(std::declval().~Test())) + { + } + + virtual void TearDown() + { + try + { + mocks.VerifyAll(); + } + catch (...) + { + mocks.reset(); + throw; + } + } +}; + +class EasysetupMediatorTest : public TestWithMock +{ +public: + std::shared_ptr m_enrolleeResource; + +public: + EasysetupMediatorTest() = default; + ~EasysetupMediatorTest() = default; + + std::shared_ptr CreateNotProvResource() + { + OCConnectivityType connectivityType = CT_DEFAULT; + std::vector types = {"ocf.wk.notprov"}; + std::vector ifaces = {DEFAULT_INTERFACE}; + + return OCPlatform::constructResourceObject("coap://192.168.1.2:5000", + "/NotProvisioningResURI", + connectivityType, + false, + types, + ifaces); + } + + void discoverRemoteEnrollee() + { + std::string uri = std::string("/oic/res?rt=") + PROV_RESOURCE_TYPE; + OC::OCPlatform::findResource("", uri, + OCConnectivityType::CT_DEFAULT, + std::bind(&EasysetupMediatorTest::discoverRemoteEnrolleeCb, + this, std::placeholders::_1)); + + std::unique_lock< std::mutex > lock{ mutexForCondition }; + responseCon.wait_for(lock, g_waitForResponse); + } + +protected: + void SetUp() + { + TestWithMock::SetUp(); + if (g_isStartedStack == false) + { + if (OCInit(NULL, 0, OC_CLIENT_SERVER) != OC_STACK_OK) + { + printf("OCStack init error!!\n"); + return; + } + g_enrolleeSimul.initEnrollee(); + g_isStartedStack = true; + } + } + + void TearDown() + { + TestWithMock::TearDown(); + } + +private: + void discoverRemoteEnrolleeCb(std::shared_ptr resource) + { + if(!resource->getResourceTypes().at(0).compare(PROV_RESOURCE_TYPE)) + { + m_enrolleeResource = resource; + } + } +}; + +TEST_F(EasysetupMediatorTest, createremoteenrolleeFailedWithNotProvResource) +{ + auto remoteEnrollee = EasySetup::getInstance()->createRemoteEnrollee(CreateNotProvResource()); + + EXPECT_EQ(nullptr, remoteEnrollee); +} + +TEST_F(EasysetupMediatorTest, createremoteenrolleeSucceedWithProvResource) +{ + discoverRemoteEnrollee(); + g_remoteEnrollee = EasySetup::getInstance()->createRemoteEnrollee(m_enrolleeResource); + + ASSERT_NE(nullptr, g_remoteEnrollee); +} + +class GetConfigurationTest : public EasysetupMediatorTest +{ +public: + GetConfigurationTest() = default; + ~GetConfigurationTest() = default; + + static void onGetConfigurationCb(shared_ptr< GetConfigurationStatus > /*status*/) + { + } + +protected: + void SetUp() + { + TestWithMock::SetUp(); + } + + void TearDown() + { + TestWithMock::TearDown(); + } +}; + +TEST_F(GetConfigurationTest, ThrowExceptionWhenGetConfigurationFailedByCallbackIsNull) +{ + EXPECT_ANY_THROW(g_remoteEnrollee->getConfiguration(nullptr)); +} + +TEST_F(GetConfigurationTest, GetConfigurationSucceed) +{ + bool isWellConstructed = false; + + g_enrolleeSimul.setDeviceProperty(); + + mocks.ExpectCallFunc(onGetConfigurationCb).Do( + [&isWellConstructed](std::shared_ptr< GetConfigurationStatus > status) + { + if(status->getESResult() == ES_OK) + { + EnrolleeConf conf = status->getEnrolleeConf(); + if(!conf.getWiFiModes().empty()) + { + if(conf.getWiFiModes().at(0) == WIFI_11G && + conf.getWiFiFreq() == WIFI_5G && + !strcmp(conf.getDeviceName().c_str(), "Test Device")) + { + isWellConstructed = true; + } + } + } + }); + + g_remoteEnrollee->getConfiguration(onGetConfigurationCb); + + std::unique_lock< std::mutex > lock{ mutexForCondition }; + responseCon.wait_for(lock, g_waitForResponse); + + EXPECT_TRUE(isWellConstructed); +} + +class GetStatusTest : public EasysetupMediatorTest +{ + +public: + GetStatusTest() = default; + ~GetStatusTest() = default; + + static void onGetStatusCb(shared_ptr< GetEnrolleeStatus > /*status*/) + { + } + +protected: + void SetUp() + { + TestWithMock::SetUp(); + } + + void TearDown() + { + TestWithMock::TearDown(); + } +}; + +TEST_F(GetStatusTest, ThrowExceptionWhenGetStatusFailedByCallbackIsNull) +{ + EXPECT_ANY_THROW(g_remoteEnrollee->getStatus(nullptr)); +} + +TEST_F(GetStatusTest, GetStatusSucceed) +{ + g_enrolleeSimul.setESState(); + g_enrolleeSimul.setESErrorCode(); + + bool isWellConstructed = false; + mocks.ExpectCallFunc(onGetStatusCb).Do( + [&isWellConstructed](std::shared_ptr< GetEnrolleeStatus > status) + { + if(status->getESResult() == ES_OK) + { + EnrolleeStatus enrolleeStatus = status->getEnrolleeStatus(); + + if(enrolleeStatus.getProvStatus() == ES_STATE_CONNECTED_TO_ENROLLER && + enrolleeStatus.getLastErrCode() == ES_ERRCODE_NO_INTERNETCONNECTION) + { + isWellConstructed = true; + } + } + }); + + g_remoteEnrollee->getStatus(onGetStatusCb); + + std::unique_lock< std::mutex > lock{ mutexForCondition }; + responseCon.wait_for(lock, g_waitForResponse); + + EXPECT_TRUE(isWellConstructed); +} + +class ProvisionDevicePropertiesTest : public EasysetupMediatorTest +{ + +public: + ProvisionDevicePropertiesTest() = default; + ~ProvisionDevicePropertiesTest() = default; + + static void deviceProvisioningStatusCb( + shared_ptr< DevicePropProvisioningStatus > /*status*/) + { + } + +protected: + void SetUp() + { + TestWithMock::SetUp(); + } + + void TearDown() + { + TestWithMock::TearDown(); + } +}; + +TEST_F(ProvisionDevicePropertiesTest, + ThrowExceptionWhenProvisionDeviceProperiesFailedByCallbackIsNull) +{ + DeviceProp devProp; + devProp.setWiFiProp("Iotivity_SSID", "Iotivity_PWD", WPA2_PSK, TKIP_AES); + devProp.setDevConfProp("korean", "Korea"); + + EXPECT_ANY_THROW(g_remoteEnrollee->provisionDeviceProperties(devProp, nullptr)); +} + +TEST_F(ProvisionDevicePropertiesTest, + ThrowExceptionWhenProvisionDeviceProperiesFailedWithoutSSID) +{ + DeviceProp devProp; + devProp.setWiFiProp("", "Iotivity_PWD", WPA2_PSK, TKIP_AES); + devProp.setDevConfProp("korean", "Korea"); + EXPECT_ANY_THROW(g_remoteEnrollee->provisionDeviceProperties(devProp, + deviceProvisioningStatusCb)); +} + +TEST_F(ProvisionDevicePropertiesTest, + ProvisionDeviceProperiesSucceed) +{ + DeviceProp devProp; + devProp.setWiFiProp("Iotivity_SSID", "Iotivity_PWD", WPA2_PSK, TKIP_AES); + devProp.setDevConfProp("korean", "Korea"); + + int cntForReceivedCallbackWithSuccess = 0; + + mocks.OnCallFunc(deviceProvisioningStatusCb).Do( + [&cntForReceivedCallbackWithSuccess] + (std::shared_ptr< DevicePropProvisioningStatus > status) + { + if(status->getESResult() == ES_OK) + { + cntForReceivedCallbackWithSuccess++; + } + + }); + + g_remoteEnrollee->provisionDeviceProperties(devProp, deviceProvisioningStatusCb); + + std::unique_lock< std::mutex > lock{ mutexForCondition }; + responseCon.wait_for(lock, g_waitForResponse); + + EXPECT_EQ(cntForReceivedCallbackWithSuccess, 1); +} + +class ProvisionCloudPropertiesTest : public EasysetupMediatorTest +{ + +public: + ProvisionCloudPropertiesTest() = default; + ~ProvisionCloudPropertiesTest() = default; + + static void cloudPropProvStatusCb(shared_ptr< CloudPropProvisioningStatus > /*status*/) + { + } + +protected: + void SetUp() + { + TestWithMock::SetUp(); + } + + void TearDown() + { + TestWithMock::TearDown(); + } +}; + +TEST_F(ProvisionCloudPropertiesTest, + ThrowExceptionWhenProvisionCloudPropertiesFailedByCallbackIsNull) +{ + CloudProp cloudProp; + cloudProp.setCloudProp("authCode", "authProvider", "ciServer"); + cloudProp.setCloudID("f002ae8b-c42c-40d3-8b8d-1927c17bd1b3"); + + EXPECT_ANY_THROW(g_remoteEnrollee->provisionCloudProperties(cloudProp, nullptr)); +} + +TEST_F(ProvisionCloudPropertiesTest, + ThrowExceptionWhenProvisionCloudPropertiesFailedWithoutAuthCode) +{ + CloudProp cloudProp; + cloudProp.setCloudProp("", "authProvider", "ciServer"); + cloudProp.setCloudID("f002ae8b-c42c-40d3-8b8d-1927c17bd1b3"); + EXPECT_ANY_THROW(g_remoteEnrollee->provisionCloudProperties(cloudProp, + cloudPropProvStatusCb)); +} + +TEST_F(ProvisionCloudPropertiesTest, + ThrowExceptionWhenProvisionCloudPropertiesFailedWithoutAuthProvider) +{ + CloudProp cloudProp; + cloudProp.setCloudProp("authCode", "", "ciServer"); + cloudProp.setCloudID("f002ae8b-c42c-40d3-8b8d-1927c17bd1b3"); + EXPECT_ANY_THROW(g_remoteEnrollee->provisionCloudProperties(cloudProp, + cloudPropProvStatusCb)); +} + +TEST_F(ProvisionCloudPropertiesTest, + ThrowExceptionWhenProvisionCloudPropertiesFailedWithoutCIServer) +{ + CloudProp cloudProp; + cloudProp.setCloudProp("authCode", "authProvider", ""); + cloudProp.setCloudID("f002ae8b-c42c-40d3-8b8d-1927c17bd1b3"); + EXPECT_ANY_THROW(g_remoteEnrollee->provisionCloudProperties(cloudProp, + cloudPropProvStatusCb)); +} + +TEST_F(ProvisionCloudPropertiesTest, ProvisionCloudPropertiesSucceed) +{ + CloudProp cloudProp; + cloudProp.setCloudProp("authCode", "authProvider", "ciServer"); + cloudProp.setCloudID("f002ae8b-c42c-40d3-8b8d-1927c17bd1b3"); + + int cntForReceivedCallbackWithSuccess = 0; + + mocks.OnCallFunc(cloudPropProvStatusCb).Do( + [& cntForReceivedCallbackWithSuccess](std::shared_ptr< CloudPropProvisioningStatus > status) + { + // Will called twice + if(status->getESResult() == ES_OK) + { + cntForReceivedCallbackWithSuccess++; + } + }); + + g_remoteEnrollee->provisionCloudProperties(cloudProp, cloudPropProvStatusCb); + + std::unique_lock< std::mutex > lock{ mutexForCondition }; + responseCon.wait_for(lock, g_waitForResponse); + + EXPECT_EQ(cntForReceivedCallbackWithSuccess, 2); + + ESTerminateEnrollee(); +} diff --git a/service/easy-setup/mediator/richsdk/unittests/MediatorRichTest.cpp b/service/easy-setup/mediator/richsdk/unittests/MediatorRichTest.cpp deleted file mode 100644 index 3f0ecc1..0000000 --- a/service/easy-setup/mediator/richsdk/unittests/MediatorRichTest.cpp +++ /dev/null @@ -1,335 +0,0 @@ -//****************************************************************** -// -// Copyright 2016 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -#include "UnitTestHelper.h" - -#include "ocstack.h" -#include "OCPlatform.h" -#include "OCApi.h" -#include "oic_string.h" -#include "logger.h" - -#include "EasySetup.h" -#include "RemoteEnrollee.h" -#include "ESException.h" - -#include -#include -#include -#include - -using namespace OIC::Service; - -const std::string ipaddress = "1.1.1.1"; -const std::string ssid = "test"; -const std::string pwd = "test@123"; - -class MediatorRichTest: public TestWithMock -{ - protected: - void SetUp() - { - TestWithMock::SetUp(); - } - - void TearDown() - { - TestWithMock::TearDown(); - } -}; - -//callbacks -void easySetupStatusCallback (std::shared_ptr< EasySetupStatus > /*easySetupStatus*/) -{ - - -} - -/* Test cases for easysetyup class*/ - -//getInstance -TEST_F(MediatorRichTest, testGetInstance) -{ - EasySetup *easySetupIntance1 = EasySetup::getInstance(); - EasySetup *easySetupIntance2 = EasySetup::getInstance(); - - EXPECT_EQ(easySetupIntance1, easySetupIntance2); -} - -//createEnrolleeDevice [positive] -TEST_F(MediatorRichTest, testCreateEnrolleeDevice) -{ - RemoteEnrollee::shared_ptr remoteEnrollee = NULL; - ProvConfig netInfo; - WiFiOnboadingConnection onboardingConn; - - netInfo.connType = CT_ADAPTER_IP; - - OICStrcpy(netInfo.provData.WIFI.ssid, NET_WIFI_SSID_SIZE - 1, ssid.c_str()); - OICStrcpy(netInfo.provData.WIFI.pwd, NET_WIFI_PWD_SIZE - 1, pwd.c_str()); - - onboardingConn.isSecured = false; - OICStrcpy(onboardingConn.ipAddress, IPV4_ADDR_SIZE - 1, ipaddress.c_str()); - - remoteEnrollee = EasySetup::getInstance()->createEnrolleeDevice(netInfo, onboardingConn); - - EXPECT_TRUE(remoteEnrollee != NULL); -} - -//createEnrolleeDevice [Negative] -TEST_F(MediatorRichTest, testCreateEnrolleeDeviceNegative) -{ - RemoteEnrollee::shared_ptr remoteEnrollee = NULL; - ProvConfig netInfo; - WiFiOnboadingConnection onboardingConn; - EasySetup *easysetupInstance = EasySetup::getInstance(); - - netInfo.connType = CT_ADAPTER_IP; - - OICStrcpy(netInfo.provData.WIFI.ssid, NET_WIFI_SSID_SIZE - 1, ssid.c_str()); - OICStrcpy(netInfo.provData.WIFI.pwd, NET_WIFI_PWD_SIZE - 1, pwd.c_str()); - - onboardingConn.isSecured = false; - OICStrcpy(onboardingConn.ipAddress, IPV4_ADDR_SIZE - 1, ipaddress.c_str()); - - //calling the createEnrolleeDevice - remoteEnrollee = easysetupInstance->createEnrolleeDevice(netInfo, onboardingConn); - //calling again the createEnrolleeDevice with same config & connection info [API throws the exception] - EXPECT_ANY_THROW(easysetupInstance->createEnrolleeDevice(netInfo, onboardingConn)); -} - -//createEnrolleeDevice [positive (creating the two RemoteEnrolleeDevice with different config)] -TEST_F(MediatorRichTest, testCreateEnrolleeMultipleDevice) -{ - RemoteEnrollee::shared_ptr remoteEnrollee1 = NULL; - RemoteEnrollee::shared_ptr remoteEnrollee2 = NULL; - WiFiOnboadingConnection onboardingConn1; - WiFiOnboadingConnection onboardingConn2; - ProvConfig netInfo1; - ProvConfig netInfo2; - std::string ipaddress2 = "0.0.0.0"; - - //calling the API for the first device - netInfo1.connType = CT_ADAPTER_IP; - OICStrcpy(netInfo1.provData.WIFI.ssid, NET_WIFI_SSID_SIZE - 1, ssid.c_str()); - OICStrcpy(netInfo1.provData.WIFI.pwd, NET_WIFI_PWD_SIZE - 1, pwd.c_str()); - - onboardingConn1.isSecured = false; - OICStrcpy(onboardingConn1.ipAddress, IPV4_ADDR_SIZE - 1, ipaddress.c_str()); - remoteEnrollee1 = EasySetup::getInstance()->createEnrolleeDevice(netInfo1, onboardingConn1); - - //calling the API for the second device - netInfo1.connType = CT_ADAPTER_IP; - OICStrcpy(netInfo1.provData.WIFI.ssid, NET_WIFI_SSID_SIZE - 1, ssid.c_str()); - OICStrcpy(netInfo1.provData.WIFI.pwd, NET_WIFI_PWD_SIZE - 1, pwd.c_str()); - - onboardingConn1.isSecured = false; - OICStrcpy(onboardingConn1.ipAddress, IPV4_ADDR_SIZE - 1, ipaddress2.c_str()); - remoteEnrollee2 = EasySetup::getInstance()->createEnrolleeDevice(netInfo2, onboardingConn2); - - EXPECT_TRUE(remoteEnrollee1 != NULL); - EXPECT_TRUE(remoteEnrollee2 != NULL); -} - -/*Test cases for RemoteEnrollee class*/ - -//registerEasySetupStatusHandler [positive] -TEST_F(MediatorRichTest, testRegisterEasySetupStatusHandler) -{ - //creation of the Remote Enrollee Device - RemoteEnrollee::shared_ptr remoteEnrollee = NULL; - ProvConfig netInfo; - WiFiOnboadingConnection onboardingConn; - - netInfo.connType = CT_ADAPTER_IP; - - OICStrcpy(netInfo.provData.WIFI.ssid, NET_WIFI_SSID_SIZE - 1, ssid.c_str()); - OICStrcpy(netInfo.provData.WIFI.pwd, NET_WIFI_PWD_SIZE - 1, pwd.c_str()); - - onboardingConn.isSecured = false; - OICStrcpy(onboardingConn.ipAddress, IPV4_ADDR_SIZE - 1, ipaddress.c_str()); - - remoteEnrollee = EasySetup::getInstance()->createEnrolleeDevice(netInfo, onboardingConn); - - //calling the API - EXPECT_NO_THROW( remoteEnrollee->registerEasySetupStatusHandler(&easySetupStatusCallback)); -} - -//registerEasySetupStatusHandler [Negative] -TEST_F(MediatorRichTest, testRegisterEasySetupStatusHandlerNegative) -{ - //creation of the Remote Enrollee Device - RemoteEnrollee::shared_ptr remoteEnrollee = NULL; - ProvConfig netInfo; - WiFiOnboadingConnection onboardingConn; - - netInfo.connType = CT_ADAPTER_IP; - - OICStrcpy(netInfo.provData.WIFI.ssid, NET_WIFI_SSID_SIZE - 1, ssid.c_str()); - OICStrcpy(netInfo.provData.WIFI.pwd, NET_WIFI_PWD_SIZE - 1, pwd.c_str()); - - onboardingConn.isSecured = false; - OICStrcpy(onboardingConn.ipAddress, IPV4_ADDR_SIZE - 1, ipaddress.c_str()); - - remoteEnrollee = EasySetup::getInstance()->createEnrolleeDevice(netInfo, onboardingConn); - - //calling the API - EXPECT_ANY_THROW( remoteEnrollee->registerEasySetupStatusHandler(NULL)); -} - -//isEnrolleeProvisioned -TEST_F(MediatorRichTest, testIsEnrolleeProvisioned) -{ - //creation of the Remote Enrollee Device - RemoteEnrollee::shared_ptr remoteEnrollee = NULL; - ProvConfig netInfo; - WiFiOnboadingConnection onboardingConn; - - netInfo.connType = CT_ADAPTER_IP; - - OICStrcpy(netInfo.provData.WIFI.ssid, NET_WIFI_SSID_SIZE - 1, ssid.c_str()); - OICStrcpy(netInfo.provData.WIFI.pwd, NET_WIFI_PWD_SIZE - 1, pwd.c_str()); - - onboardingConn.isSecured = false; - OICStrcpy(onboardingConn.ipAddress, IPV4_ADDR_SIZE - 1, ipaddress.c_str()); - - remoteEnrollee = EasySetup::getInstance()->createEnrolleeDevice(netInfo, onboardingConn); - - //calling the API - bool isEnrolleeProvisioned = remoteEnrollee->isEnrolleeProvisioned(); - - EXPECT_TRUE(false == isEnrolleeProvisioned); -} - -//startProvisioning [positive] -TEST_F(MediatorRichTest, testStartProvisioning) -{ - //creation of the Remote Enrollee Device - RemoteEnrollee::shared_ptr remoteEnrollee = NULL; - ProvConfig netInfo; - WiFiOnboadingConnection onboardingConn; - - netInfo.connType = CT_ADAPTER_IP; - - OICStrcpy(netInfo.provData.WIFI.ssid, NET_WIFI_SSID_SIZE - 1, ssid.c_str()); - OICStrcpy(netInfo.provData.WIFI.pwd, NET_WIFI_PWD_SIZE - 1, pwd.c_str()); - - onboardingConn.isSecured = false; - OICStrcpy(onboardingConn.ipAddress, IPV4_ADDR_SIZE - 1, ipaddress.c_str()); - - remoteEnrollee = EasySetup::getInstance()->createEnrolleeDevice(netInfo, onboardingConn); - remoteEnrollee->registerEasySetupStatusHandler(&easySetupStatusCallback); - -#ifdef REMOTE_ARDUINO_ENROLEE - EXPECT_NO_THROW(remoteEnrollee->startProvisioning()); - -#else - /* It will throw the exception - * as it will not able to discover the provisioning resource in the network - */ - EXPECT_ANY_THROW(remoteEnrollee->startProvisioning()); -#endif -} - -//startProvisioning [Negative] -TEST_F(MediatorRichTest, testStartProvisioningNegative) -{ - //creation of the Remote Enrollee Device - RemoteEnrollee::shared_ptr remoteEnrollee = NULL; - ProvConfig netInfo; - WiFiOnboadingConnection onboardingConn; - - netInfo.connType = CT_ADAPTER_IP; - - OICStrcpy(netInfo.provData.WIFI.ssid, NET_WIFI_SSID_SIZE - 1, ssid.c_str()); - OICStrcpy(netInfo.provData.WIFI.pwd, NET_WIFI_PWD_SIZE - 1, pwd.c_str()); - - onboardingConn.isSecured = false; - OICStrcpy(onboardingConn.ipAddress, IPV4_ADDR_SIZE - 1, ipaddress.c_str()); - - remoteEnrollee = EasySetup::getInstance()->createEnrolleeDevice(netInfo, onboardingConn); - - /* We are not registering the EasySetupStatusHandler, so startProvisioning - * will throw the Exception & we are checking the same - */ - EXPECT_ANY_THROW(remoteEnrollee->startProvisioning()); -} - -//stopProvisioning [positive] -TEST_F(MediatorRichTest, testStopProvisioning) -{ - //creation of the Remote Enrollee Device - RemoteEnrollee::shared_ptr remoteEnrollee = NULL; - ProvConfig netInfo; - WiFiOnboadingConnection onboardingConn; - - netInfo.connType = CT_ADAPTER_IP; - - OICStrcpy(netInfo.provData.WIFI.ssid, NET_WIFI_SSID_SIZE - 1, ssid.c_str()); - OICStrcpy(netInfo.provData.WIFI.pwd, NET_WIFI_PWD_SIZE - 1, pwd.c_str()); - - onboardingConn.isSecured = false; - OICStrcpy(onboardingConn.ipAddress, IPV4_ADDR_SIZE - 1, ipaddress.c_str()); - - remoteEnrollee = EasySetup::getInstance()->createEnrolleeDevice(netInfo, onboardingConn); - remoteEnrollee->registerEasySetupStatusHandler(&easySetupStatusCallback); - -#ifdef REMOTE_ARDUINO_ENROLEE - EXPECT_NO_THROW(remoteEnrollee->startProvisioning()); - EXPECT_NO_THROW(remoteEnrollee->stopProvisioning()); - -#else - /* It will throw the exception as - * it will not able to discover the provisioning resource in the network - */ - EXPECT_ANY_THROW(remoteEnrollee->startProvisioning()); - - /* It will throw an exception - * as internally resource will be empty [startProvisioning is not succeed] - */ - EXPECT_ANY_THROW(remoteEnrollee->stopProvisioning()); -#endif -} - -//stopProvisioning [Negative] -TEST_F(MediatorRichTest, testStopProvisioningNegative) -{ - //creation of the Remote Enrollee Device - RemoteEnrollee::shared_ptr remoteEnrollee = NULL; - ProvConfig netInfo; - WiFiOnboadingConnection onboardingConn; - - netInfo.connType = CT_ADAPTER_IP; - - OICStrcpy(netInfo.provData.WIFI.ssid, NET_WIFI_SSID_SIZE - 1, ssid.c_str()); - OICStrcpy(netInfo.provData.WIFI.pwd, NET_WIFI_PWD_SIZE - 1, pwd.c_str()); - - onboardingConn.isSecured = false; - OICStrcpy(onboardingConn.ipAddress, IPV4_ADDR_SIZE - 1, ipaddress.c_str()); - - remoteEnrollee = EasySetup::getInstance()->createEnrolleeDevice(netInfo, onboardingConn); - remoteEnrollee->registerEasySetupStatusHandler(&easySetupStatusCallback); - - /* we didn't call the start provisioning API and directly calling stopProvisioning API. - * In this case API will throw the exception & we are checking the same. - */ - EXPECT_ANY_THROW(remoteEnrollee->stopProvisioning()); -} - diff --git a/service/easy-setup/mediator/richsdk/unittests/SConscript b/service/easy-setup/mediator/richsdk/unittests/SConscript index 5cd4985..6519619 100644 --- a/service/easy-setup/mediator/richsdk/unittests/SConscript +++ b/service/easy-setup/mediator/richsdk/unittests/SConscript @@ -19,69 +19,70 @@ #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ## -# Mediator[RichSDK] Unit Test build script +# Notification Unit Test build script ## -import os -# SConscript file for Local PKI google tests -gtest_env = SConscript('#extlibs/gtest/SConscript') -lib_env = gtest_env.Clone() +Import('env') -if lib_env.get('RELEASE'): - lib_env.AppendUnique(CCFLAGS = ['-Os']) - lib_env.AppendUnique(CPPDEFINES = ['NDEBUG']) +if env.get('RELEASE'): + env.AppendUnique(CCFLAGS = ['-Os']) + env.AppendUnique(CPPDEFINES = ['NDEBUG']) else: - lib_env.AppendUnique(CCFLAGS = ['-g']) + env.AppendUnique(CCFLAGS = ['-g']) -if lib_env.get('LOGGING'): - lib_env.AppendUnique(CPPDEFINES = ['TB_LOG']) +if env.get('LOGGING'): + env.AppendUnique(CPPDEFINES = ['TB_LOG']) -# Add third party libraries -SConscript('#service/third_party_libs.scons', 'lib_env') - -target_os = lib_env.get('TARGET_OS') -if target_os in ['linux']: - # Verify that 'hippomocks' mocking code is installed. If not, - # get it and install it - SConscript('#extlibs/hippomocks.scons') - -mediator_rich_test_env = lib_env.Clone() +lib_env = env.Clone() +SConscript(env.get('SRC_DIR') + '/service/third_party_libs.scons', 'lib_env') ###################################################################### #unit test setting ###################################################################### src_dir = lib_env.get('SRC_DIR') +gtest_dir = src_dir + '/extlibs/gtest/gtest-1.7.0' + +easysetup_test_env = lib_env.Clone() +target_os = env.get('TARGET_OS') ###################################################################### # Build flags ###################################################################### +GTest = File(gtest_dir + '/lib/.libs/libgtest.a') +GTest_Main = File(gtest_dir + '/lib/.libs/libgtest_main.a') + +easysetup_test_env.AppendUnique(LIBPATH = [lib_env.get('BUILD_DIR')]) +easysetup_test_env.AppendUnique(LIBS = [ + 'connectivity_abstraction', 'oc', 'octbstack', 'oc_logger', 'coap', + GTest_Main, GTest]) -mediator_rich_test_env.AppendUnique( - CPPPATH = [ - src_dir + '/extlibs/hippomocks-master', - '../inc', - '../../../inc', - ]) +if target_os not in ['windows', 'winrt']: + easysetup_test_env.AppendUnique(CXXFLAGS = ['-O2', '-g', '-Wall', '-fmessage-length=0', '-std=c++0x']) -if mediator_rich_test_env.get('SECURED') == '1': - mediator_rich_test_env.PrependUnique(LIBS = ['tinydtls','ocprovision', 'ocpmapi', 'timer']) +easysetup_test_env.AppendUnique(CXXFLAGS = ['-pthread']) +easysetup_test_env.AppendUnique(LIBS = ['pthread']) -mediator_rich_test_env.PrependUnique(LIBS = [ - 'ESMediatorRich', - 'oc', - 'octbstack', - 'oc_logger']) +easysetup_test_env.PrependUnique(CPPPATH = [ src_dir + '/extlibs/hippomocks-master', gtest_dir + '/include']) + +easysetup_test_env.AppendUnique(CPPPATH = [ src_dir + '/resource/include', + src_dir + '/service/easy-setup/mediator/richsdk/inc', + src_dir + '/service/easy-setup/inc', + src_dir + '/service/easy-setup/enrollee/inc']) ###################################################################### # Build Test ###################################################################### -mediator_richsdk_test_src = mediator_rich_test_env.Glob('./*.cpp') -mediator_richsdk_test = mediator_rich_test_env.Program('mediator_richsdk_test', mediator_richsdk_test_src) -Alias("mediator_richsdk_test", mediator_richsdk_test) -mediator_rich_test_env.AppendTarget('mediator_richsdk_test') +easysetup_mediator_test_env = easysetup_test_env.Clone() +easysetup_mediator_test_env.AppendUnique(LIBS = ['ESEnrolleeSDK', 'ESMediatorRich']) + +easysetup_mediator_test_src = env.Glob(src_dir + '/service/easy-setup/mediator/richsdk/unittests/ESMediatorTest.cpp') +easysetup_mediator_test = easysetup_mediator_test_env.Program('easysetup_mediator_test', easysetup_mediator_test_src) +Alias("easysetup_mediator_test", easysetup_mediator_test) +env.AppendTarget('easysetup_mediator_test') + +if env.get('TEST') == '1': + if target_os == 'linux': + from tools.scons.RunTest import * + run_test(easysetup_mediator_test_env, '', 'service/easy-setup/mediator/richsdk/unittests/easysetup_mediator_test') -if mediator_rich_test_env.get('TEST') == '1': - if target_os in ['linux']: - from tools.scons.RunTest import * - run_test(mediator_rich_test_env, '', 'service/easy-setup/mediator/richsdk/unittests/mediator_richsdk_test') diff --git a/service/easy-setup/mediator/richsdk/unittests/UnitTestHelper.h b/service/easy-setup/mediator/richsdk/unittests/UnitTestHelper.h deleted file mode 100644 index 2bf7424..0000000 --- a/service/easy-setup/mediator/richsdk/unittests/UnitTestHelper.h +++ /dev/null @@ -1,48 +0,0 @@ -//****************************************************************** -// -// Copyright 2016 Samsung Electronics All Rights Reserved. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -#ifndef COMMON_UTILS_UNITTESTHELPER_H -#define COMMON_UTILS_UNITTESTHELPER_H - -#include -#include - -class TestWithMock: public testing::Test -{ - public: - MockRepository mocks; - - protected: - virtual ~TestWithMock() noexcept(noexcept(std::declval().~Test())) {} - - virtual void TearDown() - { - try - { - mocks.VerifyAll(); - } - catch (...) - { - mocks.reset(); - throw; - } - } -}; -#endif // COMMON_UTILS_UNITTESTHELPER_H diff --git a/service/easy-setup/sampleapp/enrollee/linux/SConscript b/service/easy-setup/sampleapp/enrollee/linux/SConscript old mode 100644 new mode 100755 index 6fb0f68..02090e2 --- a/service/easy-setup/sampleapp/enrollee/linux/SConscript +++ b/service/easy-setup/sampleapp/enrollee/linux/SConscript @@ -59,9 +59,12 @@ enrollee_env.PrependUnique(LIBS = ['oc', 'octbstack', 'oc_logger', 'ocsrm', 'pth if enrollee_env.get('SECURED') == '1': enrollee_env.PrependUnique(LIBS = ['ocpmapi', 'ocprovision']) -enrollee = enrollee_env.Program('enrollee', 'enrolleewifi.c') +enrollee = enrollee_env.Program('enrollee', ['enrolleewifi.c', 'easysetup_x.c']) i_enrollee = enrollee_env.Install(env.get('BUILD_DIR'), enrollee) -Alias('enrollee', i_enrollee) +justworksdat = enrollee_env.Install(env.get('BUILD_DIR') + '/service/easy-setup/sampleapp/enrollee/linux/', + env.get('SRC_DIR') + '/service/easy-setup/sampleapp/enrollee/linux/oic_svr_db_server.dat') + +Alias('enrollee', [i_enrollee, justworksdat]) env.AppendTarget('enrollee') diff --git a/service/easy-setup/sampleapp/enrollee/linux/easysetup_x.c b/service/easy-setup/sampleapp/enrollee/linux/easysetup_x.c new file mode 100755 index 0000000..ca6ef58 --- /dev/null +++ b/service/easy-setup/sampleapp/enrollee/linux/easysetup_x.c @@ -0,0 +1,88 @@ +//****************************************************************** +// +// Copyright 2015 Samsung Electronics All Rights Reserved. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + + +#include "easysetup_x.h" +#include "string.h" +#include "oic_malloc.h" +#include "logger.h" + +/** + * @var ESX_ENROLLEE_TAG + * @brief Logging tag for module name. + */ +#define ESX_ENROLLEE_TAG "ESX" + +UserProperties g_userProperties; + +void SetUserProperties(const UserProperties *prop) +{ + if(prop != NULL) + { + strncpy(g_userProperties.userValue_str, prop->userValue_str, MAXLEN_STRING); + g_userProperties.userValue_int = prop->userValue_int; + } +} + +void ReadUserdataCb(OCRepPayload* payload, char* resourceType, void** userdata) +{ + OIC_LOG(DEBUG, ESX_ENROLLEE_TAG, "ReadUserdataCb IN"); + + if(payload != NULL) + { + if(strstr(resourceType, OC_RSRVD_ES_RES_TYPE_WIFI)) + { + int64_t value = -1; + if (OCRepPayloadGetPropInt(payload, USERPROPERTY_KEY_INT, &value)) + { + if(*userdata != NULL) + { + *userdata = (void*)OICMalloc(sizeof(UserProperties)); + } + OIC_LOG_V(INFO, ESX_ENROLLEE_TAG, "[User specific property] %s : %ld", + USERPROPERTY_KEY_INT, value); + ((UserProperties*)(*userdata))->userValue_int = value; + g_userProperties.userValue_int = value; + } + } + } + + OIC_LOG(DEBUG, ESX_ENROLLEE_TAG, "ReadUserdataCb OUT"); +} + +void WriteUserdataCb(OCRepPayload* payload, char* resourceType) +{ + OIC_LOG(DEBUG, ESX_ENROLLEE_TAG, "WriteUserdataCb IN"); + + if(payload != NULL) + { + if(strstr(resourceType, OC_RSRVD_ES_RES_TYPE_WIFI)) + { + OCRepPayloadSetPropInt(payload, USERPROPERTY_KEY_INT, g_userProperties.userValue_int); + } + + if(strstr(resourceType, OC_RSRVD_ES_RES_TYPE_DEVCONF)) + { + OCRepPayloadSetPropString(payload, USERPROPERTY_KEY_STR, g_userProperties.userValue_str); + } + } + + OIC_LOG(DEBUG, ESX_ENROLLEE_TAG, "WriteUserdataCb OUT"); +} diff --git a/service/easy-setup/enrollee/linux/wifi/softapnative.h b/service/easy-setup/sampleapp/enrollee/linux/easysetup_x.h old mode 100644 new mode 100755 similarity index 53% rename from service/easy-setup/enrollee/linux/wifi/softapnative.h rename to service/easy-setup/sampleapp/enrollee/linux/easysetup_x.h index 35c3773..cbe6c3c --- a/service/easy-setup/enrollee/linux/wifi/softapnative.h +++ b/service/easy-setup/sampleapp/enrollee/linux/easysetup_x.h @@ -18,36 +18,27 @@ // //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -/** - * @file - * - * This file contains the API declaration for creating & configuration for SoftAP - */ +#include "easysetup.h" +#include "escommon.h" -#ifndef EASYSETUP_ENROLLEE_SOFTAP_H__ -#define EASYSETUP_ENROLLEE_SOFTAP_H__ +#ifndef EASYSETUPX_ENROLLEE_H__ +#define EASYSETUPX_ENROLLEE_H__ -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus +#define MAXLEN_STRING 100 +typedef struct UserProperties_t +{ + int userValue_int; /**< User-specific property in WiFi resource **/ + char userValue_str[MAXLEN_STRING]; /**< User-specific property in DevConf resource **/ +} UserProperties; -#define SOFTAP_SUCCESS 1 -#define SOFTAP_FAILED 0 +#define USERPROPERTY_KEY_INT "x.user.property.int" +#define USERPROPERTY_KEY_STR "x.user.property.str" +void ReadUserdataCb(OCRepPayload* payload, char* resourceType, void** userdata); +void WriteUserdataCb(OCRepPayload* payload, char* resourceType); -//This callback signagure may get changed as per the native implementation. -typedef void (*SoftAPCallbackNative)(int result, const char *ip, const char* mac_addr, - const char*device_name); - -void ESCreateSoftapNative(const char * ssid, const char* passwd, SoftAPCallbackNative cb); - -#ifdef __cplusplus -} -#endif // __cplusplus - - -#endif /* EASYSETUP_ENROLLEE_SOFTAP_H__ */ - +void SetUserProperties(const UserProperties *prop); +#endif /* EASYSETUPX_ENROLLEE_H__ */ diff --git a/service/easy-setup/sampleapp/enrollee/linux/enrolleewifi.c b/service/easy-setup/sampleapp/enrollee/linux/enrolleewifi.c old mode 100644 new mode 100755 index e645bc4..792fe68 --- a/service/easy-setup/sampleapp/enrollee/linux/enrolleewifi.c +++ b/service/easy-setup/sampleapp/enrollee/linux/enrolleewifi.c @@ -20,37 +20,27 @@ #include "easysetup.h" +#include "easysetup_x.h" #include #include #include #include +#include +#include "oic_malloc.h" -#define TAG "TS" +#define TAG "ENROLLEE_SAMPLE" void *listeningFunc(void *); /** - * @var ssid - * @brief Target SSID of the Soft Access point to which the device has to connect - */ -static char ssid[] = "EasySetup123"; - -/** - * @var passwd - * @brief Password of the Soft Access point to which the device has to connect - */ -static char passwd[] = "EasySetup123"; - -/** * Secure Virtual Resource database for Iotivity Server * It contains Server's Identity and the PSK credentials * of other devices which the server trusts */ static char CRED_FILE[] = "oic_svr_db_server.dat"; -OCPersistentStorage ps ; - +OCPersistentStorage ps; /** * @var gIsSecured @@ -58,48 +48,82 @@ OCPersistentStorage ps ; */ static bool gIsSecured = false; +UserProperties g_userProperties; + void PrintMenu() { printf("============\n"); printf("S: Enabled Security\n"); - printf("I: Init easy setup\n"); - printf("P: start provisioning resources\n"); - printf("T: terminate\n"); - printf("Q: quit\n"); + printf("I: Init & Start EasySetup\n"); + printf("D: Set DeviceInfo\n"); + printf("T: Terminate\n"); + printf("U: set Callback for userdata\n"); + printf("Q: Quit\n"); printf("============\n"); } -void EventCallbackInApp(ESResult esResult, ESEnrolleeState enrolleeState) +void WiFiProvCbInApp(ESWiFiProvData *eventData) { - printf("Easy setup event callback\n"); + printf("WiFiProvCbInApp IN\n"); - if(esResult == ES_OK) + if(eventData == NULL) { - if(enrolleeState == ES_ON_BOARDED_STATE) - { - printf("Device is successfully OnBoared on Adhoc network\n"); - } - else if (enrolleeState == ES_PROVISIONED_STATE) - { - printf("Device is provisioned with target network's credentials\n"); - } - else if (enrolleeState == ES_ON_BOARDED_TARGET_NETWORK_STATE) - { - printf("Device is onboarded/connected with target network\n"); - } - else - { - printf("Wrong state !! Easy setup is failed at Enrollee state = %d\n",enrolleeState); - } + printf("ESWiFiProvData is NULL\n"); + return ; + } + + printf("SSID : %s\n", eventData->ssid); + printf("Password : %s\n", eventData->pwd); + printf("AuthType : %d\n", eventData->authtype); + printf("EncType : %d\n", eventData->enctype); + + if(eventData->userdata != NULL) + { + printf("userValue : %d\n", ((UserProperties *)(eventData->userdata))->userValue_int); } - else + + printf("WiFiProvCbInApp OUT\n"); +} + +void DevConfProvCbInApp(ESDevConfProvData *eventData) +{ + printf("DevConfProvCbInApp IN\n"); + + if(eventData == NULL) { - printf("Easy stup is failed at Enrollee state = %d\n",enrolleeState);; + printf("ESDevConfProvData is NULL\n"); + return ; } - PrintMenu(); + printf("Language : %s\n", eventData->language); + printf("Country : %s\n", eventData->country); + + printf("DevConfProvCbInApp OUT\n"); } +void CloudDataProvCbInApp(ESCloudProvData *eventData) +{ + printf("CloudDataProvCbInApp IN\n"); + + if(eventData == NULL) + { + printf("ESCloudProvData is NULL\n"); + return ; + } + + printf("AuthCode : %s\n", eventData->authCode); + printf("AuthProvider : %s\n", eventData->authProvider); + printf("CI Server : %s\n", eventData->ciServer); + + printf("CloudDataProvCbInApp OUT\n"); +} + +ESProvisioningCallbacks gCallbacks = { + .WiFiProvCb = &WiFiProvCbInApp, + .DevConfProvCb = &DevConfProvCbInApp, + .CloudDataProvCb = &CloudDataProvCbInApp +}; + FILE* server_fopen(const char *path, const char *mode) { (void) path; @@ -119,39 +143,51 @@ void EnableSecurity() void StartEasySetup() { - printf("StartEasySetup and onboarding started..\n"); - - if(ESInitEnrollee(CT_ADAPTER_IP, ssid, passwd, gIsSecured, EventCallbackInApp) == ES_ERROR) - { - printf("StartEasySetup and onboarding Fail!!\n"); - return; - } -} - -void ESInitResources() -{ - printf("Starting Enrollee Provisioning\n"); + printf("StartEasySetup IN\n"); - // Initialize the OC Stack in Server mode if (OCInit(NULL, 0, OC_SERVER) != OC_STACK_OK) { printf("OCStack init error!!\n"); return; } - if (ESInitProvisioning() == ES_ERROR) + ESResourceMask resourcemMask = ES_WIFI_RESOURCE | ES_CLOUD_RESOURCE | ES_DEVCONF_RESOURCE; + if(ESInitEnrollee(gIsSecured, resourcemMask, gCallbacks) != ES_OK) { - printf("Init Provisioning Failed!!\n"); + printf("OCStack init error!!\n"); return; } + printf("ESInitEnrollee Success\n"); - pthread_t thread_handle; + pthread_t thread_handle = NULL; if (pthread_create(&thread_handle, NULL, listeningFunc, NULL)) { printf("Thread creation failed\n"); } - printf("ESInitProvisioning Success\n"); + printf("StartEasySetup OUT\n"); +} + +void SetDeviceInfo() +{ + printf("SetDeviceInfo IN\n"); + + ESDeviceProperty deviceProperty = { + {{WIFI_11G, WIFI_11N, WIFI_11AC, WiFi_EOF}, WIFI_5G}, {"Test Device"} + }; + + // Set user properties if needed + char userValue_str[] = "user_str"; + g_userProperties.userValue_int = 0; + strcpy(g_userProperties.userValue_str, userValue_str); + SetUserProperties(&g_userProperties); + + if(ESSetDeviceProperty(&deviceProperty) == ES_ERROR) + { + printf("ESSetDeviceProperty Error\n"); + } + + printf("SetDeviceInfo OUT\n"); } void StopEasySetup() @@ -174,20 +210,29 @@ void StopEasySetup() printf("StopEasySetup OUT\n"); } +void SetCallbackForUserdata() +{ + ESSetCallbackForUserdata(&ReadUserdataCb, &WriteUserdataCb); +} + int main() { printf("#########################\n"); printf("EasySetup Enrollee SAMPLE\n"); printf("#########################\n"); PrintMenu(); - char option = 'T'; + char option; while(true) { - scanf("%c",&option); + if(scanf("%c", &option) != 1) + { + printf("Failed to read input data\n"); + continue; + } - if(option!= '\n') - { + if(option!= '\n') + { switch (option) { case 'H': // help @@ -203,36 +248,46 @@ int main() case 'S': // Enable Security case 's': EnableSecurity(); + PrintMenu(); break; case 'I': // Init EasySetup case 'i': StartEasySetup(); + PrintMenu(); break; - case 'P': // start provisioning - case 'p': - ESInitResources(); + case 'D': // Set Device Info + case 'd': + SetDeviceInfo(); + PrintMenu(); break; - case 'T': // stop easy setup case 't': StopEasySetup(); + PrintMenu(); + break; + case 'U': // set callback + case 'u': + SetCallbackForUserdata(); + PrintMenu(); break; default: printf("wrong option\n"); + PrintMenu(); break; } - if (option == 'Q' || option == 'q') break; + if (option == 'Q' || option == 'q') { break; } } } return 0; } -void *listeningFunc(void * a) +void *listeningFunc(void * data) { - OCStackResult result; + (void)data; + OCStackResult result = OC_STACK_ERROR; while (true) { diff --git a/service/easy-setup/sampleapp/enrollee/linux/oic_svr_db_server.dat b/service/easy-setup/sampleapp/enrollee/linux/oic_svr_db_server.dat new file mode 100755 index 0000000..08c7368 Binary files /dev/null and b/service/easy-setup/sampleapp/enrollee/linux/oic_svr_db_server.dat differ diff --git a/service/easy-setup/sampleapp/mediator/android/EasySetup/EasySetup.iml b/service/easy-setup/sampleapp/mediator/android/EasySetup/EasySetup.iml new file mode 100755 index 0000000..b8f4dc9 --- /dev/null +++ b/service/easy-setup/sampleapp/mediator/android/EasySetup/EasySetup.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + diff --git a/service/easy-setup/sampleapp/mediator/android/EasySetup/app/build.gradle b/service/easy-setup/sampleapp/mediator/android/EasySetup/app/build.gradle index c249744..11c057b 100644 --- a/service/easy-setup/sampleapp/mediator/android/EasySetup/app/build.gradle +++ b/service/easy-setup/sampleapp/mediator/android/EasySetup/app/build.gradle @@ -1,21 +1,58 @@ -apply plugin: 'com.android.application' -android { - compileSdkVersion 21 - buildToolsVersion '21.1.2' - - defaultConfig { - applicationId "org.iotivity.service.easysetup" - minSdkVersion 21 - targetSdkVersion 21 - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' - } - } -} - -dependencies { -} \ No newline at end of file +//****************************************************************** +// +// Copyright 2016 Samsung Electronics All Rights Reserved. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +apply plugin: 'com.android.application' + +android { + compileSdkVersion 21 + buildToolsVersion "20.0.0" + + defaultConfig { + applicationId "org.iotivity.service.easysetup" + minSdkVersion 21 + targetSdkVersion 21 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + lintOptions { + abortOnError false + } +} +repositories { + flatDir { + dirs "../../../../../../../android/android_api/base/build/outputs/aar/", "../../../../../mediator/richsdk/android/EasySetupCore/build/outputs/aar/" + } +} + +try { + dependencies { + compile ":iotivity-base-${TARGET_ARCH}-${RELEASE}@aar" + compile ":EasySetupCore-${RELEASE}@aar" + } +} catch (all) { + print "${ERROR_MSG}" + assert all +} diff --git a/service/easy-setup/sampleapp/mediator/android/EasySetup/app/proguard-rules.pro b/service/easy-setup/sampleapp/mediator/android/EasySetup/app/proguard-rules.pro new file mode 100644 index 0000000..d26150c --- /dev/null +++ b/service/easy-setup/sampleapp/mediator/android/EasySetup/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /home/rahul/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/service/easy-setup/sampleapp/mediator/android/EasySetup/app/src/main/AndroidManifest.xml b/service/easy-setup/sampleapp/mediator/android/EasySetup/app/src/main/AndroidManifest.xml old mode 100755 new mode 100644 index 4b4d4c5..6bae09a --- a/service/easy-setup/sampleapp/mediator/android/EasySetup/app/src/main/AndroidManifest.xml +++ b/service/easy-setup/sampleapp/mediator/android/EasySetup/app/src/main/AndroidManifest.xml @@ -8,32 +8,29 @@ + + - - - - - - - + + + + + + diff --git a/service/easy-setup/sampleapp/mediator/android/EasySetup/app/src/main/java/org/iotivity/service/easysetup/EasysetupActivity.java b/service/easy-setup/sampleapp/mediator/android/EasySetup/app/src/main/java/org/iotivity/service/easysetup/EasysetupActivity.java new file mode 100755 index 0000000..acc9a9f --- /dev/null +++ b/service/easy-setup/sampleapp/mediator/android/EasySetup/app/src/main/java/org/iotivity/service/easysetup/EasysetupActivity.java @@ -0,0 +1,1055 @@ +/** + * *************************************************************** + *

+ * Copyright 2016 Samsung Electronics All Rights Reserved. + *

+ *

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *

+ * **************************************************************** + */ + +package org.iotivity.service.easysetup; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.util.Log; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.RadioButton; +import android.widget.RadioGroup; +import android.widget.Spinner; +import android.widget.TextView; +import android.widget.Toast; +import android.widget.ToggleButton; + +import org.iotivity.base.ErrorCode; +import org.iotivity.base.ModeType; +import org.iotivity.base.OcConnectivityType; +import org.iotivity.base.OcException; +import org.iotivity.base.OcHeaderOption; +import org.iotivity.base.OcPlatform; +import org.iotivity.base.OcPresenceStatus; +import org.iotivity.base.OcProvisioning; +import org.iotivity.base.OcRepresentation; +import org.iotivity.base.OcResource; +import org.iotivity.base.PlatformConfig; +import org.iotivity.base.QualityOfService; +import org.iotivity.base.ServiceType; +import org.iotivity.service.easysetup.mediator.CloudProp; +import org.iotivity.service.easysetup.mediator.CloudPropProvisioningCallback; +import org.iotivity.service.easysetup.mediator.CloudPropProvisioningStatus; +import org.iotivity.service.easysetup.mediator.DeviceProp; +import org.iotivity.service.easysetup.mediator.DevicePropProvisioningCallback; +import org.iotivity.service.easysetup.mediator.DevicePropProvisioningStatus; +import org.iotivity.service.easysetup.mediator.ESException; +import org.iotivity.service.easysetup.mediator.EasySetup; +import org.iotivity.service.easysetup.mediator.EnrolleeConf; +import org.iotivity.service.easysetup.mediator.GetConfigurationCallback; +import org.iotivity.service.easysetup.mediator.GetConfigurationStatus; +import org.iotivity.service.easysetup.mediator.RemoteEnrollee; +import org.iotivity.service.easysetup.mediator.SecurityProvisioningCallback; +import org.iotivity.service.easysetup.mediator.SecurityProvisioningStatus; +import org.iotivity.service.easysetup.mediator.enums.ESCloudProvState; +import org.iotivity.service.easysetup.mediator.enums.ESResult; +import org.iotivity.service.easysetup.mediator.enums.WIFI_AUTHTYPE; +import org.iotivity.service.easysetup.mediator.enums.WIFI_ENCTYPE; +import org.iotivity.service.easysetup.mediator.enums.WIFI_FREQ; +import org.iotivity.service.easysetup.mediator.enums.WIFI_MODE; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.List; + + +public class EasysetupActivity extends Activity implements OcPlatform.OnPresenceListener { + private static final String TAG = "Easysetup Mediator: "; + PlatformConfig cfg; + final String deviceID = "9E09F4FE-978A-4BC3-B356-1F93BCA37829"; + final String samsungCIServer = "coap+tcp://52.69.149.85:5683"; + + private static final int BUFFER_SIZE = 1024; + + private String filePath = ""; + public static final String OIC_CLIENT_JSON_DB_FILE = "oic_svr_db_client.dat"; + public static final String OIC_SQL_DB_FILE = "PDM.db"; + + private boolean isFirstTime = true; + String mEnrolleeDeviceID; + String mAuthCode; + String mAuthProvider; + String mRefreshtoken; + String mUserID; + String mAccessToken; + String mEnrolleeAuthCode; + + + ToggleButton mSecurityMode; + + RadioGroup mEasysetupProcess; + RadioButton mConfigureSecProcess; + RadioButton mGetConfigurationProcess; + RadioButton mProvisionDevPropProcess; + RadioButton mProvisionCloudPropProcess; + + Button mDiscoverResource; + Button mStartGetConfiguration; + Button mStartConfigureSec; + Button mStartProvisionDevProp; + Button mStartProvisionCloudProp; + + TextView mGetconfigurationStateText; + TextView mDevNameText; + TextView mLanguageText; + TextView mCountryText; + TextView mWifiModeText; + TextView mWifiFreqText; + TextView mCloudAccessableText; + TextView mSecStateText; + TextView mSecDevIDText; + TextView mProvisionDevPropState; + TextView mProvisionCloudPropState; + + EditText mEnrollerSsidText; + EditText mEnrollerPWText; + EditText mInputLanguageText; + EditText mInputCountryText; + EditText mAuthCodeText; + EditText mAuthProviderText; + EditText mCIServerText; + + LinearLayout mGetConfigurationInfo; + LinearLayout mConfigureSecInfo; + LinearLayout mProvisionDevPropInfo; + LinearLayout mProvisionCloudPropInfo; + + Spinner mAuthType; + Spinner mEncType; + + EasySetup mEasySetup; + RemoteEnrollee mRemoteEnrollee; + + Activity mActivity; + Context mContext; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.easysetup_main); + + mActivity = EasysetupActivity.this; + mContext = mActivity.getBaseContext(); + + mSecurityMode = (ToggleButton) findViewById(R.id.btn_Security); + + mEasysetupProcess = (RadioGroup) findViewById(R.id.rg_EasysetupProcess); + + mConfigureSecProcess = (RadioButton) findViewById(R.id.btn_configurSec); + mGetConfigurationProcess = (RadioButton) findViewById(R.id.btn_getConfiguration); + mProvisionDevPropProcess = (RadioButton) findViewById(R.id.btn_provisionDevConf); + mProvisionCloudPropProcess = + (RadioButton) findViewById(R.id.btn_provisionCloudConf); + + mDiscoverResource = (Button) findViewById(R.id.btn_discoverResource); + mStartGetConfiguration = + (Button) findViewById(R.id.btn_startGetConfiguration); + mStartConfigureSec = (Button) findViewById(R.id.btn_startConfigureSec); + mStartProvisionDevProp = (Button) findViewById(R.id.btn_startProvisionDevConf); + mStartProvisionCloudProp = (Button) findViewById(R.id.btn_startProvisionCloudConf); + + mGetconfigurationStateText = + (TextView) findViewById(R.id.txt_getConfigurationState); + mDevNameText = (TextView) findViewById(R.id.txt_devName); + mLanguageText = (TextView) findViewById(R.id.txt_language); + mCountryText = (TextView) findViewById(R.id.txt_country); + mWifiModeText = (TextView) findViewById(R.id.txt_wifiMode); + mWifiFreqText = (TextView) findViewById(R.id.txt_wifiFreq); + mCloudAccessableText = (TextView) findViewById(R.id.txt_cloudAccessable); + mSecStateText = (TextView) findViewById(R.id.txt_secState); + mSecDevIDText = (TextView) findViewById(R.id.txt_secDevID); + mProvisionDevPropState = (TextView) findViewById(R.id.txt_provisionDevConfState); + mProvisionCloudPropState = + (TextView) findViewById(R.id.txt_provisionCloudConfState); + + mEnrollerSsidText = (EditText) findViewById(R.id.editText_EnrollerSSID); + mEnrollerPWText = (EditText) findViewById(R.id.editText_EnrollerPW); + mInputLanguageText = (EditText) findViewById(R.id.editText_Language); + mInputCountryText = (EditText) findViewById(R.id.editText_Country); + mAuthCodeText = (EditText) findViewById(R.id.editText_authcode); + mAuthProviderText = (EditText) findViewById(R.id.editText_authprovider); + mCIServerText = (EditText) findViewById(R.id.editText_ciserver); + + mGetConfigurationInfo = + (LinearLayout) findViewById(R.id.layout_GetConfiguration); + mConfigureSecInfo = (LinearLayout) findViewById(R.id.layout_ConfigurSec); + mProvisionDevPropInfo = (LinearLayout) findViewById(R.id.layout_ProvisionDevConf); + mProvisionCloudPropInfo = (LinearLayout) findViewById(R.id.layout_ProvisionCloudConf); + + mAuthType = (Spinner) findViewById(R.id.spinner_authType); + mEncType = (Spinner) findViewById(R.id.spinner_encType); + + mEasysetupProcess.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(RadioGroup group, int checkedId) { + mGetConfigurationInfo.setVisibility(View.GONE); + mConfigureSecInfo.setVisibility(View.GONE); + mProvisionDevPropInfo.setVisibility(View.GONE); + mProvisionCloudPropInfo.setVisibility(View.GONE); + + switch (checkedId) { + case R.id.btn_configurSec: + mConfigureSecInfo.setVisibility(View.VISIBLE); + break; + + case R.id.btn_getConfiguration: + mGetConfigurationInfo.setVisibility(View.VISIBLE); + break; + + case R.id.btn_provisionDevConf: + mProvisionDevPropInfo.setVisibility(View.VISIBLE); + break; + + case R.id.btn_provisionCloudConf: + Log.d(TAG, "Starting login activity"); + Intent intent = new Intent(EasysetupActivity.this, LoginActivity.class); + startActivityForResult(intent, 2); + mProvisionCloudPropInfo.setVisibility(View.VISIBLE); + break; + } + } + }); + + ArrayAdapter adAuthType, adEnctype; + + adAuthType = ArrayAdapter.createFromResource(this, R.array.auth_type, + android.R.layout.simple_spinner_item); + adAuthType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + + adEnctype = ArrayAdapter.createFromResource(this, R.array.enc_type, + android.R.layout.simple_spinner_item); + adEnctype.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + + mAuthType.setAdapter(adAuthType); + mAuthType.setSelection(0); + + mEncType.setAdapter(adEnctype); + mEncType.setSelection(0); + + addListenerForDiscoverEnrollee(); + addListenerForStartConfigureSec(); + addListenerForStartGetConfiguration(); + addListenerForStartProvisionDevProp(); + addListenerForStartProvisionCloudProp(); + + mSecurityMode.setClickable(false); + mConfigureSecProcess.setEnabled(false); + mGetConfigurationProcess.setEnabled(false); + mProvisionDevPropProcess.setEnabled(false); + mProvisionCloudPropProcess.setEnabled(false); + + mEasySetup = EasySetup.getInstance(getApplicationContext()); + + initOICStack(); + + SharedPreferences settings = + getApplicationContext().getSharedPreferences("IoTivityCloud", 0); + mAccessToken = settings.getString("accesstoken", null); + mRefreshtoken = settings.getString("refreshtoken", null); + mUserID = settings.getString("uid", null); + + if(mRefreshtoken == null) + { + Log.d(TAG, "Can not find refresh token"); + } + + if(mAccessToken == null && mRefreshtoken == null) + { + Log.d(TAG, "Starting login activity"); + Intent intent = new Intent(EasysetupActivity.this, LoginActivity.class); + startActivityForResult(intent, 1); + } + else if(mAccessToken != null) + { + SignInDevice(); + } + } + + private void initOICStack() { + filePath = getFilesDir().getPath() + "/"; + + SharedPreferences wmbPreference = PreferenceManager.getDefaultSharedPreferences + (getApplicationContext()); + boolean isFirstRun = wmbPreference.getBoolean("FIRSTRUN", true); + if (isFirstRun) { + if(!copyJsonFromAsset()) + { + Log.e(TAG, "initOICStack error: " + "copyJsonFromAsset()"); + Toast.makeText(this,"Can't Copy DB file from asset, please retry start SampleApp.", + Toast.LENGTH_LONG).show(); + return; + } + SharedPreferences.Editor editor = wmbPreference.edit(); + editor.putBoolean("FIRSTRUN", false); + editor.commit(); + } + + cfg = new PlatformConfig( + this, + ServiceType.IN_PROC, + ModeType.CLIENT_SERVER, + "0.0.0.0", // bind to all available interfaces + 0, + QualityOfService.LOW, filePath + OIC_CLIENT_JSON_DB_FILE); + try { + /* + * Initialize DataBase + */ + + OcPlatform.Configure(cfg); + + String sqlDbPath = getFilesDir().getAbsolutePath().replace("files", "databases") + + File.separator; + File file = new File(sqlDbPath); + //check files directory exists + if (!(file.isDirectory())) { + file.mkdirs(); + Log.d(TAG, "Sql db directory created at " + sqlDbPath); + } + Log.d(TAG, "Sql db directory exists at " + sqlDbPath); + + //SQLiteDatabase.openOrCreateDatabase(sqlDbPath+ OIC_SQL_DB_FILE, null); + OcProvisioning.provisionInit(sqlDbPath + OIC_SQL_DB_FILE); + mSecurityMode.setChecked(true); + } catch (OcException e) { + logMessage(TAG + "provisionInit error: " + e.getMessage()); + Log.e(TAG, e.getMessage()); + Toast.makeText(this,"provisionInit error: " + e.getMessage(), + Toast.LENGTH_LONG).show(); + mSecurityMode.setChecked(false); + return; + } catch (UnsatisfiedLinkError e) { + + // Note : Easy setup is built with SECURED = 0, but user still selects Security feature + // while running the Mediator App it couldn't find "libocprovision.so". + // As per the programmer guide, security feature should be invoked only if build is done with SECURED = 1. + mSecurityMode.setChecked(false); + Log.e(TAG, " Easy setup is built with secured = 0, but executed with security feature"); + Toast.makeText(this,"Security is not enabled [Easy setup is built with SECURED = 0]", + Toast.LENGTH_LONG).show(); + return; + } + } + + OcPlatform.OnResourceFoundListener listener = + new OcPlatform.OnResourceFoundListener() { + @Override + public void onFindResourceFailed(Throwable throwable, String s) { + Log.e(TAG, "Failed found resource, ecode: " + s); + } + @Override + public void onResourceFound(OcResource ocResource) { + synchronized (mActivity) { + if(isFirstTime){ + if (null == ocResource) { + Log.e(TAG, "Found resource is invalid"); + return; + } + + if(ocResource.getHost().contains("coap+tcp")) { + Log.d(TAG, "Recv Found resource event from tcp port," + + "ignoring URI : " + ocResource.getUri()); + runOnUiThread(new Runnable() { + @Override + public void run() { + mDiscoverResource.setEnabled(true); + } + }); + return; + } + + // Get the resource URI + String resourceUri = ocResource.getUri(); + // Get the resource host address + String hostAddress = ocResource.getHost(); + Log.d(TAG,"URI of the resource: " + resourceUri); + Log.d(TAG,"Host address of the resource: " + hostAddress); + + runOnUiThread(new Runnable() { + @Override + public void run() { + mDiscoverResource.setText("Found"); + if(mSecurityMode.isChecked()) { + mConfigureSecProcess.setEnabled(true); + } + mGetConfigurationProcess.setEnabled(true); + mProvisionDevPropProcess.setEnabled(true); + mProvisionCloudPropProcess.setEnabled(true); + } + }); + isFirstTime = false; + mRemoteEnrollee = mEasySetup.createRemoteEnrollee(ocResource); + mEnrolleeDeviceID = ocResource.getServerId(); + } + } + } + }; + + private void addListenerForDiscoverEnrollee() { + mDiscoverResource.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Thread thread = new Thread() { + boolean result = true; + @Override + public void run() { + runOnUiThread(new Runnable() { + @Override + public void run() { + mDiscoverResource.setEnabled(false); + } + }); + + try { + String requestUri = OcPlatform.WELL_KNOWN_QUERY + "?rt=ocf.wk.prov"; + OcPlatform.findResource("", + requestUri, + EnumSet.of(OcConnectivityType.CT_DEFAULT), + listener + ); + } + catch (OcException e) { + e.printStackTrace(); + result = false; + runOnUiThread(new Runnable() { + @Override + public void run() { + mDiscoverResource.setEnabled(true); + } + }); + } + } + }; + + thread.start(); + } + }); + } + + private void addListenerForStartConfigureSec() { + mStartConfigureSec.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Thread thread = new Thread() { + @Override + public void run() { + runOnUiThread(new Runnable() { + @Override + public void run() { + mStartConfigureSec.setEnabled(false); + } + }); + + try { + mRemoteEnrollee.provisionSecurity(new SecurityProvisioningCallback() { + @Override + public void onProgress(final SecurityProvisioningStatus securityProvisioningStatus) { + if(securityProvisioningStatus.getESResult() == ESResult.ES_OK) { + runOnUiThread(new Runnable() { + @Override + public void run() { + mSecStateText.setText("Success"); + mSecDevIDText.setText(securityProvisioningStatus.getDevUUID()); + } + }); + } + else { + runOnUiThread(new Runnable() { + @Override + public void run() { + mSecStateText.setText("Failed"); + mStartConfigureSec.setEnabled(true); + } + }); + } + } + }); + } catch (ESException e) { + e.printStackTrace(); + runOnUiThread(new Runnable() { + @Override + public void run() { + mStartConfigureSec.setEnabled(true); + } + }); + } + } + }; + + thread.start(); + } + }); + } + + private void addListenerForStartGetConfiguration(){ + mStartGetConfiguration.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Thread thread = new Thread() { + @Override + public void run() { + runOnUiThread(new Runnable() { + @Override + public void run() { + mGetconfigurationStateText.setText("Process"); + mStartGetConfiguration.setEnabled(false); + } + }); + + try { + mRemoteEnrollee.getConfiguration(new GetConfigurationCallback() { + @Override + public void onProgress(GetConfigurationStatus getConfigurationStatus) { + if(getConfigurationStatus.getESResult() == ESResult.ES_OK) { + + final EnrolleeConf enrolleeConf = getConfigurationStatus.getEnrolleeConf(); + runOnUiThread(new Runnable() { + @Override + public void run() { + mGetconfigurationStateText.setText("Success"); + mDevNameText.setText(enrolleeConf.getDeviceName()); + setWifiModes(enrolleeConf.getWiFiModes()); + setWifiFreq(enrolleeConf.getWiFiFreq()); + + if(enrolleeConf.isCloudAccessible()) { + mCloudAccessableText.setText("TRUE"); + } + else { + mCloudAccessableText.setText("FALSE"); + } + } + }); + + } + else { + runOnUiThread(new Runnable() { + @Override + public void run() { + mGetconfigurationStateText.setText("Failed"); + mStartGetConfiguration.setEnabled(true); + } + }); + } + } + }); + } catch (ESException e) { + e.printStackTrace(); + runOnUiThread(new Runnable() { + @Override + public void run() { + mGetconfigurationStateText.setText("Failed"); + mStartGetConfiguration.setEnabled(true); + } + }); + } + } + }; + + thread.start(); + } + }); + } + + private void addListenerForStartProvisionDevProp() { + mStartProvisionDevProp.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Thread thread = new Thread() { + @Override + public void run() { + try { + runOnUiThread(new Runnable() { + @Override + public void run() { + mProvisionDevPropState.setText("Progress"); + mStartProvisionDevProp.setEnabled(false); + } + }); + + String enrollerSSID = mEnrollerSsidText.getText().toString(); + String enrollerPW = mEnrollerPWText.getText().toString(); + WIFI_AUTHTYPE authType = + WIFI_AUTHTYPE.fromInt(mAuthType.getSelectedItemPosition()); + WIFI_ENCTYPE encType = + WIFI_ENCTYPE.fromInt(mEncType.getSelectedItemPosition()); + String inputLanguage = mInputLanguageText.getText().toString(); + String inputCountry = mInputCountryText.getText().toString(); + + DeviceProp deviceProp = new DeviceProp(); + deviceProp.setWiFiProp(enrollerSSID, enrollerPW, authType, encType); + deviceProp.setDevConfProp(inputLanguage, inputCountry); + + mRemoteEnrollee.provisionDeviceProperties(deviceProp, new DevicePropProvisioningCallback() { + @Override + public void onProgress(DevicePropProvisioningStatus devPropProvisioningStatus) { + final ESResult result = devPropProvisioningStatus.getESResult(); + runOnUiThread(new Runnable() { + @Override + public void run() { + if(result.equals(ESResult.ES_OK)) { + mProvisionDevPropState.setText("Success"); + } + else if(result.equals(ESResult.ES_ERROR)) { + mProvisionDevPropState.setText("Failed"); + } + else if(result.equals(ESResult.ES_UNAUTHORIZED)) { + mProvisionDevPropState.setText("Failed. Need SecProv"); + } + mStartProvisionDevProp.setEnabled(true); + } + }); + } + }); + } catch (ESException e) { + e.printStackTrace(); + runOnUiThread(new Runnable() { + @Override + public void run() { + mProvisionDevPropState.setText("Failed"); + mStartProvisionDevProp.setEnabled(true); + } + }); + } + } + }; + + thread.start(); + } + }); + } + + private void addListenerForStartProvisionCloudProp() { + mStartProvisionCloudProp.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Thread thread = new Thread() { + @Override + public void run() { + runOnUiThread(new Runnable() { + @Override + public void run() { + mProvisionCloudPropState.setText("Progress"); + mStartProvisionCloudProp.setEnabled(false); + } + }); + + try { + String authCode = mAuthCodeText.getText().toString(); + String authProvider = mAuthProviderText.getText().toString(); + String ciserver = mCIServerText.getText().toString(); + + CloudProp cloudProp = new CloudProp(); + cloudProp.setCloudProp(authCode, authProvider, ciserver); + cloudProp.setCloudID("f002ae8b-c42c-40d3-8b8d-1927c17bd1b3"); + + mRemoteEnrollee.provisionCloudProperties(cloudProp, new CloudPropProvisioningCallback() { + @Override + public void onProgress(CloudPropProvisioningStatus cloudProvisioningStatus) { + final ESResult result = cloudProvisioningStatus.getESResult(); + final ESCloudProvState state = cloudProvisioningStatus.getESCloudState(); + runOnUiThread(new Runnable() { + @Override + public void run() { + if(result.equals(ESResult.ES_OK)) { + if(state.equals(ESCloudProvState.ES_CLOUD_ENROLLEE_FOUND)) { + mProvisionCloudPropState.setText("Found Resource"); + } + else if(state.equals(ESCloudProvState.ES_CLOUD_PROVISIONING_SUCCESS)) { + mProvisionCloudPropState.setText("Success"); + } + } + else { + if(state.equals(ESCloudProvState.ES_CLOUD_ENROLLEE_NOT_FOUND)) { + mProvisionCloudPropState.setText("Not Found Resource"); + } + else if(state.equals(ESCloudProvState.ES_CLOUD_PROVISIONING_ERROR)) { + mProvisionCloudPropState.setText("Failed"); + } + mStartProvisionCloudProp.setEnabled(true); + } + } + }); + } + }); + } catch (ESException e) { + e.printStackTrace(); + runOnUiThread(new Runnable() { + @Override + public void run() { + mProvisionCloudPropState.setText("Failed"); + mStartProvisionCloudProp.setEnabled(true); + } + }); + } + } + }; + + thread.start(); + } + }); + } + + private boolean copyJsonFromAsset() { + InputStream inputStream = null; + OutputStream outputStream = null; + int length; + byte[] buffer = new byte[BUFFER_SIZE]; + try { + inputStream = getAssets().open(OIC_CLIENT_JSON_DB_FILE); + File file = new File(filePath); + //check files directory exists + if (!(file.exists() && file.isDirectory())) { + file.mkdirs(); + } + outputStream = new FileOutputStream(filePath + OIC_CLIENT_JSON_DB_FILE); + while ((length = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, length); + } + } catch (NullPointerException e) { + logMessage(TAG + "Null pointer exception " + e.getMessage()); + Log.e(TAG, e.getMessage()); + return false; + } catch (FileNotFoundException e) { + logMessage(TAG + "Json svr db file not found " + e.getMessage()); + Log.e(TAG, e.getMessage()); + return false; + } catch (IOException e) { + logMessage(TAG + OIC_CLIENT_JSON_DB_FILE + " file copy failed"); + Log.e(TAG, e.getMessage()); + return false; + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + Log.e(TAG, e.getMessage()); + return false; + } + } + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + Log.e(TAG, e.getMessage()); + return false; + } + } + } + return true; + } + + public void logMessage(String text) { + + } + + public void setWifiModes(ArrayList types) { + String temp = "WIFI - "; + + for(WIFI_MODE type : types) { + if(type.equals(WIFI_MODE.WIFI_11A)) { + temp = temp + "11A "; + } + else if(type.equals(WIFI_MODE.WIFI_11B)) { + temp = temp + "11B "; + } + else if(type.equals(WIFI_MODE.WIFI_11G)) { + temp = temp + "11G "; + } + else if(type.equals(WIFI_MODE.WIFI_11N)) { + temp = temp + "11N "; + } + else if(type.equals(WIFI_MODE.WIFI_11AC)) { + temp = temp + "11AC "; + } + } + final String modeTypes = temp; + runOnUiThread(new Runnable() { + @Override + public void run() { + mWifiModeText.setText(modeTypes); + } + }); + } + + public void setWifiFreq(final WIFI_FREQ freq) { + runOnUiThread(new Runnable() { + @Override + public void run() { + if(freq.equals(WIFI_FREQ.WIFI_24G)) { + mWifiFreqText.setText("2.4G"); + } + else if(freq.equals(WIFI_FREQ.WIFI_5G)) { + mWifiFreqText.setText("5G"); + } + else if(freq.equals(WIFI_FREQ.WIFI_BOTH)) { + mWifiFreqText.setText("2.4G & 5G"); + } + } + }); + } + + @Override + public void onPresence(OcPresenceStatus status, int sequence, String host) { + final String strStaus = status.getValue(); + Log.d(TAG, "Presence response: " + strStaus + " sequence: " + sequence + " host: " + host); + runOnUiThread(new Runnable() + { + public void run() { + Toast.makeText(EasysetupActivity.this, "Easy-Setup completed", Toast.LENGTH_SHORT).show(); + } + }); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if(resultCode==RESULT_OK && requestCode==1){ + mAuthCode = data.getStringExtra("authCode"); + mAuthProvider = data.getStringExtra("authProvider"); + String text = "Received authCode= " + mAuthCode; + Log.d(TAG, text); + SignUpDevice(); + } + else if(resultCode==RESULT_OK && requestCode==2) + { + mEnrolleeAuthCode = data.getStringExtra("authCode"); + mAuthProvider = data.getStringExtra("authProvider"); + mAuthCodeText.setText(mEnrolleeAuthCode); + mAuthProviderText.setText(mAuthProvider); + mAuthCodeText.setEnabled(false); + mAuthProviderText.setEnabled(false); + + try + { + OcPlatform.subscribePresence(samsungCIServer, "oic.res&di=" + mEnrolleeDeviceID, + EnumSet.of(OcConnectivityType.CT_ADAPTER_TCP, OcConnectivityType.CT_IP_USE_V4), this); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + + OcResource.OnPostListener onRefreshTokenPost = new OcResource.OnPostListener() { + @Override + public void onPostCompleted(List list, OcRepresentation ocRepresentation) { + Log.d(TAG, "onRefreshTokenPost.."); + try { + mAccessToken = ocRepresentation.getValue("accesstoken"); + mRefreshtoken = ocRepresentation.getValue("refreshtoken"); + + saveCloudTokenAtSharedPreferences(); + } + catch (OcException e) + { + e.printStackTrace(); + } + + SignInDevice(); + } + + @Override + public void onPostFailed(Throwable throwable) { + Log.d(TAG, "onRefreshTokenPost failed.."); + } + }; + + public void RefreshToken() { + try { + OcResource authResource = OcPlatform.constructResourceObject(samsungCIServer, "/.well-known/ocf/account/tokenrefresh", + EnumSet.of(OcConnectivityType.CT_ADAPTER_TCP, OcConnectivityType.CT_IP_USE_V4), + false, Arrays.asList("oic.wk.account"), Arrays.asList(OcPlatform.DEFAULT_INTERFACE)); + OcRepresentation rep = new OcRepresentation(); + + runOnUiThread(new Runnable() + { + public void run() { + Toast.makeText(EasysetupActivity.this, "RefreshToken in progress..", Toast.LENGTH_SHORT).show(); + } + }); + + rep.setValue("di", deviceID); + rep.setValue("granttype", "refresh_token"); + rep.setValue("refreshtoken", mRefreshtoken); + rep.setValue("uid", mUserID); + authResource.post(rep, new HashMap(), onRefreshTokenPost); + } + catch(OcException e) + { + e.printStackTrace(); + } + + Log.d(TAG, "No error while executing login"); + } + + private void saveCloudTokenAtSharedPreferences() { + Log.d(TAG, "accesstoken: " + mAccessToken); + SharedPreferences settings = getApplicationContext().getSharedPreferences("IoTivityCloud", 0); + SharedPreferences.Editor editor = settings.edit(); + editor.putString("accesstoken", mAccessToken); + editor.putString("refreshtoken", mRefreshtoken); + editor.putString("uid", mUserID); + + if(editor.commit() == true) + Log.d(TAG, "accesstoken saved"); + else + Log.d(TAG, "accesstoken not saved"); + } + + OcResource.OnPostListener onSignUpPost = new OcResource.OnPostListener() { + @Override + public void onPostCompleted(List list, OcRepresentation ocRepresentation) { + Log.d(TAG, "onSignUpPost.."); + try { + runOnUiThread(new Runnable() + { + public void run() { + Toast.makeText(EasysetupActivity.this, "Sign-up completed", Toast.LENGTH_SHORT).show(); + } + }); + + mAccessToken = ocRepresentation.getValue("accesstoken"); + mRefreshtoken = ocRepresentation.getValue("refreshtoken"); + mUserID = ocRepresentation.getValue("uid"); + + if(mAccessToken != null) + { + saveCloudTokenAtSharedPreferences(); + SignInDevice(); + } + } + catch (OcException e) + { + e.printStackTrace(); + } + } + + @Override + public void onPostFailed(Throwable throwable) { + Log.d(TAG, "onSignUpPost failed.. : " + throwable.getMessage()); + } + }; + + private void SignUpDevice() { + try { + OcResource authResource = OcPlatform.constructResourceObject(samsungCIServer, "/.well-known/ocf/account", + EnumSet.of(OcConnectivityType.CT_ADAPTER_TCP, OcConnectivityType.CT_IP_USE_V4), + false, Arrays.asList("oic.wk.account"), Arrays.asList(OcPlatform.DEFAULT_INTERFACE)); + OcRepresentation rep = new OcRepresentation(); + + runOnUiThread(new Runnable() + { + public void run() { + Toast.makeText(EasysetupActivity.this, "SignUpDevice in progress..", Toast.LENGTH_SHORT).show(); + } + }); + + rep.setValue("di", deviceID); + rep.setValue("authprovider", mAuthProvider); + rep.setValue("authcode", mAuthCode); + authResource.post(rep, new HashMap(), onSignUpPost); + } + catch(OcException e) + { + e.printStackTrace(); + } + + Log.d(TAG, "No error while executing SignUp"); + } + + OcResource.OnPostListener onSignInPost = new OcResource.OnPostListener() { + @Override + public void onPostCompleted(List list, OcRepresentation ocRepresentation) { + Log.d(TAG, "onSignInPost.."); + + runOnUiThread(new Runnable() + { + public void run() { + Toast.makeText(EasysetupActivity.this, "Sign-in completed", Toast.LENGTH_SHORT).show(); + } + }); + } + + @Override + public void onPostFailed(Throwable ex) { + if (ex instanceof OcException) { + OcException ocEx = (OcException) ex; + ErrorCode errCode = ocEx.getErrorCode(); + Log.e(TAG, ocEx.getMessage()); + if (ErrorCode.UNAUTHORIZED_REQ != errCode) { + RefreshToken(); + } + } + } + }; + + private void SignInDevice() { + try { + OcResource authResource = OcPlatform.constructResourceObject(samsungCIServer, "/.well-known/ocf/account/session", + EnumSet.of(OcConnectivityType.CT_ADAPTER_TCP, OcConnectivityType.CT_IP_USE_V4), + false, Arrays.asList("oic.wk.account"), Arrays.asList(OcPlatform.DEFAULT_INTERFACE)); + OcRepresentation rep = new OcRepresentation(); + + runOnUiThread(new Runnable() + { + public void run() { + Toast.makeText(EasysetupActivity.this, "SignInDevice in progress..", Toast.LENGTH_SHORT).show(); + } + }); + + rep.setValue("di", deviceID); + rep.setValue("accesstoken", mAccessToken); + rep.setValue("login", true); + rep.setValue("uid", mUserID); + authResource.post(rep, new HashMap(), onSignInPost); + + } + catch(OcException e) + { + e.printStackTrace(); + } + + Log.d(TAG, "No error while executing login"); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + } +} diff --git a/service/easy-setup/sampleapp/mediator/android/EasySetup/app/src/main/java/org/iotivity/service/easysetup/LoginActivity.java b/service/easy-setup/sampleapp/mediator/android/EasySetup/app/src/main/java/org/iotivity/service/easysetup/LoginActivity.java new file mode 100644 index 0000000..ffb3bc8 --- /dev/null +++ b/service/easy-setup/sampleapp/mediator/android/EasySetup/app/src/main/java/org/iotivity/service/easysetup/LoginActivity.java @@ -0,0 +1,124 @@ +/** + * *************************************************************** + *

+ * Copyright 2015 Samsung Electronics All Rights Reserved. + *

+ *

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *

+ * **************************************************************** + */ + +package org.iotivity.service.easysetup; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.net.UrlQuerySanitizer; +import android.net.wifi.WifiConfiguration; +import android.net.wifi.WifiManager; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.preference.PreferenceManager; +import android.util.Log; +import android.view.View; +import android.view.View.OnClickListener; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.Button; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.RadioButton; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.Toast; + +import org.iotivity.base.ModeType; +import org.iotivity.base.OcException; +import org.iotivity.base.OcPlatform; +import org.iotivity.base.OcProvisioning; +import org.iotivity.base.PlatformConfig; +import org.iotivity.base.QualityOfService; +import org.iotivity.base.ServiceType; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + + +public class LoginActivity extends Activity { + private static final String TAG = "Easysetup Login: "; + + /* Samsung account */ + private WebView mWebView = null; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_login); + + /* For Samsung account authentifaction */ + mWebView = (WebView) findViewById(R.id.webView); + mWebView.setVisibility(View.VISIBLE); + mWebView.setInitialScale(200); + mWebView.getSettings().setJavaScriptEnabled(true); + //mWebView.getSettings().setSupportZoom(true); + mWebView.getSettings().setBuiltInZoomControls(true); + mWebView.setWebViewClient(new WebViewClientClass()); + + mWebView.loadUrl("https://github.com/login?return_to=%2Flogin%2Foauth%2Fauthorize%3Fclient_id%3Dea9c18f540323b0213d0%26redirect_uri%3Dhttp%253A%252F%252Fwww.example.com%252Foauth_callback%252F"); + } + + public void onDestroy() { + super.onDestroy(); + } + + private class WebViewClientClass extends WebViewClient { + + @Override + public void onPageFinished(WebView view, String url) { + Log.e(TAG, "called!!! url=" + url); + + if(url.contains("http://www.example.com/oauth_callback/")){ + + mWebView.setVisibility(View.INVISIBLE); + + //parsing url + UrlQuerySanitizer sanitizer = new UrlQuerySanitizer(); + sanitizer.setAllowUnregisteredParamaters(true); + sanitizer.parseUrl(url); + + String mAuthCode = null; + mAuthCode = sanitizer.getValue("code"); + + Intent intent = getIntent(); + intent.putExtra("authCode", mAuthCode); + intent.putExtra("authProvider", "github"); + + setResult(RESULT_OK, intent); + + finish(); + } + } + } +} diff --git a/service/easy-setup/sampleapp/mediator/android/EasySetup/app/src/main/java/org/iotivity/service/easysetup/MainActivity.java b/service/easy-setup/sampleapp/mediator/android/EasySetup/app/src/main/java/org/iotivity/service/easysetup/MainActivity.java deleted file mode 100755 index ad34966..0000000 --- a/service/easy-setup/sampleapp/mediator/android/EasySetup/app/src/main/java/org/iotivity/service/easysetup/MainActivity.java +++ /dev/null @@ -1,577 +0,0 @@ -/** - * *************************************************************** - *

- * Copyright 2015 Samsung Electronics All Rights Reserved. - *

- *

- *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *

- * **************************************************************** - */ - -package org.iotivity.service.easysetup; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; -import android.database.sqlite.SQLiteDatabase; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; -import android.net.wifi.WifiConfiguration; -import android.net.wifi.WifiManager; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.preference.PreferenceManager; -import android.util.Log; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.Button; -import android.widget.EditText; -import android.widget.LinearLayout; -import android.widget.ProgressBar; -import android.widget.RadioButton; -import android.widget.RelativeLayout; -import android.widget.TextView; -import android.widget.Toast; - -import org.iotivity.base.ModeType; -import org.iotivity.base.OcException; -import org.iotivity.base.OcPlatform; -import org.iotivity.base.OcProvisioning; -import org.iotivity.base.PlatformConfig; -import org.iotivity.base.QualityOfService; -import org.iotivity.base.ServiceType; -import org.iotivity.service.easysetup.mediator.EasySetupService; -import org.iotivity.service.easysetup.mediator.EasySetupStatus; -import org.iotivity.service.easysetup.mediator.EnrolleeDevice; -import org.iotivity.service.easysetup.mediator.IpOnBoardingConnection; -import org.iotivity.service.easysetup.mediator.EnrolleeDeviceFactory; -import org.iotivity.service.easysetup.mediator.WiFiOnBoardingConfig; -import org.iotivity.service.easysetup.mediator.WiFiProvConfig; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - - -public class MainActivity extends Activity { - private static final String TAG = "Easysetup Mediator: "; - - /* Status to update the UI */ - public static final int SUCCESS = 0; - public static final int FAILED = 1; - public static final int STATE_CHANGED = 2; - - public static final String OIC_CLIENT_JSON_DB_FILE = "oic_svr_db_client.dat"; - public static final String OIC_SQL_DB_FILE = "PDM.db"; - - private static final int BUFFER_SIZE = 1024; - private String filePath = ""; - private boolean isSecurityEnabled = false; - //create platform config - PlatformConfig cfg; - - - String mSoftAPSsid; - String mSoftAPPassword; - String mEnrollerSsid; - String mEnrollerPassword; - - EditText mSoftAPSsidText; - EditText mSoftAPPassText; - EditText mEnrollerSsidText; - EditText mEnrollerPasswordPassText; - - TextView mDeviceIpTextView; - TextView mDeviceMacTextView; - TextView mResultTextView; - - ProgressBar mProgressbar; - - Button mStartButton; - Button mStopButton; - - RadioButton mEnrollee; - RadioButton mMediator; - RadioButton mEnableSecurity; - - LinearLayout mSoftAP; - RelativeLayout mDeviceInfo; - TextView mDeviceText; - - Handler mHandler = new ThreadHandler(); - - /** - * Objects to be instantiated by the programmer - */ - WiFiProvConfig mWiFiProvConfig; - WiFiOnBoardingConfig mWiFiOnBoardingConfig; - EasySetupService mEasySetupService; - EnrolleeDeviceFactory mDeviceFactory; - EnrolleeDevice mDevice; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - - /* - * Initialize widgets to get user input for target network's SSID & - * password - */ - mSoftAP = (LinearLayout) findViewById(R.id.softAP); - mDeviceInfo = (RelativeLayout) findViewById(R.id.deviceInfo); - mDeviceText = (TextView) findViewById(R.id.textViewDeviceinfo); - - mSoftAPSsidText = (EditText) findViewById(R.id.ssid); - mSoftAPPassText = (EditText) findViewById(R.id.password); - mEnrollerSsidText = (EditText) findViewById(R.id.enrolleeSsid); - mEnrollerPasswordPassText = (EditText) findViewById(R.id.enrolleePass); - mDeviceIpTextView = (TextView) findViewById(R.id.ipAddr); - mDeviceMacTextView = (TextView) findViewById(R.id.hardAddr); - - mResultTextView = (TextView) findViewById(R.id.status); - mProgressbar = (ProgressBar) findViewById(R.id.progressBar); - - mEnrollee = (RadioButton) findViewById(R.id.enrollee); - mMediator = (RadioButton) findViewById(R.id.mediator); - mEnableSecurity = (RadioButton) findViewById(R.id.enablesecurity); - - mStartButton = (Button) findViewById(R.id.startSetup); - - mEnrollee.setChecked(false); - mMediator.setChecked(false); - mStartButton.setEnabled(false); - - /* Create EnrolleeDevice Factory instance */ - mDeviceFactory = EnrolleeDeviceFactory - .newInstance(getApplicationContext()); - - addListenerForStartAP(); - addListenerForStopAP(); - - // default values for target network - mEnrollerSsidText.setText(R.string.target_default_ssid); - mEnrollerPasswordPassText.setText(R.string.target_default_pwd); - mSoftAPSsidText.setEnabled(false); - mSoftAPPassText.setEnabled(false); - - mEnrollee.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - - mMediator.setChecked(false); - AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder( - MainActivity.this); - alertDialogBuilder.setTitle("Network selection"); - alertDialogBuilder - .setMessage("Proceed to select the network!") - .setCancelable(false) - .setPositiveButton("Yes", - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, - int id) { - MainActivity.this - .startActivity(new Intent( - WifiManager.ACTION_PICK_WIFI_NETWORK)); - - mStartButton.setEnabled(true); - mSoftAP.setVisibility(View.INVISIBLE); - mDeviceInfo - .setVisibility(View.INVISIBLE); - mDeviceText - .setVisibility(View.INVISIBLE); - } - }) - .setNegativeButton("No", - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, - int id) { - mEnrollee.setChecked(false); - mStartButton.setEnabled(false); - dialog.cancel(); - } - }); - alertDialogBuilder.create().show(); - } - }); - - mMediator.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - mStartButton.setEnabled(true); - mEnrollee.setChecked(false); - mSoftAPSsidText.setEnabled(false); - mSoftAPPassText.setEnabled(false); - mSoftAPSsidText.setText(R.string.softAP_ssid); - mSoftAPPassText.setText(R.string.softAP_pwd); - mDeviceIpTextView.setText(R.string.not_available); - mDeviceMacTextView.setText(R.string.not_available); - mResultTextView.setText(R.string.not_started); - mSoftAP.setVisibility(View.VISIBLE); - mDeviceInfo.setVisibility(View.VISIBLE); - mDeviceText.setVisibility(View.VISIBLE); - } - }); - - mEnableSecurity.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - filePath = getFilesDir().getPath() + "/"; - if (isSecurityEnabled) { - isSecurityEnabled = false; - mEnableSecurity.setChecked(false); - } - else { - isSecurityEnabled = true; - mEnableSecurity.setChecked(true); - } - //copy json when application runs first time - SharedPreferences wmbPreference = PreferenceManager.getDefaultSharedPreferences - (getApplicationContext()); - boolean isFirstRun = wmbPreference.getBoolean("FIRSTRUN", true); - if (isFirstRun) { - copyJsonFromAsset(); - SharedPreferences.Editor editor = wmbPreference.edit(); - editor.putBoolean("FIRSTRUN", false); - editor.commit(); - } - - initOICStack(); - } - }); - /* Create Easy Setup Service instance */ - mEasySetupService = EasySetupService.getInstance( - getApplicationContext(), new EasySetupStatus() { - - @Override - public void onFinished(final EnrolleeDevice enrolledevice) { - Log.i("MainActivity", "onFinished() is received " - + enrolledevice.isSetupSuccessful()); - if (enrolledevice.isSetupSuccessful()) { - mHandler.sendEmptyMessage(SUCCESS); - } else { - mHandler.sendEmptyMessage(FAILED); - } - } - - @Override - public void onProgress(EnrolleeDevice enrolleeDevice) { - Log.i("MainActivity", "onProgress() is received "); - mHandler.sendEmptyMessage(STATE_CHANGED); - } - }); - } - - /** - * configure OIC platform and call findResource - */ - private void initOICStack() { - cfg = new PlatformConfig( - this, - ServiceType.IN_PROC, - ModeType.CLIENT_SERVER, - "0.0.0.0", // bind to all available interfaces - 0, - QualityOfService.LOW, filePath + OIC_CLIENT_JSON_DB_FILE); - try { - /* - * Initialize DataBase - */ - - OcPlatform.Configure(cfg); - - String sqlDbPath = getFilesDir().getAbsolutePath().replace("files", "databases") + - File.separator; - File file = new File(sqlDbPath); - //check files directory exists - if (!(file.isDirectory())) { - file.mkdirs(); - Log.d(TAG, "Sql db directory created at " + sqlDbPath); - } - Log.d(TAG, "Sql db directory exists at " + sqlDbPath); - - //SQLiteDatabase.openOrCreateDatabase(sqlDbPath+ OIC_SQL_DB_FILE, null); - OcProvisioning.provisionInit(sqlDbPath + OIC_SQL_DB_FILE); - } catch (OcException e) { - logMessage(TAG + "provisionInit error: " + e.getMessage()); - Log.e(TAG, e.getMessage()); - } catch (UnsatisfiedLinkError e) { - - // Note : Easy setup is built with SECURED = 0, but user still selects Security feature - // while running the Mediator App it couldn't find "libocprovision.so". - // As per the programmer guide, security feature should be invoked only if build is done with SECURED = 1. - Log.e(TAG, " Easy setup is built with secured = 0, but executed with security feature"); - Toast.makeText(this,"Security is not enabled [Easy setup is built with SECURED = 0]", - Toast.LENGTH_LONG).show(); - mEnableSecurity.setChecked(false); - } - } - /** - * Copy svr db json file from assets folder to app data files dir - */ - private void copyJsonFromAsset() { - InputStream inputStream = null; - OutputStream outputStream = null; - int length; - byte[] buffer = new byte[BUFFER_SIZE]; - try { - inputStream = getAssets().open(OIC_CLIENT_JSON_DB_FILE); - File file = new File(filePath); - //check files directory exists - if (!(file.exists() && file.isDirectory())) { - file.mkdirs(); - } - outputStream = new FileOutputStream(filePath + OIC_CLIENT_JSON_DB_FILE); - while ((length = inputStream.read(buffer)) != -1) { - outputStream.write(buffer, 0, length); - } - } catch (NullPointerException e) { - logMessage(TAG + "Null pointer exception " + e.getMessage()); - Log.e(TAG, e.getMessage()); - } catch (FileNotFoundException e) { - logMessage(TAG + "Json svr db file not found " + e.getMessage()); - Log.e(TAG, e.getMessage()); - } catch (IOException e) { - logMessage(TAG + OIC_CLIENT_JSON_DB_FILE + " file copy failed"); - Log.e(TAG, e.getMessage()); - } finally { - if (inputStream != null) { - try { - inputStream.close(); - } catch (IOException e) { - Log.e(TAG, e.getMessage()); - } - } - if (outputStream != null) { - try { - outputStream.close(); - } catch (IOException e) { - Log.e(TAG, e.getMessage()); - } - } - } - } - - public void logMessage(String text) { - - } - - - public void onDestroy() { - super.onDestroy(); - /* Reset the Easy setup process */ - if (mEasySetupService != null) { - mEasySetupService.finish(); - } - } - - public void addListenerForStartAP() { - mStartButton = (Button) findViewById(R.id.startSetup); - mStartButton.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View arg0) { - try { - if (mEnrollee.isChecked()) { - // Check the wifi connectivity - if (!isConnectedTowifi()) { - return; - } - - mEnrollerSsid = mEnrollerSsidText.getText().toString(); - mEnrollerPassword = mEnrollerPasswordPassText.getText() - .toString(); - - mWiFiProvConfig = new WiFiProvConfig(mEnrollerSsid, - mEnrollerPassword); - mWiFiProvConfig.setSecured(isSecurityEnabled); - mDevice = mDeviceFactory - .newEnrolleeDevice(mWiFiProvConfig); - Thread thread = new Thread() { - @Override - public void run() { - try { - mEasySetupService.startSetup(mDevice); - }catch (Exception e) { - e.printStackTrace(); - } - } - }; - thread.start(); - } else { - mSoftAPSsid = mSoftAPSsidText.getText().toString(); - mSoftAPPassword = mSoftAPPassText.getText().toString(); - mEnrollerSsid = mEnrollerSsidText.getText().toString(); - mEnrollerPassword = mEnrollerPasswordPassText.getText() - .toString(); - - mWiFiProvConfig = new WiFiProvConfig(mEnrollerSsid, - mEnrollerPassword); - mWiFiProvConfig.setSecured(isSecurityEnabled); - mWiFiOnBoardingConfig = new WiFiOnBoardingConfig(); - - /* - * Provide the target credentials to be provisioned to - * the Enrollee by Mediator - */ - mWiFiOnBoardingConfig.setSSId("EasySetup123"); - mWiFiOnBoardingConfig.setSharedKey("EasySetup123"); - mWiFiOnBoardingConfig - .setAuthAlgo(WifiConfiguration.AuthAlgorithm.OPEN); - mWiFiOnBoardingConfig - .setKms(WifiConfiguration.KeyMgmt.WPA_PSK); - mDevice = mDeviceFactory.newEnrolleeDevice( - mWiFiProvConfig, mWiFiOnBoardingConfig); - mEasySetupService.startSetup(mDevice); - } - mProgressbar.setVisibility(View.VISIBLE); - mProgressbar.setIndeterminate(true); - mStartButton.setEnabled(false); - mResultTextView.setText(R.string.running); - - // Reset Device information - mDeviceIpTextView.setText(R.string.not_available); - mDeviceMacTextView.setText(R.string.not_available); - mStopButton.setEnabled(true); - - } catch (Exception e) { - e.printStackTrace(); - } - } - }); - } - - public void addListenerForStopAP() { - mStopButton = (Button) findViewById(R.id.stopSetup); - mStopButton.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View arg0) { - mStartButton.setEnabled(true); - mStopButton.setEnabled(false); - mResultTextView.setText(R.string.stopped); - mProgressbar.setIndeterminate(false); - mProgressbar.setVisibility(View.INVISIBLE); - try { - Thread thread = new Thread() { - @Override - public void run() { - try { - mEasySetupService.stopSetup(mDevice); - }catch (Exception e) { - e.printStackTrace(); - } - } - }; - thread.start(); - - }catch(Exception e){ - Log.i("Stop setup", "Exception"); - } - } - }); - } - - private boolean isConnectedTowifi() { - - AlertDialog dialog; - ConnectivityManager connManager; - NetworkInfo wifi; - - // Check the wifi connectivity - connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); - wifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); - if (false == wifi.isConnected()) { - - AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); - dialogBuilder.setTitle("Error"); - dialogBuilder - .setMessage("WiFi is not enabled/connected! Please connect the WiFi.."); - dialogBuilder.setCancelable(false); - dialogBuilder.setPositiveButton("OK", - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - - MainActivity.this.startActivity(new Intent( - WifiManager.ACTION_PICK_WIFI_NETWORK)); - - } - }); - dialogBuilder.setNegativeButton("Cancel", - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - } - }); - - dialog = dialogBuilder.create(); - dialog.show(); - return false; - } - return true; - } - - class ThreadHandler extends Handler { - @Override - public void handleMessage(Message msg) { - - switch (msg.what) { - case SUCCESS: { - - mProgressbar.setIndeterminate(false); - mStopButton.setEnabled(false); - mStartButton.setEnabled(true); - mProgressbar.setVisibility(View.INVISIBLE); - String resultMsg = "Device configured successfully"; - mResultTextView.setText(R.string.success); - - /* Update device information on the Ui */ - IpOnBoardingConnection connection = (IpOnBoardingConnection) mDevice - .getConnection(); - mDeviceIpTextView.setText(connection.getIp()); - mDeviceMacTextView.setText(connection.getHardwareAddress()); - - Toast.makeText(getApplicationContext(), resultMsg, - Toast.LENGTH_SHORT).show(); - break; - } - case FAILED: { - - mProgressbar.setIndeterminate(false); - mStopButton.setEnabled(false); - mStartButton.setEnabled(true); - mProgressbar.setVisibility(View.INVISIBLE); - String resultMsg = "Device configuration failed"; - mResultTextView.setText(R.string.failed); - Toast.makeText(getApplicationContext(), resultMsg, - Toast.LENGTH_SHORT).show(); - break; - } - - case STATE_CHANGED: { - String resultMsg = "Device state changed"; - Toast.makeText(getApplicationContext(), resultMsg, - Toast.LENGTH_SHORT).show(); - break; - } - } - } - } -} diff --git a/service/easy-setup/sampleapp/mediator/android/EasySetup/app/src/main/res/layout/activity_login.xml b/service/easy-setup/sampleapp/mediator/android/EasySetup/app/src/main/res/layout/activity_login.xml new file mode 100644 index 0000000..96a7df3 --- /dev/null +++ b/service/easy-setup/sampleapp/mediator/android/EasySetup/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/service/easy-setup/sampleapp/mediator/android/EasySetup/app/src/main/res/layout/activity_main.xml b/service/easy-setup/sampleapp/mediator/android/EasySetup/app/src/main/res/layout/activity_main.xml deleted file mode 100755 index 5d02597..0000000 --- a/service/easy-setup/sampleapp/mediator/android/EasySetup/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,269 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -