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.
Dependencies: MAX44000 PWM_Tone_Library nexpaq_mdk
Fork of LED_Demo by
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 12:28:39 by
1.7.2
