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);
63 OC_LOG_V(ERROR, TAG, "Unsupported payload type in destroy: %d", payload->type);
68 OCRepPayload* OCRepPayloadCreate()
70 OCRepPayload* payload = (OCRepPayload*)OICCalloc(1, sizeof(OCRepPayload));
77 payload->base.type = PAYLOAD_TYPE_REPRESENTATION;
82 void OCRepPayloadAppend(OCRepPayload* parent, OCRepPayload* child)
91 parent = parent->next;
98 static OCRepPayloadValue* OCRepPayloadFindValue(const OCRepPayload* payload, const char* name)
100 if(!payload || !name)
105 OCRepPayloadValue* val = payload->values;
108 if(0 == strcmp(val->name, name))
119 static void OCCopyPropertyValueArray(OCRepPayloadValue* dest, OCRepPayloadValue* source)
126 size_t dimTotal = calcDimTotal(source->arr.dimensions);
127 switch(source->arr.type)
130 dest->arr.iArray = (int64_t*)OICMalloc(dimTotal * sizeof(int64_t));
131 memcpy(dest->arr.iArray, source->arr.iArray, dimTotal * sizeof(int64_t));
133 case OCREP_PROP_DOUBLE:
134 dest->arr.dArray = (double*)OICMalloc(dimTotal * sizeof(double));
135 memcpy(dest->arr.dArray, source->arr.dArray, dimTotal * sizeof(double));
137 case OCREP_PROP_BOOL:
138 dest->arr.bArray = (bool*)OICMalloc(dimTotal * sizeof(bool));
139 memcpy(dest->arr.bArray, source->arr.bArray, dimTotal * sizeof(bool));
141 case OCREP_PROP_STRING:
142 dest->arr.strArray = (char**)OICMalloc(dimTotal * sizeof(char*));
143 for(size_t i = 0; i < dimTotal; ++i)
145 dest->arr.strArray[i] = OICStrdup(source->arr.strArray[i]);
148 case OCREP_PROP_ARRAY:
149 dest->arr.objArray = (OCRepPayload**)OICMalloc(dimTotal * sizeof(OCRepPayload*));
150 for(size_t i = 0; i < dimTotal; ++i)
152 dest->arr.objArray[i] = OCRepPayloadClone(source->arr.objArray[i]);
156 OC_LOG(ERROR, TAG, "CopyPropertyValueArray invalid type");
161 static void OCCopyPropertyValue (OCRepPayloadValue *dest, OCRepPayloadValue *source)
163 if (!source || !dest)
170 case OCREP_PROP_STRING:
171 dest->str = OICStrdup(source->str);
173 case OCREP_PROP_OBJECT:
174 dest->obj = OCRepPayloadClone(source->obj);
176 case OCREP_PROP_ARRAY:
177 OCCopyPropertyValueArray(dest, source);
180 // Nothing to do for the trivially copyable types.
185 static void OCFreeRepPayloadValueContents(OCRepPayloadValue* val)
192 if(val->type == OCREP_PROP_STRING)
196 else if (val->type == OCREP_PROP_OBJECT)
198 OCRepPayloadDestroy(val->obj);
200 else if (val->type == OCREP_PROP_ARRAY)
202 size_t dimTotal = calcDimTotal(val->arr.dimensions);
203 switch(val->arr.type)
206 case OCREP_PROP_DOUBLE:
207 case OCREP_PROP_BOOL:
208 // Since this is a union, iArray will
209 // point to all of the above
210 OICFree(val->arr.iArray);
212 case OCREP_PROP_STRING:
213 for(size_t i = 0; i< dimTotal;++i)
215 OICFree(val->arr.strArray[i]);
217 OICFree(val->arr.strArray);
219 case OCREP_PROP_OBJECT:
220 for(size_t i = 0; i< dimTotal;++i)
222 OCRepPayloadDestroy(val->arr.objArray[i]);
224 OICFree(val->arr.objArray);
226 case OCREP_PROP_NULL:
227 case OCREP_PROP_ARRAY:
228 OC_LOG_V(ERROR, TAG, "FreeRepPayloadValueContents: Illegal type\
229 inside an array: %d", val->arr.type);
235 static void OCFreeRepPayloadValue(OCRepPayloadValue* val)
243 OCFreeRepPayloadValueContents(val);
244 OCFreeRepPayloadValue(val->next);
247 static OCRepPayloadValue* OCRepPayloadValueClone (OCRepPayloadValue* source)
254 OCRepPayloadValue *sourceIter = source;
255 OCRepPayloadValue *destIter = (OCRepPayloadValue*) OICCalloc(1, sizeof(OCRepPayloadValue));
261 OCRepPayloadValue *headOfClone = destIter;
263 // Copy payload type and non pointer types in union.
264 *destIter = *sourceIter;
265 destIter->name = OICStrdup (sourceIter->name);
266 OCCopyPropertyValue (destIter, sourceIter);
268 sourceIter = sourceIter->next;
272 destIter->next = (OCRepPayloadValue*) OICCalloc(1, sizeof(OCRepPayloadValue));
275 OCFreeRepPayloadValue (headOfClone);
279 *(destIter->next) = *sourceIter;
280 destIter->next->name = OICStrdup (sourceIter->name);
281 OCCopyPropertyValue (destIter->next, sourceIter);
283 sourceIter = sourceIter->next;
284 destIter = destIter->next;
289 static OCRepPayloadValue* OCRepPayloadFindAndSetValue(OCRepPayload* payload, const char* name,
290 OCRepPayloadPropType type)
292 if(!payload || !name)
297 OCRepPayloadValue* val = payload->values;
300 payload->values = (OCRepPayloadValue*)OICCalloc(1, sizeof(OCRepPayloadValue));
305 payload->values->name = OICStrdup(name);
306 if(!payload->values->name)
308 OICFree(payload->values);
309 payload->values = NULL;
312 payload->values->type =type;
313 return payload->values;
318 if(0 == strcmp(val->name, name))
320 OCFreeRepPayloadValueContents(val);
324 else if(val->next == NULL)
326 val->next = (OCRepPayloadValue*)OICCalloc(1, sizeof(OCRepPayloadValue));
331 val->next->name = OICStrdup(name);
338 val->next->type =type;
345 OC_LOG(ERROR, TAG, "FindAndSetValue reached point after while loop, pointer corruption?");
349 bool OCRepPayloadAddResourceType(OCRepPayload* payload, const char* resourceType)
351 return OCRepPayloadAddResourceTypeAsOwner(payload, OICStrdup(resourceType));
354 bool OCRepPayloadAddResourceTypeAsOwner(OCRepPayload* payload, char* resourceType)
356 if(!payload || !resourceType)
363 OCStringLL* cur = payload->types;
368 cur->next = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
375 cur->next->value = resourceType;
380 payload->types = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
385 payload->types->value = resourceType;
390 bool OCRepPayloadAddInterface(OCRepPayload* payload, const char* interface)
392 return OCRepPayloadAddInterfaceAsOwner(payload, OICStrdup(interface));
395 bool OCRepPayloadAddInterfaceAsOwner(OCRepPayload* payload, char* interface)
397 if(!payload || !interface)
402 if(payload->interfaces)
404 OCStringLL* cur = payload->interfaces;
409 cur->next = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
415 cur->next->value = interface;
420 payload->interfaces = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
421 if(!payload->interfaces)
425 payload->interfaces->value = interface;
430 bool OCRepPayloadSetUri(OCRepPayload* payload, const char* uri)
437 payload->uri = OICStrdup(uri);
438 return payload->uri != NULL;
441 bool OCRepPayloadIsNull(const OCRepPayload* payload, const char* name)
443 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
450 return val->type == OCREP_PROP_NULL;
453 static bool OCRepPayloadSetProp(OCRepPayload* payload, const char* name,
454 void* value, OCRepPayloadPropType type)
456 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, type);
464 val->i = *(int64_t*)value;
466 case OCREP_PROP_DOUBLE:
467 val->d = *(double*)value;
469 case OCREP_PROP_BOOL:
470 val->b = *(bool*)value;
472 case OCREP_PROP_OBJECT:
473 val->obj = (OCRepPayload*)value;
475 case OCREP_PROP_STRING:
476 val->str = (char*)value;
477 return val->str != NULL;
478 case OCREP_PROP_NULL:
480 case OCREP_PROP_ARRAY:
488 bool OCRepPayloadSetNull(OCRepPayload* payload, const char* name)
490 return OCRepPayloadSetProp(payload, name, NULL, OCREP_PROP_NULL);
493 bool OCRepPayloadSetPropInt(OCRepPayload* payload,
494 const char* name, int64_t value)
496 return OCRepPayloadSetProp(payload, name, &value, OCREP_PROP_INT);
499 bool OCRepPayloadGetPropInt(const OCRepPayload* payload, const char* name, int64_t* value)
501 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
503 if(!val || val->type != OCREP_PROP_INT)
512 bool OCRepPayloadSetPropDouble(OCRepPayload* payload,
513 const char* name, double value)
515 return OCRepPayloadSetProp(payload, name, &value, OCREP_PROP_DOUBLE);
518 bool OCRepPayloadGetPropDouble(const OCRepPayload* payload, const char* name, double* value)
520 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
522 if(!val || val->type != OCREP_PROP_DOUBLE)
531 bool OCRepPayloadSetPropString(OCRepPayload* payload, const char* name, const char* value)
533 char* temp = OICStrdup(value);
534 bool b = OCRepPayloadSetPropStringAsOwner(payload, name, temp);
543 bool OCRepPayloadSetPropStringAsOwner(OCRepPayload* payload, const char* name, char* value)
545 return OCRepPayloadSetProp(payload, name, value, OCREP_PROP_STRING);
548 bool OCRepPayloadGetPropString(const OCRepPayload* payload, const char* name, char** value)
550 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
552 if(!val || val->type != OCREP_PROP_STRING)
557 *value = OICStrdup(val->str);
558 return *value != NULL;
561 bool OCRepPayloadSetPropBool(OCRepPayload* payload,
562 const char* name, bool value)
564 return OCRepPayloadSetProp(payload, name, &value, OCREP_PROP_BOOL);
567 bool OCRepPayloadGetPropBool(const OCRepPayload* payload, const char* name, bool* value)
569 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
571 if(!val || val->type != OCREP_PROP_BOOL)
580 bool OCRepPayloadSetPropObject(OCRepPayload* payload, const char* name, const OCRepPayload* value)
582 OCRepPayload* temp = OCRepPayloadClone(value);
583 bool b = OCRepPayloadSetPropObjectAsOwner(payload, name, temp);
587 OCRepPayloadDestroy(temp);
592 bool OCRepPayloadSetPropObjectAsOwner(OCRepPayload* payload, const char* name, OCRepPayload* value)
594 return OCRepPayloadSetProp(payload, name, value, OCREP_PROP_OBJECT);
597 bool OCRepPayloadGetPropObject(const OCRepPayload* payload, const char* name, OCRepPayload** value)
599 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
601 if(!val || val->type != OCREP_PROP_OBJECT)
606 *value = OCRepPayloadClone(val->obj);
607 return *value != NULL;
610 size_t calcDimTotal(const size_t dimensions[MAX_REP_ARRAY_DEPTH])
612 if(dimensions[0] == 0)
618 for(uint8_t i = 0; i < MAX_REP_ARRAY_DEPTH && dimensions[i] != 0; ++i)
620 total *= dimensions[i];
625 bool OCRepPayloadSetIntArrayAsOwner(OCRepPayload* payload, const char* name,
626 int64_t* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
628 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, OCREP_PROP_ARRAY);
635 val->arr.type = OCREP_PROP_INT;
636 memcpy(val->arr.dimensions, dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
637 val->arr.iArray = array;
642 bool OCRepPayloadSetIntArray(OCRepPayload* payload, const char* name,
643 const int64_t* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
645 size_t dimTotal = calcDimTotal(dimensions);
651 int64_t* newArray = (int64_t*)OICMalloc(dimTotal * sizeof(int64_t));
658 memcpy(newArray, array, dimTotal * sizeof(int64_t));
661 bool b = OCRepPayloadSetIntArrayAsOwner(payload, name, newArray, dimensions);
669 bool OCRepPayloadGetIntArray(const OCRepPayload* payload, const char* name,
670 int64_t** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
672 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
674 if(!val || val->type != OCREP_PROP_ARRAY || val->arr.type != OCREP_PROP_INT
680 size_t dimTotal = calcDimTotal(val->arr.dimensions);
685 *array = (int64_t*)OICMalloc(dimTotal * sizeof(int64_t));
691 memcpy(*array, val->arr.iArray, dimTotal * sizeof(int64_t));
692 memcpy(dimensions, val->arr.dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
696 bool OCRepPayloadSetDoubleArrayAsOwner(OCRepPayload* payload, const char* name,
697 double* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
699 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, OCREP_PROP_ARRAY);
706 val->arr.type = OCREP_PROP_DOUBLE;
707 memcpy(val->arr.dimensions, dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
708 val->arr.dArray = array;
712 bool OCRepPayloadSetDoubleArray(OCRepPayload* payload, const char* name,
713 const double* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
715 size_t dimTotal = calcDimTotal(dimensions);
721 double* newArray = (double*)OICMalloc(dimTotal * sizeof(double));
728 memcpy(newArray, array, dimTotal * sizeof(double));
730 bool b = OCRepPayloadSetDoubleArrayAsOwner(payload, name, newArray, dimensions);
738 bool OCRepPayloadGetDoubleArray(const OCRepPayload* payload, const char* name,
739 double** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
741 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
743 if(!val || val->type != OCREP_PROP_ARRAY || val->arr.type != OCREP_PROP_DOUBLE
749 size_t dimTotal = calcDimTotal(val->arr.dimensions);
754 *array = (double*)OICMalloc(dimTotal * sizeof(double));
760 memcpy(*array, val->arr.dArray, dimTotal * sizeof(double));
761 memcpy(dimensions, val->arr.dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
765 bool OCRepPayloadSetStringArrayAsOwner(OCRepPayload* payload, const char* name,
766 char** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
768 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, OCREP_PROP_ARRAY);
775 val->arr.type = OCREP_PROP_STRING;
776 memcpy(val->arr.dimensions, dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
777 val->arr.strArray = array;
781 bool OCRepPayloadSetStringArray(OCRepPayload* payload, const char* name,
782 const char** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
784 size_t dimTotal = calcDimTotal(dimensions);
790 char** newArray = (char**)OICMalloc(dimTotal * sizeof(char*));
797 for(size_t i = 0; i < dimTotal; ++i)
799 newArray[i] = OICStrdup(array[i]);
802 bool b = OCRepPayloadSetStringArrayAsOwner(payload, name, newArray, dimensions);
806 for(size_t i = 0; i < dimTotal; ++i)
808 OICFree(newArray[i]);
815 bool OCRepPayloadGetStringArray(const OCRepPayload* payload, const char* name,
816 char*** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
818 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
820 if(!val || val->type != OCREP_PROP_ARRAY || val->arr.type != OCREP_PROP_STRING
821 || !val->arr.strArray)
826 size_t dimTotal = calcDimTotal(val->arr.dimensions);
831 *array = (char**)OICMalloc(dimTotal * sizeof(char*));
837 memcpy(dimensions, val->arr.dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
839 for(size_t i = 0; i < dimTotal; ++i)
841 (*array)[i] = OICStrdup(val->arr.strArray[i]);
848 bool OCRepPayloadSetBoolArrayAsOwner(OCRepPayload* payload, const char* name,
849 bool* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
852 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, OCREP_PROP_ARRAY);
859 val->arr.type = OCREP_PROP_BOOL;
860 memcpy(val->arr.dimensions, dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
861 val->arr.bArray = array;
865 bool OCRepPayloadSetBoolArray(OCRepPayload* payload, const char* name,
866 const bool* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
868 size_t dimTotal = calcDimTotal(dimensions);
874 bool* newArray = (bool*)OICMalloc(dimTotal * sizeof(bool));
881 memcpy(newArray, array, dimTotal * sizeof(bool));
884 bool b = OCRepPayloadSetBoolArrayAsOwner(payload, name, newArray, dimensions);
892 bool OCRepPayloadGetBoolArray(const OCRepPayload* payload, const char* name,
893 bool** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
895 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
897 if(!val || val->type != OCREP_PROP_ARRAY || val->arr.type != OCREP_PROP_BOOL
903 size_t dimTotal = calcDimTotal(val->arr.dimensions);
908 *array = (bool*)OICMalloc(dimTotal * sizeof(bool));
914 memcpy(*array, val->arr.bArray, dimTotal * sizeof(bool));
915 memcpy(dimensions, val->arr.dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
919 bool OCRepPayloadSetPropObjectArrayAsOwner(OCRepPayload* payload, const char* name,
920 OCRepPayload** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
922 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, OCREP_PROP_ARRAY);
929 val->arr.type = OCREP_PROP_OBJECT;
930 memcpy(val->arr.dimensions, dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
931 val->arr.objArray = array;
936 bool OCRepPayloadSetPropObjectArray(OCRepPayload* payload, const char* name,
937 const OCRepPayload** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
939 size_t dimTotal = calcDimTotal(dimensions);
945 OCRepPayload** newArray = (OCRepPayload**)OICMalloc(dimTotal * sizeof(OCRepPayload*));
952 for(size_t i = 0; i < dimTotal; ++i)
954 newArray[i] = OCRepPayloadClone(array[i]);
957 bool b = OCRepPayloadSetPropObjectArrayAsOwner(payload, name, newArray, dimensions);
961 for(size_t i = 0; i < dimTotal; ++i)
963 OCRepPayloadDestroy(newArray[i]);
970 bool OCRepPayloadGetPropObjectArray(const OCRepPayload* payload, const char* name,
971 OCRepPayload*** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
973 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
975 if(!val || val->type != OCREP_PROP_ARRAY || val->arr.type != OCREP_PROP_OBJECT
976 || !val->arr.objArray)
981 size_t dimTotal = calcDimTotal(val->arr.dimensions);
986 *array = (OCRepPayload**)OICMalloc(dimTotal * sizeof(OCRepPayload*));
992 memcpy(dimensions, val->arr.dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
994 for(size_t i = 0; i < dimTotal; ++i)
996 (*array)[i] = OCRepPayloadClone(val->arr.objArray[i]);
1002 void OCFreeOCStringLL(OCStringLL* ll)
1009 OCFreeOCStringLL(ll->next);
1014 OCStringLL* CloneOCStringLL (OCStringLL* ll)
1021 OCStringLL *sourceIter = ll;
1023 OCStringLL *destIter = (OCStringLL*)OICCalloc (1, sizeof (OCStringLL));
1028 destIter->value = OICStrdup (sourceIter->value);
1030 OCStringLL *headOfClone = destIter;
1032 sourceIter = sourceIter->next;
1036 destIter->next = (OCStringLL*)OICCalloc (1, sizeof (OCStringLL));
1037 if (!destIter->next)
1039 OCFreeOCStringLL (headOfClone);
1042 destIter->next->value = OICStrdup (sourceIter->value);
1044 destIter = destIter->next;
1045 sourceIter = sourceIter->next;
1050 OCRepPayload* OCRepPayloadClone (const OCRepPayload* payload)
1057 OCRepPayload *clone = OCRepPayloadCreate();
1064 clone->uri = OICStrdup (payload->uri);
1065 clone->types = CloneOCStringLL (payload->types);
1066 clone->interfaces = CloneOCStringLL (payload->interfaces);
1067 clone->values = OCRepPayloadValueClone (payload->values);
1073 void OCRepPayloadDestroy(OCRepPayload* payload)
1080 OICFree(payload->uri);
1081 OCFreeOCStringLL(payload->types);
1082 OCFreeOCStringLL(payload->interfaces);
1083 OCFreeRepPayloadValue(payload->values);
1084 OCRepPayloadDestroy(payload->next);
1088 OCDiscoveryPayload* OCDiscoveryPayloadCreate()
1090 OCDiscoveryPayload* payload = (OCDiscoveryPayload*)OICCalloc(1, sizeof(OCDiscoveryPayload));
1097 payload->base.type = PAYLOAD_TYPE_DISCOVERY;
1102 OCSecurityPayload* OCSecurityPayloadCreate(const char* securityData)
1104 OCSecurityPayload* payload = (OCSecurityPayload*)OICCalloc(1, sizeof(OCSecurityPayload));
1111 payload->base.type = PAYLOAD_TYPE_SECURITY;
1112 payload->securityData = OICStrdup(securityData);
1117 void OCSecurityPayloadDestroy(OCSecurityPayload* payload)
1124 OICFree(payload->securityData);
1128 size_t OCDiscoveryPayloadGetResourceCount(OCDiscoveryPayload* payload)
1131 OCResourcePayload* p = payload->resources;
1140 OCResourcePayload* OCDiscoveryPayloadGetResource(OCDiscoveryPayload* payload, size_t index)
1143 OCResourcePayload* p = payload->resources;
1156 static OCResourcePayload* OCCopyResource(const OCResource* res, uint16_t port)
1158 OCResourcePayload* pl = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
1164 pl->uri = OICStrdup(res->uri);
1165 pl->sid = (uint8_t*)OICCalloc(1, UUID_SIZE);
1166 if(!pl->uri || ! pl->sid)
1168 FreeOCDiscoveryResource(pl);
1171 memcpy(pl->sid, OCGetServerInstanceID(), UUID_SIZE);
1174 OCResourceType* typePtr = res->rsrcType;
1178 pl->types = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
1181 FreeOCDiscoveryResource(pl);
1184 pl->types->value = OICStrdup(typePtr->resourcetypename);
1185 if(!pl->types->value)
1187 FreeOCDiscoveryResource(pl);
1191 OCStringLL* cur = pl->types;
1192 typePtr = typePtr->next;
1195 cur->next = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
1198 FreeOCDiscoveryResource(pl);
1201 cur->next->value = OICStrdup(typePtr->resourcetypename);
1202 if(!cur->next->value)
1204 FreeOCDiscoveryResource(pl);
1208 typePtr = typePtr->next;
1213 OCResourceInterface* ifPtr = res->rsrcInterface;
1216 pl->interfaces = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
1219 FreeOCDiscoveryResource(pl);
1222 pl->interfaces->value = OICStrdup(ifPtr->name);
1223 if(!pl->interfaces->value)
1225 FreeOCDiscoveryResource(pl);
1229 OCStringLL* cur = pl->interfaces;
1230 ifPtr = ifPtr->next;
1233 cur->next = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
1236 FreeOCDiscoveryResource(pl);
1239 cur->next->value = OICStrdup(ifPtr->name);
1240 if(!cur->next->value)
1242 FreeOCDiscoveryResource(pl);
1246 ifPtr = ifPtr->next;
1250 pl->bitmap = res->resourceProperties & (OC_OBSERVABLE | OC_DISCOVERABLE);
1251 pl->secure = (res->resourceProperties & OC_SECURE) != 0;
1257 void OCDiscoveryPayloadAddResource(OCDiscoveryPayload* payload, const OCResource* res,
1260 OCDiscoveryPayloadAddNewResource(payload, OCCopyResource(res, port));
1263 void OCDiscoveryPayloadAddNewResource(OCDiscoveryPayload* payload, OCResourcePayload* res)
1265 if(!payload->resources)
1267 payload->resources = res;
1271 OCResourcePayload* p = payload->resources;
1280 static void FreeOCDiscoveryResource(OCResourcePayload* payload)
1287 OICFree(payload->uri);
1288 OICFree(payload->sid);
1289 OCFreeOCStringLL(payload->types);
1290 OCFreeOCStringLL(payload->interfaces);
1291 FreeOCDiscoveryResource(payload->next);
1295 void OCDiscoveryPayloadDestroy(OCDiscoveryPayload* payload)
1302 FreeOCDiscoveryResource(payload->resources);
1306 OCDevicePayload* OCDevicePayloadCreate(const char* uri, const uint8_t* sid, const char* dname,
1307 const char* specVer, const char* dmVer)
1310 OCDevicePayload* payload = (OCDevicePayload*)OICCalloc(1, sizeof(OCDevicePayload));
1317 payload->base.type = PAYLOAD_TYPE_DEVICE;
1319 payload->uri = OICStrdup(uri);
1320 if(uri && !payload->uri)
1327 payload->sid = (uint8_t*)OICMalloc(UUID_SIZE);
1332 memcpy(payload->sid, sid, UUID_SIZE);
1335 payload->deviceName = OICStrdup(dname);
1336 if(dname && !payload->deviceName)
1341 payload->specVersion = OICStrdup(specVer);
1342 if(specVer && !payload->specVersion)
1347 payload->dataModelVersion = OICStrdup(dmVer);
1348 if(dmVer && !payload->dataModelVersion)
1356 OCDevicePayloadDestroy((OCDevicePayload*)payload);
1360 void OCDevicePayloadDestroy(OCDevicePayload* payload)
1367 OICFree(payload->uri);
1368 OICFree(payload->sid);
1369 OICFree(payload->deviceName);
1370 OICFree(payload->specVersion);
1371 OICFree(payload->dataModelVersion);
1375 static void OCCopyPlatformInfo(const OCPlatformInfo* platformInfo, OCPlatformPayload* target)
1377 if(!platformInfo || !target)
1382 target->info.platformID = OICStrdup(platformInfo->platformID);
1383 target->info.manufacturerName = OICStrdup(platformInfo->manufacturerName);
1384 target->info.manufacturerUrl = OICStrdup(platformInfo->manufacturerUrl);
1385 target->info.modelNumber = OICStrdup(platformInfo->modelNumber);
1386 target->info.dateOfManufacture = OICStrdup(platformInfo->dateOfManufacture);
1387 target->info.platformVersion = OICStrdup(platformInfo->platformVersion);
1388 target->info.operatingSystemVersion = OICStrdup(platformInfo->operatingSystemVersion);
1389 target->info.hardwareVersion = OICStrdup(platformInfo->hardwareVersion);
1390 target->info.firmwareVersion = OICStrdup(platformInfo->firmwareVersion);
1391 target->info.supportUrl = OICStrdup(platformInfo->supportUrl);
1392 target->info.systemTime = OICStrdup(platformInfo->systemTime);
1395 OCPlatformPayload* OCPlatformPayloadCreateAsOwner(char* uri, OCPlatformInfo* platformInfo)
1397 OCPlatformPayload* payload = (OCPlatformPayload*)OICCalloc(1, sizeof(OCPlatformPayload));
1403 payload->base.type = PAYLOAD_TYPE_PLATFORM;
1405 payload->info = *platformInfo;
1410 OCPlatformPayload* OCPlatformPayloadCreate(const char* uri, const OCPlatformInfo* platformInfo)
1412 OCPlatformPayload* payload = (OCPlatformPayload*)OICCalloc(1, sizeof(OCPlatformPayload));
1419 payload->base.type = PAYLOAD_TYPE_PLATFORM;
1420 payload->uri = OICStrdup(uri);
1421 OCCopyPlatformInfo(platformInfo, payload);
1426 void OCPlatformPayloadDestroy(OCPlatformPayload* payload)
1432 OICFree(payload->uri);
1433 OICFree(payload->info.platformID);
1434 OICFree(payload->info.manufacturerName);
1435 OICFree(payload->info.manufacturerUrl);
1436 OICFree(payload->info.modelNumber);
1437 OICFree(payload->info.dateOfManufacture);
1438 OICFree(payload->info.platformVersion);
1439 OICFree(payload->info.operatingSystemVersion);
1440 OICFree(payload->info.hardwareVersion);
1441 OICFree(payload->info.firmwareVersion);
1442 OICFree(payload->info.supportUrl);
1443 OICFree(payload->info.systemTime);
1447 OCPresencePayload* OCPresencePayloadCreate(uint32_t seqNum, uint32_t maxAge,
1448 OCPresenceTrigger trigger, const char* resourceType)
1450 OCPresencePayload* payload = (OCPresencePayload*)OICCalloc(1, sizeof(OCPresencePayload));
1456 payload->base.type = PAYLOAD_TYPE_PRESENCE;
1457 payload->sequenceNumber = seqNum;
1458 payload->maxAge = maxAge;
1459 payload->trigger = trigger;
1460 payload->resourceType = OICStrdup(resourceType);
1464 void OCPresencePayloadDestroy(OCPresencePayload* payload)
1470 OICFree(payload->resourceType);