Donald Meyers / Mbed OS evan
Committer:
djmeyers
Date:
Sat Mar 18 22:37:16 2017 +0000
Revision:
0:06ee5f8a484a
Initial commit

Who changed what in which revision?

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