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