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 <stdio.h> 00017 #include "include/m2mtlvserializer.h" 00018 #include "include/nsdllinker.h" 00019 #include "mbed-client/m2mconstants.h" 00020 00021 #define TRACE_GROUP "mClt" 00022 00023 M2MTLVSerializer::M2MTLVSerializer() 00024 { 00025 } 00026 00027 M2MTLVSerializer::~M2MTLVSerializer() 00028 { 00029 } 00030 00031 uint8_t* M2MTLVSerializer::serialize(M2MObjectInstanceList object_instance_list, uint32_t &size) 00032 { 00033 return serialize_object_instances(object_instance_list, size); 00034 } 00035 00036 uint8_t* M2MTLVSerializer::serialize(M2MResourceList resource_list, uint32_t &size) 00037 { 00038 bool valid = true; 00039 return serialize_resources(resource_list, size,valid); 00040 } 00041 00042 uint8_t* M2MTLVSerializer::serialize(M2MResource *resource, uint32_t &size) 00043 { 00044 uint8_t* data = NULL; 00045 serialize(resource, data, size); 00046 return data; 00047 } 00048 00049 uint8_t* M2MTLVSerializer::serialize_object_instances(M2MObjectInstanceList object_instance_list, uint32_t &size) 00050 { 00051 uint8_t *data = NULL; 00052 00053 if(!object_instance_list.empty()) { 00054 M2MObjectInstanceList::const_iterator it; 00055 it = object_instance_list.begin(); 00056 for (; it!=object_instance_list.end(); it++) { 00057 uint16_t id = (*it)->instance_id(); 00058 serialize(id, *it, data, size); 00059 } 00060 } 00061 return data; 00062 } 00063 00064 uint8_t* M2MTLVSerializer::serialize_resources(M2MResourceList resource_list, uint32_t &size, bool &valid) 00065 { 00066 uint8_t *data = NULL; 00067 00068 if(!resource_list.empty()) { 00069 M2MResourceList::const_iterator it; 00070 it = resource_list.begin(); 00071 for (; it!=resource_list.end(); it++) { 00072 if((*it)->name_id() == -1) { 00073 valid = false; 00074 break; 00075 } 00076 } 00077 if(valid) { 00078 it = resource_list.begin(); 00079 for (; it!=resource_list.end(); it++) { 00080 serialize(*it, data, size); 00081 } 00082 } 00083 } 00084 return data; 00085 } 00086 00087 void M2MTLVSerializer::serialize(uint16_t id, M2MObjectInstance *object_instance, uint8_t *&data, uint32_t &size) 00088 { 00089 uint8_t *resource_data = NULL; 00090 uint32_t resource_size = 0; 00091 00092 bool valid = true; 00093 resource_data = serialize_resources(object_instance->resources(),resource_size,valid); 00094 if(valid) { 00095 serialize_TILV(TYPE_OBJECT_INSTANCE, id, resource_data, resource_size, data, size); 00096 } 00097 free(resource_data); 00098 } 00099 00100 bool M2MTLVSerializer::serialize(M2MResource *resource, uint8_t *&data, uint32_t &size) 00101 { 00102 bool success = false; 00103 if(resource->name_id() != -1) { 00104 success = resource->supports_multiple_instances() ? 00105 serialize_multiple_resource(resource, data, size) : 00106 serialize_resource(resource, data, size); 00107 } 00108 return success; 00109 } 00110 00111 bool M2MTLVSerializer::serialize_resource(M2MResource *resource, uint8_t *&data, uint32_t &size) 00112 { 00113 bool success = false; 00114 if(resource->name_id() != -1) { 00115 success = true; 00116 serialize_TILV(TYPE_RESOURCE, resource->name_id(), resource->value(), resource->value_length(), data, size); 00117 } 00118 return success; 00119 } 00120 00121 bool M2MTLVSerializer::serialize_multiple_resource(M2MResource *resource, uint8_t *&data, uint32_t &size) 00122 { 00123 bool success = false; 00124 uint8_t *nested_data = NULL; 00125 uint32_t nested_data_size = 0; 00126 00127 M2MResourceInstanceList instance_list = resource->resource_instances(); 00128 if(!instance_list.empty()) { 00129 M2MResourceInstanceList::const_iterator it; 00130 it = instance_list.begin(); 00131 for (; it!=instance_list.end(); it++) { 00132 uint16_t id = (*it)->instance_id(); 00133 serialize_resource_instance(id, (*it), nested_data, nested_data_size); 00134 } 00135 } 00136 if(resource->name_id() != -1) { 00137 success = true; 00138 serialize_TILV(TYPE_MULTIPLE_RESOURCE, resource->name_id(), nested_data, nested_data_size, data, size); 00139 } 00140 00141 free(nested_data); 00142 nested_data = NULL; 00143 return success; 00144 } 00145 00146 void M2MTLVSerializer::serialize_resource_instance(uint16_t id, M2MResourceInstance *resource, uint8_t *&data, uint32_t &size) 00147 { 00148 serialize_TILV(TYPE_RESOURCE_INSTANCE, id, resource->value(), resource->value_length(), data, size); 00149 } 00150 00151 void M2MTLVSerializer::serialize_TILV(uint8_t type, uint16_t id, uint8_t *value, uint32_t value_length, uint8_t *&data, uint32_t &size) 00152 { 00153 uint8_t *tlv = 0; 00154 uint32_t type_length = 1; 00155 type += id < 256 ? 0 : ID16; 00156 type += value_length < 8 ? value_length : 00157 value_length < 256 ? LENGTH8 : 00158 value_length < 65536 ? LENGTH16 : LENGTH24; 00159 uint8_t *tlv_type = (uint8_t*)malloc(type_length+1); 00160 memset(tlv_type,0,type_length+1); 00161 *tlv_type = type & 0xFF; 00162 00163 uint32_t id_size = 0; 00164 uint8_t* id_ptr = serialize_id(id, id_size); 00165 00166 uint32_t length_size = 0; 00167 uint8_t* length_ptr = serialize_length(value_length, length_size); 00168 00169 tlv = (uint8_t*)malloc(size + type_length + id_size + length_size + value_length+1); 00170 memset(tlv,0,size + type_length + id_size + length_size + value_length+1); 00171 if(data) { 00172 memcpy(tlv, data, size); 00173 } 00174 memcpy(tlv+size, tlv_type, type_length); 00175 memcpy(tlv+size+type_length, id_ptr, id_size); 00176 memcpy(tlv+size+type_length+id_size, length_ptr, length_size); 00177 memcpy(tlv+size+type_length+id_size+length_size, value, value_length); 00178 00179 free(tlv_type) ; 00180 free(length_ptr); 00181 free(id_ptr); 00182 free(data); 00183 00184 data = tlv; 00185 size += type_length + id_size + length_size + value_length; 00186 } 00187 00188 uint8_t* M2MTLVSerializer::serialize_id(uint16_t id, uint32_t &size) 00189 { 00190 uint32_t id_size = id > 255 ? 2 : 1; 00191 uint8_t *id_ptr = (uint8_t*)malloc(id_size); 00192 memset(id_ptr, 0 , id_size); 00193 size += id_size; 00194 if(id > 255) { 00195 *id_ptr = (id & 0xFF00) >> 8; 00196 id_ptr++; 00197 *id_ptr = id & 0xFF; 00198 id_ptr--; 00199 } else { 00200 *id_ptr = id & 0xFF; 00201 } 00202 return id_ptr; 00203 } 00204 00205 uint8_t* M2MTLVSerializer::serialize_length(uint32_t length, uint32_t &size) 00206 { 00207 uint8_t *length_ptr = 0; 00208 uint32_t length_size = 0; 00209 if (length > 65535) { 00210 length_size = 3; 00211 length_ptr = (uint8_t*)malloc(length_size+1); 00212 memset(length_ptr,0,length_size+1); 00213 *length_ptr = (length & 0xFF0000) >> 16; 00214 length_ptr++; 00215 *length_ptr = (length & 0xFF00) >> 8; 00216 length_ptr++; 00217 *length_ptr = length & 0xFF; 00218 length_ptr--; 00219 length_ptr--; 00220 } else if (length > 255) { 00221 length_size = 2; 00222 length_ptr = (uint8_t*)malloc(length_size+1); 00223 memset(length_ptr,0,length_size+1); 00224 *length_ptr = (length & 0xFF00) >> 8; 00225 length_ptr++; 00226 *length_ptr = length & 0xFF; 00227 length_ptr--; 00228 } else if (length > 7) { 00229 length_size = 1; 00230 length_ptr = (uint8_t*)malloc(length_size+1); 00231 memset(length_ptr,0,length_size+1); 00232 *length_ptr = length & 0xFF; 00233 } 00234 size += length_size; 00235 return length_ptr; 00236 } 00237
Generated on Tue Jul 12 2022 13:05:14 by
1.7.2