Merge branch 'master' into easysetup & CBOR changes
authorVinil Jain <vinil.gj@samsung.com>
Thu, 27 Aug 2015 12:53:33 +0000 (18:23 +0530)
committerVinil Jain <vinil.gj@samsung.com>
Thu, 27 Aug 2015 13:00:27 +0000 (18:30 +0530)
Signed-off-by: Vinil Jain <vinil.gj@samsung.com>
Change-Id: I7c3e7fc8a234388aab3c02e33a6010edd4eca04d

18 files changed:
1  2 
resource/csdk/connectivity/SConscript
resource/csdk/stack/src/ocstack.c
service/SConscript
service/easy-setup/SConscript
service/easy-setup/readme.txt
service/easy-setup/sampleapp/arduino/thinserver/SConscript
service/easy-setup/sampleapp/arduino/thinserver/thinserver.cpp
service/easy-setup/sdk/common/common.h
service/easy-setup/sdk/enrollee/arduino/wifi/networkHandler.cpp
service/easy-setup/sdk/enrollee/arduino/wifi/networkHandler.h
service/easy-setup/sdk/enrollee/common/inc/easysetup.h
service/easy-setup/sdk/enrollee/common/inc/resourceHandler.h
service/easy-setup/sdk/enrollee/common/src/easysetup.cpp
service/easy-setup/sdk/enrollee/common/src/resourceHandler.cpp
service/easy-setup/sdk/mediator/android/EasySetupCore/easySetupCore.iml
service/easy-setup/sdk/mediator/inc/provisioninghandler.h
service/easy-setup/sdk/mediator/src/easysetupmgr.cpp
service/easy-setup/sdk/mediator/src/provisioninghandler.cpp

@@@ -58,7 -57,19 +57,21 @@@ else
                env.AppendUnique(CPPDEFINES = ['NO_IP_ADAPTER'])
  
  env.SConscript('./src/SConscript')
--
 +#if build_sample == 'ON':
 +#     if target_os in ['linux', 'arduino', 'android']:
 +#             env.SConscript('./samples/' + target_os + '/SConscript')
+ if build_sample == 'ON':
+       if target_os in ['linux', 'arduino', 'darwin']:
+               target_path = target_os
+               if target_os == 'darwin':
+                       target_path = 'linux'
+               env.SConscript('./samples/' + target_path + '/SConscript')
+       elif target_os in ['android']:
+               env.SConscript('./samples/' + target_os + '/SConscript')
+               #to build sample apk, uncomment below line after ca libraries are built
+               #while building ca libraries comment the below line, to avoid build errors
+               #env.SConscript('./samples/' + target_os + '/casample/SConscript')
@@@ -1876,7 -1855,13 +1855,16 @@@ static OCStackResult ParseRequestUri(co
              }
          }
  
 +        da = (OCDevAddr *)OICCalloc(1, sizeof (OCDevAddr));
++
+         len = end - start;
+         if (len >= sizeof(da->addr))
+         {
+             return OC_STACK_INVALID_URI;
+         }
+         da = (OCDevAddr *)OICCalloc(sizeof (OCDevAddr), 1);
++
          if (!da)
          {
              return OC_STACK_NO_MEMORY;
@@@ -35,11 -35,15 +35,22 @@@ target_os = env.get('TARGET_OS'
  
        # Build protocol plugin project
        # protocol-plugin use 'inotify', this feature isn't support by MAC OSX
 -      if target_os not in ['darwin', 'ios']:
 -              SConscript('protocol-plugin/SConscript')
 +      #if target_os not in ['darwin', 'ios', 'android']:
 +      #       SConscript('protocol-plugin/SConscript')
  
        # Build notification manager project
 -      if target_os not in ['android', 'tizen']:
 -              SConscript('notification-manager/SConscript')
 +      #SConscript('notification-manager/SConscript')
 +      
 +if target_os in ['arduino','android', 'linux']:
 +      SConscript('easy-setup/SConscript')
++      #if target_os not in ['android', 'tizen']:
++              #SConscript('notification-manager/SConscript')
+       # Build resource-encapsulation project
 -      SConscript('resource-encapsulation/SConscript')
++      #if target_os not in ['tizen']:
++              #SConscript('resource-encapsulation/SConscript')
+ #else:
+ #     SConscript('notification-manager/SampleApp/arduino/SConscript')
++#if target_os in ['arduino','android', 'linux']:
++        #SConscript('easy-setup/SConscript')
index 36096c2,0000000..36096c2
mode 100755,000000..100644
--- /dev/null
index 6affd2e,0000000..19cce5b
mode 100644,000000..100644
--- /dev/null
@@@ -1,77 -1,0 +1,77 @@@
-               <iotivity-root>/service/easy-setup/sdk/android
 +
 +Steps to build and deploy Easysetup Mediator in Android platform
 +
 +1) Compilation using Scons
 +      0) Prerequisite exports for Android
 +              export ANDROID_HOME=<ANDROID_HOME>
 +              export ANDROID_NDK=<ANDROID_NDK>
 +      a) In the IoTivity root source folder execute
 +               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 '<iotivity>/android/android_api/base/build/outputs/aar' directory. The .aar files contain jni directory and also a .jar file
 +              
 +      c) Now navigate to the Easysetup NDK folder 
++              <iotivity-root>/service/easy-setup/sdk/mediator/android
 +              
 +      d) Execute NDK-Build with the following command to cross compiled Easysetup JNI .so files
 +               ~/madan/android-ndk-r10d/ndk-build
 +               
 +      e) Step (d) will generate cross compiled Easysetup JNI .so files in the following folder
 +              
 +2) Compilation using Android Studio
 +      
 +      0) Prerequisite for running the Android application
 +              Install Android Studio and use the Android SDK manager to update the Android API to 21
 +      
 +      a) Import following projects to the Studio using the "File->New->Import Project"
 +              - service\easy-setup\sdk\android\EasySetupCore
 +              - service\easy-setup\sampleapp\android\EasySetup
 +      
 +      b) EasySetupCore is dependent on the .aar files generated in 1.b 
 +              1) To add an .aar file to the 'EasySetupCore' project,
 +                      a.Right click on EasySetup->New->Module->Import .JAR or .AAR Package
 +                      b.Select the .aar file(iotivity-armeabi-base-*.aar) from the location in steps 1.b
 +                      c.Right click on EasySetup->Open Module Settings
 +                      d.Select each sample app module under 'Modules'->Dependencies->Add->Module Dependency
 +                      
 +      c)      Build EasySetupCore project using "Android Studio->Build->Make Module "easySetupCore"
 +              If the project is setup correctly, you should see a BUILD SUCCESSFUL in the Android Studio Gradle Build terminal
 +                      You should see the .aar file generated inside of 
 +                      'iotivity\service\easy-setup\sdk\mediator\android\easySetupCore\build\outputs\aar'
 +      
 +      d) EasySetup application is also dependent on the .so files generated in 1.d step
 +              1) Drag and drop the following .so files in to the EasySetup\app\src\main\jniLibs\armeabi folder
 +                      - libeasysetup-jni.so [Easy Setup file]
 +                      
 +      e) EasySetup is also dependent on the .aar files generated in 1.b and 2.c steps
 +              1) To add an .aar file to the 'EasySetup' project,
 +                      a.Right click on EasySetup->New->Module->Import .JAR or .AAR Package
 +                      b.Select the .aar file from the location in steps 1.b and 2.b above
 +                      c.Right click on EasySetup->Open Module Settings
 +                      d.Select each sample app module under 'Modules'->Dependencies->Add->Module Dependency
 +                      e.The .aar files (easySetupCore-*.aar & iotivity-armeabi-base-*.aar) selected in step 2.c.1.b above should be present. Select it.
 +      
 +                      
 +      e) Run "Easy Setup" as an Android application
 +      
 +Folder structure
 +iotivity/
 +└── service
 +      └── easy-setup/
 +              │── SConscript
 +              │── sdk
 +              │     └── inc
 +              │     └── src
 +              │     └── android
 +              │     └── arduino
 +              │             └──wifi
 +              │                     └──inc            
 +              │                     └──src            
 +              │── sampleapp
 +              │     └──android
 +              │     └──arduino                
 +              │     └──linux
 +              └── README - You are reading this.
 +
 +
index d79714a,0000000..fca7b3d
mode 100755,000000..100644
--- /dev/null
@@@ -1,56 -1,0 +1,56 @@@
- thinserver_env.PrependUnique(LIBS = ['octbstack', 'connectivity_abstraction','coap', 'ESSDKLibrary'])
 +#******************************************************************
 +#
 +# Copyright 2014 Intel Mobile Communications GmbH 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('env')
 +
 +thinserver_env = env.Clone()
 +######################################################################
 +# Build flags
 +######################################################################
 +thinserver_env.PrependUnique(CPPPATH = [
 +                '../../../../../resource/oc_logger/include',
 +              '../../../../../resource/csdk/logger/include',
 +                '../../../../../resource/csdk/stack/include',
 +              '../../../../../extlibs/cjson',
 +              '../../../sdk/common',
 +              '../../../sdk/enrollee/arduino/wifi',
 +              '../../../sdk/enrollee/common/inc',
 +              '../../../sdk/enrollee/common/src'
 +              ])
 +
 +thinserver_env.AppendUnique(LIBPATH = [env.get('BUILD_DIR')])
 +thinserver_env.AppendUnique(CPPDEFINES = ['TB_LOG', 'ARDUINOWIFI'])
 +
++thinserver_env.PrependUnique(LIBS = ['octbstack','ocsrm','connectivity_abstraction','coap', 'ESSDKLibrary'])
 +
 +thinserver = thinserver_env.Program('thinserver', 'thinserver.cpp')
 +env.CreateBin('thinserver')
 +
 +i_thinserver = thinserver_env.Install(env.get('BUILD_DIR'), thinserver)
 +
 +Alias('thinserver', i_thinserver)
 +env.AppendTarget('thinserver')
 +
 +if(thinserver_env['UPLOAD'] == True):
 +      from sys import platform as _platform
 +      if _platform == "linux" or _platform == "linux2":
 +              thinserver_env.Upload(env.get('BUILD_DIR') + '/service/easy-setup/sampleapp/arduino/thinserver/thinserver.hex')
 +      else:
 +              print 'Please use appropriate install method for your developing machine. Linux is the only supported platform right now.'
index 1874020,0000000..ee3617d
mode 100755,000000..100644
--- /dev/null
@@@ -1,118 -1,0 +1,119 @@@
- char ssid[] = "hub2.4G";
- char passwd[] = "09877890";
 +//******************************************************************
 +//
 +// Copyright 2014 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.
 +//
 +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 +
 +// Do not remove the include below
 +#include "Arduino.h"
 +
 +#include "logger.h"
 +#include "ocstack.h"
 +#include <string.h>
 +
 +#ifdef ARDUINOWIFI
 +// Arduino WiFi Shield
 +#include <SPI.h>
 +#include <WiFi.h>
 +#include <WiFiUdp.h>
 +#else
 +// Arduino Ethernet Shield
 +#include <EthernetServer.h>
 +#include <Ethernet.h>
 +#include <Dns.h>
 +#include <EthernetClient.h>
 +#include <util.h>
 +#include <EthernetUdp.h>
 +#include <Dhcp.h>
 +#endif
 +
 +#include "easysetup.h"
 +
 +const char *getResult(OCStackResult result);
 +
 +PROGMEM const char TAG[] = "ThinServer";
 +
-     if (OCStartPresence(0) != OC_STACK_OK)
++char ssid[] = "EasySetup123";
++char passwd[] = "EasySetup123";
 +
 +void EventCallbackInApp(ES_RESULT eventFlag)
 +{
 +    Serial.println("callback!!! in app");
 +}
 +
 +// On Arduino Atmel boards with Harvard memory architecture, the stack grows
 +// downwards from the top and the heap grows upwards. This method will print
 +// the distance(in terms of bytes) between those two.
 +// See here for more details :
 +// http://www.atmel.com/webdoc/AVRLibcReferenceManual/malloc_1malloc_intro.html
 +void PrintArduinoMemoryStats()
 +{
 +#ifdef ARDUINO_AVR_MEGA2560
 +    //This var is declared in avr-libc/stdlib/malloc.c
 +    //It keeps the largest address not allocated for heap
 +    extern char *__brkval;
 +    //address of tmp gives us the current stack boundry
 +    int tmp;
 +    OC_LOG_V(INFO, TAG, "Stack: %u         Heap: %u", (unsigned int)&tmp, (unsigned int)__brkval);
 +    OC_LOG_V(INFO, TAG, "Unallocated Memory between heap and stack: %u",
 +            ((unsigned int)&tmp - (unsigned int)__brkval));
 +#endif
 +}
 +//The setup function is called once at startup of the sketch
 +void setup()
 +{
 +    // Add your initialization code here
 +    // Note : This will initialize Serial port on Arduino at 115200 bauds
 +    OC_LOG_INIT();
 +    OC_LOG(DEBUG, TAG, PCF("OCServer is starting..."));
 +
 +    FindNetworkForOnboarding(ES_WIFI, ssid, passwd, EventCallbackInApp);
 +
 +    // Initialize the OC Stack in Server mode
 +    if (OCInit(NULL, 0, OC_SERVER) != OC_STACK_OK)
 +    {
 +        OC_LOG(ERROR, TAG, PCF("OCStack init error"));
 +        return;
 +    }
 +
 +    InitializeProvisioning(EventCallbackInApp);
 +
++   /* if (OCStartPresence(0) != OC_STACK_OK)
 +    {
 +        OC_LOG(ERROR, TAG, PCF("Start Presence init error"));
 +        return;
 +    }
++      */
 +}
 +
 +// The loop function is called in an endless loop
 +void loop()
 +{
 +    // This artificial delay is kept here to avoid endless spinning
 +    // of Arduino microcontroller. Modify it as per specific application needs.
 +    delay(2000);
 +
 +    // This call displays the amount of free SRAM available on Arduino
 +    PrintArduinoMemoryStats();
 +
 +    // Give CPU cycles to OCStack to perform send/recv and other OCStack stuff
 +    if (OCProcess() != OC_STACK_OK)
 +    {
 +        OC_LOG(ERROR, TAG, PCF("OCStack process error"));
 +        return;
 +    }
 +}
index ffe04a0,0000000..281754b
mode 100755,000000..100644
--- /dev/null
@@@ -1,147 -1,0 +1,151 @@@
 +//******************************************************************
 +//
 +// Copyright 2014 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_COMMON_H_
 +#define ES_COMMON_H_
 +
 +#include "ocstack.h"
 +#include "octypes.h"
 +
 +// Defines
 +#define OIC_STRING_MAX_VALUE 100
 +#define IPV4_ADDR_SIZE 16
 +#define IP_PORT 6298
 +#define NET_WIFI_SSID_SIZE 16
 +#define NET_WIFI_PWD_SIZE 16
 +
 +/**
 + * @brief Mac address length for BT port
 + */
 +#define NET_MACADDR_SIZE 18
 +
 +//The following variable determines the interface (wifi, ethernet etc.)
 +//to be used for sending unicast messages. Default set to Ethernet.
 +static OCConnectivityType OC_CONNTYPE = CT_ADAPTER_IP;
 +
 +static const char * UNICAST_PROVISIONING_QUERY = "coap://%s:%d/oic/res?rt=oic.prov";
 +static const char * UNICAST_PROV_STATUS_QUERY = "coap://%s:%d%s";
 +
 +
 +/**
 + * 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_URI_PROV               "/oic/prov"
++#define OC_RSRVD_ES_URI_NET                "/oic/net"
 +
 +
 +
 +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,
 +} ES_RESULT;
 +
 +
 +/**
 + * Provisioning Device Status
 + */
 +typedef struct {
 +    /// Address of remote server
 +    OCDevAddr * addr;
 +    /// Indicates adaptor type on which the response was received
 +    OCConnectivityType connType;
 +} ProvDeviceInfo;
 +
 +/**
 + * Provosioning Status
 + */
 +typedef enum {
 +    DEVICE_PROVISIONED = 0, DEVICE_NOT_PROVISIONED
 +} ProvStatus;
 +
 +/**
 + * Response from queries to remote servers. Queries are made by calling the @ref OCDoResource API.
 + */
 +typedef struct {
 +    // Provisioning Status
 +    ProvStatus provStatus;
 +    // Provisioning Device Info
 +    ProvDeviceInfo provDeviceInfo;
 +} ProvisioningInfo;
 +
 +/**
 + * @brief  Network information of the Enroller
 + */
 +typedef union
 +{
 +    /**
 +     * @brief BT Mac Information
 +     */
 +    struct
 +    {
 +        char btMacAddress[NET_MACADDR_SIZE];   /**< BT mac address **/
 +    } BT;
 +
 +    /**
 +     * @brief LE MAC Information
 +     */
 +    struct
 +    {
 +        char leMacAddress[NET_MACADDR_SIZE];   /**< BLE mac address **/
 +    } LE;
 +
 +    /**
 +     * @brief IP Information
 +     */
 +    struct
 +    {
 +        char ipAddress[IPV4_ADDR_SIZE]; /**< IP Address of the Enroller**/
 +        char ssid[NET_WIFI_SSID_SIZE]; /**< ssid of the Enroller**/
 +        char pwd[NET_WIFI_PWD_SIZE]; /**< pwd of the Enroller**/
 +    } WIFI;
 +} EnrolleeInfo_t;
 +
 +
 +/**
 + * @brief Network Information
 + */
 +typedef struct
 +{
 +    EnrolleeInfo_t netAddressInfo;          /**< Enroller Network Info**/
 +    OCConnectivityType connType;            /**< Connectivity Type**/
 +    bool isSecured;                         /**< Secure connection**/
 +} EnrolleeNWProvInfo_t;
 +
 +/**
 + * Client applications implement this callback to consume responses received from Servers.
 + */
 +typedef void (*OCProvisioningStatusCB)(ProvisioningInfo *provInfo);
 +
 +#endif
index 951ff9e,0000000..95ad75e
mode 100755,000000..100644
--- /dev/null
@@@ -1,181 -1,0 +1,181 @@@
-         return ES_ERROR;
 +//******************************************************************
 +//
 +// Copyright 2014 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"
 +
 +PROGMEM const char TAG[] = "networkHandler";
 +
 +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";
 +
 +IPAddress myIP;
 +
 +ES_RESULT ConnectToWiFiNetwork(const char *ssid, const char *pass, NetworkEventCallback cb)
 +{
 +    char *fwVersion;
 +    int status = WL_IDLE_STATUS;
 +    int res;
 +
 +    // check for the presence of the shield:
 +    if (WiFi.status() == WL_NO_SHIELD)
 +    {
 +        OC_LOG(ERROR, TAG, PCF("WiFi shield not present"));
 +        return ES_ERROR;
 +    }
 +
 +    // Verify that WiFi Shield is running the firmware with all UDP fixes
 +    fwVersion = WiFi.firmwareVersion();
 +    OC_LOG_V(INFO, TAG, "WiFi Shield Firmware version %s", fwVersion);
 +    if (strncmp(fwVersion, ARDUINO_WIFI_SHIELD_UDP_FW_VER, sizeof(ARDUINO_WIFI_SHIELD_UDP_FW_VER))
 +            != 0)
 +    {
 +        OC_LOG(DEBUG, TAG, PCF("!!!!! Upgrade WiFi Shield Firmware version !!!!!!"));
++        //return ES_ERROR;
 +    }
 +
 +    while (findNetwork(ssid) == 0) // found
 +    {
 +        delay(1000);
 +    }
 +
 +    if (cb != NULL)
 +    {
 +        cb(ES_NETWORKFOUND);
 +    }
 +
 +    if (WiFi.status() == WL_CONNECTED)
 +        WiFi.disconnect();
 +
 +    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)
 +    {
 +        OC_LOG_V(INFO, TAG, "Attempting to connect to SSID: %s", ssid);
 +
 +        status = WiFi.begin((char *) ssid, (char *) pass);
 +
 +        // wait 10 seconds for connection:
 +        delay(10000);
 +    }
 +    OC_LOG(DEBUG, TAG, PCF("Connected to wifi"));
 +
 +    myIP = WiFi.localIP();
 +    OC_LOG_V(INFO, TAG, "IP Address:  %d.%d.%d.%d", myIP[0], myIP[1], myIP[2], myIP[3]);
 +
 +    char buf[50];
 +    sprintf(buf, "IP Address:  %d.%d.%d.%d", myIP[0], myIP[1], myIP[2], myIP[3]);
 +    Serial.println(buf);
 +
 +    return 0;
 +}
 +
 +int getCurrentNetworkInfo(NetworkType targetType, NetworkInfo *info)
 +{
 +    if (targetType == ES_WIFI && WiFi.status() == WL_CONNECTED)
 +    {
 +        info->type = ES_WIFI;
 +        info->ipaddr = WiFi.localIP();
 +        strcpy(info->ssid, WiFi.SSID());
 +
 +        return 0;
 +    }
 +
 +    return -1;
 +}
 +
 +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;
 +    }
 +}
index 81de98d,0000000..8024fdd
mode 100755,000000..100644
--- /dev/null
@@@ -1,401 -1,0 +1,336 @@@
- #include "cJSON.h"
 +//******************************************************************
 +//
 +// Copyright 2014 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"
- OCEntityHandlerResult OCEntityHandlerCb(OCEntityHandlerFlag, OCEntityHandlerRequest *);
++#include "ocpayload.h"
 +
 +PROGMEM const char TAG[] = "resourceHandler";
 +
 +ProvResource g_prov;
 +NetResource g_net;
 +
- OCEntityHandlerResult ProcessGetRequest(OCEntityHandlerRequest *ehRequest, char *payload,
-         uint16_t maxPayloadSize);
- OCEntityHandlerResult ProcessPutRequest(OCEntityHandlerRequest *ehRequest, char *payload,
-         uint16_t maxPayloadSize);
- OCEntityHandlerResult ProcessPostRequest(OCEntityHandlerRequest *ehRequest, char *payload,
-         uint16_t maxPayloadSize);
- char* constructJsonResponse(OCEntityHandlerRequest *ehRequest);
++OCEntityHandlerResult OCEntityHandlerCb(OCEntityHandlerFlag, OCEntityHandlerRequest *, void *callback);
 +const char *getResult(OCStackResult result);
 +
-     g_cbForResEvent = cb;
++OCEntityHandlerResult ProcessGetRequest(OCEntityHandlerRequest *ehRequest,OCRepPayload** payload);
++OCEntityHandlerResult ProcessPutRequest(OCEntityHandlerRequest *ehRequest,OCRepPayload** payload);
++OCEntityHandlerResult ProcessPostRequest(OCEntityHandlerRequest *ehRequest,OCRepPayload** payload);
++OCRepPayload* constructResponse(OCEntityHandlerRequest *ehRequest);
 +int g_flag = 0;
 +
 +ResourceEventCallback g_cbForResEvent = NULL;
 +
 +void RegisterResourceEventCallBack(ResourceEventCallback cb)
 +{
-     if (name != NULL && pass != NULL)
-     {
-         sprintf(name, "%s", g_prov.tnn);
-         sprintf(pass, "%s", g_prov.cd);
-     }
++      g_cbForResEvent = cb;
 +}
 +
 +void GetTargetNetworkInfoFromProvResource(char *name, char *pass)
 +{
-     g_prov.ps = 1; // need to provisioning
-     g_prov.tnt = ES_WIFI;
-     sprintf(g_prov.tnn, "Unknown");
-     sprintf(g_prov.cd, "Unknown");
++      if (name != NULL && pass != NULL)
++      {
++              sprintf(name, "%s", g_prov.tnn);
++              sprintf(pass, "%s", g_prov.cd);
++      }
 +}
 +
 +OCStackResult CreateProvisioningResource()
 +{
-     OCStackResult res = OCCreateResource(&g_prov.handle, "oic.prov", OC_RSRVD_INTERFACE_DEFAULT,
-             "/oic/prov", OCEntityHandlerCb, OC_DISCOVERABLE | OC_OBSERVABLE);
++      g_prov.ps = 1; // need to provisioning
++      g_prov.tnt = ES_WIFI;
++      sprintf(g_prov.tnn, "Unknown");
++      sprintf(g_prov.cd, "Unknown");
 +
-     OC_LOG_V(INFO, TAG, "Created Prov resource with result: %s", getResult(res));
++      OCStackResult res = OCCreateResource(&g_prov.handle, "oic.prov", OC_RSRVD_INTERFACE_DEFAULT,
++                      OC_RSRVD_ES_URI_PROV, OCEntityHandlerCb,NULL, OC_DISCOVERABLE | OC_OBSERVABLE);
 +
-     return res;
++      OC_LOG_V(INFO, TAG, "Created Prov resource with result: %s", getResult(res));
 +
-     NetworkInfo netInfo;
++      return res;
 +}
 +
 +OCStackResult CreateNetworkResource()
 +{
-     if (getCurrentNetworkInfo(ES_WIFI, &netInfo) != 0)
-     {
-         return OC_STACK_ERROR;
-     }
++      NetworkInfo netInfo;
 +
-     if (netInfo.type != ES_WIFI)
-     {
-         return OC_STACK_ERROR;
-     }
++      if (getCurrentNetworkInfo(ES_WIFI, &netInfo) != 0)
++      {
++              return OC_STACK_ERROR;
++      }
 +
-     g_net.cnt = (int) netInfo.type;
-     g_net.ant[0] = (int) ES_WIFI;
-     sprintf(g_net.ipaddr, "%d.%d.%d.%d", netInfo.ipaddr[0], netInfo.ipaddr[1], netInfo.ipaddr[2],
-             netInfo.ipaddr[3]);
-     sprintf(g_net.cnn, "%s", netInfo.ssid);
++      if (netInfo.type != ES_WIFI)
++      {
++              return OC_STACK_ERROR;
++      }
 +
-     OC_LOG_V(INFO, TAG, "SSID: %s", g_net.cnn);
-     OC_LOG_V(INFO, TAG, "IP Address: %s", g_net.ipaddr);
++      g_net.cnt = (int) netInfo.type;
++      g_net.ant[0] = (int) ES_WIFI;
++      sprintf(g_net.ipaddr, "%d.%d.%d.%d", netInfo.ipaddr[0], netInfo.ipaddr[1], netInfo.ipaddr[2],
++                      netInfo.ipaddr[3]);
++      sprintf(g_net.cnn, "%s", netInfo.ssid);
 +
-     OCStackResult res = OCCreateResource(&g_net.handle, "oic.net", OC_RSRVD_INTERFACE_DEFAULT,
-             "/oic/net", OCEntityHandlerCb, OC_DISCOVERABLE | OC_OBSERVABLE);
-     OC_LOG_V(INFO, TAG, "Created Net resource with result: %s", getResult(res));
++      OC_LOG_V(INFO, TAG, "SSID: %s", g_net.cnn);
++      OC_LOG_V(INFO, TAG, "IP Address: %s", g_net.ipaddr);
 +
-     return res;
++      OCStackResult res = OCCreateResource(&g_net.handle, "oic.net", OC_RSRVD_INTERFACE_DEFAULT,
++                      OC_RSRVD_ES_URI_NET, OCEntityHandlerCb,NULL, OC_DISCOVERABLE | OC_OBSERVABLE);
++      OC_LOG_V(INFO, TAG, "Created Net resource with result: %s", getResult(res));
 +
- OCEntityHandlerResult ProcessGetRequest(OCEntityHandlerRequest *ehRequest, char *payload,
-         uint16_t maxPayloadSize)
++      return res;
 +}
 +
-     OCEntityHandlerResult ehResult = OC_EH_ERROR;
-     char *getResp = constructJsonResponse(ehRequest);
-     if (!getResp)
-     {
-         OC_LOG(ERROR, TAG, "constructJsonResponse failed");
-         return OC_EH_ERROR;
-     }
-     if (MAX_RESPONSE_LENGTH > strlen(getResp))
-     {
-         strncpy(payload, getResp, strlen(getResp));
-         ehResult = OC_EH_OK;
-     }
-     else
-     {
-         OC_LOG_V(INFO, TAG, "Response buffer: %d bytes is too small", maxPayloadSize);
-         ehResult = OC_EH_ERROR;
-     }
-     free(getResp);
-     return ehResult;
++OCEntityHandlerResult ProcessGetRequest(OCEntityHandlerRequest *ehRequest, OCRepPayload **payload)
 +{
- OCEntityHandlerResult ProcessPutRequest(OCEntityHandlerRequest *ehRequest, char *payload,
-         uint16_t maxPayloadSize)
++      OCEntityHandlerResult ehResult = OC_EH_ERROR;
++      OCRepPayload *getResp = constructResponse(ehRequest);
++      if(!getResp)
++      {
++              OC_LOG(ERROR, TAG, "constructResponse failed");
++              return OC_EH_ERROR;
++      }
++
++      *payload = getResp;
++      ehResult = OC_EH_OK;
++
++      return ehResult;
 +}
 +
-     OCEntityHandlerResult ehResult = OC_EH_ERROR;
-     OC_LOG_V(INFO, TAG, "PUT Request Payload: %s", ehRequest->reqJSONPayload);
-     // Get cJSON pointer to query
-     cJSON *putJson = cJSON_Parse(ehRequest->reqJSONPayload);
-     if (!putJson)
-     {
-         OC_LOG_V(ERROR, TAG, "Failed to parse JSON: %s", ehRequest->reqJSONPayload);
-         return ehResult;
-     }
-     // Get root of JSON payload, then the 1st resource.
-     cJSON* carrier = cJSON_GetObjectItem(putJson, "oic");
-     if (!carrier)
-     {
-         OC_LOG_V(ERROR, TAG, "Failed to parse JSON: %s", ehRequest->reqJSONPayload);
-         return ehResult;
-     }
-     carrier = cJSON_GetArrayItem(carrier, 0);
-     carrier = cJSON_GetObjectItem(carrier, "rep");
-     if (!carrier)
-     {
-         OC_LOG_V(ERROR, TAG, "Failed to parse JSON: %s", ehRequest->reqJSONPayload);
-         return ehResult;
-     }
-     cJSON* prop = cJSON_GetObjectItem(carrier, "tnn");
-     if (prop)
-     {
-         sprintf(g_prov.tnn, "%s", prop->valuestring);
-     }
-     prop = cJSON_GetObjectItem(carrier, "cd");
-     if (prop)
-     {
-         sprintf(g_prov.cd, "%s", prop->valuestring);
-     }
-     cJSON_Delete(putJson);
-     // TODO: Now once receiving PUT request, the enrollee start to connect to enroller.
-     g_flag = 1;
-     char *getResp = constructJsonResponse(ehRequest);
-     if (!getResp)
-     {
-         OC_LOG(ERROR, TAG, "constructJsonResponse failed");
-         return OC_EH_ERROR;
-     }
-     if (MAX_RESPONSE_LENGTH > strlen(getResp))
-     {
-         strncpy(payload, getResp, strlen(getResp));
-         ehResult = OC_EH_OK;
-     }
-     else
-     {
-         OC_LOG_V(INFO, TAG, "Response buffer: %d bytes is too small", maxPayloadSize);
-         ehResult = OC_EH_ERROR;
-     }
-     free(getResp);
-     return ehResult;
++OCEntityHandlerResult ProcessPutRequest (OCEntityHandlerRequest *ehRequest,
++              OCRepPayload** payload)
 +{
- OCEntityHandlerResult ProcessPostRequest(OCEntityHandlerRequest *ehRequest, char *payload,
-         uint16_t maxPayloadSize)
++
++      OCEntityHandlerResult ehResult=OC_EH_ERROR;
++      if(ehRequest->payload && ehRequest->payload->type != PAYLOAD_TYPE_REPRESENTATION)
++      {
++              OC_LOG(ERROR, TAG, PCF("Incoming payload not a representation"));
++              return ehResult;
++      }
++
++      OCRepPayload* input = (OCRepPayload*)(ehRequest->payload);
++      if(!input)
++      {
++              OC_LOG_V(ERROR, TAG, "Failed to parse");
++              return ehResult;
++      }
++
++      const char* tnn;
++      if(OCRepPayloadGetPropString(input,OC_RSRVD_ES_TNN, &tnn))
++      {
++              sprintf(g_prov.tnn, "%s", tnn);
++      }
++
++      const char* cd;
++      if(OCRepPayloadGetPropString(input, OC_RSRVD_ES_CD, &cd))
++      {
++              sprintf(g_prov.cd, "%s", cd);
++      }
++
++      g_flag = 1;
++
++      OCRepPayload *getResp = constructResponse(ehRequest);
++      if(!getResp)
++      {
++              OC_LOG(ERROR, TAG, "constructResponse failed");
++              return OC_EH_ERROR;
++      }
++
++      *payload = getResp;
++      ehResult = OC_EH_OK;
++
++
++
++      return ehResult;
 +}
 +
-     OCEntityHandlerResult ehResult = OC_EH_ERROR;
-     OC_LOG_V(INFO, TAG, "PUT Request Payload: %s", ehRequest->reqJSONPayload);
-     // Get cJSON pointer to query
-     cJSON *putJson = cJSON_Parse(ehRequest->reqJSONPayload);
-     if (!putJson)
-     {
-         OC_LOG_V(ERROR, TAG, "Failed to parse JSON: %s", ehRequest->reqJSONPayload);
-         return ehResult;
-     }
-     // Get root of JSON payload, then the 1st resource.
-     cJSON* carrier = cJSON_GetObjectItem(putJson, "oic");
-     if (!carrier)
-     {
-         OC_LOG_V(ERROR, TAG, "Failed to parse JSON: %s", ehRequest->reqJSONPayload);
-         return ehResult;
-     }
-     carrier = cJSON_GetArrayItem(carrier, 0);
-     carrier = cJSON_GetObjectItem(carrier, "rep");
-     if (!carrier)
-     {
-         OC_LOG_V(ERROR, TAG, "Failed to parse JSON: %s", ehRequest->reqJSONPayload);
-         return ehResult;
-     }
-     cJSON* prop = cJSON_GetObjectItem(carrier, "tr");
-     if (prop)
-     {
-         // Triggering
-         ehResult = OC_EH_OK;
-     }
-     cJSON_Delete(putJson);
-     g_flag = 1;
-     return ehResult;
++
++OCEntityHandlerResult ProcessPostRequest(OCEntityHandlerRequest *ehRequest, OCRepPayload** payload)
 +{
- char* constructJsonResponse(OCEntityHandlerRequest *ehRequest)
++      OCEntityHandlerResult ehResult = OC_EH_ERROR;
++      if(!ehRequest)
++      {
++              OC_LOG(ERROR, TAG, PCF("Request is Null"));
++              return ehResult;
++      }
++      if(ehRequest->payload && ehRequest->payload->type != PAYLOAD_TYPE_REPRESENTATION)
++      {
++              OC_LOG(ERROR, TAG, PCF("Incoming payload not a representation"));
++              return ehResult;
++      }
++
++      OCRepPayload* input = (OCRepPayload*)(ehRequest->payload);
++      if(!input)
++      {
++              OC_LOG_V(ERROR, TAG, "Failed to parse" );
++              return ehResult;
++      }
++      const char* tr;
++      if(OCRepPayloadGetPropString(input, OC_RSRVD_ES_TR, &tr))
++      {
++
++              // Triggering
++              ehResult = OC_EH_OK;
++      }
++
++      g_flag = 1;
++
++      return ehResult;
 +}
 +
-     cJSON *json = cJSON_CreateObject();
-     cJSON *format;
-     char *jsonResponse;
-     char *JsonResp;
-     char temp_resp[256];
-     if (g_prov.handle != NULL && ehRequest->resource == g_prov.handle)
-     {
-         char *uri = (char *) "/oic/prov";
-         cJSON_AddStringToObject(json, "href", uri);
-         cJSON_AddItemToObject(json, "rep", format = cJSON_CreateObject());
-         cJSON_AddNumberToObject(format, "ps", g_prov.ps);
-         cJSON_AddNumberToObject(format, "tnt", g_prov.tnt);
-         cJSON_AddStringToObject(format, "tnn", g_prov.tnn);
-         cJSON_AddStringToObject(format, "cd", g_prov.cd);
-         jsonResponse = cJSON_Print(json);
-         cJSON_Delete(json);
-     }
-     else if (g_net.handle != NULL && ehRequest->requestHandle == g_net.handle)
-     {
-         char *uri = (char *) "/oic/net";
-         cJSON_AddStringToObject(json, "href", uri);
-         cJSON_AddItemToObject(json, "rep", format = cJSON_CreateObject());
-         cJSON_AddNumberToObject(format, "ant", g_net.ant[0]);
-         jsonResponse = cJSON_Print(json);
-         cJSON_Delete(json);
-     }
-     else
-     {
-         return jsonResponse;
-     }
-     OC_LOG_V(INFO, TAG, "Constructed Response: %s", jsonResponse);
-     return jsonResponse;
++OCRepPayload* constructResponse(OCEntityHandlerRequest *ehRequest)
 +{
-         OCEntityHandlerRequest* entityHandlerRequest)
++
++      OCRepPayload* payload = OCRepPayloadCreate();
++      if(!payload)
++      {
++              OC_LOG(ERROR, TAG, PCF("Failed to allocate Payload"));
++              return NULL;
++      }
++
++      if (g_prov.handle != NULL && ehRequest->resource == g_prov.handle)
++      {
++
++              
++              OCRepPayloadSetUri(payload,OC_RSRVD_ES_URI_PROV);
++
++              OCRepPayloadSetPropInt(payload, OC_RSRVD_ES_PS,g_prov.ps);
++              OCRepPayloadSetPropInt(payload, OC_RSRVD_ES_TNT, g_prov.tnt);
++              OCRepPayloadSetPropString(payload,OC_RSRVD_ES_TNN, g_prov.tnn);
++              OCRepPayloadSetPropString(payload,OC_RSRVD_ES_CD, g_prov.cd);
++      }
++      else if (g_net.handle != NULL && ehRequest->requestHandle == g_net.handle)
++      {
++              
++              OCRepPayloadSetUri(payload, OC_RSRVD_ES_URI_NET);
++              OCRepPayloadSetPropInt(payload, "ant", g_net.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,
-     OCEntityHandlerResult ehRet = OC_EH_OK;
-     OCEntityHandlerResponse response =
-     { 0 };
-     char payload[MAX_RESPONSE_LENGTH] =
-     { 0 };
-     if (entityHandlerRequest && (flag & OC_REQUEST_FLAG))
-     {
-         if (OC_REST_GET == entityHandlerRequest->method)
-         {
-             OC_LOG_V(INFO, TAG, "Received GET request");
-             ehRet = ProcessGetRequest(entityHandlerRequest, payload, sizeof(payload) - 1);
-         }
-         else if (OC_REST_PUT == entityHandlerRequest->method)
-         {
-             OC_LOG_V(INFO, TAG, "Received PUT request");
-             if (g_prov.handle != NULL && entityHandlerRequest->resource == g_prov.handle)
-             {
-                 ehRet = ProcessPutRequest(entityHandlerRequest, payload, sizeof(payload) - 1);
-             }
-             else
-             {
-                 ehRet = OC_EH_ERROR;
-             }
-         }
-         else if (OC_REST_POST == entityHandlerRequest->method)
-         {
-             // TODO: As of now, POST request will be not received.
-             OC_LOG(INFO, TAG, "Received OC_REST_POST from client");
-             //ehRet = ProcessPostRequest (entityHandlerRequest, payload, sizeof(payload) - 1);
-         }
-         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.payload = payload;
-             response.payloadSize = strlen(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)
-             {
-                 OC_LOG(ERROR, TAG, "Error sending response");
-                 ehRet = OC_EH_ERROR;
-             }
-         }
-     }
-     if (g_flag == 1)
-     {
-         g_cbForResEvent(ES_RECVTRIGGEROFPROVRES);
-         g_flag = 0;
-     }
-     return ehRet;
++              OCEntityHandlerRequest* entityHandlerRequest,void *callback)
 +{
-     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";
-     }
++      (void)callback;
++      OCEntityHandlerResult ehRet = OC_EH_OK;
++      OCEntityHandlerResponse response =
++      { 0 };
++      OCRepPayload* payload = NULL;
++      if (entityHandlerRequest && (flag & OC_REQUEST_FLAG))
++      {
++              if (OC_REST_GET == entityHandlerRequest->method)
++              {
++                      OC_LOG_V(INFO, TAG, "Received GET request");
++                      ehRet = ProcessGetRequest(entityHandlerRequest, &payload);
++              }
++              else if (OC_REST_PUT == entityHandlerRequest->method)
++              {
++                      OC_LOG_V(INFO, TAG, "Received PUT request");
++
++                      if (g_prov.handle != NULL && entityHandlerRequest->resource == g_prov.handle)
++                      {
++                              ehRet = ProcessPutRequest(entityHandlerRequest, &payload);
++                      }
++                      else
++                      {
++                              ehRet = OC_EH_ERROR;
++                      }
++              }
++              else if (OC_REST_POST == entityHandlerRequest->method)
++              {
++                      // TODO: As of now, POST request will be not received.
++                      OC_LOG(INFO, TAG, "Received OC_REST_POST from client");
++                      //ehRet = ProcessPostRequest (entityHandlerRequest, payload, sizeof(payload) - 1);
++              }
++
++              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.payload = (OCPayload*)(&payload);  //response uses OCPaylod while all get,put methodes use OCRepPayload 
++                      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)
++                      {
++                              OC_LOG(ERROR, TAG, "Error sending response");
++                              ehRet = OC_EH_ERROR;
++                      }
++              }
++      }
++
++      if (g_flag == 1)
++      {
++              g_cbForResEvent(ES_RECVTRIGGEROFPROVRES);
++              g_flag = 0;
++      }
++
++      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 d3af2de,0000000..915035d
mode 100644,000000..100644
--- /dev/null
@@@ -1,95 -1,0 +1,93 @@@
-         <option name="SOURCE_GEN_TASK_NAME" value="generateDebugSources" />
 +<?xml version="1.0" encoding="UTF-8"?>
 +<module external.linked.project.id="EasySetupCore" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
 +  <component name="FacetManager">
 +    <facet type="android-gradle" name="Android-Gradle">
 +      <configuration>
 +        <option name="GRADLE_PROJECT_PATH" value=":" />
 +      </configuration>
 +    </facet>
 +    <facet type="android" name="Android">
 +      <configuration>
 +        <option name="SELECTED_BUILD_VARIANT" value="debug" />
 +        <option name="SELECTED_TEST_ARTIFACT" value="_android_test_" />
 +        <option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
 +        <option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
-         <option name="TEST_SOURCE_GEN_TASK_NAME" value="generateDebugAndroidTestSources" />
 +        <option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugAndroidTest" />
 +        <option name="COMPILE_JAVA_TEST_TASK_NAME" value="compileDebugAndroidTestSources" />
 +        <option name="ALLOW_USER_CONFIGURATION" value="false" />
 +        <option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
 +        <option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
 +        <option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
 +        <option name="LIBRARY_PROJECT" value="true" />
 +      </configuration>
 +    </facet>
 +  </component>
 +  <component name="NewModuleRootManager" inherit-compiler-output="false">
 +    <output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
 +    <output-test url="file://$MODULE_DIR$/build/intermediates/classes/androidTest/debug" />
 +    <exclude-output />
 +    <content url="file://$MODULE_DIR$">
 +      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />
 +      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
 +      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
 +      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
 +      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
 +      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/debug" type="java-resource" />
 +      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/debug" isTestSource="true" generated="true" />
 +      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/debug" isTestSource="true" generated="true" />
 +      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
 +      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/debug" isTestSource="true" generated="true" />
 +      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" />
 +      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/androidTest/debug" type="java-test-resource" />
 +      <sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
 +      <sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
 +      <sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
 +      <sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
 +      <sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
 +      <sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
 +      <sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
 +      <sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
 +      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
 +      <sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
 +      <sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
 +      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
 +      <sourceFolder url="file://$MODULE_DIR$/src/main/java/common" isTestSource="false" />
 +      <sourceFolder url="file://$MODULE_DIR$/src/main/java/interface" isTestSource="false" />
 +      <sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
 +      <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
 +      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
 +      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
 +      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
 +      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
 +      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
 +      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
 +      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
 +      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
 +      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
 +      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
 +      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/coverage-instrumented-classes" />
 +      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
 +      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex" />
 +      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex-cache" />
 +      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/EasySetupCore/iotivity-armeabi-base-debug/unspecified/jars" />
 +      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
 +      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jacoco" />
 +      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/javaResources" />
 +      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/libs" />
 +      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
 +      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
 +      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/ndk" />
 +      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
 +      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard" />
 +      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
 +      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
 +      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
 +      <excludeFolder url="file://$MODULE_DIR$/build/outputs" />
 +      <excludeFolder url="file://$MODULE_DIR$/build/tmp" />
 +    </content>
 +    <orderEntry type="jdk" jdkName="Android API 21 Platform" jdkType="Android SDK" />
 +    <orderEntry type="sourceFolder" forTests="false" />
 +    <orderEntry type="module" module-name="iotivity-armeabi-base-debug" exported="" />
 +    <orderEntry type="library" exported="" name="iotivity-armeabi-base-debug-unspecified" level="project" />
 +  </component>
 +</module>
index 6be7bc2,0000000..f4380e8
mode 100644,000000..100644
--- /dev/null
@@@ -1,85 -1,0 +1,89 @@@
-         OCQualityOfService qos, OCClientResponseHandler cb, const char* request,
 +//******************************************************************
 +//
 +// 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 __PROVISIONING_HANDLER_H_
 +#define __PROVISIONING_HANDLER_H_
 +
++
++#include "octypes.h"
++
 +#include "logger.h"
 +#include "ocstack.h"
 +#include "common.h"
 +
 +//-----------------------------------------------------------------------------
 +// Defines
 +//-----------------------------------------------------------------------------
 +#define TAG "provisioninghandler"
 +#define DEFAULT_CONTEXT_VALUE 0x99
 +#ifndef MAX_LENGTH_IPv4_ADDR
 +#define MAX_LENGTH_IPv4_ADDR 16
 +#endif
 +
 +//-----------------------------------------------------------------------------
 +// Typedefs
 +//-----------------------------------------------------------------------------
 +
 +/**
 + * List of methods that can be inititated from the client
 + */
 +OCStackResult InitProvisioningHandler();
 +
 +OCStackResult TerminateProvisioningHandler();
 +
 +void listeningFunc(void*);
 +
 +OCStackApplicationResult ProvisionEnrolleeResponse(void* ctx, OCDoHandle handle,
 +        OCClientResponse * clientResponse);
 +
 +OCStackResult ProvisionEnrollee(OCQualityOfService qos, const char* query, const char* resUri);
 +
 +OCStackApplicationResult GetProvisioningStatusResponse(void* ctx,
 +        OCDoHandle handle, OCClientResponse * clientResponse);
 +
 +OCStackResult InvokeOCDoResource(const char* query, OCMethod method,
++        OCQualityOfService qos, OCClientResponseHandler cb,OCRepPayload * request,
 +        OCHeaderOption * options, uint8_t numOptions);
 +
 +OCStackResult GetProvisioningStatus(OCQualityOfService qos, const char* query);
 +
 +OCStackResult StartProvisioningProcess(const EnrolleeNWProvInfo_t *netInfo,
 +        OCProvisioningStatusCB provisioningStatusCallback);
 +
 +
 +void StopProvisioningProcess();
 +
 +OCStackApplicationResult SubscribeProvPresenceCallback(void* ctx, OCDoHandle handle,
 +        OCClientResponse* clientResponse);
 +
 +OCStackResult SubscribeProvPresence(OCQualityOfService qos, const char* requestURI);
 +
 +OCStackApplicationResult FindProvisioningResourceResponse(void* ctx,
 +        OCDoHandle handle, OCClientResponse * clientResponse);
 +
 +void FindProvisioningResource(void *data);
 +
 +//Invoke Provisioning Status Callback
 +ProvisioningInfo* PrepareProvisioingStatusCB(OCClientResponse * clientResponse,
 +            ProvStatus provStatus);
 +
 +#endif
 +
index 98480f4,0000000..7f29ab9
mode 100644,000000..100644
--- /dev/null
@@@ -1,90 -1,0 +1,92 @@@
- //******************************************************************
++ //******************************************************************
 +//
 +// 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 <stdio.h>
 +#include <stdlib.h>
 +#include <string.h>
 +#include <signal.h>
 +#include <unistd.h>
 +#include <stdint.h>
 +#include <sstream>
 +
 +#include "easysetupmgr.h"
 +
 +//Use ipv4addr for both InitDiscovery and InitDeviceDiscovery
 +char ipv4addr[IPV4_ADDR_SIZE] = { 0 };
 +
 +static OCProvisioningStatusCB cbData = NULL;
 +
 +OCStackResult InitEasySetupManager() {
++      
++      
 +    OCStackResult result = OC_STACK_ERROR;
 +
 +    if (InitProvisioningHandler() == OC_STACK_OK) {
 +        result = OC_STACK_OK;
 +        OIC_LOG(DEBUG, TAG, "InitProvisioningHandler returned Success");
 +    } else {
 +        result = OC_STACK_ERROR;
 +        OIC_LOG_V(ERROR, TAG, "InitProvisioningHandler returned error = %s",
 +                result);
 +    }
 +
 +    return result;
 +}
 +
 +OCStackResult TerminateEasySetupManager() {
 +    return TerminateProvisioningHandler();
 +}
 +
 +OCStackResult RegisterProvisioningStausCallback(
 +        OCProvisioningStatusCB provisioningStatusCallback) {
 +    OCStackResult result = OC_STACK_OK;
 +
 +    if(provisioningStatusCallback != NULL)
 +    {
 +        cbData = provisioningStatusCallback;
 +    }
 +    else
 +    {
 +        result = OC_STACK_ERROR;
 +        OIC_LOG(ERROR, TAG, "provisioningStatusCallback is NULL");
 +    }
 +
 +    return result;
 +}
 +
 +void UnRegisterProvisioningStausCallback() {
 +    if (cbData) {
 +        cbData = NULL;
 +    }
 +}
 +
 +OCStackResult ProvisionEnrollee(const EnrolleeNWProvInfo_t *netInfo)
 +{
-     return StartProvisioningProcess(netInfo, cbData);
++      return StartProvisioningProcess(netInfo, cbData);
 +}
 +
 +OCStackResult StopEnrolleeProvisioning(OCConnectivityType connectivityType) {
 +    OCStackResult result = OC_STACK_OK;
 +
 +    //TODO: Have to handle the transport specific easy setup termination
 +    StopProvisioningProcess();
 +
 +    return result;
 +}
 +
index 5d5f31a,0000000..f242269
mode 100644,000000..100644
--- /dev/null
@@@ -1,727 -1,0 +1,737 @@@
- //******************************************************************
- //
- // 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 <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <signal.h>
- #include <unistd.h>
- #include "provisioninghandler.h"
- // External includes
- #include "cJSON.h"
- #include "camutex.h"
- #include "cathreadpool.h"
- #include "logger.h"
- #include "oic_malloc.h"
- /**
-  * @var g_provisioningMutex
-  * @brief Mutex to synchronize access to g_caDtlsContext.
-  */
- static ca_mutex g_provisioningMutex = NULL;
- static ca_cond g_provisioningCond = NULL;
- bool g_provisioningCondFlag = false;
- static EnrolleeNWProvInfo_t* netProvInfo;
- /**
-  * @var cbData
-  * @brief Callback for providing provisioning status callback to application
-  */
- static OCProvisioningStatusCB cbData = NULL;
- static ca_thread_pool_t g_threadPoolHandle = NULL;
- OCStackResult InitProvisioningHandler() {
-     OCStackResult ret = OC_STACK_ERROR;
-     /* Initialize OCStack*/
-     if (OCInit(NULL, 0, OC_CLIENT) != OC_STACK_OK) {
-         OIC_LOG(ERROR, TAG, "OCStack init error");
-         return ret;
-     }
-     g_provisioningMutex = ca_mutex_new();
-     OIC_LOG(DEBUG, TAG, "ca_thread_pool_init initializing");
-     if (CA_STATUS_OK != ca_thread_pool_init(2, &g_threadPoolHandle)) {
-         OIC_LOG(DEBUG, TAG, "thread_pool_init failed");
-         return OC_STACK_ERROR;
-     }
-     g_provisioningCond = ca_cond_new();
-     if (NULL == g_provisioningCond) {
-         OIC_LOG(DEBUG, TAG, "Failed to create condition");
-         ca_mutex_free(g_provisioningMutex);
-         ca_thread_pool_free(g_threadPoolHandle);
-         return OC_STACK_ERROR;
-     }
-     char *string = "listeningFunc invoked in a thread";
-     if (CA_STATUS_OK
-             != ca_thread_pool_add_task(g_threadPoolHandle, listeningFunc,
-                     (void *) string)) {
-         OIC_LOG(DEBUG, TAG, "thread_pool_add_task failed");
-         ca_thread_pool_free(g_threadPoolHandle);
-         ca_mutex_unlock(g_provisioningMutex);
-         ca_mutex_free(g_provisioningMutex);
-         ca_cond_free(g_provisioningCond);
-         return OC_STACK_ERROR;
-     }
-     return OC_STACK_OK;
- }
- OCStackResult TerminateProvisioningHandler() {
-     OCStackResult ret = OC_STACK_ERROR;
-     if (OCStop() != OC_STACK_OK) {
-         OIC_LOG(ERROR, TAG, "OCStack stop error");
-     }
-     ca_mutex_lock(g_provisioningMutex);
-     g_provisioningCondFlag = true;
-     //ca_cond_signal(g_provisioningCond);
-     ca_mutex_unlock(g_provisioningMutex);
-     ca_mutex_free(g_provisioningMutex);
-     g_provisioningMutex = NULL;
-     ca_thread_pool_free(g_threadPoolHandle);
-     g_threadPoolHandle = NULL;
-     ret = OC_STACK_OK;
-     return ret;
- }
- void listeningFunc(void *data) {
-     while (!g_provisioningCondFlag) {
-         OCStackResult result;
-         ca_mutex_lock(g_provisioningMutex);
-         result = OCProcess();
-         ca_mutex_unlock(g_provisioningMutex);
-         if (result != OC_STACK_OK) {
-             OIC_LOG(ERROR, TAG, "OCStack stop error");
-         }
-         // To minimize CPU utilization we may wish to do this with sleep
-         sleep(1);
-     }
- }
- OCStackApplicationResult ProvisionEnrolleeResponse(void* ctx, OCDoHandle handle,
-         OCClientResponse * clientResponse) {
-     ProvisioningInfo *provInfo;
-     if (clientResponse) {
-         OIC_LOG_V(INFO, TAG, "Put Response JSON = %s",
-                 clientResponse->resJSONPayload);
-     } else {
-         OIC_LOG_V(INFO, TAG,
-                 "ProvisionEnrolleeResponse received Null clientResponse");
-         provInfo = PrepareProvisioingStatusCB(clientResponse,
-                 DEVICE_NOT_PROVISIONED);
-         cbData(provInfo);
-         return OC_STACK_DELETE_TRANSACTION;
-     }
-     OIC_LOG_V(DEBUG, TAG, "ProvisionEnrolleeResponse %s ",
-             clientResponse->resJSONPayload);
-     if (clientResponse->resJSONPayload) {
-         cJSON *observeJson = cJSON_CreateObject();
-         observeJson = cJSON_Parse(clientResponse->resJSONPayload);
-         cJSON *ocArray = cJSON_GetObjectItem(observeJson, OC_RSRVD_OC);
-         cJSON *ocArray_sub = cJSON_GetArrayItem(ocArray, 0);
-         cJSON *representationArray = cJSON_GetObjectItem(ocArray_sub, OC_RSRVD_REPRESENTATION);
-         char *ocArray_str = cJSON_PrintUnformatted(representationArray);
-         if (strstr(ocArray_str, "[{}") == ocArray_str) {
-             OIC_LOG_V(DEBUG, TAG, "invalid payload : %s", ocArray_str);
-             cJSON_Delete(observeJson);
-             return OC_STACK_DELETE_TRANSACTION;
-         }
-         int countofrep = cJSON_GetArraySize(representationArray);
-         for (int i = 0; i < countofrep; ++i) {
-             cJSON *arrayJSON = cJSON_GetArrayItem(representationArray, i);
-             OIC_LOG_V(DEBUG, TAG, "rep#%d's name : %s", i, arrayJSON->string);
-             if (!strcmp(arrayJSON->string, OC_RSRVD_ES_PS))
-             {
-                 if(arrayJSON->valueint == 1)
-                 {
-                     OIC_LOG_V(DEBUG, TAG, "PS is proper");
-                     continue;
-                 }
-                 else{
-                     OIC_LOG_V(DEBUG, TAG, "PS is NOT proper");
-                     provInfo = PrepareProvisioingStatusCB(clientResponse,
-                             DEVICE_NOT_PROVISIONED);
-                     cbData(provInfo);
-                 }
-             }
-             if (!strcmp(arrayJSON->string, OC_RSRVD_ES_TNN))
-             {
-                 if(!strcmp(arrayJSON->valuestring, netProvInfo->netAddressInfo.WIFI.ssid))
-                 {
-                     OIC_LOG_V(DEBUG, TAG, "SSID is proper");
-                     continue;
-                 }
-                 else{
-                     OIC_LOG_V(DEBUG, TAG, "SSID is NOT proper");
-                     provInfo = PrepareProvisioingStatusCB(clientResponse,
-                             DEVICE_NOT_PROVISIONED);
-                     cbData(provInfo);
-                 }
-             }
-             if (!strcmp(arrayJSON->string, OC_RSRVD_ES_CD))
-             {
-                 if(!strcmp(arrayJSON->valuestring, netProvInfo->netAddressInfo.WIFI.pwd))
-                 {
-                     OIC_LOG_V(DEBUG, TAG, "Password is proper");
-                     continue;
-                 }
-                 else{
-                     OIC_LOG_V(DEBUG, TAG, "Password is NOT proper");
-                     provInfo = PrepareProvisioingStatusCB(clientResponse,
-                             DEVICE_NOT_PROVISIONED);
-                     cbData(provInfo);
-                 }
-             }
-             switch (arrayJSON->type) {
-             case cJSON_False:
-             case cJSON_True:
-                 OIC_LOG_V(DEBUG, TAG, "rep#%d's int value : %d", i,
-                         arrayJSON->valueint);
-                 break;
-             case cJSON_Number:
-                 OIC_LOG_V(DEBUG, TAG, "rep#%d's double value : %f", i,
-                         arrayJSON->valuedouble);
-                 break;
-             case cJSON_String:
-                 OIC_LOG_V(DEBUG, TAG, "rep#%d's value : %s", i,
-                         arrayJSON->valuestring);
-                 break;
-             case cJSON_NULL:
-             default:
-                 OIC_LOG_V(DEBUG, TAG, "rep#%d's value : NULL", i);
-                 break;
-             }
-         }
-         cJSON_Delete(observeJson);
-         provInfo = PrepareProvisioingStatusCB(clientResponse,
-                 DEVICE_PROVISIONED);
-         cbData(provInfo);
-         return OC_STACK_KEEP_TRANSACTION;
-     } else {
-         OIC_LOG(INFO, TAG,
-                 "ProvisionEnrolleeResponse received NULL clientResponse. \
-                                 Invoking Provisioing Status Callback");
-         provInfo = PrepareProvisioingStatusCB(clientResponse,
-                 DEVICE_NOT_PROVISIONED);
-         cbData(provInfo);
-         return OC_STACK_DELETE_TRANSACTION;
-     }
- }
- OCStackResult ProvisionEnrollee(OCQualityOfService qos, const char* query, const char* resUri) {
-     OIC_LOG_V(INFO, TAG, "\n\nExecuting ProvisionEnrollee%s", __func__);
-     cJSON *jsonFinal = cJSON_CreateObject();
-     cJSON *json = cJSON_CreateObject();
-     cJSON *jsonArray;
-     cJSON *format;
-     char* payload = NULL;
-     cJSON_AddStringToObject(json, OC_RSRVD_HREF, resUri);
-     cJSON_AddItemToObject(json, OC_RSRVD_REPRESENTATION, format = cJSON_CreateObject());
-     cJSON_AddStringToObject(format, OC_RSRVD_ES_TNN, netProvInfo->netAddressInfo.WIFI.ssid);
-     cJSON_AddStringToObject(format, OC_RSRVD_ES_CD, netProvInfo->netAddressInfo.WIFI.pwd);
-     cJSON_AddItemToObject(jsonFinal, OC_RSRVD_OC, jsonArray = cJSON_CreateArray());
-     cJSON_AddItemToArray(jsonArray, json);
-     OIC_LOG_V(DEBUG, TAG, "ProvisionEnrollee : %s",
-             cJSON_PrintUnformatted(jsonFinal));
-     payload = cJSON_Print(jsonFinal);
-     OIC_LOG_V(DEBUG, TAG, "Payload : %s", payload);
-     OCStackResult ret = InvokeOCDoResource(query, OC_REST_PUT, OC_HIGH_QOS,
-             ProvisionEnrolleeResponse, payload, NULL, 0);
-     cJSON_Delete(json);
-     return ret;
- }
- OCStackApplicationResult GetProvisioningStatusResponse(void* ctx,
-         OCDoHandle handle, OCClientResponse * clientResponse) {
-     ProvisioningInfo *provInfo;
-     if (clientResponse == NULL) {
-         OIC_LOG(INFO, TAG,
-                 "getReqCB received NULL clientResponse. \
-             Invoking Provisioing Status Callback");
-         provInfo = PrepareProvisioingStatusCB(clientResponse,
-                 DEVICE_NOT_PROVISIONED);
-         cbData(provInfo);
-         return OC_STACK_DELETE_TRANSACTION;
-     }
-     if (clientResponse->rcvdVendorSpecificHeaderOptions
-             && clientResponse->numRcvdVendorSpecificHeaderOptions) {
-         OIC_LOG(INFO, TAG, "Received vendor specific options");
-         uint8_t i = 0;
-         OCHeaderOption * rcvdOptions =
-                 clientResponse->rcvdVendorSpecificHeaderOptions;
-         for (i = 0; i < clientResponse->numRcvdVendorSpecificHeaderOptions;
-                 i++) {
-             if (((OCHeaderOption) rcvdOptions[i]).protocolID == OC_COAP_ID) {
-                 OIC_LOG_V(INFO, TAG,
-                         "Received option with OC_COAP_ID and ID %u with",
-                         ((OCHeaderOption) rcvdOptions[i]).optionID);
-                 OIC_LOG_BUFFER(INFO, TAG,
-                         ((OCHeaderOption) rcvdOptions[i]).optionData,
-                         MAX_HEADER_OPTION_DATA_LENGTH);
-             }
-         }
-     }
-     char query[OIC_STRING_MAX_VALUE] = { '\0' };
-     if (clientResponse->resJSONPayload) {
-         cJSON *observeJson = cJSON_CreateObject();
-         observeJson = cJSON_Parse(clientResponse->resJSONPayload);
-         cJSON *ocArray = cJSON_GetObjectItem(observeJson, OC_RSRVD_OC);
-         cJSON *ocArray_sub = cJSON_GetArrayItem(ocArray, 0);
-         cJSON *resUriObj = cJSON_GetObjectItem(ocArray_sub, OC_RSRVD_HREF);
-         OIC_LOG_V(DEBUG, TAG, "resUriObj = %s, valueString = %s",
-             resUriObj->string, resUriObj->valuestring);
-         char resURI[MAX_URI_LENGTH]={'\0'};
-         strncpy(resURI, resUriObj->valuestring, sizeof(resURI));
-         snprintf(query, sizeof(query), UNICAST_PROV_STATUS_QUERY,
-                 clientResponse->addr->addr,
-                 IP_PORT, resURI);
-         cJSON *representationArray = cJSON_GetObjectItem(ocArray_sub, OC_RSRVD_REPRESENTATION);
-         char *ocArray_str = cJSON_PrintUnformatted(representationArray);
-         if (strstr(ocArray_str, "[{}") == ocArray_str) {
-             OIC_LOG_V(DEBUG, TAG, "invalid payload : %s", ocArray_str);
-             cJSON_Delete(observeJson);
-             return OC_STACK_DELETE_TRANSACTION;
-         }
-         int countofrep = cJSON_GetArraySize(representationArray);
-         for (int i = 0; i < countofrep; ++i) {
-             cJSON *arrayJSON = cJSON_GetArrayItem(representationArray, i);
-             OIC_LOG_V(DEBUG, TAG, "rep#%d's name : %s", i, arrayJSON->string);
-             switch (arrayJSON->type) {
-             case cJSON_False:
-             case cJSON_True:
-                 OIC_LOG_V(DEBUG, TAG, "rep#%d's value : %d", i,
-                         arrayJSON->valueint);
-                 break;
-             case cJSON_Number:
-                 OIC_LOG_V(DEBUG, TAG, "rep#%d's value : %f", i,
-                         arrayJSON->valuedouble);
-                 break;
-             case cJSON_String:
-                 OIC_LOG_V(DEBUG, TAG, "rep#%d's value : %s", i,
-                         arrayJSON->valuestring);
-                 break;
-             case cJSON_NULL:
-             default:
-                 OIC_LOG_V(DEBUG, TAG, "rep#%d's value : NULL", i);
-                 break;
-             }
-         }
-         cJSON_Delete(observeJson);
-         if (ProvisionEnrollee(OC_HIGH_QOS, query, resURI) != OC_STACK_OK) {
-             OIC_LOG(INFO, TAG,
-                     "GetProvisioningStatusResponse received NULL clientResponse. \
-                 Invoking Provisioing Status Callback");
-             provInfo = PrepareProvisioingStatusCB(clientResponse,
-                     DEVICE_NOT_PROVISIONED);
-             cbData(provInfo);
-             return OC_STACK_DELETE_TRANSACTION;
-         }
-     } else {
-         OIC_LOG(INFO, TAG,
-                 "GetProvisioningStatusResponse received NULL clientResponse. \
-             Invoking Provisioing Status Callback");
-         provInfo = PrepareProvisioingStatusCB(clientResponse,
-                 DEVICE_NOT_PROVISIONED);
-         cbData(provInfo);
-         return OC_STACK_DELETE_TRANSACTION;
-     }
-     return OC_STACK_DELETE_TRANSACTION;
- }
- OCStackResult InvokeOCDoResource(const char* query, OCMethod method,
-         OCQualityOfService qos, OCClientResponseHandler cb, const char* request,
-         OCHeaderOption * options, uint8_t numOptions) {
-     OCStackResult ret;
-     OCCallbackData cbData;
-     cbData.cb = cb;
-     cbData.context = (void*) DEFAULT_CONTEXT_VALUE;
-     cbData.cd = NULL;
-     ret = OCDoResource(NULL, method, query, 0, request, OC_CONNTYPE, qos,
-             &cbData, options, numOptions);
-     if (ret != OC_STACK_OK) {
-         OIC_LOG_V(ERROR, TAG, "OCDoResource returns error %d with method %d",
-                 ret, method);
-     }
-     return ret;
- }
- OCStackResult GetProvisioningStatus(OCQualityOfService qos, const char* query) {
-     OCStackResult ret = OC_STACK_ERROR;
-     OCHeaderOption options[MAX_HEADER_OPTIONS];
-     OIC_LOG_V(INFO, TAG, "\n\nExecuting %s", __func__);
-     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, OC_HIGH_QOS,
-             GetProvisioningStatusResponse, NULL, options, 2);
-     return ret;
- }
- OCStackResult StartProvisioningProcess(const EnrolleeNWProvInfo_t *netInfo,
-         OCProvisioningStatusCB provisioningStatusCallback) {
-     OCStackResult result = OC_STACK_ERROR;
-     if (netInfo->netAddressInfo.WIFI.ipAddress == NULL) {
-         OIC_LOG(ERROR, TAG, "Request URI is NULL");
-         return result;
-     }
-     if (provisioningStatusCallback == NULL) {
-         OIC_LOG(ERROR, TAG, "ProvisioningStatusCallback is NULL");
-         return result;
-     }
-     cbData = provisioningStatusCallback;
-     //Copy Network Provisioning  Information
-     netProvInfo = (EnrolleeNWProvInfo_t *)OICCalloc(1, sizeof(EnrolleeNWProvInfo_t));
-     if (NULL == netProvInfo)
-     {
-         OIC_LOG(ERROR, TAG, "Invalid input..");
-         return OC_STACK_ERROR;
-     }
-     memcpy(netProvInfo, netInfo, sizeof(EnrolleeNWProvInfo_t));
-     OIC_LOG_V(DEBUG, TAG, "Network Provisioning Info. SSID = %s",
-         netProvInfo->netAddressInfo.WIFI.ssid);
-     OIC_LOG_V(DEBUG, TAG, "Network Provisioning Info. PWD = %s",
-         netProvInfo->netAddressInfo.WIFI.pwd);
-     if (CA_STATUS_OK
-             != ca_thread_pool_add_task(g_threadPoolHandle, FindProvisioningResource,
-                     (void *) "")) {
-         OIC_LOG(DEBUG, TAG, "thread_pool_add_task of FindProvisioningResource failed");
-         ca_thread_pool_free(g_threadPoolHandle);
-         ca_mutex_unlock(g_provisioningMutex);
-         ca_mutex_free(g_provisioningMutex);
-         ca_cond_free(g_provisioningCond);
-         return OC_STACK_ERROR;
-     }
-     return OC_STACK_OK;
- }
- void StopProvisioningProcess() {
-     cbData = NULL;
- }
- // This is a function called back when a device is discovered
- OCStackApplicationResult FindProvisioningResourceResponse(void* ctx,
-         OCDoHandle handle, OCClientResponse * clientResponse) {
-     OIC_LOG(INFO, TAG, PCF("Entering FindProvisioningResourceResponse"));
-     OCStackApplicationResult response = OC_STACK_DELETE_TRANSACTION;
-     ProvisioningInfo *provInfo;
-     if (clientResponse->result != OC_STACK_OK) {
-         OIC_LOG(ERROR, TAG,
-                 "OCStack stop error. Calling Provisioing Status Callback");
-         provInfo = PrepareProvisioingStatusCB(clientResponse,
-                 DEVICE_NOT_PROVISIONED);
-         cbData(provInfo);
-         return response;
-     }
-     if (clientResponse) {
-         cJSON *discoveryJson = cJSON_CreateObject();
-         discoveryJson = cJSON_Parse((char *) clientResponse->resJSONPayload);
-         cJSON *ocArray = cJSON_GetObjectItem(discoveryJson, OC_RSRVD_OC);
-         char *ocArray_str = cJSON_PrintUnformatted(ocArray);
-         if (strstr(ocArray_str, "[{}") == ocArray_str) {
-             OIC_LOG_V(DEBUG, TAG, "invalid payload : %s", ocArray_str);
-             cJSON_Delete(discoveryJson);
-             provInfo = PrepareProvisioingStatusCB(clientResponse,
-                     DEVICE_NOT_PROVISIONED);
-             cbData(provInfo);
-             return response;
-         }
-         cJSON *ocArray_sub = cJSON_GetArrayItem(ocArray, 0);
-         cJSON *resUriObj = cJSON_GetObjectItem(ocArray_sub, OC_RSRVD_HREF);
-         OIC_LOG_V(DEBUG, TAG, "resUriObj = %s, valueString = %s",
-             resUriObj->string, resUriObj->valuestring);
-         char szQueryUri[64] = { 0 };
-         snprintf(szQueryUri, sizeof(szQueryUri), UNICAST_PROV_STATUS_QUERY,
-                 clientResponse->devAddr.addr, IP_PORT, resUriObj->valuestring);
-         OIC_LOG_V(DEBUG, TAG, "query before GetProvisioningStatus call = %s", szQueryUri);
-         if (GetProvisioningStatus(OC_HIGH_QOS, szQueryUri) != OC_STACK_OK) {
-             OIC_LOG(INFO, TAG,
-                     "GetProvisioningStatus returned error. \
-                                 Invoking Provisioing Status Callback");
-             provInfo = PrepareProvisioingStatusCB(clientResponse,
-                     DEVICE_NOT_PROVISIONED);
-             cbData(provInfo);
-             return OC_STACK_DELETE_TRANSACTION;
-         }
-     } else {
-         // clientResponse is invalid
-         OIC_LOG(ERROR, TAG,
-                 "Invalid response for Provisioning Discovery request. \
-         Invoking Provisioing Status Callback");
-         provInfo = PrepareProvisioingStatusCB(clientResponse,
-                 DEVICE_NOT_PROVISIONED);
-         cbData(provInfo);
-         return response;
-     }
-     return OC_STACK_KEEP_TRANSACTION;
- }
- void FindProvisioningResource(void *data)
- {
-     OCStackResult ret = OC_STACK_ERROR;
-     /* Start a discovery query*/
-     char szQueryUri[64] = { 0 };
-     snprintf(szQueryUri, sizeof(szQueryUri), UNICAST_PROVISIONING_QUERY,
-             netProvInfo->netAddressInfo.WIFI.ipAddress, IP_PORT);
-     OIC_LOG_V(DEBUG, TAG, "szQueryUri = %s", szQueryUri);
-     OCCallbackData ocCBData;
-     ocCBData.cb = FindProvisioningResourceResponse;
-     ocCBData.context = (void*) DEFAULT_CONTEXT_VALUE;
-     ocCBData.cd = NULL;
-     ret = OCDoResource(NULL, OC_REST_GET, szQueryUri, 0, 0, OC_CONNTYPE,
-             OC_LOW_QOS, &ocCBData, NULL, 0);
-     if (ret != OC_STACK_OK) {
-         OIC_LOG(ERROR, TAG, "OCStack resource error");
-         OIC_LOG(ERROR, TAG,
-                 "FindProvisioningResource failed. \
-             Invoking Provisioing Status Callback");
-         ProvisioningInfo *provInfo;
-         provInfo = (ProvisioningInfo *) OICCalloc(1, sizeof(ProvisioningInfo));
-         if(provInfo == NULL)
-         {
-             OIC_LOG_V(ERROR, TAG, "Failed to allocate memory");
-             return;
-         }
-         OCDevAddr *devAddr = (OCDevAddr *) OICCalloc(1, sizeof(OCDevAddr));
-         if(devAddr == NULL)
-         {
-             OIC_LOG_V(ERROR, TAG, "Failed to allocate memory");
-             return;
-         }
-         strncpy(devAddr->addr, netProvInfo->netAddressInfo.WIFI.ipAddress, sizeof(devAddr->addr));
-         devAddr->port= IP_PORT;
-         provInfo->provDeviceInfo.addr = devAddr;
-         provInfo->provStatus = DEVICE_NOT_PROVISIONED;
-         cbData(provInfo);
-     }
- }
- OCStackApplicationResult SubscribeProvPresenceCallback(void* ctx, OCDoHandle handle,
-         OCClientResponse* clientResponse) {
-     OIC_LOG(INFO, TAG, PCF("Entering SubscribeProvPresenceCallback"));
-     OCStackApplicationResult response = OC_STACK_DELETE_TRANSACTION;
-     if (clientResponse->result != OC_STACK_OK) {
-         OIC_LOG(ERROR, TAG, "OCStack stop error");
-         return response;
-     }
-     if (clientResponse) {
-         OIC_LOG(INFO, TAG, PCF("Client Response exists"));
-         cJSON *discoveryJson = cJSON_CreateObject();
-         discoveryJson = cJSON_Parse((char *) clientResponse->resJSONPayload);
-         cJSON *ocArray = cJSON_GetObjectItem(discoveryJson, OC_RSRVD_OC);
-         char *ocArray_str = cJSON_PrintUnformatted(ocArray);
-         if (strstr(ocArray_str, "[{}") == ocArray_str) {
-             OIC_LOG_V(DEBUG, TAG, "invalid payload : %s", ocArray_str);
-             cJSON_Delete(discoveryJson);
-             return response;
-         }
-         char sourceIPAddr[OIC_STRING_MAX_VALUE] = { '\0' };
-         snprintf(sourceIPAddr, sizeof(sourceIPAddr), "%s", clientResponse->addr->addr);
-         OIC_LOG_V(DEBUG, TAG, "Discovered %s @ %s",
-                 clientResponse->resJSONPayload, sourceIPAddr);
-         /* Start a discovery query*/
-         char szQueryUri[64] = { 0 };
-         snprintf(szQueryUri, sizeof(szQueryUri), UNICAST_PROVISIONING_QUERY,
-                 sourceIPAddr, IP_PORT);
-         /*if (FindProvisioningResource(qos, szQueryUri) != OC_STACK_OK) {
-             OIC_LOG(ERROR, TAG, "FindProvisioningResource failed");
-             return OC_STACK_KEEP_TRANSACTION;
-         }*/
-     } else {
-         // clientResponse is invalid
-         OIC_LOG(ERROR, TAG, PCF("Client Response is NULL!"));
-     }
-     return OC_STACK_KEEP_TRANSACTION;
- }
- OCStackResult SubscribeProvPresence(OCQualityOfService qos,
-         const char* requestURI) {
-     OCStackResult ret = OC_STACK_ERROR;
-     OCCallbackData cbData;
-     cbData.cb = &SubscribeProvPresenceCallback;
-     cbData.context = (void*) DEFAULT_CONTEXT_VALUE;
-     cbData.cd = NULL;
-     ret = OCDoResource(NULL, OC_REST_PRESENCE, requestURI, 0, 0, OC_CONNTYPE,
-             OC_LOW_QOS, &cbData, NULL, 0);
-     if (ret != OC_STACK_OK) {
-         OIC_LOG(ERROR, TAG, "OCStack resource error");
-     }
-     return ret;
- }
- OCStackResult FindNetworkResource() {
-     OCStackResult ret = OC_STACK_ERROR;
-     if (OCStop() != OC_STACK_OK) {
-         OIC_LOG(ERROR, 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, TAG, "Failed to allocate memory");
-         return NULL;
-     }
-     OCDevAddr *devAddr = (OCDevAddr *) OICCalloc(1, sizeof(OCDevAddr));
-     if(devAddr == NULL)
-     {
-         OIC_LOG_V(ERROR, TAG, "Failed to allocate memory");
-         return NULL;
-     }
-     strncpy(devAddr->addr, clientResponse->addr->addr, sizeof(devAddr->addr));
-     devAddr->port= clientResponse->addr->port;
-     provInfo->provDeviceInfo.addr = devAddr;
-     provInfo->provStatus = provStatus;
-     return provInfo;
- }
++//******************************************************************\r
++//\r
++// Copyright 2015 Samsung Electronics All Rights Reserved.\r
++//\r
++//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
++//\r
++// Licensed under the Apache License, Version 2.0 (the "License");\r
++// you may not use this file except in compliance with the License.\r
++// You may obtain a copy of the License at\r
++//\r
++//      http://www.apache.org/licenses/LICENSE-2.0\r
++//\r
++// Unless required by applicable law or agreed to in writing, software\r
++// distributed under the License is distributed on an "AS IS" BASIS,\r
++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
++// See the License for the specific language governing permissions and\r
++// limitations under the License.\r
++//\r
++//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
++\r
++#include <stdio.h>\r
++#include <stdlib.h>\r
++#include <string.h>\r
++#include <signal.h>\r
++#include <unistd.h>\r
++#include "ocpayload.h"\r
++#include "provisioninghandler.h"\r
++\r
++// External includes\r
++\r
++#include "camutex.h"\r
++#include "cathreadpool.h"\r
++#include "logger.h"\r
++#include "oic_malloc.h"\r
++\r
++\r
++/**\r
++ * @var g_provisioningMutex\r
++ * @brief Mutex to synchronize access to g_caDtlsContext.\r
++ */\r
++static ca_mutex g_provisioningMutex = NULL;\r
++static ca_cond g_provisioningCond = NULL;\r
++bool g_provisioningCondFlag = false;\r
++\r
++static EnrolleeNWProvInfo_t* netProvInfo;\r
++\r
++/**\r
++ * @var cbData\r
++ * @brief Callback for providing provisioning status callback to application\r
++ */\r
++static OCProvisioningStatusCB cbData = NULL;\r
++static ca_thread_pool_t g_threadPoolHandle = NULL;\r
++\r
++OCStackResult InitProvisioningHandler() {\r
++    OCStackResult ret = OC_STACK_ERROR;\r
++    /* Initialize OCStack*/\r
++    if (OCInit(NULL, 0, OC_CLIENT) != OC_STACK_OK) {\r
++        OIC_LOG(ERROR, TAG, "OCStack init error");\r
++        return ret;\r
++    }\r
++\r
++    g_provisioningMutex = ca_mutex_new();\r
++\r
++    OIC_LOG(DEBUG, TAG, "ca_thread_pool_init initializing");\r
++\r
++    if (CA_STATUS_OK != ca_thread_pool_init(2, &g_threadPoolHandle)) {\r
++        OIC_LOG(DEBUG, TAG, "thread_pool_init failed");\r
++        return OC_STACK_ERROR;\r
++    }\r
++\r
++    g_provisioningCond = ca_cond_new();\r
++    if (NULL == g_provisioningCond) {\r
++        OIC_LOG(DEBUG, TAG, "Failed to create condition");\r
++        ca_mutex_free(g_provisioningMutex);\r
++        ca_thread_pool_free(g_threadPoolHandle);\r
++        return OC_STACK_ERROR;\r
++    }\r
++\r
++    char *string = "listeningFunc invoked in a thread";\r
++    if (CA_STATUS_OK\r
++            != ca_thread_pool_add_task(g_threadPoolHandle, listeningFunc,\r
++                    (void *) string)) {\r
++        OIC_LOG(DEBUG, TAG, "thread_pool_add_task failed");\r
++        ca_thread_pool_free(g_threadPoolHandle);\r
++        ca_mutex_unlock(g_provisioningMutex);\r
++        ca_mutex_free(g_provisioningMutex);\r
++        ca_cond_free(g_provisioningCond);\r
++        return OC_STACK_ERROR;\r
++    }\r
++    return OC_STACK_OK;\r
++}\r
++\r
++OCStackResult TerminateProvisioningHandler() {\r
++    OCStackResult ret = OC_STACK_ERROR;\r
++    if (OCStop() != OC_STACK_OK) {\r
++        OIC_LOG(ERROR, TAG, "OCStack stop error");\r
++    }\r
++\r
++    ca_mutex_lock(g_provisioningMutex);\r
++    g_provisioningCondFlag = true;\r
++    //ca_cond_signal(g_provisioningCond);\r
++    ca_mutex_unlock(g_provisioningMutex);\r
++\r
++    ca_mutex_free(g_provisioningMutex);\r
++    g_provisioningMutex = NULL;\r
++\r
++    ca_thread_pool_free(g_threadPoolHandle);\r
++    g_threadPoolHandle = NULL;\r
++\r
++    ret = OC_STACK_OK;\r
++    return ret;\r
++}\r
++\r
++void listeningFunc(void *data) {\r
++    while (!g_provisioningCondFlag) {\r
++        OCStackResult result;\r
++\r
++        ca_mutex_lock(g_provisioningMutex);\r
++        result = OCProcess();\r
++        ca_mutex_unlock(g_provisioningMutex);\r
++\r
++        if (result != OC_STACK_OK) {\r
++            OIC_LOG(ERROR, TAG, "OCStack stop error");\r
++        }\r
++\r
++        // To minimize CPU utilization we may wish to do this with sleep\r
++        sleep(1);\r
++    }\r
++}\r
++\r
++OCStackApplicationResult ProvisionEnrolleeResponse(void* ctx, OCDoHandle handle,\r
++        OCClientResponse * clientResponse) {\r
++    ProvisioningInfo *provInfo;\r
++\r
++    if (clientResponse) {\r
++        OIC_LOG_V(INFO, TAG, "Put Response");\r
++    } else {\r
++        OIC_LOG_V(INFO, TAG,\r
++                "ProvisionEnrolleeResponse received Null clientResponse");\r
++        provInfo = PrepareProvisioingStatusCB(clientResponse,\r
++                DEVICE_NOT_PROVISIONED);\r
++        cbData(provInfo);\r
++        return OC_STACK_DELETE_TRANSACTION;\r
++    }\r
++\r
++    if (clientResponse->payload) {\r
++\r
++        if(clientResponse->payload->type != PAYLOAD_TYPE_REPRESENTATION)\r
++        {\r
++            OIC_LOG_V(DEBUG, TAG, "Incoming payload not a representation");\r
++            return OC_STACK_DELETE_TRANSACTION;\r
++        }\r
++\r
++        OCRepPayload* input = (OCRepPayload*)(clientResponse->payload);\r
++        if(!input)\r
++        {\r
++            OIC_LOG_V(DEBUG, TAG, "Failed To parse");\r
++            return OC_STACK_DELETE_TRANSACTION;\r
++        }\r
++\r
++        while(input){\r
++\r
++            int64_t ps;\r
++            if(OCRepPayloadGetPropInt(input,OC_RSRVD_ES_PS,&ps))    {\r
++                if(ps == 1)\r
++                {\r
++                    OIC_LOG_V(DEBUG, TAG, "PS is proper");\r
++                    continue;\r
++                }\r
++                else{\r
++                    OIC_LOG_V(DEBUG, TAG, "PS is NOT proper");\r
++                    provInfo = PrepareProvisioingStatusCB(clientResponse,\r
++                            DEVICE_NOT_PROVISIONED);\r
++                    cbData(provInfo);\r
++\r
++                }\r
++            }\r
++\r
++            const char* tnn;\r
++            if(OCRepPayloadGetPropString(input,OC_RSRVD_ES_TNN,&tnn)){\r
++                if(!strcmp(tnn, netProvInfo->netAddressInfo.WIFI.ssid))\r
++                {\r
++                    OIC_LOG_V(DEBUG, TAG, "SSID is proper");\r
++                    continue;\r
++                }\r
++                else{\r
++                    OIC_LOG_V(DEBUG, TAG, "SSID is NOT proper");\r
++                    provInfo = PrepareProvisioingStatusCB(clientResponse,\r
++                            DEVICE_NOT_PROVISIONED);\r
++                    cbData(provInfo);\r
++                }\r
++            }\r
++            const char* cd;\r
++            if(OCRepPayloadGetPropString(input, OC_RSRVD_ES_CD,&cd)){\r
++                if(!strcmp(cd,netProvInfo->netAddressInfo.WIFI.pwd))\r
++                {\r
++                    OIC_LOG_V(DEBUG, TAG, "Password is proper");\r
++                    continue;\r
++                }\r
++                else{\r
++                    OIC_LOG_V(DEBUG, TAG, "Password is NOT proper");\r
++                    provInfo = PrepareProvisioingStatusCB(clientResponse,\r
++                            DEVICE_NOT_PROVISIONED);\r
++                    cbData(provInfo);\r
++                }\r
++            }\r
++\r
++            OCRepPayloadValue* val = input->values;\r
++\r
++            switch(val->type)\r
++            {\r
++                case OCREP_PROP_NULL:\r
++                    OIC_LOG_V(DEBUG, TAG, "\t\t%s: NULL", val->name);\r
++                    break;\r
++                case OCREP_PROP_INT:\r
++                    OIC_LOG_V(DEBUG, TAG, "\t\t%s(int):%lld", val->name, val->i);\r
++                    break;\r
++                case OCREP_PROP_DOUBLE:\r
++                    OIC_LOG_V(DEBUG, TAG, "\t\t%s(double):%f", val->name, val->d);\r
++                    break;\r
++                case OCREP_PROP_BOOL:\r
++                    OIC_LOG_V(DEBUG, TAG, "\t\t%s(bool):%s", val->name, val->b ? "true" : "false");\r
++                    break;\r
++                case OCREP_PROP_STRING:\r
++                    OIC_LOG_V(DEBUG, TAG, "\t\t%s(string):%s", val->name, val->str);\r
++                    break;\r
++                case OCREP_PROP_OBJECT:\r
++                    // Note: Only prints the URI (if available), to print further, you'll\r
++                    // need to dig into the object better!\r
++                    OIC_LOG_V(DEBUG, TAG, "\t\t%s(OCRep):%s", val->name, val->obj->uri);\r
++                    break;\r
++                case OCREP_PROP_ARRAY:\r
++                    switch(val->arr.type)\r
++                    {\r
++                        case OCREP_PROP_INT:\r
++                            OIC_LOG_V(DEBUG, TAG, "\t\t%s(int array):%lld x %lld x %lld",\r
++                                    val->name,\r
++                                    val->arr.dimensions[0], val->arr.dimensions[1],\r
++                                    val->arr.dimensions[2]);\r
++                            break;\r
++                        case OCREP_PROP_DOUBLE:\r
++                            OIC_LOG_V(DEBUG, TAG, "\t\t%s(double array):%lld x %lld x %lld",\r
++                                    val->name,\r
++                                    val->arr.dimensions[0], val->arr.dimensions[1],\r
++                                    val->arr.dimensions[2]);\r
++                            break;\r
++                        case OCREP_PROP_BOOL:\r
++                            OIC_LOG_V(DEBUG, TAG, "\t\t%s(bool array):%lld x %lld x %lld",\r
++                                    val->name,\r
++                                    val->arr.dimensions[0], val->arr.dimensions[1],\r
++                                    val->arr.dimensions[2]);\r
++                            break;\r
++                        case OCREP_PROP_STRING:\r
++                            OIC_LOG_V(DEBUG, TAG, "\t\t%s(string array):%lld x %lld x %lld",\r
++                                    val->name,\r
++                                    val->arr.dimensions[0], val->arr.dimensions[1],\r
++                                    val->arr.dimensions[2]);\r
++                            break;\r
++                        case OCREP_PROP_OBJECT:\r
++                            OIC_LOG_V(DEBUG, TAG, "\t\t%s(OCRep array):%lld x %lld x %lld",\r
++                                    val->name,\r
++                                    val->arr.dimensions[0], val->arr.dimensions[1],\r
++                                    val->arr.dimensions[2]);\r
++                            break;\r
++                        default:\r
++                            //OIC_LOG_V(ERROR, TAG, "\t\t%s <-- Unknown/unsupported array type!",\r
++                            //  val->name);\r
++                            break;\r
++                    }\r
++                    break;\r
++                        default:\r
++                            /*OC_LOG_V(ERROR, TAG\r
++                                , "\t\t%s <-- Unknown type!", val->name);*/\r
++                            break;\r
++            }\r
++            input=input->next;\r
++        }\r
++\r
++\r
++\r
++\r
++\r
++\r
++\r
++        provInfo = PrepareProvisioingStatusCB(clientResponse,\r
++                DEVICE_PROVISIONED);\r
++        cbData(provInfo);\r
++\r
++        return OC_STACK_KEEP_TRANSACTION;\r
++    } else {\r
++        OIC_LOG(INFO, TAG,\r
++                "ProvisionEnrolleeResponse received NULL clientResponse. \\r
++        Invoking Provisioing Status Callback");\r
++        provInfo = PrepareProvisioingStatusCB(clientResponse,\r
++                DEVICE_NOT_PROVISIONED);\r
++        cbData(provInfo);\r
++        return OC_STACK_DELETE_TRANSACTION;\r
++    }\r
++}\r
++\r
++\r
++\r
++OCStackResult ProvisionEnrollee(OCQualityOfService qos, const char* query, const char* resUri) {\r
++    OIC_LOG_V(INFO, TAG, "\n\nExecuting ProvisionEnrollee%s", __func__);\r
++\r
++\r
++    OCRepPayload* payload = OCRepPayloadCreate();\r
++\r
++    OCRepPayloadSetUri(payload,resUri);\r
++    OCRepPayloadSetPropString(payload,OC_RSRVD_ES_TNN,netProvInfo->netAddressInfo.WIFI.ssid);\r
++    OCRepPayloadSetPropString(payload,OC_RSRVD_ES_CD,netProvInfo->netAddressInfo.WIFI.pwd);\r
++\r
++    OIC_LOG_V(DEBUG, TAG, "OCPayload ready for ProvisionEnrollee");\r
++\r
++    OCStackResult ret = InvokeOCDoResource(query, OC_REST_PUT, OC_HIGH_QOS,\r
++            ProvisionEnrolleeResponse, payload, NULL, 0);\r
++\r
++    return ret;\r
++}\r
++\r
++\r
++OCStackApplicationResult GetProvisioningStatusResponse(void* ctx,\r
++        OCDoHandle handle, OCClientResponse * clientResponse) {\r
++    ProvisioningInfo *provInfo;\r
++\r
++    if (clientResponse == NULL) {\r
++        OIC_LOG(INFO, TAG,\r
++                "getReqCB received NULL clientResponse. \\r
++        Invoking Provisioing Status Callback");\r
++        provInfo = PrepareProvisioingStatusCB(clientResponse,\r
++                DEVICE_NOT_PROVISIONED);\r
++        cbData(provInfo);\r
++        return OC_STACK_DELETE_TRANSACTION;\r
++    }\r
++\r
++    if (clientResponse->rcvdVendorSpecificHeaderOptions\r
++            && clientResponse->numRcvdVendorSpecificHeaderOptions) {\r
++        OIC_LOG(INFO, TAG, "Received vendor specific options");\r
++        uint8_t i = 0;\r
++        OCHeaderOption * rcvdOptions =\r
++                clientResponse->rcvdVendorSpecificHeaderOptions;\r
++        for (i = 0; i < clientResponse->numRcvdVendorSpecificHeaderOptions;\r
++                i++) {\r
++            if (((OCHeaderOption) rcvdOptions[i]).protocolID == OC_COAP_ID) {\r
++                OIC_LOG_V(INFO, TAG,\r
++                        "Received option with OC_COAP_ID and ID %u with",\r
++                        ((OCHeaderOption) rcvdOptions[i]).optionID);\r
++\r
++                OIC_LOG_BUFFER(INFO, TAG,\r
++                        ((OCHeaderOption) rcvdOptions[i]).optionData,\r
++                        MAX_HEADER_OPTION_DATA_LENGTH);\r
++            }\r
++        }\r
++    }\r
++\r
++    char query[OIC_STRING_MAX_VALUE] = { '\0' };\r
++\r
++\r
++    if (clientResponse->payload) {\r
++\r
++        if(clientResponse->payload && clientResponse->payload->type != PAYLOAD_TYPE_REPRESENTATION)\r
++\r
++        {\r
++            OIC_LOG_V(DEBUG, TAG, "Incoming payload not a representation");\r
++            return OC_STACK_DELETE_TRANSACTION;\r
++        }\r
++\r
++        OCRepPayload* input = (OCRepPayload*)(clientResponse->payload);\r
++        if(!input)\r
++        {\r
++            OIC_LOG_V(DEBUG, TAG, "Failed To parse");\r
++            return OC_STACK_DELETE_TRANSACTION;\r
++        }\r
++        OIC_LOG_V(DEBUG, TAG, "resUri = %s",input->uri);\r
++\r
++        char resURI[MAX_URI_LENGTH]={'\0'};\r
++\r
++        strncpy(resURI, input->uri, sizeof(resURI));\r
++\r
++        snprintf(query, sizeof(query), UNICAST_PROV_STATUS_QUERY,\r
++                clientResponse->addr->addr,\r
++                IP_PORT, resURI);\r
++\r
++        //OCPayloadLogRep(DEBUG,TAG,input);\r
++\r
++        if (ProvisionEnrollee(OC_HIGH_QOS, query, resURI) != OC_STACK_OK) {\r
++            OIC_LOG(INFO, TAG,\r
++                    "GetProvisioningStatusResponse received NULL clientResponse. \\r
++            Invoking Provisioing Status Callback");\r
++            provInfo = PrepareProvisioingStatusCB(clientResponse,\r
++                    DEVICE_NOT_PROVISIONED);\r
++            cbData(provInfo);\r
++\r
++            return OC_STACK_DELETE_TRANSACTION;\r
++        }\r
++    } else {\r
++        OIC_LOG(INFO, TAG,\r
++                "GetProvisioningStatusResponse received NULL clientResponse. \\r
++        Invoking Provisioing Status Callback");\r
++        provInfo = PrepareProvisioingStatusCB(clientResponse,\r
++                DEVICE_NOT_PROVISIONED);\r
++        cbData(provInfo);\r
++        return OC_STACK_DELETE_TRANSACTION;\r
++    }\r
++    return OC_STACK_DELETE_TRANSACTION;\r
++}\r
++\r
++OCStackResult InvokeOCDoResource(const char* query, OCMethod method,\r
++        OCQualityOfService qos, OCClientResponseHandler cb,OCRepPayload* request,\r
++        OCHeaderOption * options, uint8_t numOptions) {\r
++    OCStackResult ret;\r
++    OCCallbackData cbData;\r
++\r
++    cbData.cb = cb;\r
++    cbData.context = (void*) DEFAULT_CONTEXT_VALUE;\r
++    cbData.cd = NULL;\r
++\r
++    ret = OCDoResource(NULL, method, query, 0, &request->base, OC_CONNTYPE, qos,\r
++            &cbData, options, numOptions);\r
++\r
++    if (ret != OC_STACK_OK) {\r
++        OIC_LOG_V(ERROR, TAG, "OCDoResource returns error %d with method %d",\r
++                ret, method);\r
++    }\r
++\r
++    return ret;\r
++}\r
++\r
++OCStackResult GetProvisioningStatus(OCQualityOfService qos, const char* query) {\r
++    OCStackResult ret = OC_STACK_ERROR;\r
++    OCHeaderOption options[MAX_HEADER_OPTIONS];\r
++\r
++    OIC_LOG_V(INFO, TAG, "\n\nExecuting %s", __func__);\r
++\r
++    uint8_t option0[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };\r
++    uint8_t option1[] = { 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };\r
++    memset(options, 0, sizeof(OCHeaderOption) * MAX_HEADER_OPTIONS);\r
++    options[0].protocolID = OC_COAP_ID;\r
++    options[0].optionID = 2048;\r
++    memcpy(options[0].optionData, option0, sizeof(option0));\r
++    options[0].optionLength = 10;\r
++    options[1].protocolID = OC_COAP_ID;\r
++    options[1].optionID = 3000;\r
++    memcpy(options[1].optionData, option1, sizeof(option1));\r
++    options[1].optionLength = 10;\r
++\r
++    ret = InvokeOCDoResource(query, OC_REST_GET, OC_HIGH_QOS,\r
++            GetProvisioningStatusResponse, NULL, options, 2);\r
++    return ret;\r
++}\r
++\r
++OCStackResult StartProvisioningProcess(const EnrolleeNWProvInfo_t *netInfo,\r
++        OCProvisioningStatusCB provisioningStatusCallback) {\r
++    OCStackResult result = OC_STACK_ERROR;\r
++\r
++    if (netInfo->netAddressInfo.WIFI.ipAddress == NULL) {\r
++        OIC_LOG(ERROR, TAG, "Request URI is NULL");\r
++        return result;\r
++    }\r
++\r
++    if (provisioningStatusCallback == NULL) {\r
++        OIC_LOG(ERROR, TAG, "ProvisioningStatusCallback is NULL");\r
++        return result;\r
++    }\r
++\r
++    cbData = provisioningStatusCallback;\r
++\r
++    //Copy Network Provisioning  Information\r
++    netProvInfo = (EnrolleeNWProvInfo_t *)OICCalloc(1, sizeof(EnrolleeNWProvInfo_t));\r
++\r
++    if (NULL == netProvInfo)\r
++    {\r
++        OIC_LOG(ERROR, TAG, "Invalid input..");\r
++        return OC_STACK_ERROR;\r
++    }\r
++    memcpy(netProvInfo, netInfo, sizeof(EnrolleeNWProvInfo_t));\r
++\r
++    OIC_LOG_V(DEBUG, TAG, "Network Provisioning Info. SSID = %s",\r
++            netProvInfo->netAddressInfo.WIFI.ssid);\r
++\r
++    OIC_LOG_V(DEBUG, TAG, "Network Provisioning Info. PWD = %s",\r
++            netProvInfo->netAddressInfo.WIFI.pwd);\r
++\r
++\r
++    if (CA_STATUS_OK\r
++            != ca_thread_pool_add_task(g_threadPoolHandle, FindProvisioningResource,\r
++                    (void *) "")) {\r
++        OIC_LOG(DEBUG, TAG, "thread_pool_add_task of FindProvisioningResource failed");\r
++        ca_thread_pool_free(g_threadPoolHandle);\r
++        ca_mutex_unlock(g_provisioningMutex);\r
++        ca_mutex_free(g_provisioningMutex);\r
++        ca_cond_free(g_provisioningCond);\r
++        return OC_STACK_ERROR;\r
++    }\r
++    return OC_STACK_OK;\r
++}\r
++\r
++void StopProvisioningProcess() {\r
++    cbData = NULL;\r
++}\r
++\r
++\r
++// This is a function called back when a device is discovered\r
++OCStackApplicationResult FindProvisioningResourceResponse(void* ctx,\r
++        OCDoHandle handle, OCClientResponse * clientResponse) {\r
++    OIC_LOG(INFO, TAG, PCF("Entering FindProvisioningResourceResponse"));\r
++\r
++    OCStackApplicationResult response = OC_STACK_DELETE_TRANSACTION;\r
++\r
++    ProvisioningInfo *provInfo;\r
++\r
++    if (clientResponse->result != OC_STACK_OK) {\r
++        OIC_LOG(ERROR, TAG,\r
++                "OCStack stop error. Calling Provisioing Status Callback");\r
++\r
++        provInfo = PrepareProvisioingStatusCB(clientResponse,\r
++                DEVICE_NOT_PROVISIONED);\r
++\r
++        cbData(provInfo);\r
++        return response;\r
++    }\r
++\r
++    if (clientResponse) {\r
++\r
++\r
++        if(clientResponse->payload && clientResponse->payload->type != PAYLOAD_TYPE_REPRESENTATION)\r
++        {\r
++            OIC_LOG_V(DEBUG, TAG, "Incoming payload not a representation");\r
++            return OC_STACK_DELETE_TRANSACTION;\r
++        }\r
++\r
++        OCRepPayload* discoveryPayload= (OCRepPayload*)(clientResponse->payload);\r
++        if(!discoveryPayload)\r
++        {\r
++            OIC_LOG_V(DEBUG, TAG, "Failed To parse");\r
++            provInfo = PrepareProvisioingStatusCB(clientResponse,\r
++                    DEVICE_NOT_PROVISIONED);\r
++            cbData(provInfo);\r
++            return response;\r
++        }\r
++        OIC_LOG_V(DEBUG, TAG, "resUri = %s",discoveryPayload->uri);\r
++        char szQueryUri[64] = { 0 };\r
++\r
++        snprintf(szQueryUri, sizeof(szQueryUri), UNICAST_PROV_STATUS_QUERY,\r
++                clientResponse->devAddr.addr, IP_PORT, discoveryPayload->uri);\r
++        OIC_LOG_V(DEBUG, TAG, "query before GetProvisioningStatus call = %s", szQueryUri);\r
++\r
++        if (GetProvisioningStatus(OC_HIGH_QOS, szQueryUri) != OC_STACK_OK) {\r
++            OIC_LOG(INFO, TAG,\r
++                    "GetProvisioningStatus returned error. \\r
++            Invoking Provisioing Status Callback");\r
++            provInfo = PrepareProvisioingStatusCB(clientResponse,\r
++                    DEVICE_NOT_PROVISIONED);\r
++\r
++            cbData(provInfo);\r
++            return OC_STACK_DELETE_TRANSACTION;\r
++        }\r
++    } else {\r
++        // clientResponse is invalid\r
++        OIC_LOG(ERROR, TAG,\r
++                "Invalid response for Provisioning Discovery request. \\r
++        Invoking Provisioing Status Callback");\r
++        provInfo = PrepareProvisioingStatusCB(clientResponse,\r
++                DEVICE_NOT_PROVISIONED);\r
++        cbData(provInfo);\r
++        return response;\r
++    }\r
++    return OC_STACK_KEEP_TRANSACTION;\r
++}\r
++\r
++\r
++void FindProvisioningResource(void *data)\r
++{\r
++    OCStackResult ret = OC_STACK_ERROR;\r
++\r
++    /* Start a discovery query*/\r
++    char szQueryUri[64] = { 0 };\r
++\r
++    snprintf(szQueryUri, sizeof(szQueryUri), UNICAST_PROVISIONING_QUERY,\r
++            netProvInfo->netAddressInfo.WIFI.ipAddress, IP_PORT);\r
++\r
++    OIC_LOG_V(DEBUG, TAG, "szQueryUri = %s", szQueryUri);\r
++\r
++    OCCallbackData ocCBData;\r
++\r
++    ocCBData.cb = FindProvisioningResourceResponse;\r
++    ocCBData.context = (void*) DEFAULT_CONTEXT_VALUE;\r
++    ocCBData.cd = NULL;\r
++\r
++    ret = OCDoResource(NULL, OC_REST_GET, szQueryUri, 0, 0, OC_CONNTYPE,\r
++            OC_LOW_QOS, &ocCBData, NULL, 0);\r
++\r
++    if (ret != OC_STACK_OK) {\r
++        OIC_LOG(ERROR, TAG, "OCStack resource error");\r
++\r
++        OIC_LOG(ERROR, TAG,\r
++                "FindProvisioningResource failed. \\r
++        Invoking Provisioing Status Callback");\r
++\r
++        ProvisioningInfo *provInfo;\r
++        provInfo = (ProvisioningInfo *) OICCalloc(1, sizeof(ProvisioningInfo));\r
++\r
++        if(provInfo == NULL)\r
++        {\r
++            OIC_LOG_V(ERROR, TAG, "Failed to allocate memory");\r
++            return;\r
++        }\r
++\r
++        OCDevAddr *devAddr = (OCDevAddr *) OICCalloc(1, sizeof(OCDevAddr));\r
++\r
++        if(devAddr == NULL)\r
++        {\r
++            OIC_LOG_V(ERROR, TAG, "Failed to allocate memory");\r
++            return;\r
++        }\r
++\r
++        strncpy(devAddr->addr, netProvInfo->netAddressInfo.WIFI.ipAddress, sizeof(devAddr->addr));\r
++        devAddr->port= IP_PORT;\r
++        provInfo->provDeviceInfo.addr = devAddr;\r
++        provInfo->provStatus = DEVICE_NOT_PROVISIONED;\r
++\r
++\r
++        cbData(provInfo);\r
++    }\r
++}\r
++\r
++OCStackApplicationResult SubscribeProvPresenceCallback(void* ctx, OCDoHandle handle,\r
++        OCClientResponse* clientResponse) {\r
++    OIC_LOG(INFO, TAG, PCF("Entering SubscribeProvPresenceCallback"));\r
++\r
++    OCStackApplicationResult response = OC_STACK_DELETE_TRANSACTION;\r
++\r
++    if (clientResponse->result != OC_STACK_OK) {\r
++        OIC_LOG(ERROR, TAG, "OCStack stop error");\r
++        return response;\r
++    }\r
++\r
++    if (clientResponse) {\r
++        OIC_LOG(INFO, TAG, PCF("Client Response exists"));\r
++\r
++        if(clientResponse->payload && clientResponse->payload->type != PAYLOAD_TYPE_REPRESENTATION)\r
++        {\r
++            OIC_LOG_V(DEBUG, TAG, "Incoming payload not a representation");\r
++            return response;\r
++        }\r
++\r
++        OCRepPayload* discoveryPayload= (OCRepPayload*)(clientResponse->payload);\r
++        if(!discoveryPayload)\r
++        {\r
++            OIC_LOG_V(DEBUG, TAG, "invalid payload");\r
++            return response;\r
++        }\r
++\r
++        char sourceIPAddr[OIC_STRING_MAX_VALUE] = { '\0' };\r
++        snprintf(sourceIPAddr, sizeof(sourceIPAddr), "%s", clientResponse->addr->addr);\r
++\r
++        OIC_LOG_V(DEBUG, TAG, "Discovered %s @ %s",\r
++                discoveryPayload->uri, sourceIPAddr);\r
++\r
++        /* Start a discovery query*/\r
++        char szQueryUri[64] = { 0 };\r
++\r
++        snprintf(szQueryUri, sizeof(szQueryUri), UNICAST_PROVISIONING_QUERY,\r
++                sourceIPAddr, IP_PORT);\r
++\r
++        /*if (FindProvisioningResource(qos, szQueryUri) != OC_STACK_OK) {\r
++            OIC_LOG(ERROR, TAG, "FindProvisioningResource failed");\r
++            return OC_STACK_KEEP_TRANSACTION;\r
++        }*/\r
++    } else {\r
++        // clientResponse is invalid\r
++        OIC_LOG(ERROR, TAG, PCF("Client Response is NULL!"));\r
++    }\r
++    return OC_STACK_KEEP_TRANSACTION;\r
++}\r
++\r
++\r
++OCStackResult SubscribeProvPresence(OCQualityOfService qos,\r
++        const char* requestURI) {\r
++    OCStackResult ret = OC_STACK_ERROR;\r
++\r
++    OCCallbackData cbData;\r
++\r
++    cbData.cb = &SubscribeProvPresenceCallback;\r
++    cbData.context = (void*) DEFAULT_CONTEXT_VALUE;\r
++    cbData.cd = NULL;\r
++\r
++    ret = OCDoResource(NULL, OC_REST_PRESENCE, requestURI, 0, 0, OC_CONNTYPE,\r
++            OC_LOW_QOS, &cbData, NULL, 0);\r
++\r
++    if (ret != OC_STACK_OK) {\r
++        OIC_LOG(ERROR, TAG, "OCStack resource error");\r
++    }\r
++\r
++    return ret;\r
++}\r
++\r
++OCStackResult FindNetworkResource() {\r
++    OCStackResult ret = OC_STACK_ERROR;\r
++    if (OCStop() != OC_STACK_OK) {\r
++        OIC_LOG(ERROR, TAG, "OCStack stop error");\r
++    }\r
++\r
++    return ret;\r
++}\r
++\r
++ProvisioningInfo* PrepareProvisioingStatusCB(OCClientResponse * clientResponse, ProvStatus provStatus) {\r
++\r
++    ProvisioningInfo *provInfo = (ProvisioningInfo *) OICCalloc(1, sizeof(ProvisioningInfo));\r
++\r
++    if(provInfo == NULL)\r
++    {\r
++        OIC_LOG_V(ERROR, TAG, "Failed to allocate memory");\r
++        return NULL;\r
++    }\r
++\r
++    OCDevAddr *devAddr = (OCDevAddr *) OICCalloc(1, sizeof(OCDevAddr));\r
++\r
++    if(devAddr == NULL)\r
++    {\r
++        OIC_LOG_V(ERROR, TAG, "Failed to allocate memory");\r
++        return NULL;\r
++    }\r
++\r
++    strncpy(devAddr->addr, clientResponse->addr->addr, sizeof(devAddr->addr));\r
++    devAddr->port= clientResponse->addr->port;\r
++\r
++    provInfo->provDeviceInfo.addr = devAddr;\r
++\r
++    provInfo->provStatus = provStatus;\r
++\r
++    return provInfo;\r
++}\r
++\r
++\r
++\r
++\r