Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
m2mtlvserializer.cpp
00001 /* 00002 * Copyright (c) 2015 ARM Limited. All rights reserved. 00003 * SPDX-License-Identifier: Apache-2.0 00004 * Licensed under the Apache License, Version 2.0 (the License); you may 00005 * not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an AS IS BASIS, WITHOUT 00012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 #include "include/m2mtlvserializer.h" 00017 #include "include/nsdllinker.h" 00018 #include "mbed-client/m2mconstants.h" 00019 00020 #include <stdlib.h> 00021 00022 #define TRACE_GROUP "mClt" 00023 00024 M2MTLVSerializer::M2MTLVSerializer() 00025 { 00026 } 00027 00028 M2MTLVSerializer::~M2MTLVSerializer() 00029 { 00030 } 00031 00032 uint8_t* M2MTLVSerializer::serialize(M2MObjectInstanceList object_instance_list, uint32_t &size) 00033 { 00034 return serialize_object_instances(object_instance_list, size); 00035 } 00036 00037 uint8_t* M2MTLVSerializer::serialize(M2MResourceList resource_list, uint32_t &size) 00038 { 00039 bool valid = true; 00040 return serialize_resources(resource_list, size,valid); 00041 } 00042 00043 uint8_t* M2MTLVSerializer::serialize(M2MResource *resource, uint32_t &size) 00044 { 00045 uint8_t* data = NULL; 00046 serialize(resource, data, size); 00047 return data; 00048 } 00049 00050 uint8_t* M2MTLVSerializer::serialize_object_instances(M2MObjectInstanceList object_instance_list, uint32_t &size) 00051 { 00052 uint8_t *data = NULL; 00053 00054 if(!object_instance_list.empty()) { 00055 M2MObjectInstanceList::const_iterator it; 00056 it = object_instance_list.begin(); 00057 for (; it!=object_instance_list.end(); it++) { 00058 uint16_t id = (*it)->instance_id(); 00059 serialize(id, *it, data, size); 00060 } 00061 } 00062 return data; 00063 } 00064 00065 uint8_t* M2MTLVSerializer::serialize_resources(M2MResourceList resource_list, uint32_t &size, bool &valid) 00066 { 00067 uint8_t *data = NULL; 00068 00069 if(!resource_list.empty()) { 00070 M2MResourceList::const_iterator it; 00071 it = resource_list.begin(); 00072 for (; it!=resource_list.end(); it++) { 00073 if((*it)->name_id() == -1) { 00074 valid = false; 00075 break; 00076 } 00077 } 00078 if(valid) { 00079 it = resource_list.begin(); 00080 for (; it!=resource_list.end(); it++) { 00081 serialize(*it, data, size); 00082 } 00083 } 00084 } 00085 return data; 00086 } 00087 00088 void M2MTLVSerializer::serialize(uint16_t id, M2MObjectInstance *object_instance, uint8_t *&data, uint32_t &size) 00089 { 00090 uint8_t *resource_data = NULL; 00091 uint32_t resource_size = 0; 00092 00093 bool valid = true; 00094 resource_data = serialize_resources(object_instance->resources(),resource_size,valid); 00095 if(valid) { 00096 serialize_TILV(TYPE_OBJECT_INSTANCE, id, resource_data, resource_size, data, size); 00097 } 00098 free(resource_data); 00099 } 00100 00101 bool M2MTLVSerializer::serialize(M2MResource *resource, uint8_t *&data, uint32_t &size) 00102 { 00103 bool success = false; 00104 if(resource->name_id() != -1) { 00105 success = resource->supports_multiple_instances() ? 00106 serialize_multiple_resource(resource, data, size) : 00107 serialize_resource(resource, data, size); 00108 } 00109 return success; 00110 } 00111 00112 bool M2MTLVSerializer::serialize_resource(M2MResource *resource, uint8_t *&data, uint32_t &size) 00113 { 00114 bool success = false; 00115 if(resource->name_id() != -1) { 00116 success = true; 00117 serialize_TILV(TYPE_RESOURCE, resource->name_id(), resource->value(), resource->value_length(), data, size); 00118 } 00119 return success; 00120 } 00121 00122 bool M2MTLVSerializer::serialize_multiple_resource(M2MResource *resource, uint8_t *&data, uint32_t &size) 00123 { 00124 bool success = false; 00125 uint8_t *nested_data = NULL; 00126 uint32_t nested_data_size = 0; 00127 00128 M2MResourceInstanceList instance_list = resource->resource_instances(); 00129 if(!instance_list.empty()) { 00130 M2MResourceInstanceList::const_iterator it; 00131 it = instance_list.begin(); 00132 for (; it!=instance_list.end(); it++) { 00133 uint16_t id = (*it)->instance_id(); 00134 serialize_resource_instance(id, (*it), nested_data, nested_data_size); 00135 } 00136 } 00137 if(resource->name_id() != -1) { 00138 success = true; 00139 serialize_TILV(TYPE_MULTIPLE_RESOURCE, resource->name_id(), nested_data, nested_data_size, data, size); 00140 } 00141 00142 free(nested_data); 00143 nested_data = NULL; 00144 return success; 00145 } 00146 00147 void M2MTLVSerializer::serialize_resource_instance(uint16_t id, M2MResourceInstance *resource, uint8_t *&data, uint32_t &size) 00148 { 00149 serialize_TILV(TYPE_RESOURCE_INSTANCE, id, resource->value(), resource->value_length(), data, size); 00150 } 00151 00152 void M2MTLVSerializer::serialize_TILV(uint8_t type, uint16_t id, uint8_t *value, uint32_t value_length, uint8_t *&data, uint32_t &size) 00153 { 00154 uint8_t *tlv = 0; 00155 uint32_t type_length = 1; 00156 type += id < 256 ? 0 : ID16; 00157 type += value_length < 8 ? value_length : 00158 value_length < 256 ? LENGTH8 : 00159 value_length < 65536 ? LENGTH16 : LENGTH24; 00160 uint8_t *tlv_type = (uint8_t*)malloc(type_length+1); 00161 memset(tlv_type,0,type_length+1); 00162 *tlv_type = type & 0xFF; 00163 00164 uint32_t id_size = 0; 00165 uint8_t* id_ptr = serialize_id(id, id_size); 00166 00167 uint32_t length_size = 0; 00168 uint8_t* length_ptr = serialize_length(value_length, length_size); 00169 00170 tlv = (uint8_t*)malloc(size + type_length + id_size + length_size + value_length+1); 00171 memset(tlv,0,size + type_length + id_size + length_size + value_length+1); 00172 if(data) { 00173 memcpy(tlv, data, size); 00174 } 00175 memcpy(tlv+size, tlv_type, type_length); 00176 memcpy(tlv+size+type_length, id_ptr, id_size); 00177 memcpy(tlv+size+type_length+id_size, length_ptr, length_size); 00178 memcpy(tlv+size+type_length+id_size+length_size, value, value_length); 00179 00180 free(tlv_type) ; 00181 free(length_ptr); 00182 free(id_ptr); 00183 free(data); 00184 00185 data = tlv; 00186 size += type_length + id_size + length_size + value_length; 00187 } 00188 00189 uint8_t* M2MTLVSerializer::serialize_id(uint16_t id, uint32_t &size) 00190 { 00191 uint32_t id_size = id > 255 ? 2 : 1; 00192 uint8_t *id_ptr = (uint8_t*)malloc(id_size); 00193 memset(id_ptr, 0 , id_size); 00194 size += id_size; 00195 if(id > 255) { 00196 *id_ptr = (id & 0xFF00) >> 8; 00197 id_ptr++; 00198 *id_ptr = id & 0xFF; 00199 id_ptr--; 00200 } else { 00201 *id_ptr = id & 0xFF; 00202 } 00203 return id_ptr; 00204 } 00205 00206 uint8_t* M2MTLVSerializer::serialize_length(uint32_t length, uint32_t &size) 00207 { 00208 uint8_t *length_ptr = 0; 00209 uint32_t length_size = 0; 00210 if (length > 65535) { 00211 length_size = 3; 00212 length_ptr = (uint8_t*)malloc(length_size+1); 00213 memset(length_ptr,0,length_size+1); 00214 *length_ptr = (length & 0xFF0000) >> 16; 00215 length_ptr++; 00216 *length_ptr = (length & 0xFF00) >> 8; 00217 length_ptr++; 00218 *length_ptr = length & 0xFF; 00219 length_ptr--; 00220 length_ptr--; 00221 } else if (length > 255) { 00222 length_size = 2; 00223 length_ptr = (uint8_t*)malloc(length_size+1); 00224 memset(length_ptr,0,length_size+1); 00225 *length_ptr = (length & 0xFF00) >> 8; 00226 length_ptr++; 00227 *length_ptr = length & 0xFF; 00228 length_ptr--; 00229 } else if (length > 7) { 00230 length_size = 1; 00231 length_ptr = (uint8_t*)malloc(length_size+1); 00232 memset(length_ptr,0,length_size+1); 00233 *length_ptr = length & 0xFF; 00234 } 00235 size += length_size; 00236 return length_ptr; 00237 } 00238
Generated on Tue Jul 12 2022 21:20:28 by
 1.7.2
 1.7.2