VS2013/15 aggregate changes of Intel and Microsoft 27/7627/71
authorDavid Antler <david.a.antler@intel.com>
Wed, 1 Jun 2016 23:35:50 +0000 (16:35 -0700)
committerDavid Antler <david.a.antler@intel.com>
Thu, 2 Jun 2016 17:41:33 +0000 (17:41 +0000)
Status: Compiles in VS2015 and runs tests

List of TODOs:

  TODO: Fix tinydtls tick and locking issues.
  TODO: Fix disabled tests (PersistentStorageHandlerTest, usleep)
  TODO: Enable ocpmapi.dll shared lib (currently it's static)
  TODO: Remove hacks to solve error C2059: syntax error: 'constant'
          see: resource\include\StringConstants.h
  TODO: Address inconsistent style! Perhaps file a JIRA issue; CI
        should reject such issues before they enter the code base.
  TODO: Understand priority around enabling services.

Merger changelog:

* Adopted libtimer\timer.c changes from Microsoft
* Adopted Boost SCons installation changes from Intel
* Combined build_common\windows\SConscript from both Intel and
  Microsoft
* Adopted tinydtls code changes from Microsoft (INLINE_API macro,
  features wrapped in #ifdefs, etc)
* Adopted tinydtls SCons changes from Intel, tinydtls random seed
  generation from Intel
* Adopted ocrandom.c "QueryPerformanceCounter" from Microsoft.
* Adopted resource\examples from Intel
* Adopted liboc_logger and liboc from Intel
* Adopted resource/src from Intel
* Adopted boostification from Microsoft (BOOST_NOEXCEPT, etc.)
* Adopted "getopt" from Microsoft (multiple locations)
  - resource\csdk\stack\samples\linux\secure\occlientbasicops.cpp
  - resource\csdk\stack\samples\linux\SimpleClientServer\common.cpp
* Adopted SimpleClientServer changes from Microsoft
  - resource\csdk\stack\samples\linux\SimpleClientServer\
* Adopted oicgroup.c from Intel
* Adopted OC_EXPORT changes (and OC_EXPORT_DLL define macro)
  from Microsoft

Change-Id: Ib4298cd63731b39e1bcfa6a790fd18298c73720a
Signed-off-by: Henry Beberman <henry.beberman@intel.com>
Signed-off-by: Dave Thaler <dthaler@microsoft.com>
Signed-off-by: Daniel Ferguson <daniel.j.ferguson@intel.com>
Signed-off-by: David Antler <david.a.antler@intel.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/7627
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
151 files changed:
.gitignore
build_common/tools/UnpackAll.py
extlibs/cjson/cJSON.h
extlibs/timer/timer.c
extlibs/tinydtls/alert.h
extlibs/tinydtls/ccm.c
extlibs/tinydtls/crypto.c
extlibs/tinydtls/crypto.h
extlibs/tinydtls/debug.c
extlibs/tinydtls/debug.h
extlibs/tinydtls/dtls.c
extlibs/tinydtls/dtls.h
extlibs/tinydtls/dtls_config.h
extlibs/tinydtls/dtls_time.c
extlibs/tinydtls/dtls_time.h
extlibs/tinydtls/global.h
extlibs/tinydtls/hmac.c
extlibs/tinydtls/hmac.h
extlibs/tinydtls/netq.c
extlibs/tinydtls/netq.h
extlibs/tinydtls/numeric.h
extlibs/tinydtls/peer.c
extlibs/tinydtls/peer.h
extlibs/tinydtls/prng.h
extlibs/tinydtls/session.c
extlibs/tinydtls/session.h
extlibs/tinydtls/t_list.h
extlibs/tinydtls/tests/dtls-client.c
extlibs/tinydtls/tests/dtls-server.c
extlibs/tinydtls/tinydtls.h
extlibs/tinydtls/utlist.h
resource/c_common/ocrandom/src/ocrandom.c
resource/c_common/oic_time/include/oic_time.h
resource/c_common/oic_time/src/oic_time.c
resource/c_common/platform_features.h
resource/c_common/windows/SConscript [new file with mode: 0644]
resource/c_common/windows/include/getopt.h [new file with mode: 0644]
resource/c_common/windows/include/pthread_create.h [new file with mode: 0644]
resource/c_common/windows/include/vs12_snprintf.h [new file with mode: 0644]
resource/c_common/windows/include/win_sleep.h [new file with mode: 0644]
resource/c_common/windows/src/getopt.c [new file with mode: 0644]
resource/c_common/windows/src/pthread_create.c [new file with mode: 0644]
resource/c_common/windows/src/snprintf.c [new file with mode: 0644]
resource/c_common/windows/src/win_sleep.c [new file with mode: 0644]
resource/csdk/connectivity/api/cacommon.h
resource/csdk/connectivity/common/src/camutex_noop.c
resource/csdk/connectivity/common/src/camutex_pthreads.c
resource/csdk/connectivity/common/src/cathreadpool_pthreads.c
resource/csdk/connectivity/inc/caadapternetdtls.h
resource/csdk/connectivity/inc/caadapterutils.h
resource/csdk/connectivity/lib/libcoap-4.1.1/address.h
resource/csdk/connectivity/lib/libcoap-4.1.1/coap_time.h
resource/csdk/connectivity/lib/libcoap-4.1.1/config.h
resource/csdk/connectivity/lib/libcoap-4.1.1/debug.c
resource/csdk/connectivity/lib/libcoap-4.1.1/encode.h
resource/csdk/connectivity/lib/libcoap-4.1.1/net.c
resource/csdk/connectivity/lib/libcoap-4.1.1/net.h
resource/csdk/connectivity/lib/libcoap-4.1.1/pdu.c
resource/csdk/connectivity/lib/libcoap-4.1.1/resource.c
resource/csdk/connectivity/lib/libcoap-4.1.1/utlist.h
resource/csdk/connectivity/src/adapter_util/caadapternetdtls.c
resource/csdk/connectivity/src/adapter_util/caadapterutils.c
resource/csdk/connectivity/src/caretransmission.c
resource/csdk/connectivity/src/ip_adapter/caipserver.c
resource/csdk/connectivity/src/ip_adapter/windows/caipnwmonitor.c
resource/csdk/connectivity/test/ca_api_unittest.cpp
resource/csdk/connectivity/test/camutex_tests.cpp
resource/csdk/connectivity/test/catests.cpp
resource/csdk/logger/include/logger.h
resource/csdk/logger/src/logger.c
resource/csdk/routing/src/routingutility.c
resource/csdk/security/include/internal/srmresourcestrings.h
resource/csdk/security/include/securevirtualresourcetypes.h
resource/csdk/security/provisioning/sample/provisioningclient.c
resource/csdk/security/provisioning/sample/sampleserver_justworks.cpp
resource/csdk/security/provisioning/sample/sampleserver_randompin.cpp
resource/csdk/security/provisioning/src/ownershiptransfermanager.c
resource/csdk/security/provisioning/src/pmutility.c
resource/csdk/security/src/amsmgr.c
resource/csdk/security/src/credresource.c
resource/csdk/security/src/iotvticalendar.c
resource/csdk/security/src/pbkdf2.c
resource/csdk/security/src/policyengine.c
resource/csdk/security/src/psinterface.c
resource/csdk/security/src/secureresourcemanager.c
resource/csdk/security/src/srmutility.c
resource/csdk/security/src/strptime.c [new file with mode: 0644]
resource/csdk/security/unittest/aclresourcetest.cpp
resource/csdk/security/unittest/iotvticalendartest.cpp
resource/csdk/security/unittest/policyengine.cpp
resource/csdk/security/unittest/pstatresource.cpp
resource/csdk/security/unittest/securityresourcemanager.cpp
resource/csdk/security/unittest/srmtestcommon.cpp
resource/csdk/security/unittest/srmtestcommon.h
resource/csdk/stack/include/internal/ocpayloadcbor.h
resource/csdk/stack/include/internal/ocstackinternal.h
resource/csdk/stack/include/ocpayload.h
resource/csdk/stack/include/ocstack.h
resource/csdk/stack/include/payload_logging.h
resource/csdk/stack/include/rdpayload.h
resource/csdk/stack/samples/linux/SimpleClientServer/common.cpp
resource/csdk/stack/samples/linux/SimpleClientServer/occlient.cpp
resource/csdk/stack/samples/linux/SimpleClientServer/occlientbasicops.cpp
resource/csdk/stack/samples/linux/SimpleClientServer/occlientcoll.cpp
resource/csdk/stack/samples/linux/SimpleClientServer/occlientslow.cpp
resource/csdk/stack/samples/linux/SimpleClientServer/ocremoteaccessclient.cpp
resource/csdk/stack/samples/linux/SimpleClientServer/ocserver.cpp
resource/csdk/stack/samples/linux/SimpleClientServer/ocservercoll.cpp
resource/csdk/stack/samples/linux/SimpleClientServer/ocserverslow.cpp
resource/csdk/stack/samples/linux/secure/ocamsservice.cpp
resource/csdk/stack/samples/linux/secure/occlientbasicops.cpp
resource/csdk/stack/samples/linux/secure/occlientdirectpairing.cpp
resource/csdk/stack/samples/linux/secure/ocserverbasicops.cpp
resource/csdk/stack/src/occollection.c
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/oicgroup.c
resource/csdk/stack/test/cbortests.cpp
resource/csdk/stack/test/stacktests.cpp
resource/examples/mediaserver.cpp
resource/examples/simpleserver.cpp
resource/include/AttributeValue.h
resource/include/OCApi.h
resource/include/OCHeaderOption.h
resource/include/OCRepresentation.h
resource/include/OCResource.h
resource/include/OCResourceRequest.h
resource/include/OCResourceResponse.h
resource/include/OCUtilities.h
resource/include/ResourceInitException.h
resource/include/StringConstants.h
resource/oc_logger/include/oc_log_stream.hpp
resource/src/CAManager.cpp
resource/src/InProcClientWrapper.cpp
resource/src/InProcServerWrapper.cpp
resource/src/OCApi.cpp
resource/src/OCRepresentation.cpp
scons_script_how_to.txt
service/resource-container/src/Configuration.h
service/resource-directory/samples/rd_main.c
service/resource-directory/src/internal/rd_storage.c
service/resource-directory/src/rd_client.c
service/resource-directory/src/rd_server.c
service/resource-encapsulation/include/RCSException.h
service/resource-encapsulation/include/RCSResourceAttributes.h
service/resource-hosting/src/HostingObject.h
service/things-manager/sdk/inc/ActionSet.h
service/things-manager/sdk/src/GroupManager.cpp

index f132748..7d0ce16 100644 (file)
@@ -97,7 +97,7 @@ extlibs/android/sdk/android-sdk_r24.2
 extlibs/android/sdk/android-sdk-linux
 extlibs/android/sdk/android-sdk-macosx
 extlibs/android/sdk/android-sdk-windows
-extlibs/boost/boost_1_58_0
+extlibs/boost/*
 extlibs/tinycbor/tinycbor
 *.tgz
 *.zip
index c06e132..514b54c 100644 (file)
@@ -307,48 +307,55 @@ def generate( env ) :
     # read tools for Windows system
     if env["PLATFORM"] <> "darwin" and "win" in env["PLATFORM"] :
 
-        if env.WhereIs("7z") :
+        if env.WhereIs('7z', env.get('PATH')):
             toolset["EXTRACTOR"]["TARGZ"]["RUN"]           = "7z"
             toolset["EXTRACTOR"]["TARGZ"]["LISTEXTRACTOR"] = __fileextractor_win_7zip
             toolset["EXTRACTOR"]["TARGZ"]["LISTFLAGS"]     = "x"
             toolset["EXTRACTOR"]["TARGZ"]["LISTSUFFIX"]    = "-so -y | ${UNPACK['EXTRACTOR']['TARGZ']['RUN']} l -sii -ttar -y -so"
             toolset["EXTRACTOR"]["TARGZ"]["EXTRACTFLAGS"]  = "x"
-            toolset["EXTRACTOR"]["TARGZ"]["EXTRACTSUFFIX"] = "-so -y | ${UNPACK['EXTRACTOR']['TARGZ']['RUN']} x -sii -ttar -y -oc:${UNPACK['EXTRACTDIR']}"
+            toolset["EXTRACTOR"]["TARGZ"]["EXTRACTSUFFIX"] = "-so -y | ${UNPACK['EXTRACTOR']['TARGZ']['RUN']} x -sii -ttar -y -o${UNPACK['EXTRACTDIR']}"
 
             toolset["EXTRACTOR"]["TARBZ"]["RUN"]           = "7z"
             toolset["EXTRACTOR"]["TARBZ"]["LISTEXTRACTOR"] = __fileextractor_win_7zip
             toolset["EXTRACTOR"]["TARBZ"]["LISTFLAGS"]     = "x"
             toolset["EXTRACTOR"]["TARBZ"]["LISTSUFFIX"]    = "-so -y | ${UNPACK['EXTRACTOR']['TARGZ']['RUN']} l -sii -ttar -y -so"
             toolset["EXTRACTOR"]["TARBZ"]["EXTRACTFLAGS"]  = "x"
-            toolset["EXTRACTOR"]["TARBZ"]["EXTRACTSUFFIX"] = "-so -y | ${UNPACK['EXTRACTOR']['TARGZ']['RUN']} x -sii -ttar -y -oc:${UNPACK['EXTRACTDIR']}"
+            toolset["EXTRACTOR"]["TARBZ"]["EXTRACTSUFFIX"] = "-so -y | ${UNPACK['EXTRACTOR']['TARGZ']['RUN']} x -sii -ttar -y -o${UNPACK['EXTRACTDIR']}"
 
             toolset["EXTRACTOR"]["BZIP"]["RUN"]            = "7z"
             toolset["EXTRACTOR"]["BZIP"]["LISTEXTRACTOR"]  = __fileextractor_win_7zip
             toolset["EXTRACTOR"]["BZIP"]["LISTFLAGS"]      = "l"
             toolset["EXTRACTOR"]["BZIP"]["LISTSUFFIX"]     = "-y -so"
             toolset["EXTRACTOR"]["BZIP"]["EXTRACTFLAGS"]   = "x"
-            toolset["EXTRACTOR"]["BZIP"]["EXTRACTSUFFIX"]  = "-y -oc:${UNPACK['EXTRACTDIR']}"
+            toolset["EXTRACTOR"]["BZIP"]["EXTRACTSUFFIX"]  = "-y -o${UNPACK['EXTRACTDIR']}"
 
             toolset["EXTRACTOR"]["GZIP"]["RUN"]            = "7z"
             toolset["EXTRACTOR"]["GZIP"]["LISTEXTRACTOR"]  = __fileextractor_win_7zip
             toolset["EXTRACTOR"]["GZIP"]["LISTFLAGS"]      = "l"
             toolset["EXTRACTOR"]["GZIP"]["LISTSUFFIX"]     = "-y -so"
             toolset["EXTRACTOR"]["GZIP"]["EXTRACTFLAGS"]   = "x"
-            toolset["EXTRACTOR"]["GZIP"]["EXTRACTSUFFIX"]  = "-y -oc:${UNPACK['EXTRACTDIR']}"
+            toolset["EXTRACTOR"]["GZIP"]["EXTRACTSUFFIX"]  = "-y -o${UNPACK['EXTRACTDIR']}"
 
             toolset["EXTRACTOR"]["ZIP"]["RUN"]             = "7z"
             toolset["EXTRACTOR"]["ZIP"]["LISTEXTRACTOR"]   = __fileextractor_win_7zip
             toolset["EXTRACTOR"]["ZIP"]["LISTFLAGS"]       = "l"
             toolset["EXTRACTOR"]["ZIP"]["LISTSUFFIX"]      = "-y -so"
             toolset["EXTRACTOR"]["ZIP"]["EXTRACTFLAGS"]    = "x"
-            toolset["EXTRACTOR"]["ZIP"]["EXTRACTSUFFIX"]   = "-y -oc:${UNPACK['EXTRACTDIR']}"
+            toolset["EXTRACTOR"]["ZIP"]["EXTRACTSUFFIX"]   = "-y -o${UNPACK['EXTRACTDIR']}"
 
             toolset["EXTRACTOR"]["TAR"]["RUN"]             = "7z"
             toolset["EXTRACTOR"]["TAR"]["LISTEXTRACTOR"]   = __fileextractor_win_7zip
             toolset["EXTRACTOR"]["TAR"]["LISTFLAGS"]       = "l"
             toolset["EXTRACTOR"]["TAR"]["LISTSUFFIX"]      = "-y -ttar -so"
             toolset["EXTRACTOR"]["TAR"]["EXTRACTFLAGS"]    = "x"
-            toolset["EXTRACTOR"]["TAR"]["EXTRACTSUFFIX"]   = "-y -ttar -oc:${UNPACK['EXTRACTDIR']}"
+            toolset["EXTRACTOR"]["TAR"]["EXTRACTSUFFIX"]   = "-y -ttar -o${UNPACK['EXTRACTDIR']}"
+        else:
+            print '''*********************** Error ************************
+*                                                    *
+* Please make sure that 7-zip is in your System PATH *
+*                                                    *
+******************************************************
+'''
 
         # here can add some other Windows tools, that can handle the archive files
         # but I don't know which ones can handle all file types
index 867b7c3..eef7b8b 100644 (file)
@@ -39,6 +39,8 @@ extern "C"
        
 #define cJSON_IsReference 256
 
+#include <platform_features.h>
+
 /* The cJSON structure: */
 typedef struct cJSON {
        struct cJSON *next,*prev;       /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
@@ -59,71 +61,71 @@ typedef struct cJSON_Hooks {
 } cJSON_Hooks;
 
 /* Supply malloc, realloc and free functions to cJSON */
-extern void cJSON_InitHooks(cJSON_Hooks* hooks);
+OC_EXPORT extern void cJSON_InitHooks(cJSON_Hooks* hooks);
 
 
 /* Supply a block of JSON, and this returns a cJSON object you can interrogate. Call cJSON_Delete when finished. */
-extern cJSON *cJSON_Parse(const char *value);
+OC_EXPORT extern cJSON *cJSON_Parse(const char *value);
 /* Render a cJSON entity to text for transfer/storage. Free the char* when finished. */
-extern char  *cJSON_Print(cJSON *item);
+OC_EXPORT extern char  *cJSON_Print(cJSON *item);
 /* Render a cJSON entity to text for transfer/storage without any formatting. Free the char* when finished. */
-extern char  *cJSON_PrintUnformatted(cJSON *item);
+OC_EXPORT extern char  *cJSON_PrintUnformatted(cJSON *item);
 /* Delete a cJSON entity and all subentities. */
-extern void   cJSON_Delete(cJSON *c);
+OC_EXPORT extern void   cJSON_Delete(cJSON *c);
 
 /* Returns the number of items in an array (or object). */
-extern int       cJSON_GetArraySize(cJSON *array);
+OC_EXPORT extern int     cJSON_GetArraySize(cJSON *array);
 /* Retrieve item number "item" from array "array". Returns NULL if unsuccessful. */
-extern cJSON *cJSON_GetArrayItem(cJSON *array,int item);
+OC_EXPORT extern cJSON *cJSON_GetArrayItem(cJSON *array,int item);
 /* Get item "string" from object. Case insensitive. */
-extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);
+OC_EXPORT extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);
 
 /* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */
-extern const char *cJSON_GetErrorPtr(void);
-       
+OC_EXPORT extern const char *cJSON_GetErrorPtr(void);
+
 /* These calls create a cJSON item of the appropriate type. */
-extern cJSON *cJSON_CreateNull(void);
-extern cJSON *cJSON_CreateTrue(void);
-extern cJSON *cJSON_CreateFalse(void);
-extern cJSON *cJSON_CreateBool(int b);
-extern cJSON *cJSON_CreateNumber(double num);
-extern cJSON *cJSON_CreateString(const char *string);
-extern cJSON *cJSON_CreateArray(void);
-extern cJSON *cJSON_CreateObject(void);
+OC_EXPORT extern cJSON *cJSON_CreateNull(void);
+OC_EXPORT extern cJSON *cJSON_CreateTrue(void);
+OC_EXPORT extern cJSON *cJSON_CreateFalse(void);
+OC_EXPORT extern cJSON *cJSON_CreateBool(int b);
+OC_EXPORT extern cJSON *cJSON_CreateNumber(double num);
+OC_EXPORT extern cJSON *cJSON_CreateString(const char *string);
+OC_EXPORT extern cJSON *cJSON_CreateArray(void);
+OC_EXPORT extern cJSON *cJSON_CreateObject(void);
 
 /* These utilities create an Array of count items. */
-extern cJSON *cJSON_CreateIntArray(const int *numbers,int count);
-extern cJSON *cJSON_CreateFloatArray(const float *numbers,int count);
-extern cJSON *cJSON_CreateDoubleArray(const double *numbers,int count);
-extern cJSON *cJSON_CreateStringArray(const char **strings,int count);
+OC_EXPORT extern cJSON *cJSON_CreateIntArray(const int *numbers,int count);
+OC_EXPORT extern cJSON *cJSON_CreateFloatArray(const float *numbers,int count);
+OC_EXPORT extern cJSON *cJSON_CreateDoubleArray(const double *numbers,int count);
+OC_EXPORT extern cJSON *cJSON_CreateStringArray(const char **strings,int count);
 
 /* Append item to the specified array/object. */
-extern void cJSON_AddItemToArray(cJSON *array, cJSON *item);
-extern void    cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item);
+OC_EXPORT extern void cJSON_AddItemToArray(cJSON *array, cJSON *item);
+OC_EXPORT extern void  cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item);
 /* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */
-extern void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);
-extern void    cJSON_AddItemReferenceToObject(cJSON *object,const char *string,cJSON *item);
+OC_EXPORT extern void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);
+OC_EXPORT extern void  cJSON_AddItemReferenceToObject(cJSON *object,const char *string,cJSON *item);
 
 /* Remove/Detatch items from Arrays/Objects. */
-extern cJSON *cJSON_DetachItemFromArray(cJSON *array,int which);
-extern void   cJSON_DeleteItemFromArray(cJSON *array,int which);
-extern cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string);
-extern void   cJSON_DeleteItemFromObject(cJSON *object,const char *string);
-       
+OC_EXPORT extern cJSON *cJSON_DetachItemFromArray(cJSON *array,int which);
+OC_EXPORT extern void   cJSON_DeleteItemFromArray(cJSON *array,int which);
+OC_EXPORT extern cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string);
+OC_EXPORT extern void   cJSON_DeleteItemFromObject(cJSON *object,const char *string);
+
 /* Update array items. */
-extern void cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem);
-extern void cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem);
+OC_EXPORT extern void cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem);
+OC_EXPORT extern void cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem);
 
 /* Duplicate a cJSON item */
-extern cJSON *cJSON_Duplicate(cJSON *item,int recurse);
+OC_EXPORT extern cJSON *cJSON_Duplicate(cJSON *item,int recurse);
 /* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will
 need to be released. With recurse!=0, it will duplicate any children connected to the item.
 The item->next and ->prev pointers are always zero on return from Duplicate. */
 
 /* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */
-extern cJSON *cJSON_ParseWithOpts(const char *value,const char **return_parse_end,int require_null_terminated);
+OC_EXPORT extern cJSON *cJSON_ParseWithOpts(const char *value,const char **return_parse_end,int require_null_terminated);
 
-extern void cJSON_Minify(char *json);
+OC_EXPORT extern void cJSON_Minify(char *json);
 
 /* Macros for creating things quickly. */
 #define cJSON_AddNullToObject(object,name)             cJSON_AddItemToObject(object, name, cJSON_CreateNull())
index 43043a6..88deb05 100755 (executable)
 
 #define _BSD_SOURCE
 
-#ifndef WITH_ARDUINO
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
+#endif
+#ifdef HAVE_PTHREAD_H
 #include <pthread.h>
+#endif
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
+#endif
+#ifdef HAVE_MEMORY_H
 #include <memory.h>
+#endif
+#ifdef HAVE_STDLIB_H
 #include <stdlib.h>
 #endif
-
+#ifdef HAVE_STRING_H
 #include <string.h>
+#endif
+#include "platform_features.h"
+
 #include <stdio.h>
 
 #include "timer.h"
@@ -255,9 +267,8 @@ void *loop(void *threadid)
 int initThread()
 {
     int res;
-    long t = 0;
 
-    res = pthread_create(&thread_id, NULL, loop, (void *) t);
+    res = pthread_create(&thread_id, NULL, loop, NULL);
 
     if (res)
     {
index 5a27faa..a589dd7 100644 (file)
@@ -66,13 +66,13 @@ typedef enum {
                                          * has finished */
 #define DTLS_EVENT_RENEGOTIATE    0x01DF /**< re-negotiation has started */
 
-static inline int
+INLINE_API int
 dtls_alert_create(dtls_alert_level_t level, dtls_alert_t desc)
 {
   return -((level << 8) | desc);
 }
 
-static inline int
+INLINE_API int
 dtls_alert_fatal_create(dtls_alert_t desc)
 {
   return dtls_alert_create(DTLS_ALERT_LEVEL_FATAL, desc);
index 7563db8..1366145 100644 (file)
@@ -46,7 +46,7 @@
       (A)[i] |= (C) & 0xFF;                                            \
   }
 
-static inline void 
+INLINE_API void 
 block0(size_t M,       /* number of auth bytes */
        size_t L,       /* number of bytes to encode message length */
        size_t la,      /* l(a) octets additional authenticated data */
@@ -145,7 +145,7 @@ add_auth_data(rijndael_ctx *ctx, const unsigned char *msg, size_t la,
   } 
 }
 
-static inline void
+INLINE_API void
 encrypt(rijndael_ctx *ctx, size_t L, unsigned long counter,
        unsigned char *msg, size_t len,
        unsigned char A[DTLS_CCM_BLOCKSIZE],
@@ -158,7 +158,7 @@ encrypt(rijndael_ctx *ctx, size_t L, unsigned long counter,
   memxor(msg, S, len);
 }
 
-static inline void
+INLINE_API void
 mac(rijndael_ctx *ctx, 
     unsigned char *msg, size_t len,
     unsigned char B[DTLS_CCM_BLOCKSIZE],
index de07f49..d9ec048 100644 (file)
@@ -60,7 +60,7 @@
 #include "netq.h"
 #include "hmac.h"
 
-#ifndef WITH_CONTIKI
+#if !defined(WITH_CONTIKI) && !defined(_WIN32)
 #include <pthread.h>
 #endif
 
   if (Seed) dtls_hmac_update(Context, (Seed), (Length))
 
 static struct dtls_cipher_context_t cipher_context;
-#ifndef WITH_CONTIKI
+#if !defined(WITH_CONTIKI) && !defined(_WIN32)
 static pthread_mutex_t cipher_context_mutex = PTHREAD_MUTEX_INITIALIZER;
 #endif
 
 static struct dtls_cipher_context_t *dtls_cipher_context_get(void)
 {
-#ifndef WITH_CONTIKI
+#if !defined(WITH_CONTIKI) && !defined(_WIN32)
   pthread_mutex_lock(&cipher_context_mutex);
 #endif
   return &cipher_context;
@@ -82,7 +82,7 @@ static struct dtls_cipher_context_t *dtls_cipher_context_get(void)
 
 static void dtls_cipher_context_release(void)
 {
-#ifndef WITH_CONTIKI
+#if !defined(WITH_CONTIKI) && !defined(_WIN32)
   pthread_mutex_unlock(&cipher_context_mutex);
 #endif
 }
index 8ea83f2..8acf787 100644 (file)
@@ -158,7 +158,7 @@ typedef struct {
 /* The following macros provide access to the components of the
  * key_block in the security parameters. */
 
-static inline int dtls_kb_mac_secret_size(dtls_cipher_t cipher)
+INLINE_API int dtls_kb_mac_secret_size(dtls_cipher_t cipher)
 {
     switch(cipher)
     {
@@ -184,7 +184,7 @@ static inline int dtls_kb_mac_secret_size(dtls_cipher_t cipher)
 }
 
 
-static inline int dtls_kb_iv_size(dtls_cipher_t cipher)
+INLINE_API int dtls_kb_iv_size(dtls_cipher_t cipher)
 {
     switch(cipher)
     {
index 589c091..5b458bc 100644 (file)
@@ -87,7 +87,7 @@ static char *loglevels[] = {
 
 #ifdef HAVE_TIME_H
 
-static inline size_t
+INLINE_API size_t
 print_timestamp(char *s, size_t len, time_t t) {
   struct tm *tmp;
   tmp = localtime(&t);
@@ -96,7 +96,7 @@ print_timestamp(char *s, size_t len, time_t t) {
 
 #else /* alternative implementation: just print the timestamp */
 
-static inline size_t
+INLINE_API size_t
 print_timestamp(char *s, size_t len, clock_time_t t) {
 #ifdef HAVE_SNPRINTF
   return snprintf(s, len, "%u.%03u", 
@@ -118,7 +118,7 @@ print_timestamp(char *s, size_t len, clock_time_t t) {
  * 
  * @return The length of @p s.
  */
-static inline size_t
+INLINE_API size_t
 dtls_strnlen(const char *s, size_t maxlen) {
   size_t n = 0;
   while(*s++ && n < maxlen)
@@ -132,9 +132,9 @@ dtls_strnlen(const char *s, size_t maxlen) {
 
 static size_t
 dsrv_print_addr(const session_t *addr, char *buf, size_t len) {
-#ifdef HAVE_ARPA_INET_H
+#if defined(HAVE_ARPA_INET_H) || defined(_WIN32)
   const void *addrptr = NULL;
-#ifdef __ANDROID__
+#if defined(__ANDROID__) || defined(_WIN32)
   unsigned short int port;
 #else
   in_port_t port;
index 95286f8..89af876 100644 (file)
@@ -41,7 +41,7 @@
 #ifdef CONTIKI_TARGET_MBXXX
 extern char __Stack_Init, _estack;
 
-static inline void check_stack() {
+INLINE_API void check_stack() {
   const char *p = &__Stack_Init;
   while (p < &_estack && *p == 0x38) {
     p++;
@@ -50,13 +50,13 @@ static inline void check_stack() {
   PRINTF("Stack: %d bytes used (%d free)\n", &_estack - p, p - &__Stack_Init);
 }
 #else /* CONTIKI_TARGET_MBXXX */
-static inline void check_stack() {
+INLINE_API void check_stack() {
 }
 #endif /* CONTIKI_TARGET_MBXXX */
 #else /* WITH_CONTKI */
 #define PRINTF(...)
 
-static inline void check_stack() {
+INLINE_API void check_stack() {
 }
 #endif
 
@@ -102,28 +102,28 @@ void dtls_dsrv_log_addr(log_t level, const char *name, const session_t *addr);
 
 #else /* NDEBUG */
 
-static inline log_t dtls_get_log_level()
+INLINE_API log_t dtls_get_log_level()
 {
   return DTLS_LOG_EMERG;
 }
 
-static inline void dtls_set_log_level(log_t level)
+INLINE_API void dtls_set_log_level(log_t level)
 {}
 
-static inline void dsrv_log(log_t level, char *format, ...)
+INLINE_API void dsrv_log(log_t level, char *format, ...)
 {}
 
-static inline void hexdump(const unsigned char *packet, int length)
+INLINE_API void hexdump(const unsigned char *packet, int length)
 {}
 
-static inline void dump(unsigned char *buf, size_t len)
+INLINE_API void dump(unsigned char *buf, size_t len)
 {}
 
-static inline void
+INLINE_API void
 dtls_dsrv_hexdump_log(log_t level, const char *name, const unsigned char *buf, size_t length, int extend)
 {}
 
-static inline void
+INLINE_API void
 dtls_dsrv_log_addr(log_t level, const char *name, const struct __session_t *addr)
 {}
 
index 657eab0..f3d7537 100644 (file)
 #include "dtls_config.h"
 #include "dtls_time.h"
 
-#if defined(__msys_nt__)
-#define _CRT_RAND_S
-#endif
-
 #include <stdio.h>
 #include <stdlib.h>
 #ifdef HAVE_ASSERT_H
@@ -142,23 +138,23 @@ PROCESS(dtls_retransmit_process, "DTLS retransmit process");
 
 static dtls_context_t the_dtls_context;
 
-static inline dtls_context_t *
+INLINE_API dtls_context_t *
 malloc_context() {
   return &the_dtls_context;
 }
 
-static inline void
+INLINE_API void
 free_context(dtls_context_t *context) {
 }
 
 #else /* WITH_CONTIKI */
 
-static inline dtls_context_t *
+INLINE_API dtls_context_t *
 malloc_context() {
   return (dtls_context_t *)malloc(sizeof(dtls_context_t));
 }
 
-static inline void
+INLINE_API void
 free_context(dtls_context_t *context) {
   free(context);
 }
@@ -409,7 +405,7 @@ is_record(uint8 *msg, size_t msglen) {
  * \return pointer to the next byte after the written header.
  * The length will be set to 0 and has to be changed before sending.
  */ 
-static inline uint8 *
+INLINE_API uint8 *
 dtls_set_record_header(uint8 type, dtls_security_parameters_t *security,
                       uint8 *buf) {
   
@@ -443,7 +439,7 @@ dtls_set_record_header(uint8 type, dtls_security_parameters_t *security,
  * bytes. Increments message sequence number counter of \p peer.
  * \return pointer to the next byte after \p buf
  */ 
-static inline uint8 *
+INLINE_API uint8 *
 dtls_set_handshake_header(uint8 type, dtls_peer_t *peer, 
                          int length, 
                          int frag_offset, int frag_length, 
@@ -481,7 +477,7 @@ static uint8 compression_methods[] = {
 };
 
 /** returns true if the cipher matches TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 */
-static inline int is_tls_ecdhe_ecdsa_with_aes_128_ccm_8(dtls_cipher_t cipher)
+INLINE_API int is_tls_ecdhe_ecdsa_with_aes_128_ccm_8(dtls_cipher_t cipher)
 {
 #if defined(DTLS_ECC) || defined(DTLS_X509)
   return cipher == TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8;
@@ -491,7 +487,7 @@ static inline int is_tls_ecdhe_ecdsa_with_aes_128_ccm_8(dtls_cipher_t cipher)
 }
 
 /** returns true if the cipher matches TLS_PSK_WITH_AES_128_CCM_8 */
-static inline int is_tls_psk_with_aes_128_ccm_8(dtls_cipher_t cipher)
+INLINE_API int is_tls_psk_with_aes_128_ccm_8(dtls_cipher_t cipher)
 {
 #ifdef DTLS_PSK
   return cipher == TLS_PSK_WITH_AES_128_CCM_8;
@@ -501,7 +497,7 @@ static inline int is_tls_psk_with_aes_128_ccm_8(dtls_cipher_t cipher)
 }
 
 /** returns true if the cipher matches TLS_ECDH_anon_WITH_AES_128_CBC_SHA_256 */
-static inline int is_tls_ecdh_anon_with_aes_128_cbc_sha_256(dtls_cipher_t cipher)
+INLINE_API int is_tls_ecdh_anon_with_aes_128_cbc_sha_256(dtls_cipher_t cipher)
 {
 #ifdef DTLS_ECC
     return cipher == TLS_ECDH_anon_WITH_AES_128_CBC_SHA_256;
@@ -511,7 +507,7 @@ static inline int is_tls_ecdh_anon_with_aes_128_cbc_sha_256(dtls_cipher_t cipher
 }
 
 /** returns true if the cipher matches TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA_256 */
-static inline int is_tls_ecdhe_psk_with_aes_128_cbc_sha_256(dtls_cipher_t cipher)
+INLINE_API int is_tls_ecdhe_psk_with_aes_128_cbc_sha_256(dtls_cipher_t cipher)
 {
 #if defined(DTLS_ECC) && defined(DTLS_PSK)
   return cipher == TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA_256;
@@ -523,7 +519,7 @@ static inline int is_tls_ecdhe_psk_with_aes_128_cbc_sha_256(dtls_cipher_t cipher
 
 
 /** returns true if the application is configured for psk */
-static inline int is_psk_supported(dtls_context_t *ctx)
+INLINE_API int is_psk_supported(dtls_context_t *ctx)
 {
 #ifdef DTLS_PSK
   return ctx && ctx->h && ctx->h->get_psk_info;
@@ -533,7 +529,7 @@ static inline int is_psk_supported(dtls_context_t *ctx)
 }
 
 /** returns true if the application is configured for ecdhe_ecdsa */
-static inline int is_ecdsa_supported(dtls_context_t *ctx, int is_client)
+INLINE_API int is_ecdsa_supported(dtls_context_t *ctx, int is_client)
 {
 #ifdef DTLS_ECC
   return ctx && ctx->h && ((!is_client && ctx->h->get_ecdsa_key) ||
@@ -544,7 +540,7 @@ static inline int is_ecdsa_supported(dtls_context_t *ctx, int is_client)
 }
 
 /** returns true if the application is configured for x509 */
-static inline int is_x509_supported(dtls_context_t *ctx, int is_client)
+INLINE_API int is_x509_supported(dtls_context_t *ctx, int is_client)
 {
 #ifdef DTLS_X509
   return ctx && ctx->h && ((!is_client && ctx->h->get_x509_cert) ||
@@ -556,7 +552,7 @@ static inline int is_x509_supported(dtls_context_t *ctx, int is_client)
 
 /** Returns true if the application is configured for ecdhe_ecdsa with
   * client authentication */
-static inline int is_ecdsa_client_auth_supported(dtls_context_t *ctx)
+INLINE_API int is_ecdsa_client_auth_supported(dtls_context_t *ctx)
 {
 #ifdef DTLS_ECC
   return ctx && ctx->h && ctx->h->get_ecdsa_key && ctx->h->verify_ecdsa_key;
@@ -567,7 +563,7 @@ static inline int is_ecdsa_client_auth_supported(dtls_context_t *ctx)
 
 /** Returns true if the application is configured for x509 with
   * client authentication */
-static inline int is_x509_client_auth_supported(dtls_context_t *ctx)
+INLINE_API int is_x509_client_auth_supported(dtls_context_t *ctx)
 {
 #ifdef DTLS_X509
   return ctx && ctx->h && ctx->h->get_x509_cert && ctx->h->verify_x509_cert;
@@ -577,7 +573,7 @@ static inline int is_x509_client_auth_supported(dtls_context_t *ctx)
 }
 
 /** returns true if ecdh_anon_with_aes_128_cbc_sha is supported */
-static inline int is_ecdh_anon_supported(dtls_context_t *ctx)
+INLINE_API int is_ecdh_anon_supported(dtls_context_t *ctx)
 {
 #ifdef DTLS_ECC
     return ctx &&  (ctx->is_anon_ecdh_eabled == DTLS_CIPHER_ENABLE);
@@ -587,7 +583,7 @@ static inline int is_ecdh_anon_supported(dtls_context_t *ctx)
 }
 
 /** returns true if ecdhe_psk_with_aes_128_cbc_sha_256 is supported */
-static inline int is_ecdhe_psk_supported(dtls_context_t *ctx)
+INLINE_API int is_ecdhe_psk_supported(dtls_context_t *ctx)
 {
 #if defined(DTLS_ECC) && defined(DTLS_PSK)
     return is_psk_supported(ctx);
@@ -1177,7 +1173,7 @@ error:
  * Parse the ClientKeyExchange and update the internal handshake state with
  * the new data.
  */
-static inline int
+INLINE_API int
 check_client_keyexchange(dtls_context_t *ctx, 
                         dtls_handshake_parameters_t *handshake,
                         uint8 *data, size_t length) {
@@ -1293,7 +1289,7 @@ check_client_keyexchange(dtls_context_t *ctx,
   return 0;
 }
 
-static inline void
+INLINE_API void
 update_hs_hash(dtls_peer_t *peer, uint8 *data, size_t length) {
   dtls_debug_dump("add MAC data", data, length);
   dtls_hash_update(&peer->handshake_params->hs_state.hs_hash, data, length);
@@ -1305,12 +1301,12 @@ copy_hs_hash(dtls_peer_t *peer, dtls_hash_ctx *hs_hash) {
         sizeof(peer->handshake_params->hs_state.hs_hash));
 }
 
-static inline size_t
+INLINE_API size_t
 finalize_hs_hash(dtls_peer_t *peer, uint8 *buf) {
   return dtls_hash_finalize(buf, &peer->handshake_params->hs_state.hs_hash);
 }
 
-static inline void
+INLINE_API void
 clear_hs_hash(dtls_peer_t *peer) {
   assert(peer);
   dtls_debug("clear MAC\n");
@@ -1759,7 +1755,7 @@ dtls_send_multi(dtls_context_t *ctx, dtls_peer_t *peer,
   return res <= 0 ? res : overall_len - (len - res);
 }
 
-static inline int
+INLINE_API int
 dtls_send_alert(dtls_context_t *ctx, dtls_peer_t *peer, dtls_alert_level_t level,
                dtls_alert_t description) {
   uint8_t msg[] = { level, description };
@@ -2610,7 +2606,7 @@ dtls_send_server_hello_msgs(dtls_context_t *ctx, dtls_peer_t *peer)
   return 0;
 }
 
-static inline int 
+INLINE_API int 
 dtls_send_ccs(dtls_context_t *ctx, dtls_peer_t *peer) {
   uint8 buf[1] = {1};
 
@@ -4588,11 +4584,11 @@ dtls_context_t *
 dtls_new_context(void *app_data) {
   dtls_context_t *c;
   dtls_tick_t now;
-#if defined(__msys_nt__)
+#if defined(_WIN32)
   unsigned int randValue;
   errno_t err;
 #endif
-#if !defined(WITH_CONTIKI) && !defined(__msys_nt__)
+#if !defined(WITH_CONTIKI) && !defined(_WIN32)
   FILE *urandom = fopen("/dev/urandom", "r");
   unsigned char buf[sizeof(unsigned long)];
 #endif /* WITH_CONTIKI */
@@ -4601,7 +4597,7 @@ dtls_new_context(void *app_data) {
 #ifdef WITH_CONTIKI
   /* FIXME: need something better to init PRNG here */
   dtls_prng_init(now);
-#elif defined(__msys_nt__)
+#elif defined(_WIN32)
   err = rand_s(&randValue);
   if (err != 0)
   {
index 7cdaab2..5c23ca3 100644 (file)
@@ -368,7 +368,7 @@ void dtls_free_context(dtls_context_t *ctx);
 #define dtls_get_app_data(CTX) ((CTX)->app)
 
 /** Sets the callback handler object for @p ctx to @p h. */
-static inline void dtls_set_handler(dtls_context_t *ctx, dtls_handler_t *h) {
+INLINE_API void dtls_set_handler(dtls_context_t *ctx, dtls_handler_t *h) {
   ctx->h = h;
 }
 
@@ -454,8 +454,14 @@ void dtls_check_retransmit(dtls_context_t *context, clock_time_t *next);
 #define DTLS_CT_HANDSHAKE          22
 #define DTLS_CT_APPLICATION_DATA   23
 
+#if defined(_MSC_VER)
+#define PACKED_STRUCT __pragma(pack(1)) typedef struct
+#else
+#define PACKED_STRUCT typedef struct __attribute__((__packed__))
+#endif
+
 /** Generic header structure of the DTLS record layer. */
-typedef struct __attribute__((__packed__)) {
+PACKED_STRUCT {
   uint8 content_type;          /**< content type of the included message */
   uint16 version;              /**< Protocol version */
   uint16 epoch;                        /**< counter for cipher state changes */
@@ -479,7 +485,7 @@ typedef struct __attribute__((__packed__)) {
 #define DTLS_HT_FINISHED            20
 
 /** Header structure for the DTLS handshake protocol. */
-typedef struct __attribute__((__packed__)) {
+PACKED_STRUCT {
   uint8 msg_type; /**< Type of handshake message  (one of DTLS_HT_) */
   uint24 length;  /**< length of this message */
   uint16 message_seq;  /**< Message sequence number */
@@ -489,7 +495,7 @@ typedef struct __attribute__((__packed__)) {
 } dtls_handshake_header_t;
 
 /** Structure of the Client Hello message. */
-typedef struct __attribute__((__packed__)) {
+PACKED_STRUCT {
   uint16 version;        /**< Client version */
   uint32 gmt_random;     /**< GMT time of the random byte creation */
   unsigned char random[28];    /**< Client random bytes */
@@ -500,7 +506,7 @@ typedef struct __attribute__((__packed__)) {
 } dtls_client_hello_t;
 
 /** Structure of the Hello Verify Request. */
-typedef struct __attribute__((__packed__)) {
+PACKED_STRUCT {
   uint16 version;              /**< Server version */
   uint8 cookie_length; /**< Length of the included cookie */
   uint8 cookie[];              /**< up to 32 bytes making up the cookie */
index c786afb..6137c29 100644 (file)
@@ -73,7 +73,7 @@
 #define DTLS_X509 1
 
 /* Define to 1 if you have the <arpa/inet.h> header file. */
-#if !defined(__msys_nt__)
+#ifndef _WIN32
 #define HAVE_ARPA_INET_H 1
 #endif
 
 #define HAVE_MEMSET 1
 
 /* Define to 1 if you have the <netdb.h> header file. */
+#ifndef _WIN32
 #define HAVE_NETDB_H 1
+#endif
 
 /* Define to 1 if you have the <netinet/in.h> header file. */
+#ifndef _WIN32
 #define HAVE_NETINET_IN_H 1
+#endif
 
 /* Define to 1 if you have the `select' function. */
 #define HAVE_SELECT 1
 #define HAVE_SYS_PARAM_H 1
 
 /* Define to 1 if you have the <sys/socket.h> header file. */
+#ifndef _WIN32
 #define HAVE_SYS_SOCKET_H 1
+#endif
 
 /* Define to 1 if you have the <sys/stat.h> header file. */
 #define HAVE_SYS_STAT_H 1
 
 /* Define to 1 if you have the <sys/time.h> header file. */
+#ifndef _WIN32
 #define HAVE_SYS_TIME_H 1
+#endif
 
 /* Define to 1 if you have the <sys/types.h> header file. */
 #define HAVE_SYS_TYPES_H 1
 /* Define to `unsigned int' if <sys/types.h> does not define. */
 
 /* #undef size_t */
+#if defined(_MSC_VER) && (_MSC_VER < 1900)
+#define ssize_t SSIZE_T
+#define snprintf _snprintf
+#endif
+#if defined(_WIN32)
+#define MSG_DONTWAIT 0
+#define HAVE_WINSOCK2_H 1
+#define HAVE_WS2TCPIP_H 1
+#endif
 
 /************************************************************************/
 /* Specific Contiki platforms                                           */
index 88c292a..3018091 100644 (file)
@@ -47,12 +47,20 @@ dtls_ticks(dtls_tick_t *t) {
 }
 
 #else /* WITH_CONTIKI */
+#ifdef _WIN32
+#include <windows.h>
+#endif
 
 time_t dtls_clock_offset;
 
 void
 dtls_clock_init(void) {
+#ifdef _WIN32
+  /* Use clock offset in milliseconds */
+  dtls_clock_offset = GetTickCount();
+#else
 #ifdef HAVE_TIME_H
+  /* Use clock offset in seconds */
   dtls_clock_offset = time(NULL);
 #else
 #  ifdef __GNUC__
@@ -62,9 +70,13 @@ dtls_clock_init(void) {
 #  endif
   dtls_clock_offset = 0;
 #endif
+#endif
 }
 
 void dtls_ticks(dtls_tick_t *t) {
+#ifdef _WIN32
+  *t = ((GetTickCount() - dtls_clock_offset) * DTLS_TICKS_PER_SECOND / 1000);
+#else
 #ifdef HAVE_SYS_TIME_H
   struct timeval tv;
   gettimeofday(&tv, NULL);
@@ -73,6 +85,7 @@ void dtls_ticks(dtls_tick_t *t) {
 #else
 #error "clock not implemented"
 #endif
+#endif
 }
 
 #endif /* WITH_CONTIKI */
index 82ff062..6541b1c 100644 (file)
@@ -32,7 +32,9 @@
 #define _DTLS_DTLS_TIME_H_
 
 #include <stdint.h>
+#ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
+#endif
 
 #include "tinydtls.h"
 
index 75877fd..8f947e7 100644 (file)
@@ -115,7 +115,7 @@ typedef enum {
 /**
  * XORs \p n bytes byte-by-byte starting at \p y to the memory area
  * starting at \p x. */
-static inline void
+INLINE_API void
 memxor(unsigned char *x, const unsigned char *y, size_t n) {
   while(n--) {
     *x ^= *y;
@@ -133,7 +133,7 @@ memxor(unsigned char *x, const unsigned char *y, size_t n) {
  * \param len Number of bytes to compare.
  * \return \c 1 if \p a and \p b are equal, \c 0 otherwise.
  */
-static inline int
+INLINE_API int
 equals(unsigned char *a, unsigned char *b, size_t len) {
   int result = 1;
   while (len--) {
@@ -145,7 +145,7 @@ equals(unsigned char *a, unsigned char *b, size_t len) {
 #ifdef HAVE_FLS
 #define dtls_fls(i) fls(i)
 #else
-static inline int
+INLINE_API int
 dtls_fls(unsigned int i) {
   int n;
   for (n = 0; i; n++)
index 0a9b8f7..571a59a 100644 (file)
 #ifndef WITH_CONTIKI
 #include <stdlib.h>
 
-static inline dtls_hmac_context_t *
+INLINE_API dtls_hmac_context_t *
 dtls_hmac_context_new() {
   return (dtls_hmac_context_t *)malloc(sizeof(dtls_hmac_context_t));
 }
 
-static inline void
+INLINE_API void
 dtls_hmac_context_free(dtls_hmac_context_t *ctx) {
   free(ctx);
 }
@@ -56,12 +56,12 @@ dtls_hmac_context_free(dtls_hmac_context_t *ctx) {
 #include "memb.h"
 MEMB(hmac_context_storage, dtls_hmac_context_t, DTLS_HASH_MAX);
 
-static inline dtls_hmac_context_t *
+INLINE_API dtls_hmac_context_t *
 dtls_hmac_context_new() {
   return (dtls_hmac_context_t *)memb_alloc(&hmac_context_storage);
 }
 
-static inline void
+INLINE_API void
 dtls_hmac_context_free(dtls_hmac_context_t *ctx) {
   memb_free(&hmac_context_storage, ctx);
 }
index afdfaea..22cca9b 100644 (file)
@@ -39,17 +39,17 @@ typedef DTLS_SHA256_CTX dtls_hash_ctx;
 typedef dtls_hash_ctx *dtls_hash_t;
 #define DTLS_HASH_CTX_SIZE sizeof(DTLS_SHA256_CTX)
 
-static inline void
+INLINE_API void
 dtls_hash_init(dtls_hash_t ctx) {
   DTLS_SHA256_Init((DTLS_SHA256_CTX *)ctx);
 }
 
-static inline void 
+INLINE_API void 
 dtls_hash_update(dtls_hash_t ctx, const unsigned char *input, size_t len) {
   DTLS_SHA256_Update((DTLS_SHA256_CTX *)ctx, input, len);
 }
 
-static inline size_t
+INLINE_API size_t
 dtls_hash_finalize(unsigned char *buf, dtls_hash_t ctx) {
   DTLS_SHA256_Final(buf, (DTLS_SHA256_CTX *)ctx);
   return DTLS_SHA256_DIGEST_LENGTH;
@@ -57,7 +57,7 @@ dtls_hash_finalize(unsigned char *buf, dtls_hash_t ctx) {
 #endif /* WITH_SHA256 */
 
 #ifndef WITH_CONTIKI
-static inline void dtls_hmac_storage_init()
+INLINE_API void dtls_hmac_storage_init()
 { }
 #else
 void dtls_hmac_storage_init();
index 0a10a50..8589858 100644 (file)
 #ifndef WITH_CONTIKI
 #include <stdlib.h>
 
-static inline netq_t *
+INLINE_API netq_t *
 netq_malloc_node(size_t size) {
   return (netq_t *)malloc(sizeof(netq_t) + size);
 }
 
-static inline void
+INLINE_API void
 netq_free_node(netq_t *node) {
   free(node);
 }
@@ -41,12 +41,12 @@ netq_free_node(netq_t *node) {
 
 MEMB(netq_storage, netq_t, NETQ_MAXCNT);
 
-static inline netq_t *
+INLINE_API netq_t *
 netq_malloc_node(size_t size) {
   return (netq_t *)memb_alloc(&netq_storage);
 }
 
-static inline void
+INLINE_API void
 netq_free_node(netq_t *node) {
   memb_free(&netq_storage, node);
 }
index fea7511..c3db339 100644 (file)
@@ -55,7 +55,7 @@ typedef struct netq_t {
 } netq_t;
 
 #ifndef WITH_CONTIKI
-static inline void netq_init()
+INLINE_API void netq_init()
 { }
 #else
 void netq_init();
index e319f5b..5af0c4c 100644 (file)
 #endif
 
 /* this one is for consistency... */
-static inline int dtls_int_to_uint8(unsigned char *field, uint8_t value)
+INLINE_API int dtls_int_to_uint8(unsigned char *field, uint8_t value)
 {
   field[0] = value & 0xff;
   return 1;
 }
 
-static inline int dtls_int_to_uint16(unsigned char *field, uint16_t value)
+INLINE_API int dtls_int_to_uint16(unsigned char *field, uint16_t value)
 {
   field[0] = (value >> 8) & 0xff;
   field[1] = value & 0xff;
   return 2;
 }
 
-static inline int dtls_int_to_uint24(unsigned char *field, uint32_t value)
+INLINE_API int dtls_int_to_uint24(unsigned char *field, uint32_t value)
 {
   field[0] = (value >> 16) & 0xff;
   field[1] = (value >> 8) & 0xff;
@@ -58,7 +58,7 @@ static inline int dtls_int_to_uint24(unsigned char *field, uint32_t value)
   return 3;
 }
 
-static inline int dtls_int_to_uint32(unsigned char *field, uint32_t value)
+INLINE_API int dtls_int_to_uint32(unsigned char *field, uint32_t value)
 {
   field[0] = (value >> 24) & 0xff;
   field[1] = (value >> 16) & 0xff;
@@ -67,7 +67,7 @@ static inline int dtls_int_to_uint32(unsigned char *field, uint32_t value)
   return 4;
 }
 
-static inline int dtls_int_to_uint48(unsigned char *field, uint64_t value)
+INLINE_API int dtls_int_to_uint48(unsigned char *field, uint64_t value)
 {
   field[0] = (value >> 40) & 0xff;
   field[1] = (value >> 32) & 0xff;
@@ -78,7 +78,7 @@ static inline int dtls_int_to_uint48(unsigned char *field, uint64_t value)
   return 6;
 }
 
-static inline int dtls_int_to_uint64(unsigned char *field, uint64_t value)
+INLINE_API int dtls_int_to_uint64(unsigned char *field, uint64_t value)
 {
   field[0] = (value >> 56) & 0xff;
   field[1] = (value >> 48) & 0xff;
@@ -91,25 +91,25 @@ static inline int dtls_int_to_uint64(unsigned char *field, uint64_t value)
   return 8;
 }
 
-static inline uint8_t dtls_uint8_to_int(const unsigned char *field)
+INLINE_API uint8_t dtls_uint8_to_int(const unsigned char *field)
 {
   return (uint8_t)field[0];
 }
 
-static inline uint16_t dtls_uint16_to_int(const unsigned char *field)
+INLINE_API uint16_t dtls_uint16_to_int(const unsigned char *field)
 {
   return ((uint16_t)field[0] << 8)
         | (uint16_t)field[1];
 }
 
-static inline uint32_t dtls_uint24_to_int(const unsigned char *field)
+INLINE_API uint32_t dtls_uint24_to_int(const unsigned char *field)
 {
   return ((uint32_t)field[0] << 16)
         | ((uint32_t)field[1] << 8)
         | (uint32_t)field[2];
 }
 
-static inline uint32_t dtls_uint32_to_int(const unsigned char *field)
+INLINE_API uint32_t dtls_uint32_to_int(const unsigned char *field)
 {
   return ((uint32_t)field[0] << 24)
         | ((uint32_t)field[1] << 16)
@@ -117,7 +117,7 @@ static inline uint32_t dtls_uint32_to_int(const unsigned char *field)
         | (uint32_t)field[3];
 }
 
-static inline uint64_t dtls_uint48_to_int(const unsigned char *field)
+INLINE_API uint64_t dtls_uint48_to_int(const unsigned char *field)
 {
   return ((uint64_t)field[0] << 40)
         | ((uint64_t)field[1] << 32)
@@ -127,7 +127,7 @@ static inline uint64_t dtls_uint48_to_int(const unsigned char *field)
         | (uint64_t)field[5];
 }
 
-static inline uint64_t dtls_uint64_to_int(const unsigned char *field)
+INLINE_API uint64_t dtls_uint64_to_int(const unsigned char *field)
 {
   return ((uint64_t)field[0] << 56)
         | ((uint64_t)field[1] << 48)
index 8f2876c..109a612 100644 (file)
@@ -32,7 +32,7 @@ void peer_init()
 {
 }
 
-static inline dtls_peer_t *
+INLINE_API dtls_peer_t *
 dtls_malloc_peer() {
   return (dtls_peer_t *)malloc(sizeof(dtls_peer_t));
 }
@@ -54,7 +54,7 @@ peer_init() {
   memb_init(&peer_storage);
 }
 
-static inline dtls_peer_t *
+INLINE_API dtls_peer_t *
 dtls_malloc_peer() {
   return memb_alloc(&peer_storage);
 }
index af7c205..41fd943 100644 (file)
@@ -65,7 +65,7 @@ typedef struct dtls_peer_t {
   dtls_handshake_parameters_t *handshake_params;
 } dtls_peer_t;
 
-static inline dtls_security_parameters_t *dtls_security_params_epoch(dtls_peer_t *peer, uint16_t epoch)
+INLINE_API dtls_security_parameters_t *dtls_security_params_epoch(dtls_peer_t *peer, uint16_t epoch)
 {
   if (peer->security_params[0] && peer->security_params[0]->epoch == epoch) {
     return peer->security_params[0];
@@ -76,12 +76,12 @@ static inline dtls_security_parameters_t *dtls_security_params_epoch(dtls_peer_t
   }
 }
 
-static inline dtls_security_parameters_t *dtls_security_params(dtls_peer_t *peer)
+INLINE_API dtls_security_parameters_t *dtls_security_params(dtls_peer_t *peer)
 {
   return peer->security_params[0];
 }
 
-static inline dtls_security_parameters_t *dtls_security_params_next(dtls_peer_t *peer)
+INLINE_API dtls_security_parameters_t *dtls_security_params_next(dtls_peer_t *peer)
 {
   if (peer->security_params[1])
     dtls_security_free(peer->security_params[1]);
@@ -94,7 +94,7 @@ static inline dtls_security_parameters_t *dtls_security_params_next(dtls_peer_t
   return peer->security_params[1];
 }
 
-static inline void dtls_security_params_free_other(dtls_peer_t *peer)
+INLINE_API void dtls_security_params_free_other(dtls_peer_t *peer)
 {
   dtls_security_parameters_t * security0 = peer->security_params[0];
   dtls_security_parameters_t * security1 = peer->security_params[1];
@@ -106,7 +106,7 @@ static inline void dtls_security_params_free_other(dtls_peer_t *peer)
   peer->security_params[1] = NULL;
 }
 
-static inline void dtls_security_params_switch(dtls_peer_t *peer)
+INLINE_API void dtls_security_params_switch(dtls_peer_t *peer)
 {
   dtls_security_parameters_t * security = peer->security_params[1];
 
@@ -133,7 +133,7 @@ dtls_peer_t *dtls_new_peer(const session_t *session);
 void dtls_free_peer(dtls_peer_t *peer);
 
 /** Returns the current state of @p peer. */
-static inline dtls_state_t dtls_peer_state(const dtls_peer_t *peer) {
+INLINE_API dtls_state_t dtls_peer_state(const dtls_peer_t *peer) {
   return peer->state;
 }
 
@@ -141,7 +141,7 @@ static inline dtls_state_t dtls_peer_state(const dtls_peer_t *peer) {
  * Checks if given @p peer is connected. This function returns
  * @c 1 if connected, or @c 0 otherwise.
  */
-static inline int dtls_peer_is_connected(const dtls_peer_t *peer) {
+INLINE_API int dtls_peer_is_connected(const dtls_peer_t *peer) {
   return peer->state == DTLS_STATE_CONNECTED;
 }
 
index 48c1f95..daf956b 100644 (file)
  * implementation for prng().  You might want to change prng() to use
  * a better PRNG on your specific platform.
  */
-static inline int
+INLINE_API int
 dtls_prng(unsigned char *buf, size_t len) {
   while (len--)
     *buf++ = rand() & 0xFF;
   return 1;
 }
 
-static inline void
+INLINE_API void
 dtls_prng_init(unsigned short seed) {
        srand(seed);
 }
@@ -45,7 +45,7 @@ dtls_prng_init(unsigned short seed) {
 #include "random.h"
 
 #ifdef HAVE_PRNG
-static inline int
+INLINE_API int
 dtls_prng(unsigned char *buf, size_t len)
 {
        return contiki_prng_impl(buf, len);
@@ -56,7 +56,7 @@ dtls_prng(unsigned char *buf, size_t len)
  * implementation for prng().  You might want to change prng() to use
  * a better PRNG on your specific platform.
  */
-static inline int
+INLINE_API int
 dtls_prng(unsigned char *buf, size_t len) {
   unsigned short v = random_rand();
   while (len > sizeof(v)) {
@@ -71,7 +71,7 @@ dtls_prng(unsigned char *buf, size_t len) {
 }
 #endif /* HAVE_PRNG */
 
-static inline void
+INLINE_API void
 dtls_prng_init(unsigned short seed) {
        random_init(seed);
 }
index 9acf565..51155b0 100644 (file)
@@ -44,7 +44,7 @@
 
 #else /* WITH_CONTIKI */
 
-static inline int 
+INLINE_API int 
 _dtls_address_equals_impl(const session_t *a,
                          const session_t *b) {
   if (a->ifindex != b->ifindex ||
index f6d1d3d..bd848f2 100644 (file)
 
 #ifndef _DTLS_SESSION_H_
 #define _DTLS_SESSION_H_
-#include <stdint.h>
+
 #include <string.h>
 
+#include "dtls_config.h"
 #include "tinydtls.h"
 #include "global.h"
 
@@ -41,14 +42,24 @@ typedef struct {
 } session_t;
 
 #else /* WITH_CONTIKI */
-#if defined(__msys_nt__)
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#else
+
+#ifdef HAVE_SYS_SOCKET_H
 #include <sys/socket.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
 #include <netinet/in.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
 #include <arpa/inet.h>
 #endif
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+#include <stdint.h>
+
 typedef struct {
   socklen_t size;              /**< size of addr */
   union {
index eb72991..1c3fba9 100644 (file)
@@ -92,28 +92,28 @@ struct list {
     (struct_ptr)->LIST_CONCAT(name,_list) = NULL;                      \
   }
 
-static inline void *
+INLINE_API void *
 list_head(list_t list) {
   return *list;
 }
 
-static inline void 
+INLINE_API void 
 list_remove(list_t list, void *item) {
   LL_DELETE(*(struct list **)list, (struct list *)item);
 }
 
-static inline void 
+INLINE_API void 
 list_add(list_t list, void *item) {
   list_remove(list, item);
   LL_APPEND(*(struct list **)list, (struct list *)item);
 }
 
-static inline void 
+INLINE_API void 
 list_push(list_t list, void *item) {
   LL_PREPEND(*(struct list **)list, (struct list *)item);
 }
 
-static inline void *
+INLINE_API void *
 list_pop(list_t list) {
   struct list *l;
   l = *list;
@@ -123,7 +123,7 @@ list_pop(list_t list) {
   return l;
 }
 
-static inline void
+INLINE_API void
 list_insert(list_t list, void *previtem, void *newitem) {
   if(previtem == NULL) {
     list_push(list, newitem);
@@ -133,7 +133,7 @@ list_insert(list_t list, void *previtem, void *newitem) {
   } 
 }
 
-static inline void *
+INLINE_API void *
 list_item_next(void *item)
 {
   return item == NULL? NULL: ((struct list *)item)->next;
index 595ee10..08f1a30 100644 (file)
@@ -485,7 +485,11 @@ static void dtls_handle_signal(int sig)
   dtls_free_context(dtls_context);
   dtls_free_context(orig_dtls_context);
   signal(sig, SIG_DFL);
+#ifdef _WIN32
+  exit(sig);
+#else
   kill(getpid(), sig);
+#endif
 }
 
 /* stolen from libcoap: */
@@ -792,7 +796,7 @@ main(int argc, char **argv) {
     return 0;
   }
 
-  if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) ) < 0) {
+  if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, OPTVAL_T(&on), sizeof(on) ) < 0) {
     dtls_alert("setsockopt SO_REUSEADDR: %s\n", strerror(errno));
   }
 #if 0
@@ -804,9 +808,9 @@ main(int argc, char **argv) {
 #endif
   on = 1;
 #ifdef IPV6_RECVPKTINFO
-  if (setsockopt(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &on, sizeof(on) ) < 0) {
+  if (setsockopt(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, OPTVAL_T(&on), sizeof(on) ) < 0) {
 #else /* IPV6_RECVPKTINFO */
-  if (setsockopt(fd, IPPROTO_IPV6, IPV6_PKTINFO, &on, sizeof(on) ) < 0) {
+  if (setsockopt(fd, IPPROTO_IPV6, IPV6_PKTINFO, OPTVAL_T(&on), sizeof(on) ) < 0) {
 #endif /* IPV6_RECVPKTINFO */
     dtls_alert("setsockopt IPV6_PKTINFO: %s\n", strerror(errno));
   }
index a3ede4d..9a8918a 100644 (file)
@@ -6,13 +6,25 @@
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
 #include <netinet/in.h>
+#endif
 #include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
 #include <sys/socket.h>
+#endif
+#ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
+#endif
+#ifdef HAVE_NETDB_H
 #include <netdb.h>
+#endif
 #include <signal.h>
+#include <getopt.h>
+#include "platform_features.h"
 
 #include "tinydtls.h"
 #include "dtls.h"
@@ -664,7 +676,7 @@ main(int argc, char **argv) {
     return 0;
   }
 
-  if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) ) < 0) {
+  if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, OPTVAL_T(&on), sizeof(on) ) < 0) {
     dtls_alert("setsockopt SO_REUSEADDR: %s\n", strerror(errno));
   }
 #if 0
@@ -676,9 +688,9 @@ main(int argc, char **argv) {
 #endif
   on = 1;
 #ifdef IPV6_RECVPKTINFO
-  if (setsockopt(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &on, sizeof(on) ) < 0) {
+  if (setsockopt(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, OPTVAL_T(&on), sizeof(on) ) < 0) {
 #else /* IPV6_RECVPKTINFO */
-  if (setsockopt(fd, IPPROTO_IPV6, IPV6_PKTINFO, &on, sizeof(on) ) < 0) {
+  if (setsockopt(fd, IPPROTO_IPV6, IPV6_PKTINFO, OPTVAL_T(&on), sizeof(on) ) < 0) {
 #endif /* IPV6_RECVPKTINFO */
     dtls_alert("setsockopt IPV6_PKTINFO: %s\n", strerror(errno));
   }
index ac849ef..eca7ff7 100644 (file)
 /** Define to 1 if building with Hardware Abstraction Layer */
 #define DTLS_CRYPTO_HAL 0
 
+#ifndef INLINE_API
+#  if defined(__cplusplus)
+#    define INLINE_API inline
+#  else
+#    ifdef _WIN32
+#      define INLINE_API static __inline
+#    else
+#      define INLINE_API static inline
+#    endif
+#  endif
+#endif
+
 #endif /* _DTLS_TINYDTLS_H_ */
index 9cd4532..dd72b7d 100644 (file)
@@ -338,11 +338,11 @@ do {
     (head)=(head)->next;                                                                       \
   } else {                                                                                     \
     char *_tmp = (char*)(head);                                                                \
-    while (head->next && (head->next != (del))) {                                              \
-      head = head->next;                                                                       \
+    while ((head)->next && ((head)->next != (del))) {                                          \
+      (head) = (head)->next;                                                                   \
     }                                                                                          \
-    if (head->next) {                                                                          \
-      head->next = ((del)->next);                                                              \
+    if ((head)->next) {                                                                        \
+      (head)->next = ((del)->next);                                                            \
     }                                                                                          \
     {                                                                                          \
       char **_head_alias = (char**)&(head);                                                    \
index 4a02ed1..cea769f 100644 (file)
@@ -49,6 +49,9 @@
 #include <ctype.h>
 #include <linux/time.h>
 #endif
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
+#endif
 #include "ocrandom.h"
 #include <stdio.h>
 
@@ -117,6 +120,11 @@ int8_t OCSeedRandom()
     struct timespec getTs;
     clock_gettime(CLOCK_MONOTONIC, &getTs);
     currentTime = (getTs.tv_sec * (uint64_t)NANO_SEC + getTs.tv_nsec)/1000;
+#elif _WIN32
+    LARGE_INTEGER count;
+    if (QueryPerformanceCounter(&count)) {
+        currentTime = count.QuadPart;
+    }
 #elif  _POSIX_TIMERS > 0
     struct timespec ts;
     clock_gettime(CLOCK_MONOTONIC, &ts);
index 3ecdd8a..0deba60 100644 (file)
@@ -28,6 +28,7 @@
 #define US_PER_MS   (1000)
 #define NS_PER_US   (1000)
 #define NS_PER_MS   (1000000)
+#define HNS_PER_US  (10)
 
 
 #ifdef __cplusplus
index 2415d42..4a07ceb 100644 (file)
@@ -34,7 +34,9 @@
 
 #include <stddef.h>        // For NULL
 
-#ifndef WITH_ARDUINO
+#if defined(_WIN32)
+# include <windows.h>
+#elif !defined(WITH_ARDUINO)
 # if _POSIX_TIMERS > 0
 #  include <time.h>        // For clock_gettime()
 # else
@@ -50,6 +52,22 @@ uint64_t OICGetCurrentTime(OICTimePrecision precision)
 
 #ifdef WITH_ARDUINO
     currentTime = (TIME_IN_MS == precision) ? millis() : micros();
+#elif defined(_WIN32)
+    FILETIME fileTime;
+    ULARGE_INTEGER time;
+
+    GetSystemTimePreciseAsFileTime(&fileTime);
+
+    // fileTime should now be a QWORD hundred-nanoseconds time since 1601
+
+    // MSDN recommends using ULARGE_INTEGER as an intermediate representation for math.
+    time.LowPart = fileTime.dwLowDateTime;
+    time.HighPart = fileTime.dwHighDateTime;
+
+    currentTime =
+    (TIME_IN_MS == precision)
+        ? time.QuadPart / (HNS_PER_US * US_PER_MS)
+        : time.QuadPart / (HNS_PER_US);
 #else
 # if _POSIX_TIMERS > 0
 #   if defined(CLOCK_MONOTONIC_COARSE)
index 3f712a3..e2289d4 100644 (file)
 #if (__STDC_VERSION__ >= 201112L)
     #include <assert.h>
     #define OC_STATIC_ASSERT(condition, msg) static_assert(condition, msg)
+#elif defined(_WIN32)
+    #if defined(__msys_nt__) && !defined(__cplusplus)
+        #define static_assert _Static_assert
+    #endif
+    #define OC_STATIC_ASSERT(condition, msg) static_assert(condition, msg)
 #else
     #define OC_STATIC_ASSERT(condition, msg) ((void)sizeof(char[2*!!(condition) - 1]))
 #endif
 
+#ifndef INLINE_API
+#  if defined(__cplusplus)
+#    define INLINE_API inline
+#  else
+#    ifdef _WIN32
+#      define INLINE_API static __inline
+#    else
+#      define INLINE_API static inline
+#    endif
+#  endif
+#endif
+
+#ifdef _MSC_VER
+#  ifdef OC_EXPORT_DLL
+#    define OC_EXPORT __declspec(dllexport)
+#  else
+#    define OC_EXPORT __declspec(dllimport)
+#  endif
+#  ifdef ENABLE_TEST_EXPORTS
+#    define OC_EXPORT_TEST OC_EXPORT
+#  else
+#    define OC_EXPORT_TEST
+#  endif
+#  define OC_ANNOTATE_UNUSED
+#else
+#  define OC_ANNOTATE_UNUSED  __attribute__((unused))
+#  define OC_EXPORT
+#  define OC_EXPORT_TEST
+#endif
+
+#ifdef _WIN32
+#  define __func__ __FUNCTION__
+#  define strncasecmp _strnicmp
+#  define strtok_r strtok_s
+#  if _MSC_VER && (_MSC_VER < 1900)
+#    include "vs12_snprintf.h"
+#  endif
+#  define ssize_t SSIZE_T
+#  define F_OK                0
+#  define sleep(SECS)         Sleep(1000*(SECS))
+#  ifdef __cplusplus
+#    define SUPPORTS_DEFAULT_CTOR
+#  endif
+#  include "win_sleep.h"
+#  include "pthread_create.h"
+#endif
+
+#ifdef HAVE_WINSOCK2_H
+#  define OPTVAL_T(t)    (const char*)(t)
+#else
+#  define OPTVAL_T(t)    (t)
+#endif
+
 #endif
diff --git a/resource/c_common/windows/SConscript b/resource/c_common/windows/SConscript
new file mode 100644 (file)
index 0000000..85c4bf3
--- /dev/null
@@ -0,0 +1,26 @@
+##
+# Builds Windows-specific helper library
+##
+Import('env')
+import os.path
+
+# Include any headers that might be missing on Windows
+env.AppendUnique(CPPPATH = [os.path.abspath('./include')])
+
+######################################################################
+# Source files and Targets
+######################################################################
+src_dir = os.path.abspath('./src')
+helper_src = [
+       os.path.join(src_dir, 'getopt.c'),
+       os.path.join(src_dir, 'win_sleep.c'),
+       os.path.join(src_dir, 'snprintf.c'),
+       os.path.join(src_dir, 'pthread_create.c')
+       ]
+
+static_libwinhelper = env.StaticLibrary('win_helper', helper_src)
+env.InstallTarget(static_libwinhelper, 'win_helper')
+env.UserInstallTargetLib(static_libwinhelper, 'win_helper')
+
+env.AppendUnique(LIBS = ['win_helper'])
+
diff --git a/resource/c_common/windows/include/getopt.h b/resource/c_common/windows/include/getopt.h
new file mode 100644 (file)
index 0000000..8e11854
--- /dev/null
@@ -0,0 +1,20 @@
+/** @todo: Add Microsoft license information */
+
+#ifndef __GETOPT_H__
+#define __GETOPT_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern char *optarg;
+extern int optind;
+
+int getopt(int argc, char *const argv[], const char *optstring);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/resource/c_common/windows/include/pthread_create.h b/resource/c_common/windows/include/pthread_create.h
new file mode 100644 (file)
index 0000000..80677ad
--- /dev/null
@@ -0,0 +1,26 @@
+/** @todo: Add Microsoft license information */
+
+#ifndef __PTHREAD_CREATE_H__
+#define __PTHREAD_CREATE_H__
+#ifndef WIN_PTHREADS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void* pthread_t;
+typedef void pthread_attr_t;
+
+int pthread_create(
+   pthread_t *thread,
+   const pthread_attr_t *attr,
+   void *(*start_routine)(void *),
+   void *arg);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //WIN_PTHREADS_H
+#endif //__PTHREAD_CREATE_H__
+
diff --git a/resource/c_common/windows/include/vs12_snprintf.h b/resource/c_common/windows/include/vs12_snprintf.h
new file mode 100644 (file)
index 0000000..6595b95
--- /dev/null
@@ -0,0 +1,38 @@
+/* *****************************************************************
+*
+* Copyright 2016 Intel Corporation
+*
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+******************************************************************/
+
+#ifndef __VS12_SNPRINTF_H__
+#define __VS12_SNPRINTF_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int vs12_snprintf(char *buffer, size_t count, const char *format, ...);
+
+#if defined(_MSC_VER) && (_MSC_VER < 1900)
+# define snprintf vs12_snprintf
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/resource/c_common/windows/include/win_sleep.h b/resource/c_common/windows/include/win_sleep.h
new file mode 100644 (file)
index 0000000..c9b8fd7
--- /dev/null
@@ -0,0 +1,37 @@
+/* *****************************************************************
+*
+* Copyright 2016 Intel Corporation
+*
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+******************************************************************/
+
+#ifndef __WIN_SLEEP_H__
+#define __WIN_SLEEP_H__
+
+#include <time.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int nanosleep(const struct timespec *req, struct timespec *rem);
+int usleep(unsigned int usec);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/resource/c_common/windows/src/getopt.c b/resource/c_common/windows/src/getopt.c
new file mode 100644 (file)
index 0000000..d27ae09
--- /dev/null
@@ -0,0 +1,40 @@
+/** @todo: Add Microsoft license information */
+
+#include "getopt.h"
+#include <windows.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+char* optarg = NULL;
+int optind = 1;
+
+int getopt(int argc, char *const argv[], const char *optstring)
+{
+    if ((optind >= argc) || (argv[optind][0] != '-') || (argv[optind][0] == 0))
+    {
+        return -1;
+    }
+
+    int opt = argv[optind][1];
+    const char *p = strchr(optstring, opt);
+
+    if (p == NULL) {
+        return '?';
+    }
+    if (p[1] == ':') {
+        optind++;
+        if (optind >= argc) {
+            return '?';
+        }
+        optarg = argv[optind];
+        optind++;
+    }
+    return opt;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/resource/c_common/windows/src/pthread_create.c b/resource/c_common/windows/src/pthread_create.c
new file mode 100644 (file)
index 0000000..c7a592d
--- /dev/null
@@ -0,0 +1,23 @@
+/** @todo: Add Microsoft license information */
+
+#include "pthread_create.h"
+#include <windows.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int pthread_create(
+    pthread_t *thread,
+    const pthread_attr_t *attr,
+    void *(*start_routine)(void *),
+    void *arg)
+{
+    *thread = CreateThread(NULL, 0, (PTHREAD_START_ROUTINE)start_routine, arg, 0, NULL);
+    return (*thread == NULL) ? GetLastError() : 0;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/resource/c_common/windows/src/snprintf.c b/resource/c_common/windows/src/snprintf.c
new file mode 100644 (file)
index 0000000..87a9242
--- /dev/null
@@ -0,0 +1,42 @@
+/* *****************************************************************
+*
+* Copyright 2016 Intel Corporation
+*
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+******************************************************************/
+
+#include "vs12_snprintf.h"
+#include <stdio.h>
+#include <stdarg.h>
+
+int vs12_snprintf(char *buffer, size_t count, const char *format, ...)
+{
+    int length;
+    va_list args;
+
+    va_start(args, format);
+
+    length = _snprintf(buffer, count, format, args);
+
+    va_end(args);
+
+    if (length > count)
+    {
+        buffer[count - 1] = '\0';
+    }
+
+    return length;
+}
+
diff --git a/resource/c_common/windows/src/win_sleep.c b/resource/c_common/windows/src/win_sleep.c
new file mode 100644 (file)
index 0000000..f8f72f3
--- /dev/null
@@ -0,0 +1,45 @@
+/* *****************************************************************
+*
+* Copyright 2016 Intel Corporation
+*
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+******************************************************************/
+
+#include <assert.h>
+#include <windows.h>
+#include "win_sleep.h"
+
+#define NS_PER_MS  (1000000)
+#define US_PER_MS  (1000)
+
+int usleep(unsigned int usec)
+{
+    assert((usec % US_PER_MS) == 0); // granularity check
+    Sleep(usec / US_PER_MS);
+    return 0;
+}
+
+int nanosleep(const struct timespec *req, struct timespec *rem)
+{
+    assert(req != NULL);
+    assert(rem == NULL);
+    assert(req->tv_sec == 0);
+    assert((req->tv_nsec % NS_PER_MS) == 0); // granularity check
+
+    Sleep(req->tv_nsec / NS_PER_MS);
+
+    return 0;
+}
+
index 3fc01de..637cad0 100644 (file)
@@ -40,9 +40,9 @@
 #include <sys/poll.h>
 #endif
 
-#if defined(_WIN32)
-#include <mswsock.h>
+#ifdef HAVE_WINSOCK2_H
 #include <winsock2.h>
+#include <mswsock.h>
 #endif
 
 #ifdef __cplusplus
index d725980..08b1c1e 100644 (file)
 
 typedef struct _tagMutexInfo_t
 {
+#if defined(_MSC_VER)
+    uint8_t unused; //VS doesnt like empty structs
+#endif
 } ca_mutex_internal;
 
 typedef struct _tagEventInfo_t
 {
+#if defined(_MSC_VER)
+    uint8_t unused; //VS doesnt like empty structs
+#endif
 } ca_cond_internal;
 
 /**
@@ -57,7 +63,7 @@ static ca_cond_internal g_condInfo = { 0 };
 
 ca_mutex ca_mutex_new(void)
 {
-    return &g_mutexInfo;
+    return (ca_mutex)&g_mutexInfo;
 }
 
 bool ca_mutex_free(ca_mutex mutex)
@@ -77,7 +83,7 @@ void ca_mutex_unlock(ca_mutex mutex)
 
 ca_cond ca_cond_new(void)
 {
-    return &g_condInfo;
+    return (ca_cond)&g_condInfo;
 }
 
 void ca_cond_free(ca_cond cond)
index f0e73b6..564a354 100644 (file)
 #define _POSIX_C_SOURCE 200809L
 #endif
 
-#if !defined(_WIN32)
+#ifdef HAVE_STRING_H
 #include <string.h>
+#endif
+#ifdef HAVE_PTHREAD_H
 #include <pthread.h>
-#include <errno.h>
+#endif
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
+#endif
+#ifdef HAVE_TIME_H
 #include <time.h>
+#endif
+#ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
-#include <assert.h>
-#include <oic_malloc.h>
-#include "camutex.h"
-#include "logger.h"
 #endif
-
-#if defined(_WIN32)
-#include <string.h>
-#include <time.h>
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+#include <stdio.h>
+#include <errno.h>
 #include <assert.h>
 #include <oic_malloc.h>
 #include "camutex.h"
 #include "logger.h"
-#include <winsock2.h>
-#include <stdio.h>
-#endif
 
 /**
  * TAG
index 3ca8cd6..d17af9c 100644 (file)
 #define _GNU_SOURCE
 #endif
 #include <errno.h>
-#if !defined(__msys_nt__)
+#if defined HAVE_PTHREAD_H
 #include <pthread.h>
 #endif
-
-#if defined(__msys_nt__)
-#include <windows.h>
+#if defined HAVE_WINSOCK2_H
+#include <winsock2.h>
 #endif
 #include "cathreadpool.h"
 #include "logger.h"
 #include "oic_malloc.h"
 #include "uarraylist.h"
 #include "camutex.h"
+#include "platform_features.h"
 
 #define TAG PCF("UTHREADPOOL")
 
@@ -161,16 +161,6 @@ CAResult_t ca_thread_pool_add_task(ca_thread_pool_t thread_pool, ca_thread_func
     info->func = method;
     info->data = data;
 
-#if defined(__msys_nt__)
-    HANDLE threadHandle;
-    DWORD threadId;
-    threadHandle = CreateThread(NULL, 0, ca_thread_pool_pthreads_delegate, info, 0, &threadId);
-    if (threadHandle == NULL)
-    {
-        OIC_LOG_V(ERROR, TAG, "CreateThread failed with error %i", GetLastError());
-        return CA_STATUS_FAILED;
-    }
-#else
     pthread_t threadHandle;
     int result = pthread_create(&threadHandle, NULL, ca_thread_pool_pthreads_delegate, info);
 
@@ -179,7 +169,7 @@ CAResult_t ca_thread_pool_add_task(ca_thread_pool_t thread_pool, ca_thread_func
         OIC_LOG_V(ERROR, TAG, "Thread start failed with error %d", result);
         return CA_STATUS_FAILED;
     }
-#endif
+
     ca_mutex_lock(thread_pool->details->list_lock);
     bool addResult = u_arraylist_add(thread_pool->details->threads_list, (void*)threadHandle);
     ca_mutex_unlock(thread_pool->details->list_lock);
@@ -208,15 +198,15 @@ void ca_thread_pool_free(ca_thread_pool_t thread_pool)
 
     for(uint32_t i = 0; i<u_arraylist_length(thread_pool->details->threads_list); ++i)
     {
-#if defined(__msys_nt__)
-        HANDLE tid = (HANDLE)u_arraylist_get(thread_pool->details->threads_list, i);
+        pthread_t tid = (pthread_t)u_arraylist_get(thread_pool->details->threads_list, i);
+#if defined(_WIN32)
         DWORD joinres = WaitForSingleObject(tid, INFINITE);
-        if(WAIT_OBJECT_0 != joinres)
+        if (WAIT_OBJECT_0 != joinres)
         {
             OIC_LOG_V(ERROR, TAG, "Failed to join thread at index %u with error %d", i, joinres);
         }
+        CloseHandle(tid);
 #else
-        pthread_t tid = (pthread_t)u_arraylist_get(thread_pool->details->threads_list, i);
         int joinres = pthread_join(tid, NULL);
         if(0 != joinres)
         {
index d9f6e81..2e41cb9 100644 (file)
@@ -20,6 +20,7 @@
 #ifndef CA_ADAPTER_NET_DTLS_H_
 #define CA_ADAPTER_NET_DTLS_H_
 
+#include "platform_features.h"
 #include "dtls.h"
 #include "uarraylist.h"
 #include "camutex.h"
index 90f2b7c..5f8c248 100644 (file)
@@ -40,6 +40,9 @@
 #include <winsock2.h>
 #include <ws2tcpip.h>
 #endif
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
 
 #include "cacommon.h"
 #include "logger.h"
index 2a60272..37e8235 100644 (file)
 #include <sys/socket.h>
 #endif
 
-#if defined(__msys_nt__)
+#ifdef HAVE_WINSOCK2_H
 #include <winsock2.h>
+#endif
+
+#ifdef HAVE_WS2TCPIP_H
 #include <ws2tcpip.h>
 #endif
 
@@ -81,7 +84,7 @@ typedef struct coap_address_t
 
 #define _coap_is_mcast_impl(Address) uip_is_addr_mcast(&((Address)->addr))
 #endif /* WITH_CONTIKI */
-#ifdef WITH_POSIX
+#if defined(WITH_POSIX) || defined(_WIN32)
 
 /** multi-purpose address abstraction */
 typedef struct coap_address_t
index 6eb924b..b2c70e4 100644 (file)
@@ -34,6 +34,9 @@ extern "C"
 #ifdef HAVE_TIME_H
 #include <time.h>
 #endif
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
 #ifdef WITH_LWIP
 
 #include <stdint.h>
@@ -93,7 +96,7 @@ extern "C"
 #define coap_ticks contiki_ticks_impl
 
 #endif /* WITH_CONTIKI */
-#ifdef WITH_POSIX
+#if defined(WITH_POSIX) || defined(_WIN32)
     typedef unsigned int coap_tick_t;
 
     /**
@@ -107,7 +110,7 @@ extern "C"
 
     /** Set at startup to initialize the internal clock (time in seconds). */
     extern time_t clock_offset;
-#endif /* WITH_POSIX */
+#endif /* WITH_POSIX || _WIN32 */
 
 #ifdef WITH_ARDUINO
 #include "Time.h"
@@ -176,7 +179,12 @@ extern time_t clock_offset;
 #endif
     *t = (tv - clock_offset) * COAP_TICKS_PER_SECOND;
 #  else
+#ifdef HAVE_TIME_H
+    time_t tv = time(NULL);
+    *t = difftime(tv, clock_offset) * COAP_TICKS_PER_SECOND;
+#else
 #    error "clock not implemented"
+#endif /* HAVE_TIME_H */
 #  endif /* WITH_ARDUINO */
 #endif /* HAVE_SYS_TIME_H */
 }
index 09f6583..1f3bc9b 100644 (file)
@@ -4,11 +4,6 @@
 /* Define if building universal (internal helper macro) */
 /* #undef AC_APPLE_UNIVERSAL_BUILD */
 
-/* Define to 1 if you have the <arpa/inet.h> header file. */
-#if !defined(WITH_ARDUINO) && !defined(__msys_nt__)
-    #define HAVE_ARPA_INET_H 1
-#endif
-
 /* Define to 1 if you have the <assert.h> header file. */
 #define HAVE_ASSERT_H 1
 
 /* Define to 1 if you have the `memset' function. */
 #define HAVE_MEMSET 1
 
-/* Define to 1 if you have the <netdb.h> header file. */
-#define HAVE_NETDB_H 1
-
 /* Define to 1 if you have the <netinet/in.h> header file. */
-#if !defined(WITH_ARDUINO) && !defined(__msys_nt__)
-    #define HAVE_NETINET_IN_H 1
+#if !defined(WITH_ARDUINO) && !defined(_WIN32)
+#define HAVE_NETINET_IN_H 1
 #endif
 
 /* Define to 1 if you have the `select' function. */
 #define HAVE_STRRCHR 1
 
 /* Define to 1 if you have the <syslog.h> header file. */
-#if !defined(WITH_ARDUINO) && !defined(__msys_nt__)
+#if !defined(WITH_ARDUINO) && !defined(_WIN32)
 #define HAVE_SYSLOG_H 1
 #endif
 
-/* Define to 1 if you have the <sys/socket.h> header file. */
-#if !defined(WITH_ARDUINO) && !defined(__msys_nt__)
-#define HAVE_SYS_SOCKET_H 1
-#endif
-
 /* Define to 1 if you have the <sys/stat.h> header file. */
-//TODO:  arduino has this?? no i think.
 #define HAVE_SYS_STAT_H 1
 
-/* Define to 1 if you have the <sys/time.h> header file. */
-#ifndef WITH_ARDUINO
-#define HAVE_SYS_TIME_H 1
+/* Define to 1 if you have the <sys/unistd.h> header file. */
+#if !defined(WITH_ARDUINO) && !defined(_WIN32)
+#define HAVE_SYS_UNISTD_H 1
 #endif
 
-/* Define to 1 if you have the <sys/types.h> header file. */
-#ifndef WITH_ARDUINO
-#define HAVE_SYS_TYPES_H 1
+/* Define to 1 if you have <Ws2tcpip.h> header file. */
+#if defined(_WIN32)
+#define HAVE_WS2TCPIP_H 1
 #endif
 
-/* Define to 1 if you have the <sys/unistd.h> header file. */
-#if !defined(WITH_ARDUINO) && !defined(__msys_nt__)
-#define HAVE_SYS_UNISTD_H 1
+/* Define to 1 if you have <Winsock2.h> header file. */
+#if defined(_WIN32)
+#define HAVE_WINSOCK2_H 1
+#endif
+
+/* Define to 1 if you have <Windows.h> header file. */
+#if defined(_WIN32)
+#define HAVE_WINDOWS_H 1
 #endif
 
 /* Define to 1 if you have the <time.h> header file. */
 #endif
 
 /* Define to 1 if you have the <unistd.h> header file. */
-#if !defined(WITH_ARDUINO) && !defined(__msys_nt__)
+#if !defined(WITH_ARDUINO) && !defined(_WIN32)
 #define HAVE_UNISTD_H 1
 #endif
 
index 027491d..0169ae8 100644 (file)
@@ -146,10 +146,12 @@ unsigned int print_readable(const unsigned char *data, unsigned int len, unsigne
 
 size_t coap_print_addr(const struct coap_address_t *addr, unsigned char *buf, size_t len)
 {
-#ifdef HAVE_ARPA_INET_H
+#if defined(HAVE_ARPA_INET_H) || defined(_WIN32)
     const void *addrptr = NULL;
 #if defined(__ANDROID__)
     __uint16_t port;
+#elif defined(_WIN32)
+    uint16_t port;
 #else
     in_port_t port;
 #endif
index b1b2e57..a7a8888 100644 (file)
@@ -12,7 +12,7 @@
 #if (BSD >= 199103) || defined(WITH_CONTIKI)
 # include <string.h>
 #else
-#ifndef WITH_ARDUINO
+#if !defined(WITH_ARDUINO) && !defined(_MSC_VER)
 # include <strings.h>
 #endif
 #endif
index f98025a..8e6f3b6 100644 (file)
@@ -24,6 +24,9 @@
 #ifdef HAVE_SYS_SOCKET_H
 #include <sys/socket.h>
 #endif
+#ifdef _WIN32
+#define ssize_t SSIZE_T
+#endif
 #ifdef HAVE_NETINET_IN_H
 #include <netinet/in.h>
 #endif
@@ -53,7 +56,7 @@
 #include "block.h"
 #include "net.h"
 
-#if defined(WITH_POSIX) || defined(WITH_ARDUINO)
+#if defined(WITH_POSIX) || defined(WITH_ARDUINO) || defined(_WIN32)
 
 time_t clock_offset=0;
 
@@ -327,7 +330,7 @@ is_wkc(coap_key_t k)
 coap_context_t *
 coap_new_context(const coap_address_t *listen_addr)
 {
-#if defined(WITH_POSIX)
+#if defined(WITH_POSIX) || defined(_WIN32)
     coap_context_t *c = coap_malloc( sizeof( coap_context_t ) );
     int reuse = 1;
 #elif WITH_CONTIKI
@@ -392,7 +395,7 @@ coap_new_context(const coap_address_t *listen_addr)
     coap_register_option(c, COAP_OPTION_BLOCK2);
     coap_register_option(c, COAP_OPTION_BLOCK1);
 
-#if defined(WITH_POSIX) || defined(WITH_ARDUINO)
+#if defined(WITH_POSIX) || defined(WITH_ARDUINO) || defined(_WIN32)
     c->sockfd = socket(listen_addr->addr.sa.sa_family, SOCK_DGRAM, 0);
     if ( c->sockfd < 0 )
     {
@@ -402,7 +405,7 @@ coap_new_context(const coap_address_t *listen_addr)
         goto onerror;
     }
 
-    if ( setsockopt( c->sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse) ) < 0 )
+    if ( setsockopt( c->sockfd, SOL_SOCKET, SO_REUSEADDR, (char*)&reuse, sizeof(reuse) ) < 0 )
     {
 #ifndef NDEBUG
         coap_log(LOG_WARNING, "setsockopt SO_REUSEADDR\n");
@@ -457,7 +460,7 @@ coap_new_context(const coap_address_t *listen_addr)
 
 void coap_free_context(coap_context_t *context)
 {
-#if defined(WITH_POSIX) || defined(WITH_LWIP)
+#if defined(WITH_POSIX) || defined(WITH_LWIP) || defined(_WIN32)
     coap_resource_t *res;
 #ifndef COAP_RESOURCES_NOHASH
     coap_resource_t *rtmp;
@@ -474,7 +477,7 @@ void coap_free_context(coap_context_t *context)
     coap_retransmittimer_restart(context);
 #endif
 
-#if defined(WITH_POSIX) || defined(WITH_LWIP) || defined(WITH_ARDUINO)
+#if defined(WITH_POSIX) || defined(WITH_LWIP) || defined(WITH_ARDUINO) || defined(_WIN32)
 #ifdef COAP_RESOURCES_NOHASH
     LL_FOREACH(context->resources, res)
     {
@@ -486,7 +489,7 @@ void coap_free_context(coap_context_t *context)
         }
 #endif /* WITH_POSIX || WITH_LWIP */
 
-#ifdef WITH_POSIX
+#if defined(WITH_POSIX) || defined(_WIN32)
     /* coap_delete_list(context->subscriptions); */
     close( context->sockfd );
     coap_free( context );
@@ -544,7 +547,7 @@ void coap_transaction_id(const coap_address_t *peer, const coap_pdu_t *pdu, coap
     /* Compare the complete address structure in case of IPv4. For IPv6,
      * we need to look at the transport address only. */
 
-#ifdef WITH_POSIX
+#if defined(WITH_POSIX) || defined(_WIN32)
     switch (peer->addr.sa.sa_family)
     {
         case AF_INET:
@@ -604,7 +607,7 @@ coap_send_impl(coap_context_t *context,
 }
 #endif
 
-#if defined(WITH_POSIX)
+#if defined(WITH_POSIX) || defined(_WIN32)
 /* releases space allocated by PDU if free_pdu is set */
 coap_tid_t
 coap_send_impl(coap_context_t *context,
@@ -617,7 +620,7 @@ coap_send_impl(coap_context_t *context,
     if ( !context || !dst || !pdu )
     return id;
 
-    bytes_written = sendto( context->sockfd, pdu->hdr, pdu->length, 0,
+    bytes_written = sendto( context->sockfd, (char*)pdu->hdr, pdu->length, 0,
             &dst->addr.sa, dst->size);
 
     if (bytes_written >= 0)
@@ -898,7 +901,7 @@ static inline int check_opt_size(coap_opt_t *opt, unsigned char *maxpos)
 #ifndef WITH_ARDUINO
 int coap_read(coap_context_t *ctx)
 {
-#if defined(WITH_POSIX)
+#if defined(WITH_POSIX) || defined(_WIN32)
     static char buf[COAP_MAX_PDU_SIZE];
 #endif
 #if defined(WITH_LWIP) || defined(WITH_CONTIKI)
@@ -922,7 +925,7 @@ int coap_read(coap_context_t *ctx)
 
     coap_address_init(&src);
 
-#if defined(WITH_POSIX)
+#if defined(WITH_POSIX) || defined(_WIN32)
     bytes_read = recvfrom(ctx->sockfd, buf, sizeof(buf), 0, &src.addr.sa, &src.size);
 
 #endif /* WITH_POSIX || WITH_ARDUINO */
index 6e71da8..d2868b5 100644 (file)
@@ -113,7 +113,7 @@ extern "C"
      * to sendqueue_basetime. */
     coap_tick_t sendqueue_basetime;
     coap_queue_t *sendqueue, *recvqueue;
-#if defined(WITH_POSIX) || defined(WITH_ARDUINO)
+#if defined(WITH_POSIX) || defined(WITH_ARDUINO) || defined(_WIN32)
     int sockfd; /**< send/receive socket */
 #endif /* WITH_POSIX || WITH_ARDUINO */
 #ifdef WITH_CONTIKI
index 1b36674..6f6d4d9 100644 (file)
@@ -137,7 +137,7 @@ coap_pdu_init(unsigned char type, unsigned char code, unsigned short id,
 #endif
 
     /* size must be large enough for hdr */
-#if defined(WITH_POSIX) || defined(WITH_ARDUINO)
+#if defined(WITH_POSIX) || defined(WITH_ARDUINO) || defined(_WIN32)
     pdu = (coap_pdu_t *) coap_malloc(sizeof(coap_pdu_t) + size);
 #endif
 #ifdef WITH_CONTIKI
index 3954517..54776af 100644 (file)
@@ -27,7 +27,7 @@
 #define COAP_FREE_TYPE(Type, Object) memp_free(MEMP_COAP_##Type, Object)
 
 #endif
-#if defined(WITH_POSIX) || defined(WITH_ARDUINO)
+#if defined(WITH_POSIX) || defined(WITH_ARDUINO) || defined(_WIN32)
 #include "utlist.h"
 #include "mem.h"
 
@@ -339,7 +339,7 @@ coap_resource_init(const unsigned char *uri, size_t len, int flags)
 {
     coap_resource_t *r;
 
-#if defined(WITH_POSIX) || defined(WITH_ARDUINO)
+#if defined(WITH_POSIX) || defined(WITH_ARDUINO) || defined(_WIN32)
     r = (coap_resource_t *)coap_malloc(sizeof(coap_resource_t));
 #endif
 #ifdef WITH_LWIP
@@ -381,7 +381,7 @@ coap_add_attr(coap_resource_t *resource, const unsigned char *name, size_t nlen,
     if (!resource || !name)
         return NULL;
 
-#if defined(WITH_POSIX) || defined(WITH_ARDUINO)
+#if defined(WITH_POSIX) || defined(WITH_ARDUINO) || defined(_WIN32)
     attr = (coap_attr_t *)coap_malloc(sizeof(coap_attr_t));
 #endif
 #ifdef WITH_LWIP
@@ -501,7 +501,7 @@ int coap_delete_resource(coap_context_t *context, coap_key_t key)
     if (!resource)
         return 0;
 
-#if defined(WITH_POSIX) || defined(WITH_LWIP) || defined(WITH_ARDUINO)
+#if defined(WITH_POSIX) || defined(WITH_LWIP) || defined(WITH_ARDUINO) || defined(_WIN32)
 #ifdef COAP_RESOURCES_NOHASH
     LL_DELETE(context->resources, resource);
 #else
@@ -514,7 +514,7 @@ int coap_delete_resource(coap_context_t *context, coap_key_t key)
     if (resource->flags & COAP_RESOURCE_FLAGS_RELEASE_URI)
         coap_free(resource->uri.s);
 
-#if defined(WITH_POSIX) || defined(WITH_ARDUINO)
+#if defined(WITH_POSIX) || defined(WITH_ARDUINO) || defined(_WIN32)
     coap_free(resource);
 #endif
 #ifdef WITH_LWIP
index a1c739c..1889a8e 100644 (file)
@@ -62,7 +62,7 @@
  when compiling c++ code), this code uses whatever method is needed
  or, for VS2008 where neither is available, uses casting workarounds. */
 #ifdef _MSC_VER            /* MS compiler */
-#if _MSC_VER >= 1600 && __cplusplus  /* VS2010 and newer in C++ mode */
+#if (_MSC_VER >= 1600) && (defined(__cplusplus) && (__cplusplus >= 201103L))  /* VS2010 and newer in C++ mode */
 #define LDECLTYPE(x) decltype(x)
 #else                     /* VS2008 or older (or VS2010 in C mode) */
 #define NO_DECLTYPE
@@ -338,11 +338,11 @@ do {
     (head)=(head)->next;                                                                       \
   } else {                                                                                     \
     char *_tmp = (char*)(head);                                                                \
-    while (head->next && (head->next != (del))) {                                              \
-      head = head->next;                                                                       \
+    while ((head)->next && ((head)->next != (del))) {                                          \
+      (head) = (head)->next;                                                                   \
     }                                                                                          \
-    if (head->next) {                                                                          \
-      head->next = ((del)->next);                                                              \
+    if ((head)->next) {                                                                        \
+      (head)->next = ((del)->next);                                                            \
     }                                                                                          \
     {                                                                                          \
       char **_head_alias = (char**)&(head);                                                    \
index e47fd40..696ef01 100644 (file)
 #include "oic_string.h"
 #include "global.h"
 #include "timer.h"
-
-#if defined(__msys_nt__)
+#if defined(HAVE_WINSOCK2_H) && defined(HAVE_WS2TCPIP_H)
 #include <winsock2.h>
 #include <ws2tcpip.h>
-#else
+#endif
+#ifdef HAVE_NETDB_H
 #include <netdb.h>
 #endif
 
index 4aec40b..9ddc7e8 100644 (file)
 #include "oic_malloc.h"
 #include <errno.h>
 
-#if !defined(WITH_ARDUINO) && !defined(__msys_nt__)
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+#ifdef HAVE_SYS_SOCKET_H
 #include <sys/socket.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
 #include <netinet/in.h>
-#include <netdb.h>
 #endif
-
-#if defined(__msys_nt__)
+#if defined(HAVE_WINSOCK2_H) && defined(HAVE_WS2TCPIP_H)
 #include <winsock2.h>
 #include <ws2tcpip.h>
 #endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
 
 #ifdef __ANDROID__
 #include <jni.h>
index dcac782..5fa0ff3 100644 (file)
@@ -86,6 +86,7 @@ typedef struct
 } CARetransmissionData_t;
 
 static const uint64_t USECS_PER_SEC = 1000000;
+static const uint64_t MSECS_PER_SEC = 1000;
 
 /**
  * @brief   getCurrent monotonic time
@@ -103,7 +104,7 @@ uint64_t getCurrentTimeInMicroSeconds();
  */
 static uint64_t CAGetTimeoutValue()
 {
-#if !defined(__msys_nt__)
+#if !defined(_WIN32)
     return ((DEFAULT_ACK_TIMEOUT_SEC * 1000) + ((1000 * (random() & 0xFF)) >> 8)) *
             (uint64_t) 1000;
 #else
@@ -660,6 +661,10 @@ uint64_t getCurrentTimeInMicroSeconds()
     struct timespec ts;
     clock_gettime(CLOCK_MONOTONIC, &ts);
     currentTime = ts.tv_sec * USECS_PER_SEC + ts.tv_nsec / 1000;
+#elif defined(_WIN32)
+    struct __timeb64 tb;
+    _ftime64_s(&tb);
+    currentTime = tb.time * USECS_PER_SEC + tb.millitm * MSECS_PER_SEC;
 #else
     struct timeval tv;
     gettimeofday(&tv, NULL);
index c4b713c..0757906 100644 (file)
@@ -39,7 +39,9 @@
 #endif
 
 #include <stdio.h>
+#if !defined(_MSC_VER)
 #include <unistd.h>
+#endif //!defined(_MSC_VER)
 #include <sys/types.h>
 #include <fcntl.h>
 #if !defined(_WIN32)
@@ -63,6 +65,7 @@
 #include "camutex.h"
 #include "oic_malloc.h"
 #include "oic_string.h"
+#include "platform_features.h"
 
 #define USE_IP_MREQN
 #if defined(_WIN32)
@@ -348,8 +351,7 @@ static void CAFindReadyMessage()
     int eventIndex;
 
     // fdArray and eventArray should have same number of elements
-    /** @todo: replace with OC_STATIC_ASSERT */
-    _Static_assert(_countof(fdArray) == _countof(eventArray), "Arrays should have same number of elements");
+    OC_STATIC_ASSERT(_countof(fdArray) == _countof(eventArray), "Arrays should have same number of elements");
 
     PUSH_IP_SOCKET(u6,  eventArray, fdArray, arraySize);
     PUSH_IP_SOCKET(u6s, eventArray, fdArray, arraySize);
@@ -673,7 +675,7 @@ static int CACreateSocket(int family, uint16_t *port)
     {
         int on = 1;
 
-        if (-1 == setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof (on)))
+        if (-1 == setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, OPTVAL_T(&on), sizeof (on)))
         {
             OIC_LOG_V(ERROR, TAG, "IPV6_V6ONLY failed: %s", CAIPS_GET_ERROR);
         }
@@ -683,7 +685,7 @@ static int CACreateSocket(int family, uint16_t *port)
 #if defined(IPV6_RECVPKTINFO)
             if (-1 == setsockopt(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &on, sizeof (on)))
 #else
-            if (-1 == setsockopt(fd, IPPROTO_IPV6, IPV6_PKTINFO, &on, sizeof (on)))
+            if (-1 == setsockopt(fd, IPPROTO_IPV6, IPV6_PKTINFO, OPTVAL_T(&on), sizeof (on)))
 #endif
             {
                 OIC_LOG_V(ERROR, TAG, "IPV6_RECVPKTINFO failed: %s",CAIPS_GET_ERROR);
@@ -698,7 +700,7 @@ static int CACreateSocket(int family, uint16_t *port)
         if (*port) // only do this for multicast ports
         {
             int on = 1;
-            if (-1 == setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &on, sizeof (on)))
+            if (-1 == setsockopt(fd, IPPROTO_IP, IP_PKTINFO, OPTVAL_T(&on), sizeof (on)))
             {
                 OIC_LOG_V(ERROR, TAG, "IP_PKTINFO failed: %s", CAIPS_GET_ERROR);
             }
@@ -1010,7 +1012,7 @@ static void applyMulticastToInterface4(uint32_t ifindex)
                              .imr_interface.s_addr = htonl(ifindex) };
 #endif
 
-    int ret = setsockopt(caglobals.ip.m4.fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof (mreq));
+    int ret = setsockopt(caglobals.ip.m4.fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, OPTVAL_T(&mreq), sizeof (mreq));
     if (-1 == ret)
     {
 #if !defined(WSAEINVAL)
@@ -1254,12 +1256,12 @@ static void sendData(int fd, const CAEndpoint_t *endpoint,
                 OIC_LOG_V(DEBUG, TAG, "%s%s %s sendTo (Partial Send) is successful: "
                                       "currently sent: %ld bytes, "
                                       "total sent: %ld bytes, "
-                                      "remaining: %ld bytes", 
+                                      "remaining: %ld bytes",
                                       secure, cast, fam, len, sent, dlen-sent);
             }
             else
             {
-                OIC_LOG_V(INFO, TAG, "%s%s %s sendTo is successful: %ld bytes", 
+                OIC_LOG_V(INFO, TAG, "%s%s %s sendTo is successful: %ld bytes",
                                      secure, cast, fam, len);
             }
         }
@@ -1305,7 +1307,7 @@ static void sendMulticastData6(const u_arraylist_t *iflist,
         }
 
         int index = ifitem->index;
-        if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, &index, sizeof (index)))
+        if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, OPTVAL_T(&index), sizeof (index)))
         {
             OIC_LOG_V(ERROR, TAG, "setsockopt6 failed: %s", CAIPS_GET_ERROR);
             return;
@@ -1353,7 +1355,7 @@ static void sendMulticastData4(const u_arraylist_t *iflist,
 #else
         mreq.imr_interface.s_addr = htonl(ifitem->index);
 #endif
-        if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, &mreq, sizeof (mreq)))
+        if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, OPTVAL_T(&mreq), sizeof (mreq)))
         {
             OIC_LOG_V(ERROR, TAG, "send IP_MULTICAST_IF failed: %s (using defualt)",
                     CAIPS_GET_ERROR);
index 4720e18..8c9490a 100644 (file)
@@ -23,8 +23,8 @@
 #include <sys/types.h>
 #include <string.h>
 #include <errno.h>
-#include <unistd.h>
 #include <winsock2.h>
+#include "platform_features.h"
 #include <iptypes.h>
 #include <stdbool.h>
 #include "caadapterutils.h"
@@ -32,7 +32,6 @@
 #include "oic_malloc.h"
 #include "oic_string.h"
 
-
 #define TAG "IP_MONITOR"
 
 /** @todo Implement network interface monitoring in case the IP changes.
@@ -60,6 +59,16 @@ int CAGetPollingInterval(int interval)
     return interval;
 }
 
+/** @todo Implement network interface monitoring.
+ *  Not used in win32, but caipserver currently requires this function
+ *  be defined. not critical.
+ */
+CAInterface_t *CAFindInterfaceChange()
+{
+    CAInterface_t *foundNewInterface = NULL;
+    return foundNewInterface;
+}
+
 /** @todo Implement network interface monitoring.
  * Not critical for win32 bring-up.
  */
index d413bb1..940c838 100644 (file)
@@ -159,12 +159,6 @@ int32_t CAGetDtlsPskCredentials( CADtlsPskCredType_t type,
 }
 #endif  //__WITH_DTLS__
 
-int main(int argc, char **argv)
-{
-    testing::InitGoogleTest(&argc, argv);
-    return RUN_ALL_TESTS();
-}
-
 // CAInitialize TC
 // check return value
 TEST(InitializeTest, TC_01_Positive_01)
index 191c004..54d9fb8 100644 (file)
@@ -52,6 +52,8 @@
 #include <windows.h>
 #endif
 
+#define HNS_PER_US 10
+
 //#define DEBUG_VERBOSE 1
 
 // The debug print lines are left in for now since the output can be
@@ -79,9 +81,17 @@ uint64_t getAbsTime()
     clock_gettime(CLOCK_MONOTONIC, &ts);
     currentTime = ts.tv_sec * USECS_PER_SEC + ts.tv_nsec / 1000;
 #elif defined(_WIN32)
-    SYSTEMTIME time;
-    GetSystemTime(&time);
-    currentTime = time.wSecond * 100000 + time.wMilliseconds * 1000;
+    FILETIME time;
+    ULARGE_INTEGER microseconds;
+
+    GetSystemTimeAsFileTime(&time);
+
+    // Time is in hundreds of nanoseconds, so we must convert to uS
+    microseconds.LowPart = time.dwLowDateTime;
+    microseconds.HighPart = time.dwHighDateTime;
+    microseconds.QuadPart /= HNS_PER_US;
+
+    currentTime = microseconds.QuadPart;
 #else
     struct timeval tv;
     gettimeofday(&tv, NULL);
@@ -223,7 +233,12 @@ void condFunc(void *context)
     DBG_printf("Thread_%d: completed.\n", pData->id);
 }
 
+#ifdef _WIN32
+/** @todo: Enable.  Need to solve nanosleep issue */
+TEST(ConditionTests, DISABLED_TC_02_SIGNAL)
+#else
 TEST(ConditionTests, TC_02_SIGNAL)
+#endif
 {
     const int MAX_WAIT_MS = 2000;
     ca_thread_pool_t mythreadpool;
@@ -386,7 +401,12 @@ TEST(ConditionTests, TC_03_BROADCAST)
     ca_thread_pool_free(mythreadpool);
 }
 
-TEST(CondTests, TC_04_TIMECHECK)
+#ifdef _WIN32
+/** @todo: Enable.  Need to solve nanosleep issue */
+TEST(ConditionTests, DISABLED_TC_04_TIMECHECK)
+#else
+TEST(ConditionTests, TC_04_TIMECHECK)
+#endif
 {
     uint64_t begin = getAbsTime();
 
@@ -532,7 +552,14 @@ TEST(ConditionTests, TC_07_WAITDURATION)
 
     double secondsDiff = (end - beg) / (double) USECS_PER_SEC;
 
+#ifdef _WIN32
+    // Windows does not guarantee that the thread will resume execution from a
+    // yield within any given time frame. We will assume that the threads
+    // should have resumed within one second of the requested timeout value.
+    EXPECT_NEAR(TARGET_WAIT, secondsDiff, 1.00);
+#else
     EXPECT_NEAR(TARGET_WAIT, secondsDiff, 0.05);
+#endif
 
     ca_mutex_unlock(sharedMutex);
 
index b07eb6f..c701a2e 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "gtest/gtest.h"
 
+#ifdef HAVE_PTHREAD_H
 #include <pthread.h>
 
 /**
@@ -41,6 +42,12 @@ void workaroundHook()
         pthread_key_delete(key);
     }
 }
+#else
+void workaroundHook()
+{
+    return;
+};
+#endif
 
 
 TEST(BaseTest, WorldIsSane)
index 28b8308..4bc391d 100644 (file)
@@ -202,7 +202,7 @@ void OCLogBuffer(LogLevel level, const char * tag, const uint8_t * buffer, uint1
 #define OIC_LOG_BUFFER(level, tag, buffer, bufferSize)\
     OCLogBuffer((level), (tag), (buffer), (bufferSize))
 
-#else // These macros are defined for Linux, Android, MSYS_NT, and Arduino
+#else // These macros are defined for Linux, Android, Win32, and Arduino
 
 #define OIC_LOG_INIT()    OCLogInit()
 
@@ -223,7 +223,7 @@ void OCLogBuffer(LogLevel level, const char * tag, const uint8_t * buffer, uint1
 #define OIC_LOG_CONFIG(ctx)    OCLogConfig((ctx))
 #define OIC_LOG_SHUTDOWN()     OCLogShutdown()
 #define OIC_LOG(level, tag, logStr)  OCLog((level), (tag), (logStr))
-// Define variable argument log function for Linux, Android, and MSYS_NT
+// Define variable argument log function for Linux, Android, and Win32
 #define OIC_LOG_V(level, tag, ...)  OCLogv((level), (tag), __VA_ARGS__)
 
 #endif //ARDUINO
index 13c590d..c2669c8 100644 (file)
 #ifndef __TIZEN__
 static oc_log_ctx_t *logCtx = 0;
 #endif
+
+#if defined(_MSC_VER)
+#define LINE_BUFFER_SIZE (16 * 2) + 16 + 1  // Show 16 bytes, 2 chars/byte, spaces between bytes, null termination
+#else
+static const uint16_t LINE_BUFFER_SIZE = (16 * 2) + 16 + 1;  // Show 16 bytes, 2 chars/byte, spaces between bytes, null termination
+#endif //defined(_MSC_VER)
+
 #ifdef __ANDROID__
-#elif defined __linux__ || defined __APPLE__ || defined __msys_nt__
+#elif defined __linux__ || defined __APPLE__ || defined _WIN32
 static oc_log_level LEVEL_XTABLE[] = {OC_LOG_DEBUG, OC_LOG_INFO,
                                       OC_LOG_WARNING, OC_LOG_ERROR, OC_LOG_FATAL};
 #endif
 
-// Show 16 bytes, 2 chars/byte, spaces between bytes, null termination
-static const uint16_t LINE_BUFFER_SIZE = (16 * 2) + 16 + 1;
-
 // Convert LogLevel to platform-specific severity level.  Store in PROGMEM on Arduino
 #ifdef __ANDROID__
 #ifdef ADB_SHELL
@@ -70,6 +74,10 @@ static const uint16_t LINE_BUFFER_SIZE = (16 * 2) + 16 + 1;
     static android_LogPriority LEVEL[] =
     {ANDROID_LOG_DEBUG, ANDROID_LOG_INFO, ANDROID_LOG_WARN, ANDROID_LOG_ERROR, ANDROID_LOG_FATAL};
 #endif
+#elif defined(__linux__) || defined(__APPLE__) || defined(__msys_nt__)
+    static const char * LEVEL[] __attribute__ ((unused)) = {"DEBUG", "INFO", "WARNING", "ERROR", "FATAL"};
+#elif defined(_MSC_VER)
+    static const char * LEVEL[] = {"DEBUG", "INFO", "WARNING", "ERROR", "FATAL"};
 #elif defined ARDUINO
 #include <stdarg.h>
 #include "Arduino.h"
@@ -153,7 +161,7 @@ void OCLogInit()
 
 void OCLogShutdown()
 {
-#if defined(__linux__) || defined(__APPLE__) || defined(__msys_nt__)
+#if defined(__linux__) || defined(__APPLE__) || defined(_WIN32)
     if (logCtx && logCtx->destroy)
     {
         logCtx->destroy(logCtx);
@@ -174,7 +182,7 @@ void OCLogv(LogLevel level, const char * tag, const char * format, ...)
     if (!format || !tag) {
         return;
     }
-    char buffer[MAX_LOG_V_BUFFER_SIZE] = {};
+    char buffer[MAX_LOG_V_BUFFER_SIZE] = {0};
     va_list args;
     va_start(args, format);
     vsnprintf(buffer, sizeof buffer - 1, format, args);
@@ -228,6 +236,12 @@ void OCLog(LogLevel level, const char * tag, const char * logStr)
                sec = when.tv_sec % 60;
                ms = when.tv_nsec / 1000000;
            }
+   #elif defined(_WIN32)
+           SYSTEMTIME systemTime = {0};
+           GetLocalTime(&systemTime);
+           min = (int)systemTime.wMinute;
+           sec = (int)systemTime.wSecond;
+           ms  = (int)systemTime.wMilliseconds;
    #else
            struct timeval now;
            if (!gettimeofday(&now, NULL))
index cabd07c..394401a 100644 (file)
@@ -320,7 +320,11 @@ OCStackResult RMCreateRouteOption(const RMRouteOption_t *optValue, CAHeaderOptio
     OIC_LOG_V(DEBUG, RM_TAG, "createoption dlen %u slen [%u]", dLen, sLen);
 
     unsigned int totalLength = 0;
+#if defined(_MSC_VER)
+    char *tempData = NULL;
+#else
     void *tempData = NULL;
+#endif
     if (0 == dLen && 0 == sLen)
     {
         OIC_LOG(DEBUG, RM_TAG, "Source and destination is not present");
index c1900ac..ca185d6 100644 (file)
 #ifndef IOTVT_SRM_RSRC_STRINGS_H
 #define IOTVT_SRM_RSRC_STRINGS_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #include "securevirtualresourcetypes.h"
 
 extern const char * SVR_DB_FILE_NAME;
@@ -166,5 +170,9 @@ extern char OIC_SEC_REST_QUERY_DELIMETER;
 //Security Version
 extern const char * DEFAULT_SEC_VERSION;
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif //IOTVT_SRM_RSRC_STRINGS_H
 
index 786658e..0cc68a4 100644 (file)
@@ -47,6 +47,8 @@
 #include "byte_array.h"
 #endif /* __WITH_X509__ */
 
+#include "platform_features.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -139,7 +141,7 @@ typedef enum
 /**
  * Extract Reason Code from Access Response.
  */
-static inline SRMAccessResponseReasonCode_t GetReasonCode(
+INLINE_API SRMAccessResponseReasonCode_t GetReasonCode(
     SRMAccessResponse_t response)
 {
     SRMAccessResponseReasonCode_t reason =
@@ -150,7 +152,7 @@ static inline SRMAccessResponseReasonCode_t GetReasonCode(
 /**
  * Returns 'true' iff request should be passed on to RI layer.
  */
-static inline bool IsAccessGranted(SRMAccessResponse_t response)
+INLINE_API bool IsAccessGranted(SRMAccessResponse_t response)
 {
     if(ACCESS_GRANTED == (response & ACCESS_GRANTED))
     {
@@ -428,6 +430,9 @@ struct OicSecSacl
 {
     // <Attribute ID>:<Read/Write>:<Multiple/Single>:<Mandatory?>:<Type>
     //TODO fill in from OIC Security Spec
+#if defined(_MSC_VER)
+    uint8_t unused; // VS doesn't like empty structs
+#endif
 };
 
 /**
index 3de36e6..e1c6d5a 100644 (file)
@@ -24,6 +24,7 @@
 #include <unistd.h>
 #endif
 
+#include "platform_features.h"
 #include "logger.h"
 #include "oic_malloc.h"
 #include "oic_string.h"
index 454554a..adec06f 100644 (file)
@@ -445,11 +445,7 @@ int main()
             OIC_LOG(ERROR, TAG, "OCStack process error");
             return 0;
         }
-#if defined(_WIN32)
-        Sleep(100);
-#else
         nanosleep(&timeout, NULL);
-#endif //defined(_WIN32)
     }
 
     OIC_LOG(INFO, TAG, "Exiting ocserver main loop...");
index ab87dfe..06a5512 100644 (file)
@@ -462,11 +462,7 @@ int main()
             OIC_LOG(ERROR, TAG, "OCStack process error");
             return 0;
         }
-#if defined(_WIN32)
-        Sleep(100);
-#else
         nanosleep(&timeout, NULL);
-#endif //!defined(_WIN32)
     }
 
     OIC_LOG(INFO, TAG, "Exiting ocserver main loop...");
index 7b22d46..f5768a0 100644 (file)
 #define _POSIX_C_SOURCE 200809L
 #endif
 
+#ifdef HAVE_TIME_H
 #include <time.h>
+#endif
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
+#endif
+#ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
+#endif
 #include <stdbool.h>
 #include <string.h>
 
index 65c1bd4..449527c 100644 (file)
@@ -352,31 +352,68 @@ exit:
  */
 OCStackResult PMTimeout(unsigned short waittime, bool waitForStackResponse)
 {
+    OCStackResult res = OC_STACK_OK;
+#if defined(HAVE_GETSYSTEMTIMEASFILETIME)
+    FILETIME startTime = {0};
+    FILETIME currTime = {0};
+    int clock_res = 1;
+
+    GetSystemTimeAsFileTime(&startTime);
+#elif defined(HAVE_CLOCK_GETTIME)
     struct timespec startTime = {.tv_sec=0, .tv_nsec=0};
     struct timespec currTime  = {.tv_sec=0, .tv_nsec=0};
 
-    OCStackResult res = OC_STACK_OK;
-#ifdef _POSIX_MONOTONIC_CLOCK
+# if defined(_POSIX_MONOTONIC_CLOCK)
     int clock_res = clock_gettime(CLOCK_MONOTONIC, &startTime);
-#else
+# else
     int clock_res = clock_gettime(CLOCK_REALTIME, &startTime);
+# endif // defined(_POSIX_MONOTONIC_CLOCK)
+
+#else
+    ERROR Need PMTimeout implementation
+    return OC_STACK_ERROR;
 #endif
+
     if (0 != clock_res)
     {
         return OC_STACK_ERROR;
     }
     while (OC_STACK_OK == res)
     {
-#ifdef _POSIX_MONOTONIC_CLOCK
+#if defined(HAVE_GETSYSTEMTIMEASFILETIME)
+        GetSystemTimeAsFileTime(&currTime);
+#elif defined(HAVE_CLOCK_GETTIME)
+
+# if defined(_POSIX_MONOTONIC_CLOCK)
         clock_res = clock_gettime(CLOCK_MONOTONIC, &currTime);
-#else
+# else
         clock_res = clock_gettime(CLOCK_REALTIME, &currTime);
-#endif
+# endif
         if (0 != clock_res)
         {
             return OC_STACK_TIMEOUT;
         }
+#else
+        ERROR Need PMTimeout implementation
+#endif
+
+#if defined(HAVE_GETSYSTEMTIMEASFILETIME)
+#define HNS_TO_S(VAL)  ((VAL)/(10*1000*1000))
+        ULARGE_INTEGER currTimeInt;
+        ULARGE_INTEGER startTimeInt;
+
+        currTimeInt.LowPart  = currTime.dwLowDateTime;
+        currTimeInt.HighPart = currTime.dwHighDateTime;
+
+        startTimeInt.LowPart  = startTime.dwLowDateTime;
+        startTimeInt.HighPart = startTime.dwHighDateTime;
+
+        long elapsed = (long)HNS_TO_S(currTimeInt.QuadPart - startTimeInt.QuadPart);
+#elif defined(HAVE_CLOCK_GETTIME)
         long elapsed = (currTime.tv_sec - startTime.tv_sec);
+#else
+        ERROR Need PMTimeout implementation
+#endif
         if (elapsed > waittime)
         {
             return OC_STACK_OK;
index 4ead7a3..76c2c38 100644 (file)
@@ -56,7 +56,7 @@ OCStackResult DiscoverAmsService(PEContext_t *context)
 
     OCStackResult ret = OC_STACK_ERROR;
     const char DOXM_DEVICEID_QUERY_FMT[] = "%s?%s=%s";
-    char uri[MAX_URI_LENGTH + MAX_QUERY_LENGTH] = {};
+    char uri[MAX_URI_LENGTH + MAX_QUERY_LENGTH] = {0};
     OCCallbackData cbData = {.context=NULL};
 
     VERIFY_NON_NULL(TAG, context, ERROR);
@@ -120,7 +120,7 @@ static OCStackApplicationResult AmsMgrDiscoveryCallback(void *ctx, OCDoHandle ha
         return OC_STACK_KEEP_TRANSACTION;
     }
 
-    OicUuid_t deviceId = {.id={}};
+    OicUuid_t deviceId = {.id={0}};
     memcpy(&deviceId, &doxm->deviceID, sizeof(deviceId));
     OICFree(doxm);
 
@@ -151,7 +151,7 @@ OCStackResult SendUnicastSecurePortDiscovery(PEContext_t *context,OCDevAddr *dev
 
     const char RES_DOXM_QUERY_FMT[] = "%s?%s=%s";
     OCCallbackData cbData = {.context=NULL};
-    char uri[MAX_URI_LENGTH + MAX_QUERY_LENGTH] = {};
+    char uri[MAX_URI_LENGTH + MAX_QUERY_LENGTH] = {0};
     snprintf(uri, sizeof(uri), RES_DOXM_QUERY_FMT, OC_RSRVD_WELL_KNOWN_URI,
             OC_RSRVD_RESOURCE_TYPE, OIC_RSRC_TYPE_SEC_DOXM);
 
@@ -226,9 +226,9 @@ OCStackResult SendAclReq(PEContext_t *context, OCDevAddr *devAddr, OCConnectivit
 {
     OCStackResult ret = OC_STACK_ERROR;
     const char GET_ACE_QUERY_FMT[] = "%s?%s=%s;%s=%s";
-    char base64Buff[B64ENCODE_OUT_SAFESIZE(sizeof(((OicUuid_t*)0)->id)) + 1] = {};
+    char base64Buff[B64ENCODE_OUT_SAFESIZE(sizeof(((OicUuid_t*)0)->id)) + 1] = {0};
     uint32_t outLen = 0;
-    char uri[MAX_URI_LENGTH + MAX_QUERY_LENGTH] = {};
+    char uri[MAX_URI_LENGTH + MAX_QUERY_LENGTH] = {0};
     OCCallbackData cbData = {.context=NULL};
     OCDevAddr destAddr = {.adapter = OC_ADAPTER_IP};
     B64Result b64Ret;
@@ -400,7 +400,7 @@ bool FoundAmaclForRequest(PEContext_t *context)
 
 void ProcessAMSRequest(PEContext_t *context)
 {
-    OicUuid_t  emptyUuid = {.id={}};
+    OicUuid_t  emptyUuid = {.id={0}};
     OIC_LOG_V(INFO, TAG, "Entering %s", __func__);
     if (NULL != context)
     {
index 07bc8ea..ad37dc9 100644 (file)
 #define __STDC_LIMIT_MACROS
 
 #include <stdlib.h>
-#ifdef WITH_ARDUINO
+#ifdef HAVE_STRING_H
 #include <string.h>
-#else
+#endif
+#ifdef HAVE_STRINGS_H
 #include <strings.h>
 #endif
 #include <stdint.h>
@@ -1207,7 +1208,7 @@ int32_t GetDtlsPskCredentials(CADtlsPskCredType_t type,
         case CA_DTLS_PSK_HINT:
         case CA_DTLS_PSK_IDENTITY:
             {
-                OicUuid_t deviceID = {.id={}};
+                OicUuid_t deviceID = {.id={0}};
                 // Retrieve Device ID from doxm resource
                 if ( OC_STACK_OK != GetDoxmDeviceID(&deviceID) )
                 {
index 46d65b9..e31f3e8 100644 (file)
@@ -27,8 +27,7 @@
 #include "oic_string.h"
 
 #ifndef HAVE_STRPTIME
-//  ### to be fixed later
-#define    strptime(a,b,c)   NULL
+char *strptime(const char *buf, const char *fmt, struct tm *tm);
 #endif
 
 static char dtFormat[] =  "%Y%m%dT%H%M%S"; //date-time format
index 02c984a..785234a 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <string.h>
 #include <math.h>
+#include "platform_features.h"
 #include "pbkdf2.h"
 #include "hmac.h"
 #include "debug.h"
index 4a4694d..ee991fe 100644 (file)
@@ -214,9 +214,9 @@ bool IsRequestFromResourceOwner(PEContext_t *context)
     return retVal;
 }
 
-inline static bool IsRequestSubjectEmpty(PEContext_t *context)
+INLINE_API bool IsRequestSubjectEmpty(PEContext_t *context)
 {
-    OicUuid_t emptySubject = {.id={}};
+    OicUuid_t emptySubject = {.id={0}};
 
     if(NULL == context)
     {
@@ -235,7 +235,7 @@ inline static bool IsRequestSubjectEmpty(PEContext_t *context)
  *
  * @return true if 'permission' bits include all 'request' bits.
  */
-static inline bool IsPermissionAllowingRequest(const uint16_t permission,
+INLINE_API bool IsPermissionAllowingRequest(const uint16_t permission,
     const uint16_t request)
 {
     if (request == (request & permission))
@@ -253,7 +253,7 @@ static inline bool IsPermissionAllowingRequest(const uint16_t permission,
  *
  * @return true if 'subject' is the wildcard, false if it is not.
  */
-static inline bool IsWildCardSubject(OicUuid_t *subject)
+INLINE_API bool IsWildCardSubject(OicUuid_t *subject)
 {
     if(NULL == subject)
     {
@@ -476,7 +476,7 @@ SRMAccessResponse_t CheckPermission(PEContext_t     *context,
         // Else request is a "normal" request that must be tested against ACL
         else
         {
-            OicUuid_t saveSubject = {.id={}};
+            OicUuid_t saveSubject = {.id={0}};
             bool isSubEmpty = IsRequestSubjectEmpty(context);
 
             ProcessAccessRequest(context);
index c10b097..d263892 100644 (file)
 #define TAG  "SRM-PSI"
 
 //SVR database buffer block size
+#ifdef _WIN32
+#define DB_FILE_SIZE_BLOCK 1023
+#else
 const size_t DB_FILE_SIZE_BLOCK = 1023;
+#endif
 
 /**
  * Gets the Secure Virtual Database size
index 26a9277..93cfeba 100644 (file)
@@ -183,7 +183,8 @@ void SRMRequestHandler(const CAEndpoint_t *endPoint, const CARequestInfo_t *requ
 
     if (IsAccessGranted(response) && gRequestHandler)
     {
-        return (gRequestHandler(endPoint, requestInfo));
+        gRequestHandler(endPoint, requestInfo);
+        return;
     }
 
     // Form a 'Error', 'slow response' or 'access deny' response and send to peer
index 1cc5694..dd56ded 100644 (file)
@@ -92,7 +92,7 @@ OCStackResult AddUuidArray(const cJSON* jsonRoot, const char* arrayItem,
 
     do
     {
-        unsigned char base64Buff[sizeof(((OicUuid_t*)0)->id)] = {};
+        unsigned char base64Buff[sizeof(((OicUuid_t*)0)->id)] = {0};
         uint32_t outLen = 0;
         B64Result b64Ret = B64_OK;
 
diff --git a/resource/csdk/security/src/strptime.c b/resource/csdk/security/src/strptime.c
new file mode 100644 (file)
index 0000000..5e2e7e2
--- /dev/null
@@ -0,0 +1,135 @@
+/** @todo: Add Microsoft copyright */
+#include <stdio.h>
+#include <ctype.h>
+#include <time.h>
+#include <memory.h>
+#include <stdbool.h>
+
+#define TM_BASE_YEAR   1900
+
+static const int ydays[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
+
+bool is_leap_year(int yy)
+{
+    int yyyy = yy + TM_BASE_YEAR;
+
+    bool bLeap = false;
+    if (yyyy % 100 == 0)
+    {
+        return yyyy % 400 == 0;
+    }
+    return yyyy % 4 == 0;
+}
+
+
+char * strptime(const char *buf, const char *fmt, struct tm *tm)
+{
+    char c;
+    int temp = 0;
+
+    //initialize the tm struct values
+    memset(tm, 0, sizeof(struct tm));
+    tm->tm_mday = 1;
+
+    while (buf && (c = *fmt++))
+    {
+        temp = 0;
+        if (c == '%')
+        {
+            switch (c = *fmt++)
+            {
+            case '%':
+                if (c != *buf++)
+                {
+                    return NULL;
+                }
+                break;
+
+            case 'd':   /* day of the month (1..31)*/
+                sscanf(buf, "%2d", &temp);
+                if (temp >= 1 && temp <= 31)
+                {
+                    tm->tm_mday = temp;
+                    buf += 2;
+                }
+                else
+                    return NULL;
+                break;
+
+            case 'H':   /* hour (0..23) */
+                sscanf(buf, "%2d", &temp);
+                if (temp >= 0 && temp <= 23)
+                {
+                    tm->tm_hour = temp;
+                    buf += 2;
+                }
+                else
+                    return NULL;
+                break;
+
+            case 'M':   /* minute (0..59) */
+                sscanf(buf, "%2d", &temp);
+                if (temp >= 0 && temp <= 59)
+                {
+                    tm->tm_min = temp;
+                    buf += 2;
+                }
+                else
+                    return NULL;
+                break;
+
+            case 'm':   /* month (1..12) */
+                sscanf(buf, "%2d", &temp);
+                if (temp >= 1 && temp <= 12)
+                {
+                    tm->tm_mon = temp - 1;
+                    buf += 2;
+                }
+                else
+                    return NULL;
+                break;
+
+            case 'S':   /* seconds (0..59) */
+                sscanf(buf, "%2d", &temp);
+                if (temp >= 0 && temp <= 59)
+                {
+                    tm->tm_sec = temp;
+                    buf += 2;
+                }
+                else
+                    return NULL;
+                break;
+
+            case 'Y':   /* year */
+                sscanf(buf, "%4d", &temp);
+                if (temp >= 0 && temp <= 9999)
+                {
+                    tm->tm_year = temp - TM_BASE_YEAR;
+                    buf += 4;
+                }
+                else
+                    return NULL;
+                break;
+
+            default:
+                return NULL;
+            }
+        }
+        else
+        {
+            if (c != *buf++)
+                return NULL;
+        }
+    }
+
+    //calculate tm_wday and tm_yday
+    tm->tm_yday = ydays[tm->tm_mon] + ((is_leap_year(tm->tm_year) && (tm->tm_mon >= 2)) ? 1 : 0) + tm->tm_mday - 1;
+
+    //1st Jan 1900 was Monday, hence weekday = the number of days from 1/1/1900  modulus 7 + 1
+    tm->tm_wday = (365 * tm->tm_year) + (tm->tm_year / 4) + tm->tm_yday + 1;        //1st Jan 1900 was Monday, hence add 1
+    if (is_leap_year(tm->tm_year))
+        tm->tm_wday--;
+    tm->tm_wday %= 7;
+
+    return (char*)buf;
+}
index 558406a..a2e10af 100644 (file)
@@ -19,9 +19,6 @@
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
 #include "gtest/gtest.h"
-#include <pwd.h>
-#include <grp.h>
-#include <linux/limits.h>
 #include <sys/stat.h>
 #include "ocstack.h"
 #include "psinterface.h"
@@ -47,8 +44,8 @@ using namespace std;
 #define TAG  "SRM-ACL-UT"
 
 // These paths match jenkins build configuration.
-const char* DEFAULT_ACL_FILE_NAME = "/oic_unittest_default_acl.dat";
-const char* ACL1_FILE_NAME = "/oic_unittest_acl1.dat";
+const char* DEFAULT_ACL_FILE_NAME = "oic_unittest_default_acl.dat";
+const char* ACL1_FILE_NAME = "oic_unittest_acl1.dat";
 
 #define NUM_ACE_FOR_WILDCARD_IN_ACL1_DAT (1)
 
@@ -265,6 +262,11 @@ TEST(ACLResourceTest, ACLPostTest)
     DeleteACLList(acl);
 }
 
+extern "C" {
+    // gAcl is a pointer to the the global ACL used by SRM
+    extern OicSecAcl_t  *gAcl;
+}
+
 // GetACLResource tests
 TEST(ACLResourceTest, GetACLResourceTests)
 {
index 6c1c20d..80eb186 100644 (file)
@@ -85,6 +85,31 @@ static void printRecur(IotvtICalRecur_t *recur)
     }
 }
 
+#ifndef HAVE_LOCALTIME_R
+
+#define localtime_r localtime_r_compat
+
+/**
+ * @description An implementation of `localtime_r` for systems which only
+ * have a `localtime` implementation.
+ */
+static tm* localtime_r_compat(const time_t* timer, tm* result)
+{
+    if (NULL == result)
+    {
+        OIC_LOG(ERROR, TAG, "localtime_r received null results parameter");
+    }
+
+    if (NULL == timer)
+    {
+        OIC_LOG(WARNING, TAG, "localtime_r received null timer parameter");
+    }
+
+    tm* tempPtr = localtime(timer);
+    memcpy(result, tempPtr, sizeof(tm));
+    return result;
+}
+#endif
 
 static void checkValidityOfRequest(char *recurStr, char *periodStr,int startTime, int endTime,
                                     int byDay)
index 4806a96..b73881d 100644 (file)
@@ -19,9 +19,6 @@
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
 #include "gtest/gtest.h"
-#include <pwd.h>
-#include <grp.h>
-#include <linux/limits.h>
 #include "ocstack.h"
 #include "cainterface.h"
 #include "srmresourcestrings.h"
index d1c9396..b9e5ceb 100644 (file)
@@ -18,7 +18,9 @@
 //
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
+#endif
 #include "gtest/gtest.h"
 
 #include "ocpayload.h"
index 95cf63c..2917709 100644 (file)
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
 #include "gtest/gtest.h"
+#ifdef HAVE_PWD_H
 #include <pwd.h>
+#endif
+#ifdef HAVE_GRP_H
 #include <grp.h>
+#endif
+#ifdef HAVE_LINUX_LIMITS_H
 #include <linux/limits.h>
+#endif
 #include "ocstack.h"
 #include "cainterface.h"
 #include "secureresourcemanager.h"
@@ -119,6 +125,12 @@ TEST(PersistentStorageHandlerTest, RegisterValidHandler)
     EXPECT_TRUE(&gpsi == ps);
 }
 
+#if !(defined(HAVE_LINUX_LIMITS_H) && defined(HAVE_PWD_H))
+TEST(PersistentStorageHandlerTest, DISABLED_PersistentStorageValidHandlers)
+{
+    /** @todo: Implement test on non-Linux platform */
+}
+#else
 TEST(PersistentStorageHandlerTest, PersistentStorageValidHandlers)
 {
     OCPersistentStorage *psi = SRMGetPersistentStorageHandler();
@@ -157,3 +169,5 @@ TEST(PersistentStorageHandlerTest, PersistentStorageValidHandlers)
     }
     psi->unlink(outFilePath);
 }
+#endif
+
index 1435ad5..5bfe64e 100644 (file)
@@ -28,7 +28,7 @@
 #define STRINGIZE(x) STRINGIZE2(x)
 
 // TODO: Remove this, once all cbor related are completed.
-char* ReadFile(const char* filename)
+char* ReadFileToBuffer(const char* filename)
 {
 
     FILE *fp = NULL;
index ff5c453..8b81e91 100644 (file)
@@ -21,7 +21,7 @@
 #ifndef IOTVT_SRM_TEST_COMMON_H
 #define IOTVT_SRM_TEST_COMMON_H
 
-char* ReadFile(const char* filename);
+char* ReadFileToBuffer(const char* filename);
 bool ReadCBORFile(const char* filename, const char* rsrcName, uint8_t **payload, size_t *size);
 void SetPersistentHandler(OCPersistentStorage *ps, bool set);
 
index 052afad..8444694 100644 (file)
 extern "C"
 {
 #endif
-OCStackResult OCParsePayload(OCPayload** outPayload, OCPayloadType type,
+OC_EXPORT_TEST OCStackResult OCParsePayload(OCPayload** outPayload, OCPayloadType type,
         const uint8_t* payload, size_t payloadSize);
 
-OCStackResult OCConvertPayload(OCPayload* payload, uint8_t** outPayload, size_t* size);
+OC_EXPORT_TEST OCStackResult OCConvertPayload(OCPayload* payload, uint8_t** outPayload, size_t* size);
 
 #ifdef __cplusplus
 }
index bef3e98..a985d67 100644 (file)
@@ -289,9 +289,9 @@ OCStackResult OCChangeResourceProperty(OCResourceProperty * inputProperty,
         OCResourceProperty resourceProperties, uint8_t enable);
 #endif
 
-const char *convertTriggerEnumToString(OCPresenceTrigger trigger);
+OC_EXPORT const char *convertTriggerEnumToString(OCPresenceTrigger trigger);
 
-OCPresenceTrigger convertTriggerStringToEnum(const char * triggerStr);
+OC_EXPORT OCPresenceTrigger convertTriggerStringToEnum(const char * triggerStr);
 
 void CopyEndpointToDevAddr(const CAEndpoint_t *in, OCDevAddr *out);
 
index 40f85d7..9857b2d 100644 (file)
@@ -60,33 +60,33 @@ 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* iface);
+OC_EXPORT bool OCRepPayloadAddResourceType(OCRepPayload* payload, const char* resourceType);
+OC_EXPORT bool OCRepPayloadAddInterface(OCRepPayload* payload, const char* iface);
 
-bool OCRepPayloadAddResourceTypeAsOwner(OCRepPayload* payload, char* resourceType);
-bool OCRepPayloadAddInterfaceAsOwner(OCRepPayload* payload, char* iface);
+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.
@@ -97,7 +97,7 @@ bool OCRepPayloadGetPropDouble(const OCRepPayload* payload, const char* name, do
  *
  * @return true on success, false upon failure.
  */
-bool OCRepPayloadSetPropByteString(OCRepPayload* payload, const char* name, OCByteString value);
+OC_EXPORT bool OCRepPayloadSetPropByteString(OCRepPayload* payload, const char* name, OCByteString value);
 
 /**
  * This function sets the byte string in the payload.
@@ -108,7 +108,7 @@ bool OCRepPayloadSetPropByteString(OCRepPayload* payload, const char* name, OCBy
  *
  * @return true on success, false upon failure.
  */
-bool OCRepPayloadSetPropByteStringAsOwner(OCRepPayload* payload, const char* name,
+OC_EXPORT bool OCRepPayloadSetPropByteStringAsOwner(OCRepPayload* payload, const char* name,
         OCByteString* value);
 
 /**
@@ -122,20 +122,19 @@ bool OCRepPayloadSetPropByteStringAsOwner(OCRepPayload* payload, const char* nam
  *
  * @return true on success, false upon failure.
  */
-bool OCRepPayloadGetPropByteString(const OCRepPayload* payload, const char* name,
+OC_EXPORT bool OCRepPayloadGetPropByteString(const OCRepPayload* payload, const char* name,
         OCByteString* value);
 
-bool OCRepPayloadSetPropString(OCRepPayload* payload, const char* name, const char* value);
-bool OCRepPayloadSetPropStringAsOwner(OCRepPayload* payload, const char* name, char* value);
-bool OCRepPayloadGetPropString(const OCRepPayload* payload, const char* name, char** value);
+OC_EXPORT bool OCRepPayloadSetPropString(OCRepPayload* payload, const char* name, const char* value);
+OC_EXPORT bool OCRepPayloadSetPropStringAsOwner(OCRepPayload* payload, const char* name, char* value);
+OC_EXPORT bool OCRepPayloadGetPropString(const OCRepPayload* payload, const char* name, char** value);
 
-bool OCRepPayloadSetPropBool(OCRepPayload* payload, const char* name, bool value);
-bool OCRepPayloadGetPropBool(const OCRepPayload* payload, const char* name, bool* value);
+OC_EXPORT bool OCRepPayloadSetPropBool(OCRepPayload* payload, const char* name, bool value);
+OC_EXPORT bool OCRepPayloadGetPropBool(const OCRepPayload* payload, const char* name, bool* value);
 
-bool OCRepPayloadSetPropObject(OCRepPayload* payload, const char* name, const OCRepPayload* value);
-bool OCRepPayloadSetPropObjectAsOwner(OCRepPayload* payload, const char* name,
-        OCRepPayload* value);
-bool OCRepPayloadGetPropObject(const OCRepPayload* payload, const char* name, OCRepPayload** value);
+OC_EXPORT bool OCRepPayloadSetPropObject(OCRepPayload* payload, const char* name, const OCRepPayload* value);
+OC_EXPORT bool OCRepPayloadSetPropObjectAsOwner(OCRepPayload* payload, const char* name, OCRepPayload* value);
+OC_EXPORT bool OCRepPayloadGetPropObject(const OCRepPayload* payload, const char* name, OCRepPayload** value);
 
 /**
  * This function allocates memory for the byte string array and sets it in the payload.
@@ -147,7 +146,7 @@ bool OCRepPayloadGetPropObject(const OCRepPayload* payload, const char* name, OC
  *
  * @return true on success, false upon failure.
  */
-bool OCRepPayloadSetByteStringArrayAsOwner(OCRepPayload* payload, const char* name,
+OC_EXPORT bool OCRepPayloadSetByteStringArrayAsOwner(OCRepPayload* payload, const char* name,
         OCByteString* array, size_t dimensions[MAX_REP_ARRAY_DEPTH]);
 
 /**
@@ -160,7 +159,7 @@ bool OCRepPayloadSetByteStringArrayAsOwner(OCRepPayload* payload, const char* na
  *
  * @return true on success, false upon failure.
  */
-bool OCRepPayloadSetByteStringArray(OCRepPayload* payload, const char* name,
+OC_EXPORT bool OCRepPayloadSetByteStringArray(OCRepPayload* payload, const char* name,
         const OCByteString* array, size_t dimensions[MAX_REP_ARRAY_DEPTH]);
 
 /**
@@ -176,82 +175,82 @@ bool OCRepPayloadSetByteStringArray(OCRepPayload* payload, const char* name,
  *
  * @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,
+OC_EXPORT void OCDiscoveryPayloadAddResource(OCDiscoveryPayload* payload, const OCResource* res,
                                    uint16_t securePort, uint16_t tcpPort);
-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);
 
 #ifdef __cplusplus
 }
index 9eeae7e..c774af6 100644 (file)
@@ -52,7 +52,7 @@ extern "C" {
  *
  * @return ::OC_STACK_OK on success, some other value upon failure.
  */
-OCStackResult OCInit1(OCMode mode, OCTransportFlags serverFlags, OCTransportFlags clientFlags);
+OC_EXPORT OCStackResult OCInit1(OCMode mode, OCTransportFlags serverFlags, OCTransportFlags clientFlags);
 
 /**
  * This function Initializes the OC Stack.  Must be called prior to starting the stack.
@@ -63,7 +63,7 @@ OCStackResult OCInit1(OCMode mode, OCTransportFlags serverFlags, OCTransportFlag
  *
  * @return ::OC_STACK_OK on success, some other value upon failure.
  */
-OCStackResult OCInit(const char *ipAddr, uint16_t port, OCMode mode);
+OC_EXPORT OCStackResult OCInit(const char *ipAddr, uint16_t port, OCMode mode);
 
 #ifdef RA_ADAPTER
 /**
@@ -85,7 +85,7 @@ OCStackResult OCSetRAInfo(const OCRAInfo_t *raInfo);
  *
  * @return ::OC_STACK_OK on success, some other value upon failure.
  */
-OCStackResult OCStop();
+OC_EXPORT OCStackResult OCStop();
 
 /**
  * This function starts receiving the multicast traffic. This can be only called
@@ -112,7 +112,7 @@ OCStackResult OCStopMulticastServer();
  *
  * @return ::OC_STACK_OK on success, some other value upon failure.
  */
-OCStackResult OCProcess();
+OC_EXPORT OCStackResult OCProcess();
 
 /**
  * This function discovers or Perform requests on a specified resource
@@ -147,16 +147,16 @@ OCStackResult OCProcess();
  *
  * @return ::OC_STACK_OK on success, some other value upon failure.
  */
-OCStackResult OCDoResource(OCDoHandle *handle,
-                            OCMethod method,
-                            const char *requestUri,
-                            const OCDevAddr *destination,
-                            OCPayload* payload,
-                            OCConnectivityType connectivityType,
-                            OCQualityOfService qos,
-                            OCCallbackData *cbData,
-                            OCHeaderOption *options,
-                            uint8_t numOptions);
+OC_EXPORT OCStackResult OCDoResource(OCDoHandle *handle,
+                                     OCMethod method,
+                                     const char *requestUri,
+                                     const OCDevAddr *destination,
+                                     OCPayload* payload,
+                                     OCConnectivityType connectivityType,
+                                     OCQualityOfService qos,
+                                     OCCallbackData *cbData,
+                                     OCHeaderOption *options,
+                                     uint8_t numOptions);
 /**
  * This function cancels a request associated with a specific @ref OCDoResource invocation.
  *
@@ -168,8 +168,10 @@ OCStackResult OCDoResource(OCDoHandle *handle,
  *
  * @return ::OC_STACK_OK on success, some other value upon failure.
  */
-OCStackResult OCCancel(OCDoHandle handle, OCQualityOfService qos, OCHeaderOption * options,
-        uint8_t numOptions);
+OC_EXPORT OCStackResult OCCancel(OCDoHandle handle,
+                                 OCQualityOfService qos,
+                                 OCHeaderOption * options,
+                                 uint8_t numOptions);
 
 /**
  * Register Persistent storage callback.
@@ -179,7 +181,7 @@ OCStackResult OCCancel(OCDoHandle handle, OCQualityOfService qos, OCHeaderOption
  *     OC_STACK_OK                    No errors; Success.
  *     OC_STACK_INVALID_PARAM         Invalid parameter.
  */
-OCStackResult OCRegisterPersistentStorageHandler(OCPersistentStorage* persistentStorageHandler);
+OC_EXPORT OCStackResult OCRegisterPersistentStorageHandler(OCPersistentStorage* persistentStorageHandler);
 
 #ifdef WITH_PRESENCE
 /**
@@ -198,7 +200,7 @@ OCStackResult OCRegisterPersistentStorageHandler(OCPersistentStorage* persistent
  *
  * @return ::OC_STACK_OK on success, some other value upon failure.
  */
-OCStackResult OCStartPresence(const uint32_t ttl);
+OC_EXPORT OCStackResult OCStartPresence(const uint32_t ttl);
 
 /**
  * When operating in OCServer or OCClientServer mode, this API will stop sending
@@ -212,7 +214,7 @@ OCStackResult OCStartPresence(const uint32_t ttl);
  * @return ::OC_STACK_OK on success, some other value upon failure.
  */
 
-OCStackResult OCStopPresence();
+OC_EXPORT OCStackResult OCStopPresence();
 #endif
 
 
@@ -226,7 +228,7 @@ OCStackResult OCStopPresence();
  *
  * @return ::OC_STACK_OK on success, some other value upon failure.
  */
-OCStackResult OCSetDefaultDeviceEntityHandler(OCDeviceEntityHandler entityHandler, void* callbackParameter);
+OC_EXPORT OCStackResult OCSetDefaultDeviceEntityHandler(OCDeviceEntityHandler entityHandler, void* callbackParameter);
 
 /**
  * This function sets device information.
@@ -238,7 +240,7 @@ OCStackResult OCSetDefaultDeviceEntityHandler(OCDeviceEntityHandler entityHandle
  *     ::OC_STACK_INVALID_PARAM    invalid parameter.
  *     ::OC_STACK_ERROR            stack process error.
  */
-OCStackResult OCSetDeviceInfo(OCDeviceInfo deviceInfo);
+OC_EXPORT OCStackResult OCSetDeviceInfo(OCDeviceInfo deviceInfo);
 
 /**
  * This function sets platform information.
@@ -252,7 +254,7 @@ OCStackResult OCSetDeviceInfo(OCDeviceInfo deviceInfo);
  *     ::OC_STACK_INVALID_PARAM    invalid parameter.
  *     ::OC_STACK_ERROR            stack process error.
  */
-OCStackResult OCSetPlatformInfo(OCPlatformInfo platformInfo);
+OC_EXPORT OCStackResult OCSetPlatformInfo(OCPlatformInfo platformInfo);
 
 /**
  * This function creates a resource.
@@ -271,13 +273,13 @@ OCStackResult OCSetPlatformInfo(OCPlatformInfo platformInfo);
  *
  * @return ::OC_STACK_OK on success, some other value upon failure.
  */
-OCStackResult OCCreateResource(OCResourceHandle *handle,
-                               const char *resourceTypeName,
-                               const char *resourceInterfaceName,
-                               const char *uri,
-                               OCEntityHandler entityHandler,
-                               void* callbackParam,
-                               uint8_t resourceProperties);
+OC_EXPORT OCStackResult OCCreateResource(OCResourceHandle *handle,
+                                         const char *resourceTypeName,
+                                         const char *resourceInterfaceName,
+                                         const char *uri,
+                                         OCEntityHandler entityHandler,
+                                         void* callbackParam,
+                                         uint8_t resourceProperties);
 
 
 /**
@@ -288,7 +290,7 @@ OCStackResult OCCreateResource(OCResourceHandle *handle,
  *
  * @return ::OC_STACK_OK on success, some other value upon failure.
  */
-OCStackResult OCBindResource(OCResourceHandle collectionHandle, OCResourceHandle resourceHandle);
+OC_EXPORT OCStackResult OCBindResource(OCResourceHandle collectionHandle, OCResourceHandle resourceHandle);
 
 /**
  * This function removes a resource from a collection resource.
@@ -298,7 +300,7 @@ OCStackResult OCBindResource(OCResourceHandle collectionHandle, OCResourceHandle
  *
  * @return ::OC_STACK_OK on success, some other value upon failure.
  */
-OCStackResult OCUnBindResource(OCResourceHandle collectionHandle, OCResourceHandle resourceHandle);
+OC_EXPORT OCStackResult OCUnBindResource(OCResourceHandle collectionHandle, OCResourceHandle resourceHandle);
 
 /**
  * This function binds a resource type to a resource.
@@ -308,8 +310,8 @@ OCStackResult OCUnBindResource(OCResourceHandle collectionHandle, OCResourceHand
  *
  * @return ::OC_STACK_OK on success, some other value upon failure.
  */
-OCStackResult OCBindResourceTypeToResource(OCResourceHandle handle,
-                                           const char *resourceTypeName);
+OC_EXPORT OCStackResult OCBindResourceTypeToResource(OCResourceHandle handle,
+                                                     const char *resourceTypeName);
 /**
  * This function binds a resource interface to a resource.
  *
@@ -318,8 +320,8 @@ OCStackResult OCBindResourceTypeToResource(OCResourceHandle handle,
  *
  * @return ::OC_STACK_OK on success, some other value upon failure.
  */
-OCStackResult OCBindResourceInterfaceToResource(OCResourceHandle handle,
-                                                const char *resourceInterfaceName);
+OC_EXPORT OCStackResult OCBindResourceInterfaceToResource(OCResourceHandle handle,
+                                                          const char *resourceInterfaceName);
 
 /**
  * This function binds an entity handler to the resource.
@@ -330,8 +332,9 @@ OCStackResult OCBindResourceInterfaceToResource(OCResourceHandle handle,
  *
  * @return ::OC_STACK_OK on success, some other value upon failure.
  */
-OCStackResult OCBindResourceHandler(OCResourceHandle handle, OCEntityHandler entityHandler,
-                                        void *callbackParameter);
+OC_EXPORT OCStackResult OCBindResourceHandler(OCResourceHandle handle,
+                                              OCEntityHandler entityHandler,
+                                              void *callbackParameter);
 
 /**
  * This function gets the number of resources that have been created in the stack.
@@ -340,7 +343,7 @@ OCStackResult OCBindResourceHandler(OCResourceHandle handle, OCEntityHandler ent
  *
  * @return ::OC_STACK_OK on success, some other value upon failure.
  */
-OCStackResult OCGetNumberOfResources(uint8_t *numResources);
+OC_EXPORT OCStackResult OCGetNumberOfResources(uint8_t *numResources);
 
 /**
  * This function gets a resource handle by index.
@@ -349,7 +352,7 @@ OCStackResult OCGetNumberOfResources(uint8_t *numResources);
  *
  * @return Found  resource handle or NULL if not found.
  */
-OCResourceHandle OCGetResourceHandle(uint8_t index);
+OC_EXPORT OCResourceHandle OCGetResourceHandle(uint8_t index);
 
 /**
  * This function deletes resource specified by handle.  Deletes resource and all
@@ -362,7 +365,7 @@ OCResourceHandle OCGetResourceHandle(uint8_t index);
  *
  * @return ::OC_STACK_OK on success, some other value upon failure.
  */
-OCStackResult OCDeleteResource(OCResourceHandle handle);
+OC_EXPORT OCStackResult OCDeleteResource(OCResourceHandle handle);
 
 /**
  * Get a string representation the server instance ID.
@@ -374,7 +377,7 @@ OCStackResult OCDeleteResource(OCResourceHandle handle);
  *
  * @return A string representation  the server instance ID.
  */
-const char* OCGetServerInstanceIDString(void);
+OC_EXPORT const char* OCGetServerInstanceIDString(void);
 
 /**
  * This function gets the URI of the resource specified by handle.
@@ -383,7 +386,7 @@ const char* OCGetServerInstanceIDString(void);
  *
  * @return URI string if resource found or NULL if not found.
  */
-const char *OCGetResourceUri(OCResourceHandle handle);
+OC_EXPORT const char *OCGetResourceUri(OCResourceHandle handle);
 
 /**
  * This function gets the properties of the resource specified by handle.
@@ -395,7 +398,7 @@ const char *OCGetResourceUri(OCResourceHandle handle);
  * @note that after a resource is created, the OC_ACTIVE property is set for the resource by the
  * stack.
  */
-OCResourceProperty OCGetResourceProperties(OCResourceHandle handle);
+OC_EXPORT OCResourceProperty OCGetResourceProperties(OCResourceHandle handle);
 
 /**
  * This function gets the number of resource types of the resource.
@@ -405,7 +408,7 @@ OCResourceProperty OCGetResourceProperties(OCResourceHandle handle);
  *
  * @return ::OC_STACK_OK on success, some other value upon failure.
  */
-OCStackResult OCGetNumberOfResourceTypes(OCResourceHandle handle, uint8_t *numResourceTypes);
+OC_EXPORT OCStackResult OCGetNumberOfResourceTypes(OCResourceHandle handle, uint8_t *numResourceTypes);
 
 /**
  * This function gets name of resource type of the resource.
@@ -415,7 +418,7 @@ OCStackResult OCGetNumberOfResourceTypes(OCResourceHandle handle, uint8_t *numRe
  *
  * @return Resource type name if resource found or NULL if resource not found.
  */
-const char *OCGetResourceTypeName(OCResourceHandle handle, uint8_t index);
+OC_EXPORT const char *OCGetResourceTypeName(OCResourceHandle handle, uint8_t index);
 
 /**
  * This function gets the number of resource interfaces of the resource.
@@ -425,7 +428,7 @@ const char *OCGetResourceTypeName(OCResourceHandle handle, uint8_t index);
  *
  * @return ::OC_STACK_OK on success, some other value upon failure.
  */
-OCStackResult OCGetNumberOfResourceInterfaces(OCResourceHandle handle,
+OC_EXPORT OCStackResult OCGetNumberOfResourceInterfaces(OCResourceHandle handle,
         uint8_t *numResourceInterfaces);
 
 /**
@@ -436,7 +439,7 @@ OCStackResult OCGetNumberOfResourceInterfaces(OCResourceHandle handle,
  *
  * @return Resource interface name if resource found or NULL if resource not found.
  */
-const char *OCGetResourceInterfaceName(OCResourceHandle handle, uint8_t index);
+OC_EXPORT const char *OCGetResourceInterfaceName(OCResourceHandle handle, uint8_t index);
 
 /**
  * This function gets methods of resource interface of the resource.
@@ -446,7 +449,7 @@ const char *OCGetResourceInterfaceName(OCResourceHandle handle, uint8_t index);
  *
  * @return Allowed methods if resource found or NULL if resource not found.
  */
-uint8_t OCGetResourceInterfaceAllowedMethods(OCResourceHandle handle, uint8_t index);
+OC_EXPORT uint8_t OCGetResourceInterfaceAllowedMethods(OCResourceHandle handle, uint8_t index);
 
 /**
  * This function gets resource handle from the collection resource by index.
@@ -456,7 +459,7 @@ uint8_t OCGetResourceInterfaceAllowedMethods(OCResourceHandle handle, uint8_t in
  *
  * @return Handle to contained resource if resource found or NULL if resource not found.
  */
-OCResourceHandle OCGetResourceHandleFromCollection(OCResourceHandle collectionHandle,
+OC_EXPORT OCResourceHandle OCGetResourceHandleFromCollection(OCResourceHandle collectionHandle,
         uint8_t index);
 
 /**
@@ -466,7 +469,7 @@ OCResourceHandle OCGetResourceHandleFromCollection(OCResourceHandle collectionHa
  *
  * @return Entity handler if resource found or NULL resource not found.
  */
-OCEntityHandler OCGetResourceHandler(OCResourceHandle handle);
+OC_EXPORT OCEntityHandler OCGetResourceHandler(OCResourceHandle handle);
 
 /**
  * This function notify all registered observers that the resource representation has
@@ -478,7 +481,7 @@ OCEntityHandler OCGetResourceHandler(OCResourceHandle handle);
  *
  * @return ::OC_STACK_OK on success, some other value upon failure.
  */
-OCStackResult OCNotifyAllObservers(OCResourceHandle handle, OCQualityOfService qos);
+OC_EXPORT OCStackResult OCNotifyAllObservers(OCResourceHandle handle, OCQualityOfService qos);
 
 /**
  * Notify specific observers with updated value of representation.
@@ -497,7 +500,7 @@ OCStackResult OCNotifyAllObservers(OCResourceHandle handle, OCQualityOfService q
  *
  * @return ::OC_STACK_OK on success, some other value upon failure.
  */
-OCStackResult
+OC_EXPORT OCStackResult
 OCNotifyListOfObservers (OCResourceHandle handle,
                             OCObservationId  *obsIdList,
                             uint8_t          numberOfIds,
@@ -514,7 +517,7 @@ OCNotifyListOfObservers (OCResourceHandle handle,
  *
  * @return ::OC_STACK_OK on success, some other value upon failure.
  */
-OCStackResult OCDoResponse(OCEntityHandlerResponse *response);
+OC_EXPORT OCStackResult OCDoResponse(OCEntityHandlerResponse *response);
 
 //#ifdef DIRECT_PAIRING
 /**
@@ -526,7 +529,7 @@ OCStackResult OCDoResponse(OCEntityHandlerResponse *response);
  *                    client before returning the list of devices.
  * @return OCDirectPairingDev_t pointer in case of success and NULL otherwise.
  */
-const OCDPDev_t* OCDiscoverDirectPairingDevices(unsigned short waittime);
+OC_EXPORT const OCDPDev_t* OCDiscoverDirectPairingDevices(unsigned short waittime);
 
 /**
  * The function is responsible for return of paired device list via direct-pairing. It will list
@@ -535,7 +538,7 @@ const OCDPDev_t* OCDiscoverDirectPairingDevices(unsigned short waittime);
  *
  * @return OCDirectPairingDev_t pointer in case of success and NULL otherwise.
  */
-const OCDPDev_t* OCGetDirectPairedDevices();
+OC_EXPORT const OCDPDev_t* OCGetDirectPairedDevices();
 
 /**
  * The function is responsible for establishment of direct-pairing. It will proceed mode negotiation
@@ -547,8 +550,8 @@ const OCDPDev_t* OCGetDirectPairedDevices();
  * @param[in] resultCallback Callback fucntion to event status of process.
  * @return OTM_SUCCESS in case of success and other value otherwise.
  */
-OCStackResult OCDoDirectPairing(OCDPDev_t* peer, OCPrm_t pmSel, char *pinNumber,
-                                                     OCDirectPairingCB resultCallback);
+OC_EXPORT OCStackResult OCDoDirectPairing(OCDPDev_t* peer, OCPrm_t pmSel, char *pinNumber,
+                                          OCDirectPairingCB resultCallback);
 //#endif // DIRECT_PAIRING
 
 #ifdef __cplusplus
index 2199c7e..ae85af7 100644 (file)
@@ -46,10 +46,10 @@ extern "C"
 #ifdef TB_LOG
     #define OIC_LOG_PAYLOAD(level, payload) OCPayloadLog((level),(payload))
     #define UUID_SIZE (16)
-const char *convertTriggerEnumToString(OCPresenceTrigger trigger);
-OCPresenceTrigger convertTriggerStringToEnum(const char * triggerStr);
+OC_EXPORT const char *convertTriggerEnumToString(OCPresenceTrigger trigger);
+OC_EXPORT OCPresenceTrigger convertTriggerStringToEnum(const char * triggerStr);
 
-static inline void OCPayloadLogRep(LogLevel level, OCRepPayload* payload)
+INLINE_API void OCPayloadLogRep(LogLevel level, OCRepPayload* payload)
 {
     OIC_LOG(level, (PL_TAG), "Payload Type: Representation");
     OCRepPayload* rep = payload;
@@ -164,7 +164,7 @@ static inline void OCPayloadLogRep(LogLevel level, OCRepPayload* payload)
 
 }
 
-static inline void OCPayloadLogDiscovery(LogLevel level, OCDiscoveryPayload* payload)
+INLINE_API void OCPayloadLogDiscovery(LogLevel level, OCDiscoveryPayload* payload)
 {
     OIC_LOG(level, PL_TAG, "Payload Type: Discovery");
     int i = 1;
@@ -227,7 +227,7 @@ static inline void OCPayloadLogDiscovery(LogLevel level, OCDiscoveryPayload* pay
     }
 }
 
-static inline void OCPayloadLogDevice(LogLevel level, OCDevicePayload* payload)
+INLINE_API void OCPayloadLogDevice(LogLevel level, OCDevicePayload* payload)
 {
     OIC_LOG(level, PL_TAG, "Payload Type: Device");
     OIC_LOG_V(level, PL_TAG, "\tSID:%s", payload->sid);
@@ -252,7 +252,7 @@ static inline void OCPayloadLogDevice(LogLevel level, OCDevicePayload* payload)
     }
 }
 
-static inline void OCPayloadLogPlatform(LogLevel level, OCPlatformPayload* payload)
+INLINE_API void OCPayloadLogPlatform(LogLevel level, OCPlatformPayload* payload)
 {
     OIC_LOG(level, PL_TAG, "Payload Type: Platform");
     OIC_LOG_V(level, PL_TAG, "\tURI:%s", payload->uri);
@@ -283,7 +283,7 @@ static inline void OCPayloadLogPlatform(LogLevel level, OCPlatformPayload* paylo
     }
 }
 
-static inline void OCPayloadLogPresence(LogLevel level, OCPresencePayload* payload)
+INLINE_API void OCPayloadLogPresence(LogLevel level, OCPresencePayload* payload)
 {
     OIC_LOG(level, PL_TAG, "Payload Type: Presence");
     OIC_LOG_V(level, PL_TAG, "\tSequence Number:%u", payload->sequenceNumber);
@@ -292,13 +292,13 @@ static inline void OCPayloadLogPresence(LogLevel level, OCPresencePayload* paylo
     OIC_LOG_V(level, PL_TAG, "\tResource Type:%s", payload->resourceType);
 }
 
-static inline void OCPayloadLogSecurity(LogLevel level, OCSecurityPayload* payload)
+INLINE_API void OCPayloadLogSecurity(LogLevel level, OCSecurityPayload* payload)
 {
     OIC_LOG(level, PL_TAG, "Payload Type: Security");
     OIC_LOG_V(level, PL_TAG, "\tSecurity Data: %s", payload->securityData);
 }
 
-static inline void OCRDPayloadLog(const LogLevel level, const OCRDPayload *payload)
+INLINE_API void OCRDPayloadLog(const LogLevel level, const OCRDPayload *payload)
 {
     if (!payload)
     {
@@ -321,7 +321,7 @@ static inline void OCRDPayloadLog(const LogLevel level, const OCRDPayload *paylo
     }
 }
 
-static inline void OCPayloadLog(LogLevel level, OCPayload* payload)
+INLINE_API void OCPayloadLog(LogLevel level, OCPayload* payload)
 {
     if(!payload)
     {
index 17c6417..82da858 100644 (file)
@@ -165,7 +165,7 @@ void OCDiscoveryCollectionPayloadDestroy(OCDiscoveryPayload* payload);
  * @param level LogLevel for the print.
  * @param tags Structure of the tags payload.
  */
-void OCTagsLog(const LogLevel level, const OCTagsPayload *tags);
+OC_EXPORT void OCTagsLog(const LogLevel level, const OCTagsPayload *tags);
 
 /**
  * Prints links payload.
@@ -173,7 +173,7 @@ void OCTagsLog(const LogLevel level, const OCTagsPayload *tags);
  * @param level LogLevel for the print.
  * @param tags Structure of the links payload.
  */
-void OCLinksLog(const LogLevel level, const OCLinksPayload *links);
+OC_EXPORT void OCLinksLog(const LogLevel level, const OCLinksPayload *links);
 
 #ifdef __cplusplus
 }
index 3ebf005..cd47011 100644 (file)
@@ -21,6 +21,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <ocstack.h>
+#include <getopt.h>
 
 const char *getResult(OCStackResult result)
 {
index 9147e1f..123f969 100644 (file)
 #endif
 #include <iostream>
 #include <sstream>
+#include <getopt.h>
 #include "ocstack.h"
 #include "logger.h"
 #include "occlient.h"
 #include "ocpayload.h"
 #include "payload_logging.h"
+#include "common.h"
+#include "platform_features.h"
 
 #ifdef ROUTING_GATEWAY
 /**
@@ -63,8 +66,6 @@ static OCDevAddr serverAddr;
 static char discoveryAddr[100];
 static std::string coapServerResource = "/a/light";
 
-void StripNewLineChar(char* str);
-
 #ifdef WITH_PRESENCE
 // The handle for observe registration
 OCDoHandle gPresenceHandle;
index 42b2b00..988ce35 100644 (file)
@@ -30,6 +30,7 @@
 #include <stdint.h>
 #include <sstream>
 #include <iostream>
+#include <getopt.h>
 
 #include "ocstack.h"
 #include "logger.h"
@@ -38,6 +39,7 @@
 #include "payload_logging.h"
 #include "oic_malloc.h"
 #include "oic_string.h"
+#include "common.h"
 
 #define MAX_IP_ADDR_ST_SZ  16 //string size of "155.255.255.255" (15 + 1)
 #define MAX_PORT_ST_SZ  6     //string size of "65535" (5 + 1)
index 1c65f33..f13c6bc 100644 (file)
 #include <ocstack.h>
 #include <iostream>
 #include <sstream>
+#include <getopt.h>
 #include "ocpayload.h"
 #include "payload_logging.h"
 #include "logger.h"
-const char *getResult(OCStackResult result);
+#include "common.h"
 std::string getQueryStrForGetPut();
 
 #define TAG ("occlient")
index 1a10920..d15fdd4 100644 (file)
 #endif
 #include <iostream>
 #include <sstream>
+#include <getopt.h>
 #include "ocstack.h"
 #include "logger.h"
 #include "occlientslow.h"
 #include "oic_string.h"
 #include "ocpayload.h"
 #include "payload_logging.h"
+#include "common.h"
 
 // Tracking user input
 static int UnicastDiscovery = 0;
@@ -46,10 +48,9 @@ static std::string coapServerResource = "/a/led";
 
 //The following variable determines the interface protocol (IP, etc)
 //to be used for sending unicast messages. Default set to IP.
-static OCConnectivityType AdapterType = CT_ADAPTER_IP;
+static OCConnectivityType adapterType = CT_ADAPTER_IP;
 static OCDevAddr endpoint;
 static const char *RESOURCE_DISCOVERY_QUERY = "%s/oic/res";
-void StripNewLineChar(char* str);
 
 int gQuitFlag = 0;
 
@@ -104,7 +105,7 @@ OCStackResult InvokeOCDoResource(std::ostringstream &query,
 
     ret = OCDoResource(NULL, method, query.str().c_str(), dest,
             (method == OC_REST_PUT) ? putPayload() : NULL,
-            AdapterType, qos, &cbData, options, numOptions);
+            adapterType, qos, &cbData, options, numOptions);
 
     if (ret != OC_STACK_OK)
     {
@@ -297,12 +298,12 @@ int main(int argc, char* argv[])
 
     if(ConnectivityType == CT_ADAPTER_DEFAULT || ConnectivityType == CT_IP)
     {
-        AdapterType = CT_ADAPTER_IP;
+        adapterType = CT_ADAPTER_IP;
     }
     else
     {
         OIC_LOG(INFO, TAG, "Default Connectivity type selected...");
-        AdapterType = CT_ADAPTER_IP;
+        adapterType = CT_ADAPTER_IP;
     }
 
     InitDiscovery();
index c3a7059..39627df 100644 (file)
@@ -30,6 +30,7 @@
 #include "ocpayload.h"
 #include "payload_logging.h"
 #include "ocremoteaccessclient.h"
+#include "common.h"
 
 #define SET_BUT_NOT_USED(x) (void) x
 // Tracking user input
@@ -43,7 +44,6 @@ static std::string coapServerResource = "/a/light";
 static OCDevAddr responseAddr;
 //Use ipv4addr for both InitDiscovery and InitPlatformOrDeviceDiscovery
 char remoteServerJabberID[MAX_ADDR_STR_SIZE];
-void StripNewLineChar(char* str);
 static uint16_t maxNotification = 15;
 
 // The handle for the observe registration
index c705731..a51c118 100644 (file)
 #include <pthread.h>
 #endif
 #include <array>
+#include <getopt.h>
 #include "ocstack.h"
 #include "logger.h"
 #include "ocpayload.h"
 #include "ocserver.h"
+#include "common.h"
+#include "platform_features.h"
 
 //string length of "/a/light/" + std::numeric_limits<int>::digits10 + '\0'"
 // 9 + 9 + 1 = 19
@@ -669,8 +672,7 @@ void *ChangeLightRepresentation (void *param)
     OCStackResult result = OC_STACK_ERROR;
 
     uint8_t j = 0;
-    uint8_t numNotifies = (SAMPLE_MAX_NUM_OBSERVATIONS)/2;
-    OCObservationId obsNotify[numNotifies];
+    OCObservationId obsNotify[(SAMPLE_MAX_NUM_OBSERVATIONS)/2];
 
     while (!gQuitFlag)
     {
@@ -1108,12 +1110,16 @@ int main(int argc, char* argv[])
 
     if (observeThreadStarted)
     {
+#ifdef HAVE_PTHREAD_H
         pthread_cancel(threadId_observe);
         pthread_join(threadId_observe, NULL);
+#endif
     }
 
+#ifdef HAVE_PTHREAD_H
     pthread_cancel(threadId_presence);
     pthread_join(threadId_presence, NULL);
+#endif
 
     OIC_LOG(INFO, TAG, "Exiting ocserver main loop...");
 
index f90a9b0..b5408d0 100644 (file)
 #endif
 #include <ocstack.h>
 #include <logger.h>
+#include <getopt.h>
 #include "ocpayload.h"
-
-const char *getResult(OCStackResult result);
+#include "common.h"
+#include "platform_features.h"
 
 #define TAG PCF("ocservercontainer")
 
@@ -549,8 +550,10 @@ int main(int argc, char* argv[])
     /*
      * Cancel the light thread and wait for it to terminate
      */
+#ifdef HAVE_PTHREAD_H
     pthread_cancel(threadId);
     pthread_join(threadId, NULL);
+#endif
 
     OIC_LOG(INFO, TAG, "Exiting ocserver main loop...");
 
index 64a1aba..5f0ba4b 100644 (file)
@@ -34,6 +34,7 @@
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
 #endif
+#include <boost/config.hpp>
 #include <list>
 #include "ocstack.h"
 #include "oic_malloc.h"
 volatile sig_atomic_t gQuitFlag = 0;
 
 static std::list<OCEntityHandlerRequest *> gRequestList;
-static constexpr unsigned int SLOW_RESPONSE_DELAY_SEC = 5;
+BOOST_STATIC_CONSTEXPR unsigned int SLOW_RESPONSE_DELAY_SEC = 5;
 
 static LEDResource LED;
 
-static constexpr unsigned int SAMPLE_MAX_NUM_POST_INSTANCE = 2;
+BOOST_STATIC_CONSTEXPR unsigned int SAMPLE_MAX_NUM_POST_INSTANCE = 2;
 static LEDResource gLedInstance[SAMPLE_MAX_NUM_POST_INSTANCE];
 
 //char *gResourceUri= const_cast<char *>("/a/led");
@@ -196,6 +197,21 @@ OCEntityHandlerRequest *CopyRequest(OCEntityHandlerRequest *entityHandlerRequest
     return copyOfRequest;
 }
 
+#if !defined(SIGALRM)
+void AlarmHandler(int sig);
+int WINAPI AlarmThread(void *seconds)
+{
+    sleep((unsigned int)seconds);
+    AlarmHandler(0);
+    return 0;
+}
+
+void alarm(unsigned int seconds)
+{
+    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)AlarmThread, (void*)seconds, 0, NULL);
+}
+#endif
+
 OCEntityHandlerResult OCEntityHandlerCb (OCEntityHandlerFlag flag,
         OCEntityHandlerRequest *entityHandlerRequest, void* /*callbackParam*/)
 {
@@ -255,7 +271,9 @@ void handleSigInt(int signum)
 // slow response when fired
 void AlarmHandler(int sig)
 {
+#ifdef SIGALRM
     if (sig == SIGALRM)
+#endif
     {
         OIC_LOG (INFO, TAG, "Server starting slow response");
         if (gRequestList.empty())
@@ -308,8 +326,10 @@ int main(int /*argc*/, char** /*argv[]*/)
     // Declare and create the example resource: LED
     createLEDResource(gResourceUri, &LED, false, 42);
 
+#ifdef SIGALRM
     // Initialize slow response alarm
     signal(SIGALRM, AlarmHandler);
+#endif
 
     // Break from loop with Ctrl-C
     OIC_LOG(INFO, TAG, "Entering ocserver main loop...");
index d89e2d9..4d0fdf0 100644 (file)
@@ -13,6 +13,7 @@
 #ifdef HAVE_PTHREAD_H
 #include <pthread.h>
 #endif
+#include "platform_features.h"
 #include "ocstack.h"
 #include "logger.h"
 #include "common.h"
@@ -69,11 +70,7 @@ int main(int /*argc*/, char* /*argv*/[])
             OIC_LOG(ERROR, TAG, "OCStack process error");
             return 0;
         }
-#if defined(_WIN32)
-        Sleep(100);
-#else
         nanosleep(&timeout, NULL);
-#endif // defined(_WIN32)
     }
 
     OIC_LOG(INFO, TAG, "Exiting ocamsservice main loop...");
index 3b92143..d511dde 100644 (file)
 #endif
 #ifdef HAVE_WINDOWS_H
 #include <windows.h>
+/** @todo stop-gap for naming issue. Windows.h does not like us to use ERROR */
+#ifdef ERROR
+#undef ERROR
+#endif
 #endif
 #include <iostream>
 #include <sstream>
+#include <getopt.h>
+#include "platform_features.h"
 #include "ocstack.h"
+#include "logger.h"
 #include "occlientbasicops.h"
 #include "ocpayload.h"
 #include "payload_logging.h"
 #include "oic_string.h"
 #include "common.h"
 
-#if defined(_WIN32)
-#include <windows.h>
-/** @todo stop-gap for naming issue. Windows.h does not like us to use ERROR */
-#ifdef ERROR
-#undef ERROR
-#endif
-#endif // defined(_WIN32)
-#include "logger.h"
-
 #define TAG "occlientbasicops"
 static int UnicastDiscovery = 0;
 static int TestCase = 0;
@@ -389,11 +387,7 @@ int main(int argc, char* argv[])
             return 0;
         }
 
-#if defined(_WIN32)
-        Sleep(100);
-#else
         nanosleep(&timeout, NULL);
-#endif //defined(_WIN32)
     }
     OIC_LOG(INFO, TAG, "Exiting occlient main loop...");
 
index f92a644..bf49f2a 100644 (file)
 #endif\r
 #include <iostream>\r
 #include <sstream>\r
-#if defined(_WIN32)\r
+#if defined(HAVE_WINDOWS_H)\r
 #include <windows.h>\r
 /** @todo stop-gap for naming issue. Windows.h does not like us to use ERROR */\r
 #ifdef ERROR\r
 #undef ERROR\r
 #endif\r
-#endif // defined(_WIN32)\r
+#endif // defined(HAVE_WINDOWS_H)\r
+#include "platform_features.h"\r
 #include "ocstack.h"\r
 #include "logger.h"\r
 #include "ocpayload.h"\r
@@ -416,19 +417,19 @@ FILE* client_fopen(const char *path, const char *mode)
 \r
 void *CLInterface(void *data)\r
 {\r
-    printf(RED_BEGIN"#Ready to operation ('h' for help)#\n"COLOR_END);\r
+    printf(RED_BEGIN "#Ready to operation ('h' for help)#\n" COLOR_END);\r
 \r
     (void)data;\r
     OCStackResult ret;\r
-    char query[MAX_LINE] = {0,};\r
-    const char prompt[] = BOLD_BEGIN"IoTivity-DP#"COLOR_END" ";\r
+    char query[MAX_LINE] = {0};\r
+    const char prompt[] = BOLD_BEGIN "IoTivity-DP#" COLOR_END" ";\r
     const char* helpmsg[6] = {\r
-            GREEN_BEGIN"# h  (or help) : show help message"COLOR_END,\r
-            GREEN_BEGIN"# dd (DP device discovery) : discover Direct-Pairing devices"COLOR_END,\r
-            GREEN_BEGIN"# dp (start Direct-Pairing) : negotiate DP method & start Direct-Pairing"COLOR_END,\r
-            GREEN_BEGIN"# sd (send data) : send data to device"COLOR_END,\r
-            GREEN_BEGIN"# ll (list all device) : list all discovered/paired devices"COLOR_END,\r
-            GREEN_BEGIN"# q  (quit) : quit test"COLOR_END,\r
+            GREEN_BEGIN "# h  (or help) : show help message" COLOR_END,\r
+            GREEN_BEGIN "# dd (DP device discovery) : discover Direct-Pairing devices" COLOR_END,\r
+            GREEN_BEGIN "# dp (start Direct-Pairing) : negotiate DP method & start Direct-Pairing" COLOR_END,\r
+            GREEN_BEGIN "# sd (send data) : send data to device" COLOR_END,\r
+            GREEN_BEGIN "# ll (list all device) : list all discovered/paired devices" COLOR_END,\r
+            GREEN_BEGIN "# q  (quit) : quit test" COLOR_END,\r
         };\r
 \r
     for (size_t i=0; i<(sizeof(helpmsg)/sizeof(char*)); i++)\r
index 3e693d6..9d83669 100644 (file)
@@ -31,6 +31,7 @@
 #ifdef HAVE_PTHREAD_H
 #include <pthread.h>
 #endif
+#include "platform_features.h"
 #include "ocstack.h"
 #include "logger.h"
 #include "ocpayload.h"
@@ -352,11 +353,7 @@ int main(int /*argc*/, char* /*argv*/[])
             OIC_LOG(ERROR, TAG, "OCStack process error");
             return 0;
         }
-#if defined(_WIN32)
-        Sleep(100);
-#else
         nanosleep(&timeout, NULL);
-#endif //defined(_WIN32)
     }
 
     OIC_LOG(INFO, TAG, "Exiting ocserver main loop...");
index 896621f..f3648de 100755 (executable)
@@ -49,6 +49,8 @@
 #define NUM_PARAM_IN_QUERY   2 // The expected number of parameters in a query
 #define NUM_FIELDS_IN_QUERY  2 // The expected number of fields in a query
 
+#include "platform_features.h"
+
 static OCStackResult CheckRTParamSupport(const OCResource* resource, const char* rtPtr)
 {
     if (!resource || !rtPtr)
index 78494a4..54182c9 100644 (file)
@@ -741,7 +741,7 @@ bool OCRepPayloadSetByteStringArray(OCRepPayload* payload, const char* name,
 {
     if (!array)
     {
-        return NULL;
+        return false;
     }
 
     size_t dimTotal = calcDimTotal(dimensions);
index 889c56a..477b9d7 100644 (file)
@@ -65,7 +65,7 @@ OCStackResult OCConvertPayload(OCPayload* payload, uint8_t** outPayload, size_t*
     // TinyCbor Version 47a78569c0 or better on master is required for the re-allocation
     // strategy to work.  If you receive the following assertion error, please do a git-pull
     // from the extlibs/tinycbor/tinycbor directory
-    #define CborNeedsUpdating  (CborErrorOutOfMemory < CborErrorDataTooLarge)
+    #define CborNeedsUpdating  (((unsigned int)CborErrorOutOfMemory) < ((unsigned int)CborErrorDataTooLarge))
     OC_STATIC_ASSERT(!CborNeedsUpdating, "tinycbor needs to be updated to at least 47a78569c0");
     #undef CborNeedsUpdating
 
index 337006e..96f590c 100755 (executable)
@@ -35,6 +35,7 @@
 #include "ocstackinternal.h"
 #include "payload_logging.h"
 #include "rdpayload.h"
+#include "platform_features.h"
 
 #define TAG "OIC_RI_PAYLOADPARSE"
 
index 95c8fb1..3b9bfcb 100755 (executable)
 // Refer http://pubs.opengroup.org/onlinepubs/009695399/
 #define _POSIX_C_SOURCE 200112L
 
-#ifdef WITH_ARDUINO
+#ifdef WITH_STRING_H
 #include <string.h>
-#else
+#endif
+#ifdef WITH_STRINGS_H
 #include <strings.h>
 #endif
 
@@ -64,6 +65,8 @@
 #define VERIFY_NON_NULL(arg, logLevel, retVal) { if (!(arg)) { OIC_LOG((logLevel), \
              TAG, #arg " is NULL"); return (retVal); } }
 
+#include "platform_features.h"
+
 extern OCResource *headResource;
 static OCPlatformInfo savedPlatformInfo = {0};
 static OCDeviceInfo savedDeviceInfo = {0};
index 8263100..592f27a 100644 (file)
@@ -526,7 +526,7 @@ OCStackResult HandleSingleResponse(OCEntityHandlerResponse * ehResponse)
         responseInfo.info.type = CA_MSG_NONCONFIRM;
     }
 
-    char rspToken[CA_MAX_TOKEN_LEN + 1] = {};
+    char rspToken[CA_MAX_TOKEN_LEN + 1] = {0};
     responseInfo.info.messageId = serverRequest->coapID;
     responseInfo.info.token = (CAToken_t)rspToken;
 
index 383d66a..fa67c28 100755 (executable)
@@ -32,9 +32,7 @@
 #include "logger.h"
 #include "timer.h"
 
-#ifndef WITH_ARDUINO
-#include <pthread.h>
-#endif
+#include "platform_features.h"
 
 #define TAG "OIC_RI_GROUP"
 
         pointer = NULL; \
     }
 
-#ifndef WITH_ARDUINO
-pthread_mutex_t lock;
+// Mutex implementation macros
+#if defined(HAVE_PTHREAD_H)
+
+ #include <pthread.h>
+ pthread_mutex_t lock;
+ #define MUTEX_LOCK(ARG_NAME)    { pthread_mutex_lock(ARG_NAME); }
+ #define MUTEX_UNLOCK(ARG_NAME)  { pthread_mutex_unlock(ARG_NAME); }
+
+#elif defined(HAVE_WINDOWS_H)
+
+ #include <Windows.h>
+ CRITICAL_SECTION lock;
+ #define MUTEX_LOCK(ARG_NAME)   { EnterCriticalSection(ARG_NAME); }
+ #define MUTEX_UNLOCK(ARG_NAME) { LeaveCriticalSection(ARG_NAME); }
+
+#elif defined(WITH_ARDUINO)
+
+ #define MUTEX_LOCK(ARG_NAME)   {  }
+ #define MUTEX_UNLOCK(ARG_NAME) {  }
+
+#else
+
+ ERROR Need mutex implementation on this platform
+
 #endif
 
 enum ACTION_TYPE
@@ -100,9 +120,7 @@ void AddScheduledResource(ScheduledResourceInfo **head,
 {
     OIC_LOG(INFO, TAG, "AddScheduledResource Entering...");
 
-#ifndef WITH_ARDUINO
-    pthread_mutex_lock(&lock);
-#endif
+    MUTEX_LOCK(&lock);
     ScheduledResourceInfo *tmp = NULL;
 
     if (*head != NULL)
@@ -119,25 +137,21 @@ void AddScheduledResource(ScheduledResourceInfo **head,
     {
         *head = add;
     }
-#ifndef WITH_ARDUINO
-    pthread_mutex_unlock(&lock);
-#endif
+    MUTEX_UNLOCK(&lock);
 }
 
 ScheduledResourceInfo* GetScheduledResource(ScheduledResourceInfo *head)
 {
     OIC_LOG(INFO, TAG, "GetScheduledResource Entering...");
 
-#ifndef WITH_ARDUINO
-    pthread_mutex_lock(&lock);
-#endif
+    MUTEX_LOCK(&lock);
 
     time_t t_now;
 
     ScheduledResourceInfo *tmp = NULL;
     tmp = head;
 
-#ifndef WITH_ARDUINO
+#if !defined(WITH_ARDUINO)
     time(&t_now);
 #else
     t_now = now();
@@ -148,11 +162,7 @@ ScheduledResourceInfo* GetScheduledResource(ScheduledResourceInfo *head)
         while (tmp)
         {
             time_t diffTm = 0;
-#ifndef WITH_ARDUINO
             diffTm = timespec_diff(tmp->time, t_now);
-#else
-            diffTm = timespec_diff(tmp->time, t_now);
-#endif
 
             if (diffTm <= (time_t) 0)
             {
@@ -165,9 +175,9 @@ ScheduledResourceInfo* GetScheduledResource(ScheduledResourceInfo *head)
     }
 
     exit:
-#ifndef WITH_ARDUINO
-    pthread_mutex_unlock(&lock);
-#endif
+
+    MUTEX_UNLOCK(&lock);
+
     if (tmp == NULL)
     {
         OIC_LOG(INFO, TAG, "Cannot Find Call Info.");
@@ -179,9 +189,8 @@ ScheduledResourceInfo* GetScheduledResourceByActionSetName(ScheduledResourceInfo
 {
     OIC_LOG(INFO, TAG, "GetScheduledResourceByActionSetName Entering...");
 
-#ifndef WITH_ARDUINO
-    pthread_mutex_lock(&lock);
-#endif
+    MUTEX_LOCK(&lock);
+
     ScheduledResourceInfo *tmp = NULL;
     tmp = head;
 
@@ -199,9 +208,9 @@ ScheduledResourceInfo* GetScheduledResourceByActionSetName(ScheduledResourceInfo
     }
 
 exit:
-#ifndef WITH_ARDUINO
-    pthread_mutex_unlock(&lock);
-#endif
+
+    MUTEX_UNLOCK(&lock);
+
     if (tmp == NULL)
     {
         OIC_LOG(INFO, TAG, "Cannot Find Call Info.");
@@ -212,17 +221,17 @@ exit:
 void RemoveScheduledResource(ScheduledResourceInfo **head,
         ScheduledResourceInfo* del)
 {
-#ifndef WITH_ARDUINO
-    pthread_mutex_lock(&lock);
-#endif
+
+    MUTEX_LOCK(&lock);
+
     OIC_LOG(INFO, TAG, "RemoveScheduledResource Entering...");
     ScheduledResourceInfo *tmp = NULL;
 
     if (del == NULL)
     {
-#ifndef WITH_ARDUINO
-    pthread_mutex_unlock(&lock);
-#endif
+
+        MUTEX_UNLOCK(&lock);
+
         return;
     }
 
@@ -244,9 +253,9 @@ void RemoveScheduledResource(ScheduledResourceInfo **head,
     }
 
     OCFREE(del)
-#ifndef WITH_ARDUINO
-    pthread_mutex_unlock(&lock);
-#endif
+
+    MUTEX_UNLOCK(&lock);
+
 }
 
 typedef struct aggregatehandleinfo
@@ -650,7 +659,7 @@ OCStackResult BuildActionSetFromString(OCActionSet **set, char* actiondesc)
     // yyyy-mm-dd hh:mm:ss d
     iterToken = (char *) strtok_r(NULL, ACTION_DELIMITER, &iterTokenPtr);
     VARIFY_PARAM_NULL(iterToken, result, exit)
-#ifndef WITH_ARDUINO
+#if !defined(WITH_ARDUINO)
     if( 2 != sscanf(iterToken, "%ld %u", &(*set)->timesteps, &(*set)->type) )
     {
         // If the return value should be 2, the number of items in the argument. Otherwise, it fails.
@@ -1096,13 +1105,13 @@ void DoScheduledGroupAction()
         OIC_LOG(INFO, TAG, "Target ActionSet is NULL");
         goto exit;
     }
-#ifndef WITH_ARDUINO
-    pthread_mutex_lock(&lock);
-#endif
+
+    MUTEX_LOCK(&lock);
+
     DoAction(info->resource, info->actionset, info->ehRequest);
-#ifndef WITH_ARDUINO
-    pthread_mutex_unlock(&lock);
-#endif
+
+    MUTEX_UNLOCK(&lock);
+
 
     if (info->actionset->type == RECURSIVE)
     {
@@ -1117,9 +1126,7 @@ void DoScheduledGroupAction()
 
             if (info->actionset->timesteps > 0)
             {
-#ifndef WITH_ARDUINO
-                pthread_mutex_lock(&lock);
-#endif
+                MUTEX_LOCK(&lock);
                 schedule->resource = info->resource;
                 schedule->actionset = info->actionset;
                 schedule->ehRequest = info->ehRequest;
@@ -1129,9 +1136,7 @@ void DoScheduledGroupAction()
                         &DoScheduledGroupAction);
 
                 OIC_LOG(INFO, TAG, "Reregisteration.");
-#ifndef WITH_ARDUINO
-                pthread_mutex_unlock(&lock);
-#endif
+                MUTEX_UNLOCK(&lock);
                 AddScheduledResource(&scheduleResourceList, schedule);
             }
             else
@@ -1159,6 +1164,16 @@ OCStackResult BuildCollectionGroupActionCBORResponse(
     char *doWhat = NULL;
     char *details = NULL;
 
+#if defined(_WIN32)
+    static bool initializedCriticalSection = false;
+
+    if(false == initializedCriticalSection) {
+        /** @todo Find a way to DeleteCriticalSection somewhere. */
+        InitializeCriticalSection(&lock);
+        initializedCriticalSection = true;
+    }
+#endif
+
     stackRet = ExtractKeyValueFromRequest(ehRequest, &doWhat, &details);
 
     if(stackRet != OC_STACK_OK)
@@ -1329,29 +1344,21 @@ OCStackResult BuildCollectionGroupActionCBORResponse(
                             OIC_LOG(INFO, TAG, "Building New Call Info.");
                             memset(schedule, 0,
                                     sizeof(ScheduledResourceInfo));
-#ifndef WITH_ARDUINO
-                            pthread_mutex_lock(&lock);
-#endif
+                            MUTEX_LOCK(&lock);
                             schedule->resource = resource;
                             schedule->actionset = actionset;
                             schedule->ehRequest =
                                     (OCServerRequest*) ehRequest->requestHandle;
-#ifndef WITH_ARDUINO
-                            pthread_mutex_unlock(&lock);
-#endif
+                            MUTEX_UNLOCK(&lock);
                             if (delay > 0)
                             {
                                 OIC_LOG_V(INFO, TAG, "delay_time is %ld seconds.",
                                         actionset->timesteps);
-#ifndef WITH_ARDUINO
-                                pthread_mutex_lock(&lock);
-#endif
+                                MUTEX_LOCK(&lock);
                                 schedule->time = registerTimer(delay,
                                         &schedule->timer_id,
                                         &DoScheduledGroupAction);
-#ifndef WITH_ARDUINO
-                                pthread_mutex_unlock(&lock);
-#endif
+                                MUTEX_UNLOCK(&lock);
                                 AddScheduledResource(&scheduleResourceList,
                                         schedule);
                                 stackRet = OC_STACK_OK;
index 2e4a202..c17afc1 100644 (file)
@@ -33,7 +33,9 @@ extern "C"
 #include <sys/stat.h>
 #include <errno.h>
 #include <fcntl.h>
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
+#endif
 #include <stdlib.h>
 
 //-----------------------------------------------------------------------------
index a5b9fe4..55f35a7 100644 (file)
@@ -32,7 +32,9 @@ extern "C"
 #include <sys/stat.h>
 #include <errno.h>
 #include <fcntl.h>
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
+#endif
 #include <stdlib.h>
 
 //-----------------------------------------------------------------------------
index 0711e7f..4fc5fa5 100644 (file)
 
 #include <functional>
 #include <mutex>
-#if defined(__msys_nt__)
-#include <unistd.h>
-#elif defined(_VS2015_)
-//#include <win32alias.h>
-#define sleep(SECS)   Sleep(1000*(SECS))
-#endif
+#include "platform_features.h"
 #include <condition_variable>
 
 #include "OCPlatform.h"
index 4601e35..752fc99 100644 (file)
@@ -249,9 +249,9 @@ public:
         }
     }
 
-    void addInterface(const std::string& interface) const
+    void addInterface(const std::string& iface) const
     {
-        OCStackResult result = OCPlatform::bindInterfaceToResource(m_resourceHandle, interface);
+        OCStackResult result = OCPlatform::bindInterfaceToResource(m_resourceHandle, iface);
         if (OC_STACK_OK != result)
         {
             cout << "Binding TypeName to Resource was unsuccessful\n";
@@ -380,7 +380,12 @@ OCEntityHandlerResult entityHandler(std::shared_ptr<OCResourceRequest> request)
                                                             m_interestedObservers.end());
             }
 
+#if defined(_WIN32)
+            DWORD threadId;
+            HANDLE threadHandle;
+#else
             pthread_t threadId;
+#endif
 
             cout << "\t\trequestFlag : Observer\n";
             gObservation = 1;
@@ -390,7 +395,11 @@ OCEntityHandlerResult entityHandler(std::shared_ptr<OCResourceRequest> request)
             // If we have not created the thread already, we will create one here.
             if(!startedThread)
             {
+#if defined(_WIN32)
+                threadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ChangeLightRepresentation, (void*)this, 0, &threadId);
+#else
                 pthread_create (&threadId, NULL, ChangeLightRepresentation, (void *)this);
+#endif
                 startedThread = 1;
             }
             ehResult = OC_EH_OK;
index 0506e0f..2d041cb 100644 (file)
@@ -96,37 +96,37 @@ namespace OC
     template<>
     struct AttributeTypeConvert<NullType>
     {
-        constexpr static AttributeType type = AttributeType::Null;
+        BOOST_STATIC_CONSTEXPR AttributeType type = AttributeType::Null;
     };
 
     template<>
     struct AttributeTypeConvert<int>
     {
-        constexpr static AttributeType type = AttributeType::Integer;
+        BOOST_STATIC_CONSTEXPR AttributeType type = AttributeType::Integer;
     };
 
     template<>
     struct AttributeTypeConvert<double>
     {
-        constexpr static AttributeType type = AttributeType::Double;
+        BOOST_STATIC_CONSTEXPR AttributeType type = AttributeType::Double;
     };
 
     template<>
     struct AttributeTypeConvert<bool>
     {
-        constexpr static AttributeType type = AttributeType::Boolean;
+        BOOST_STATIC_CONSTEXPR AttributeType type = AttributeType::Boolean;
     };
 
     template<>
     struct AttributeTypeConvert<std::string>
     {
-        constexpr static AttributeType type = AttributeType::String;
+        BOOST_STATIC_CONSTEXPR AttributeType type = AttributeType::String;
     };
 
     template<>
     struct AttributeTypeConvert<OCRepresentation>
     {
-        constexpr static AttributeType type = AttributeType::OCRepresentation;
+        BOOST_STATIC_CONSTEXPR AttributeType type = AttributeType::OCRepresentation;
     };
 
     std::ostream& operator << (std::ostream& os, const AttributeType at);
index c0fdf93..6f3eaf9 100644 (file)
 #include <map>
 #include <memory>
 #include <iterator>
+#if defined(_MSC_VER)
+#include <functional>
+//Squelch "decorated name length exceeded, name was truncated"
+// This compensates for templates full of templates
+#pragma warning(disable : 4503)
+#endif
 
 #include "octypes.h"
 #include "OCHeaderOption.h"
@@ -45,6 +51,9 @@ namespace OC
 
 namespace OC
 {
+#if defined(_MSC_VER)
+    extern std::ostream& oclog();
+#else
     typedef boost::iostreams::stream<OC::oc_log_stream>     log_target_t;
 
     namespace detail
@@ -65,7 +74,7 @@ namespace OC
     {
         return detail::oclog_target();
     };
-
+#endif
 } // namespace OC
 
 namespace OC
index 519da78..78f9029 100644 (file)
@@ -80,11 +80,25 @@ namespace OC
 
             OCHeaderOption(const OCHeaderOption&) = default;
 
+#if defined(_MSC_VER) && (_MSC_VER < 1900)
+            OCHeaderOption(OCHeaderOption&& o)
+            {
+                std::memmove(this, &o, sizeof(o));
+            }
+#else
             OCHeaderOption(OCHeaderOption&&) = default;
+#endif
 
             OCHeaderOption& operator=(const OCHeaderOption&) = default;
 
+#if defined(_MSC_VER) && (_MSC_VER < 1900)
+            OCHeaderOption& operator=(OCHeaderOption&& o)
+            {
+                std::memmove(this, &o, sizeof(o));
+            }
+#else
             OCHeaderOption& operator=(OCHeaderOption&&) = default;
+#endif
 
             /**
             * API to get Option ID
index 4d1d24a..ca4acb8 100644 (file)
@@ -28,6 +28,9 @@
 #ifndef OC_REPRESENTATION_H_
 #define OC_REPRESENTATION_H_
 
+#define GCC_VERSION (__GNUC__ * 10000 \
+                   + __GNUC_MINOR__ * 100 \
+                   + __GNUC_PATCHLEVEL__)
 
 #include <string>
 #include <sstream>
@@ -99,13 +102,28 @@ namespace OC
             // this fix will work in the meantime.
             OCRepresentation(): m_interfaceType(InterfaceType::None){}
 
+#if defined(_MSC_VER) && (_MSC_VER < 1900)
+            OCRepresentation(OCRepresentation&& o)
+            {
+                std::memmove(this, &o, sizeof(o));
+            }
+#else
             OCRepresentation(OCRepresentation&&) = default;
+#endif
 
             OCRepresentation(const OCRepresentation&) = default;
 
             OCRepresentation& operator=(const OCRepresentation&) = default;
 
+#if defined(_MSC_VER) && (_MSC_VER < 1900)
+            OCRepresentation& operator=(OCRepresentation&& o)
+            {
+                std::memmove(this, &o, sizeof(o));
+                return *this;
+            }
+#else
             OCRepresentation& operator=(OCRepresentation&&) = default;
+#endif
 
             virtual ~OCRepresentation(){}
 
@@ -295,12 +313,38 @@ namespace OC
                     // Enable-if required to prevent conversions to alternate types.  This prevents
                     // ambigious conversions in the case where conversions can include a number of
                     // types, such as the string constructor.
+#if (defined(_MSC_VER) ) || (defined(__GNUC__) && (GCC_VERSION <= 50000))
+                    template<typename T, typename std::enable_if<
+                     std::is_same<T, int>::value ||
+                     std::is_same<T, double>::value ||
+                     std::is_same<T, bool>::value ||
+                     std::is_same<T, std::string>::value ||
+                     std::is_same<T, OCRepresentation>::value ||
+                     std::is_same<T, std::vector<int>>::value ||
+                     std::is_same<T, std::vector<std::vector<int>>>::value ||
+                     std::is_same<T, std::vector<std::vector<std::vector<int>>>>::value ||
+                     std::is_same<T, std::vector<double>>::value ||
+                     std::is_same<T, std::vector<std::vector<double>>>::value ||
+                     std::is_same<T, std::vector<std::vector<std::vector<double>>>>::value ||
+                     std::is_same<T, std::vector<bool>>::value ||
+                     std::is_same<T, std::vector<std::vector<bool>>>::value ||
+                     std::is_same<T, std::vector<std::vector<std::vector<bool>>>>::value ||
+                     std::is_same<T, std::vector<std::string>>::value ||
+                     std::is_same<T, std::vector<std::vector<std::string>>>::value ||
+                     std::is_same<T, std::vector<std::vector<std::vector<std::string>>>>::value ||
+                     std::is_same<T, std::vector<OCRepresentation>>::value ||
+                     std::is_same<T, std::vector<std::vector<OCRepresentation>>>::value ||
+                     std::is_same<T, std::vector<std::vector<std::vector<OCRepresentation>>>>::value
+                     , int>::type = 0// enable_if
+                    >
+#else
                     template<typename T, typename std::enable_if<
                         is_component<T,
                             remove_first<AttributeValue>::type
                             >::value
                         , int>::type = 0
                     >
+#endif
                     operator T() const
                     {
                         return this->getValue<T>();
index 3fe3a68..bc0bcdb 100644 (file)
@@ -60,7 +60,15 @@ namespace OC
 
             OCResourceIdentifier(const OCResourceIdentifier&) = default;
 
+#if defined(_MSC_VER) && (_MSC_VER < 1900)
+            OCResourceIdentifier(OCResourceIdentifier&& o):
+                m_resourceUri(std::move(o.m_resourceUri)),
+                m_representation(o.m_representation)
+            {
+            }
+#else
             OCResourceIdentifier(OCResourceIdentifier&&) = default;
+#endif
 
             OCResourceIdentifier& operator=(const OCResourceIdentifier&) = delete;
 
@@ -103,8 +111,32 @@ namespace OC
     public:
         typedef std::shared_ptr<OCResource> Ptr;
 
+#if defined(_MSC_VER) && (_MSC_VER < 1900)
+        OCResource(OCResource&& o):
+            m_clientWrapper(std::move(o.m_clientWrapper)),
+            m_uri(std::move(o.m_uri)),
+            m_resourceId(std::move(o.m_resourceId)),
+            m_devAddr(std::move(o.m_devAddr)),
+            m_useHostString(o.m_useHostString),
+            m_isObservable(o.m_isObservable),
+            m_isCollection(o.m_isCollection),
+            m_resourceTypes(std::move(o.m_resourceTypes)),
+            m_interfaces(std::move(o.m_interfaces)),
+            m_children(std::move(m_children)),
+            m_observeHandle(std::move(m_observeHandle)),
+            m_headerOptions(std::move(m_headerOptions))
+        {
+        }
+#else
         OCResource(OCResource&&) = default;
-        OCResource& operator=(OCResource&&) = default;
+#endif
+        // Explicitly delete the copy ctor since VS2013 would try to generate one, and
+        // the standard says that defaulting the move ctor should delete the copy ctor.
+        OCResource(const OCResource&) = delete;
+
+        // We cannot support copy/move assigns since OCResourceIdentifier doesn't.
+        OCResource& operator=(OCResource&&) = delete;
+        OCResource& operator=(const OCResource&) = delete;
 
         /**
         * Virtual destructor
index e17e3a6..64ffa7e 100644 (file)
@@ -59,8 +59,36 @@ namespace OC
         {
         }
 
+#if defined(_MSC_VER) && (_MSC_VER < 1900)
+        OCResourceRequest(OCResourceRequest&& o):
+            m_requestType(std::move(o.m_requestType)),
+            m_resourceUri(std::move(o.m_resourceUri)),
+            m_queryParameters(std::move(o.m_queryParameters)),
+            m_requestHandlerFlag(o.m_requestHandlerFlag),
+            m_representation(std::move(o.m_representation)),
+            m_observationInfo(std::move(o.m_observationInfo)),
+            m_headerOptions(std::move(o.m_headerOptions)),
+            m_requestHandle(std::move(o.m_requestHandle)),
+            m_resourceHandle(std::move(o.m_resourceHandle))
+        {
+        }
+        OCResourceRequest& operator=(OCResourceRequest&& o)
+        {
+            m_requestType = std::move(o.m_requestType);
+            m_resourceUri = std::move(o.m_resourceUri);
+            m_queryParameters = std::move(o.m_queryParameters);
+            m_requestHandlerFlag = o.m_requestHandlerFlag;
+            m_representation = std::move(o.m_representation);
+            m_observationInfo = std::move(o.m_observationInfo);
+            m_headerOptions = std::move(o.m_headerOptions);
+            m_requestHandle = std::move(o.m_requestHandle);
+            m_resourceHandle = std::move(o.m_resourceHandle);
+        }
+#else
         OCResourceRequest(OCResourceRequest&&) = default;
         OCResourceRequest& operator=(OCResourceRequest&&) = default;
+#endif
+
         /**
         *  Virtual destructor
         */
index 474e90a..b4b8c9f 100644 (file)
@@ -57,8 +57,33 @@ namespace OC
         {
         }
 
+#if defined(_MSC_VER) && (_MSC_VER < 1900)
+        OCResourceResponse(OCResourceResponse&& o):
+            m_newResourceUri(std::move(o.m_newResourceUri)),
+            m_errorCode(o.m_errorCode),
+            m_headerOptions(std::move(o.m_headerOptions)),
+            m_interface(std::move(o.m_interface)),
+            m_representation(std::move(o.m_representation)),
+            m_requestHandle(std::move(o.m_requestHandle)),
+            m_resourceHandle(std::move(o.m_resourceHandle)),
+            m_responseResult(std::move(o.m_responseResult))
+        {
+        }
+        OCResourceResponse& operator=(OCResourceResponse&& o)
+        {
+            m_newResourceUri = std::move(o.m_newResourceUri);
+            m_errorCode = o.m_errorCode;
+            m_headerOptions = std::move(o.m_headerOptions);
+            m_interface = std::move(o.m_interface);
+            m_representation = std::move(o.m_representation);
+            m_requestHandle = std::move(o.m_requestHandle);
+            m_resourceHandle = std::move(o.m_resourceHandle);
+            m_responseResult = std::move(o.m_responseResult);
+        }
+#else
         OCResourceResponse(OCResourceResponse&&) = default;
         OCResourceResponse& operator=(OCResourceResponse&&) = default;
+#endif
         virtual ~OCResourceResponse(void) {}
 
         /**
@@ -129,8 +154,8 @@ namespace OC
         *  @param rep reference to the resource's representation
         *  @param interface specifies the interface
         */
-        void setResourceRepresentation(OCRepresentation& rep, std::string interface) {
-            m_interface = interface;
+        void setResourceRepresentation(OCRepresentation& rep, std::string iface) {
+            m_interface = iface;
             m_representation = rep;
         }
 
@@ -139,8 +164,8 @@ namespace OC
         *  @param rep rvalue reference to the resource's representation
         *  @param interface specifies the interface
         */
-        void setResourceRepresentation(OCRepresentation&& rep, std::string interface) {
-            setResourceRepresentation(rep, interface);
+        void setResourceRepresentation(OCRepresentation&& rep, std::string iface) {
+            setResourceRepresentation(rep, iface);
         }
 
         /**
index 1c17c10..85039d0 100644 (file)
@@ -100,7 +100,7 @@ namespace OC
     template<typename T, typename = void>
     struct is_vector
     {
-        constexpr static bool value = false;
+        BOOST_STATIC_CONSTEXPR bool value = false;
     };
 
     template<typename T>
@@ -110,7 +110,7 @@ namespace OC
         >::type
     >
     {
-        constexpr static bool value = true;
+        BOOST_STATIC_CONSTEXPR bool value = true;
     };
 
     // type trait to remove the first type from a parameter-packed list
@@ -132,14 +132,14 @@ namespace OC
     template<typename ToTest, template <typename...> class Base, typename T>
     struct is_component<ToTest, Base<T> >
     {
-        static constexpr bool value = std::is_same<ToTest, T>::value;
+        BOOST_STATIC_CONSTEXPR bool value = std::is_same<ToTest, T>::value;
     };
 
     // Recursive specialization to handle cases with multiple values
     template<typename ToTest, template <typename...> class Base, typename T, typename ...Rest>
     struct is_component<ToTest, Base<T, Rest...> >
     {
-        static constexpr bool value = std::is_same<ToTest, T>::value
+        BOOST_STATIC_CONSTEXPR bool value = std::is_same<ToTest, T>::value
             || is_component<ToTest, Base<Rest...> >::value;
     };
 } // namespace OC
index 33cb27d..e700739 100644 (file)
@@ -75,7 +75,7 @@ namespace OC
             return m_missingInterface;
         }
 
-        virtual const char* what() const noexcept
+        virtual const char* what() const BOOST_NOEXCEPT
         {
             std::string ret;
 
index 4b97938..a6986eb 100644 (file)
 
 namespace OC
 {
+
+#if defined(_WIN32)
+/** @todo: Remove temporary hacks to solve error C2059: syntax error: 'constant'*/
+#ifdef NO_ERROR
+#undef NO_ERROR
+#endif
+#ifdef DELETE
+#undef DELETE
+#endif
+#endif
+
     namespace InitException
     {
         static const char NO_ERROR[]                   = "No Error";
index f2e01ac..e6c8c2c 100644 (file)
@@ -55,9 +55,9 @@ class oc_log_stream : boost::iostreams::sink
  {}
 
  public:
- inline void flush()                                    noexcept { return oc_log_flush(m_log.get()); }
- inline void set_level(const oc_log_level new_level)    noexcept { return oc_log_set_level(m_log.get(), new_level); }
- inline int  set_module(const std::string& module_name) noexcept { return oc_log_set_module(m_log.get(), module_name.c_str()); }
+ inline void flush()                                    BOOST_NOEXCEPT { return oc_log_flush(m_log.get()); }
+ inline void set_level(const oc_log_level new_level)    BOOST_NOEXCEPT { return oc_log_set_level(m_log.get(), new_level); }
+ inline int  set_module(const std::string& module_name) BOOST_NOEXCEPT { return oc_log_set_module(m_log.get(), module_name.c_str()); }
 
  public:
  std::streamsize write(const char_type *s, std::streamsize n)
index cafcfa9..d25d70f 100644 (file)
@@ -33,8 +33,8 @@ using namespace OC;
 
 namespace
 {
-        CAManager::AdapterChangedCallback g_adapterHandler = NULL;
-        CAManager::ConnectionChangedCallback g_connectionHandler = NULL;
+        CAManager::AdapterChangedCallback g_adapterHandler = nullptr;
+        CAManager::ConnectionChangedCallback g_connectionHandler = nullptr;
 }
 
 void DefaultAdapterStateChangedHandler(CATransportAdapter_t adapter, bool enabled)
index 32293f8..0fbe9bf 100644 (file)
@@ -201,11 +201,10 @@ namespace OC
 
         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)
@@ -265,11 +264,11 @@ namespace OC
 
         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)
@@ -357,11 +356,11 @@ namespace OC
         OCStackResult result;
         ClientCallbackContext::GetContext* ctx =
             new ClientCallbackContext::GetContext(callback);
-        OCCallbackData cbdata(
-                static_cast<void*>(ctx),
-                getResourceCallback,
-                [](void* c){delete static_cast<ClientCallbackContext::GetContext*>(c);}
-                );
+        OCCallbackData cbdata;
+        cbdata.context = (void*)ctx;
+        cbdata.cb      = getResourceCallback;
+        cbdata.cd      = [](void* c){delete (ClientCallbackContext::GetContext*)c;};
+
 
         std::string uri = assembleSetResourceUri(resourceUri, queryParams);
 
@@ -424,12 +423,15 @@ namespace OC
     std::string InProcClientWrapper::assembleSetResourceUri(std::string uri,
         const QueryParamsMap& queryParams)
     {
-        if(uri.back() == '/')
+        if(!uri.empty())
         {
-            uri.resize(uri.size()-1);
+            if(uri.back() == '/')
+            {
+                uri.resize(uri.size()-1);
+            }
         }
 
-        ostringstream paramsList;
+        std::ostringstream paramsList;
         if(queryParams.size() > 0)
         {
             paramsList << '?';
@@ -441,6 +443,12 @@ namespace OC
         }
 
         std::string queryString = paramsList.str();
+
+        if(queryString.empty())
+        {
+            return uri;
+        }
+
         if(queryString.back() == ';')
         {
             queryString.resize(queryString.size() - 1);
@@ -475,11 +483,11 @@ namespace OC
         }
         OCStackResult result;
         ClientCallbackContext::SetContext* ctx = new ClientCallbackContext::SetContext(callback);
-        OCCallbackData cbdata(
-                static_cast<void*>(ctx),
-                setResourceCallback,
-                [](void* c){delete static_cast<ClientCallbackContext::SetContext*>(c);}
-                );
+        OCCallbackData cbdata;
+        cbdata.context = (void*)ctx;
+        cbdata.cb      = setResourceCallback;
+        cbdata.cd      = [](void* c){delete (ClientCallbackContext::SetContext*)c;};
+
 
         std::string url = assembleSetResourceUri(uri, queryParams);
 
@@ -521,11 +529,11 @@ namespace OC
         }
         OCStackResult result;
         ClientCallbackContext::SetContext* ctx = new ClientCallbackContext::SetContext(callback);
-        OCCallbackData cbdata(
-                static_cast<void*>(ctx),
-                setResourceCallback,
-                [](void* c){delete static_cast<ClientCallbackContext::SetContext*>(c);}
-                );
+        OCCallbackData cbdata;
+        cbdata.context = (void*)ctx;
+        cbdata.cb      = setResourceCallback;
+        cbdata.cd      = [](void* c){delete (ClientCallbackContext::SetContext*)c;};
+
 
         std::string url = assembleSetResourceUri(uri, queryParams).c_str();
 
@@ -586,11 +594,11 @@ namespace OC
         OCStackResult result;
         ClientCallbackContext::DeleteContext* ctx =
             new ClientCallbackContext::DeleteContext(callback);
-        OCCallbackData cbdata(
-                static_cast<void*>(ctx),
-                deleteResourceCallback,
-                [](void* c){delete static_cast<ClientCallbackContext::DeleteContext*>(c);}
-                );
+        OCCallbackData cbdata;
+        cbdata.context = (void*)ctx;
+        cbdata.cb      = deleteResourceCallback;
+        cbdata.cd      = [](void* c){delete (ClientCallbackContext::DeleteContext*)c;};
+
 
         auto cLock = m_csdkLock.lock();
 
@@ -664,11 +672,11 @@ namespace OC
 
         ClientCallbackContext::ObserveContext* ctx =
             new ClientCallbackContext::ObserveContext(callback);
-        OCCallbackData cbdata(
-                static_cast<void*>(ctx),
-                observeResourceCallback,
-                [](void* c){delete static_cast<ClientCallbackContext::ObserveContext*>(c);}
-                );
+        OCCallbackData cbdata;
+        cbdata.context = (void*)ctx;
+        cbdata.cb      = observeResourceCallback;
+        cbdata.cd      = [](void* c){delete (ClientCallbackContext::ObserveContext*)c;};
+
 
         OCMethod method;
         if (observeType == ObserveType::Observe)
@@ -770,12 +778,11 @@ namespace OC
 
         ClientCallbackContext::SubscribePresenceContext* ctx =
             new ClientCallbackContext::SubscribePresenceContext(presenceHandler);
-        OCCallbackData cbdata(
-                static_cast<void*>(ctx),
-                subscribePresenceCallback,
-                [](void* c)
-                {delete static_cast<ClientCallbackContext::SubscribePresenceContext*>(c);}
-                );
+        OCCallbackData cbdata;
+        cbdata.context = (void*)ctx;
+        cbdata.cb      = subscribePresenceCallback;
+        cbdata.cd      = [](void* c){delete (ClientCallbackContext::SubscribePresenceContext*)c;};
+
 
         auto cLock = m_csdkLock.lock();
 
@@ -835,10 +842,11 @@ namespace OC
 
         for (auto it=headerOptions.begin(); it != headerOptions.end(); ++it)
         {
-            options[i] = OCHeaderOption(OC_COAP_ID,
-                    it->getOptionID(),
-                    it->getOptionData().length() + 1,
-                    reinterpret_cast<const uint8_t*>(it->getOptionData().c_str()));
+            options[i] = OCHeaderOption();
+            options[i].protocolID = OC_COAP_ID;
+            options[i].optionID = it->getOptionID();
+            options[i].optionLength = it->getOptionData().length() + 1;
+            strcpy((char*)options[i].optionData, (it->getOptionData().c_str()));
             i++;
         }
 
index 522ef82..ef9317f 100644 (file)
@@ -47,7 +47,7 @@ namespace OC
         std::mutex serverWrapperLock;
         std::map <OCResourceHandle, OC::EntityHandler>  entityHandlerMap;
         std::map <OCResourceHandle, std::string> resourceUriMap;
-        EntityHandler defaultDeviceEntityHandler = 0;
+        EntityHandler defaultDeviceEntityHandler;
     }
 }
 
index a5e82fc..7fdc9f5 100644 (file)
 //
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
-#include "ocapi.h"
+#include "OCApi.h"
+
+#if defined(_MSC_VER)
+namespace OC
+{
+    std::ostream& oclog()
+    {
+        return std::cout;
+    }
+}
+#endif
index 47dce71..25dbe13 100644 (file)
@@ -314,11 +314,13 @@ namespace OC
         ((int64_t*)array)[pos] = item;
     }
 
+#if !defined(_MSC_VER)
     template<>
     void get_payload_array::copy_to_array(std::_Bit_reference br, void* array, size_t pos)
     {
         ((bool*)array)[pos] = static_cast<bool>(br);
     }
+#endif
 
     template<>
     void get_payload_array::copy_to_array(std::string item, void* array, size_t pos)
@@ -422,11 +424,11 @@ namespace OC
                     break;
                 case AttributeType::String:
                     OCRepPayloadSetPropString(root, val.attrname().c_str(),
-                            static_cast<std::string>(val).c_str());
+                            (static_cast<std::string>(val)).c_str());
                     break;
                 case AttributeType::OCRepresentation:
                     OCRepPayloadSetPropObjectAsOwner(root, val.attrname().c_str(),
-                            static_cast<OCRepresentation>(val).getPayload());
+                            (static_cast<OCRepresentation>(val)).getPayload());
                     break;
                 case AttributeType::Vector:
                     getPayloadArray(root, val);
@@ -878,13 +880,13 @@ namespace OC
         // contains the inner most vector-type
         typedef T base_type;
         // contains the AttributeType for this item
-        constexpr static AttributeType enum_type =
+        BOOST_STATIC_CONSTEXPR AttributeType enum_type =
             AttributeTypeConvert<T>::type;
         // contains the AttributeType for this base-type
-        constexpr static AttributeType enum_base_type =
+        BOOST_STATIC_CONSTEXPR AttributeType enum_base_type =
             AttributeTypeConvert<T>::type;
         // depth of the vector
-        constexpr static size_t depth = 0;
+        BOOST_STATIC_CONSTEXPR size_t depth = 0;
     };
 
     template<typename T>
@@ -892,10 +894,10 @@ namespace OC
     {
         typedef T type;
         typedef typename type_info<typename T::value_type>::base_type base_type;
-        constexpr static AttributeType enum_type = AttributeType::Vector;
-        constexpr static AttributeType enum_base_type =
+        BOOST_STATIC_CONSTEXPR AttributeType enum_type = AttributeType::Vector;
+        BOOST_STATIC_CONSTEXPR AttributeType enum_base_type =
             type_info<typename T::value_type>::enum_base_type;
-        constexpr static size_t depth = 1 +
+        BOOST_STATIC_CONSTEXPR size_t depth = 1 +
             type_info<typename T::value_type>::depth;
     };
 
index 832cc76..1b9e7f3 100644 (file)
@@ -244,7 +244,7 @@ Below is an example:
        # Update the new environment, usually include add header file paths,
        # library path, libs to link and other compiler flags. This part is
        # optional.
-       new_env.AppeneUnique(xxx = [ .... ])
+       new_env.AppendUnique(xxx = [ .... ])
 
        # Specify the target(application, library, object or others) to build
        ts = new_env.Program('progam_name', [source_list])
index ed94470..a72a7b4 100644 (file)
 #ifndef CONFIGURATION_H_
 #define CONFIGURATION_H_
 
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
+#endif
+#ifdef HAVE_STRING_H
 #include <string.h>
+#endif
 #include <iostream>
 #include <fstream>
 #include <string>
index cad3ef3..e9b72ff 100644 (file)
@@ -20,7 +20,9 @@
 #include "rd_server.h"
 
 #include <signal.h>
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
+#endif
 
 int g_quitFlag = 0;
 
index 2f6c922..c782560 100644 (file)
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 #include "rd_storage.h"
 
+#ifdef HAVE_PTHREAD_H
 #include <pthread.h>
+#endif
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
+#endif
 #include <string.h>
 
 #include "payload_logging.h"
@@ -30,8