1 /* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #include "metadata/metadata_serializer.h" 17 18 namespace OHOS { 19 namespace Idl { Serialize()20void MetadataSerializer::Serialize() 21 { 22 SerializeMetaComponent(metaComponent_); 23 } 24 SerializeMetaComponent(MetaComponent * mc)25void MetadataSerializer::SerializeMetaComponent(MetaComponent* mc) 26 { 27 if (mc == nullptr) { 28 return; 29 } 30 mc->name_ = reinterpret_cast<char*>(SerializeAdjust(mc->name_)); 31 32 for (int i = 0; i < mc->namespaceNumber_; i++) { 33 MetaNamespace* mn = mc->namespaces_[i]; 34 SerializeMetaNamespace(mn); 35 mc->namespaces_[i] = reinterpret_cast<MetaNamespace*>(SerializeAdjust(mn)); 36 } 37 mc->namespaces_ = reinterpret_cast<MetaNamespace**>(SerializeAdjust(mc->namespaces_)); 38 39 for (int i = 0; i < mc->sequenceableNumber_; i++) { 40 MetaSequenceable* mp = mc->sequenceables_[i]; 41 SerializeMetaSequenceable(mp); 42 mc->sequenceables_[i] = reinterpret_cast<MetaSequenceable*>(SerializeAdjust(mp)); 43 } 44 mc->sequenceables_ = reinterpret_cast<MetaSequenceable**>(SerializeAdjust(mc->sequenceables_)); 45 46 for (int i = 0; i < mc->rawdataNumber_; i++) { 47 MetaRawData* mp = mc->rawdatas_[i]; 48 SerializeMetaRawData(mp); 49 mc->rawdatas_[i] = reinterpret_cast<MetaRawData*>(SerializeAdjust(mp)); 50 } 51 mc->rawdatas_ = reinterpret_cast<MetaRawData**>(SerializeAdjust(mc->rawdatas_)); 52 53 for (int i = 0; i < mc->interfaceNumber_; i++) { 54 MetaInterface* mi = mc->interfaces_[i]; 55 SerializeMetaInterface(mi); 56 mc->interfaces_[i] = reinterpret_cast<MetaInterface*>(SerializeAdjust(mi)); 57 } 58 mc->interfaces_ = reinterpret_cast<MetaInterface**>(SerializeAdjust(mc->interfaces_)); 59 60 for (int i = 0; i < mc->typeNumber_; i++) { 61 MetaType* mt = mc->types_[i]; 62 SerializeMetaType(mt); 63 mc->types_[i] = reinterpret_cast<MetaType*>(SerializeAdjust(mt)); 64 } 65 mc->types_ = reinterpret_cast<MetaType**>(SerializeAdjust(mc->types_)); 66 67 mc->stringPool_ = reinterpret_cast<char*>(SerializeAdjust(mc->stringPool_)); 68 } 69 SerializeMetaNamespace(MetaNamespace * mn)70void MetadataSerializer::SerializeMetaNamespace(MetaNamespace* mn) 71 { 72 if (mn == nullptr || mn->namespaceNumber_ < 0 || mn->namespaceNumber_ > UINT16_MAX) { 73 return; 74 } 75 mn->name_ = reinterpret_cast<char*>(SerializeAdjust(mn->name_)); 76 mn->sequenceableIndexes_ = reinterpret_cast<int*>(SerializeAdjust(mn->sequenceableIndexes_)); 77 mn->rawdataIndexes_ = reinterpret_cast<int*>(SerializeAdjust(mn->rawdataIndexes_)); 78 mn->interfaceIndexes_ = reinterpret_cast<int*>(SerializeAdjust(mn->interfaceIndexes_)); 79 80 for (int i = 0; i < mn->namespaceNumber_; i++) { 81 MetaNamespace* innermn = mn->namespaces_[i]; 82 SerializeMetaNamespace(innermn); 83 mn->namespaces_[i] = reinterpret_cast<MetaNamespace*>(SerializeAdjust(innermn)); 84 } 85 mn->namespaces_ = reinterpret_cast<MetaNamespace**>(SerializeAdjust(mn->namespaces_)); 86 } 87 SerializeMetaSequenceable(MetaSequenceable * mp)88void MetadataSerializer::SerializeMetaSequenceable(MetaSequenceable* mp) 89 { 90 if (mp == nullptr) { 91 return; 92 } 93 mp->name_ = reinterpret_cast<char*>(SerializeAdjust(mp->name_)); 94 mp->namespace_ = reinterpret_cast<char*>(SerializeAdjust(mp->namespace_)); 95 } 96 SerializeMetaRawData(MetaRawData * mr)97void MetadataSerializer::SerializeMetaRawData(MetaRawData* mr) 98 { 99 if (mr == nullptr) { 100 return; 101 } 102 mr->name_ = reinterpret_cast<char*>(SerializeAdjust(mr->name_)); 103 mr->namespace_ = reinterpret_cast<char*>(SerializeAdjust(mr->namespace_)); 104 } 105 SerializeMetaInterface(MetaInterface * mi)106void MetadataSerializer::SerializeMetaInterface(MetaInterface* mi) 107 { 108 if (mi == nullptr) { 109 return; 110 } 111 mi->license_ = reinterpret_cast<char*>(SerializeAdjust(mi->license_)); 112 mi->name_ = reinterpret_cast<char*>(SerializeAdjust(mi->name_)); 113 mi->namespace_ = reinterpret_cast<char*>(SerializeAdjust(mi->namespace_)); 114 115 for (int i = 0; i < mi->methodNumber_; i++) { 116 MetaMethod* mm = mi->methods_[i]; 117 SerializeMetaMethod(mm); 118 mi->methods_[i] = reinterpret_cast<MetaMethod*>(SerializeAdjust(mm)); 119 } 120 mi->methods_ = reinterpret_cast<MetaMethod**>(SerializeAdjust(mi->methods_)); 121 } 122 SerializeMetaMethod(MetaMethod * mm)123void MetadataSerializer::SerializeMetaMethod(MetaMethod* mm) 124 { 125 if (mm == nullptr) { 126 return; 127 } 128 mm->name_ = reinterpret_cast<char*>(SerializeAdjust(mm->name_)); 129 mm->signature_ = reinterpret_cast<char*>(SerializeAdjust(mm->signature_)); 130 131 for (int i = 0; i < mm->parameterNumber_; i++) { 132 MetaParameter* mp = mm->parameters_[i]; 133 SerializeMetaParameter(mp); 134 mm->parameters_[i] = reinterpret_cast<MetaParameter*>(SerializeAdjust(mp)); 135 } 136 mm->parameters_ = reinterpret_cast<MetaParameter**>(SerializeAdjust(mm->parameters_)); 137 } 138 SerializeMetaParameter(MetaParameter * mp)139void MetadataSerializer::SerializeMetaParameter(MetaParameter* mp) 140 { 141 if (mp == nullptr) { 142 return; 143 } 144 mp->name_ = reinterpret_cast<char*>(SerializeAdjust(mp->name_)); 145 } 146 SerializeMetaType(MetaType * mt)147void MetadataSerializer::SerializeMetaType(MetaType* mt) 148 { 149 if (mt == nullptr) { 150 return; 151 } 152 mt->nestedTypeIndexes_ = reinterpret_cast<int*>(SerializeAdjust(mt->nestedTypeIndexes_)); 153 } 154 SerializeAdjust(const void * addr)155ptrdiff_t MetadataSerializer::SerializeAdjust(const void* addr) 156 { 157 return reinterpret_cast<uintptr_t>(addr) - baseAddr_; 158 } 159 Deserialize()160void MetadataSerializer::Deserialize() 161 { 162 DeserializeMetaComponent(metaComponent_); 163 } 164 DeserializeMetaComponent(MetaComponent * mc)165void MetadataSerializer::DeserializeMetaComponent(MetaComponent* mc) 166 { 167 if (mc == nullptr) { 168 return; 169 } 170 mc->name_ = reinterpret_cast<char*>(DeserializeAdjust(mc->name_)); 171 172 mc->namespaces_ = reinterpret_cast<MetaNamespace**>(DeserializeAdjust(mc->namespaces_)); 173 for (int i = 0; i < mc->namespaceNumber_; i++) { 174 mc->namespaces_[i] = reinterpret_cast<MetaNamespace*>(DeserializeAdjust(mc->namespaces_[i])); 175 MetaNamespace* mn = mc->namespaces_[i]; 176 DeserializeMetaNamespace(mn); 177 } 178 179 mc->sequenceables_ = reinterpret_cast<MetaSequenceable**>(DeserializeAdjust(mc->sequenceables_)); 180 for (int i = 0; i < mc->sequenceableNumber_; i++) { 181 mc->sequenceables_[i] = reinterpret_cast<MetaSequenceable*>(DeserializeAdjust(mc->sequenceables_[i])); 182 MetaSequenceable* mp = mc->sequenceables_[i]; 183 DeserializeMetaSequenceable(mp); 184 } 185 186 mc->rawdatas_ = reinterpret_cast<MetaRawData**>(DeserializeAdjust(mc->rawdatas_)); 187 for (int i = 0; i < mc->rawdataNumber_; i++) { 188 mc->rawdatas_[i] = reinterpret_cast<MetaRawData*>(DeserializeAdjust(mc->rawdatas_[i])); 189 MetaRawData* mp = mc->rawdatas_[i]; 190 DeserializeMetaRawData(mp); 191 } 192 193 mc->interfaces_ = reinterpret_cast<MetaInterface**>(DeserializeAdjust(mc->interfaces_)); 194 for (int i = 0; i < mc->interfaceNumber_; i++) { 195 mc->interfaces_[i] = reinterpret_cast<MetaInterface*>(DeserializeAdjust(mc->interfaces_[i])); 196 MetaInterface* mi = mc->interfaces_[i]; 197 DeserializeMetaInterface(mi); 198 } 199 200 mc->types_ = reinterpret_cast<MetaType**>(DeserializeAdjust(mc->types_)); 201 for (int i = 0; i < mc->typeNumber_; i++) { 202 mc->types_[i] = reinterpret_cast<MetaType*>(DeserializeAdjust(mc->types_[i])); 203 MetaType* mt = mc->types_[i]; 204 DeserializeMetaType(mt); 205 } 206 207 mc->stringPool_ = reinterpret_cast<char*>(DeserializeAdjust(mc->stringPool_)); 208 } 209 DeserializeMetaNamespace(MetaNamespace * mn)210void MetadataSerializer::DeserializeMetaNamespace(MetaNamespace* mn) 211 { 212 if (mn == nullptr || mn->namespaceNumber_ < 0 || mn->namespaceNumber_ > UINT16_MAX) { 213 return; 214 } 215 mn->name_ = reinterpret_cast<char*>(DeserializeAdjust(mn->name_)); 216 mn->sequenceableIndexes_ = reinterpret_cast<int*>(DeserializeAdjust(mn->sequenceableIndexes_)); 217 mn->rawdataIndexes_ = reinterpret_cast<int*>(DeserializeAdjust(mn->rawdataIndexes_)); 218 mn->interfaceIndexes_ = reinterpret_cast<int*>(DeserializeAdjust(mn->interfaceIndexes_)); 219 220 mn->namespaces_ = reinterpret_cast<MetaNamespace**>(DeserializeAdjust(mn->namespaces_)); 221 for (int i = 0; i < mn->namespaceNumber_; i++) { 222 mn->namespaces_[i] = reinterpret_cast<MetaNamespace*>(DeserializeAdjust(mn->namespaces_[i])); 223 MetaNamespace* innermn = mn->namespaces_[i]; 224 DeserializeMetaNamespace(innermn); 225 } 226 } 227 DeserializeMetaSequenceable(MetaSequenceable * mp)228void MetadataSerializer::DeserializeMetaSequenceable(MetaSequenceable* mp) 229 { 230 if (mp == nullptr) { 231 return; 232 } 233 mp->name_ = reinterpret_cast<char*>(DeserializeAdjust(mp->name_)); 234 mp->namespace_ = reinterpret_cast<char*>(DeserializeAdjust(mp->namespace_)); 235 } 236 DeserializeMetaRawData(MetaRawData * mr)237void MetadataSerializer::DeserializeMetaRawData(MetaRawData* mr) 238 { 239 if (mr == nullptr) { 240 return; 241 } 242 mr->name_ = reinterpret_cast<char*>(DeserializeAdjust(mr->name_)); 243 mr->namespace_ = reinterpret_cast<char*>(DeserializeAdjust(mr->namespace_)); 244 } 245 DeserializeMetaInterface(MetaInterface * mi)246void MetadataSerializer::DeserializeMetaInterface(MetaInterface* mi) 247 { 248 if (mi == nullptr) { 249 return; 250 } 251 mi->license_ = reinterpret_cast<char*>(DeserializeAdjust(mi->license_)); 252 mi->name_ = reinterpret_cast<char*>(DeserializeAdjust(mi->name_)); 253 mi->namespace_ = reinterpret_cast<char*>(DeserializeAdjust(mi->namespace_)); 254 255 mi->methods_ = reinterpret_cast<MetaMethod**>(DeserializeAdjust(mi->methods_)); 256 for (int i = 0; i < mi->methodNumber_; i++) { 257 mi->methods_[i] = reinterpret_cast<MetaMethod*>(DeserializeAdjust(mi->methods_[i])); 258 MetaMethod* mm = mi->methods_[i]; 259 DeserializeMetaMethod(mm); 260 } 261 } 262 DeserializeMetaMethod(MetaMethod * mm)263void MetadataSerializer::DeserializeMetaMethod(MetaMethod* mm) 264 { 265 if (mm == nullptr) { 266 return; 267 } 268 mm->name_ = reinterpret_cast<char*>(DeserializeAdjust(mm->name_)); 269 mm->signature_ = reinterpret_cast<char*>(DeserializeAdjust(mm->signature_)); 270 271 mm->parameters_ = reinterpret_cast<MetaParameter**>(DeserializeAdjust(mm->parameters_)); 272 for (int i = 0; i < mm->parameterNumber_; i++) { 273 mm->parameters_[i] = reinterpret_cast<MetaParameter*>(DeserializeAdjust(mm->parameters_[i])); 274 MetaParameter* mp = mm->parameters_[i]; 275 DeserializeMetaParameter(mp); 276 } 277 } 278 DeserializeMetaParameter(MetaParameter * mp)279void MetadataSerializer::DeserializeMetaParameter(MetaParameter* mp) 280 { 281 if (mp == nullptr) { 282 return; 283 } 284 mp->name_ = reinterpret_cast<char*>(DeserializeAdjust(mp->name_)); 285 } 286 DeserializeMetaType(MetaType * mt)287void MetadataSerializer::DeserializeMetaType(MetaType* mt) 288 { 289 if (mt == nullptr) { 290 return; 291 } 292 mt->nestedTypeIndexes_ = reinterpret_cast<int*>(DeserializeAdjust(mt->nestedTypeIndexes_)); 293 } 294 DeserializeAdjust(const void * addr)295uintptr_t MetadataSerializer::DeserializeAdjust(const void* addr) 296 { 297 return reinterpret_cast<ptrdiff_t>(addr) + baseAddr_; 298 } 299 } // namespace Idl 300 } // namespace OHOS 301