[Easy-Setup] Changed the enrollee's cpp files to c files
authorJay Sharma <jay.sharma@samsung.com>
Fri, 18 Mar 2016 17:07:54 +0000 (22:37 +0530)
committerMadan Lanka <lanka.madan@samsung.com>
Mon, 21 Mar 2016 10:03:01 +0000 (10:03 +0000)
- Updated the enrollee SDK.
- Updated the Linux Application

Change-Id: Ieacc114d8cff3caaeb5e9f5f9cb1cdc972258d31
Signed-off-by: Jay Sharma <jay.sharma@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/6087
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Madan Lanka <lanka.madan@samsung.com>
20 files changed:
service/easy-setup/enrollee/SConscript
service/easy-setup/enrollee/arduino/easysetup.cpp [moved from service/easy-setup/enrollee/src/easysetup.cpp with 100% similarity]
service/easy-setup/enrollee/arduino/onboarding.cpp [moved from service/easy-setup/enrollee/src/onboarding.cpp with 100% similarity, mode: 0644]
service/easy-setup/enrollee/arduino/resourcehandler.cpp [moved from service/easy-setup/enrollee/src/resourcehandler.cpp with 100% similarity, mode: 0644]
service/easy-setup/enrollee/arduino/softap.cpp [moved from service/easy-setup/enrollee/src/softap.cpp with 100% similarity]
service/easy-setup/enrollee/linux/wifi/networkhandler.c [moved from service/easy-setup/enrollee/linux/wifi/networkhandler.cpp with 98% similarity]
service/easy-setup/enrollee/linux/wifi/softapnative.c [moved from service/easy-setup/enrollee/tizen/wifi/softapnative.cpp with 100% similarity]
service/easy-setup/enrollee/src/easysetup.c [new file with mode: 0644]
service/easy-setup/enrollee/src/easysetupcallbacks.h [new file with mode: 0644]
service/easy-setup/enrollee/src/onboarding.c [new file with mode: 0644]
service/easy-setup/enrollee/src/resourcehandler.c [new file with mode: 0644]
service/easy-setup/enrollee/src/resourcehandler.h
service/easy-setup/enrollee/src/softap.c [new file with mode: 0644]
service/easy-setup/enrollee/src/softap.h
service/easy-setup/enrollee/tizen/wifi/networkhandler.c [moved from service/easy-setup/enrollee/tizen/wifi/networkhandler.cpp with 100% similarity]
service/easy-setup/enrollee/tizen/wifi/softapnative.c [moved from service/easy-setup/enrollee/linux/wifi/softapnative.cpp with 100% similarity]
service/easy-setup/enrollee/unittests/enrolleetests.cpp
service/easy-setup/inc/escommon.h
service/easy-setup/sampleapp/enrollee/linux/SConscript
service/easy-setup/sampleapp/enrollee/linux/enrolleewifi.c [moved from service/easy-setup/sampleapp/enrollee/linux/enrolleewifi.cpp with 54% similarity, mode: 0644]

index 0ee8b10..f129242 100644 (file)
@@ -59,7 +59,8 @@ enrollee_env.PrependUnique(CPPPATH = [
                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/src',
+               enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/arduino'])
 
 if enrollee_env.get('SECURED') == '1':
        enrollee_env.AppendUnique(CPPPATH = [
@@ -112,12 +113,12 @@ if target_os == 'arduino':
 es_enrollee_src = None
 
 if target_os == 'linux':
-       es_enrollee_common_src =        [enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/easysetup.cpp',
-               enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/onboarding.cpp',
-               enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/resourcehandler.cpp',
-               enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/softap.cpp',
-               enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/linux/wifi/softapnative.cpp',
-               enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/linux/wifi/networkhandler.cpp']
+       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)
 
@@ -126,21 +127,21 @@ if target_os == 'linux':
 
 if target_os == 'tizen':
        enrollee_sdk_shared = enrollee_env.SharedLibrary('ESEnrolleeSDK', [
-               enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/easysetup.cpp',
-               enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/onboarding.cpp',
-               enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/softap.cpp',
-               enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/resourcehandler.cpp',
-               enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/tizen/wifi/networkhandler.cpp',
-               enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/tizen/wifi/softapnative.cpp'])
+               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')
 
 if target_os == 'arduino':
        es_sdk_static = enrollee_env.StaticLibrary('ESEnrolleeSDK', [
-               enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/easysetup.cpp',
-               enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/onboarding.cpp',
-               enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/softap.cpp',
-               enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/resourcehandler.cpp',
+               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')
 
@@ -26,7 +26,7 @@
 #include "easysetup.h"
 #include "oic_string.h"
 
-#define LOG_TAG "TIZEN ES"
+#define LOG_TAG "LINUX ES"
 
 const char *gSsid = "DLNA_LISMORE1";
 const char *gPass = "dlna@010203";
diff --git a/service/easy-setup/enrollee/src/easysetup.c b/service/easy-setup/enrollee/src/easysetup.c
new file mode 100644 (file)
index 0000000..dcb35a8
--- /dev/null
@@ -0,0 +1,198 @@
+//******************************************************************
+//
+// 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"
+#include "easysetupcallbacks.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 EventCallback gEnrolleeStatusCb = NULL;
+
+/**
+ * @var gIsSecured
+ * @brief Variable to check if secure mode is enabled or not.
+ */
+static bool gIsSecured = false;
+
+void OnboardingCallback(ESResult esResult)
+{
+        OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, "OnboardingCallback 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 ProvisioningCallback(ESResult esResult)
+{
+    OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, "ProvisioningCallback 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, OnboardingCallbackTargetNet);
+    }
+    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 OnboardingCallbackTargetNet(ESResult esResult)
+{
+    OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, "OnboardingCallback 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 InitEasySetup(OCConnectivityType networkType, const char *ssid, const char *passwd,
+        bool isSecured,
+        EventCallback cb)
+{
+    OIC_LOG(INFO, ES_ENROLLEE_TAG, "InitEasySetup IN");
+    if(!ValidateParam(networkType,ssid,passwd,cb))
+    {
+        OIC_LOG(ERROR, ES_ENROLLEE_TAG,
+                            "InitEasySetup::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, OnboardingCallback))
+    {
+        OIC_LOG(ERROR, ES_ENROLLEE_TAG, "InitEasySetup::On-boarding failed");
+        cb(ES_ERROR, ES_INIT_STATE);
+        return ES_ERROR;
+    }
+
+    OIC_LOG(INFO, ES_ENROLLEE_TAG, "InitEasySetup OUT");
+    return ES_OK;
+}
+
+ESResult TerminateEasySetup()
+{
+    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, "TerminateEasySetup success");
+    return ES_OK;
+}
+
+ESResult InitProvisioning()
+{
+    OIC_LOG(INFO, ES_ENROLLEE_TAG, "InitProvisioning <<IN>>");
+
+    if (CreateProvisioningResource(gIsSecured) != OC_STACK_OK)
+    {
+        OIC_LOG(ERROR, ES_ENROLLEE_TAG, "CreateProvisioningResource error");
+        return ES_ERROR;
+    }
+
+    RegisterResourceEventCallBack(ProvisioningCallback);
+
+    OIC_LOG(INFO, ES_ENROLLEE_TAG, "InitProvisioning OUT");
+    return ES_RESOURCECREATED;
+}
+
+static bool ValidateParam(OCConnectivityType networkType, const char *ssid, const char *passwd,
+              EventCallback cb)
+{
+    if (!ssid || !passwd || !cb)
+    {
+        OIC_LOG(ERROR, ES_ENROLLEE_TAG, "ValidateParam - Invalid parameters");
+        return false;
+    }
+    return true;
+}
+
diff --git a/service/easy-setup/enrollee/src/easysetupcallbacks.h b/service/easy-setup/enrollee/src/easysetupcallbacks.h
new file mode 100644 (file)
index 0000000..bf552f0
--- /dev/null
@@ -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.
+//
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+/**
+ * @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 OnboardingCallback(ESResult esResult);
+
+ /* 
+ * Callback for provisioning
+ */
+void ProvisioningCallback(ESResult SSSS);
+
+ /* 
+ * Callback for on boarding target Network
+ */
+void OnboardingCallbackTargetNet(ESResult esResult);
+
+ /* 
+ * Function for validating the parameter for InitEasySetup API
+ */
+static bool ValidateParam(OCConnectivityType networkType, const char *ssid, const char *passwd,
+              EventCallback 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
new file mode 100644 (file)
index 0000000..42551d7
--- /dev/null
@@ -0,0 +1,94 @@
+//******************************************************************
+//
+// 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, NetworkEventCallback 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/resourcehandler.c b/service/easy-setup/enrollee/src/resourcehandler.c
new file mode 100644 (file)
index 0000000..8533ea6
--- /dev/null
@@ -0,0 +1,396 @@
+//******************************************************************
+//
+// 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 <stdio.h>
+
+#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);
+
+ResourceEventCallback gNetworkInfoProvEventCb = NULL;
+
+void RegisterResourceEventCallBack(ResourceEventCallback cb)
+{
+    gNetworkInfoProvEventCb = cb;
+}
+
+void UnRegisterResourceEventCallBack()
+{
+    if (gNetworkInfoProvEventCb)
+    {
+        gNetworkInfoProvEventCb = NULL;
+    }
+}
+
+void GetTargetNetworkInfoFromProvResource(char *name, char *pass)
+{
+    if (name != NULL && pass != NULL)
+    {
+        OICStrcpy(name, sizeof(name), gProvResource.tnn);
+        OICStrcpy(pass, sizeof(pass), 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;
+    }
+
+    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
+        {
+            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.");
+    }
+
+    OICStrcpy(gProvResource.tnn, sizeof(gProvResource.tnn), "");
+    OICStrcpy(gProvResource.cd, sizeof(gProvResource.cd), "");
+
+    char* tnn;
+    if (OCRepPayloadGetPropString(input, OC_RSRVD_ES_TNN, &tnn))
+    {
+        OICStrcpy(gProvResource.tnn, sizeof(gProvResource.tnn), tnn);
+        OIC_LOG(INFO, ES_RH_TAG, "got ssid");
+    }
+
+    OIC_LOG_V(INFO, ES_RH_TAG, "gProvResource.tnn %s", gProvResource.tnn);
+
+    char* cd;
+    if (OCRepPayloadGetPropString(input, OC_RSRVD_ES_CD, &cd))
+    {
+        OICStrcpy(gProvResource.cd, sizeof(gProvResource.cd), cd);
+        OIC_LOG(INFO, ES_RH_TAG, "got password");
+    }OIC_LOG_V(INFO, ES_RH_TAG, "gProvResource.cd %s", gProvResource.cd);
+
+    gProvResource.ps = ES_PS_PROVISIONING_COMPLETED;
+
+    OIC_LOG_V(INFO, ES_RH_TAG, "gProvResource.ps %lld", gProvResource.ps);
+
+    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";
+    }
+}
+
index 243f8f2..5afa812 100644 (file)
 #ifndef ES_RESOURCE_HANDLER_H_
 #define ES_RESOURCE_HANDLER_H_
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 typedef void (*ResourceEventCallback)(ESResult);
 
 /* Structure to represent a Light resource */
@@ -60,4 +64,8 @@ void GetTargetNetworkInfoFromProvResource(char *, char *);
 void RegisterResourceEventCallBack(ResourceEventCallback);
 void UnRegisterResourceEventCallBack(void);
 
+#ifdef __cplusplus
+}
 #endif
+
+#endif //ES_RESOURCE_HANDLER_H_
\ No newline at end of file
diff --git a/service/easy-setup/enrollee/src/softap.c b/service/easy-setup/enrollee/src/softap.c
new file mode 100644 (file)
index 0000000..8784350
--- /dev/null
@@ -0,0 +1,89 @@
+//      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 );
+
+NetworkEventCallback 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, NetworkEventCallback 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
+}
+
index 3ae3c51..f0bc68f 100644 (file)
 #include "escommon.h"
 #include "networkhandler.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /**
  * @file
  *
@@ -68,10 +72,9 @@ DeviceRole ESSoftapHost();
 void ESCreateSoftap(const char * ssid, const char* passwd, NetworkEventCallback cb);
 
 
-//#ifdef __cplusplus
-//}
-//#endif // __cplusplus
-
+#ifdef __cplusplus
+}
+#endif
 
 #endif /* EASYSETUP_ENROLLEE_SOFTAP_H__ */
 
index 6f55811..5e9c42e 100644 (file)
@@ -49,6 +49,7 @@
 #include "onboarding.h"
 #include "resourcehandler.h"
 #include "softap.h"
+#include "easysetupcallbacks.h"
 
 #include "gtesthelper.h"
 
@@ -66,8 +67,6 @@ static const char TAG[] = "TestHarness";
 char ssid[] = "EasySetup123";
 char passwd[] = "EasySetup123";
 
-void OnboardingCallback(ESResult esResult);
-
 //-----------------------------------------------------------------------------
 // Callback functions
 //-----------------------------------------------------------------------------
index ea1a650..d1eee47 100755 (executable)
 #ifndef ES_COMMON_H_
 #define ES_COMMON_H_
 
-#include <iostream>
-#include <string>
-#ifndef WITH_ARDUINO
-#include <memory>
-#endif
-
 #include "ocstack.h"
 #include "octypes.h"
 
-using namespace std;
-
 // Defines
 #define OIC_STRING_MAX_VALUE    100
 #define IPV4_ADDR_SIZE          16
index 6ae239c..6fb0f68 100644 (file)
@@ -59,7 +59,7 @@ 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.cpp')
+enrollee = enrollee_env.Program('enrollee', 'enrolleewifi.c')
 
 i_enrollee = enrollee_env.Install(env.get('BUILD_DIR'), enrollee)
 
old mode 100755 (executable)
new mode 100644 (file)
similarity index 54%
rename from service/easy-setup/sampleapp/enrollee/linux/enrolleewifi.cpp
rename to service/easy-setup/sampleapp/enrollee/linux/enrolleewifi.c
index fac4c5d..33ad05d
 
 #include <unistd.h>
 #include <string.h>
-#include <iostream>
+#include <stdio.h>
 #include <pthread.h>
 
 #define TAG "TS"
 
-using namespace std;
-
-void *listeningFunc(void*);
+void *listeningFunc(void *);
 
 /**
  * @var ssid
@@ -62,41 +60,41 @@ static bool gIsSecured = false;
 
 void PrintMenu()
 {
-    cout<<"============"<<endl;
-    cout<<"S: Enabled Security"<<endl;
-    cout<<"I: Init easy setup"<<endl;
-    cout<<"P: start provisioning resources"<<endl;
-    cout<<"T: terminate"<<endl;
-    cout<<"Q: quit"<<endl;
-    cout<<"============"<<endl;
+    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("============\n");
 }
 
 void EventCallbackInApp(ESResult esResult, EnrolleeState enrolleeState)
 {
-    cout<<"Easy setup event callback"<<endl;
+    printf("Easy setup event callback\n");
 
     if(esResult == ES_OK)
     {
         if(enrolleeState == ES_ON_BOARDED_STATE)
         {
-            cout<<"Device is successfully OnBoared on Adhoc network"<<endl;
+            printf("Device is successfully OnBoared on Adhoc network\n");
         }
         else if (enrolleeState == ES_PROVISIONED_STATE)
         {
-            cout<<"Device is provisioned with target network's credentials"<<endl;
+            printf("Device is provisioned with target network's credentials\n");
         }
         else if (enrolleeState == ES_ON_BOARDED_TARGET_NETWORK_STATE)
         {
-            cout<<"Device is onboarded/connected with target network"<<endl;
+            printf("Device is onboarded/connected with target network\n");
         }
         else
         {
-            cout<<"Wrong state !! Easy setup is failed at Enrollee state = "<<enrolleeState<<endl;
+            printf("Wrong state !! Easy setup is failed at Enrollee state = %d\n",enrolleeState);
         }
     }
     else
     {
-        cout<<"Easy stup is failed at Enrollee state = "<<enrolleeState<<endl;
+        printf("Easy stup is failed at Enrollee state = %d\n",enrolleeState);;
     }
 
     PrintMenu();
@@ -110,125 +108,129 @@ FILE* server_fopen(const char *path, const char *mode)
 
 void EnableSecurity()
 {
-    cout << "Inside EnableSecurity API.." << endl;
+    printf("Inside EnableSecurity API..\n");
 
     gIsSecured = true;
 
     // Initialize Persistent Storage for SVR database
-    ps = { server_fopen, fread, fwrite, fclose, unlink };
+    ps = (OCPersistentStorage){ server_fopen, fread, fwrite, fclose, unlink };
     OCRegisterPersistentStorageHandler(&ps);
 }
 
 void StartEasySetup()
 {
-    cout<<"StartEasySetup and onboarding started.."<<endl;
+    printf("StartEasySetup and onboarding started..\n");
 
     if(InitEasySetup(CT_ADAPTER_IP, ssid, passwd, gIsSecured, EventCallbackInApp) == ES_ERROR)
     {
-        cout<<"StartEasySetup and onboarding Fail!!"<<endl;
+        printf("StartEasySetup and onboarding Fail!!\n");
         return;
     }
 }
 
 void StartOICStackAndStartResources()
 {
-    cout<<"Starting Enrollee Provisioning"<<endl;
+    printf("Starting Enrollee Provisioning\n");
 
     // Initialize the OC Stack in Server mode
     if (OCInit(NULL, 0, OC_SERVER) != OC_STACK_OK)
     {
-        cout<<"OCStack init error!!"<<endl;
+        printf("OCStack init error!!\n");
         return;
     }
 
     if (InitProvisioning() == ES_ERROR)
     {
-        cout<<"Init Provisioning Failed!!"<<endl;
+        printf("Init Provisioning Failed!!\n");
         return;
     }
 
     pthread_t thread_handle;
     if (pthread_create(&thread_handle, NULL, listeningFunc, NULL))
     {
-        cout<<"Thread creation failed"<<endl;
+        printf("Thread creation failed\n");
     }
 
-    cout<<"InitProvisioning Success"<<endl;
+    printf("InitProvisioning Success\n");
 }
 
 void StopEasySetup()
 {
-    cout<<"StopEasySetup IN"<<endl;
+    printf("StopEasySetup IN\n");
 
     if (TerminateEasySetup() == ES_ERROR)
     {
-        cout<<"TerminateEasySetup Failed!!"<<endl;
+        printf("TerminateEasySetup Failed!!\n");
         return;
     }
 
     //stop OC Stack
     if (OCStop() != OC_STACK_OK)
     {
-        cout<<"OCStack stop failed!!"<<endl;
+        printf("OCStack stop failed!!\n");
         return;
     }
 
-    cout<<"StopEasySetup OUT"<<endl;
+    printf("StopEasySetup OUT\n");
 }
 
 int main()
 {
-    cout<<"#########################"<<endl;
-    cout<<"EasySetup Enrollee SAMPLE"<<endl;
-    cout<<"#########################"<<endl;
+    printf("#########################\n");
+    printf("EasySetup Enrollee SAMPLE\n");
+    printf("#########################\n");
     PrintMenu();
-    char option;
+    char option = 'T'; 
 
     while(true)
     {
-        cin>>option;
-        switch (option)
-        {
-            case 'H': // help
-            case 'h':
-                PrintMenu();
-                break;
-
-            case 'Q': // quit
-            case 'q':
-                cout<<"quit";
-                break;
-
-            case 'S': // Enable Security
-            case 's':
-                EnableSecurity();
-                break;
-
-            case 'I': // Init EasySetup
-            case 'i':
-                StartEasySetup();
-                break;
-
-            case 'P': // start provisioning
-            case 'p':
-                StartOICStackAndStartResources();
-                break;
-
-            case 'T': // stop easy setup
-            case 't':
-                StopEasySetup();
-                break;
-
-            default:
-                cout<<"wrong option"<<endl;
-                break;
+        scanf("%c",&option);
+
+       if(option!= '\n')
+      {
+            switch (option)
+            {
+                case 'H': // help
+                case 'h':
+                    PrintMenu();
+                    break;
+
+                case 'Q': // quit
+                case 'q':
+                    printf("quit");
+                    break;
+
+                case 'S': // Enable Security
+                case 's':
+                    EnableSecurity();
+                    break;
+
+                case 'I': // Init EasySetup
+                case 'i':
+                    StartEasySetup();
+                    break;
+
+                case 'P': // start provisioning
+                case 'p':
+                    StartOICStackAndStartResources();
+                    break;
+
+                case 'T': // stop easy setup
+                case 't':
+                    StopEasySetup();
+                    break;
+
+                default:
+                    printf("wrong option\n");
+                    break;
+            }
+            if (option == 'Q' || option == 'q') break;
         }
-        if (option == 'Q' || option == 'q') break;
     }
     return 0;
 }
 
-void *listeningFunc(void*)
+void *listeningFunc(void * a)
 {
     OCStackResult result;
 
@@ -237,7 +239,7 @@ void *listeningFunc(void*)
         result = OCProcess();
         if (result != OC_STACK_OK)
         {
-           cout<<"OCStack stop error";
+           printf("OCStack stop error");
         }
     }
     return NULL;