pick up wakaama files from https://github.com/eclipse/wakaama

Committer:
terencez
Date:
Wed Apr 19 11:28:00 2017 +0000
Revision:
0:3f48af28ebcd
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
terencez 0:3f48af28ebcd 1 /*******************************************************************************
terencez 0:3f48af28ebcd 2 *
terencez 0:3f48af28ebcd 3 * Copyright (c) 2015 Intel Corporation and others.
terencez 0:3f48af28ebcd 4 * All rights reserved. This program and the accompanying materials
terencez 0:3f48af28ebcd 5 * are made available under the terms of the Eclipse Public License v1.0
terencez 0:3f48af28ebcd 6 * and Eclipse Distribution License v1.0 which accompany this distribution.
terencez 0:3f48af28ebcd 7 *
terencez 0:3f48af28ebcd 8 * The Eclipse Public License is available at
terencez 0:3f48af28ebcd 9 * http://www.eclipse.org/legal/epl-v10.html
terencez 0:3f48af28ebcd 10 * The Eclipse Distribution License is available at
terencez 0:3f48af28ebcd 11 * http://www.eclipse.org/org/documents/edl-v10.php.
terencez 0:3f48af28ebcd 12 *
terencez 0:3f48af28ebcd 13 * Contributors:
terencez 0:3f48af28ebcd 14 * David Navarro, Intel Corporation - initial API and implementation
terencez 0:3f48af28ebcd 15 *
terencez 0:3f48af28ebcd 16 *******************************************************************************/
terencez 0:3f48af28ebcd 17
terencez 0:3f48af28ebcd 18
terencez 0:3f48af28ebcd 19 #include "internals.h"
terencez 0:3f48af28ebcd 20
terencez 0:3f48af28ebcd 21 #define PRV_LINK_BUFFER_SIZE 1024
terencez 0:3f48af28ebcd 22
terencez 0:3f48af28ebcd 23
terencez 0:3f48af28ebcd 24 #define PRV_CONCAT_STR(buf, len, index, str, str_len) \
terencez 0:3f48af28ebcd 25 { \
terencez 0:3f48af28ebcd 26 if ((len)-(index) < (str_len)) return -1; \
terencez 0:3f48af28ebcd 27 memcpy((buf)+(index), (str), (str_len)); \
terencez 0:3f48af28ebcd 28 (index) += (str_len); \
terencez 0:3f48af28ebcd 29 }
terencez 0:3f48af28ebcd 30
terencez 0:3f48af28ebcd 31
terencez 0:3f48af28ebcd 32 #ifdef LWM2M_CLIENT_MODE
terencez 0:3f48af28ebcd 33
terencez 0:3f48af28ebcd 34 static lwm2m_attributes_t * prv_findAttributes(lwm2m_context_t * contextP,
terencez 0:3f48af28ebcd 35 lwm2m_uri_t * uriP,
terencez 0:3f48af28ebcd 36 lwm2m_server_t * serverP)
terencez 0:3f48af28ebcd 37 {
terencez 0:3f48af28ebcd 38 lwm2m_observed_t * observedP;
terencez 0:3f48af28ebcd 39 lwm2m_watcher_t * watcherP;
terencez 0:3f48af28ebcd 40 lwm2m_attributes_t * paramP;
terencez 0:3f48af28ebcd 41
terencez 0:3f48af28ebcd 42 paramP = NULL;
terencez 0:3f48af28ebcd 43
terencez 0:3f48af28ebcd 44 if (contextP == NULL) return NULL;
terencez 0:3f48af28ebcd 45 if (serverP == NULL) return NULL;
terencez 0:3f48af28ebcd 46
terencez 0:3f48af28ebcd 47 observedP = observe_findByUri(contextP, uriP);
terencez 0:3f48af28ebcd 48 if (observedP == NULL || observedP->watcherList == NULL) return NULL;
terencez 0:3f48af28ebcd 49
terencez 0:3f48af28ebcd 50 for (watcherP = observedP->watcherList; watcherP != NULL; watcherP = watcherP->next)
terencez 0:3f48af28ebcd 51 {
terencez 0:3f48af28ebcd 52 if (watcherP->server == serverP)
terencez 0:3f48af28ebcd 53 {
terencez 0:3f48af28ebcd 54 paramP = watcherP->parameters;
terencez 0:3f48af28ebcd 55 }
terencez 0:3f48af28ebcd 56 }
terencez 0:3f48af28ebcd 57
terencez 0:3f48af28ebcd 58 return paramP;
terencez 0:3f48af28ebcd 59 }
terencez 0:3f48af28ebcd 60
terencez 0:3f48af28ebcd 61 static int prv_serializeAttributes(lwm2m_context_t * contextP,
terencez 0:3f48af28ebcd 62 lwm2m_uri_t * uriP,
terencez 0:3f48af28ebcd 63 lwm2m_server_t * serverP,
terencez 0:3f48af28ebcd 64 lwm2m_attributes_t * objectParamP,
terencez 0:3f48af28ebcd 65 uint8_t * buffer,
terencez 0:3f48af28ebcd 66 size_t uriLen,
terencez 0:3f48af28ebcd 67 size_t bufferLen)
terencez 0:3f48af28ebcd 68 {
terencez 0:3f48af28ebcd 69 int head;
terencez 0:3f48af28ebcd 70 int res;
terencez 0:3f48af28ebcd 71 lwm2m_attributes_t * paramP;
terencez 0:3f48af28ebcd 72
terencez 0:3f48af28ebcd 73 head = 0;
terencez 0:3f48af28ebcd 74
terencez 0:3f48af28ebcd 75 paramP = prv_findAttributes(contextP, uriP, serverP);
terencez 0:3f48af28ebcd 76 if (paramP == NULL) paramP = objectParamP;
terencez 0:3f48af28ebcd 77
terencez 0:3f48af28ebcd 78 if (paramP != NULL)
terencez 0:3f48af28ebcd 79 {
terencez 0:3f48af28ebcd 80 head = uriLen;
terencez 0:3f48af28ebcd 81
terencez 0:3f48af28ebcd 82 if (paramP->toSet & LWM2M_ATTR_FLAG_MIN_PERIOD)
terencez 0:3f48af28ebcd 83 {
terencez 0:3f48af28ebcd 84 PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ATTR_SEPARATOR, LINK_ATTR_SEPARATOR_SIZE);
terencez 0:3f48af28ebcd 85 PRV_CONCAT_STR(buffer, bufferLen, head, ATTR_MIN_PERIOD_STR, ATTR_MIN_PERIOD_LEN);
terencez 0:3f48af28ebcd 86
terencez 0:3f48af28ebcd 87 res = utils_intToText(paramP->minPeriod, buffer + head, bufferLen - head);
terencez 0:3f48af28ebcd 88 if (res <= 0) return -1;
terencez 0:3f48af28ebcd 89 head += res;
terencez 0:3f48af28ebcd 90 }
terencez 0:3f48af28ebcd 91 else if (objectParamP->toSet & LWM2M_ATTR_FLAG_MIN_PERIOD)
terencez 0:3f48af28ebcd 92 {
terencez 0:3f48af28ebcd 93 PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ATTR_SEPARATOR, LINK_ATTR_SEPARATOR_SIZE);
terencez 0:3f48af28ebcd 94 PRV_CONCAT_STR(buffer, bufferLen, head, ATTR_MIN_PERIOD_STR, ATTR_MIN_PERIOD_LEN);
terencez 0:3f48af28ebcd 95
terencez 0:3f48af28ebcd 96 res = utils_intToText(objectParamP->minPeriod, buffer + head, bufferLen - head);
terencez 0:3f48af28ebcd 97 if (res <= 0) return -1;
terencez 0:3f48af28ebcd 98 head += res;
terencez 0:3f48af28ebcd 99 }
terencez 0:3f48af28ebcd 100
terencez 0:3f48af28ebcd 101 if (paramP->toSet & LWM2M_ATTR_FLAG_MAX_PERIOD)
terencez 0:3f48af28ebcd 102 {
terencez 0:3f48af28ebcd 103 PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ATTR_SEPARATOR, LINK_ATTR_SEPARATOR_SIZE);
terencez 0:3f48af28ebcd 104 PRV_CONCAT_STR(buffer, bufferLen, head, ATTR_MAX_PERIOD_STR, ATTR_MAX_PERIOD_LEN);
terencez 0:3f48af28ebcd 105
terencez 0:3f48af28ebcd 106 res = utils_intToText(paramP->maxPeriod, buffer + head, bufferLen - head);
terencez 0:3f48af28ebcd 107 if (res <= 0) return -1;
terencez 0:3f48af28ebcd 108 head += res;
terencez 0:3f48af28ebcd 109 }
terencez 0:3f48af28ebcd 110 else if (objectParamP->toSet & LWM2M_ATTR_FLAG_MAX_PERIOD)
terencez 0:3f48af28ebcd 111 {
terencez 0:3f48af28ebcd 112 PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ATTR_SEPARATOR, LINK_ATTR_SEPARATOR_SIZE);
terencez 0:3f48af28ebcd 113 PRV_CONCAT_STR(buffer, bufferLen, head, ATTR_MAX_PERIOD_STR, ATTR_MAX_PERIOD_LEN);
terencez 0:3f48af28ebcd 114
terencez 0:3f48af28ebcd 115 res = utils_intToText(objectParamP->maxPeriod, buffer + head, bufferLen - head);
terencez 0:3f48af28ebcd 116 if (res <= 0) return -1;
terencez 0:3f48af28ebcd 117 head += res;
terencez 0:3f48af28ebcd 118 }
terencez 0:3f48af28ebcd 119
terencez 0:3f48af28ebcd 120 if (paramP->toSet & LWM2M_ATTR_FLAG_GREATER_THAN)
terencez 0:3f48af28ebcd 121 {
terencez 0:3f48af28ebcd 122 PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ATTR_SEPARATOR, LINK_ATTR_SEPARATOR_SIZE);
terencez 0:3f48af28ebcd 123 PRV_CONCAT_STR(buffer, bufferLen, head, ATTR_GREATER_THAN_STR, ATTR_GREATER_THAN_LEN);
terencez 0:3f48af28ebcd 124
terencez 0:3f48af28ebcd 125 res = utils_floatToText(paramP->greaterThan, buffer + head, bufferLen - head);
terencez 0:3f48af28ebcd 126 if (res <= 0) return -1;
terencez 0:3f48af28ebcd 127 head += res;
terencez 0:3f48af28ebcd 128 }
terencez 0:3f48af28ebcd 129 if (paramP->toSet & LWM2M_ATTR_FLAG_LESS_THAN)
terencez 0:3f48af28ebcd 130 {
terencez 0:3f48af28ebcd 131 PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ATTR_SEPARATOR, LINK_ATTR_SEPARATOR_SIZE);
terencez 0:3f48af28ebcd 132 PRV_CONCAT_STR(buffer, bufferLen, head, ATTR_LESS_THAN_STR, ATTR_LESS_THAN_LEN);
terencez 0:3f48af28ebcd 133
terencez 0:3f48af28ebcd 134 res = utils_floatToText(paramP->lessThan, buffer + head, bufferLen - head);
terencez 0:3f48af28ebcd 135 if (res <= 0) return -1;
terencez 0:3f48af28ebcd 136 head += res;
terencez 0:3f48af28ebcd 137 }
terencez 0:3f48af28ebcd 138 if (paramP->toSet & LWM2M_ATTR_FLAG_STEP)
terencez 0:3f48af28ebcd 139 {
terencez 0:3f48af28ebcd 140 PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ATTR_SEPARATOR, LINK_ATTR_SEPARATOR_SIZE);
terencez 0:3f48af28ebcd 141 PRV_CONCAT_STR(buffer, bufferLen, head, ATTR_STEP_STR, ATTR_STEP_LEN);
terencez 0:3f48af28ebcd 142
terencez 0:3f48af28ebcd 143 res = utils_floatToText(paramP->step, buffer + head, bufferLen - head);
terencez 0:3f48af28ebcd 144 if (res <= 0) return -1;
terencez 0:3f48af28ebcd 145 head += res;
terencez 0:3f48af28ebcd 146 }
terencez 0:3f48af28ebcd 147 PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ITEM_ATTR_END, LINK_ITEM_ATTR_END_SIZE);
terencez 0:3f48af28ebcd 148 }
terencez 0:3f48af28ebcd 149
terencez 0:3f48af28ebcd 150 if (head > 0) head -= uriLen + 1;
terencez 0:3f48af28ebcd 151
terencez 0:3f48af28ebcd 152 return head;
terencez 0:3f48af28ebcd 153 }
terencez 0:3f48af28ebcd 154
terencez 0:3f48af28ebcd 155 static int prv_serializeLinkData(lwm2m_context_t * contextP,
terencez 0:3f48af28ebcd 156 lwm2m_data_t * tlvP,
terencez 0:3f48af28ebcd 157 lwm2m_server_t * serverP,
terencez 0:3f48af28ebcd 158 lwm2m_attributes_t * objectParamP,
terencez 0:3f48af28ebcd 159 lwm2m_uri_t * parentUriP,
terencez 0:3f48af28ebcd 160 uint8_t * parentUriStr,
terencez 0:3f48af28ebcd 161 size_t parentUriLen,
terencez 0:3f48af28ebcd 162 uint8_t * buffer,
terencez 0:3f48af28ebcd 163 size_t bufferLen)
terencez 0:3f48af28ebcd 164 {
terencez 0:3f48af28ebcd 165 int head;
terencez 0:3f48af28ebcd 166 int res;
terencez 0:3f48af28ebcd 167 lwm2m_uri_t uri;
terencez 0:3f48af28ebcd 168
terencez 0:3f48af28ebcd 169 head = 0;
terencez 0:3f48af28ebcd 170
terencez 0:3f48af28ebcd 171 switch (tlvP->type)
terencez 0:3f48af28ebcd 172 {
terencez 0:3f48af28ebcd 173 case LWM2M_TYPE_UNDEFINED:
terencez 0:3f48af28ebcd 174 case LWM2M_TYPE_STRING:
terencez 0:3f48af28ebcd 175 case LWM2M_TYPE_OPAQUE:
terencez 0:3f48af28ebcd 176 case LWM2M_TYPE_INTEGER:
terencez 0:3f48af28ebcd 177 case LWM2M_TYPE_FLOAT:
terencez 0:3f48af28ebcd 178 case LWM2M_TYPE_BOOLEAN:
terencez 0:3f48af28ebcd 179 case LWM2M_TYPE_OBJECT_LINK:
terencez 0:3f48af28ebcd 180 case LWM2M_TYPE_MULTIPLE_RESOURCE:
terencez 0:3f48af28ebcd 181 if (bufferLen < LINK_ITEM_START_SIZE) return -1;
terencez 0:3f48af28ebcd 182 memcpy(buffer + head, LINK_ITEM_START, LINK_ITEM_START_SIZE);
terencez 0:3f48af28ebcd 183 head = LINK_ITEM_START_SIZE;
terencez 0:3f48af28ebcd 184
terencez 0:3f48af28ebcd 185 if (parentUriLen > 0)
terencez 0:3f48af28ebcd 186 {
terencez 0:3f48af28ebcd 187 if (bufferLen - head < parentUriLen) return -1;
terencez 0:3f48af28ebcd 188 memcpy(buffer + head, parentUriStr, parentUriLen);
terencez 0:3f48af28ebcd 189 head += parentUriLen;
terencez 0:3f48af28ebcd 190 }
terencez 0:3f48af28ebcd 191
terencez 0:3f48af28ebcd 192 if (bufferLen - head < LINK_URI_SEPARATOR_SIZE) return -1;
terencez 0:3f48af28ebcd 193 memcpy(buffer + head, LINK_URI_SEPARATOR, LINK_URI_SEPARATOR_SIZE);
terencez 0:3f48af28ebcd 194 head += LINK_URI_SEPARATOR_SIZE;
terencez 0:3f48af28ebcd 195
terencez 0:3f48af28ebcd 196 res = utils_intToText(tlvP->id, buffer + head, bufferLen - head);
terencez 0:3f48af28ebcd 197 if (res <= 0) return -1;
terencez 0:3f48af28ebcd 198 head += res;
terencez 0:3f48af28ebcd 199
terencez 0:3f48af28ebcd 200 if (tlvP->type == LWM2M_TYPE_MULTIPLE_RESOURCE)
terencez 0:3f48af28ebcd 201 {
terencez 0:3f48af28ebcd 202 if (bufferLen - head < LINK_ITEM_DIM_START_SIZE) return -1;
terencez 0:3f48af28ebcd 203 memcpy(buffer + head, LINK_ITEM_DIM_START, LINK_ITEM_DIM_START_SIZE);
terencez 0:3f48af28ebcd 204 head += LINK_ITEM_DIM_START_SIZE;
terencez 0:3f48af28ebcd 205
terencez 0:3f48af28ebcd 206 res = utils_intToText(tlvP->value.asChildren.count, buffer + head, bufferLen - head);
terencez 0:3f48af28ebcd 207 if (res <= 0) return -1;
terencez 0:3f48af28ebcd 208 head += res;
terencez 0:3f48af28ebcd 209
terencez 0:3f48af28ebcd 210 if (bufferLen - head < LINK_ITEM_ATTR_END_SIZE) return -1;
terencez 0:3f48af28ebcd 211 memcpy(buffer + head, LINK_ITEM_ATTR_END, LINK_ITEM_ATTR_END_SIZE);
terencez 0:3f48af28ebcd 212 head += LINK_ITEM_ATTR_END_SIZE;
terencez 0:3f48af28ebcd 213 }
terencez 0:3f48af28ebcd 214 else
terencez 0:3f48af28ebcd 215 {
terencez 0:3f48af28ebcd 216 if (bufferLen - head < LINK_ITEM_END_SIZE) return -1;
terencez 0:3f48af28ebcd 217 memcpy(buffer + head, LINK_ITEM_END, LINK_ITEM_END_SIZE);
terencez 0:3f48af28ebcd 218 head += LINK_ITEM_END_SIZE;
terencez 0:3f48af28ebcd 219 }
terencez 0:3f48af28ebcd 220
terencez 0:3f48af28ebcd 221 if (serverP != NULL)
terencez 0:3f48af28ebcd 222 {
terencez 0:3f48af28ebcd 223 memcpy(&uri, parentUriP, sizeof(lwm2m_uri_t));
terencez 0:3f48af28ebcd 224 uri.resourceId = tlvP->id;
terencez 0:3f48af28ebcd 225 uri.flag |= LWM2M_URI_FLAG_RESOURCE_ID;
terencez 0:3f48af28ebcd 226 res = prv_serializeAttributes(contextP, &uri, serverP, objectParamP, buffer, head - 1, bufferLen);
terencez 0:3f48af28ebcd 227 if (res < 0) return -1; // careful, 0 is valid
terencez 0:3f48af28ebcd 228 if (res > 0) head += res;
terencez 0:3f48af28ebcd 229 }
terencez 0:3f48af28ebcd 230 break;
terencez 0:3f48af28ebcd 231
terencez 0:3f48af28ebcd 232 case LWM2M_TYPE_OBJECT_INSTANCE:
terencez 0:3f48af28ebcd 233 {
terencez 0:3f48af28ebcd 234 uint8_t uriStr[URI_MAX_STRING_LEN];
terencez 0:3f48af28ebcd 235 size_t uriLen;
terencez 0:3f48af28ebcd 236 size_t index;
terencez 0:3f48af28ebcd 237
terencez 0:3f48af28ebcd 238 if (parentUriLen > 0)
terencez 0:3f48af28ebcd 239 {
terencez 0:3f48af28ebcd 240 if (URI_MAX_STRING_LEN < parentUriLen) return -1;
terencez 0:3f48af28ebcd 241 memcpy(uriStr, parentUriStr, parentUriLen);
terencez 0:3f48af28ebcd 242 uriLen = parentUriLen;
terencez 0:3f48af28ebcd 243 }
terencez 0:3f48af28ebcd 244 else
terencez 0:3f48af28ebcd 245 {
terencez 0:3f48af28ebcd 246 uriLen = 0;
terencez 0:3f48af28ebcd 247 }
terencez 0:3f48af28ebcd 248
terencez 0:3f48af28ebcd 249 if (URI_MAX_STRING_LEN - uriLen < LINK_URI_SEPARATOR_SIZE) return -1;
terencez 0:3f48af28ebcd 250 memcpy(uriStr + uriLen, LINK_URI_SEPARATOR, LINK_URI_SEPARATOR_SIZE);
terencez 0:3f48af28ebcd 251 uriLen += LINK_URI_SEPARATOR_SIZE;
terencez 0:3f48af28ebcd 252
terencez 0:3f48af28ebcd 253 res = utils_intToText(tlvP->id, uriStr + uriLen, URI_MAX_STRING_LEN - uriLen);
terencez 0:3f48af28ebcd 254 if (res <= 0) return -1;
terencez 0:3f48af28ebcd 255 uriLen += res;
terencez 0:3f48af28ebcd 256
terencez 0:3f48af28ebcd 257 memcpy(&uri, parentUriP, sizeof(lwm2m_uri_t));
terencez 0:3f48af28ebcd 258 uri.instanceId = tlvP->id;
terencez 0:3f48af28ebcd 259 uri.flag |= LWM2M_URI_FLAG_INSTANCE_ID;
terencez 0:3f48af28ebcd 260
terencez 0:3f48af28ebcd 261 head = 0;
terencez 0:3f48af28ebcd 262 PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ITEM_START, LINK_ITEM_START_SIZE);
terencez 0:3f48af28ebcd 263 PRV_CONCAT_STR(buffer, bufferLen, head, uriStr, uriLen);
terencez 0:3f48af28ebcd 264 PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ITEM_END, LINK_ITEM_END_SIZE);
terencez 0:3f48af28ebcd 265 if (serverP != NULL)
terencez 0:3f48af28ebcd 266 {
terencez 0:3f48af28ebcd 267 res = prv_serializeAttributes(contextP, &uri, serverP, NULL, buffer, head - 1, bufferLen);
terencez 0:3f48af28ebcd 268 if (res < 0) return -1; // careful, 0 is valid
terencez 0:3f48af28ebcd 269 if (res == 0) head = 0; // rewind
terencez 0:3f48af28ebcd 270 else head += res;
terencez 0:3f48af28ebcd 271 }
terencez 0:3f48af28ebcd 272 for (index = 0; index < tlvP->value.asChildren.count; index++)
terencez 0:3f48af28ebcd 273 {
terencez 0:3f48af28ebcd 274 res = prv_serializeLinkData(contextP, tlvP->value.asChildren.array + index, serverP, objectParamP, &uri, uriStr, uriLen, buffer + head, bufferLen - head);
terencez 0:3f48af28ebcd 275 if (res < 0) return -1;
terencez 0:3f48af28ebcd 276 head += res;
terencez 0:3f48af28ebcd 277 }
terencez 0:3f48af28ebcd 278 }
terencez 0:3f48af28ebcd 279 break;
terencez 0:3f48af28ebcd 280
terencez 0:3f48af28ebcd 281 case LWM2M_TYPE_OBJECT:
terencez 0:3f48af28ebcd 282 default:
terencez 0:3f48af28ebcd 283 return -1;
terencez 0:3f48af28ebcd 284 }
terencez 0:3f48af28ebcd 285
terencez 0:3f48af28ebcd 286 return head;
terencez 0:3f48af28ebcd 287 }
terencez 0:3f48af28ebcd 288
terencez 0:3f48af28ebcd 289 int discover_serialize(lwm2m_context_t * contextP,
terencez 0:3f48af28ebcd 290 lwm2m_uri_t * uriP,
terencez 0:3f48af28ebcd 291 lwm2m_server_t * serverP,
terencez 0:3f48af28ebcd 292 int size,
terencez 0:3f48af28ebcd 293 lwm2m_data_t * dataP,
terencez 0:3f48af28ebcd 294 uint8_t ** bufferP)
terencez 0:3f48af28ebcd 295 {
terencez 0:3f48af28ebcd 296 uint8_t bufferLink[PRV_LINK_BUFFER_SIZE];
terencez 0:3f48af28ebcd 297 uint8_t baseUriStr[URI_MAX_STRING_LEN];
terencez 0:3f48af28ebcd 298 int baseUriLen;
terencez 0:3f48af28ebcd 299 int index;
terencez 0:3f48af28ebcd 300 size_t head;
terencez 0:3f48af28ebcd 301 int res;
terencez 0:3f48af28ebcd 302 lwm2m_uri_t parentUri;
terencez 0:3f48af28ebcd 303 lwm2m_attributes_t * paramP;
terencez 0:3f48af28ebcd 304 lwm2m_attributes_t mergedParam;
terencez 0:3f48af28ebcd 305
terencez 0:3f48af28ebcd 306 LOG_ARG("size: %d", size);
terencez 0:3f48af28ebcd 307 LOG_URI(uriP);
terencez 0:3f48af28ebcd 308
terencez 0:3f48af28ebcd 309 head = 0;
terencez 0:3f48af28ebcd 310 memset(&parentUri, 0, sizeof(lwm2m_uri_t));
terencez 0:3f48af28ebcd 311 parentUri.objectId = uriP->objectId;
terencez 0:3f48af28ebcd 312 parentUri.flag = LWM2M_URI_FLAG_OBJECT_ID;
terencez 0:3f48af28ebcd 313
terencez 0:3f48af28ebcd 314 if (LWM2M_URI_IS_SET_RESOURCE(uriP))
terencez 0:3f48af28ebcd 315 {
terencez 0:3f48af28ebcd 316 lwm2m_uri_t tempUri;
terencez 0:3f48af28ebcd 317 lwm2m_attributes_t * objParamP;
terencez 0:3f48af28ebcd 318 lwm2m_attributes_t * instParamP;
terencez 0:3f48af28ebcd 319
terencez 0:3f48af28ebcd 320 memset(&parentUri, 0, sizeof(lwm2m_uri_t));
terencez 0:3f48af28ebcd 321 tempUri.objectId = uriP->objectId;
terencez 0:3f48af28ebcd 322 tempUri.flag = LWM2M_URI_FLAG_OBJECT_ID;
terencez 0:3f48af28ebcd 323
terencez 0:3f48af28ebcd 324 // get object level attributes
terencez 0:3f48af28ebcd 325 objParamP = prv_findAttributes(contextP, &tempUri, serverP);
terencez 0:3f48af28ebcd 326
terencez 0:3f48af28ebcd 327 // get object instance level attributes
terencez 0:3f48af28ebcd 328 tempUri.instanceId = uriP->instanceId;
terencez 0:3f48af28ebcd 329 tempUri.flag = LWM2M_URI_FLAG_INSTANCE_ID;
terencez 0:3f48af28ebcd 330 instParamP = prv_findAttributes(contextP, &tempUri, serverP);
terencez 0:3f48af28ebcd 331
terencez 0:3f48af28ebcd 332 if (objParamP != NULL)
terencez 0:3f48af28ebcd 333 {
terencez 0:3f48af28ebcd 334 if (instParamP != NULL)
terencez 0:3f48af28ebcd 335 {
terencez 0:3f48af28ebcd 336 memset(&mergedParam, 0, sizeof(lwm2m_attributes_t));
terencez 0:3f48af28ebcd 337 mergedParam.toSet = objParamP->toSet | instParamP->toSet;
terencez 0:3f48af28ebcd 338 if (mergedParam.toSet & LWM2M_ATTR_FLAG_MIN_PERIOD)
terencez 0:3f48af28ebcd 339 {
terencez 0:3f48af28ebcd 340 if (instParamP->toSet & LWM2M_ATTR_FLAG_MIN_PERIOD)
terencez 0:3f48af28ebcd 341 {
terencez 0:3f48af28ebcd 342 mergedParam.minPeriod = instParamP->minPeriod;
terencez 0:3f48af28ebcd 343 }
terencez 0:3f48af28ebcd 344 else
terencez 0:3f48af28ebcd 345 {
terencez 0:3f48af28ebcd 346 mergedParam.minPeriod = objParamP->minPeriod;
terencez 0:3f48af28ebcd 347 }
terencez 0:3f48af28ebcd 348 }
terencez 0:3f48af28ebcd 349 if (mergedParam.toSet & LWM2M_ATTR_FLAG_MAX_PERIOD)
terencez 0:3f48af28ebcd 350 {
terencez 0:3f48af28ebcd 351 if (instParamP->toSet & LWM2M_ATTR_FLAG_MAX_PERIOD)
terencez 0:3f48af28ebcd 352 {
terencez 0:3f48af28ebcd 353 mergedParam.maxPeriod = instParamP->maxPeriod;
terencez 0:3f48af28ebcd 354 }
terencez 0:3f48af28ebcd 355 else
terencez 0:3f48af28ebcd 356 {
terencez 0:3f48af28ebcd 357 mergedParam.maxPeriod = objParamP->maxPeriod;
terencez 0:3f48af28ebcd 358 }
terencez 0:3f48af28ebcd 359 }
terencez 0:3f48af28ebcd 360 paramP = &mergedParam;
terencez 0:3f48af28ebcd 361 }
terencez 0:3f48af28ebcd 362 else
terencez 0:3f48af28ebcd 363 {
terencez 0:3f48af28ebcd 364 paramP = objParamP;
terencez 0:3f48af28ebcd 365 }
terencez 0:3f48af28ebcd 366 }
terencez 0:3f48af28ebcd 367 else
terencez 0:3f48af28ebcd 368 {
terencez 0:3f48af28ebcd 369 paramP = instParamP;
terencez 0:3f48af28ebcd 370 }
terencez 0:3f48af28ebcd 371 uriP->flag &= ~LWM2M_URI_FLAG_RESOURCE_ID;
terencez 0:3f48af28ebcd 372 }
terencez 0:3f48af28ebcd 373 else
terencez 0:3f48af28ebcd 374 {
terencez 0:3f48af28ebcd 375 paramP = NULL;
terencez 0:3f48af28ebcd 376
terencez 0:3f48af28ebcd 377 if (LWM2M_URI_IS_SET_INSTANCE(uriP))
terencez 0:3f48af28ebcd 378 {
terencez 0:3f48af28ebcd 379 PRV_CONCAT_STR(bufferLink, PRV_LINK_BUFFER_SIZE, head, LINK_ITEM_START, LINK_ITEM_START_SIZE);
terencez 0:3f48af28ebcd 380 PRV_CONCAT_STR(bufferLink, PRV_LINK_BUFFER_SIZE, head, LINK_URI_SEPARATOR, LINK_URI_SEPARATOR_SIZE);
terencez 0:3f48af28ebcd 381 res = utils_intToText(uriP->objectId, bufferLink + head, PRV_LINK_BUFFER_SIZE - head);
terencez 0:3f48af28ebcd 382 if (res <= 0) return -1;
terencez 0:3f48af28ebcd 383 head += res;
terencez 0:3f48af28ebcd 384 PRV_CONCAT_STR(bufferLink, PRV_LINK_BUFFER_SIZE, head, LINK_URI_SEPARATOR, LINK_URI_SEPARATOR_SIZE);
terencez 0:3f48af28ebcd 385 res = utils_intToText(uriP->instanceId, bufferLink + head, PRV_LINK_BUFFER_SIZE - head);
terencez 0:3f48af28ebcd 386 if (res <= 0) return -1;
terencez 0:3f48af28ebcd 387 head += res;
terencez 0:3f48af28ebcd 388 PRV_CONCAT_STR(bufferLink, PRV_LINK_BUFFER_SIZE, head, LINK_ITEM_END, LINK_ITEM_END_SIZE);
terencez 0:3f48af28ebcd 389 parentUri.instanceId = uriP->instanceId;
terencez 0:3f48af28ebcd 390 parentUri.flag = LWM2M_URI_FLAG_INSTANCE_ID;
terencez 0:3f48af28ebcd 391 if (serverP != NULL)
terencez 0:3f48af28ebcd 392 {
terencez 0:3f48af28ebcd 393 res = prv_serializeAttributes(contextP, &parentUri, serverP, NULL, bufferLink, head - 1, PRV_LINK_BUFFER_SIZE);
terencez 0:3f48af28ebcd 394 if (res < 0) return -1; // careful, 0 is valid
terencez 0:3f48af28ebcd 395 }
terencez 0:3f48af28ebcd 396 else
terencez 0:3f48af28ebcd 397 {
terencez 0:3f48af28ebcd 398 res = 0;
terencez 0:3f48af28ebcd 399 }
terencez 0:3f48af28ebcd 400 head += res;
terencez 0:3f48af28ebcd 401 }
terencez 0:3f48af28ebcd 402 else
terencez 0:3f48af28ebcd 403 {
terencez 0:3f48af28ebcd 404 PRV_CONCAT_STR(bufferLink, PRV_LINK_BUFFER_SIZE, head, LINK_ITEM_START, LINK_ITEM_START_SIZE);
terencez 0:3f48af28ebcd 405 PRV_CONCAT_STR(bufferLink, PRV_LINK_BUFFER_SIZE, head, LINK_URI_SEPARATOR, LINK_URI_SEPARATOR_SIZE);
terencez 0:3f48af28ebcd 406 res = utils_intToText(uriP->objectId, bufferLink + head, PRV_LINK_BUFFER_SIZE - head);
terencez 0:3f48af28ebcd 407 if (res <= 0) return -1;
terencez 0:3f48af28ebcd 408 head += res;
terencez 0:3f48af28ebcd 409 PRV_CONCAT_STR(bufferLink, PRV_LINK_BUFFER_SIZE, head, LINK_ITEM_END, LINK_ITEM_END_SIZE);
terencez 0:3f48af28ebcd 410
terencez 0:3f48af28ebcd 411 if (serverP != NULL)
terencez 0:3f48af28ebcd 412 {
terencez 0:3f48af28ebcd 413 res = prv_serializeAttributes(contextP, &parentUri, serverP, NULL, bufferLink, head - 1, PRV_LINK_BUFFER_SIZE);
terencez 0:3f48af28ebcd 414 if (res < 0) return -1; // careful, 0 is valid
terencez 0:3f48af28ebcd 415 head += res;
terencez 0:3f48af28ebcd 416 }
terencez 0:3f48af28ebcd 417 }
terencez 0:3f48af28ebcd 418 }
terencez 0:3f48af28ebcd 419
terencez 0:3f48af28ebcd 420 baseUriLen = uri_toString(uriP, baseUriStr, URI_MAX_STRING_LEN, NULL);
terencez 0:3f48af28ebcd 421 if (baseUriLen < 0) return -1;
terencez 0:3f48af28ebcd 422 baseUriLen -= 1;
terencez 0:3f48af28ebcd 423
terencez 0:3f48af28ebcd 424 for (index = 0; index < size && head < PRV_LINK_BUFFER_SIZE; index++)
terencez 0:3f48af28ebcd 425 {
terencez 0:3f48af28ebcd 426 res = prv_serializeLinkData(contextP, dataP + index, serverP, paramP, uriP, baseUriStr, baseUriLen, bufferLink + head, PRV_LINK_BUFFER_SIZE - head);
terencez 0:3f48af28ebcd 427 if (res < 0) return -1;
terencez 0:3f48af28ebcd 428 head += res;
terencez 0:3f48af28ebcd 429 }
terencez 0:3f48af28ebcd 430
terencez 0:3f48af28ebcd 431 if (head > 0)
terencez 0:3f48af28ebcd 432 {
terencez 0:3f48af28ebcd 433 head -= 1;
terencez 0:3f48af28ebcd 434
terencez 0:3f48af28ebcd 435 *bufferP = (uint8_t *)lwm2m_malloc(head);
terencez 0:3f48af28ebcd 436 if (*bufferP == NULL) return 0;
terencez 0:3f48af28ebcd 437 memcpy(*bufferP, bufferLink, head);
terencez 0:3f48af28ebcd 438 }
terencez 0:3f48af28ebcd 439
terencez 0:3f48af28ebcd 440 return (int)head;
terencez 0:3f48af28ebcd 441 }
terencez 0:3f48af28ebcd 442 #endif