Merge branch 'windows-port'
authorDavid Antler <david.a.antler@intel.com>
Fri, 1 Jul 2016 21:28:42 +0000 (14:28 -0700)
committerDavid Antler <david.a.antler@intel.com>
Fri, 1 Jul 2016 21:28:42 +0000 (14:28 -0700)
Add support for Visual Studio 2015 and 2013 builds.

Change-Id: I3ce9bee6b3e57ccd548b849b5d147ca0babd872e
Signed-off-by: David Antler <david.a.antler@intel.com>
39 files changed:
1  2 
build_common/SConscript
resource/csdk/connectivity/common/src/camutex_pthreads.c
resource/csdk/connectivity/src/adapter_util/caadapternetdtls.c
resource/csdk/connectivity/src/caqueueingthread.c
resource/csdk/connectivity/src/caretransmission.c
resource/csdk/connectivity/src/ip_adapter/caipserver.c
resource/csdk/security/include/internal/srmresourcestrings.h
resource/csdk/security/include/securevirtualresourcetypes.h
resource/csdk/security/provisioning/SConscript
resource/csdk/security/provisioning/sample/provisioningclient.c
resource/csdk/security/provisioning/src/ownershiptransfermanager.c
resource/csdk/security/provisioning/src/pmutility.c
resource/csdk/security/provisioning/src/secureresourceprovider.c
resource/csdk/security/provisioning/unittest/SConscript
resource/csdk/security/src/aclresource.c
resource/csdk/security/src/amsmgr.c
resource/csdk/security/src/credresource.c
resource/csdk/security/src/dpairingresource.c
resource/csdk/security/src/pconfresource.c
resource/csdk/security/unittest/SConscript
resource/csdk/stack/include/internal/ocstackinternal.h
resource/csdk/stack/include/ocpayload.h
resource/csdk/stack/include/octypes.h
resource/csdk/stack/include/payload_logging.h
resource/csdk/stack/samples/linux/SimpleClientServer/ocserver.cpp
resource/csdk/stack/samples/linux/secure/occlientbasicops.cpp
resource/csdk/stack/samples/tizen/build/packaging/com.oic.ri.spec
resource/csdk/stack/src/ocpayload.c
resource/csdk/stack/src/ocpayloadconvert.c
resource/csdk/stack/src/ocpayloadparse.c
resource/csdk/stack/src/ocresource.c
resource/csdk/stack/src/ocserverrequest.c
resource/csdk/stack/src/ocstack.c
resource/examples/simpleclient.cpp
resource/include/OCRepresentation.h
resource/include/OCResourceRequest.h
resource/src/InProcServerWrapper.cpp
resource/src/OCRepresentation.cpp
service/easy-setup/sampleapp/mediator/linux/richsdk_sample/SConscript

@@@ -14,11 -15,11 +15,11 @@@ host_target_map = 
  
  # Map of os and allowed archs (os: allowed archs)
  os_arch_map = {
 -              'linux': ['x86', 'x86_64', 'arm', 'arm64'],
 -              'tizen': ['x86', 'x86_64', 'arm', 'arm64', 'armeabi-v7a'],
 +              'linux': ['x86', 'x86_64', 'arm', 'arm-v7a', 'arm64'],
 +              'tizen': ['x86', 'x86_64', 'arm', 'arm-v7a', 'armeabi-v7a', 'arm64'],
                'android': ['x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'armeabi-v7a-hard', 'arm64-v8a'],
                'windows': ['x86', 'amd64', 'arm'],
-               'winrt': ['arm'],
+               'msys_nt':['x86', 'x86_64'],
                'darwin': ['i386', 'x86_64'],
                'ios': ['i386', 'x86_64', 'armv7', 'armv7s', 'arm64'],
                'arduino': ['avr', 'arm'],
@@@ -187,15 -236,14 +236,15 @@@ ca_cond ca_cond_new(void
              return retVal;
          }
  
- #if defined(__ANDROID__) || _POSIX_TIMERS > 0
- #ifdef __ANDROID__
+  #if defined(__ANDROID__) || _POSIX_TIMERS > 0
 - #ifdef __ANDROID__
 -        if (camutex_condattr_setclock) {
++  #ifdef __ANDROID__
 +        if (camutex_condattr_setclock)
 +        {
              ret = camutex_condattr_setclock(&(eventInfo->condattr), CLOCK_MONOTONIC);
- #else
 - #else
++  #else
          {
              ret = pthread_condattr_setclock(&(eventInfo->condattr), CLOCK_MONOTONIC);
- #endif /*  __ANDROID__ */
 - #endif /*  __ANDROID__ */
++  #endif /*  __ANDROID__ */
              if(0 != ret)
              {
                  OIC_LOG_V(ERROR, TAG, "%s: Failed to set condition variable clock %d!",
@@@ -245,9 -272,218 +272,218 @@@ static void CASelectReturned(fd_set *re
      }
  }
  
- static CAResult_t CAReceiveMessage(int fd, CATransportFlags_t flags)
+ #else // if defined(WSA_WAIT_EVENT_0)
+ #define CLOSE_SOCKET(TYPE) \
+     if (caglobals.ip.TYPE.fd != OC_INVALID_SOCKET) \
+     { \
+         closesocket(caglobals.ip.TYPE.fd); \
+         caglobals.ip.TYPE.fd = OC_INVALID_SOCKET; \
+     }
+ #define PUSH_HANDLE(HANDLE, ARRAY, INDEX) \
+ { \
+     ARRAY[INDEX] = HANDLE; \
+     INDEX++; \
+ }
+ // Turn handle into WSAEvent and push to ARRAY
+ #define PUSH_SOCKET(SOCKET, ARRAY, INDEX) \
+     if (SOCKET != OC_INVALID_SOCKET) \
+     { \
+         WSAEVENT NewEvent; \
+         NewEvent = WSACreateEvent(); \
+         if (WSA_INVALID_EVENT != NewEvent) \
+         { \
+             if (0 != WSAEventSelect(SOCKET, NewEvent, FD_READ)) \
+             { \
+                 OIC_LOG_V(ERROR, TAG, "WSAEventSelect failed 0x%08x ", WSAGetLastError()); \
+                 if (!WSACloseEvent(NewEvent)) \
+                 { \
+                     OIC_LOG_V(ERROR, TAG, "WSACloseEvent(NewEvent) failed 0x%08x", WSAGetLastError()); \
+                 } \
+             } \
+             else \
+             { \
+                 PUSH_HANDLE(NewEvent, ARRAY, INDEX); \
+             } \
+         } \
+         else \
+         { \
+             OIC_LOG_V(ERROR, TAG, "WSACreateEvent(NewEvent) failed 0x%08x", WSAGetLastError()); \
+         }\
+     }
+ #define INSERT_SOCKET(FD, ARRAY, INDEX) \
+     { \
+         if (OC_INVALID_SOCKET != FD) \
+         { \
+             ARRAY[INDEX] = FD; \
+         } \
+     }
+ // Inserts the socket into the SOCKET_ARRAY and pushes the socket event into EVENT_ARRAY
+ #define PUSH_IP_SOCKET(TYPE, EVENT_ARRAY, SOCKET_ARRAY, INDEX) \
+     { \
+         if (OC_INVALID_SOCKET != caglobals.ip.TYPE.fd) \
+         { \
+             INSERT_SOCKET(caglobals.ip.TYPE.fd, SOCKET_ARRAY, INDEX); \
+             PUSH_SOCKET(caglobals.ip.TYPE.fd, EVENT_ARRAY, INDEX); \
+         } \
+     }
+ #define IS_MATCHING_IP_SOCKET(TYPE, SOCKET, FLAGS) \
+     if ((caglobals.ip.TYPE.fd != OC_INVALID_SOCKET) && (caglobals.ip.TYPE.fd == SOCKET)) \
+     { \
+         fd = caglobals.ip.TYPE.fd; \
+         flags = FLAGS; \
+     }
+ #define EVENT_ARRAY_SIZE  10
+ static void CAFindReadyMessage()
+ {
+     CASocketFd_t socketArray[EVENT_ARRAY_SIZE];
+     HANDLE eventArray[EVENT_ARRAY_SIZE];
+     int arraySize = 0;
+     int eventIndex;
+     // socketArray and eventArray should have same number of elements
+     OC_STATIC_ASSERT(_countof(socketArray) == _countof(eventArray), "Arrays should have same number of elements");
+     PUSH_IP_SOCKET(u6,  eventArray, socketArray, arraySize);
+     PUSH_IP_SOCKET(u6s, eventArray, socketArray, arraySize);
+     PUSH_IP_SOCKET(u4,  eventArray, socketArray, arraySize);
+     PUSH_IP_SOCKET(u4s, eventArray, socketArray, arraySize);
+     PUSH_IP_SOCKET(m6,  eventArray, socketArray, arraySize);
+     PUSH_IP_SOCKET(m6s, eventArray, socketArray, arraySize);
+     PUSH_IP_SOCKET(m4,  eventArray, socketArray, arraySize);
+     PUSH_IP_SOCKET(m4s, eventArray, socketArray, arraySize);
+     if (-1 != caglobals.ip.shutdownEvent)
+     {
+         INSERT_SOCKET(OC_INVALID_SOCKET, socketArray, arraySize);
+         PUSH_HANDLE(caglobals.ip.shutdownEvent, eventArray, arraySize);
+     }
+     /** @todo Support netlink events */
+     // Should not have overflowed buffer
+     assert(arraySize <= (_countof(socketArray)));
+     // Timeout is unnecessary on Windows
+     assert(-1 == caglobals.ip.selectTimeout);
+     while (!caglobals.ip.terminate)
+     {
+         int ret = WSAWaitForMultipleEvents(arraySize, eventArray, FALSE, WSA_INFINITE, FALSE);
+         switch (ret)
+         {
+             case WSA_WAIT_FAILED:
+                 OIC_LOG_V(ERROR, TAG, "WSAWaitForMultipleEvents returned WSA_WAIT_FAILED 0x%08x", WSAGetLastError());
+                 break;
+             case WSA_WAIT_IO_COMPLETION:
+                 OIC_LOG_V(ERROR, TAG, "WSAWaitForMultipleEvents returned WSA_WAIT_IO_COMPLETION 0x%08x", WSAGetLastError());
+                 break;
+             case WSA_WAIT_TIMEOUT:
+                 OIC_LOG_V(ERROR, TAG, "WSAWaitForMultipleEvents returned WSA_WAIT_TIMEOUT 0x%08x", WSAGetLastError());
+                 break;
+             default:
+                 eventIndex = ret - WSA_WAIT_EVENT_0;
+                 if ((eventIndex >= 0) && (eventIndex < arraySize))
+                 {
+                     if (false == WSAResetEvent(eventArray[eventIndex]))
+                     {
+                         OIC_LOG_V(ERROR, TAG, "WSAResetEvent failed 0x%08x", WSAGetLastError());
+                     }
+                     // Break out if shutdownEvent is triggered
+                     if ((caglobals.ip.shutdownEvent != -1) &&
+                         (caglobals.ip.shutdownEvent == eventArray[eventIndex]))
+                     {
+                         break;
+                     }
+                     CAEventReturned(socketArray[eventIndex]);
+                 }
+                 else
+                 {
+                     OIC_LOG_V(ERROR, TAG, "WSAWaitForMultipleEvents failed 0x%08x", WSAGetLastError());
+                 }
+                 break;
+         }
+     }
+     while (arraySize > 0)
+     {
+         arraySize--;
+         if (!WSACloseEvent(eventArray[arraySize]))
+         {
+             OIC_LOG_V(ERROR, TAG, "WSACloseEvent (Index %i) failed 0x%08x", arraySize, WSAGetLastError());
+         }
+     }
+     if (caglobals.ip.terminate)
+     {
+         caglobals.ip.shutdownEvent = -1;
+         WSACleanup();
+     }
+ }
+ static void CAEventReturned(CASocketFd_t socket)
+ {
+     CASocketFd_t fd = OC_INVALID_SOCKET;
+     CATransportFlags_t flags = CA_DEFAULT_FLAGS;
+     while (!caglobals.ip.terminate)
+     {
+         IS_MATCHING_IP_SOCKET(u6,  socket, CA_IPV6)
+         else IS_MATCHING_IP_SOCKET(u6s, socket, CA_IPV6 | CA_SECURE)
+         else IS_MATCHING_IP_SOCKET(u4,  socket, CA_IPV4)
+         else IS_MATCHING_IP_SOCKET(u4s, socket, CA_IPV4 | CA_SECURE)
+         else IS_MATCHING_IP_SOCKET(m6,  socket, CA_MULTICAST | CA_IPV6)
+         else IS_MATCHING_IP_SOCKET(m6s, socket, CA_MULTICAST | CA_IPV6 | CA_SECURE)
+         else IS_MATCHING_IP_SOCKET(m4,  socket, CA_MULTICAST | CA_IPV4)
+         else IS_MATCHING_IP_SOCKET(m4s, socket, CA_MULTICAST | CA_IPV4 | CA_SECURE)
+         else
+         {
+             break;
+         }
+         (void)CAReceiveMessage(socket, flags);
+         // We will never get more than one match per socket, so always break.
+         break;
+     }
+ }
+ #endif
+ void CADeInitializeIPGlobals()
+ {
+     CLOSE_SOCKET(u6);
+     CLOSE_SOCKET(u6s);
+     CLOSE_SOCKET(u4);
+     CLOSE_SOCKET(u4s);
+     CLOSE_SOCKET(m6);
+     CLOSE_SOCKET(m6s);
+     CLOSE_SOCKET(m4);
+     CLOSE_SOCKET(m4s);
+     if (caglobals.ip.netlinkFd != OC_INVALID_SOCKET)
+     {
+ #ifdef _WIN32
+         closesocket(caglobals.ip.netlinkFd);
+ #else
+         close(caglobals.ip.netlinkFd);
+ #endif
+         caglobals.ip.netlinkFd = OC_INVALID_SOCKET;
+     }
+ }
+ static CAResult_t CAReceiveMessage(CASocketFd_t fd, CATransportFlags_t flags)
  {
 -    char recvBuffer[COAP_MAX_PDU_SIZE];
 +    char recvBuffer[COAP_MAX_PDU_SIZE] = {0};
  
      size_t len;
      int level, type, namelen;
  
  #include "securevirtualresourcetypes.h"
  
+ #ifdef __cplusplus
+ extern "C" {
+ #endif
  extern const char * SVR_DB_FILE_NAME;
  extern const char * SVR_DB_DAT_FILE_NAME;
 -extern const char * OIC_MI_DEF;
  
  //AMACL
  extern const char * OIC_RSRC_TYPE_SEC_AMACL;
@@@ -78,19 -86,23 +86,24 @@@ if target_os in ['msys_nt', 'windows']
  ######################################################################
  # Source files and Targets
  ######################################################################
- unittest = sptest_env.Program('unittest', ['pmutilitytest.cpp',
-                                            'secureresourceprovider.cpp',
-                                            'provisioningdatabasemanager.cpp',
-                                            'ocprovisioningmanager.cpp', 'otmunittest.cpp', 
-                                            'credentialgeneratortest.cpp' ])
+ unittest_src = ['pmutilitytest.cpp',
+                 'secureresourceprovider.cpp',
+                 'provisioningdatabasemanager.cpp',
+                 'ocprovisioningmanager.cpp',
++                'credentialgeneratortest.cpp',
+                 ]
+ if target_os not in ['windows']:
+     unittest_src += [ 'otmunittest.cpp' ]
  
- sample_server1 = sptest_env.Program('sample_server1', ['sampleserver1.cpp'])
- sample_server2 = sptest_env.Program('sample_server2', ['sampleserver2.cpp'])
+ unittest = sptest_env.Program('unittest', unittest_src)
  
- provisioning_unittest_src_dir = src_dir + '/resource/csdk/security/provisioning/unittest/'
- provisioning_unittest_build_dir = env.get('BUILD_DIR') +'/resource/csdk/security/provisioning/unittest/'
+ if target_os not in ['windows']:
+     sample_server1 = sptest_env.Program('sample_server1', ['sampleserver1.cpp'])
+     sample_server2 = sptest_env.Program('sample_server2', ['sampleserver2.cpp'])
+     Alias("test", [sample_server1, sample_server2])
  
- Alias("test", [unittest, sample_server1, sample_server2])
+ Alias("test", [unittest])
  
  env.AppendTarget('test')
  if env.get('TEST') == '1':
@@@ -226,9 -226,12 +226,9 @@@ OCStackResult SendAclReq(PEContext_t *c
  {
      OCStackResult ret = OC_STACK_ERROR;
      const char GET_ACE_QUERY_FMT[] = "%s?%s=%s;%s=%s";
-     char uri[MAX_URI_LENGTH + MAX_QUERY_LENGTH] = {};
 -    char base64Buff[B64ENCODE_OUT_SAFESIZE(sizeof(((OicUuid_t*)0)->id)) + 1] = {0};
 -    uint32_t outLen = 0;
+     char uri[MAX_URI_LENGTH + MAX_QUERY_LENGTH] = {0};
      OCCallbackData cbData = {.context=NULL};
      OCDevAddr destAddr = {.adapter = OC_ADAPTER_IP};
 -    B64Result b64Ret;
      char *subID = NULL;
  
      VERIFY_NON_NULL(TAG, context, ERROR);
@@@ -60,34 -60,33 +60,34 @@@ extern "C
  
  typedef struct OCResource OCResource;
  
- void OCPayloadDestroy(OCPayload* payload);
OC_EXPORT void OCPayloadDestroy(OCPayload* payload);
  
  // Representation Payload
- OCRepPayload* OCRepPayloadCreate();
+ OC_EXPORT OCRepPayload* OCRepPayloadCreate();
  
- size_t calcDimTotal(const size_t dimensions[MAX_REP_ARRAY_DEPTH]);
OC_EXPORT size_t calcDimTotal(const size_t dimensions[MAX_REP_ARRAY_DEPTH]);
  
- OCRepPayload* OCRepPayloadClone(const OCRepPayload* payload);
+ OC_EXPORT OCRepPayload* OCRepPayloadClone(const OCRepPayload* payload);
  
- void OCRepPayloadAppend(OCRepPayload* parent, OCRepPayload* child);
OC_EXPORT void OCRepPayloadAppend(OCRepPayload* parent, OCRepPayload* child);
  
- bool OCRepPayloadSetUri(OCRepPayload* payload, const char* uri);
OC_EXPORT bool OCRepPayloadSetUri(OCRepPayload* payload, const char* uri);
  
- bool OCRepPayloadAddResourceType(OCRepPayload* payload, const char* resourceType);
- bool OCRepPayloadAddInterface(OCRepPayload* payload, const char* interface);
- bool OCRepPayloadAddModelVersion(OCRepPayload* payload, const char* dmv);
+ OC_EXPORT bool OCRepPayloadAddResourceType(OCRepPayload* payload, const char* resourceType);
+ OC_EXPORT bool OCRepPayloadAddInterface(OCRepPayload* payload, const char* iface);
++OC_EXPORT bool OCRepPayloadAddModelVersion(OCRepPayload* payload, const char* dmv);
  
- bool OCRepPayloadAddResourceTypeAsOwner(OCRepPayload* payload, char* resourceType);
bool OCRepPayloadAddInterfaceAsOwner(OCRepPayload* payload, char* interface);
OC_EXPORT bool OCRepPayloadAddResourceTypeAsOwner(OCRepPayload* payload, char* resourceType);
OC_EXPORT bool OCRepPayloadAddInterfaceAsOwner(OCRepPayload* payload, char* iface);
  
- bool OCRepPayloadIsNull(const OCRepPayload* payload, const char* name);
- bool OCRepPayloadSetNull(OCRepPayload* payload, const char* name);
OC_EXPORT bool OCRepPayloadIsNull(const OCRepPayload* payload, const char* name);
OC_EXPORT bool OCRepPayloadSetNull(OCRepPayload* payload, const char* name);
  
- bool OCRepPayloadSetPropInt(OCRepPayload* payload, const char* name, int64_t value);
- bool OCRepPayloadGetPropInt(const OCRepPayload* payload, const char* name, int64_t* value);
OC_EXPORT bool OCRepPayloadSetPropInt(OCRepPayload* payload, const char* name, int64_t value);
OC_EXPORT bool OCRepPayloadGetPropInt(const OCRepPayload* payload, const char* name, int64_t* value);
  
- bool OCRepPayloadSetPropDouble(OCRepPayload* payload, const char* name, double value);
- bool OCRepPayloadGetPropDouble(const OCRepPayload* payload, const char* name, double* value);
OC_EXPORT bool OCRepPayloadSetPropDouble(OCRepPayload* payload, const char* name, double value);
OC_EXPORT bool OCRepPayloadGetPropDouble(const OCRepPayload* payload, const char* name, double* value);
  
  /**
   * This function allocates memory for the byte string and sets it in the payload.
@@@ -177,104 -175,88 +176,104 @@@ 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);
  
  #ifndef TCP_ADAPTER
- void OCDiscoveryPayloadAddResource(OCDiscoveryPayload* payload, const OCResource* res,
-                                    uint16_t securePort);
OC_EXPORT void OCDiscoveryPayloadAddResource(OCDiscoveryPayload* payload, const OCResource* res,
+                                              uint16_t securePort);
  #else
- void OCDiscoveryPayloadAddResource(OCDiscoveryPayload* payload, const OCResource* res,
-                                    uint16_t securePort, uint16_t tcpPort);
OC_EXPORT void OCDiscoveryPayloadAddResource(OCDiscoveryPayload* payload, const OCResource* res,
+                                              uint16_t securePort, uint16_t tcpPort);
  #endif
- void OCDiscoveryPayloadAddNewResource(OCDiscoveryPayload* payload, OCResourcePayload* res);
- bool OCResourcePayloadAddStringLL(OCStringLL **payload, const char* type);
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);
  
- OCStringLL* OCCreateOCStringLL(const char* text);
 +/**
 + * This function creates a list from a string (with separated contents if several)
 + * @param text         single string or CSV text fields
 + * @return newly allocated linked list
 + * @note separator is ',' (according to rfc4180, ';' is not valid)
 + **/
- char* OCCreateString(const OCStringLL* ll);
++OC_EXPORT OCStringLL* OCCreateOCStringLL(const char* text);
 +
 +/**
 + * This function creates a string from a list (with separated contents if several)
 + * @param ll           Pointer to list
 + * @return newly allocated string
 + * @note separator is ',' (according to rfc4180)
 + **/
++OC_EXPORT char* OCCreateString(const OCStringLL* ll);
 +
  #ifdef __cplusplus
  }
  #endif
@@@ -1208,10 -1201,10 +1211,10 @@@ typedef struc
      char *uri;
  
      /** Resource Type */
 -    char *type;
 +    OCStringLL *type;
  
      /** Interface */
-     OCStringLL *interface;
+     OCStringLL *iface;
  
      /** This structure holds the old /oic/res response. */
      OCResourcePayload *resources;
@@@ -189,13 -189,10 +189,13 @@@ INLINE_API void OCPayloadLogDiscovery(L
      }
      if (payload->type)
      {
 -        OIC_LOG_V(level, PL_TAG, "\tResource Type: %s", payload->type);
 +        for (OCStringLL *strll = payload->type; strll; strll = strll->next)
 +        {
 +            OIC_LOG_V(level, PL_TAG, "\tResource Type: %s", strll->value);
 +        }
      }
      OIC_LOG(level, PL_TAG, "\tInterface:");
-     for (OCStringLL *itf = payload->interface; itf; itf = itf->next)
+     for (OCStringLL *itf = payload->iface; itf; itf = itf->next)
      {
          OIC_LOG_V(level, PL_TAG, "\t\t%s", itf->value);
      }
  #include <string.h>
  #include <string>
  #include <stdlib.h>
+ #ifdef HAVE_UNISTD_H
  #include <unistd.h>
+ #endif
+ #ifdef HAVE_WINDOWS_H
+ #include <windows.h>
+ #endif
  #include <signal.h>
+ #ifdef HAVE_PTHREAD_H
  #include <pthread.h>
+ #endif
  #include <array>
 +#include "oic_malloc.h"
+ #include <getopt.h>
  #include "ocstack.h"
  #include "logger.h"
  #include "ocpayload.h"
@@@ -1672,9 -1590,9 +1672,9 @@@ void OCDiscoveryPayloadDestroy(OCDiscov
      OICFree(payload->sid);
      OICFree(payload->baseURI);
      OICFree(payload->uri);
 -    OICFree(payload->type);
 +    OCFreeOCStringLL(payload->type);
      OICFree(payload->name);
-     OCFreeOCStringLL(payload->interface);
+     OCFreeOCStringLL(payload->iface);
      OCDiscoveryResourceDestroy(payload->resources);
      OICFree(payload);
  }
@@@ -775,13 -786,11 +778,13 @@@ static OCStackResult HandleVirtualResou
                              discPayload->name = OICStrdup(savedDeviceInfo.deviceName);
                              VERIFY_NON_NULL(discPayload->name, ERROR, OC_STACK_NO_MEMORY);
                          }
 -                        discPayload->type = OICStrdup(OC_RSRVD_RESOURCE_TYPE_RES);
 +                        discPayload->type = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
                          VERIFY_NON_NULL(discPayload->type, ERROR, OC_STACK_NO_MEMORY);
-                         OCResourcePayloadAddStringLL(&discPayload->interface, OC_RSRVD_INTERFACE_LL);
-                         OCResourcePayloadAddStringLL(&discPayload->interface, OC_RSRVD_INTERFACE_DEFAULT);
-                         VERIFY_NON_NULL(discPayload->interface, ERROR, OC_STACK_NO_MEMORY);
 +                        discPayload->type->value = OICStrdup(OC_RSRVD_RESOURCE_TYPE_RES);
 +                        VERIFY_NON_NULL(discPayload->type->value, ERROR, OC_STACK_NO_MEMORY);
+                         OCResourcePayloadAddStringLL(&discPayload->iface, OC_RSRVD_INTERFACE_LL);
+                         OCResourcePayloadAddStringLL(&discPayload->iface, OC_RSRVD_INTERFACE_DEFAULT);
+                         VERIFY_NON_NULL(discPayload->iface, ERROR, OC_STACK_NO_MEMORY);
                      }
                      bool foundResourceAtRD = false;
                      for (;resource && discoveryResult == OC_STACK_OK; resource = resource->next)
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge