FRDM K64F Metronome

Committer:
ram54288
Date:
Sun May 14 18:35:07 2017 +0000
Revision:
0:a2cb7295a1f7
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ram54288 0:a2cb7295a1f7 1 /*
ram54288 0:a2cb7295a1f7 2 * Copyright (c) 2015 ARM Limited. All rights reserved.
ram54288 0:a2cb7295a1f7 3 * SPDX-License-Identifier: Apache-2.0
ram54288 0:a2cb7295a1f7 4 * Licensed under the Apache License, Version 2.0 (the License); you may
ram54288 0:a2cb7295a1f7 5 * not use this file except in compliance with the License.
ram54288 0:a2cb7295a1f7 6 * You may obtain a copy of the License at
ram54288 0:a2cb7295a1f7 7 *
ram54288 0:a2cb7295a1f7 8 * http://www.apache.org/licenses/LICENSE-2.0
ram54288 0:a2cb7295a1f7 9 *
ram54288 0:a2cb7295a1f7 10 * Unless required by applicable law or agreed to in writing, software
ram54288 0:a2cb7295a1f7 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
ram54288 0:a2cb7295a1f7 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
ram54288 0:a2cb7295a1f7 13 * See the License for the specific language governing permissions and
ram54288 0:a2cb7295a1f7 14 * limitations under the License.
ram54288 0:a2cb7295a1f7 15 */
ram54288 0:a2cb7295a1f7 16 #include "include/m2mtlvdeserializer.h"
ram54288 0:a2cb7295a1f7 17 #include "mbed-client/m2mconstants.h"
ram54288 0:a2cb7295a1f7 18 #include "include/nsdllinker.h"
ram54288 0:a2cb7295a1f7 19 #include "mbed-trace/mbed_trace.h"
ram54288 0:a2cb7295a1f7 20
ram54288 0:a2cb7295a1f7 21 #define TRACE_GROUP "mClt"
ram54288 0:a2cb7295a1f7 22 #define BUFFER_SIZE 10
ram54288 0:a2cb7295a1f7 23
ram54288 0:a2cb7295a1f7 24 M2MTLVDeserializer::M2MTLVDeserializer()
ram54288 0:a2cb7295a1f7 25 {
ram54288 0:a2cb7295a1f7 26 }
ram54288 0:a2cb7295a1f7 27
ram54288 0:a2cb7295a1f7 28 M2MTLVDeserializer::~M2MTLVDeserializer()
ram54288 0:a2cb7295a1f7 29 {
ram54288 0:a2cb7295a1f7 30 }
ram54288 0:a2cb7295a1f7 31
ram54288 0:a2cb7295a1f7 32 bool M2MTLVDeserializer::is_object_instance(uint8_t *tlv)
ram54288 0:a2cb7295a1f7 33 {
ram54288 0:a2cb7295a1f7 34 return is_object_instance(tlv, 0);
ram54288 0:a2cb7295a1f7 35 }
ram54288 0:a2cb7295a1f7 36
ram54288 0:a2cb7295a1f7 37 bool M2MTLVDeserializer::is_resource(uint8_t *tlv)
ram54288 0:a2cb7295a1f7 38 {
ram54288 0:a2cb7295a1f7 39 return is_resource(tlv, 0);
ram54288 0:a2cb7295a1f7 40 }
ram54288 0:a2cb7295a1f7 41
ram54288 0:a2cb7295a1f7 42 bool M2MTLVDeserializer::is_multiple_resource(uint8_t *tlv)
ram54288 0:a2cb7295a1f7 43 {
ram54288 0:a2cb7295a1f7 44 return is_multiple_resource(tlv, 0);
ram54288 0:a2cb7295a1f7 45 }
ram54288 0:a2cb7295a1f7 46
ram54288 0:a2cb7295a1f7 47 bool M2MTLVDeserializer::is_resource_instance(uint8_t *tlv)
ram54288 0:a2cb7295a1f7 48 {
ram54288 0:a2cb7295a1f7 49 return is_resource_instance(tlv, 0);
ram54288 0:a2cb7295a1f7 50 }
ram54288 0:a2cb7295a1f7 51
ram54288 0:a2cb7295a1f7 52 M2MTLVDeserializer::Error M2MTLVDeserializer::deserialise_object_instances(uint8_t* tlv,
ram54288 0:a2cb7295a1f7 53 uint32_t tlv_size,
ram54288 0:a2cb7295a1f7 54 M2MObject &object,
ram54288 0:a2cb7295a1f7 55 M2MTLVDeserializer::Operation operation)
ram54288 0:a2cb7295a1f7 56 {
ram54288 0:a2cb7295a1f7 57 M2MTLVDeserializer::Error error = M2MTLVDeserializer::None;
ram54288 0:a2cb7295a1f7 58 if (is_object_instance(tlv) ) {
ram54288 0:a2cb7295a1f7 59 tr_debug("M2MTLVDeserializer::deserialise_object_instances");
ram54288 0:a2cb7295a1f7 60 error = deserialize_object_instances(tlv, tlv_size, 0, object,operation,false);
ram54288 0:a2cb7295a1f7 61 if(M2MTLVDeserializer::None == error) {
ram54288 0:a2cb7295a1f7 62 error = deserialize_object_instances(tlv, tlv_size, 0, object,operation,true);
ram54288 0:a2cb7295a1f7 63 }
ram54288 0:a2cb7295a1f7 64 } else {
ram54288 0:a2cb7295a1f7 65 tr_debug("M2MTLVDeserializer::deserialise_object_instances ::NotValid");
ram54288 0:a2cb7295a1f7 66 error = M2MTLVDeserializer::NotValid;
ram54288 0:a2cb7295a1f7 67 }
ram54288 0:a2cb7295a1f7 68 return error;
ram54288 0:a2cb7295a1f7 69 }
ram54288 0:a2cb7295a1f7 70
ram54288 0:a2cb7295a1f7 71 M2MTLVDeserializer::Error M2MTLVDeserializer::deserialize_resources(uint8_t *tlv,
ram54288 0:a2cb7295a1f7 72 uint32_t tlv_size,
ram54288 0:a2cb7295a1f7 73 M2MObjectInstance &object_instance,
ram54288 0:a2cb7295a1f7 74 M2MTLVDeserializer::Operation operation)
ram54288 0:a2cb7295a1f7 75 {
ram54288 0:a2cb7295a1f7 76 M2MTLVDeserializer::Error error = M2MTLVDeserializer::None;
ram54288 0:a2cb7295a1f7 77 if (!is_resource(tlv) && !is_multiple_resource(tlv)) {
ram54288 0:a2cb7295a1f7 78 error = M2MTLVDeserializer::NotValid;
ram54288 0:a2cb7295a1f7 79 } else {
ram54288 0:a2cb7295a1f7 80 error = deserialize_resources(tlv, tlv_size, 0, object_instance, operation,false);
ram54288 0:a2cb7295a1f7 81 if(M2MTLVDeserializer::None == error) {
ram54288 0:a2cb7295a1f7 82 error = deserialize_resources(tlv, tlv_size, 0, object_instance, operation,true);
ram54288 0:a2cb7295a1f7 83 }
ram54288 0:a2cb7295a1f7 84 }
ram54288 0:a2cb7295a1f7 85 return error;
ram54288 0:a2cb7295a1f7 86 }
ram54288 0:a2cb7295a1f7 87
ram54288 0:a2cb7295a1f7 88 M2MTLVDeserializer::Error M2MTLVDeserializer::deserialize_resource_instances(uint8_t *tlv,
ram54288 0:a2cb7295a1f7 89 uint32_t tlv_size,
ram54288 0:a2cb7295a1f7 90 M2MResource &resource,
ram54288 0:a2cb7295a1f7 91 M2MTLVDeserializer::Operation operation)
ram54288 0:a2cb7295a1f7 92 {
ram54288 0:a2cb7295a1f7 93 M2MTLVDeserializer::Error error = M2MTLVDeserializer::None;
ram54288 0:a2cb7295a1f7 94 if (!is_multiple_resource(tlv)) {
ram54288 0:a2cb7295a1f7 95 error = M2MTLVDeserializer::NotValid;
ram54288 0:a2cb7295a1f7 96 } else {
ram54288 0:a2cb7295a1f7 97 tr_debug("M2MTLVDeserializer::deserialize_resource_instances()");
ram54288 0:a2cb7295a1f7 98 uint8_t offset = 2;
ram54288 0:a2cb7295a1f7 99
ram54288 0:a2cb7295a1f7 100 ((tlv[0] & 0x20) == 0) ? offset : offset++;
ram54288 0:a2cb7295a1f7 101
ram54288 0:a2cb7295a1f7 102 uint8_t length = tlv[0] & 0x18;
ram54288 0:a2cb7295a1f7 103 if(length == 0x08) {
ram54288 0:a2cb7295a1f7 104 offset+= 1;
ram54288 0:a2cb7295a1f7 105 } else if(length == 0x10) {
ram54288 0:a2cb7295a1f7 106 offset+= 2;
ram54288 0:a2cb7295a1f7 107 } else if(length == 0x18) {
ram54288 0:a2cb7295a1f7 108 offset+= 3;
ram54288 0:a2cb7295a1f7 109 }
ram54288 0:a2cb7295a1f7 110
ram54288 0:a2cb7295a1f7 111 tr_debug("M2MTLVDeserializer::deserialize_resource_instances() Offset %d", offset);
ram54288 0:a2cb7295a1f7 112 error = deserialize_resource_instances(tlv, tlv_size, offset, resource, operation,false);
ram54288 0:a2cb7295a1f7 113 if(M2MTLVDeserializer::None == error) {
ram54288 0:a2cb7295a1f7 114 error = deserialize_resource_instances(tlv, tlv_size, offset, resource, operation,true);
ram54288 0:a2cb7295a1f7 115 }
ram54288 0:a2cb7295a1f7 116 }
ram54288 0:a2cb7295a1f7 117 return error;
ram54288 0:a2cb7295a1f7 118 }
ram54288 0:a2cb7295a1f7 119
ram54288 0:a2cb7295a1f7 120 M2MTLVDeserializer::Error M2MTLVDeserializer::deserialize_object_instances(uint8_t *tlv,
ram54288 0:a2cb7295a1f7 121 uint32_t tlv_size,
ram54288 0:a2cb7295a1f7 122 uint32_t offset,
ram54288 0:a2cb7295a1f7 123 M2MObject &object,
ram54288 0:a2cb7295a1f7 124 M2MTLVDeserializer::Operation operation,
ram54288 0:a2cb7295a1f7 125 bool update_value)
ram54288 0:a2cb7295a1f7 126 {
ram54288 0:a2cb7295a1f7 127 tr_debug("M2MTLVDeserializer::deserialize_object_instances()");
ram54288 0:a2cb7295a1f7 128 M2MTLVDeserializer::Error error = M2MTLVDeserializer::None;
ram54288 0:a2cb7295a1f7 129 TypeIdLength *til = TypeIdLength::createTypeIdLength(tlv, offset)->deserialize();
ram54288 0:a2cb7295a1f7 130 offset = til->_offset;
ram54288 0:a2cb7295a1f7 131
ram54288 0:a2cb7295a1f7 132 M2MObjectInstanceList list = object.instances();
ram54288 0:a2cb7295a1f7 133 M2MObjectInstanceList::const_iterator it;
ram54288 0:a2cb7295a1f7 134 it = list.begin();
ram54288 0:a2cb7295a1f7 135
ram54288 0:a2cb7295a1f7 136 if (TYPE_OBJECT_INSTANCE == til->_type) {
ram54288 0:a2cb7295a1f7 137 for (; it!=list.end(); it++) {
ram54288 0:a2cb7295a1f7 138 if((*it)->instance_id() == til->_id) {
ram54288 0:a2cb7295a1f7 139 error = deserialize_resources(tlv, tlv_size, offset, (**it),operation, update_value);
ram54288 0:a2cb7295a1f7 140 }
ram54288 0:a2cb7295a1f7 141 }
ram54288 0:a2cb7295a1f7 142 offset += til->_length;
ram54288 0:a2cb7295a1f7 143
ram54288 0:a2cb7295a1f7 144 if(offset < tlv_size) {
ram54288 0:a2cb7295a1f7 145 error = deserialize_object_instances(tlv, tlv_size, offset, object, operation, update_value);
ram54288 0:a2cb7295a1f7 146 }
ram54288 0:a2cb7295a1f7 147 }
ram54288 0:a2cb7295a1f7 148 delete til;
ram54288 0:a2cb7295a1f7 149 return error;
ram54288 0:a2cb7295a1f7 150 }
ram54288 0:a2cb7295a1f7 151
ram54288 0:a2cb7295a1f7 152 M2MTLVDeserializer::Error M2MTLVDeserializer::deserialize_resources(uint8_t *tlv,
ram54288 0:a2cb7295a1f7 153 uint32_t tlv_size,
ram54288 0:a2cb7295a1f7 154 uint32_t offset,
ram54288 0:a2cb7295a1f7 155 M2MObjectInstance &object_instance,
ram54288 0:a2cb7295a1f7 156 M2MTLVDeserializer::Operation operation,
ram54288 0:a2cb7295a1f7 157 bool update_value)
ram54288 0:a2cb7295a1f7 158 {
ram54288 0:a2cb7295a1f7 159 tr_debug("M2MTLVDeserializer::deserialize_resources()");
ram54288 0:a2cb7295a1f7 160 M2MTLVDeserializer::Error error = M2MTLVDeserializer::None;
ram54288 0:a2cb7295a1f7 161 TypeIdLength *til = TypeIdLength::createTypeIdLength(tlv, offset)->deserialize();
ram54288 0:a2cb7295a1f7 162 offset = til->_offset;
ram54288 0:a2cb7295a1f7 163
ram54288 0:a2cb7295a1f7 164 M2MResourceList list = object_instance.resources();
ram54288 0:a2cb7295a1f7 165 M2MResourceList::const_iterator it;
ram54288 0:a2cb7295a1f7 166 it = list.begin();
ram54288 0:a2cb7295a1f7 167
ram54288 0:a2cb7295a1f7 168 if (TYPE_RESOURCE == til->_type || TYPE_RESOURCE_INSTANCE == til->_type) {
ram54288 0:a2cb7295a1f7 169 bool found = false;
ram54288 0:a2cb7295a1f7 170 for (; it!=list.end(); it++) {
ram54288 0:a2cb7295a1f7 171 if((*it)->name_id() == til->_id){
ram54288 0:a2cb7295a1f7 172 tr_debug("M2MTLVDeserializer::deserialize_resources() - Resource ID %d ", til->_id);
ram54288 0:a2cb7295a1f7 173 found = true;
ram54288 0:a2cb7295a1f7 174 if(update_value) {
ram54288 0:a2cb7295a1f7 175 if(til->_length > 0) {
ram54288 0:a2cb7295a1f7 176 tr_debug("M2MTLVDeserializer::deserialize_resources() - Update value");
ram54288 0:a2cb7295a1f7 177 (*it)->set_value(tlv+offset, til->_length);
ram54288 0:a2cb7295a1f7 178 } else {
ram54288 0:a2cb7295a1f7 179 tr_debug("M2MTLVDeserializer::deserialize_resources() - Clear Value");
ram54288 0:a2cb7295a1f7 180 (*it)->clear_value();
ram54288 0:a2cb7295a1f7 181 }
ram54288 0:a2cb7295a1f7 182 break;
ram54288 0:a2cb7295a1f7 183 } else if(0 == ((*it)->operation() & SN_GRS_PUT_ALLOWED)) {
ram54288 0:a2cb7295a1f7 184 tr_debug("M2MTLVDeserializer::deserialize_resources() - NOT_ALLOWED");
ram54288 0:a2cb7295a1f7 185 error = M2MTLVDeserializer::NotAllowed;
ram54288 0:a2cb7295a1f7 186 break;
ram54288 0:a2cb7295a1f7 187 }
ram54288 0:a2cb7295a1f7 188 }
ram54288 0:a2cb7295a1f7 189 }
ram54288 0:a2cb7295a1f7 190 if(!found) {
ram54288 0:a2cb7295a1f7 191 if(M2MTLVDeserializer::Post == operation) {
ram54288 0:a2cb7295a1f7 192 //Create a new Resource
ram54288 0:a2cb7295a1f7 193 String id;
ram54288 0:a2cb7295a1f7 194 id.append_int(til->_id);
ram54288 0:a2cb7295a1f7 195 M2MResource *resource = object_instance.create_dynamic_resource(id,"",M2MResourceInstance::INTEGER,true,false);
ram54288 0:a2cb7295a1f7 196 if(resource) {
ram54288 0:a2cb7295a1f7 197 resource->set_operation(M2MBase::GET_PUT_POST_DELETE_ALLOWED);
ram54288 0:a2cb7295a1f7 198 }
ram54288 0:a2cb7295a1f7 199 } else if(M2MTLVDeserializer::Put == operation) {
ram54288 0:a2cb7295a1f7 200 error = M2MTLVDeserializer::NotFound;
ram54288 0:a2cb7295a1f7 201 }
ram54288 0:a2cb7295a1f7 202 }
ram54288 0:a2cb7295a1f7 203 } else if (TYPE_MULTIPLE_RESOURCE == til->_type) {
ram54288 0:a2cb7295a1f7 204 for (; it!=list.end(); it++) {
ram54288 0:a2cb7295a1f7 205 if((*it)->supports_multiple_instances()) {
ram54288 0:a2cb7295a1f7 206 error = deserialize_resource_instances(tlv, tlv_size-offset, offset, (**it), object_instance, operation, update_value);
ram54288 0:a2cb7295a1f7 207 }
ram54288 0:a2cb7295a1f7 208 }
ram54288 0:a2cb7295a1f7 209
ram54288 0:a2cb7295a1f7 210 } else {
ram54288 0:a2cb7295a1f7 211 delete til;
ram54288 0:a2cb7295a1f7 212 error = M2MTLVDeserializer::NotValid;
ram54288 0:a2cb7295a1f7 213 return error;
ram54288 0:a2cb7295a1f7 214 }
ram54288 0:a2cb7295a1f7 215 offset += til->_length;
ram54288 0:a2cb7295a1f7 216
ram54288 0:a2cb7295a1f7 217 delete til;
ram54288 0:a2cb7295a1f7 218 if(offset < tlv_size) {
ram54288 0:a2cb7295a1f7 219 error = deserialize_resources(tlv, tlv_size, offset, object_instance, operation, update_value);
ram54288 0:a2cb7295a1f7 220 }
ram54288 0:a2cb7295a1f7 221 return error;
ram54288 0:a2cb7295a1f7 222 }
ram54288 0:a2cb7295a1f7 223
ram54288 0:a2cb7295a1f7 224 M2MTLVDeserializer::Error M2MTLVDeserializer::deserialize_resource_instances(uint8_t *tlv,
ram54288 0:a2cb7295a1f7 225 uint32_t tlv_size,
ram54288 0:a2cb7295a1f7 226 uint32_t offset,
ram54288 0:a2cb7295a1f7 227 M2MResource &resource,
ram54288 0:a2cb7295a1f7 228 M2MObjectInstance &object_instance,
ram54288 0:a2cb7295a1f7 229 M2MTLVDeserializer::Operation operation,
ram54288 0:a2cb7295a1f7 230 bool update_value)
ram54288 0:a2cb7295a1f7 231 {
ram54288 0:a2cb7295a1f7 232 M2MTLVDeserializer::Error error = M2MTLVDeserializer::None;
ram54288 0:a2cb7295a1f7 233 TypeIdLength *til = TypeIdLength::createTypeIdLength(tlv, offset)->deserialize();
ram54288 0:a2cb7295a1f7 234 offset = til->_offset;
ram54288 0:a2cb7295a1f7 235
ram54288 0:a2cb7295a1f7 236 if (TYPE_MULTIPLE_RESOURCE == til->_type || TYPE_RESOURCE_INSTANCE == til->_type) {
ram54288 0:a2cb7295a1f7 237 M2MResourceInstanceList list = resource.resource_instances();
ram54288 0:a2cb7295a1f7 238 M2MResourceInstanceList::const_iterator it;
ram54288 0:a2cb7295a1f7 239 it = list.begin();
ram54288 0:a2cb7295a1f7 240 bool found = false;
ram54288 0:a2cb7295a1f7 241 for (; it!=list.end(); it++) {
ram54288 0:a2cb7295a1f7 242 if((*it)->instance_id() == til->_id) {
ram54288 0:a2cb7295a1f7 243 found = true;
ram54288 0:a2cb7295a1f7 244 if(update_value) {
ram54288 0:a2cb7295a1f7 245 if(til->_length > 0) {
ram54288 0:a2cb7295a1f7 246 (*it)->set_value(tlv+offset, til->_length);
ram54288 0:a2cb7295a1f7 247 } else {
ram54288 0:a2cb7295a1f7 248 (*it)->clear_value();
ram54288 0:a2cb7295a1f7 249 }
ram54288 0:a2cb7295a1f7 250 break;
ram54288 0:a2cb7295a1f7 251 } else if(0 == ((*it)->operation() & SN_GRS_PUT_ALLOWED)) {
ram54288 0:a2cb7295a1f7 252 error = M2MTLVDeserializer::NotAllowed;
ram54288 0:a2cb7295a1f7 253 break;
ram54288 0:a2cb7295a1f7 254 }
ram54288 0:a2cb7295a1f7 255 }
ram54288 0:a2cb7295a1f7 256 }
ram54288 0:a2cb7295a1f7 257 if(!found) {
ram54288 0:a2cb7295a1f7 258 if(M2MTLVDeserializer::Post == operation) {
ram54288 0:a2cb7295a1f7 259 // Create a new Resource Instance
ram54288 0:a2cb7295a1f7 260 M2MResourceInstance *res_instance = object_instance.create_dynamic_resource_instance(resource.name(),"",
ram54288 0:a2cb7295a1f7 261 M2MResourceInstance::INTEGER,
ram54288 0:a2cb7295a1f7 262 true,
ram54288 0:a2cb7295a1f7 263 til->_id);
ram54288 0:a2cb7295a1f7 264 if(res_instance) {
ram54288 0:a2cb7295a1f7 265 res_instance->set_operation(M2MBase::GET_PUT_POST_DELETE_ALLOWED);
ram54288 0:a2cb7295a1f7 266 }
ram54288 0:a2cb7295a1f7 267 } else if(M2MTLVDeserializer::Put == operation) {
ram54288 0:a2cb7295a1f7 268 error = M2MTLVDeserializer::NotFound;
ram54288 0:a2cb7295a1f7 269 }
ram54288 0:a2cb7295a1f7 270 }
ram54288 0:a2cb7295a1f7 271 } else {
ram54288 0:a2cb7295a1f7 272 delete til;
ram54288 0:a2cb7295a1f7 273 error = M2MTLVDeserializer::NotValid;
ram54288 0:a2cb7295a1f7 274 return error;
ram54288 0:a2cb7295a1f7 275 }
ram54288 0:a2cb7295a1f7 276
ram54288 0:a2cb7295a1f7 277 offset += til->_length;
ram54288 0:a2cb7295a1f7 278
ram54288 0:a2cb7295a1f7 279 delete til;
ram54288 0:a2cb7295a1f7 280 if(offset < tlv_size) {
ram54288 0:a2cb7295a1f7 281 error = deserialize_resource_instances(tlv, tlv_size-offset, offset, resource, object_instance, operation, update_value);
ram54288 0:a2cb7295a1f7 282 }
ram54288 0:a2cb7295a1f7 283 return error;
ram54288 0:a2cb7295a1f7 284 }
ram54288 0:a2cb7295a1f7 285
ram54288 0:a2cb7295a1f7 286 M2MTLVDeserializer::Error M2MTLVDeserializer::deserialize_resource_instances(uint8_t *tlv,
ram54288 0:a2cb7295a1f7 287 uint32_t tlv_size,
ram54288 0:a2cb7295a1f7 288 uint32_t offset,
ram54288 0:a2cb7295a1f7 289 M2MResource &resource,
ram54288 0:a2cb7295a1f7 290 M2MTLVDeserializer::Operation operation,
ram54288 0:a2cb7295a1f7 291 bool update_value)
ram54288 0:a2cb7295a1f7 292 {
ram54288 0:a2cb7295a1f7 293 M2MTLVDeserializer::Error error = M2MTLVDeserializer::None;
ram54288 0:a2cb7295a1f7 294 TypeIdLength *til = TypeIdLength::createTypeIdLength(tlv, offset)->deserialize();
ram54288 0:a2cb7295a1f7 295 offset = til->_offset;
ram54288 0:a2cb7295a1f7 296
ram54288 0:a2cb7295a1f7 297 if (TYPE_RESOURCE_INSTANCE == til->_type) {
ram54288 0:a2cb7295a1f7 298 M2MResourceInstanceList list = resource.resource_instances();
ram54288 0:a2cb7295a1f7 299 M2MResourceInstanceList::const_iterator it;
ram54288 0:a2cb7295a1f7 300 it = list.begin();
ram54288 0:a2cb7295a1f7 301 bool found = false;
ram54288 0:a2cb7295a1f7 302 for (; it!=list.end(); it++) {
ram54288 0:a2cb7295a1f7 303 if((*it)->instance_id() == til->_id) {
ram54288 0:a2cb7295a1f7 304 found = true;
ram54288 0:a2cb7295a1f7 305 if(update_value) {
ram54288 0:a2cb7295a1f7 306 if(til->_length > 0) {
ram54288 0:a2cb7295a1f7 307 (*it)->set_value(tlv+offset, til->_length);
ram54288 0:a2cb7295a1f7 308 } else {
ram54288 0:a2cb7295a1f7 309 (*it)->clear_value();
ram54288 0:a2cb7295a1f7 310 }
ram54288 0:a2cb7295a1f7 311 break;
ram54288 0:a2cb7295a1f7 312 } else if(0 == ((*it)->operation() & SN_GRS_PUT_ALLOWED)) {
ram54288 0:a2cb7295a1f7 313 error = M2MTLVDeserializer::NotAllowed;
ram54288 0:a2cb7295a1f7 314 break;
ram54288 0:a2cb7295a1f7 315 }
ram54288 0:a2cb7295a1f7 316 }
ram54288 0:a2cb7295a1f7 317 }
ram54288 0:a2cb7295a1f7 318 if(!found) {
ram54288 0:a2cb7295a1f7 319 if(M2MTLVDeserializer::Post == operation) {
ram54288 0:a2cb7295a1f7 320 error = M2MTLVDeserializer::NotAllowed;
ram54288 0:a2cb7295a1f7 321 } else if(M2MTLVDeserializer::Put == operation) {
ram54288 0:a2cb7295a1f7 322 error = M2MTLVDeserializer::NotFound;
ram54288 0:a2cb7295a1f7 323 }
ram54288 0:a2cb7295a1f7 324 }
ram54288 0:a2cb7295a1f7 325 } else {
ram54288 0:a2cb7295a1f7 326 delete til;
ram54288 0:a2cb7295a1f7 327 error = M2MTLVDeserializer::NotValid;
ram54288 0:a2cb7295a1f7 328 return error;
ram54288 0:a2cb7295a1f7 329 }
ram54288 0:a2cb7295a1f7 330
ram54288 0:a2cb7295a1f7 331 offset += til->_length;
ram54288 0:a2cb7295a1f7 332
ram54288 0:a2cb7295a1f7 333 delete til;
ram54288 0:a2cb7295a1f7 334 if(offset < tlv_size) {
ram54288 0:a2cb7295a1f7 335 error = deserialize_resource_instances(tlv, tlv_size-offset, offset, resource, operation, update_value);
ram54288 0:a2cb7295a1f7 336 }
ram54288 0:a2cb7295a1f7 337 return error;
ram54288 0:a2cb7295a1f7 338 }
ram54288 0:a2cb7295a1f7 339
ram54288 0:a2cb7295a1f7 340 bool M2MTLVDeserializer::is_object_instance(uint8_t *tlv, uint32_t offset)
ram54288 0:a2cb7295a1f7 341 {
ram54288 0:a2cb7295a1f7 342 bool ret = false;
ram54288 0:a2cb7295a1f7 343 if (tlv) {
ram54288 0:a2cb7295a1f7 344 uint8_t value = tlv[offset];
ram54288 0:a2cb7295a1f7 345 ret = (TYPE_OBJECT_INSTANCE == (value & TYPE_RESOURCE));
ram54288 0:a2cb7295a1f7 346 }
ram54288 0:a2cb7295a1f7 347 return ret;
ram54288 0:a2cb7295a1f7 348 }
ram54288 0:a2cb7295a1f7 349
ram54288 0:a2cb7295a1f7 350 uint16_t M2MTLVDeserializer::instance_id(uint8_t *tlv)
ram54288 0:a2cb7295a1f7 351 {
ram54288 0:a2cb7295a1f7 352 TypeIdLength *til = TypeIdLength::createTypeIdLength(tlv, 0)->deserialize();
ram54288 0:a2cb7295a1f7 353 uint16_t id = til->_id;
ram54288 0:a2cb7295a1f7 354 delete til;
ram54288 0:a2cb7295a1f7 355 return id;
ram54288 0:a2cb7295a1f7 356 }
ram54288 0:a2cb7295a1f7 357
ram54288 0:a2cb7295a1f7 358 bool M2MTLVDeserializer::is_resource(uint8_t *tlv, uint32_t offset)
ram54288 0:a2cb7295a1f7 359 {
ram54288 0:a2cb7295a1f7 360 bool ret = false;
ram54288 0:a2cb7295a1f7 361 if (tlv) {
ram54288 0:a2cb7295a1f7 362 ret = (TYPE_RESOURCE == (tlv[offset] & TYPE_RESOURCE));
ram54288 0:a2cb7295a1f7 363 }
ram54288 0:a2cb7295a1f7 364 return ret;
ram54288 0:a2cb7295a1f7 365 }
ram54288 0:a2cb7295a1f7 366
ram54288 0:a2cb7295a1f7 367 bool M2MTLVDeserializer::is_multiple_resource(uint8_t *tlv, uint32_t offset)
ram54288 0:a2cb7295a1f7 368 {
ram54288 0:a2cb7295a1f7 369 bool ret = false;
ram54288 0:a2cb7295a1f7 370 if (tlv) {
ram54288 0:a2cb7295a1f7 371 ret = (TYPE_MULTIPLE_RESOURCE == (tlv[offset] & TYPE_RESOURCE));
ram54288 0:a2cb7295a1f7 372 }
ram54288 0:a2cb7295a1f7 373 return ret;
ram54288 0:a2cb7295a1f7 374 }
ram54288 0:a2cb7295a1f7 375
ram54288 0:a2cb7295a1f7 376 bool M2MTLVDeserializer::is_resource_instance(uint8_t *tlv, uint32_t offset)
ram54288 0:a2cb7295a1f7 377 {
ram54288 0:a2cb7295a1f7 378 bool ret = false;
ram54288 0:a2cb7295a1f7 379 if (tlv) {
ram54288 0:a2cb7295a1f7 380 ret = (TYPE_RESOURCE_INSTANCE == (tlv[offset] & TYPE_RESOURCE));
ram54288 0:a2cb7295a1f7 381 }
ram54288 0:a2cb7295a1f7 382 return ret;
ram54288 0:a2cb7295a1f7 383 }
ram54288 0:a2cb7295a1f7 384
ram54288 0:a2cb7295a1f7 385 TypeIdLength* TypeIdLength::createTypeIdLength(uint8_t *tlv, uint32_t offset)
ram54288 0:a2cb7295a1f7 386 {
ram54288 0:a2cb7295a1f7 387 TypeIdLength *til = new TypeIdLength();
ram54288 0:a2cb7295a1f7 388 til->_tlv = tlv;
ram54288 0:a2cb7295a1f7 389 til->_offset = offset;
ram54288 0:a2cb7295a1f7 390 til->_type = tlv[offset] & 0xC0;
ram54288 0:a2cb7295a1f7 391 til->_id = 0;
ram54288 0:a2cb7295a1f7 392 til->_length = 0;
ram54288 0:a2cb7295a1f7 393 return til;
ram54288 0:a2cb7295a1f7 394 }
ram54288 0:a2cb7295a1f7 395
ram54288 0:a2cb7295a1f7 396 TypeIdLength* TypeIdLength::deserialize()
ram54288 0:a2cb7295a1f7 397 {
ram54288 0:a2cb7295a1f7 398 uint32_t idLength = _tlv[_offset] & ID16;
ram54288 0:a2cb7295a1f7 399 uint32_t lengthType = _tlv[_offset] & LENGTH24;
ram54288 0:a2cb7295a1f7 400 if (0 == lengthType) {
ram54288 0:a2cb7295a1f7 401 _length = _tlv[_offset] & 0x07;
ram54288 0:a2cb7295a1f7 402 }
ram54288 0:a2cb7295a1f7 403 _offset++;
ram54288 0:a2cb7295a1f7 404
ram54288 0:a2cb7295a1f7 405 deserialiseID(idLength);
ram54288 0:a2cb7295a1f7 406 deserialiseLength(lengthType);
ram54288 0:a2cb7295a1f7 407
ram54288 0:a2cb7295a1f7 408 return this;
ram54288 0:a2cb7295a1f7 409 }
ram54288 0:a2cb7295a1f7 410
ram54288 0:a2cb7295a1f7 411 void TypeIdLength::deserialiseID(uint32_t idLength)
ram54288 0:a2cb7295a1f7 412 {
ram54288 0:a2cb7295a1f7 413 _id = _tlv[_offset++] & 0xFF;
ram54288 0:a2cb7295a1f7 414 if (ID16 == idLength) {
ram54288 0:a2cb7295a1f7 415 _id = (_id << 8) + (_tlv[_offset++] & 0xFF);
ram54288 0:a2cb7295a1f7 416 }
ram54288 0:a2cb7295a1f7 417 }
ram54288 0:a2cb7295a1f7 418
ram54288 0:a2cb7295a1f7 419 void TypeIdLength::deserialiseLength(uint32_t lengthType)
ram54288 0:a2cb7295a1f7 420 {
ram54288 0:a2cb7295a1f7 421 if (lengthType > 0) {
ram54288 0:a2cb7295a1f7 422 _length = _tlv[_offset++] & 0xFF;
ram54288 0:a2cb7295a1f7 423 }
ram54288 0:a2cb7295a1f7 424 if (lengthType > LENGTH8) {
ram54288 0:a2cb7295a1f7 425 _length = (_length << 8) + (_tlv[_offset++] & 0xFF);
ram54288 0:a2cb7295a1f7 426 }
ram54288 0:a2cb7295a1f7 427 if (lengthType > LENGTH16) {
ram54288 0:a2cb7295a1f7 428 _length = (_length << 8) + (_tlv[_offset++] & 0xFF);
ram54288 0:a2cb7295a1f7 429 }
ram54288 0:a2cb7295a1f7 430 }