Merge branch 'master' into windows-port
authorDavid Antler <david.a.antler@intel.com>
Wed, 15 Jun 2016 16:57:49 +0000 (09:57 -0700)
committerDavid Antler <david.a.antler@intel.com>
Wed, 15 Jun 2016 16:57:49 +0000 (09:57 -0700)
Needed to disable provisioning unit test due to introduction of
complex Linux dependencies.

Change-Id: I4bd864cd7dc134bf7fb2faa8398f9f4afab40937
Signed-off-by: David Antler <david.a.antler@intel.com>
23 files changed:
1  2 
build_common/SConscript
resource/csdk/connectivity/src/adapter_util/caadapternetdtls.c
resource/csdk/security/provisioning/src/pmutility.c
resource/csdk/security/provisioning/unittest/SConscript
resource/csdk/security/src/directpairing.c
resource/csdk/security/unittest/SConscript
resource/csdk/stack/include/ocpayload.h
resource/csdk/stack/include/ocstack.h
resource/csdk/stack/include/octypes.h
resource/csdk/stack/samples/linux/secure/occlientbasicops.cpp
resource/csdk/stack/samples/linux/secure/occlientdirectpairing.cpp
resource/csdk/stack/src/ocpayload.c
resource/csdk/stack/src/ocpayloadconvert.c
resource/csdk/stack/src/ocresource.c
resource/csdk/stack/src/ocstack.c
resource/csdk/stack/test/stacktests.cpp
resource/examples/SConscript
resource/examples/directpairingclient.cpp
resource/include/OCApi.h
resource/src/InProcClientWrapper.cpp
resource/src/OCResource.cpp
resource/src/SConscript
resource/unit_tests.scons

Simple merge
@@@ -1025,7 -1011,7 +1028,8 @@@ OCStackResult DPDeviceDiscovery(unsigne
          }\r
          else\r
          {\r
 +            struct timespec timeout = {.tv_sec=0, .tv_nsec=100000000L};\r
+             OCProcess();\r
              nanosleep(&timeout, NULL);\r
          }\r
      }\r
@@@ -175,82 -176,87 +175,87 @@@ OC_EXPORT bool OCRepPayloadSetByteStrin
   *
   * @return true on success, false upon failure.
   */
 -bool OCRepPayloadGetByteStringArray(const OCRepPayload* payload, const char* name,
 +OC_EXPORT bool OCRepPayloadGetByteStringArray(const OCRepPayload* payload, const char* name,
          OCByteString** array, size_t dimensions[MAX_REP_ARRAY_DEPTH]);
  
 -bool OCRepPayloadSetIntArrayAsOwner(OCRepPayload* payload, const char* name,
 +OC_EXPORT bool OCRepPayloadSetIntArrayAsOwner(OCRepPayload* payload, const char* name,
          int64_t* array, size_t dimensions[MAX_REP_ARRAY_DEPTH]);
 -bool OCRepPayloadSetIntArray(OCRepPayload* payload, const char* name,
 +OC_EXPORT bool OCRepPayloadSetIntArray(OCRepPayload* payload, const char* name,
          const int64_t* array, size_t dimensions[MAX_REP_ARRAY_DEPTH]);
 -bool OCRepPayloadGetIntArray(const OCRepPayload* payload, const char* name,
 +OC_EXPORT bool OCRepPayloadGetIntArray(const OCRepPayload* payload, const char* name,
          int64_t** array, size_t dimensions[MAX_REP_ARRAY_DEPTH]);
  
 -bool OCRepPayloadSetDoubleArrayAsOwner(OCRepPayload* payload, const char* name,
 +OC_EXPORT bool OCRepPayloadSetDoubleArrayAsOwner(OCRepPayload* payload, const char* name,
          double* array, size_t dimensions[MAX_REP_ARRAY_DEPTH]);
 -bool OCRepPayloadSetDoubleArray(OCRepPayload* payload, const char* name,
 +OC_EXPORT bool OCRepPayloadSetDoubleArray(OCRepPayload* payload, const char* name,
          const double* array, size_t dimensions[MAX_REP_ARRAY_DEPTH]);
 -bool OCRepPayloadGetDoubleArray(const OCRepPayload* payload, const char* name,
 +OC_EXPORT bool OCRepPayloadGetDoubleArray(const OCRepPayload* payload, const char* name,
          double** array, size_t dimensions[MAX_REP_ARRAY_DEPTH]);
  
 -bool OCRepPayloadSetStringArrayAsOwner(OCRepPayload* payload, const char* name,
 +OC_EXPORT bool OCRepPayloadSetStringArrayAsOwner(OCRepPayload* payload, const char* name,
          char** array, size_t dimensions[MAX_REP_ARRAY_DEPTH]);
 -bool OCRepPayloadSetStringArray(OCRepPayload* payload, const char* name,
 +OC_EXPORT bool OCRepPayloadSetStringArray(OCRepPayload* payload, const char* name,
          const char** array, size_t dimensions[MAX_REP_ARRAY_DEPTH]);
 -bool OCRepPayloadGetStringArray(const OCRepPayload* payload, const char* name,
 +OC_EXPORT bool OCRepPayloadGetStringArray(const OCRepPayload* payload, const char* name,
          char*** array, size_t dimensions[MAX_REP_ARRAY_DEPTH]);
  
 -bool OCRepPayloadSetBoolArrayAsOwner(OCRepPayload* payload, const char* name,
 +OC_EXPORT bool OCRepPayloadSetBoolArrayAsOwner(OCRepPayload* payload, const char* name,
          bool* array, size_t dimensions[MAX_REP_ARRAY_DEPTH]);
 -bool OCRepPayloadSetBoolArray(OCRepPayload* payload, const char* name,
 +OC_EXPORT bool OCRepPayloadSetBoolArray(OCRepPayload* payload, const char* name,
          const bool* array, size_t dimensions[MAX_REP_ARRAY_DEPTH]);
 -bool OCRepPayloadGetBoolArray(const OCRepPayload* payload, const char* name,
 +OC_EXPORT bool OCRepPayloadGetBoolArray(const OCRepPayload* payload, const char* name,
          bool** array, size_t dimensions[MAX_REP_ARRAY_DEPTH]);
  
 -bool OCRepPayloadSetPropObjectArrayAsOwner(OCRepPayload* payload, const char* name,
 +OC_EXPORT bool OCRepPayloadSetPropObjectArrayAsOwner(OCRepPayload* payload, const char* name,
          OCRepPayload** array, size_t dimensions[MAX_REP_ARRAY_DEPTH]);
 -bool OCRepPayloadSetPropObjectArray(OCRepPayload* payload, const char* name,
 +OC_EXPORT bool OCRepPayloadSetPropObjectArray(OCRepPayload* payload, const char* name,
          const OCRepPayload** array, size_t dimensions[MAX_REP_ARRAY_DEPTH]);
 -bool OCRepPayloadGetPropObjectArray(const OCRepPayload* payload, const char* name,
 +OC_EXPORT bool OCRepPayloadGetPropObjectArray(const OCRepPayload* payload, const char* name,
          OCRepPayload*** array, size_t dimensions[MAX_REP_ARRAY_DEPTH]);
  
 -void OCRepPayloadDestroy(OCRepPayload* payload);
 +OC_EXPORT void OCRepPayloadDestroy(OCRepPayload* payload);
  
  // Discovery Payload
 -OCDiscoveryPayload* OCDiscoveryPayloadCreate();
 +OC_EXPORT OCDiscoveryPayload* OCDiscoveryPayloadCreate();
  
 -OCSecurityPayload* OCSecurityPayloadCreate(const uint8_t* securityData, size_t size);
 -void OCSecurityPayloadDestroy(OCSecurityPayload* payload);
 +OC_EXPORT OCSecurityPayload* OCSecurityPayloadCreate(const uint8_t* securityData, size_t size);
 +OC_EXPORT void OCSecurityPayloadDestroy(OCSecurityPayload* payload);
  
 -void OCDiscoveryPayloadAddResource(OCDiscoveryPayload* payload, const OCResource* res,
 -                                   uint16_t securePort);
+ #ifndef TCP_ADAPTER
-                                    uint16_t securePort, uint16_t tcpPort);
 +OC_EXPORT void OCDiscoveryPayloadAddResource(OCDiscoveryPayload* payload, const OCResource* res,
 -void OCDiscoveryPayloadAddResource(OCDiscoveryPayload* payload, const OCResource* res,
 -                                   uint16_t securePort, uint16_t tcpPort);
++                                             uint16_t securePort);
+ #else
 -void OCDiscoveryPayloadAddNewResource(OCDiscoveryPayload* payload, OCResourcePayload* res);
 -bool OCResourcePayloadAddStringLL(OCStringLL **payload, const char* type);
++OC_EXPORT void OCDiscoveryPayloadAddResource(OCDiscoveryPayload* payload, const OCResource* res,
++                                             uint16_t securePort, uint16_t tcpPort);
+ #endif
 +OC_EXPORT void OCDiscoveryPayloadAddNewResource(OCDiscoveryPayload* payload, OCResourcePayload* res);
 +OC_EXPORT bool OCResourcePayloadAddStringLL(OCStringLL **payload, const char* type);
  
 -size_t OCDiscoveryPayloadGetResourceCount(OCDiscoveryPayload* payload);
 -OCResourcePayload* OCDiscoveryPayloadGetResource(OCDiscoveryPayload* payload, size_t index);
 +OC_EXPORT size_t OCDiscoveryPayloadGetResourceCount(OCDiscoveryPayload* payload);
 +OC_EXPORT OCResourcePayload* OCDiscoveryPayloadGetResource(OCDiscoveryPayload* payload, size_t index);
  
 -void OCDiscoveryResourceDestroy(OCResourcePayload* payload);
 -void OCDiscoveryPayloadDestroy(OCDiscoveryPayload* payload);
 +OC_EXPORT void OCDiscoveryResourceDestroy(OCResourcePayload* payload);
 +OC_EXPORT void OCDiscoveryPayloadDestroy(OCDiscoveryPayload* payload);
  
  // Device Payload
 -OCDevicePayload* OCDevicePayloadCreate(const char* sid, const char* dname,
 +OC_EXPORT OCDevicePayload* OCDevicePayloadCreate(const char* sid, const char* dname,
          const OCStringLL *types, const char* specVer, const char* dmVer);
 -void OCDevicePayloadDestroy(OCDevicePayload* payload);
 +OC_EXPORT void OCDevicePayloadDestroy(OCDevicePayload* payload);
  
  // Platform Payload
 -OCPlatformPayload* OCPlatformPayloadCreate(const OCPlatformInfo* platformInfo);
 -OCPlatformPayload* OCPlatformPayloadCreateAsOwner(OCPlatformInfo* platformInfo);
 -void OCPlatformInfoDestroy(OCPlatformInfo *info);
 -void OCPlatformPayloadDestroy(OCPlatformPayload* payload);
 +OC_EXPORT OCPlatformPayload* OCPlatformPayloadCreate(const OCPlatformInfo* platformInfo);
 +OC_EXPORT OCPlatformPayload* OCPlatformPayloadCreateAsOwner(OCPlatformInfo* platformInfo);
 +OC_EXPORT void OCPlatformInfoDestroy(OCPlatformInfo *info);
 +OC_EXPORT void OCPlatformPayloadDestroy(OCPlatformPayload* payload);
  
  // Presence Payload
 -OCPresencePayload* OCPresencePayloadCreate(uint32_t seqNum, uint32_t maxAge,
 +OC_EXPORT OCPresencePayload* OCPresencePayloadCreate(uint32_t seqNum, uint32_t maxAge,
          OCPresenceTrigger trigger, const char* resourceType);
 -void OCPresencePayloadDestroy(OCPresencePayload* payload);
 +OC_EXPORT void OCPresencePayloadDestroy(OCPresencePayload* payload);
  
  // Helper API
 -OCStringLL* CloneOCStringLL (OCStringLL* ll);
 -void OCFreeOCStringLL(OCStringLL* ll);
 +OC_EXPORT OCStringLL* CloneOCStringLL (OCStringLL* ll);
 +OC_EXPORT void OCFreeOCStringLL(OCStringLL* ll);
  
  #ifdef __cplusplus
  }
@@@ -550,8 -547,8 +550,8 @@@ OC_EXPORT const OCDPDev_t* OCGetDirectP
   * @param[in] resultCallback Callback fucntion to event status of process.
   * @return OTM_SUCCESS in case of success and other value otherwise.
   */
- OC_EXPORT OCStackResult OCDoDirectPairing(OCDPDev_t* peer, OCPrm_t pmSel, char *pinNumber,
-                                           OCDirectPairingCB resultCallback);
 -OCStackResult OCDoDirectPairing(void *ctx, OCDPDev_t* peer, OCPrm_t pmSel, char *pinNumber,
++OC_EXPORT OCStackResult OCDoDirectPairing(void *ctx, OCDPDev_t* peer, OCPrm_t pmSel, char *pinNumber,
+                                                      OCDirectPairingCB resultCallback);
  //#endif // DIRECT_PAIRING
  
  #ifdef __cplusplus
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -90,42 -72,43 +90,45 @@@ def make_single_file_cpp_program(progra
  ######################################################################
  # Source files and Targets
  ######################################################################
 -simpleserver = examples_env.Program('simpleserver', 'simpleserver.cpp')
 -simpleclient = examples_env.Program('simpleclient', 'simpleclient.cpp')
 -simpleserverHQ = examples_env.Program('simpleserverHQ', 'simpleserverHQ.cpp')
 -simpleclientHQ = examples_env.Program('simpleclientHQ', 'simpleclientHQ.cpp')
 -fridgeserver = examples_env.Program('fridgeserver', 'fridgeserver.cpp')
 -fridgeclient = examples_env.Program('fridgeclient', 'fridgeclient.cpp')
 -presenceserver = examples_env.Program('presenceserver', 'presenceserver.cpp')
 -presenceclient = examples_env.Program('presenceclient', 'presenceclient.cpp')
 -simpleclientserver = examples_env.Program('simpleclientserver', 'simpleclientserver.cpp')
 -roomserver = examples_env.Program('roomserver', 'roomserver.cpp')
 -roomclient = examples_env.Program('roomclient', 'roomclient.cpp')
 -garageserver = examples_env.Program('garageserver', 'garageserver.cpp')
 -garageclient = examples_env.Program('garageclient', 'garageclient.cpp')
 -groupserver = examples_env.Program('groupserver', 'groupserver.cpp')
 -groupclient = examples_env.Program('groupclient', 'groupclient.cpp')
 -lightserver = examples_env.Program('lightserver', 'lightserver.cpp')
 -devicediscoveryserver = examples_env.Program('devicediscoveryserver', 'devicediscoveryserver.cpp')
 -devicediscoveryclient = examples_env.Program('devicediscoveryclient', 'devicediscoveryclient.cpp')
 -threadingsample = examples_env.Program('threadingsample', 'threadingsample.cpp')
 -directpairingclient = examples_env.Program('directpairingclient', 'directpairingclient.cpp')
 +example_names = [
 +      'simpleserver', 'simpleclient',
 +      'simpleclientserver',
++      'directpairingclient',
 +      'devicediscoveryserver', 'devicediscoveryclient'
 +      ]
 +
 +if target_os not in ['windows', 'msys_nt']:
 +      example_names += [
 +              'simpleserverHQ', 'simpleclientHQ',
 +              'fridgeserver', 'fridgeclient',
 +              'presenceserver', 'presenceclient',
 +              'roomserver', 'roomclient',
 +              'garageserver',
 +              'garageclient',
 +              'groupserver',
 +              'groupclient',
 +              'lightserver',
 +              'threadingsample',
 +              ]
  
 +examples = map(make_single_file_cpp_program, example_names)
 +
 +######################################################################
 +# Other examples
 +######################################################################
  clientjson = examples_env.Install(env.get('BUILD_DIR') + '/resource/examples/',
                                env.get('SRC_DIR') + '/resource/examples/' + 'oic_svr_db_client.dat')
  serverjson = examples_env.Install(env.get('BUILD_DIR') + '/resource/examples/',
                                env.get('SRC_DIR') + '/resource/examples/' + 'oic_svr_db_server.dat')
 -Alias("examples", [simpleserver, simpleclient,
 -              simpleserverHQ, simpleclientHQ,
 -              fridgeserver, fridgeclient,
 -              presenceserver, presenceclient,
 -              simpleclientserver, roomserver, roomclient, garageserver,
 -              garageclient,
 -              groupserver, groupclient,
 -              lightserver,
 -              devicediscoveryserver, devicediscoveryclient,
 -              threadingsample, directpairingclient,
 -              serverjson, clientjson, directpairingdat
 -     ])
+ directpairingdat = examples_env.Install(env.get('BUILD_DIR') + '/resource/examples/',
+                               env.get('SRC_DIR') + '/resource/examples/' + 'oic_svr_db_client_directpairing.dat')
- examples += [clientjson, serverjson]
 +
++examples += [clientjson, serverjson, directpairingdat]
 +
 +if target_os in ['msys_nt', 'windows']:
 +      winUIClient = examples_env.Program('winUIClient', ['winuiclientgui.cpp', 'winuiclient.cpp'])
 +      mediaserver = examples_env.Program('mediaserver', 'mediaserver.cpp')
 +      examples += [winUIClient, mediaserver]
 +
 +Alias("examples", examples)
  env.AppendTarget('examples')
index 0000000,6ab04fe..dfea47c
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,411 +1,412 @@@
 -#include <pthread.h>
+ /* *****************************************************************
+  *
+  * Copyright 2016 Samsung Electronics All Rights Reserved.
+  *
+  *
+  *
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  *
+  * *****************************************************************/
+ #include <stdio.h>
+ #include <string.h>
++#ifdef HAVE_UNISTD_H
+ #include <unistd.h>
++#endif
+ #include <string>
+ #include <map>
+ #include <cstdlib>
+ #include <mutex>
+ #include <condition_variable>
+ #include "logger.h"
+ #include "oic_malloc.h"
+ #include "oic_string.h"
+ #include "OCPlatform.h"
+ #include "OCApi.h"
+ #define MAX_URI_LENGTH (64)
+ #define MAX_PERMISSION_LENGTH (5)
+ #define CREATE (1)
+ #define READ (2)
+ #define UPDATE (4)
+ #define DELETE (8)
+ #define NOTIFY (16)
+ #define DASH '-'
+ #define PREDEFINED_TIMEOUT (10)
+ #define MAX_OWNED_DEVICE (10)
+ #define TAG  "provisioningclient"
+ #define JSON_DB_PATH "./oic_svr_db_client.json"
+ #define DAT_DB_PATH "./oic_svr_db_client.dat"
+ #define DEV_STATUS_ON "DEV_STATUS_ON"
+ #define DEV_STATUS_OFF "DEV_STATUS_OFF"
+ #define DP_DISCOVERY_TIMEOUT 4
+ #define DP_PIN_LENGTH 8
+ #define BOLD_BEGIN    "\033[1m"
+ #define RED_BEGIN     "\033[1;31m"
+ #define GREEN_BEGIN   "\033[1;92m"
+ #define COLOR_END     "\033[0m"
+ using namespace OC;
+ static int ask = 1;
+ static PairedDevices discoveredDeviceList, pairedDeviceList;
+ static FILE* client_open(const char* /*fileName*/, const char *mode)
+ {
+     return fopen(DAT_DB_PATH, mode);
+ }
+ static void printMenu()
+ {
+     std::cout << GREEN_BEGIN "Choose an option:" COLOR_END<<std::endl;
+     std::cout << GREEN_BEGIN "# 1 (DP device discovery) : discover Direct-Pairing devices"
+         COLOR_END<<std::endl;
+     std::cout << GREEN_BEGIN "# 2 (start Direct-Pairing) : negotiate DP method & start Direct-Pairin"
+         COLOR_END<<std::endl;
+     std::cout << GREEN_BEGIN "# 3 (list all device) : list all discovered/paired devices"
+         COLOR_END<<std::endl;
+     std::cout << GREEN_BEGIN "# 4 (send data) : send data to device" COLOR_END<<std::endl;
+     std::cout << GREEN_BEGIN "# 9 (quit) : quit test " COLOR_END<<std::endl;
+ }
+ static void printPrompt()
+ {
+     std::cout << BOLD_BEGIN "IoTivity-DP#" COLOR_END" ";
+ }
+ static void printDevices(PairedDevices& list)
+ {
+     for (size_t i = 0; i < list.size(); i++)
+     {
+         std::cout << "["<< i+1 << "]" << " ID: " << list[i]->getDeviceID() << std::endl;
+     }
+ }
+ static void findCallback(PairedDevices discoveredDevList)
+ {
+     if (0 == discoveredDevList.size())
+     {
+         std::cout<< "No Direct-pairing Support device Found" << std::endl;
+     }
+     else
+     {
+         std::cout << "Discovered Direct-Pairing Support Device"<< std::endl;
+         discoveredDeviceList = discoveredDevList;
+         printDevices(discoveredDevList);
+     }
+     printMenu();
+     printPrompt();
+     fflush(NULL);
+ }
+ static bool printPairingMethod(int choice)
+ {
+     if (NULL == discoveredDeviceList[choice])// || false == discoveredDeviceList[choice]->edp)
+     {
+         std::cout<< "Invalid device or Not support direct-pairing..\n\n" << std::endl;
+         return false;
+     }
+     auto prms = discoveredDeviceList[choice]->getPairingMethods();
+     if (0 == prms.size())
+     {
+         std::cout << "Not exist any support method..\n\n" << std::endl;
+         return false;
+     }
+     bool ret = true;
+     std::cout << "\n* List of supported pairing methods *" << std::endl;
+     for (unsigned int i = 0; i < prms.size(); i++)
+     {
+         std::cout<< "[" << i+1 << "]";
+         switch (prms[i])
+         {
+             case DP_PRE_CONFIGURED:
+                 std::cout<<"Pre-Configured PIN"<<std::endl;;
+                 break;
+             case DP_RANDOM_PIN:
+                 std::cout<<"Random PIN"<<std::endl;;
+                 break;
+             default:
+                 std::cout<<"NOT Allowed ("<< prms[i]<<")"<<std::endl;
+                 ret = false;
+                 break;
+         }
+         std::cout<<std::endl;
+     }
+     return ret;
+ }
+ static void resultCallback(std::shared_ptr<OCDirectPairing> ptr, OCStackResult result)
+ {
+     if (OC_STACK_OK == result)
+     {
+         std::cout << " Direct-Pairing SUCCESS" << std::endl;
+         std::cout << "Taget Add info:" << ptr->getHost() << std::endl;
+     }
+     else {
+         std::cout <<" Direct-Pairing FAILED" << std::endl;
+     }
+     printMenu();
+     printPrompt();
+     fflush(NULL);
+ }
+ static void pairedDevListCB(PairedDevices pairedDevList)
+ {
+     if (0 == pairedDevList.size())
+     {
+         std::cout << "No Paired Devcie  Found" << std::endl;
+     }
+     else
+     {
+         pairedDeviceList = pairedDevList;
+         printDevices(pairedDevList);
+     }
+     printMenu();
+     printPrompt();
+     fflush(NULL);
+ }
+ static void getCallback(const HeaderOptions& headerOptions, const OCRepresentation& rep, const int eCode)
+ {
+     (void)(headerOptions);
+     try
+     {
+         if (OC_STACK_OK == eCode)
+         {
+             std::cout << "Callback Context for GET query recvd successfully" << std::endl;
+             std::cout << "Resource URI: " << rep.getUri() << std::endl;
+             bool state = false;
+             int power = 0;
+             rep.getValue("state", state);
+             rep.getValue("power", power);
+             std::cout << "\tstate: " << state << std::endl;
+             std::cout << "\tpower: " << power << std::endl;
+         }
+         else
+         {
+             std::cout << "getCallback Response error: " << eCode << std::endl;
+         }
+     }
+     catch(std::exception& e)
+     {
+         std::cout << "Exception: " << e.what() << " in onGet" << std::endl;
+     }
+ }
+ static bool InputPIN(std::string& pin)
+ {
+     std::cout <<"   > Enter PIN Number for authentication (ex - '00000000' [8 digit] ):" ;
+     std::cin >> pin;
+     if (pin.size() != DP_PIN_LENGTH)
+     {
+         std::cout<<"Invalid PIN"<<std::endl;
+         return false;
+     }
+     return true;
+ }
+ int main(void)
+ {
+     OCPersistentStorage ps {client_open, fread, fwrite, fclose, unlink };
+     // Create PlatformConfig object
+     PlatformConfig cfg {
+         OC::ServiceType::InProc,
+             OC::ModeType::Both,
+             "0.0.0.0",
+             0,
+             OC::QualityOfService::LowQos,
+             &ps
+     };
+     OCPlatform::Configure(cfg);
+     try
+     {
+         unsigned int choice;
+         for (int out = 0; !out;)
+         {
+             if (ask)
+             {
+                 printMenu();
+                 printPrompt();
+                 fflush(NULL);
+             }
+             std::cin >> choice;
+             switch(choice) {
+                 case 1:
+                     {
+                         OCStackResult result = OC::OCPlatform::findDirectPairingDevices(
+                                 DP_DISCOVERY_TIMEOUT, findCallback);
+                         if (OC_STACK_NO_RESOURCE == result)
+                         {
+                             std::cout << "!! No Direct-Pairing Support Device found"<<std::endl;
+                             break;
+                         }
+                         if (OC_STACK_OK != result)
+                         {
+                             std::cout << "!!Error - findDirectPairingDevices failed."<<std::endl;
+                         }
+                         ask = 0;
+                         break;
+                     }
+                 case 2:
+                     {
+                         unsigned int pMethodIDx = -1;
+                         std::string pin("");
+                         std::cout << "- Negotiate DP method & Start Direct-Pairing - ";
+                         std::cout << "* List of  discovered device" << std::endl;
+                         printDevices(discoveredDeviceList);
+                         std::cout << "   > Enter Peer Device Number to initiate Direct-Pairing:" << std::endl;
+                         printPrompt();
+                         std::cin >> choice;
+                         if (choice < 1 || choice > discoveredDeviceList.size())
+                         {
+                             std::cout << "!!Device Number is incorrect, Try Again" << std::endl;
+                             break;
+                         }
+                         OCPrm_t pmSel = DP_NOT_ALLOWED;
+                         choice--;
+                         if (false == printPairingMethod(choice))
+                         {
+                             std::cout << "Target does not support the Direct-Pairing" << std::endl;
+                             break;
+                         }
+                         std::cout << " > Enter pairing method: "<< std::endl;
+                         printPrompt();
+                         std::cin >> pMethodIDx;
+                         auto prms = discoveredDeviceList[choice]->getPairingMethods();
+                         if (0 >= pMethodIDx || prms.size() < pMethodIDx)
+                         {
+                             std::cout <<"Invalid mode selection" << std::endl;
+                             break;
+                         }
+                         pmSel =  prms[pMethodIDx - 1];
+                         if (false == InputPIN(pin))
+                         {
+                             break;
+                         }
+                         OCStackResult result = OC::OCPlatform::doDirectPairing(discoveredDeviceList[choice], pmSel, pin, resultCallback);
+                         if (OC_STACK_OK != result)
+                         {
+                             std::cout << "!!Error - doDirectPairing failed." << std::endl;
+                         }
+                         ask = 0;
+                         break;
+                     }
+                 case 3:
+                     {
+                         std::cout << "- List all discovered and paired devices) -";
+                         std::cout << "  > List of discovered devices" << std::endl;
+                         printDevices(discoveredDeviceList);
+                         std::cout << std::endl;
+                         std::cout << "  > List of paired devices" << std::endl;
+                         OCStackResult result = OC::OCPlatform::getDirectPairedDevices(pairedDevListCB);
+                         printDevices(pairedDeviceList);
+                         std::cout << std::endl;
+                         if (OC_STACK_NO_RESOURCE == result)
+                         {
+                             std::cout << "!! No Paired device found"<<std::endl;
+                             break;
+                         }
+                         if (OC_STACK_OK != result)
+                         {
+                             std::cout << "!!Error - getDirectPairedDevices failed."<<std::endl;
+                         }
+                         break;
+                     }
+                 case 4:
+                     {
+                         std::cout << "- Send data(GET Request) to device(led server) -" << std::endl;
+                         printDevices(pairedDeviceList);
+                         pairedDeviceList = discoveredDeviceList;
+                         printMenu();
+                         std::cout << "Enter device number to GET data: ";
+                         std::cin >> choice;
+                         choice--;
+                         std::vector<std::string> ledTypes = {"core.led"};
+                         std::vector<std::string> ifaces = {DEFAULT_INTERFACE};
+                         OCConnectivityType ct = pairedDeviceList[choice]->getConnType();
+                         std::cout << "\n\n HOST address is : " << pairedDeviceList[choice]->getHost() << "\n\n";
+                         OCResource::Ptr led = OC::OCPlatform::constructResourceObject(
+                                 pairedDeviceList[choice]->getHost(),
+                                 "/a/led", ct, false, ledTypes, ifaces);
+                         if(!led)
+                         {
+                             std::cout << "Error: Led Object construction returned null" << std::endl;
+                             break;
+                         }
+                         OCStackResult res = led->get(QueryParamsMap(), getCallback);
+                         if (OC_STACK_OK != res)
+                         {
+                             std::cout << "Error: get Failed for Led" << std::endl;
+                         }
+                         break;
+                     }
+                 case 9:
+                     {
+                         out = 1;
+                         break;
+                     }
+                 default:
+                     {
+                         std::cout << GREEN_BEGIN "Wrong Option : Try Again" COLOR_END << std::endl;
+                         printMenu();
+                         printPrompt();
+                         break;
+                     }
+             }
+         }
+     }
+     catch(OCException& e)
+     {
+         oclog() << "Exception in main: "<< e.what();
+     }
+     return 0;
+ }
Simple merge
@@@ -252,13 -252,14 +252,13 @@@ namespace O
  
          ClientCallbackContext::ListenContext* context =
              new ClientCallbackContext::ListenContext(callback, shared_from_this());
 -        OCCallbackData cbdata(
 -                static_cast<void*>(context),
 -                listenCallback,
 -                [](void* c){delete static_cast<ClientCallbackContext::ListenContext*>(c);}
 -            );
 +        OCCallbackData cbdata;
 +        cbdata.context = (void*)context;
 +        cbdata.cb      = listenCallback;
 +        cbdata.cd      = [](void* c){delete (ClientCallbackContext::ListenContext*)c;};
  
          auto cLock = m_csdkLock.lock();
-         if(cLock)
+         if (cLock)
          {
              std::lock_guard<std::recursive_mutex> lock(*cLock);
              result = OCDoResource(nullptr, OC_REST_DISCOVER,
  
          ClientCallbackContext::DeviceListenContext* context =
              new ClientCallbackContext::DeviceListenContext(callback, shared_from_this());
 -        OCCallbackData cbdata(
 -                static_cast<void*>(context),
 -                listenDeviceCallback,
 -                [](void* c){delete static_cast<ClientCallbackContext::DeviceListenContext*>(c);}
 -                );
 +        OCCallbackData cbdata;
 +
 +        cbdata.context = (void*)context;
 +        cbdata.cb      = listenDeviceCallback;
 +        cbdata.cd      = [](void* c){delete (ClientCallbackContext::DeviceListenContext*)c;};
  
          auto cLock = m_csdkLock.lock();
-         if(cLock)
+         if (cLock)
          {
              std::lock_guard<std::recursive_mutex> lock(*cLock);
              result = OCDoResource(nullptr, OC_REST_DISCOVER,
      std::string InProcClientWrapper::assembleSetResourceUri(std::string uri,
          const QueryParamsMap& queryParams)
      {
-         if(!uri.empty())
 -        if (uri.back() == '/')
++        if (!uri.empty())
          {
 -            uri.resize(uri.size()-1);
 +            if(uri.back() == '/')
 +            {
 +                uri.resize(uri.size()-1);
 +            }
          }
  
-         std::ostringstream paramsList;
-         if(queryParams.size() > 0)
+         ostringstream paramsList;
+         if (queryParams.size() > 0)
          {
              paramsList << '?';
          }
          }
  
          std::string queryString = paramsList.str();
-         if(queryString.back() == ';')
 +
 +        if(queryString.empty())
 +        {
 +            return uri;
 +        }
 +
+         if (queryString.back() == ';')
          {
              queryString.resize(queryString.size() - 1);
          }
Simple merge
@@@ -91,17 -80,14 +91,18 @@@ oclib_src = 
                'InProcServerWrapper.cpp',
                'InProcClientWrapper.cpp',
                'OCResourceRequest.cpp',
-               'CAManager.cpp'
+               'CAManager.cpp',
+               'OCDirectPairing.cpp'
        ]
  
 -oclib = oclib_env.SharedLibrary('oc', oclib_src)
 -oclib_env.InstallTarget(oclib, 'liboc')
 -oclib_env.UserInstallTargetLib(oclib, 'liboc')
 -
 +if target_os in ['windows']:
 +      oclib_src = oclib_src + ['OCApi.cpp']
 +      # TODO: Add OC_EXPORT prefixes to enable DLL generation
 +      oclib = oclib_env.StaticLibrary('oc', oclib_src)
 +else:
 +      oclib = oclib_env.SharedLibrary('oc', oclib_src)
 +oclib_env.InstallTarget(oclib, 'oc')
 +oclib_env.UserInstallTargetLib(oclib, 'oc')
  header_dir = env.get('SRC_DIR') + '/resource/include/'
  
  oclib_env.UserInstallTargetHeader(header_dir + 'OCApi.h', 'resource', 'OCApi.h')
@@@ -69,18 -69,4 +69,14 @@@ elif target_os == 'windows' and env.get
        SConscript('csdk/stack/test/SConscript')
        SConscript('csdk/connectivity/test/SConscript')
  
 +      # Build Security Resource Manager unit tests
 +      SConscript('csdk/security/unittest/SConscript')
  
-       # Build Provisioning API unit test
-       if env.get('SECURED') == '1':
-               SConscript('csdk/security/provisioning/unittest/SConscript')
 +elif target_os in ['darwin', 'msys_nt']:
 +      # Verify that 'google unit test' library is installed.  If not,
 +      # get it and install it
 +      SConscript(src_dir + '/extlibs/gtest/SConscript')
 +
 +      # Build C stack's unit tests.
 +      SConscript('csdk/stack/test/SConscript')
 +      SConscript('csdk/connectivity/test/SConscript')