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 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
22 #include "ocpayload.h"
25 #include "oic_malloc.h"
26 #include "oic_string.h"
27 #include "ocstackinternal.h"
28 #include "ocresource.h"
31 #define TAG "OCPayload"
32 static void OCFreeRepPayloadValueContents(OCRepPayloadValue* val);
33 static void FreeOCDiscoveryResource(OCResourcePayload* payload);
35 void OCPayloadDestroy(OCPayload* payload)
44 case PAYLOAD_TYPE_REPRESENTATION:
45 OCRepPayloadDestroy((OCRepPayload*)payload);
47 case PAYLOAD_TYPE_DISCOVERY:
48 OCDiscoveryPayloadDestroy((OCDiscoveryPayload*)payload);
50 case PAYLOAD_TYPE_DEVICE:
51 OCDevicePayloadDestroy((OCDevicePayload*)payload);
53 case PAYLOAD_TYPE_PLATFORM:
54 OCPlatformPayloadDestroy((OCPlatformPayload*)payload);
56 case PAYLOAD_TYPE_PRESENCE:
57 OCPresencePayloadDestroy((OCPresencePayload*)payload);
59 case PAYLOAD_TYPE_SECURITY:
60 OCSecurityPayloadDestroy((OCSecurityPayload*)payload);
64 OCRDPayloadDestroy((OCRDPayload*)payload);
68 OC_LOG_V(ERROR, TAG, "Unsupported payload type in destroy: %d", payload->type);
73 OCRepPayload* OCRepPayloadCreate()
75 OCRepPayload* payload = (OCRepPayload*)OICCalloc(1, sizeof(OCRepPayload));
82 payload->base.type = PAYLOAD_TYPE_REPRESENTATION;
87 void OCRepPayloadAppend(OCRepPayload* parent, OCRepPayload* child)
96 parent = parent->next;
103 static OCRepPayloadValue* OCRepPayloadFindValue(const OCRepPayload* payload, const char* name)
105 if(!payload || !name)
110 OCRepPayloadValue* val = payload->values;
113 if(0 == strcmp(val->name, name))
124 static void OCCopyPropertyValueArray(OCRepPayloadValue* dest, OCRepPayloadValue* source)
131 size_t dimTotal = calcDimTotal(source->arr.dimensions);
132 switch(source->arr.type)
135 dest->arr.iArray = (int64_t*)OICMalloc(dimTotal * sizeof(int64_t));
136 memcpy(dest->arr.iArray, source->arr.iArray, dimTotal * sizeof(int64_t));
138 case OCREP_PROP_DOUBLE:
139 dest->arr.dArray = (double*)OICMalloc(dimTotal * sizeof(double));
140 memcpy(dest->arr.dArray, source->arr.dArray, dimTotal * sizeof(double));
142 case OCREP_PROP_BOOL:
143 dest->arr.bArray = (bool*)OICMalloc(dimTotal * sizeof(bool));
144 memcpy(dest->arr.bArray, source->arr.bArray, dimTotal * sizeof(bool));
146 case OCREP_PROP_STRING:
147 dest->arr.strArray = (char**)OICMalloc(dimTotal * sizeof(char*));
148 for(size_t i = 0; i < dimTotal; ++i)
150 dest->arr.strArray[i] = OICStrdup(source->arr.strArray[i]);
153 case OCREP_PROP_ARRAY:
154 dest->arr.objArray = (OCRepPayload**)OICMalloc(dimTotal * sizeof(OCRepPayload*));
155 for(size_t i = 0; i < dimTotal; ++i)
157 dest->arr.objArray[i] = OCRepPayloadClone(source->arr.objArray[i]);
161 OC_LOG(ERROR, TAG, "CopyPropertyValueArray invalid type");
166 static void OCCopyPropertyValue (OCRepPayloadValue *dest, OCRepPayloadValue *source)
168 if (!source || !dest)
175 case OCREP_PROP_STRING:
176 dest->str = OICStrdup(source->str);
178 case OCREP_PROP_OBJECT:
179 dest->obj = OCRepPayloadClone(source->obj);
181 case OCREP_PROP_ARRAY:
182 OCCopyPropertyValueArray(dest, source);
185 // Nothing to do for the trivially copyable types.
190 static void OCFreeRepPayloadValueContents(OCRepPayloadValue* val)
197 if(val->type == OCREP_PROP_STRING)
201 else if (val->type == OCREP_PROP_OBJECT)
203 OCRepPayloadDestroy(val->obj);
205 else if (val->type == OCREP_PROP_ARRAY)
207 size_t dimTotal = calcDimTotal(val->arr.dimensions);
208 switch(val->arr.type)
211 case OCREP_PROP_DOUBLE:
212 case OCREP_PROP_BOOL:
213 // Since this is a union, iArray will
214 // point to all of the above
215 OICFree(val->arr.iArray);
217 case OCREP_PROP_STRING:
218 for(size_t i = 0; i< dimTotal;++i)
220 OICFree(val->arr.strArray[i]);
222 OICFree(val->arr.strArray);
224 case OCREP_PROP_OBJECT:
225 for(size_t i = 0; i< dimTotal;++i)
227 OCRepPayloadDestroy(val->arr.objArray[i]);
229 OICFree(val->arr.objArray);
231 case OCREP_PROP_NULL:
232 case OCREP_PROP_ARRAY:
233 OC_LOG_V(ERROR, TAG, "FreeRepPayloadValueContents: Illegal type\
234 inside an array: %d", val->arr.type);
240 static void OCFreeRepPayloadValue(OCRepPayloadValue* val)
248 OCFreeRepPayloadValueContents(val);
249 OCFreeRepPayloadValue(val->next);
252 static OCRepPayloadValue* OCRepPayloadValueClone (OCRepPayloadValue* source)
259 OCRepPayloadValue *sourceIter = source;
260 OCRepPayloadValue *destIter = (OCRepPayloadValue*) OICCalloc(1, sizeof(OCRepPayloadValue));
266 OCRepPayloadValue *headOfClone = destIter;
268 // Copy payload type and non pointer types in union.
269 *destIter = *sourceIter;
270 destIter->name = OICStrdup (sourceIter->name);
271 OCCopyPropertyValue (destIter, sourceIter);
273 sourceIter = sourceIter->next;
277 destIter->next = (OCRepPayloadValue*) OICCalloc(1, sizeof(OCRepPayloadValue));
280 OCFreeRepPayloadValue (headOfClone);
284 *(destIter->next) = *sourceIter;
285 destIter->next->name = OICStrdup (sourceIter->name);
286 OCCopyPropertyValue (destIter->next, sourceIter);
288 sourceIter = sourceIter->next;
289 destIter = destIter->next;
294 static OCRepPayloadValue* OCRepPayloadFindAndSetValue(OCRepPayload* payload, const char* name,
295 OCRepPayloadPropType type)
297 if(!payload || !name)
302 OCRepPayloadValue* val = payload->values;
305 payload->values = (OCRepPayloadValue*)OICCalloc(1, sizeof(OCRepPayloadValue));
310 payload->values->name = OICStrdup(name);
311 if(!payload->values->name)
313 OICFree(payload->values);
314 payload->values = NULL;
317 payload->values->type =type;
318 return payload->values;
323 if(0 == strcmp(val->name, name))
325 OCFreeRepPayloadValueContents(val);
329 else if(val->next == NULL)
331 val->next = (OCRepPayloadValue*)OICCalloc(1, sizeof(OCRepPayloadValue));
336 val->next->name = OICStrdup(name);
343 val->next->type =type;
350 OC_LOG(ERROR, TAG, "FindAndSetValue reached point after while loop, pointer corruption?");
354 bool OCRepPayloadAddResourceType(OCRepPayload* payload, const char* resourceType)
356 return OCRepPayloadAddResourceTypeAsOwner(payload, OICStrdup(resourceType));
359 bool OCRepPayloadAddResourceTypeAsOwner(OCRepPayload* payload, char* resourceType)
361 if(!payload || !resourceType)
368 OCStringLL* cur = payload->types;
373 cur->next = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
380 cur->next->value = resourceType;
385 payload->types = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
390 payload->types->value = resourceType;
395 bool OCRepPayloadAddInterface(OCRepPayload* payload, const char* interface)
397 return OCRepPayloadAddInterfaceAsOwner(payload, OICStrdup(interface));
400 bool OCRepPayloadAddInterfaceAsOwner(OCRepPayload* payload, char* interface)
402 if(!payload || !interface)
407 if(payload->interfaces)
409 OCStringLL* cur = payload->interfaces;
414 cur->next = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
420 cur->next->value = interface;
425 payload->interfaces = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
426 if(!payload->interfaces)
430 payload->interfaces->value = interface;
435 bool OCRepPayloadSetUri(OCRepPayload* payload, const char* uri)
442 payload->uri = OICStrdup(uri);
443 return payload->uri != NULL;
446 bool OCRepPayloadIsNull(const OCRepPayload* payload, const char* name)
448 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
455 return val->type == OCREP_PROP_NULL;
458 static bool OCRepPayloadSetProp(OCRepPayload* payload, const char* name,
459 void* value, OCRepPayloadPropType type)
461 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, type);
469 val->i = *(int64_t*)value;
471 case OCREP_PROP_DOUBLE:
472 val->d = *(double*)value;
474 case OCREP_PROP_BOOL:
475 val->b = *(bool*)value;
477 case OCREP_PROP_OBJECT:
478 val->obj = (OCRepPayload*)value;
480 case OCREP_PROP_STRING:
481 val->str = (char*)value;
482 return val->str != NULL;
483 case OCREP_PROP_NULL:
485 case OCREP_PROP_ARRAY:
493 bool OCRepPayloadSetNull(OCRepPayload* payload, const char* name)
495 return OCRepPayloadSetProp(payload, name, NULL, OCREP_PROP_NULL);
498 bool OCRepPayloadSetPropInt(OCRepPayload* payload,
499 const char* name, int64_t value)
501 return OCRepPayloadSetProp(payload, name, &value, OCREP_PROP_INT);
504 bool OCRepPayloadGetPropInt(const OCRepPayload* payload, const char* name, int64_t* value)
506 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
508 if(!val || val->type != OCREP_PROP_INT)
517 bool OCRepPayloadSetPropDouble(OCRepPayload* payload,
518 const char* name, double value)
520 return OCRepPayloadSetProp(payload, name, &value, OCREP_PROP_DOUBLE);
523 bool OCRepPayloadGetPropDouble(const OCRepPayload* payload, const char* name, double* value)
525 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
527 if(!val || val->type != OCREP_PROP_DOUBLE)
536 bool OCRepPayloadSetPropString(OCRepPayload* payload, const char* name, const char* value)
538 char* temp = OICStrdup(value);
539 bool b = OCRepPayloadSetPropStringAsOwner(payload, name, temp);
548 bool OCRepPayloadSetPropStringAsOwner(OCRepPayload* payload, const char* name, char* value)
550 return OCRepPayloadSetProp(payload, name, value, OCREP_PROP_STRING);
553 bool OCRepPayloadGetPropString(const OCRepPayload* payload, const char* name, char** value)
555 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
557 if(!val || val->type != OCREP_PROP_STRING)
562 *value = OICStrdup(val->str);
563 return *value != NULL;
566 bool OCRepPayloadSetPropBool(OCRepPayload* payload,
567 const char* name, bool value)
569 return OCRepPayloadSetProp(payload, name, &value, OCREP_PROP_BOOL);
572 bool OCRepPayloadGetPropBool(const OCRepPayload* payload, const char* name, bool* value)
574 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
576 if(!val || val->type != OCREP_PROP_BOOL)
585 bool OCRepPayloadSetPropObject(OCRepPayload* payload, const char* name, const OCRepPayload* value)
587 OCRepPayload* temp = OCRepPayloadClone(value);
588 bool b = OCRepPayloadSetPropObjectAsOwner(payload, name, temp);
592 OCRepPayloadDestroy(temp);
597 bool OCRepPayloadSetPropObjectAsOwner(OCRepPayload* payload, const char* name, OCRepPayload* value)
599 return OCRepPayloadSetProp(payload, name, value, OCREP_PROP_OBJECT);
602 bool OCRepPayloadGetPropObject(const OCRepPayload* payload, const char* name, OCRepPayload** value)
604 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
606 if(!val || val->type != OCREP_PROP_OBJECT)
611 *value = OCRepPayloadClone(val->obj);
612 return *value != NULL;
615 size_t calcDimTotal(const size_t dimensions[MAX_REP_ARRAY_DEPTH])
617 if(dimensions[0] == 0)
623 for(uint8_t i = 0; i < MAX_REP_ARRAY_DEPTH && dimensions[i] != 0; ++i)
625 total *= dimensions[i];
630 bool OCRepPayloadSetIntArrayAsOwner(OCRepPayload* payload, const char* name,
631 int64_t* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
633 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, OCREP_PROP_ARRAY);
640 val->arr.type = OCREP_PROP_INT;
641 memcpy(val->arr.dimensions, dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
642 val->arr.iArray = array;
647 bool OCRepPayloadSetIntArray(OCRepPayload* payload, const char* name,
648 const int64_t* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
650 size_t dimTotal = calcDimTotal(dimensions);
656 int64_t* newArray = (int64_t*)OICMalloc(dimTotal * sizeof(int64_t));
663 memcpy(newArray, array, dimTotal * sizeof(int64_t));
666 bool b = OCRepPayloadSetIntArrayAsOwner(payload, name, newArray, dimensions);
674 bool OCRepPayloadGetIntArray(const OCRepPayload* payload, const char* name,
675 int64_t** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
677 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
679 if(!val || val->type != OCREP_PROP_ARRAY || val->arr.type != OCREP_PROP_INT
685 size_t dimTotal = calcDimTotal(val->arr.dimensions);
690 *array = (int64_t*)OICMalloc(dimTotal * sizeof(int64_t));
696 memcpy(*array, val->arr.iArray, dimTotal * sizeof(int64_t));
697 memcpy(dimensions, val->arr.dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
701 bool OCRepPayloadSetDoubleArrayAsOwner(OCRepPayload* payload, const char* name,
702 double* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
704 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, OCREP_PROP_ARRAY);
711 val->arr.type = OCREP_PROP_DOUBLE;
712 memcpy(val->arr.dimensions, dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
713 val->arr.dArray = array;
717 bool OCRepPayloadSetDoubleArray(OCRepPayload* payload, const char* name,
718 const double* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
720 size_t dimTotal = calcDimTotal(dimensions);
726 double* newArray = (double*)OICMalloc(dimTotal * sizeof(double));
733 memcpy(newArray, array, dimTotal * sizeof(double));
735 bool b = OCRepPayloadSetDoubleArrayAsOwner(payload, name, newArray, dimensions);
743 bool OCRepPayloadGetDoubleArray(const OCRepPayload* payload, const char* name,
744 double** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
746 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
748 if(!val || val->type != OCREP_PROP_ARRAY || val->arr.type != OCREP_PROP_DOUBLE
754 size_t dimTotal = calcDimTotal(val->arr.dimensions);
759 *array = (double*)OICMalloc(dimTotal * sizeof(double));
765 memcpy(*array, val->arr.dArray, dimTotal * sizeof(double));
766 memcpy(dimensions, val->arr.dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
770 bool OCRepPayloadSetStringArrayAsOwner(OCRepPayload* payload, const char* name,
771 char** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
773 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, OCREP_PROP_ARRAY);
780 val->arr.type = OCREP_PROP_STRING;
781 memcpy(val->arr.dimensions, dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
782 val->arr.strArray = array;
786 bool OCRepPayloadSetStringArray(OCRepPayload* payload, const char* name,
787 const char** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
789 size_t dimTotal = calcDimTotal(dimensions);
795 char** newArray = (char**)OICMalloc(dimTotal * sizeof(char*));
802 for(size_t i = 0; i < dimTotal; ++i)
804 newArray[i] = OICStrdup(array[i]);
807 bool b = OCRepPayloadSetStringArrayAsOwner(payload, name, newArray, dimensions);
811 for(size_t i = 0; i < dimTotal; ++i)
813 OICFree(newArray[i]);
820 bool OCRepPayloadGetStringArray(const OCRepPayload* payload, const char* name,
821 char*** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
823 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
825 if(!val || val->type != OCREP_PROP_ARRAY || val->arr.type != OCREP_PROP_STRING
826 || !val->arr.strArray)
831 size_t dimTotal = calcDimTotal(val->arr.dimensions);
836 *array = (char**)OICMalloc(dimTotal * sizeof(char*));
842 memcpy(dimensions, val->arr.dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
844 for(size_t i = 0; i < dimTotal; ++i)
846 (*array)[i] = OICStrdup(val->arr.strArray[i]);
853 bool OCRepPayloadSetBoolArrayAsOwner(OCRepPayload* payload, const char* name,
854 bool* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
857 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, OCREP_PROP_ARRAY);
864 val->arr.type = OCREP_PROP_BOOL;
865 memcpy(val->arr.dimensions, dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
866 val->arr.bArray = array;
870 bool OCRepPayloadSetBoolArray(OCRepPayload* payload, const char* name,
871 const bool* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
873 size_t dimTotal = calcDimTotal(dimensions);
879 bool* newArray = (bool*)OICMalloc(dimTotal * sizeof(bool));
886 memcpy(newArray, array, dimTotal * sizeof(bool));
889 bool b = OCRepPayloadSetBoolArrayAsOwner(payload, name, newArray, dimensions);
897 bool OCRepPayloadGetBoolArray(const OCRepPayload* payload, const char* name,
898 bool** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
900 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
902 if(!val || val->type != OCREP_PROP_ARRAY || val->arr.type != OCREP_PROP_BOOL
908 size_t dimTotal = calcDimTotal(val->arr.dimensions);
913 *array = (bool*)OICMalloc(dimTotal * sizeof(bool));
919 memcpy(*array, val->arr.bArray, dimTotal * sizeof(bool));
920 memcpy(dimensions, val->arr.dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
924 bool OCRepPayloadSetPropObjectArrayAsOwner(OCRepPayload* payload, const char* name,
925 OCRepPayload** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
927 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, OCREP_PROP_ARRAY);
934 val->arr.type = OCREP_PROP_OBJECT;
935 memcpy(val->arr.dimensions, dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
936 val->arr.objArray = array;
941 bool OCRepPayloadSetPropObjectArray(OCRepPayload* payload, const char* name,
942 const OCRepPayload** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
944 size_t dimTotal = calcDimTotal(dimensions);
950 OCRepPayload** newArray = (OCRepPayload**)OICMalloc(dimTotal * sizeof(OCRepPayload*));
957 for(size_t i = 0; i < dimTotal; ++i)
959 newArray[i] = OCRepPayloadClone(array[i]);
962 bool b = OCRepPayloadSetPropObjectArrayAsOwner(payload, name, newArray, dimensions);
966 for(size_t i = 0; i < dimTotal; ++i)
968 OCRepPayloadDestroy(newArray[i]);
975 bool OCRepPayloadGetPropObjectArray(const OCRepPayload* payload, const char* name,
976 OCRepPayload*** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
978 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
980 if(!val || val->type != OCREP_PROP_ARRAY || val->arr.type != OCREP_PROP_OBJECT
981 || !val->arr.objArray)
986 size_t dimTotal = calcDimTotal(val->arr.dimensions);
991 *array = (OCRepPayload**)OICMalloc(dimTotal * sizeof(OCRepPayload*));
997 memcpy(dimensions, val->arr.dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
999 for(size_t i = 0; i < dimTotal; ++i)
1001 (*array)[i] = OCRepPayloadClone(val->arr.objArray[i]);
1007 void OCFreeOCStringLL(OCStringLL* ll)
1014 OCFreeOCStringLL(ll->next);
1019 OCStringLL* CloneOCStringLL (OCStringLL* ll)
1026 OCStringLL *sourceIter = ll;
1028 OCStringLL *destIter = (OCStringLL*)OICCalloc (1, sizeof (OCStringLL));
1033 destIter->value = OICStrdup (sourceIter->value);
1035 OCStringLL *headOfClone = destIter;
1037 sourceIter = sourceIter->next;
1041 destIter->next = (OCStringLL*)OICCalloc (1, sizeof (OCStringLL));
1042 if (!destIter->next)
1044 OCFreeOCStringLL (headOfClone);
1047 destIter->next->value = OICStrdup (sourceIter->value);
1049 destIter = destIter->next;
1050 sourceIter = sourceIter->next;
1055 OCRepPayload* OCRepPayloadClone (const OCRepPayload* payload)
1062 OCRepPayload *clone = OCRepPayloadCreate();
1069 clone->uri = OICStrdup (payload->uri);
1070 clone->types = CloneOCStringLL (payload->types);
1071 clone->interfaces = CloneOCStringLL (payload->interfaces);
1072 clone->values = OCRepPayloadValueClone (payload->values);
1078 void OCRepPayloadDestroy(OCRepPayload* payload)
1085 OICFree(payload->uri);
1086 OCFreeOCStringLL(payload->types);
1087 OCFreeOCStringLL(payload->interfaces);
1088 OCFreeRepPayloadValue(payload->values);
1089 OCRepPayloadDestroy(payload->next);
1093 OCDiscoveryPayload* OCDiscoveryPayloadCreate()
1095 OCDiscoveryPayload* payload = (OCDiscoveryPayload*)OICCalloc(1, sizeof(OCDiscoveryPayload));
1102 payload->base.type = PAYLOAD_TYPE_DISCOVERY;
1107 OCSecurityPayload* OCSecurityPayloadCreate(const char* securityData)
1109 OCSecurityPayload* payload = (OCSecurityPayload*)OICCalloc(1, sizeof(OCSecurityPayload));
1116 payload->base.type = PAYLOAD_TYPE_SECURITY;
1117 payload->securityData = OICStrdup(securityData);
1122 void OCSecurityPayloadDestroy(OCSecurityPayload* payload)
1129 OICFree(payload->securityData);
1133 size_t OCDiscoveryPayloadGetResourceCount(OCDiscoveryPayload* payload)
1136 OCResourcePayload* p = payload->resources;
1145 OCResourcePayload* OCDiscoveryPayloadGetResource(OCDiscoveryPayload* payload, size_t index)
1148 OCResourcePayload* p = payload->resources;
1161 static OCResourcePayload* OCCopyResource(const OCResource* res, uint16_t port)
1163 OCResourcePayload* pl = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
1169 pl->uri = OICStrdup(res->uri);
1170 pl->sid = (uint8_t*)OICCalloc(1, UUID_SIZE);
1171 if(!pl->uri || ! pl->sid)
1173 FreeOCDiscoveryResource(pl);
1176 memcpy(pl->sid, OCGetServerInstanceID(), UUID_SIZE);
1179 OCResourceType* typePtr = res->rsrcType;
1183 pl->types = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
1186 FreeOCDiscoveryResource(pl);
1189 pl->types->value = OICStrdup(typePtr->resourcetypename);
1190 if(!pl->types->value)
1192 FreeOCDiscoveryResource(pl);
1196 OCStringLL* cur = pl->types;
1197 typePtr = typePtr->next;
1200 cur->next = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
1203 FreeOCDiscoveryResource(pl);
1206 cur->next->value = OICStrdup(typePtr->resourcetypename);
1207 if(!cur->next->value)
1209 FreeOCDiscoveryResource(pl);
1213 typePtr = typePtr->next;
1218 OCResourceInterface* ifPtr = res->rsrcInterface;
1221 pl->interfaces = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
1224 FreeOCDiscoveryResource(pl);
1227 pl->interfaces->value = OICStrdup(ifPtr->name);
1228 if(!pl->interfaces->value)
1230 FreeOCDiscoveryResource(pl);
1234 OCStringLL* cur = pl->interfaces;
1235 ifPtr = ifPtr->next;
1238 cur->next = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
1241 FreeOCDiscoveryResource(pl);
1244 cur->next->value = OICStrdup(ifPtr->name);
1245 if(!cur->next->value)
1247 FreeOCDiscoveryResource(pl);
1251 ifPtr = ifPtr->next;
1255 pl->bitmap = res->resourceProperties & (OC_OBSERVABLE | OC_DISCOVERABLE);
1256 pl->secure = (res->resourceProperties & OC_SECURE) != 0;
1262 void OCDiscoveryPayloadAddResource(OCDiscoveryPayload* payload, const OCResource* res,
1265 OCDiscoveryPayloadAddNewResource(payload, OCCopyResource(res, port));
1268 void OCDiscoveryPayloadAddNewResource(OCDiscoveryPayload* payload, OCResourcePayload* res)
1270 if(!payload->resources)
1272 payload->resources = res;
1276 OCResourcePayload* p = payload->resources;
1285 static void FreeOCDiscoveryResource(OCResourcePayload* payload)
1292 OICFree(payload->uri);
1293 OICFree(payload->sid);
1294 OCFreeOCStringLL(payload->types);
1295 OCFreeOCStringLL(payload->interfaces);
1296 FreeOCDiscoveryResource(payload->next);
1300 void OCDiscoveryPayloadDestroy(OCDiscoveryPayload* payload)
1307 FreeOCDiscoveryResource(payload->resources);
1311 OCDevicePayload* OCDevicePayloadCreate(const char* uri, const uint8_t* sid, const char* dname,
1312 const char* specVer, const char* dmVer)
1315 OCDevicePayload* payload = (OCDevicePayload*)OICCalloc(1, sizeof(OCDevicePayload));
1322 payload->base.type = PAYLOAD_TYPE_DEVICE;
1324 payload->uri = OICStrdup(uri);
1325 if(uri && !payload->uri)
1332 payload->sid = (uint8_t*)OICMalloc(UUID_SIZE);
1337 memcpy(payload->sid, sid, UUID_SIZE);
1340 payload->deviceName = OICStrdup(dname);
1341 if(dname && !payload->deviceName)
1346 payload->specVersion = OICStrdup(specVer);
1347 if(specVer && !payload->specVersion)
1352 payload->dataModelVersion = OICStrdup(dmVer);
1353 if(dmVer && !payload->dataModelVersion)
1361 OCDevicePayloadDestroy((OCDevicePayload*)payload);
1365 void OCDevicePayloadDestroy(OCDevicePayload* payload)
1372 OICFree(payload->uri);
1373 OICFree(payload->sid);
1374 OICFree(payload->deviceName);
1375 OICFree(payload->specVersion);
1376 OICFree(payload->dataModelVersion);
1380 static void OCCopyPlatformInfo(const OCPlatformInfo* platformInfo, OCPlatformPayload* target)
1382 if(!platformInfo || !target)
1387 target->info.platformID = OICStrdup(platformInfo->platformID);
1388 target->info.manufacturerName = OICStrdup(platformInfo->manufacturerName);
1389 target->info.manufacturerUrl = OICStrdup(platformInfo->manufacturerUrl);
1390 target->info.modelNumber = OICStrdup(platformInfo->modelNumber);
1391 target->info.dateOfManufacture = OICStrdup(platformInfo->dateOfManufacture);
1392 target->info.platformVersion = OICStrdup(platformInfo->platformVersion);
1393 target->info.operatingSystemVersion = OICStrdup(platformInfo->operatingSystemVersion);
1394 target->info.hardwareVersion = OICStrdup(platformInfo->hardwareVersion);
1395 target->info.firmwareVersion = OICStrdup(platformInfo->firmwareVersion);
1396 target->info.supportUrl = OICStrdup(platformInfo->supportUrl);
1397 target->info.systemTime = OICStrdup(platformInfo->systemTime);
1400 OCPlatformPayload* OCPlatformPayloadCreateAsOwner(char* uri, OCPlatformInfo* platformInfo)
1402 OCPlatformPayload* payload = (OCPlatformPayload*)OICCalloc(1, sizeof(OCPlatformPayload));
1408 payload->base.type = PAYLOAD_TYPE_PLATFORM;
1410 payload->info = *platformInfo;
1415 OCPlatformPayload* OCPlatformPayloadCreate(const char* uri, const OCPlatformInfo* platformInfo)
1417 OCPlatformPayload* payload = (OCPlatformPayload*)OICCalloc(1, sizeof(OCPlatformPayload));
1424 payload->base.type = PAYLOAD_TYPE_PLATFORM;
1425 payload->uri = OICStrdup(uri);
1426 OCCopyPlatformInfo(platformInfo, payload);
1431 void OCPlatformPayloadDestroy(OCPlatformPayload* payload)
1437 OICFree(payload->uri);
1438 OICFree(payload->info.platformID);
1439 OICFree(payload->info.manufacturerName);
1440 OICFree(payload->info.manufacturerUrl);
1441 OICFree(payload->info.modelNumber);
1442 OICFree(payload->info.dateOfManufacture);
1443 OICFree(payload->info.platformVersion);
1444 OICFree(payload->info.operatingSystemVersion);
1445 OICFree(payload->info.hardwareVersion);
1446 OICFree(payload->info.firmwareVersion);
1447 OICFree(payload->info.supportUrl);
1448 OICFree(payload->info.systemTime);
1452 OCPresencePayload* OCPresencePayloadCreate(uint32_t seqNum, uint32_t maxAge,
1453 OCPresenceTrigger trigger, const char* resourceType)
1455 OCPresencePayload* payload = (OCPresencePayload*)OICCalloc(1, sizeof(OCPresencePayload));
1461 payload->base.type = PAYLOAD_TYPE_PRESENCE;
1462 payload->sequenceNumber = seqNum;
1463 payload->maxAge = maxAge;
1464 payload->trigger = trigger;
1465 payload->resourceType = OICStrdup(resourceType);
1469 void OCPresencePayloadDestroy(OCPresencePayload* payload)
1475 OICFree(payload->resourceType);