Dependencies:   MMA7660 LM75B

Committer:
MACRUM
Date:
Sat Jun 30 01:40:30 2018 +0000
Revision:
0:119624335925
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MACRUM 0:119624335925 1 /*
MACRUM 0:119624335925 2 * Copyright (c) 2015 ARM Limited. All rights reserved.
MACRUM 0:119624335925 3 * SPDX-License-Identifier: Apache-2.0
MACRUM 0:119624335925 4 * Licensed under the Apache License, Version 2.0 (the License); you may
MACRUM 0:119624335925 5 * not use this file except in compliance with the License.
MACRUM 0:119624335925 6 * You may obtain a copy of the License at
MACRUM 0:119624335925 7 *
MACRUM 0:119624335925 8 * http://www.apache.org/licenses/LICENSE-2.0
MACRUM 0:119624335925 9 *
MACRUM 0:119624335925 10 * Unless required by applicable law or agreed to in writing, software
MACRUM 0:119624335925 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
MACRUM 0:119624335925 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
MACRUM 0:119624335925 13 * See the License for the specific language governing permissions and
MACRUM 0:119624335925 14 * limitations under the License.
MACRUM 0:119624335925 15 */
MACRUM 0:119624335925 16 // Needed for PRIu64 on FreeRTOS
MACRUM 0:119624335925 17 #include <stdio.h>
MACRUM 0:119624335925 18 // Note: this macro is needed on armcc to get the the limit macros like UINT16_MAX
MACRUM 0:119624335925 19 #ifndef __STDC_LIMIT_MACROS
MACRUM 0:119624335925 20 #define __STDC_LIMIT_MACROS
MACRUM 0:119624335925 21 #endif
MACRUM 0:119624335925 22
MACRUM 0:119624335925 23 // Note: this macro is needed on armcc to get the the PRI*32 macros
MACRUM 0:119624335925 24 // from inttypes.h in a C++ code.
MACRUM 0:119624335925 25 #ifndef __STDC_FORMAT_MACROS
MACRUM 0:119624335925 26 #define __STDC_FORMAT_MACROS
MACRUM 0:119624335925 27 #endif
MACRUM 0:119624335925 28
MACRUM 0:119624335925 29 #include "include/m2mtlvdeserializer.h"
MACRUM 0:119624335925 30 #include "mbed-client/m2mconstants.h"
MACRUM 0:119624335925 31 #include "mbed-trace/mbed_trace.h"
MACRUM 0:119624335925 32
MACRUM 0:119624335925 33 #define TRACE_GROUP "mClt"
MACRUM 0:119624335925 34 #define BUFFER_SIZE 10
MACRUM 0:119624335925 35
MACRUM 0:119624335925 36 bool M2MTLVDeserializer::is_object_instance(const uint8_t *tlv)
MACRUM 0:119624335925 37 {
MACRUM 0:119624335925 38 return is_object_instance(tlv, 0);
MACRUM 0:119624335925 39 }
MACRUM 0:119624335925 40
MACRUM 0:119624335925 41 bool M2MTLVDeserializer::is_resource(const uint8_t *tlv)
MACRUM 0:119624335925 42 {
MACRUM 0:119624335925 43 return is_resource(tlv, 0);
MACRUM 0:119624335925 44 }
MACRUM 0:119624335925 45
MACRUM 0:119624335925 46 bool M2MTLVDeserializer::is_multiple_resource(const uint8_t *tlv)
MACRUM 0:119624335925 47 {
MACRUM 0:119624335925 48 return is_multiple_resource(tlv, 0);
MACRUM 0:119624335925 49 }
MACRUM 0:119624335925 50
MACRUM 0:119624335925 51 bool M2MTLVDeserializer::is_resource_instance(const uint8_t *tlv)
MACRUM 0:119624335925 52 {
MACRUM 0:119624335925 53 return is_resource_instance(tlv, 0);
MACRUM 0:119624335925 54 }
MACRUM 0:119624335925 55
MACRUM 0:119624335925 56 M2MTLVDeserializer::Error M2MTLVDeserializer::deserialise_object_instances(const uint8_t* tlv,
MACRUM 0:119624335925 57 uint32_t tlv_size,
MACRUM 0:119624335925 58 M2MObject &object,
MACRUM 0:119624335925 59 M2MTLVDeserializer::Operation operation)
MACRUM 0:119624335925 60 {
MACRUM 0:119624335925 61 M2MTLVDeserializer::Error error = M2MTLVDeserializer::None;
MACRUM 0:119624335925 62 if (is_object_instance(tlv) ) {
MACRUM 0:119624335925 63 tr_debug("M2MTLVDeserializer::deserialise_object_instances");
MACRUM 0:119624335925 64 error = deserialize_object_instances(tlv, tlv_size, 0, object,operation,false);
MACRUM 0:119624335925 65 if(M2MTLVDeserializer::None == error) {
MACRUM 0:119624335925 66 error = deserialize_object_instances(tlv, tlv_size, 0, object,operation,true);
MACRUM 0:119624335925 67 }
MACRUM 0:119624335925 68 } else {
MACRUM 0:119624335925 69 tr_debug("M2MTLVDeserializer::deserialise_object_instances ::NotValid");
MACRUM 0:119624335925 70 error = M2MTLVDeserializer::NotValid;
MACRUM 0:119624335925 71 }
MACRUM 0:119624335925 72 return error;
MACRUM 0:119624335925 73 }
MACRUM 0:119624335925 74
MACRUM 0:119624335925 75 M2MTLVDeserializer::Error M2MTLVDeserializer::deserialize_resources(const uint8_t *tlv,
MACRUM 0:119624335925 76 uint32_t tlv_size,
MACRUM 0:119624335925 77 M2MObjectInstance &object_instance,
MACRUM 0:119624335925 78 M2MTLVDeserializer::Operation operation)
MACRUM 0:119624335925 79 {
MACRUM 0:119624335925 80 M2MTLVDeserializer::Error error = M2MTLVDeserializer::None;
MACRUM 0:119624335925 81 if (!is_resource(tlv) && !is_multiple_resource(tlv)) {
MACRUM 0:119624335925 82 error = M2MTLVDeserializer::NotValid;
MACRUM 0:119624335925 83 } else {
MACRUM 0:119624335925 84 error = deserialize_resources(tlv, tlv_size, 0, object_instance, operation,false);
MACRUM 0:119624335925 85 if(M2MTLVDeserializer::None == error) {
MACRUM 0:119624335925 86 if (M2MTLVDeserializer::Put == operation) {
MACRUM 0:119624335925 87 remove_resources(tlv, tlv_size, object_instance, 0);
MACRUM 0:119624335925 88 }
MACRUM 0:119624335925 89 error = deserialize_resources(tlv, tlv_size, 0, object_instance, operation,true);
MACRUM 0:119624335925 90 }
MACRUM 0:119624335925 91 }
MACRUM 0:119624335925 92 return error;
MACRUM 0:119624335925 93 }
MACRUM 0:119624335925 94
MACRUM 0:119624335925 95 M2MTLVDeserializer::Error M2MTLVDeserializer::deserialize_resource_instances(const uint8_t *tlv,
MACRUM 0:119624335925 96 uint32_t tlv_size,
MACRUM 0:119624335925 97 M2MResource &resource,
MACRUM 0:119624335925 98 M2MTLVDeserializer::Operation operation)
MACRUM 0:119624335925 99 {
MACRUM 0:119624335925 100 M2MTLVDeserializer::Error error = M2MTLVDeserializer::None;
MACRUM 0:119624335925 101 if (!is_multiple_resource(tlv)) {
MACRUM 0:119624335925 102 error = M2MTLVDeserializer::NotValid;
MACRUM 0:119624335925 103 } else {
MACRUM 0:119624335925 104 tr_debug("M2MTLVDeserializer::deserialize_resource_instances()");
MACRUM 0:119624335925 105 uint8_t offset = 2;
MACRUM 0:119624335925 106
MACRUM 0:119624335925 107 ((tlv[0] & 0x20) == 0) ? offset : offset++;
MACRUM 0:119624335925 108
MACRUM 0:119624335925 109 uint8_t length = tlv[0] & 0x18;
MACRUM 0:119624335925 110 if(length == 0x08) {
MACRUM 0:119624335925 111 offset += 1;
MACRUM 0:119624335925 112 } else if(length == 0x10) {
MACRUM 0:119624335925 113 offset += 2;
MACRUM 0:119624335925 114 } else if(length == 0x18) {
MACRUM 0:119624335925 115 offset += 3;
MACRUM 0:119624335925 116 }
MACRUM 0:119624335925 117
MACRUM 0:119624335925 118 tr_debug("M2MTLVDeserializer::deserialize_resource_instances() Offset %d", offset);
MACRUM 0:119624335925 119 error = deserialize_resource_instances(tlv, tlv_size, offset, resource, operation,false);
MACRUM 0:119624335925 120 if(M2MTLVDeserializer::None == error) {
MACRUM 0:119624335925 121 if (M2MTLVDeserializer::Put == operation) {
MACRUM 0:119624335925 122 remove_resource_instances(tlv, tlv_size, resource, offset);
MACRUM 0:119624335925 123 }
MACRUM 0:119624335925 124 error = deserialize_resource_instances(tlv, tlv_size, offset, resource, operation,true);
MACRUM 0:119624335925 125 }
MACRUM 0:119624335925 126 }
MACRUM 0:119624335925 127 return error;
MACRUM 0:119624335925 128 }
MACRUM 0:119624335925 129
MACRUM 0:119624335925 130 M2MTLVDeserializer::Error M2MTLVDeserializer::deserialize_object_instances(const uint8_t *tlv,
MACRUM 0:119624335925 131 uint32_t tlv_size,
MACRUM 0:119624335925 132 uint32_t offset,
MACRUM 0:119624335925 133 M2MObject &object,
MACRUM 0:119624335925 134 M2MTLVDeserializer::Operation operation,
MACRUM 0:119624335925 135 bool update_value)
MACRUM 0:119624335925 136 {
MACRUM 0:119624335925 137 tr_debug("M2MTLVDeserializer::deserialize_object_instances()");
MACRUM 0:119624335925 138 M2MTLVDeserializer::Error error = M2MTLVDeserializer::None;
MACRUM 0:119624335925 139 TypeIdLength til(tlv, offset);
MACRUM 0:119624335925 140 til.deserialize();
MACRUM 0:119624335925 141 offset = til._offset;
MACRUM 0:119624335925 142
MACRUM 0:119624335925 143 const M2MObjectInstanceList &list = object.instances();
MACRUM 0:119624335925 144 M2MObjectInstanceList::const_iterator it;
MACRUM 0:119624335925 145 it = list.begin();
MACRUM 0:119624335925 146
MACRUM 0:119624335925 147 if (TYPE_OBJECT_INSTANCE == til._type) {
MACRUM 0:119624335925 148 for (; it!=list.end(); it++) {
MACRUM 0:119624335925 149 if((*it)->instance_id() == til._id) {
MACRUM 0:119624335925 150 error = deserialize_resources(tlv, tlv_size, offset, (**it),operation, update_value);
MACRUM 0:119624335925 151 }
MACRUM 0:119624335925 152 }
MACRUM 0:119624335925 153 offset += til._length;
MACRUM 0:119624335925 154
MACRUM 0:119624335925 155 if(offset < tlv_size) {
MACRUM 0:119624335925 156 error = deserialize_object_instances(tlv, tlv_size, offset, object, operation, update_value);
MACRUM 0:119624335925 157 }
MACRUM 0:119624335925 158 }
MACRUM 0:119624335925 159 return error;
MACRUM 0:119624335925 160 }
MACRUM 0:119624335925 161
MACRUM 0:119624335925 162 M2MTLVDeserializer::Error M2MTLVDeserializer::deserialize_resources(const uint8_t *tlv,
MACRUM 0:119624335925 163 uint32_t tlv_size,
MACRUM 0:119624335925 164 uint32_t offset,
MACRUM 0:119624335925 165 M2MObjectInstance &object_instance,
MACRUM 0:119624335925 166 M2MTLVDeserializer::Operation operation,
MACRUM 0:119624335925 167 bool update_value)
MACRUM 0:119624335925 168 {
MACRUM 0:119624335925 169 tr_debug("M2MTLVDeserializer::deserialize_resources()");
MACRUM 0:119624335925 170 M2MTLVDeserializer::Error error = M2MTLVDeserializer::None;
MACRUM 0:119624335925 171 TypeIdLength til(tlv, offset);
MACRUM 0:119624335925 172 til.deserialize();
MACRUM 0:119624335925 173 offset = til._offset;
MACRUM 0:119624335925 174
MACRUM 0:119624335925 175 const M2MResourceList &list = object_instance.resources();
MACRUM 0:119624335925 176 M2MResourceList::const_iterator it;
MACRUM 0:119624335925 177 it = list.begin();
MACRUM 0:119624335925 178
MACRUM 0:119624335925 179 bool found = false;
MACRUM 0:119624335925 180 bool multi = false;
MACRUM 0:119624335925 181 if (TYPE_RESOURCE == til._type || TYPE_RESOURCE_INSTANCE == til._type) {
MACRUM 0:119624335925 182 multi = false;
MACRUM 0:119624335925 183 for (; it!=list.end(); it++) {
MACRUM 0:119624335925 184 if((*it)->name_id() == til._id){
MACRUM 0:119624335925 185 tr_debug("M2MTLVDeserializer::deserialize_resources() - Resource ID %d ", til._id);
MACRUM 0:119624335925 186 found = true;
MACRUM 0:119624335925 187 if(update_value) {
MACRUM 0:119624335925 188 if(til._length > 0) {
MACRUM 0:119624335925 189 tr_debug("M2MTLVDeserializer::deserialize_resources() - Update value");
MACRUM 0:119624335925 190 if (!set_resource_instance_value((*it), tlv+offset, til._length)) {
MACRUM 0:119624335925 191 error = M2MTLVDeserializer::OutOfMemory;
MACRUM 0:119624335925 192 break;
MACRUM 0:119624335925 193 }
MACRUM 0:119624335925 194 } else {
MACRUM 0:119624335925 195 tr_debug("M2MTLVDeserializer::deserialize_resources() - Clear Value");
MACRUM 0:119624335925 196 (*it)->clear_value();
MACRUM 0:119624335925 197 }
MACRUM 0:119624335925 198 break;
MACRUM 0:119624335925 199 } else if(0 == ((*it)->operation() & SN_GRS_PUT_ALLOWED)) {
MACRUM 0:119624335925 200 tr_debug("M2MTLVDeserializer::deserialize_resources() - NOT_ALLOWED");
MACRUM 0:119624335925 201 error = M2MTLVDeserializer::NotAllowed;
MACRUM 0:119624335925 202 break;
MACRUM 0:119624335925 203 }
MACRUM 0:119624335925 204 }
MACRUM 0:119624335925 205 }
MACRUM 0:119624335925 206 } else if (TYPE_MULTIPLE_RESOURCE == til._type) {
MACRUM 0:119624335925 207 multi = true;
MACRUM 0:119624335925 208 for (; it!=list.end(); it++) {
MACRUM 0:119624335925 209 if((*it)->supports_multiple_instances() &&
MACRUM 0:119624335925 210 (*it)->name_id() == til._id) {
MACRUM 0:119624335925 211 found = true;
MACRUM 0:119624335925 212 error = deserialize_resource_instances(tlv, tlv_size, offset, (**it), object_instance, operation, update_value);
MACRUM 0:119624335925 213 }
MACRUM 0:119624335925 214 }
MACRUM 0:119624335925 215 } else {
MACRUM 0:119624335925 216 error = M2MTLVDeserializer::NotValid;
MACRUM 0:119624335925 217 return error;
MACRUM 0:119624335925 218 }
MACRUM 0:119624335925 219
MACRUM 0:119624335925 220 if(!found) {
MACRUM 0:119624335925 221 if(M2MTLVDeserializer::Post == operation) {
MACRUM 0:119624335925 222 //Create a new Resource
MACRUM 0:119624335925 223 String id;
MACRUM 0:119624335925 224 id.append_int(til._id);
MACRUM 0:119624335925 225 M2MResource *resource = object_instance.create_dynamic_resource(id,"",M2MResourceInstance::OPAQUE,true,multi);
MACRUM 0:119624335925 226 if(resource) {
MACRUM 0:119624335925 227 resource->set_operation(M2MBase::GET_PUT_POST_DELETE_ALLOWED);
MACRUM 0:119624335925 228 }
MACRUM 0:119624335925 229 if( TYPE_MULTIPLE_RESOURCE == til._type ) {
MACRUM 0:119624335925 230 error = deserialize_resource_instances(tlv, tlv_size, offset, (*resource), object_instance, operation, update_value);
MACRUM 0:119624335925 231 }
MACRUM 0:119624335925 232 } else if(M2MTLVDeserializer::Put == operation) {
MACRUM 0:119624335925 233 error = M2MTLVDeserializer::NotFound;
MACRUM 0:119624335925 234 }
MACRUM 0:119624335925 235 }
MACRUM 0:119624335925 236
MACRUM 0:119624335925 237
MACRUM 0:119624335925 238 offset += til._length;
MACRUM 0:119624335925 239
MACRUM 0:119624335925 240 if(offset < tlv_size) {
MACRUM 0:119624335925 241 error = deserialize_resources(tlv, tlv_size, offset, object_instance, operation, update_value);
MACRUM 0:119624335925 242 }
MACRUM 0:119624335925 243 return error;
MACRUM 0:119624335925 244 }
MACRUM 0:119624335925 245
MACRUM 0:119624335925 246 M2MTLVDeserializer::Error M2MTLVDeserializer::deserialize_resource_instances(const uint8_t *tlv,
MACRUM 0:119624335925 247 uint32_t tlv_size,
MACRUM 0:119624335925 248 uint32_t offset,
MACRUM 0:119624335925 249 M2MResource &resource,
MACRUM 0:119624335925 250 M2MObjectInstance &object_instance,
MACRUM 0:119624335925 251 M2MTLVDeserializer::Operation operation,
MACRUM 0:119624335925 252 bool update_value)
MACRUM 0:119624335925 253 {
MACRUM 0:119624335925 254 M2MTLVDeserializer::Error error = M2MTLVDeserializer::None;
MACRUM 0:119624335925 255 TypeIdLength til(tlv, offset);
MACRUM 0:119624335925 256 til.deserialize();
MACRUM 0:119624335925 257 offset = til._offset;
MACRUM 0:119624335925 258
MACRUM 0:119624335925 259 if (TYPE_MULTIPLE_RESOURCE == til._type || TYPE_RESOURCE_INSTANCE == til._type) {
MACRUM 0:119624335925 260 const M2MResourceInstanceList &list = resource.resource_instances();
MACRUM 0:119624335925 261 M2MResourceInstanceList::const_iterator it;
MACRUM 0:119624335925 262 it = list.begin();
MACRUM 0:119624335925 263 bool found = false;
MACRUM 0:119624335925 264 for (; it!=list.end(); it++) {
MACRUM 0:119624335925 265 if((*it)->instance_id() == til._id && TYPE_RESOURCE_INSTANCE == til._type) {
MACRUM 0:119624335925 266 found = true;
MACRUM 0:119624335925 267 if(update_value) {
MACRUM 0:119624335925 268 if(til._length > 0) {
MACRUM 0:119624335925 269 if (!set_resource_instance_value((*it), tlv+offset, til._length)) {
MACRUM 0:119624335925 270 error = M2MTLVDeserializer::OutOfMemory;
MACRUM 0:119624335925 271 break;
MACRUM 0:119624335925 272 }
MACRUM 0:119624335925 273 } else {
MACRUM 0:119624335925 274 (*it)->clear_value();
MACRUM 0:119624335925 275 }
MACRUM 0:119624335925 276 break;
MACRUM 0:119624335925 277 } else if(0 == ((*it)->operation() & SN_GRS_PUT_ALLOWED)) {
MACRUM 0:119624335925 278 error = M2MTLVDeserializer::NotAllowed;
MACRUM 0:119624335925 279 break;
MACRUM 0:119624335925 280 }
MACRUM 0:119624335925 281 }
MACRUM 0:119624335925 282 }
MACRUM 0:119624335925 283
MACRUM 0:119624335925 284 if(!found) {
MACRUM 0:119624335925 285 if(M2MTLVDeserializer::Post == operation) {
MACRUM 0:119624335925 286 // Create a new Resource Instance
MACRUM 0:119624335925 287 M2MResourceInstance *res_instance = object_instance.create_dynamic_resource_instance(resource.name(),"",
MACRUM 0:119624335925 288 resource.resource_instance_type(),
MACRUM 0:119624335925 289 true,
MACRUM 0:119624335925 290 til._id);
MACRUM 0:119624335925 291 if(res_instance) {
MACRUM 0:119624335925 292 res_instance->set_operation(M2MBase::GET_PUT_POST_DELETE_ALLOWED);
MACRUM 0:119624335925 293 }
MACRUM 0:119624335925 294 } else if(M2MTLVDeserializer::Put == operation) {
MACRUM 0:119624335925 295 error = M2MTLVDeserializer::NotFound;
MACRUM 0:119624335925 296 }
MACRUM 0:119624335925 297 }
MACRUM 0:119624335925 298 } else {
MACRUM 0:119624335925 299 error = M2MTLVDeserializer::NotValid;
MACRUM 0:119624335925 300 return error;
MACRUM 0:119624335925 301 }
MACRUM 0:119624335925 302
MACRUM 0:119624335925 303 offset += til._length;
MACRUM 0:119624335925 304
MACRUM 0:119624335925 305 if(offset < tlv_size) {
MACRUM 0:119624335925 306 error = deserialize_resource_instances(tlv, tlv_size, offset, resource, object_instance, operation, update_value);
MACRUM 0:119624335925 307 }
MACRUM 0:119624335925 308 return error;
MACRUM 0:119624335925 309 }
MACRUM 0:119624335925 310
MACRUM 0:119624335925 311 M2MTLVDeserializer::Error M2MTLVDeserializer::deserialize_resource_instances(const uint8_t *tlv,
MACRUM 0:119624335925 312 uint32_t tlv_size,
MACRUM 0:119624335925 313 uint32_t offset,
MACRUM 0:119624335925 314 M2MResource &resource,
MACRUM 0:119624335925 315 M2MTLVDeserializer::Operation operation,
MACRUM 0:119624335925 316 bool update_value)
MACRUM 0:119624335925 317 {
MACRUM 0:119624335925 318 M2MTLVDeserializer::Error error = M2MTLVDeserializer::None;
MACRUM 0:119624335925 319 TypeIdLength til(tlv, offset);
MACRUM 0:119624335925 320 til.deserialize();
MACRUM 0:119624335925 321 offset = til._offset;
MACRUM 0:119624335925 322
MACRUM 0:119624335925 323 if (TYPE_RESOURCE_INSTANCE == til._type) {
MACRUM 0:119624335925 324 const M2MResourceInstanceList &list = resource.resource_instances();
MACRUM 0:119624335925 325 M2MResourceInstanceList::const_iterator it;
MACRUM 0:119624335925 326 it = list.begin();
MACRUM 0:119624335925 327 bool found = false;
MACRUM 0:119624335925 328 for (; it!=list.end(); it++) {
MACRUM 0:119624335925 329 if((*it)->instance_id() == til._id) {
MACRUM 0:119624335925 330 found = true;
MACRUM 0:119624335925 331 if(update_value) {
MACRUM 0:119624335925 332 if(til._length > 0) {
MACRUM 0:119624335925 333 if (!set_resource_instance_value((*it),tlv+offset, til._length)) {
MACRUM 0:119624335925 334 error = M2MTLVDeserializer::OutOfMemory;
MACRUM 0:119624335925 335 break;
MACRUM 0:119624335925 336 }
MACRUM 0:119624335925 337 } else {
MACRUM 0:119624335925 338 (*it)->clear_value();
MACRUM 0:119624335925 339 }
MACRUM 0:119624335925 340 break;
MACRUM 0:119624335925 341 } else if(0 == ((*it)->operation() & SN_GRS_PUT_ALLOWED)) {
MACRUM 0:119624335925 342 error = M2MTLVDeserializer::NotAllowed;
MACRUM 0:119624335925 343 break;
MACRUM 0:119624335925 344 }
MACRUM 0:119624335925 345 }
MACRUM 0:119624335925 346 }
MACRUM 0:119624335925 347 if(!found) {
MACRUM 0:119624335925 348 if(M2MTLVDeserializer::Post == operation) {
MACRUM 0:119624335925 349 error = M2MTLVDeserializer::NotAllowed;
MACRUM 0:119624335925 350 } else if(M2MTLVDeserializer::Put == operation) {
MACRUM 0:119624335925 351 error = M2MTLVDeserializer::NotFound;
MACRUM 0:119624335925 352 }
MACRUM 0:119624335925 353 }
MACRUM 0:119624335925 354 } else {
MACRUM 0:119624335925 355 error = M2MTLVDeserializer::NotValid;
MACRUM 0:119624335925 356 return error;
MACRUM 0:119624335925 357 }
MACRUM 0:119624335925 358
MACRUM 0:119624335925 359 offset += til._length;
MACRUM 0:119624335925 360
MACRUM 0:119624335925 361 if(offset < tlv_size) {
MACRUM 0:119624335925 362 error = deserialize_resource_instances(tlv, tlv_size, offset, resource, operation, update_value);
MACRUM 0:119624335925 363 }
MACRUM 0:119624335925 364 return error;
MACRUM 0:119624335925 365 }
MACRUM 0:119624335925 366
MACRUM 0:119624335925 367 bool M2MTLVDeserializer::is_object_instance(const uint8_t *tlv, uint32_t offset)
MACRUM 0:119624335925 368 {
MACRUM 0:119624335925 369 bool ret = false;
MACRUM 0:119624335925 370 if (tlv) {
MACRUM 0:119624335925 371 uint8_t value = tlv[offset];
MACRUM 0:119624335925 372 ret = (TYPE_OBJECT_INSTANCE == (value & TYPE_RESOURCE));
MACRUM 0:119624335925 373 }
MACRUM 0:119624335925 374 return ret;
MACRUM 0:119624335925 375 }
MACRUM 0:119624335925 376
MACRUM 0:119624335925 377 uint16_t M2MTLVDeserializer::instance_id(const uint8_t *tlv)
MACRUM 0:119624335925 378 {
MACRUM 0:119624335925 379 TypeIdLength til(tlv, 0);
MACRUM 0:119624335925 380 til.deserialize();
MACRUM 0:119624335925 381 uint16_t id = til._id;
MACRUM 0:119624335925 382 return id;
MACRUM 0:119624335925 383 }
MACRUM 0:119624335925 384
MACRUM 0:119624335925 385 bool M2MTLVDeserializer::is_resource(const uint8_t *tlv, uint32_t offset)
MACRUM 0:119624335925 386 {
MACRUM 0:119624335925 387 bool ret = false;
MACRUM 0:119624335925 388 if (tlv) {
MACRUM 0:119624335925 389 ret = (TYPE_RESOURCE == (tlv[offset] & TYPE_RESOURCE));
MACRUM 0:119624335925 390 }
MACRUM 0:119624335925 391 return ret;
MACRUM 0:119624335925 392 }
MACRUM 0:119624335925 393
MACRUM 0:119624335925 394 bool M2MTLVDeserializer::is_multiple_resource(const uint8_t *tlv, uint32_t offset)
MACRUM 0:119624335925 395 {
MACRUM 0:119624335925 396 bool ret = false;
MACRUM 0:119624335925 397 if (tlv) {
MACRUM 0:119624335925 398 ret = (TYPE_MULTIPLE_RESOURCE == (tlv[offset] & TYPE_RESOURCE));
MACRUM 0:119624335925 399 }
MACRUM 0:119624335925 400 return ret;
MACRUM 0:119624335925 401 }
MACRUM 0:119624335925 402
MACRUM 0:119624335925 403 bool M2MTLVDeserializer::is_resource_instance(const uint8_t *tlv, uint32_t offset)
MACRUM 0:119624335925 404 {
MACRUM 0:119624335925 405 bool ret = false;
MACRUM 0:119624335925 406 if (tlv) {
MACRUM 0:119624335925 407 ret = (TYPE_RESOURCE_INSTANCE == (tlv[offset] & TYPE_RESOURCE));
MACRUM 0:119624335925 408 }
MACRUM 0:119624335925 409 return ret;
MACRUM 0:119624335925 410 }
MACRUM 0:119624335925 411
MACRUM 0:119624335925 412 bool M2MTLVDeserializer::set_resource_instance_value(M2MResourceBase *res, const uint8_t *tlv, const uint32_t size)
MACRUM 0:119624335925 413 {
MACRUM 0:119624335925 414 int64_t value = 0;
MACRUM 0:119624335925 415 bool success = true;
MACRUM 0:119624335925 416 switch (res->resource_instance_type()) {
MACRUM 0:119624335925 417 case M2MResourceBase::INTEGER:
MACRUM 0:119624335925 418 case M2MResourceBase::BOOLEAN:
MACRUM 0:119624335925 419 case M2MResourceBase::TIME:
MACRUM 0:119624335925 420 value = String::convert_array_to_integer(tlv, size);
MACRUM 0:119624335925 421 if (!res->set_value(value)) {
MACRUM 0:119624335925 422 success = false;
MACRUM 0:119624335925 423 }
MACRUM 0:119624335925 424 break;
MACRUM 0:119624335925 425 // Todo! implement conversion for other types as well
MACRUM 0:119624335925 426 case M2MResourceBase::STRING:
MACRUM 0:119624335925 427 case M2MResourceBase::FLOAT:
MACRUM 0:119624335925 428 case M2MResourceBase::OPAQUE:
MACRUM 0:119624335925 429 case M2MResourceBase::OBJLINK:
MACRUM 0:119624335925 430 if (!res->set_value(tlv, size)) {
MACRUM 0:119624335925 431 success = false;
MACRUM 0:119624335925 432 }
MACRUM 0:119624335925 433 break;
MACRUM 0:119624335925 434 default:
MACRUM 0:119624335925 435 break;
MACRUM 0:119624335925 436 }
MACRUM 0:119624335925 437
MACRUM 0:119624335925 438 return success;
MACRUM 0:119624335925 439 }
MACRUM 0:119624335925 440
MACRUM 0:119624335925 441 void M2MTLVDeserializer::remove_resources(const uint8_t *tlv,
MACRUM 0:119624335925 442 uint32_t tlv_size,
MACRUM 0:119624335925 443 M2MObjectInstance &object_instance,
MACRUM 0:119624335925 444 uint32_t offset_size)
MACRUM 0:119624335925 445 {
MACRUM 0:119624335925 446 tr_debug("M2MTLVDeserializer::remove_resources");
MACRUM 0:119624335925 447 uint32_t offset = offset_size;
MACRUM 0:119624335925 448 const M2MResourceList &list = object_instance.resources();
MACRUM 0:119624335925 449 M2MResourceList::const_iterator it;
MACRUM 0:119624335925 450
MACRUM 0:119624335925 451 it = list.begin();
MACRUM 0:119624335925 452 for (; it!=list.end();) {
MACRUM 0:119624335925 453 bool found = false;
MACRUM 0:119624335925 454 while(offset < tlv_size) {
MACRUM 0:119624335925 455 TypeIdLength til(tlv, offset);
MACRUM 0:119624335925 456 til.deserialize();
MACRUM 0:119624335925 457 offset = til._offset;
MACRUM 0:119624335925 458 offset += til._length;
MACRUM 0:119624335925 459 if((*it)->name_id() == til._id){
MACRUM 0:119624335925 460 offset = offset_size;
MACRUM 0:119624335925 461 found = true;
MACRUM 0:119624335925 462 break;
MACRUM 0:119624335925 463 }
MACRUM 0:119624335925 464 }
MACRUM 0:119624335925 465 offset = offset_size;
MACRUM 0:119624335925 466
MACRUM 0:119624335925 467 // Remove resource if not part of the TLV message
MACRUM 0:119624335925 468 if (!found) {
MACRUM 0:119624335925 469 tr_debug("M2MTLVDeserializer::remove_resources - remove resource %" PRId32, (*it)->name_id());
MACRUM 0:119624335925 470 object_instance.remove_resource((*it)->name());
MACRUM 0:119624335925 471 } else {
MACRUM 0:119624335925 472 ++it;
MACRUM 0:119624335925 473 }
MACRUM 0:119624335925 474 }
MACRUM 0:119624335925 475 }
MACRUM 0:119624335925 476
MACRUM 0:119624335925 477 void M2MTLVDeserializer::remove_resource_instances(const uint8_t *tlv,
MACRUM 0:119624335925 478 uint32_t tlv_size,
MACRUM 0:119624335925 479 M2MResource &resource,
MACRUM 0:119624335925 480 uint32_t offset_size)
MACRUM 0:119624335925 481 {
MACRUM 0:119624335925 482 tr_debug("M2MTLVDeserializer::remove_resource_instances");
MACRUM 0:119624335925 483 uint32_t offset = offset_size;
MACRUM 0:119624335925 484 const M2MResourceInstanceList &list = resource.resource_instances();
MACRUM 0:119624335925 485 M2MResourceInstanceList::const_iterator it;
MACRUM 0:119624335925 486 it = list.begin();
MACRUM 0:119624335925 487
MACRUM 0:119624335925 488 for (; it!=list.end();) {
MACRUM 0:119624335925 489 bool found = false;
MACRUM 0:119624335925 490 while (offset < tlv_size) {
MACRUM 0:119624335925 491 TypeIdLength til(tlv, offset);
MACRUM 0:119624335925 492 til.deserialize();
MACRUM 0:119624335925 493 offset = til._offset;
MACRUM 0:119624335925 494 offset += til._length;
MACRUM 0:119624335925 495 if ((*it)->instance_id() == til._id){
MACRUM 0:119624335925 496 offset = offset_size;
MACRUM 0:119624335925 497 found = true;
MACRUM 0:119624335925 498 break;
MACRUM 0:119624335925 499 }
MACRUM 0:119624335925 500 }
MACRUM 0:119624335925 501 offset = offset_size;
MACRUM 0:119624335925 502
MACRUM 0:119624335925 503 // Remove resource instance if not part of the TLV message
MACRUM 0:119624335925 504 if (!found) {
MACRUM 0:119624335925 505 tr_debug("M2MTLVDeserializer::remove_resource_instances - remove resource instance %d", (*it)->instance_id());
MACRUM 0:119624335925 506 resource.remove_resource_instance((*it)->instance_id());
MACRUM 0:119624335925 507 } else {
MACRUM 0:119624335925 508 ++it;
MACRUM 0:119624335925 509 }
MACRUM 0:119624335925 510 }
MACRUM 0:119624335925 511 }
MACRUM 0:119624335925 512
MACRUM 0:119624335925 513 TypeIdLength::TypeIdLength(const uint8_t *tlv, uint32_t offset)
MACRUM 0:119624335925 514 : _tlv(tlv), _offset(offset), _type(tlv[offset] & 0xC0), _id(0), _length(0)
MACRUM 0:119624335925 515 {
MACRUM 0:119624335925 516 }
MACRUM 0:119624335925 517
MACRUM 0:119624335925 518 void TypeIdLength::deserialize()
MACRUM 0:119624335925 519 {
MACRUM 0:119624335925 520 uint32_t idLength = _tlv[_offset] & ID16;
MACRUM 0:119624335925 521 uint32_t lengthType = _tlv[_offset] & LENGTH24;
MACRUM 0:119624335925 522 if (0 == lengthType) {
MACRUM 0:119624335925 523 _length = _tlv[_offset] & 0x07;
MACRUM 0:119624335925 524 }
MACRUM 0:119624335925 525 _offset++;
MACRUM 0:119624335925 526
MACRUM 0:119624335925 527 deserialiseID(idLength);
MACRUM 0:119624335925 528 deserialiseLength(lengthType);
MACRUM 0:119624335925 529 }
MACRUM 0:119624335925 530
MACRUM 0:119624335925 531 void TypeIdLength::deserialiseID(uint32_t idLength)
MACRUM 0:119624335925 532 {
MACRUM 0:119624335925 533 _id = _tlv[_offset++] & 0xFF;
MACRUM 0:119624335925 534 if (ID16 == idLength) {
MACRUM 0:119624335925 535 _id = (_id << 8) + (_tlv[_offset++] & 0xFF);
MACRUM 0:119624335925 536 }
MACRUM 0:119624335925 537 }
MACRUM 0:119624335925 538
MACRUM 0:119624335925 539 void TypeIdLength::deserialiseLength(uint32_t lengthType)
MACRUM 0:119624335925 540 {
MACRUM 0:119624335925 541 if (lengthType > 0) {
MACRUM 0:119624335925 542 _length = _tlv[_offset++] & 0xFF;
MACRUM 0:119624335925 543 }
MACRUM 0:119624335925 544 if (lengthType > LENGTH8) {
MACRUM 0:119624335925 545 _length = (_length << 8) + (_tlv[_offset++] & 0xFF);
MACRUM 0:119624335925 546 }
MACRUM 0:119624335925 547 if (lengthType > LENGTH16) {
MACRUM 0:119624335925 548 _length = (_length << 8) + (_tlv[_offset++] & 0xFF);
MACRUM 0:119624335925 549 }
MACRUM 0:119624335925 550 }