Toyomasa Watarai
/
Mbed-example-WS-W27
simple-mbed-cloud-client/mbed-cloud-client/mbed-client/source/m2mtlvdeserializer.cpp@0:119624335925, 2018-06-30 (annotated)
- Committer:
- MACRUM
- Date:
- Sat Jun 30 01:40:30 2018 +0000
- Revision:
- 0:119624335925
Initial commit
Who changed what in which revision?
User | Revision | Line number | New 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 | } |