From: David Antler Date: Fri, 1 Jul 2016 21:28:42 +0000 (-0700) Subject: Merge branch 'windows-port' X-Git-Tag: 1.2.0+RC1~258 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a2593578edc02d063c1335a3e89b19a3b5a4b1ad;hp=--cc;p=platform%2Fupstream%2Fiotivity.git Merge branch 'windows-port' Add support for Visual Studio 2015 and 2013 builds. Change-Id: I3ce9bee6b3e57ccd548b849b5d147ca0babd872e Signed-off-by: David Antler --- a2593578edc02d063c1335a3e89b19a3b5a4b1ad diff --cc build_common/SConscript index 0e9f9c1,d1f1a07..38a4c8b --- a/build_common/SConscript +++ b/build_common/SConscript @@@ -14,11 -15,11 +15,11 @@@ host_target_map = # Map of os and allowed archs (os: allowed archs) os_arch_map = { - 'linux': ['x86', 'x86_64', 'arm', 'arm64'], - 'tizen': ['x86', 'x86_64', 'arm', 'arm64', 'armeabi-v7a'], + 'linux': ['x86', 'x86_64', 'arm', 'arm-v7a', 'arm64'], + 'tizen': ['x86', 'x86_64', 'arm', 'arm-v7a', 'armeabi-v7a', 'arm64'], 'android': ['x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'armeabi-v7a-hard', 'arm64-v8a'], 'windows': ['x86', 'amd64', 'arm'], - 'winrt': ['arm'], + 'msys_nt':['x86', 'x86_64'], 'darwin': ['i386', 'x86_64'], 'ios': ['i386', 'x86_64', 'armv7', 'armv7s', 'arm64'], 'arduino': ['avr', 'arm'], diff --cc resource/csdk/connectivity/common/src/camutex_pthreads.c index 6d866ad,aa77eb0..6c166b1 --- a/resource/csdk/connectivity/common/src/camutex_pthreads.c +++ b/resource/csdk/connectivity/common/src/camutex_pthreads.c @@@ -187,15 -236,14 +236,15 @@@ ca_cond ca_cond_new(void return retVal; } - #if defined(__ANDROID__) || _POSIX_TIMERS > 0 - #ifdef __ANDROID__ + #if defined(__ANDROID__) || _POSIX_TIMERS > 0 - #ifdef __ANDROID__ - if (camutex_condattr_setclock) { ++ #ifdef __ANDROID__ + if (camutex_condattr_setclock) + { ret = camutex_condattr_setclock(&(eventInfo->condattr), CLOCK_MONOTONIC); - #else - #else ++ #else { ret = pthread_condattr_setclock(&(eventInfo->condattr), CLOCK_MONOTONIC); - #endif /* __ANDROID__ */ - #endif /* __ANDROID__ */ ++ #endif /* __ANDROID__ */ if(0 != ret) { OIC_LOG_V(ERROR, TAG, "%s: Failed to set condition variable clock %d!", diff --cc resource/csdk/connectivity/src/ip_adapter/caipserver.c index 5f056a1,022d585..7e9d2cc --- a/resource/csdk/connectivity/src/ip_adapter/caipserver.c +++ b/resource/csdk/connectivity/src/ip_adapter/caipserver.c @@@ -245,9 -272,218 +272,218 @@@ static void CASelectReturned(fd_set *re } } - static CAResult_t CAReceiveMessage(int fd, CATransportFlags_t flags) + #else // if defined(WSA_WAIT_EVENT_0) + + #define CLOSE_SOCKET(TYPE) \ + if (caglobals.ip.TYPE.fd != OC_INVALID_SOCKET) \ + { \ + closesocket(caglobals.ip.TYPE.fd); \ + caglobals.ip.TYPE.fd = OC_INVALID_SOCKET; \ + } + + #define PUSH_HANDLE(HANDLE, ARRAY, INDEX) \ + { \ + ARRAY[INDEX] = HANDLE; \ + INDEX++; \ + } + + // Turn handle into WSAEvent and push to ARRAY + #define PUSH_SOCKET(SOCKET, ARRAY, INDEX) \ + if (SOCKET != OC_INVALID_SOCKET) \ + { \ + WSAEVENT NewEvent; \ + NewEvent = WSACreateEvent(); \ + if (WSA_INVALID_EVENT != NewEvent) \ + { \ + if (0 != WSAEventSelect(SOCKET, NewEvent, FD_READ)) \ + { \ + OIC_LOG_V(ERROR, TAG, "WSAEventSelect failed 0x%08x ", WSAGetLastError()); \ + if (!WSACloseEvent(NewEvent)) \ + { \ + OIC_LOG_V(ERROR, TAG, "WSACloseEvent(NewEvent) failed 0x%08x", WSAGetLastError()); \ + } \ + } \ + else \ + { \ + PUSH_HANDLE(NewEvent, ARRAY, INDEX); \ + } \ + } \ + else \ + { \ + OIC_LOG_V(ERROR, TAG, "WSACreateEvent(NewEvent) failed 0x%08x", WSAGetLastError()); \ + }\ + } + + #define INSERT_SOCKET(FD, ARRAY, INDEX) \ + { \ + if (OC_INVALID_SOCKET != FD) \ + { \ + ARRAY[INDEX] = FD; \ + } \ + } + + + // Inserts the socket into the SOCKET_ARRAY and pushes the socket event into EVENT_ARRAY + #define PUSH_IP_SOCKET(TYPE, EVENT_ARRAY, SOCKET_ARRAY, INDEX) \ + { \ + if (OC_INVALID_SOCKET != caglobals.ip.TYPE.fd) \ + { \ + INSERT_SOCKET(caglobals.ip.TYPE.fd, SOCKET_ARRAY, INDEX); \ + PUSH_SOCKET(caglobals.ip.TYPE.fd, EVENT_ARRAY, INDEX); \ + } \ + } + + #define IS_MATCHING_IP_SOCKET(TYPE, SOCKET, FLAGS) \ + if ((caglobals.ip.TYPE.fd != OC_INVALID_SOCKET) && (caglobals.ip.TYPE.fd == SOCKET)) \ + { \ + fd = caglobals.ip.TYPE.fd; \ + flags = FLAGS; \ + } + + #define EVENT_ARRAY_SIZE 10 + + static void CAFindReadyMessage() + { + CASocketFd_t socketArray[EVENT_ARRAY_SIZE]; + HANDLE eventArray[EVENT_ARRAY_SIZE]; + int arraySize = 0; + int eventIndex; + + // socketArray and eventArray should have same number of elements + OC_STATIC_ASSERT(_countof(socketArray) == _countof(eventArray), "Arrays should have same number of elements"); + + PUSH_IP_SOCKET(u6, eventArray, socketArray, arraySize); + PUSH_IP_SOCKET(u6s, eventArray, socketArray, arraySize); + PUSH_IP_SOCKET(u4, eventArray, socketArray, arraySize); + PUSH_IP_SOCKET(u4s, eventArray, socketArray, arraySize); + PUSH_IP_SOCKET(m6, eventArray, socketArray, arraySize); + PUSH_IP_SOCKET(m6s, eventArray, socketArray, arraySize); + PUSH_IP_SOCKET(m4, eventArray, socketArray, arraySize); + PUSH_IP_SOCKET(m4s, eventArray, socketArray, arraySize); + + if (-1 != caglobals.ip.shutdownEvent) + { + INSERT_SOCKET(OC_INVALID_SOCKET, socketArray, arraySize); + PUSH_HANDLE(caglobals.ip.shutdownEvent, eventArray, arraySize); + } + + /** @todo Support netlink events */ + + // Should not have overflowed buffer + assert(arraySize <= (_countof(socketArray))); + + // Timeout is unnecessary on Windows + assert(-1 == caglobals.ip.selectTimeout); + + while (!caglobals.ip.terminate) + { + int ret = WSAWaitForMultipleEvents(arraySize, eventArray, FALSE, WSA_INFINITE, FALSE); + + switch (ret) + { + case WSA_WAIT_FAILED: + OIC_LOG_V(ERROR, TAG, "WSAWaitForMultipleEvents returned WSA_WAIT_FAILED 0x%08x", WSAGetLastError()); + break; + case WSA_WAIT_IO_COMPLETION: + OIC_LOG_V(ERROR, TAG, "WSAWaitForMultipleEvents returned WSA_WAIT_IO_COMPLETION 0x%08x", WSAGetLastError()); + break; + case WSA_WAIT_TIMEOUT: + OIC_LOG_V(ERROR, TAG, "WSAWaitForMultipleEvents returned WSA_WAIT_TIMEOUT 0x%08x", WSAGetLastError()); + break; + default: + eventIndex = ret - WSA_WAIT_EVENT_0; + if ((eventIndex >= 0) && (eventIndex < arraySize)) + { + if (false == WSAResetEvent(eventArray[eventIndex])) + { + OIC_LOG_V(ERROR, TAG, "WSAResetEvent failed 0x%08x", WSAGetLastError()); + } + + // Break out if shutdownEvent is triggered + if ((caglobals.ip.shutdownEvent != -1) && + (caglobals.ip.shutdownEvent == eventArray[eventIndex])) + { + break; + } + CAEventReturned(socketArray[eventIndex]); + } + else + { + OIC_LOG_V(ERROR, TAG, "WSAWaitForMultipleEvents failed 0x%08x", WSAGetLastError()); + } + break; + } + + } + + while (arraySize > 0) + { + arraySize--; + if (!WSACloseEvent(eventArray[arraySize])) + { + OIC_LOG_V(ERROR, TAG, "WSACloseEvent (Index %i) failed 0x%08x", arraySize, WSAGetLastError()); + } + } + + if (caglobals.ip.terminate) + { + caglobals.ip.shutdownEvent = -1; + WSACleanup(); + } + } + + static void CAEventReturned(CASocketFd_t socket) + { + CASocketFd_t fd = OC_INVALID_SOCKET; + CATransportFlags_t flags = CA_DEFAULT_FLAGS; + + while (!caglobals.ip.terminate) + { + IS_MATCHING_IP_SOCKET(u6, socket, CA_IPV6) + else IS_MATCHING_IP_SOCKET(u6s, socket, CA_IPV6 | CA_SECURE) + else IS_MATCHING_IP_SOCKET(u4, socket, CA_IPV4) + else IS_MATCHING_IP_SOCKET(u4s, socket, CA_IPV4 | CA_SECURE) + else IS_MATCHING_IP_SOCKET(m6, socket, CA_MULTICAST | CA_IPV6) + else IS_MATCHING_IP_SOCKET(m6s, socket, CA_MULTICAST | CA_IPV6 | CA_SECURE) + else IS_MATCHING_IP_SOCKET(m4, socket, CA_MULTICAST | CA_IPV4) + else IS_MATCHING_IP_SOCKET(m4s, socket, CA_MULTICAST | CA_IPV4 | CA_SECURE) + else + { + break; + } + (void)CAReceiveMessage(socket, flags); + // We will never get more than one match per socket, so always break. + break; + } + } + + #endif + + void CADeInitializeIPGlobals() + { + CLOSE_SOCKET(u6); + CLOSE_SOCKET(u6s); + CLOSE_SOCKET(u4); + CLOSE_SOCKET(u4s); + CLOSE_SOCKET(m6); + CLOSE_SOCKET(m6s); + CLOSE_SOCKET(m4); + CLOSE_SOCKET(m4s); + + if (caglobals.ip.netlinkFd != OC_INVALID_SOCKET) + { + #ifdef _WIN32 + closesocket(caglobals.ip.netlinkFd); + #else + close(caglobals.ip.netlinkFd); + #endif + caglobals.ip.netlinkFd = OC_INVALID_SOCKET; + } + } + + static CAResult_t CAReceiveMessage(CASocketFd_t fd, CATransportFlags_t flags) { - char recvBuffer[COAP_MAX_PDU_SIZE]; + char recvBuffer[COAP_MAX_PDU_SIZE] = {0}; size_t len; int level, type, namelen; diff --cc resource/csdk/security/include/internal/srmresourcestrings.h index c304887,3ba9e62..7f63d92 --- a/resource/csdk/security/include/internal/srmresourcestrings.h +++ b/resource/csdk/security/include/internal/srmresourcestrings.h @@@ -23,8 -23,13 +23,12 @@@ #include "securevirtualresourcetypes.h" + #ifdef __cplusplus + extern "C" { + #endif + extern const char * SVR_DB_FILE_NAME; extern const char * SVR_DB_DAT_FILE_NAME; -extern const char * OIC_MI_DEF; //AMACL extern const char * OIC_RSRC_TYPE_SEC_AMACL; diff --cc resource/csdk/security/provisioning/unittest/SConscript index 735f12c,c632e4c..7c36b06 --- a/resource/csdk/security/provisioning/unittest/SConscript +++ b/resource/csdk/security/provisioning/unittest/SConscript @@@ -78,19 -86,23 +86,24 @@@ if target_os in ['msys_nt', 'windows'] ###################################################################### # Source files and Targets ###################################################################### - unittest = sptest_env.Program('unittest', ['pmutilitytest.cpp', - 'secureresourceprovider.cpp', - 'provisioningdatabasemanager.cpp', - 'ocprovisioningmanager.cpp', 'otmunittest.cpp', - 'credentialgeneratortest.cpp' ]) + unittest_src = ['pmutilitytest.cpp', + 'secureresourceprovider.cpp', + 'provisioningdatabasemanager.cpp', + 'ocprovisioningmanager.cpp', ++ 'credentialgeneratortest.cpp', + ] + + if target_os not in ['windows']: + unittest_src += [ 'otmunittest.cpp' ] - sample_server1 = sptest_env.Program('sample_server1', ['sampleserver1.cpp']) - sample_server2 = sptest_env.Program('sample_server2', ['sampleserver2.cpp']) + unittest = sptest_env.Program('unittest', unittest_src) - provisioning_unittest_src_dir = src_dir + '/resource/csdk/security/provisioning/unittest/' - provisioning_unittest_build_dir = env.get('BUILD_DIR') +'/resource/csdk/security/provisioning/unittest/' + if target_os not in ['windows']: + sample_server1 = sptest_env.Program('sample_server1', ['sampleserver1.cpp']) + sample_server2 = sptest_env.Program('sample_server2', ['sampleserver2.cpp']) + Alias("test", [sample_server1, sample_server2]) - Alias("test", [unittest, sample_server1, sample_server2]) + Alias("test", [unittest]) env.AppendTarget('test') if env.get('TEST') == '1': diff --cc resource/csdk/security/src/amsmgr.c index 0ce3e76,76c2c38..c208d3f --- a/resource/csdk/security/src/amsmgr.c +++ b/resource/csdk/security/src/amsmgr.c @@@ -226,9 -226,12 +226,9 @@@ OCStackResult SendAclReq(PEContext_t *c { OCStackResult ret = OC_STACK_ERROR; const char GET_ACE_QUERY_FMT[] = "%s?%s=%s;%s=%s"; - char uri[MAX_URI_LENGTH + MAX_QUERY_LENGTH] = {}; - char base64Buff[B64ENCODE_OUT_SAFESIZE(sizeof(((OicUuid_t*)0)->id)) + 1] = {0}; - uint32_t outLen = 0; + char uri[MAX_URI_LENGTH + MAX_QUERY_LENGTH] = {0}; OCCallbackData cbData = {.context=NULL}; OCDevAddr destAddr = {.adapter = OC_ADAPTER_IP}; - B64Result b64Ret; char *subID = NULL; VERIFY_NON_NULL(TAG, context, ERROR); diff --cc resource/csdk/security/src/dpairingresource.c index d5b059b,8fcb6b0..01eccd0 mode 100644,100755..100644 --- a/resource/csdk/security/src/dpairingresource.c +++ b/resource/csdk/security/src/dpairingresource.c diff --cc resource/csdk/stack/include/ocpayload.h index 0f472e1,88eba7b..d5c727e --- a/resource/csdk/stack/include/ocpayload.h +++ b/resource/csdk/stack/include/ocpayload.h @@@ -60,34 -60,33 +60,34 @@@ extern "C typedef struct OCResource OCResource; - void OCPayloadDestroy(OCPayload* payload); + OC_EXPORT void OCPayloadDestroy(OCPayload* payload); // Representation Payload - OCRepPayload* OCRepPayloadCreate(); + OC_EXPORT OCRepPayload* OCRepPayloadCreate(); - size_t calcDimTotal(const size_t dimensions[MAX_REP_ARRAY_DEPTH]); + OC_EXPORT size_t calcDimTotal(const size_t dimensions[MAX_REP_ARRAY_DEPTH]); - OCRepPayload* OCRepPayloadClone(const OCRepPayload* payload); + OC_EXPORT OCRepPayload* OCRepPayloadClone(const OCRepPayload* payload); - void OCRepPayloadAppend(OCRepPayload* parent, OCRepPayload* child); + OC_EXPORT void OCRepPayloadAppend(OCRepPayload* parent, OCRepPayload* child); - bool OCRepPayloadSetUri(OCRepPayload* payload, const char* uri); + OC_EXPORT bool OCRepPayloadSetUri(OCRepPayload* payload, const char* uri); - bool OCRepPayloadAddResourceType(OCRepPayload* payload, const char* resourceType); - bool OCRepPayloadAddInterface(OCRepPayload* payload, const char* interface); - bool OCRepPayloadAddModelVersion(OCRepPayload* payload, const char* dmv); + OC_EXPORT bool OCRepPayloadAddResourceType(OCRepPayload* payload, const char* resourceType); + OC_EXPORT bool OCRepPayloadAddInterface(OCRepPayload* payload, const char* iface); ++OC_EXPORT bool OCRepPayloadAddModelVersion(OCRepPayload* payload, const char* dmv); - bool OCRepPayloadAddResourceTypeAsOwner(OCRepPayload* payload, char* resourceType); - bool OCRepPayloadAddInterfaceAsOwner(OCRepPayload* payload, char* interface); + OC_EXPORT bool OCRepPayloadAddResourceTypeAsOwner(OCRepPayload* payload, char* resourceType); + OC_EXPORT bool OCRepPayloadAddInterfaceAsOwner(OCRepPayload* payload, char* iface); - bool OCRepPayloadIsNull(const OCRepPayload* payload, const char* name); - bool OCRepPayloadSetNull(OCRepPayload* payload, const char* name); + OC_EXPORT bool OCRepPayloadIsNull(const OCRepPayload* payload, const char* name); + OC_EXPORT bool OCRepPayloadSetNull(OCRepPayload* payload, const char* name); - bool OCRepPayloadSetPropInt(OCRepPayload* payload, const char* name, int64_t value); - bool OCRepPayloadGetPropInt(const OCRepPayload* payload, const char* name, int64_t* value); + OC_EXPORT bool OCRepPayloadSetPropInt(OCRepPayload* payload, const char* name, int64_t value); + OC_EXPORT bool OCRepPayloadGetPropInt(const OCRepPayload* payload, const char* name, int64_t* value); - bool OCRepPayloadSetPropDouble(OCRepPayload* payload, const char* name, double value); - bool OCRepPayloadGetPropDouble(const OCRepPayload* payload, const char* name, double* value); + OC_EXPORT bool OCRepPayloadSetPropDouble(OCRepPayload* payload, const char* name, double value); + OC_EXPORT bool OCRepPayloadGetPropDouble(const OCRepPayload* payload, const char* name, double* value); /** * This function allocates memory for the byte string and sets it in the payload. @@@ -177,104 -175,88 +176,104 @@@ OC_EXPORT bool OCRepPayloadSetByteStrin * * @return true on success, false upon failure. */ - bool OCRepPayloadGetByteStringArray(const OCRepPayload* payload, const char* name, + OC_EXPORT bool OCRepPayloadGetByteStringArray(const OCRepPayload* payload, const char* name, OCByteString** array, size_t dimensions[MAX_REP_ARRAY_DEPTH]); - bool OCRepPayloadSetIntArrayAsOwner(OCRepPayload* payload, const char* name, + OC_EXPORT bool OCRepPayloadSetIntArrayAsOwner(OCRepPayload* payload, const char* name, int64_t* array, size_t dimensions[MAX_REP_ARRAY_DEPTH]); - bool OCRepPayloadSetIntArray(OCRepPayload* payload, const char* name, + OC_EXPORT bool OCRepPayloadSetIntArray(OCRepPayload* payload, const char* name, const int64_t* array, size_t dimensions[MAX_REP_ARRAY_DEPTH]); - bool OCRepPayloadGetIntArray(const OCRepPayload* payload, const char* name, + OC_EXPORT bool OCRepPayloadGetIntArray(const OCRepPayload* payload, const char* name, int64_t** array, size_t dimensions[MAX_REP_ARRAY_DEPTH]); - bool OCRepPayloadSetDoubleArrayAsOwner(OCRepPayload* payload, const char* name, + OC_EXPORT bool OCRepPayloadSetDoubleArrayAsOwner(OCRepPayload* payload, const char* name, double* array, size_t dimensions[MAX_REP_ARRAY_DEPTH]); - bool OCRepPayloadSetDoubleArray(OCRepPayload* payload, const char* name, + OC_EXPORT bool OCRepPayloadSetDoubleArray(OCRepPayload* payload, const char* name, const double* array, size_t dimensions[MAX_REP_ARRAY_DEPTH]); - bool OCRepPayloadGetDoubleArray(const OCRepPayload* payload, const char* name, + OC_EXPORT bool OCRepPayloadGetDoubleArray(const OCRepPayload* payload, const char* name, double** array, size_t dimensions[MAX_REP_ARRAY_DEPTH]); - bool OCRepPayloadSetStringArrayAsOwner(OCRepPayload* payload, const char* name, + OC_EXPORT bool OCRepPayloadSetStringArrayAsOwner(OCRepPayload* payload, const char* name, char** array, size_t dimensions[MAX_REP_ARRAY_DEPTH]); - bool OCRepPayloadSetStringArray(OCRepPayload* payload, const char* name, + OC_EXPORT bool OCRepPayloadSetStringArray(OCRepPayload* payload, const char* name, const char** array, size_t dimensions[MAX_REP_ARRAY_DEPTH]); - bool OCRepPayloadGetStringArray(const OCRepPayload* payload, const char* name, + OC_EXPORT bool OCRepPayloadGetStringArray(const OCRepPayload* payload, const char* name, char*** array, size_t dimensions[MAX_REP_ARRAY_DEPTH]); - bool OCRepPayloadSetBoolArrayAsOwner(OCRepPayload* payload, const char* name, + OC_EXPORT bool OCRepPayloadSetBoolArrayAsOwner(OCRepPayload* payload, const char* name, bool* array, size_t dimensions[MAX_REP_ARRAY_DEPTH]); - bool OCRepPayloadSetBoolArray(OCRepPayload* payload, const char* name, + OC_EXPORT bool OCRepPayloadSetBoolArray(OCRepPayload* payload, const char* name, const bool* array, size_t dimensions[MAX_REP_ARRAY_DEPTH]); - bool OCRepPayloadGetBoolArray(const OCRepPayload* payload, const char* name, + OC_EXPORT bool OCRepPayloadGetBoolArray(const OCRepPayload* payload, const char* name, bool** array, size_t dimensions[MAX_REP_ARRAY_DEPTH]); - bool OCRepPayloadSetPropObjectArrayAsOwner(OCRepPayload* payload, const char* name, + OC_EXPORT bool OCRepPayloadSetPropObjectArrayAsOwner(OCRepPayload* payload, const char* name, OCRepPayload** array, size_t dimensions[MAX_REP_ARRAY_DEPTH]); - bool OCRepPayloadSetPropObjectArray(OCRepPayload* payload, const char* name, + OC_EXPORT bool OCRepPayloadSetPropObjectArray(OCRepPayload* payload, const char* name, const OCRepPayload** array, size_t dimensions[MAX_REP_ARRAY_DEPTH]); - bool OCRepPayloadGetPropObjectArray(const OCRepPayload* payload, const char* name, + OC_EXPORT bool OCRepPayloadGetPropObjectArray(const OCRepPayload* payload, const char* name, OCRepPayload*** array, size_t dimensions[MAX_REP_ARRAY_DEPTH]); - void OCRepPayloadDestroy(OCRepPayload* payload); + OC_EXPORT void OCRepPayloadDestroy(OCRepPayload* payload); // Discovery Payload - OCDiscoveryPayload* OCDiscoveryPayloadCreate(); + OC_EXPORT OCDiscoveryPayload* OCDiscoveryPayloadCreate(); - OCSecurityPayload* OCSecurityPayloadCreate(const uint8_t* securityData, size_t size); - void OCSecurityPayloadDestroy(OCSecurityPayload* payload); + OC_EXPORT OCSecurityPayload* OCSecurityPayloadCreate(const uint8_t* securityData, size_t size); + OC_EXPORT void OCSecurityPayloadDestroy(OCSecurityPayload* payload); #ifndef TCP_ADAPTER - void OCDiscoveryPayloadAddResource(OCDiscoveryPayload* payload, const OCResource* res, - uint16_t securePort); + OC_EXPORT void OCDiscoveryPayloadAddResource(OCDiscoveryPayload* payload, const OCResource* res, + uint16_t securePort); #else - void OCDiscoveryPayloadAddResource(OCDiscoveryPayload* payload, const OCResource* res, - uint16_t securePort, uint16_t tcpPort); + OC_EXPORT void OCDiscoveryPayloadAddResource(OCDiscoveryPayload* payload, const OCResource* res, + uint16_t securePort, uint16_t tcpPort); #endif - void OCDiscoveryPayloadAddNewResource(OCDiscoveryPayload* payload, OCResourcePayload* res); - bool OCResourcePayloadAddStringLL(OCStringLL **payload, const char* type); + OC_EXPORT void OCDiscoveryPayloadAddNewResource(OCDiscoveryPayload* payload, OCResourcePayload* res); + OC_EXPORT bool OCResourcePayloadAddStringLL(OCStringLL **payload, const char* type); - size_t OCDiscoveryPayloadGetResourceCount(OCDiscoveryPayload* payload); - OCResourcePayload* OCDiscoveryPayloadGetResource(OCDiscoveryPayload* payload, size_t index); + OC_EXPORT size_t OCDiscoveryPayloadGetResourceCount(OCDiscoveryPayload* payload); + OC_EXPORT OCResourcePayload* OCDiscoveryPayloadGetResource(OCDiscoveryPayload* payload, size_t index); - void OCDiscoveryResourceDestroy(OCResourcePayload* payload); - void OCDiscoveryPayloadDestroy(OCDiscoveryPayload* payload); + OC_EXPORT void OCDiscoveryResourceDestroy(OCResourcePayload* payload); + OC_EXPORT void OCDiscoveryPayloadDestroy(OCDiscoveryPayload* payload); // Device Payload - OCDevicePayload* OCDevicePayloadCreate(const char* sid, const char* dname, + OC_EXPORT OCDevicePayload* OCDevicePayloadCreate(const char* sid, const char* dname, const OCStringLL *types, const char* specVer, const char* dmVer); - void OCDevicePayloadDestroy(OCDevicePayload* payload); + OC_EXPORT void OCDevicePayloadDestroy(OCDevicePayload* payload); // Platform Payload - OCPlatformPayload* OCPlatformPayloadCreate(const OCPlatformInfo* platformInfo); - OCPlatformPayload* OCPlatformPayloadCreateAsOwner(OCPlatformInfo* platformInfo); - void OCPlatformInfoDestroy(OCPlatformInfo *info); - void OCPlatformPayloadDestroy(OCPlatformPayload* payload); + OC_EXPORT OCPlatformPayload* OCPlatformPayloadCreate(const OCPlatformInfo* platformInfo); + OC_EXPORT OCPlatformPayload* OCPlatformPayloadCreateAsOwner(OCPlatformInfo* platformInfo); + OC_EXPORT void OCPlatformInfoDestroy(OCPlatformInfo *info); + OC_EXPORT void OCPlatformPayloadDestroy(OCPlatformPayload* payload); // Presence Payload - OCPresencePayload* OCPresencePayloadCreate(uint32_t seqNum, uint32_t maxAge, + OC_EXPORT OCPresencePayload* OCPresencePayloadCreate(uint32_t seqNum, uint32_t maxAge, OCPresenceTrigger trigger, const char* resourceType); - void OCPresencePayloadDestroy(OCPresencePayload* payload); + OC_EXPORT void OCPresencePayloadDestroy(OCPresencePayload* payload); // Helper API - OCStringLL* CloneOCStringLL (OCStringLL* ll); - void OCFreeOCStringLL(OCStringLL* ll); + OC_EXPORT OCStringLL* CloneOCStringLL (OCStringLL* ll); + OC_EXPORT void OCFreeOCStringLL(OCStringLL* ll); +/** + * This function creates a list from a string (with separated contents if several) + * @param text single string or CSV text fields + * @return newly allocated linked list + * @note separator is ',' (according to rfc4180, ';' is not valid) + **/ - OCStringLL* OCCreateOCStringLL(const char* text); ++OC_EXPORT OCStringLL* OCCreateOCStringLL(const char* text); + +/** + * This function creates a string from a list (with separated contents if several) + * @param ll Pointer to list + * @return newly allocated string + * @note separator is ',' (according to rfc4180) + **/ - char* OCCreateString(const OCStringLL* ll); ++OC_EXPORT char* OCCreateString(const OCStringLL* ll); + #ifdef __cplusplus } #endif diff --cc resource/csdk/stack/include/octypes.h index 3428b35,4a0eea3..42aa770 --- a/resource/csdk/stack/include/octypes.h +++ b/resource/csdk/stack/include/octypes.h @@@ -1208,10 -1201,10 +1211,10 @@@ typedef struc char *uri; /** Resource Type */ - char *type; + OCStringLL *type; /** Interface */ - OCStringLL *interface; + OCStringLL *iface; /** This structure holds the old /oic/res response. */ OCResourcePayload *resources; diff --cc resource/csdk/stack/include/payload_logging.h index 14ca4b0,931e5f3..d04b9cd --- a/resource/csdk/stack/include/payload_logging.h +++ b/resource/csdk/stack/include/payload_logging.h @@@ -189,13 -189,10 +189,13 @@@ INLINE_API void OCPayloadLogDiscovery(L } if (payload->type) { - OIC_LOG_V(level, PL_TAG, "\tResource Type: %s", payload->type); + for (OCStringLL *strll = payload->type; strll; strll = strll->next) + { + OIC_LOG_V(level, PL_TAG, "\tResource Type: %s", strll->value); + } } OIC_LOG(level, PL_TAG, "\tInterface:"); - for (OCStringLL *itf = payload->interface; itf; itf = itf->next) + for (OCStringLL *itf = payload->iface; itf; itf = itf->next) { OIC_LOG_V(level, PL_TAG, "\t\t%s", itf->value); } diff --cc resource/csdk/stack/samples/linux/SimpleClientServer/ocserver.cpp index 9a02020,13cf61b..970565a --- a/resource/csdk/stack/samples/linux/SimpleClientServer/ocserver.cpp +++ b/resource/csdk/stack/samples/linux/SimpleClientServer/ocserver.cpp @@@ -23,11 -23,18 +23,19 @@@ #include #include #include + #ifdef HAVE_UNISTD_H #include + #endif + #ifdef HAVE_WINDOWS_H + #include + #endif #include + #ifdef HAVE_PTHREAD_H #include + #endif #include +#include "oic_malloc.h" + #include #include "ocstack.h" #include "logger.h" #include "ocpayload.h" diff --cc resource/csdk/stack/src/ocpayload.c index 09ec90f,8815d47..be9b080 --- a/resource/csdk/stack/src/ocpayload.c +++ b/resource/csdk/stack/src/ocpayload.c @@@ -1672,9 -1590,9 +1672,9 @@@ void OCDiscoveryPayloadDestroy(OCDiscov OICFree(payload->sid); OICFree(payload->baseURI); OICFree(payload->uri); - OICFree(payload->type); + OCFreeOCStringLL(payload->type); OICFree(payload->name); - OCFreeOCStringLL(payload->interface); + OCFreeOCStringLL(payload->iface); OCDiscoveryResourceDestroy(payload->resources); OICFree(payload); } diff --cc resource/csdk/stack/src/ocpayloadparse.c index a103059,dfd1ec7..ef9dc8a mode 100644,100755..100644 --- a/resource/csdk/stack/src/ocpayloadparse.c +++ b/resource/csdk/stack/src/ocpayloadparse.c diff --cc resource/csdk/stack/src/ocresource.c index 8303948,a4370f3..fc36619 --- a/resource/csdk/stack/src/ocresource.c +++ b/resource/csdk/stack/src/ocresource.c @@@ -775,13 -786,11 +778,13 @@@ static OCStackResult HandleVirtualResou discPayload->name = OICStrdup(savedDeviceInfo.deviceName); VERIFY_NON_NULL(discPayload->name, ERROR, OC_STACK_NO_MEMORY); } - discPayload->type = OICStrdup(OC_RSRVD_RESOURCE_TYPE_RES); + discPayload->type = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL)); VERIFY_NON_NULL(discPayload->type, ERROR, OC_STACK_NO_MEMORY); + discPayload->type->value = OICStrdup(OC_RSRVD_RESOURCE_TYPE_RES); + VERIFY_NON_NULL(discPayload->type->value, ERROR, OC_STACK_NO_MEMORY); - OCResourcePayloadAddStringLL(&discPayload->interface, OC_RSRVD_INTERFACE_LL); - OCResourcePayloadAddStringLL(&discPayload->interface, OC_RSRVD_INTERFACE_DEFAULT); - VERIFY_NON_NULL(discPayload->interface, ERROR, OC_STACK_NO_MEMORY); + OCResourcePayloadAddStringLL(&discPayload->iface, OC_RSRVD_INTERFACE_LL); + OCResourcePayloadAddStringLL(&discPayload->iface, OC_RSRVD_INTERFACE_DEFAULT); + VERIFY_NON_NULL(discPayload->iface, ERROR, OC_STACK_NO_MEMORY); } bool foundResourceAtRD = false; for (;resource && discoveryResult == OC_STACK_OK; resource = resource->next)