1 //******************************************************************
3 // Copyright 2015 Intel Mobile Communications GmbH All Rights Reserved.
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
11 // http://www.apache.org/licenses/LICENSE-2.0
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
21 // Required for strok_r
22 #define _POSIX_C_SOURCE 200112L
24 #include "iotivity_config.h"
26 #include "ocpayload.h"
29 #include "oic_malloc.h"
30 #include "oic_string.h"
31 #include "ocstackinternal.h"
32 #include "ocresource.h"
34 #include "ocendpoint.h"
37 #define TAG "OIC_RI_PAYLOAD"
38 #define CSV_SEPARATOR ','
40 static void OCFreeRepPayloadValueContents(OCRepPayloadValue* val);
42 void OCPayloadDestroy(OCPayload* payload)
51 case PAYLOAD_TYPE_REPRESENTATION:
52 OCRepPayloadDestroy((OCRepPayload*)payload);
54 case PAYLOAD_TYPE_DISCOVERY:
55 OCDiscoveryPayloadDestroy((OCDiscoveryPayload*)payload);
57 case PAYLOAD_TYPE_PRESENCE:
58 OCPresencePayloadDestroy((OCPresencePayload*)payload);
60 case PAYLOAD_TYPE_SECURITY:
61 OCSecurityPayloadDestroy((OCSecurityPayload*)payload);
64 OIC_LOG_V(ERROR, TAG, "Unsupported payload type in destroy: %d", payload->type);
70 OCRepPayload* OCRepPayloadCreate()
72 OCRepPayload* payload = (OCRepPayload*)OICCalloc(1, sizeof(OCRepPayload));
79 payload->base.type = PAYLOAD_TYPE_REPRESENTATION;
84 void OCRepPayloadAppend(OCRepPayload* parent, OCRepPayload* child)
93 parent = parent->next;
100 static OCRepPayloadValue* OCRepPayloadFindValue(const OCRepPayload* payload, const char* name)
102 if (!payload || !name)
107 OCRepPayloadValue* val = payload->values;
110 if (0 == strcmp(val->name, name))
120 static void OCCopyPropertyValueArray(OCRepPayloadValue* dest, OCRepPayloadValue* source)
122 if (!dest || !source)
127 size_t dimTotal = calcDimTotal(source->arr.dimensions);
128 switch(source->arr.type)
131 dest->arr.iArray = (int64_t*)OICMalloc(dimTotal * sizeof(int64_t));
132 VERIFY_PARAM_NON_NULL(TAG, dest->arr.iArray, "Failed allocating memory");
133 memcpy(dest->arr.iArray, source->arr.iArray, dimTotal * sizeof(int64_t));
135 case OCREP_PROP_DOUBLE:
136 dest->arr.dArray = (double*)OICMalloc(dimTotal * sizeof(double));
137 VERIFY_PARAM_NON_NULL(TAG, dest->arr.dArray, "Failed allocating memory");
138 memcpy(dest->arr.dArray, source->arr.dArray, dimTotal * sizeof(double));
140 case OCREP_PROP_BOOL:
141 dest->arr.bArray = (bool*)OICMalloc(dimTotal * sizeof(bool));
142 VERIFY_PARAM_NON_NULL(TAG, dest->arr.bArray, "Failed allocating memory");
143 memcpy(dest->arr.bArray, source->arr.bArray, dimTotal * sizeof(bool));
145 case OCREP_PROP_STRING:
146 dest->arr.strArray = (char**)OICMalloc(dimTotal * sizeof(char*));
147 VERIFY_PARAM_NON_NULL(TAG, dest->arr.strArray, "Failed allocating memory");
148 for(size_t i = 0; i < dimTotal; ++i)
150 dest->arr.strArray[i] = OICStrdup(source->arr.strArray[i]);
153 case OCREP_PROP_OBJECT:
154 dest->arr.objArray = (OCRepPayload**)OICMalloc(dimTotal * sizeof(OCRepPayload*));
155 VERIFY_PARAM_NON_NULL(TAG, dest->arr.objArray, "Failed allocating memory");
156 for(size_t i = 0; i < dimTotal; ++i)
158 dest->arr.objArray[i] = OCRepPayloadClone(source->arr.objArray[i]);
161 case OCREP_PROP_ARRAY:
162 dest->arr.objArray = (OCRepPayload**)OICMalloc(dimTotal * sizeof(OCRepPayload*));
163 VERIFY_PARAM_NON_NULL(TAG, dest->arr.objArray, "Failed allocating memory");
164 for(size_t i = 0; i < dimTotal; ++i)
166 dest->arr.objArray[i] = OCRepPayloadClone(source->arr.objArray[i]);
169 case OCREP_PROP_BYTE_STRING:
170 dest->arr.ocByteStrArray = (OCByteString*)OICMalloc(dimTotal * sizeof(OCByteString));
171 VERIFY_PARAM_NON_NULL(TAG, dest->arr.ocByteStrArray, "Failed allocating memory");
172 for (size_t i = 0; i < dimTotal; ++i)
174 OCByteStringCopy(&dest->arr.ocByteStrArray[i], &source->arr.ocByteStrArray[i]);
175 VERIFY_PARAM_NON_NULL(TAG, dest->arr.ocByteStrArray[i].bytes, "Failed allocating memory");
179 OIC_LOG(ERROR, TAG, "CopyPropertyValueArray invalid type");
186 static void OCCopyPropertyValue (OCRepPayloadValue *dest, OCRepPayloadValue *source)
188 if (!source || !dest)
195 case OCREP_PROP_STRING:
196 dest->str = OICStrdup(source->str);
198 case OCREP_PROP_BYTE_STRING:
199 dest->ocByteStr.bytes = (uint8_t*)OICMalloc(source->ocByteStr.len * sizeof(uint8_t));
200 VERIFY_PARAM_NON_NULL(TAG, dest->ocByteStr.bytes, "Failed allocating memory");
201 dest->ocByteStr.len = source->ocByteStr.len;
202 memcpy(dest->ocByteStr.bytes, source->ocByteStr.bytes, dest->ocByteStr.len);
204 case OCREP_PROP_OBJECT:
205 dest->obj = OCRepPayloadClone(source->obj);
207 case OCREP_PROP_ARRAY:
208 OCCopyPropertyValueArray(dest, source);
211 // Nothing to do for the trivially copyable types.
218 static void OCFreeRepPayloadValueContents(OCRepPayloadValue* val)
225 if (val->type == OCREP_PROP_STRING)
229 else if (val->type == OCREP_PROP_BYTE_STRING)
231 OICFree(val->ocByteStr.bytes);
233 else if (val->type == OCREP_PROP_OBJECT)
235 OCRepPayloadDestroy(val->obj);
237 else if (val->type == OCREP_PROP_ARRAY)
239 size_t dimTotal = calcDimTotal(val->arr.dimensions);
240 switch(val->arr.type)
243 case OCREP_PROP_DOUBLE:
244 case OCREP_PROP_BOOL:
245 // Since this is a union, iArray will
246 // point to all of the above
247 OICFree(val->arr.iArray);
249 case OCREP_PROP_STRING:
250 for(size_t i = 0; i < dimTotal; ++i)
252 OICFree(val->arr.strArray[i]);
254 OICFree(val->arr.strArray);
256 case OCREP_PROP_BYTE_STRING:
257 for (size_t i = 0; i < dimTotal; ++i)
259 if (val->arr.ocByteStrArray[i].bytes)
261 OICFree(val->arr.ocByteStrArray[i].bytes);
264 OICFree(val->arr.ocByteStrArray);
266 case OCREP_PROP_OBJECT: // This case is the temporary fix for string input
267 for(size_t i = 0; i< dimTotal; ++i)
269 OCRepPayloadDestroy(val->arr.objArray[i]);
271 OICFree(val->arr.objArray);
273 case OCREP_PROP_NULL:
274 case OCREP_PROP_ARRAY:
275 OIC_LOG_V(ERROR, TAG, "FreeRepPayloadValueContents: Illegal type\
276 inside an array: %d", val->arr.type);
282 static void OCFreeRepPayloadValue(OCRepPayloadValue* val)
290 OCFreeRepPayloadValueContents(val);
291 OCFreeRepPayloadValue(val->next);
294 static OCRepPayloadValue* OCRepPayloadValueClone (OCRepPayloadValue* source)
301 OCRepPayloadValue *sourceIter = source;
302 OCRepPayloadValue *destIter = (OCRepPayloadValue*) OICCalloc(1, sizeof(OCRepPayloadValue));
308 OCRepPayloadValue *headOfClone = destIter;
310 // Copy payload type and non pointer types in union.
311 *destIter = *sourceIter;
312 destIter->name = OICStrdup (sourceIter->name);
313 OCCopyPropertyValue (destIter, sourceIter);
315 sourceIter = sourceIter->next;
319 destIter->next = (OCRepPayloadValue*) OICCalloc(1, sizeof(OCRepPayloadValue));
322 OCFreeRepPayloadValue (headOfClone);
326 *(destIter->next) = *sourceIter;
327 destIter->next->name = OICStrdup (sourceIter->name);
328 OCCopyPropertyValue (destIter->next, sourceIter);
330 sourceIter = sourceIter->next;
331 destIter = destIter->next;
336 static OCRepPayloadValue* OCRepPayloadFindAndSetValue(OCRepPayload* payload, const char* name,
337 OCRepPayloadPropType type)
339 if (!payload || !name)
344 OCRepPayloadValue* val = payload->values;
347 payload->values = (OCRepPayloadValue*)OICCalloc(1, sizeof(OCRepPayloadValue));
348 if (!payload->values)
352 payload->values->name = OICStrdup(name);
353 if (!payload->values->name)
355 OICFree(payload->values);
356 payload->values = NULL;
359 payload->values->type =type;
360 return payload->values;
365 if (0 == strcmp(val->name, name))
367 OCFreeRepPayloadValueContents(val);
371 else if (val->next == NULL)
373 val->next = (OCRepPayloadValue*)OICCalloc(1, sizeof(OCRepPayloadValue));
378 val->next->name = OICStrdup(name);
379 if (!val->next->name)
385 val->next->type =type;
392 OIC_LOG(ERROR, TAG, "FindAndSetValue reached point after while loop, pointer corruption?");
396 bool OCRepPayloadAddResourceType(OCRepPayload* payload, const char* resourceType)
398 return OCRepPayloadAddResourceTypeAsOwner(payload, OICStrdup(resourceType));
401 bool OCRepPayloadAddResourceTypeAsOwner(OCRepPayload* payload, char* resourceType)
403 if (!payload || !resourceType)
410 OCStringLL* cur = payload->types;
415 cur->next = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
422 cur->next->value = resourceType;
427 payload->types = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
432 payload->types->value = resourceType;
437 bool OCRepPayloadAddInterface(OCRepPayload* payload, const char* iface)
439 return OCRepPayloadAddInterfaceAsOwner(payload, OICStrdup(iface));
442 bool OCRepPayloadAddInterfaceAsOwner(OCRepPayload* payload, char* iface)
444 if (!payload || !iface)
449 if (payload->interfaces)
451 OCStringLL* cur = payload->interfaces;
456 cur->next = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
462 cur->next->value = iface;
467 payload->interfaces = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
468 if (!payload->interfaces)
472 payload->interfaces->value = iface;
477 bool OCRepPayloadSetUri(OCRepPayload* payload, const char* uri)
483 OICFree(payload->uri);
484 payload->uri = OICStrdup(uri);
485 return payload->uri != NULL;
488 bool OCRepPayloadIsNull(const OCRepPayload* payload, const char* name)
490 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
497 return val->type == OCREP_PROP_NULL;
500 static bool OCRepPayloadSetProp(OCRepPayload* payload, const char* name,
501 void* value, OCRepPayloadPropType type)
503 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, type);
511 val->i = *(int64_t*)value;
513 case OCREP_PROP_DOUBLE:
514 val->d = *(double*)value;
516 case OCREP_PROP_BOOL:
517 val->b = *(bool*)value;
519 case OCREP_PROP_OBJECT:
520 val->obj = (OCRepPayload*)value;
522 case OCREP_PROP_STRING:
523 val->str = (char*)value;
524 return val->str != NULL;
525 case OCREP_PROP_BYTE_STRING:
526 val->ocByteStr = *(OCByteString*)value;
527 return val->ocByteStr.bytes != NULL;
528 case OCREP_PROP_NULL:
530 case OCREP_PROP_ARRAY:
538 bool OCRepPayloadSetNull(OCRepPayload* payload, const char* name)
540 return OCRepPayloadSetProp(payload, name, NULL, OCREP_PROP_NULL);
543 bool OCRepPayloadSetPropInt(OCRepPayload* payload,
544 const char* name, int64_t value)
546 return OCRepPayloadSetProp(payload, name, &value, OCREP_PROP_INT);
549 bool OCRepPayloadGetPropInt(const OCRepPayload* payload, const char* name, int64_t* value)
551 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
553 if (!val || val->type != OCREP_PROP_INT)
562 bool OCRepPayloadSetPropDouble(OCRepPayload* payload,
563 const char* name, double value)
565 return OCRepPayloadSetProp(payload, name, &value, OCREP_PROP_DOUBLE);
568 bool OCRepPayloadGetPropDouble(const OCRepPayload* payload, const char* name, double* value)
570 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
574 if (val->type == OCREP_PROP_DOUBLE)
579 else if (val->type == OCREP_PROP_INT)
581 // Should be removed once IOT-1705 is fixed.
583 #pragma warning( suppress : 4244 )
595 bool OCRepPayloadSetPropString(OCRepPayload* payload, const char* name, const char* value)
597 char* temp = OICStrdup(value);
598 bool b = OCRepPayloadSetPropStringAsOwner(payload, name, temp);
607 bool OCRepPayloadSetPropStringAsOwner(OCRepPayload* payload, const char* name, char* value)
609 return OCRepPayloadSetProp(payload, name, value, OCREP_PROP_STRING);
612 bool OCRepPayloadGetPropString(const OCRepPayload* payload, const char* name, char** value)
614 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
616 if (!val || val->type != OCREP_PROP_STRING)
621 *value = OICStrdup(val->str);
622 return *value != NULL;
625 bool OCRepPayloadSetPropByteString(OCRepPayload* payload, const char* name, OCByteString value)
627 if (!value.bytes || !value.len)
632 OCByteString ocByteStr = {NULL, 0};
633 bool b = OCByteStringCopy(&ocByteStr, &value);
637 b = OCRepPayloadSetPropByteStringAsOwner(payload, name, &ocByteStr);
641 OICFree(ocByteStr.bytes);
646 bool OCRepPayloadSetPropByteStringAsOwner(OCRepPayload* payload, const char* name, OCByteString* value)
648 return OCRepPayloadSetProp(payload, name, value, OCREP_PROP_BYTE_STRING);
651 bool OCRepPayloadGetPropByteString(const OCRepPayload* payload, const char* name, OCByteString* value)
653 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
655 if (!val || val->type != OCREP_PROP_BYTE_STRING)
665 value->bytes = (uint8_t*)OICMalloc(val->ocByteStr.len * sizeof(uint8_t));
670 value->len = val->ocByteStr.len;
671 memcpy(value->bytes, val->ocByteStr.bytes, value->len);
676 bool OCRepPayloadSetPropBool(OCRepPayload* payload,
677 const char* name, bool value)
679 return OCRepPayloadSetProp(payload, name, &value, OCREP_PROP_BOOL);
682 bool OCRepPayloadGetPropBool(const OCRepPayload* payload, const char* name, bool* value)
684 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
686 if (!val || val->type != OCREP_PROP_BOOL)
696 static char *getStringFromEncodingType(OicEncodingType_t type)
701 case OIC_ENCODING_BASE64: str = OC_RSRVD_BASE64; break;
702 case OIC_ENCODING_DER: str = OC_RSRVD_DER; break;
703 case OIC_ENCODING_PEM: str = OC_RSRVD_PEM; break;
704 case OIC_ENCODING_RAW: str = OC_RSRVD_RAW; break;
705 default: str = OC_RSRVD_UNKNOWN; break;
708 snprintf(encoding, sizeof(encoding), "%s.%s.%s", OC_OIC_SEC, OC_RSRVD_ENCODING, str);
710 return OICStrdup(encoding);
713 bool OCRepPayloadSetPropPubDataTypeAsOwner(OCRepPayload *payload, const char *name,
714 const OicSecKey_t *value)
716 if (!payload || !name || !value)
721 bool binary_field = false;
722 if (OIC_ENCODING_RAW == value->encoding || OIC_ENCODING_DER == value->encoding)
727 OCRepPayload *heplerPayload = OCRepPayloadCreate();
733 char *encoding = getStringFromEncodingType(value->encoding);
734 if (!OCRepPayloadSetPropString(heplerPayload, OC_RSRVD_ENCODING, encoding))
736 OIC_LOG_V(ERROR, TAG, "Can't set %s", OC_RSRVD_ENCODING);
739 OCByteString val = {.bytes = value->data, .len = value->len};
742 if (!OCRepPayloadSetPropByteString(heplerPayload, OC_RSRVD_DATA, val))
744 OIC_LOG_V(ERROR, TAG, "Can't set %s", OC_RSRVD_DATA);
749 if (!OCRepPayloadSetPropString(heplerPayload, OC_RSRVD_DATA, (char *)val.bytes))
751 OIC_LOG_V(ERROR, TAG, "Can't set %s", OC_RSRVD_DATA);
755 if (!OCRepPayloadSetPropObject(payload, name, (const OCRepPayload *)heplerPayload))
757 OIC_LOG_V(ERROR, TAG, "Can't set %s", name);
760 OCRepPayloadDestroy(heplerPayload);
766 bool OCRepPayloadSetPropPubDataType(OCRepPayload *payload, const char *name,
767 const OicSecKey_t *value)
769 return OCRepPayloadSetPropPubDataTypeAsOwner(payload, name, value);
772 static OicEncodingType_t getEncodingTypeFromString(char *encoding)
774 OicEncodingType_t type = OIC_ENCODING_UNKNOW;
776 char *str = strrchr(encoding, '.');
779 OIC_LOG_V(ERROR, TAG, "Can't find . in %s", encoding);
782 str++; //go to encoding itself
784 if (0 == strcmp(str, OC_RSRVD_BASE64)) type = OIC_ENCODING_BASE64;
785 else if (0 == strcmp(str, OC_RSRVD_DER)) type = OIC_ENCODING_DER;
786 else if (0 == strcmp(str, OC_RSRVD_PEM)) type = OIC_ENCODING_PEM;
787 else if (0 == strcmp(str, OC_RSRVD_RAW)) type = OIC_ENCODING_RAW;
792 bool OCRepPayloadGetPropPubDataType(const OCRepPayload *payload, const char *name, OicSecKey_t *value)
794 OCRepPayload *heplerPayload = NULL;
795 char *encoding = NULL;
798 if (!payload || !name || !value)
803 if (!OCRepPayloadGetPropObject(payload, name, &heplerPayload))
805 OIC_LOG_V(ERROR, TAG, "Can't get object with name %s", name);
809 if (!OCRepPayloadGetPropString(heplerPayload, OC_RSRVD_ENCODING, &encoding))
811 OIC_LOG_V(ERROR, TAG, "Can't get %s", OC_RSRVD_ENCODING);
815 value->encoding = getEncodingTypeFromString(encoding);
819 if (!OCRepPayloadGetPropByteString(heplerPayload, OC_RSRVD_DATA, &val))
821 if (!OCRepPayloadGetPropString(heplerPayload, OC_RSRVD_DATA, (char **)&val.bytes))
823 OIC_LOG_V(ERROR, TAG, "Can't get: %s", OC_RSRVD_DATA);
827 value->data = val.bytes;
828 value->len = strlen(val.bytes);
833 value->data = val.bytes;
834 value->len = val.len;
837 OCRepPayloadDestroy(heplerPayload);
842 bool OCRepPayloadSetPropObject(OCRepPayload* payload, const char* name, const OCRepPayload* value)
844 OCRepPayload* temp = OCRepPayloadClone(value);
845 bool b = OCRepPayloadSetPropObjectAsOwner(payload, name, temp);
849 OCRepPayloadDestroy(temp);
854 bool OCRepPayloadSetPropObjectAsOwner(OCRepPayload* payload, const char* name, OCRepPayload* value)
856 return OCRepPayloadSetProp(payload, name, value, OCREP_PROP_OBJECT);
859 bool OCRepPayloadGetPropObject(const OCRepPayload* payload, const char* name, OCRepPayload** value)
861 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
863 if (!val || val->type != OCREP_PROP_OBJECT)
868 *value = OCRepPayloadClone(val->obj);
869 return *value != NULL;
872 size_t calcDimTotal(const size_t dimensions[MAX_REP_ARRAY_DEPTH])
874 if (dimensions[0] == 0)
880 for(uint8_t i = 0; i < MAX_REP_ARRAY_DEPTH && dimensions[i] != 0; ++i)
882 total *= dimensions[i];
888 bool OCRepPayloadSetByteStringArrayAsOwner(OCRepPayload* payload, const char* name,
889 OCByteString* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
891 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, OCREP_PROP_ARRAY);
898 val->arr.type = OCREP_PROP_BYTE_STRING;
899 memcpy(val->arr.dimensions, dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
900 val->arr.ocByteStrArray = array;
905 bool OCRepPayloadSetByteStringArray(OCRepPayload* payload, const char* name,
906 const OCByteString* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
913 size_t dimTotal = calcDimTotal(dimensions);
919 OCByteString* newArray = (OCByteString*)OICCalloc(dimTotal, sizeof(OCByteString));
926 for (size_t i = 0; i < dimTotal; ++i)
928 newArray[i].bytes = (uint8_t*)OICMalloc(array[i].len * sizeof(uint8_t));
929 if (NULL == newArray[i].bytes)
931 for (size_t j = 0; j < i; ++j)
933 OICFree(newArray[j].bytes);
939 newArray[i].len = array[i].len;
940 memcpy(newArray[i].bytes, array[i].bytes, newArray[i].len);
943 bool b = OCRepPayloadSetByteStringArrayAsOwner(payload, name, newArray, dimensions);
946 for (size_t i = 0; i < dimTotal; ++i)
948 OICFree(newArray[i].bytes);
956 bool OCRepPayloadGetByteStringArray(const OCRepPayload* payload, const char* name,
957 OCByteString** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
959 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
961 if (!val || val->type != OCREP_PROP_ARRAY || val->arr.type != OCREP_PROP_BYTE_STRING
962 || !val->arr.ocByteStrArray)
967 size_t dimTotal = calcDimTotal(val->arr.dimensions);
973 *array = (OCByteString*)OICCalloc(dimTotal, sizeof(OCByteString));
979 for (size_t i = 0; i < dimTotal; ++i)
981 OCByteString* tmp = &(*array)[i];
982 tmp->bytes = (uint8_t*)OICMalloc(val->arr.ocByteStrArray[i].len * sizeof(uint8_t));
983 if (NULL == tmp->bytes)
985 for (size_t j = 0; j < i; ++j)
987 OCByteString* tmp = &(*array)[j];
995 tmp->len = val->arr.ocByteStrArray[i].len;
996 memcpy(tmp->bytes, val->arr.ocByteStrArray[i].bytes, tmp->len);
999 memcpy(dimensions, val->arr.dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
1004 bool OCRepPayloadSetIntArrayAsOwner(OCRepPayload* payload, const char* name,
1005 int64_t* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1007 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, OCREP_PROP_ARRAY);
1014 val->arr.type = OCREP_PROP_INT;
1015 memcpy(val->arr.dimensions, dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
1016 val->arr.iArray = array;
1021 bool OCRepPayloadSetIntArray(OCRepPayload* payload, const char* name,
1022 const int64_t* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1024 size_t dimTotal = calcDimTotal(dimensions);
1030 int64_t* newArray = (int64_t*)OICMalloc(dimTotal * sizeof(int64_t));
1037 memcpy(newArray, array, dimTotal * sizeof(int64_t));
1040 bool b = OCRepPayloadSetIntArrayAsOwner(payload, name, newArray, dimensions);
1048 bool OCRepPayloadGetIntArray(const OCRepPayload* payload, const char* name,
1049 int64_t** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1051 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
1053 if (!val || val->type != OCREP_PROP_ARRAY || val->arr.type != OCREP_PROP_INT
1054 || !val->arr.iArray)
1059 size_t dimTotal = calcDimTotal(val->arr.dimensions);
1064 *array = (int64_t*)OICMalloc(dimTotal * sizeof(int64_t));
1070 memcpy(*array, val->arr.iArray, dimTotal * sizeof(int64_t));
1071 memcpy(dimensions, val->arr.dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
1075 bool OCRepPayloadSetDoubleArrayAsOwner(OCRepPayload* payload, const char* name,
1076 double* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1078 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, OCREP_PROP_ARRAY);
1085 val->arr.type = OCREP_PROP_DOUBLE;
1086 memcpy(val->arr.dimensions, dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
1087 val->arr.dArray = array;
1091 bool OCRepPayloadSetDoubleArray(OCRepPayload* payload, const char* name,
1092 const double* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1094 size_t dimTotal = calcDimTotal(dimensions);
1100 double* newArray = (double*)OICMalloc(dimTotal * sizeof(double));
1107 memcpy(newArray, array, dimTotal * sizeof(double));
1109 bool b = OCRepPayloadSetDoubleArrayAsOwner(payload, name, newArray, dimensions);
1117 bool OCRepPayloadGetDoubleArray(const OCRepPayload* payload, const char* name,
1118 double** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1120 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
1123 (val->type != OCREP_PROP_ARRAY) ||
1124 ((val->arr.type != OCREP_PROP_DOUBLE) &&
1125 (val->arr.type != OCREP_PROP_INT)) ||
1131 size_t dimTotal = calcDimTotal(val->arr.dimensions);
1136 *array = (double*)OICMalloc(dimTotal * sizeof(double));
1142 if (val->arr.type == OCREP_PROP_DOUBLE)
1144 memcpy(*array, val->arr.dArray, dimTotal * sizeof(double));
1148 /* need to convert from integer */
1150 for ( ; n < dimTotal; ++n)
1152 // Should be removed once IOT-1705 is fixed.
1154 #pragma warning( suppress : 4244 )
1155 (*array)[n] = val->arr.iArray[n];
1157 (*array)[n] = val->arr.iArray[n];
1161 memcpy(dimensions, val->arr.dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
1165 bool OCRepPayloadSetStringArrayAsOwner(OCRepPayload* payload, const char* name,
1166 char** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1168 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, OCREP_PROP_ARRAY);
1175 val->arr.type = OCREP_PROP_STRING;
1176 memcpy(val->arr.dimensions, dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
1177 val->arr.strArray = array;
1181 bool OCRepPayloadSetStringArray(OCRepPayload* payload, const char* name,
1182 const char** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1184 size_t dimTotal = calcDimTotal(dimensions);
1190 char** newArray = (char**)OICMalloc(dimTotal * sizeof(char*));
1197 for(size_t i = 0; i < dimTotal; ++i)
1199 newArray[i] = OICStrdup(array[i]);
1202 bool b = OCRepPayloadSetStringArrayAsOwner(payload, name, newArray, dimensions);
1206 for(size_t i = 0; i < dimTotal; ++i)
1208 OICFree(newArray[i]);
1215 bool OCRepPayloadGetStringArray(const OCRepPayload* payload, const char* name,
1216 char*** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1218 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
1220 if (!val || val->type != OCREP_PROP_ARRAY || val->arr.type != OCREP_PROP_STRING
1221 || !val->arr.strArray)
1226 size_t dimTotal = calcDimTotal(val->arr.dimensions);
1231 *array = (char**)OICMalloc(dimTotal * sizeof(char*));
1237 memcpy(dimensions, val->arr.dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
1239 for(size_t i = 0; i < dimTotal; ++i)
1241 (*array)[i] = OICStrdup(val->arr.strArray[i]);
1248 bool OCRepPayloadSetBoolArrayAsOwner(OCRepPayload* payload, const char* name,
1249 bool* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1252 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, OCREP_PROP_ARRAY);
1259 val->arr.type = OCREP_PROP_BOOL;
1260 memcpy(val->arr.dimensions, dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
1261 val->arr.bArray = array;
1265 bool OCRepPayloadSetBoolArray(OCRepPayload* payload, const char* name,
1266 const bool* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1268 size_t dimTotal = calcDimTotal(dimensions);
1274 bool* newArray = (bool*)OICMalloc(dimTotal * sizeof(bool));
1281 memcpy(newArray, array, dimTotal * sizeof(bool));
1284 bool b = OCRepPayloadSetBoolArrayAsOwner(payload, name, newArray, dimensions);
1292 bool OCRepPayloadGetBoolArray(const OCRepPayload* payload, const char* name,
1293 bool** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1295 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
1297 if (!val || val->type != OCREP_PROP_ARRAY || val->arr.type != OCREP_PROP_BOOL
1298 || !val->arr.bArray)
1303 size_t dimTotal = calcDimTotal(val->arr.dimensions);
1308 *array = (bool*)OICMalloc(dimTotal * sizeof(bool));
1314 memcpy(*array, val->arr.bArray, dimTotal * sizeof(bool));
1315 memcpy(dimensions, val->arr.dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
1319 bool OCRepPayloadSetPropObjectArrayAsOwner(OCRepPayload* payload, const char* name,
1320 OCRepPayload** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1322 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, OCREP_PROP_ARRAY);
1329 val->arr.type = OCREP_PROP_OBJECT;
1330 memcpy(val->arr.dimensions, dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
1331 val->arr.objArray = array;
1336 bool OCRepPayloadSetPropObjectArray(OCRepPayload* payload, const char* name,
1337 const OCRepPayload** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1339 size_t dimTotal = calcDimTotal(dimensions);
1345 OCRepPayload** newArray = (OCRepPayload**)OICMalloc(dimTotal * sizeof(OCRepPayload*));
1352 for(size_t i = 0; i < dimTotal; ++i)
1354 newArray[i] = OCRepPayloadClone(array[i]);
1357 bool b = OCRepPayloadSetPropObjectArrayAsOwner(payload, name, newArray, dimensions);
1361 for(size_t i = 0; i < dimTotal; ++i)
1363 OCRepPayloadDestroy(newArray[i]);
1370 bool OCRepPayloadGetPropObjectArray(const OCRepPayload* payload, const char* name,
1371 OCRepPayload*** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1373 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
1375 if (!val || val->type != OCREP_PROP_ARRAY || val->arr.type != OCREP_PROP_OBJECT
1376 || !val->arr.objArray)
1381 size_t dimTotal = calcDimTotal(val->arr.dimensions);
1386 *array = (OCRepPayload**)OICMalloc(dimTotal * sizeof(OCRepPayload*));
1392 memcpy(dimensions, val->arr.dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
1394 for(size_t i = 0; i < dimTotal; ++i)
1396 (*array)[i] = OCRepPayloadClone(val->arr.objArray[i]);
1402 void OCFreeOCStringLL(OCStringLL* ll)
1409 OCFreeOCStringLL(ll->next);
1414 OCStringLL* CloneOCStringLL (OCStringLL* ll)
1421 OCStringLL *sourceIter = ll;
1423 OCStringLL *destIter = (OCStringLL*)OICCalloc (1, sizeof (OCStringLL));
1428 destIter->value = OICStrdup (sourceIter->value);
1430 OCStringLL *headOfClone = destIter;
1432 sourceIter = sourceIter->next;
1436 destIter->next = (OCStringLL*)OICCalloc (1, sizeof (OCStringLL));
1437 if (!destIter->next)
1439 OCFreeOCStringLL (headOfClone);
1442 destIter->next->value = OICStrdup (sourceIter->value);
1444 destIter = destIter->next;
1445 sourceIter = sourceIter->next;
1450 OCStringLL* OCCreateOCStringLL(const char* text)
1455 char *backup = NULL;
1456 OCStringLL* result = NULL;
1457 OCStringLL* iter = NULL;
1458 OCStringLL* prev = NULL;
1459 static const char delim[] = { CSV_SEPARATOR, '\0' };
1461 VERIFY_PARAM_NON_NULL(TAG, text, "Invalid parameter");
1462 backup = OICStrdup(text);
1463 VERIFY_PARAM_NON_NULL(TAG, backup, "Failed allocating memory");
1465 for (head = backup; ; head = NULL)
1467 token = (char *) strtok_r(head, delim, &tail);
1472 iter = (OCStringLL *)OICCalloc(1,sizeof(OCStringLL));
1473 VERIFY_PARAM_NON_NULL(TAG, iter, "Failed allocating memory");
1482 iter->value = OICStrdup(token);
1483 VERIFY_PARAM_NON_NULL(TAG, iter->value, "Failed allocating memory");
1492 OCFreeOCStringLL(result);
1496 char* OCCreateString(const OCStringLL* ll)
1509 for (const OCStringLL *it = ll; it; it = it->next)
1511 len += strlen(it->value) + 1;
1513 len--; // remove trailing separator (just added above)
1514 str = (char*) OICMalloc(len + 1);
1521 const OCStringLL *it = ll;
1524 sublen = strlen(it->value);
1525 count = snprintf(pos, len + 1, "%s", it->value);
1526 if ((size_t)count < sublen)
1537 *pos = CSV_SEPARATOR;
1546 bool OCByteStringCopy(OCByteString* dest, const OCByteString* source)
1548 VERIFY_PARAM_NON_NULL(TAG, source, "Bad input");
1552 dest = (OCByteString *)OICMalloc(sizeof(OCByteString));
1553 VERIFY_PARAM_NON_NULL(TAG, dest, "Failed allocating memory");
1557 OICFree(dest->bytes);
1559 dest->bytes = (uint8_t*)OICMalloc(source->len * sizeof(uint8_t));
1560 VERIFY_PARAM_NON_NULL(TAG, dest->bytes, "Failed allocating memory");
1561 memcpy(dest->bytes, source->bytes, source->len * sizeof(uint8_t));
1562 dest->len = source->len;
1569 OICFree(dest->bytes);
1576 OCRepPayload* OCRepPayloadClone (const OCRepPayload* payload)
1583 OCRepPayload *clone = OCRepPayloadCreate();
1590 clone->uri = OICStrdup (payload->uri);
1591 clone->types = CloneOCStringLL (payload->types);
1592 clone->interfaces = CloneOCStringLL (payload->interfaces);
1593 clone->values = OCRepPayloadValueClone (payload->values);
1598 OCRepPayload* OCRepPayloadBatchClone(const OCRepPayload* repPayload)
1600 OCRepPayload *newPayload = OCRepPayloadCreate();
1606 newPayload->uri = OICStrdup(repPayload->uri);
1607 OCRepPayload *clone = OCRepPayloadCreate();
1610 OCPayloadDestroy((OCPayload *)newPayload);
1614 clone->types = CloneOCStringLL(repPayload->types);
1615 clone->interfaces = CloneOCStringLL(repPayload->interfaces);
1616 clone->values = OCRepPayloadValueClone(repPayload->values);
1617 OCRepPayloadSetPropObjectAsOwner(newPayload, OC_RSRVD_REPRESENTATION, clone);
1622 void OCRepPayloadDestroy(OCRepPayload* payload)
1629 OICFree(payload->uri);
1630 OCFreeOCStringLL(payload->types);
1631 OCFreeOCStringLL(payload->interfaces);
1632 OCFreeRepPayloadValue(payload->values);
1633 OCRepPayloadDestroy(payload->next);
1637 OCDiscoveryPayload* OCDiscoveryPayloadCreate()
1639 OCDiscoveryPayload* payload = (OCDiscoveryPayload*)OICCalloc(1, sizeof(OCDiscoveryPayload));
1646 payload->base.type = PAYLOAD_TYPE_DISCOVERY;
1651 OCSecurityPayload* OCSecurityPayloadCreate(const uint8_t* securityData, size_t size)
1653 OCSecurityPayload* payload = (OCSecurityPayload*)OICCalloc(1, sizeof(OCSecurityPayload));
1660 payload->base.type = PAYLOAD_TYPE_SECURITY;
1661 payload->securityData = (uint8_t *)OICCalloc(1, size);
1662 if (!payload->securityData)
1667 memcpy(payload->securityData, (uint8_t *)securityData, size);
1668 payload->payloadSize = size;
1673 void OCSecurityPayloadDestroy(OCSecurityPayload* payload)
1680 OICClearMemory(payload->securityData, payload->payloadSize);
1681 OICFree(payload->securityData);
1685 size_t OCDiscoveryPayloadGetResourceCount(OCDiscoveryPayload* payload)
1688 OCResourcePayload* p = payload->resources;
1697 OCResourcePayload* OCDiscoveryPayloadGetResource(OCDiscoveryPayload* payload, size_t index)
1700 OCResourcePayload* p = payload->resources;
1713 size_t OCEndpointPayloadGetEndpointCount(OCEndpointPayload* payload)
1716 OCEndpointPayload* ep = payload;
1725 OCEndpointPayload* OCEndpointPayloadGetEndpoint(OCEndpointPayload* payload, size_t index)
1728 OCEndpointPayload* ep = payload;
1741 void OCResourcePayloadAddNewEndpoint(OCResourcePayload* payload, OCEndpointPayload* endpoint)
1750 payload->eps = endpoint;
1754 OCEndpointPayload* ep = payload->eps;
1759 ep->next = endpoint;
1763 static OCResourcePayload* OCCopyResource(const OCResource* res, uint16_t securePort,
1764 bool isVirtual, CAEndpoint_t *networkInfo,
1765 size_t infoSize, const OCDevAddr *devAddr
1772 OCResourcePayload* pl = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
1778 pl->uri = OICStrdup(res->uri);
1782 OCDiscoveryResourceDestroy(pl);
1786 // relation is always the default unless the resource is the well known URI
1787 if (0 == strcmp(res->uri, OC_RSRVD_WELL_KNOWN_URI))
1789 pl->rel = OICStrdup("self");
1793 OCDiscoveryResourceDestroy(pl);
1799 OCResourceType* typePtr = res->rsrcType;
1801 if (typePtr != NULL)
1803 pl->types = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
1806 OCDiscoveryResourceDestroy(pl);
1809 pl->types->value = OICStrdup(typePtr->resourcetypename);
1810 if (!pl->types->value)
1812 OCDiscoveryResourceDestroy(pl);
1816 OCStringLL* cur = pl->types;
1817 typePtr = typePtr->next;
1820 cur->next = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
1823 OCDiscoveryResourceDestroy(pl);
1826 cur->next->value = OICStrdup(typePtr->resourcetypename);
1827 if (!cur->next->value)
1829 OCDiscoveryResourceDestroy(pl);
1833 typePtr = typePtr->next;
1838 OCResourceInterface* ifPtr = res->rsrcInterface;
1841 pl->interfaces = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
1842 if (!pl->interfaces)
1844 OCDiscoveryResourceDestroy(pl);
1847 pl->interfaces->value = OICStrdup(ifPtr->name);
1848 if (!pl->interfaces->value)
1850 OCDiscoveryResourceDestroy(pl);
1854 OCStringLL* cur = pl->interfaces;
1855 ifPtr = ifPtr->next;
1858 cur->next = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
1861 OCDiscoveryResourceDestroy(pl);
1864 cur->next->value = OICStrdup(ifPtr->name);
1865 if (!cur->next->value)
1867 OCDiscoveryResourceDestroy(pl);
1871 ifPtr = ifPtr->next;
1875 pl->bitmap = res->resourceProperties & (OC_OBSERVABLE | OC_DISCOVERABLE
1880 pl->secure = (res->resourceProperties & OC_SECURE) != 0;
1881 pl->port = securePort;
1883 pl->tcpPort = tcpPort;
1886 if (isVirtual || !networkInfo || infoSize == 0 || !devAddr)
1892 OCEndpointPayload *lastNode = pl->eps;
1893 if ((OC_ADAPTER_IP | OC_ADAPTER_TCP) & (devAddr->adapter))
1895 for (size_t i = 0; i < infoSize; i++)
1897 CAEndpoint_t *info = networkInfo + i;
1901 if (((CA_ADAPTER_IP | CA_ADAPTER_TCP) & info->adapter &&
1902 info->ifindex == devAddr->ifindex) ||
1903 info->adapter == CA_ADAPTER_RFCOMM_BTEDR)
1905 OCTpsSchemeFlags matchedTps = OC_NO_TPS;
1906 if (OC_STACK_OK != OCGetMatchedTpsFlags(info->adapter,
1913 if ((res->endpointType) & matchedTps)
1916 OCEndpointPayload* tmpNode = (OCEndpointPayload*)
1917 OICCalloc(1, sizeof(OCEndpointPayload));
1923 OCStackResult ret = OCConvertTpsToString(matchedTps, &(tmpNode->tps));
1924 if (ret != OC_STACK_OK)
1926 OCDiscoveryEndpointDestroy(tmpNode);
1927 OCDiscoveryResourceDestroy(pl);
1931 tmpNode->addr = (char*)OICCalloc(MAX_ADDR_STR_SIZE, sizeof(char));
1934 OCDiscoveryEndpointDestroy(tmpNode);
1935 OCDiscoveryResourceDestroy(pl);
1939 memcpy(tmpNode->addr, info->addr, sizeof(info->addr));
1940 tmpNode->family = (OCTransportFlags)(info->flags);
1941 tmpNode->port = info->port;
1943 tmpNode->next = NULL;
1953 lastNode->next = tmpNode;
1967 void OCDiscoveryPayloadAddResource(OCDiscoveryPayload* payload, const OCResource* res,
1968 uint16_t securePort)
1970 OCDiscoveryPayloadAddNewResource(payload, OCCopyResource(res, securePort, false, NULL, 0, NULL));
1973 void OCDiscoveryPayloadAddResource(OCDiscoveryPayload* payload, const OCResource* res,
1974 uint16_t securePort, uint16_t tcpPort)
1976 OCDiscoveryPayloadAddNewResource(payload, OCCopyResource(res, securePort, false, NULL, 0, NULL, tcpPort));
1981 void OCDiscoveryPayloadAddResourceWithEps(OCDiscoveryPayload* payload, const OCResource* res,
1982 uint16_t securePort, bool isVirtual,
1983 void *networkInfo, size_t infoSize,
1984 const OCDevAddr *devAddr)
1986 OCDiscoveryPayloadAddNewResource(payload,
1987 OCCopyResource(res, securePort, isVirtual,
1988 (CAEndpoint_t *)networkInfo,
1989 infoSize, devAddr));
1992 void OCDiscoveryPayloadAddResourceWithEps(OCDiscoveryPayload* payload, const OCResource* res,
1993 uint16_t securePort, bool isVirtual,
1994 void *networkInfo, size_t infoSize,
1995 const OCDevAddr *devAddr, uint16_t tcpPort)
1997 OCDiscoveryPayloadAddNewResource(payload,
1998 OCCopyResource(res, securePort, isVirtual,
1999 (CAEndpoint_t *)networkInfo,
2000 infoSize, devAddr, tcpPort));
2004 bool OCResourcePayloadAddStringLL(OCStringLL **stringLL, const char *value)
2007 VERIFY_PARAM_NON_NULL(TAG, value, "Invalid Parameters");
2008 dup = OICStrdup(value);
2009 VERIFY_PARAM_NON_NULL(TAG, dup, "Failed copying string");
2013 *stringLL = (OCStringLL *)OICCalloc(1, sizeof(OCStringLL));
2014 VERIFY_PARAM_NON_NULL(TAG, *stringLL, "Failed allocating memory");
2015 (*stringLL)->value = dup;
2020 OCStringLL *temp = *stringLL;
2025 temp->next = (OCStringLL *)OICCalloc(1, sizeof(OCStringLL));
2026 VERIFY_PARAM_NON_NULL(TAG, temp->next, "Failed allocating memory");
2027 temp->next->value = dup;
2035 void OCDiscoveryPayloadAddNewResource(OCDiscoveryPayload* payload, OCResourcePayload* res)
2042 if (!payload->resources)
2044 payload->resources = res;
2048 OCResourcePayload* p = payload->resources;
2057 void OCDiscoveryEndpointDestroy(OCEndpointPayload* payload)
2064 OICFree(payload->tps);
2065 OICFree(payload->addr);
2066 OCDiscoveryEndpointDestroy(payload->next);
2070 void OCDiscoveryResourceDestroy(OCResourcePayload* payload)
2077 OICFree(payload->uri);
2078 OICFree(payload->rel);
2079 OCFreeOCStringLL(payload->types);
2080 OCFreeOCStringLL(payload->interfaces);
2081 OCDiscoveryEndpointDestroy(payload->eps);
2082 OCDiscoveryResourceDestroy(payload->next);
2085 void OCDiscoveryPayloadDestroy(OCDiscoveryPayload* payload)
2091 OICFree(payload->sid);
2092 OICFree(payload->baseURI);
2093 OCFreeOCStringLL(payload->type);
2094 OICFree(payload->name);
2095 OCFreeOCStringLL(payload->iface);
2096 OCDiscoveryResourceDestroy(payload->resources);
2097 OCDiscoveryPayloadDestroy(payload->next);
2101 OCPresencePayload* OCPresencePayloadCreate(uint32_t seqNum, uint32_t maxAge,
2102 OCPresenceTrigger trigger, const char* resourceType)
2104 OCPresencePayload* payload = (OCPresencePayload*)OICCalloc(1, sizeof(OCPresencePayload));
2110 payload->base.type = PAYLOAD_TYPE_PRESENCE;
2111 payload->sequenceNumber = seqNum;
2112 payload->maxAge = maxAge;
2113 payload->trigger = trigger;
2114 payload->resourceType = OICStrdup(resourceType);
2118 void OCPresencePayloadDestroy(OCPresencePayload* payload)
2124 OICFree(payload->resourceType);