1ca0551cfSopenharmony_ci/* 2ca0551cfSopenharmony_ci * Copyright (c) 2022 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 17ca0551cfSopenharmony_ci#include <climits> 18ca0551cfSopenharmony_ci 19ca0551cfSopenharmony_ci#include "metadata/metadata_serializer.h" 20ca0551cfSopenharmony_ci 21ca0551cfSopenharmony_cinamespace OHOS { 22ca0551cfSopenharmony_cinamespace Idl { 23ca0551cfSopenharmony_civoid MetadataSerializer::Serialize() 24ca0551cfSopenharmony_ci{ 25ca0551cfSopenharmony_ci SerializeMetaComponent(metaComponent_); 26ca0551cfSopenharmony_ci} 27ca0551cfSopenharmony_ci 28ca0551cfSopenharmony_civoid MetadataSerializer::SerializeMetaComponent(MetaComponent* mc) 29ca0551cfSopenharmony_ci{ 30ca0551cfSopenharmony_ci if (mc == nullptr) { 31ca0551cfSopenharmony_ci return; 32ca0551cfSopenharmony_ci } 33ca0551cfSopenharmony_ci mc->name_ = reinterpret_cast<char*>(SerializeAdjust(mc->name_)); 34ca0551cfSopenharmony_ci 35ca0551cfSopenharmony_ci for (int i = 0; i < mc->namespaceNumber_; i++) { 36ca0551cfSopenharmony_ci MetaNamespace* mn = mc->namespaces_[i]; 37ca0551cfSopenharmony_ci SerializeMetaNamespace(mn); 38ca0551cfSopenharmony_ci mc->namespaces_[i] = reinterpret_cast<MetaNamespace*>(SerializeAdjust(mn)); 39ca0551cfSopenharmony_ci } 40ca0551cfSopenharmony_ci mc->namespaces_ = reinterpret_cast<MetaNamespace**>(SerializeAdjust(mc->namespaces_)); 41ca0551cfSopenharmony_ci 42ca0551cfSopenharmony_ci for (int i = 0; i < mc->sequenceableNumber_; i++) { 43ca0551cfSopenharmony_ci MetaSequenceable* mp = mc->sequenceables_[i]; 44ca0551cfSopenharmony_ci SerializeMetaSequenceable(mp); 45ca0551cfSopenharmony_ci mc->sequenceables_[i] = reinterpret_cast<MetaSequenceable*>(SerializeAdjust(mp)); 46ca0551cfSopenharmony_ci } 47ca0551cfSopenharmony_ci mc->sequenceables_ = reinterpret_cast<MetaSequenceable**>(SerializeAdjust(mc->sequenceables_)); 48ca0551cfSopenharmony_ci 49ca0551cfSopenharmony_ci for (int i = 0; i < mc->interfaceNumber_; i++) { 50ca0551cfSopenharmony_ci MetaInterface* mi = mc->interfaces_[i]; 51ca0551cfSopenharmony_ci SerializeMetaInterface(mi); 52ca0551cfSopenharmony_ci mc->interfaces_[i] = reinterpret_cast<MetaInterface*>(SerializeAdjust(mi)); 53ca0551cfSopenharmony_ci } 54ca0551cfSopenharmony_ci mc->interfaces_ = reinterpret_cast<MetaInterface**>(SerializeAdjust(mc->interfaces_)); 55ca0551cfSopenharmony_ci 56ca0551cfSopenharmony_ci for (int i = 0; i < mc->typeNumber_; i++) { 57ca0551cfSopenharmony_ci MetaType* mt = mc->types_[i]; 58ca0551cfSopenharmony_ci SerializeMetaType(mt); 59ca0551cfSopenharmony_ci mc->types_[i] = reinterpret_cast<MetaType*>(SerializeAdjust(mt)); 60ca0551cfSopenharmony_ci } 61ca0551cfSopenharmony_ci mc->types_ = reinterpret_cast<MetaType**>(SerializeAdjust(mc->types_)); 62ca0551cfSopenharmony_ci 63ca0551cfSopenharmony_ci mc->stringPool_ = reinterpret_cast<char*>(SerializeAdjust(mc->stringPool_)); 64ca0551cfSopenharmony_ci} 65ca0551cfSopenharmony_ci 66ca0551cfSopenharmony_civoid MetadataSerializer::SerializeMetaNamespace(MetaNamespace* mn) 67ca0551cfSopenharmony_ci{ 68ca0551cfSopenharmony_ci if (mn == nullptr) { 69ca0551cfSopenharmony_ci return; 70ca0551cfSopenharmony_ci } 71ca0551cfSopenharmony_ci mn->name_ = reinterpret_cast<char*>(SerializeAdjust(mn->name_)); 72ca0551cfSopenharmony_ci mn->sequenceableIndexes_ = reinterpret_cast<int*>(SerializeAdjust(mn->sequenceableIndexes_)); 73ca0551cfSopenharmony_ci mn->interfaceIndexes_ = reinterpret_cast<int*>(SerializeAdjust(mn->interfaceIndexes_)); 74ca0551cfSopenharmony_ci 75ca0551cfSopenharmony_ci for (int i = 0; i < mn->namespaceNumber_; i++) { 76ca0551cfSopenharmony_ci MetaNamespace* innermn = mn->namespaces_[i]; 77ca0551cfSopenharmony_ci SerializeMetaNamespace(innermn); 78ca0551cfSopenharmony_ci mn->namespaces_[i] = reinterpret_cast<MetaNamespace*>(SerializeAdjust(innermn)); 79ca0551cfSopenharmony_ci } 80ca0551cfSopenharmony_ci mn->namespaces_ = reinterpret_cast<MetaNamespace**>(SerializeAdjust(mn->namespaces_)); 81ca0551cfSopenharmony_ci} 82ca0551cfSopenharmony_ci 83ca0551cfSopenharmony_civoid MetadataSerializer::SerializeMetaSequenceable(MetaSequenceable* mp) 84ca0551cfSopenharmony_ci{ 85ca0551cfSopenharmony_ci if (mp == nullptr) { 86ca0551cfSopenharmony_ci return; 87ca0551cfSopenharmony_ci } 88ca0551cfSopenharmony_ci mp->name_ = reinterpret_cast<char*>(SerializeAdjust(mp->name_)); 89ca0551cfSopenharmony_ci mp->namespace_ = reinterpret_cast<char*>(SerializeAdjust(mp->namespace_)); 90ca0551cfSopenharmony_ci} 91ca0551cfSopenharmony_ci 92ca0551cfSopenharmony_civoid MetadataSerializer::SerializeMetaInterface(MetaInterface* mi) 93ca0551cfSopenharmony_ci{ 94ca0551cfSopenharmony_ci if (mi == nullptr) { 95ca0551cfSopenharmony_ci return; 96ca0551cfSopenharmony_ci } 97ca0551cfSopenharmony_ci mi->license_ = reinterpret_cast<char*>(SerializeAdjust(mi->license_)); 98ca0551cfSopenharmony_ci mi->name_ = reinterpret_cast<char*>(SerializeAdjust(mi->name_)); 99ca0551cfSopenharmony_ci mi->namespace_ = reinterpret_cast<char*>(SerializeAdjust(mi->namespace_)); 100ca0551cfSopenharmony_ci 101ca0551cfSopenharmony_ci for (int i = 0; i < mi->methodNumber_; i++) { 102ca0551cfSopenharmony_ci MetaMethod* mm = mi->methods_[i]; 103ca0551cfSopenharmony_ci SerializeMetaMethod(mm); 104ca0551cfSopenharmony_ci mi->methods_[i] = reinterpret_cast<MetaMethod*>(SerializeAdjust(mm)); 105ca0551cfSopenharmony_ci } 106ca0551cfSopenharmony_ci mi->methods_ = reinterpret_cast<MetaMethod**>(SerializeAdjust(mi->methods_)); 107ca0551cfSopenharmony_ci} 108ca0551cfSopenharmony_ci 109ca0551cfSopenharmony_civoid MetadataSerializer::SerializeMetaMethod(MetaMethod* mm) 110ca0551cfSopenharmony_ci{ 111ca0551cfSopenharmony_ci if (mm == nullptr) { 112ca0551cfSopenharmony_ci return; 113ca0551cfSopenharmony_ci } 114ca0551cfSopenharmony_ci mm->name_ = reinterpret_cast<char*>(SerializeAdjust(mm->name_)); 115ca0551cfSopenharmony_ci mm->signature_ = reinterpret_cast<char*>(SerializeAdjust(mm->signature_)); 116ca0551cfSopenharmony_ci 117ca0551cfSopenharmony_ci for (int i = 0; i < mm->parameterNumber_; i++) { 118ca0551cfSopenharmony_ci MetaParameter* mp = mm->parameters_[i]; 119ca0551cfSopenharmony_ci SerializeMetaParameter(mp); 120ca0551cfSopenharmony_ci mm->parameters_[i] = reinterpret_cast<MetaParameter*>(SerializeAdjust(mp)); 121ca0551cfSopenharmony_ci } 122ca0551cfSopenharmony_ci mm->parameters_ = reinterpret_cast<MetaParameter**>(SerializeAdjust(mm->parameters_)); 123ca0551cfSopenharmony_ci} 124ca0551cfSopenharmony_ci 125ca0551cfSopenharmony_civoid MetadataSerializer::SerializeMetaParameter(MetaParameter* mp) 126ca0551cfSopenharmony_ci{ 127ca0551cfSopenharmony_ci if (mp == nullptr) { 128ca0551cfSopenharmony_ci return; 129ca0551cfSopenharmony_ci } 130ca0551cfSopenharmony_ci mp->name_ = reinterpret_cast<char*>(SerializeAdjust(mp->name_)); 131ca0551cfSopenharmony_ci} 132ca0551cfSopenharmony_ci 133ca0551cfSopenharmony_civoid MetadataSerializer::SerializeMetaType(MetaType* mt) 134ca0551cfSopenharmony_ci{ 135ca0551cfSopenharmony_ci if (mt == nullptr) { 136ca0551cfSopenharmony_ci return; 137ca0551cfSopenharmony_ci } 138ca0551cfSopenharmony_ci mt->nestedTypeIndexes_ = reinterpret_cast<int*>(SerializeAdjust(mt->nestedTypeIndexes_)); 139ca0551cfSopenharmony_ci} 140ca0551cfSopenharmony_ci 141ca0551cfSopenharmony_ciptrdiff_t MetadataSerializer::SerializeAdjust(const void* addr) 142ca0551cfSopenharmony_ci{ 143ca0551cfSopenharmony_ci return reinterpret_cast<uintptr_t>(addr) - baseAddr_; 144ca0551cfSopenharmony_ci} 145ca0551cfSopenharmony_ci 146ca0551cfSopenharmony_civoid MetadataSerializer::Deserialize() 147ca0551cfSopenharmony_ci{ 148ca0551cfSopenharmony_ci DeserializeMetaComponent(metaComponent_); 149ca0551cfSopenharmony_ci} 150ca0551cfSopenharmony_ci 151ca0551cfSopenharmony_civoid MetadataSerializer::DeserializeMetaComponent(MetaComponent* mc) 152ca0551cfSopenharmony_ci{ 153ca0551cfSopenharmony_ci if (mc == nullptr) { 154ca0551cfSopenharmony_ci return; 155ca0551cfSopenharmony_ci } 156ca0551cfSopenharmony_ci mc->name_ = reinterpret_cast<char*>(DeserializeAdjust(mc->name_)); 157ca0551cfSopenharmony_ci 158ca0551cfSopenharmony_ci mc->namespaces_ = reinterpret_cast<MetaNamespace**>(DeserializeAdjust(mc->namespaces_)); 159ca0551cfSopenharmony_ci if (mc->namespaceNumber_ > 0 && mc->namespaceNumber_ < INT_MAX) { 160ca0551cfSopenharmony_ci for (int i = 0; i < mc->namespaceNumber_; i++) { 161ca0551cfSopenharmony_ci mc->namespaces_[i] = reinterpret_cast<MetaNamespace*>(DeserializeAdjust(mc->namespaces_[i])); 162ca0551cfSopenharmony_ci MetaNamespace* mn = mc->namespaces_[i]; 163ca0551cfSopenharmony_ci DeserializeMetaNamespace(mn); 164ca0551cfSopenharmony_ci } 165ca0551cfSopenharmony_ci } 166ca0551cfSopenharmony_ci 167ca0551cfSopenharmony_ci mc->sequenceables_ = reinterpret_cast<MetaSequenceable**>(DeserializeAdjust(mc->sequenceables_)); 168ca0551cfSopenharmony_ci if (mc->sequenceableNumber_ > 0 && mc->sequenceableNumber_ < INT_MAX) { 169ca0551cfSopenharmony_ci for (int i = 0; i < mc->sequenceableNumber_; i++) { 170ca0551cfSopenharmony_ci mc->sequenceables_[i] = reinterpret_cast<MetaSequenceable*>(DeserializeAdjust(mc->sequenceables_[i])); 171ca0551cfSopenharmony_ci MetaSequenceable* mp = mc->sequenceables_[i]; 172ca0551cfSopenharmony_ci DeserializeMetaSequenceable(mp); 173ca0551cfSopenharmony_ci } 174ca0551cfSopenharmony_ci } 175ca0551cfSopenharmony_ci 176ca0551cfSopenharmony_ci mc->interfaces_ = reinterpret_cast<MetaInterface**>(DeserializeAdjust(mc->interfaces_)); 177ca0551cfSopenharmony_ci for (int i = 0; i < mc->interfaceNumber_; i++) { 178ca0551cfSopenharmony_ci mc->interfaces_[i] = reinterpret_cast<MetaInterface*>(DeserializeAdjust(mc->interfaces_[i])); 179ca0551cfSopenharmony_ci MetaInterface* mi = mc->interfaces_[i]; 180ca0551cfSopenharmony_ci DeserializeMetaInterface(mi); 181ca0551cfSopenharmony_ci } 182ca0551cfSopenharmony_ci 183ca0551cfSopenharmony_ci mc->types_ = reinterpret_cast<MetaType**>(DeserializeAdjust(mc->types_)); 184ca0551cfSopenharmony_ci for (int i = 0; i < mc->typeNumber_; i++) { 185ca0551cfSopenharmony_ci mc->types_[i] = reinterpret_cast<MetaType*>(DeserializeAdjust(mc->types_[i])); 186ca0551cfSopenharmony_ci MetaType* mt = mc->types_[i]; 187ca0551cfSopenharmony_ci DeserializeMetaType(mt); 188ca0551cfSopenharmony_ci } 189ca0551cfSopenharmony_ci 190ca0551cfSopenharmony_ci mc->stringPool_ = reinterpret_cast<char*>(DeserializeAdjust(mc->stringPool_)); 191ca0551cfSopenharmony_ci} 192ca0551cfSopenharmony_ci 193ca0551cfSopenharmony_civoid MetadataSerializer::DeserializeMetaNamespace(MetaNamespace* mn) 194ca0551cfSopenharmony_ci{ 195ca0551cfSopenharmony_ci if (mn == nullptr) { 196ca0551cfSopenharmony_ci return; 197ca0551cfSopenharmony_ci } 198ca0551cfSopenharmony_ci mn->name_ = reinterpret_cast<char*>(DeserializeAdjust(mn->name_)); 199ca0551cfSopenharmony_ci mn->sequenceableIndexes_ = reinterpret_cast<int*>(DeserializeAdjust(mn->sequenceableIndexes_)); 200ca0551cfSopenharmony_ci mn->interfaceIndexes_ = reinterpret_cast<int*>(DeserializeAdjust(mn->interfaceIndexes_)); 201ca0551cfSopenharmony_ci 202ca0551cfSopenharmony_ci mn->namespaces_ = reinterpret_cast<MetaNamespace**>(DeserializeAdjust(mn->namespaces_)); 203ca0551cfSopenharmony_ci if (mn->namespaceNumber_ > 0 && mn->namespaceNumber_ < INT_MAX) { 204ca0551cfSopenharmony_ci for (int i = 0; i < mn->namespaceNumber_; i++) { 205ca0551cfSopenharmony_ci mn->namespaces_[i] = reinterpret_cast<MetaNamespace*>(DeserializeAdjust(mn->namespaces_[i])); 206ca0551cfSopenharmony_ci MetaNamespace* innermn = mn->namespaces_[i]; 207ca0551cfSopenharmony_ci DeserializeMetaNamespace(innermn); 208ca0551cfSopenharmony_ci } 209ca0551cfSopenharmony_ci } 210ca0551cfSopenharmony_ci} 211ca0551cfSopenharmony_ci 212ca0551cfSopenharmony_civoid MetadataSerializer::DeserializeMetaSequenceable(MetaSequenceable* mp) 213ca0551cfSopenharmony_ci{ 214ca0551cfSopenharmony_ci if (mp == nullptr) { 215ca0551cfSopenharmony_ci return; 216ca0551cfSopenharmony_ci } 217ca0551cfSopenharmony_ci mp->name_ = reinterpret_cast<char*>(DeserializeAdjust(mp->name_)); 218ca0551cfSopenharmony_ci mp->namespace_ = reinterpret_cast<char*>(DeserializeAdjust(mp->namespace_)); 219ca0551cfSopenharmony_ci} 220ca0551cfSopenharmony_ci 221ca0551cfSopenharmony_civoid MetadataSerializer::DeserializeMetaInterface(MetaInterface* mi) 222ca0551cfSopenharmony_ci{ 223ca0551cfSopenharmony_ci if (mi == nullptr) { 224ca0551cfSopenharmony_ci return; 225ca0551cfSopenharmony_ci } 226ca0551cfSopenharmony_ci mi->license_ = reinterpret_cast<char*>(DeserializeAdjust(mi->license_)); 227ca0551cfSopenharmony_ci mi->name_ = reinterpret_cast<char*>(DeserializeAdjust(mi->name_)); 228ca0551cfSopenharmony_ci mi->namespace_ = reinterpret_cast<char*>(DeserializeAdjust(mi->namespace_)); 229ca0551cfSopenharmony_ci 230ca0551cfSopenharmony_ci mi->methods_ = reinterpret_cast<MetaMethod**>(DeserializeAdjust(mi->methods_)); 231ca0551cfSopenharmony_ci for (int i = 0; i < mi->methodNumber_; i++) { 232ca0551cfSopenharmony_ci mi->methods_[i] = reinterpret_cast<MetaMethod*>(DeserializeAdjust(mi->methods_[i])); 233ca0551cfSopenharmony_ci MetaMethod* mm = mi->methods_[i]; 234ca0551cfSopenharmony_ci DeserializeMetaMethod(mm); 235ca0551cfSopenharmony_ci } 236ca0551cfSopenharmony_ci} 237ca0551cfSopenharmony_ci 238ca0551cfSopenharmony_civoid MetadataSerializer::DeserializeMetaMethod(MetaMethod* mm) 239ca0551cfSopenharmony_ci{ 240ca0551cfSopenharmony_ci if (mm == nullptr) { 241ca0551cfSopenharmony_ci return; 242ca0551cfSopenharmony_ci } 243ca0551cfSopenharmony_ci mm->name_ = reinterpret_cast<char*>(DeserializeAdjust(mm->name_)); 244ca0551cfSopenharmony_ci mm->signature_ = reinterpret_cast<char*>(DeserializeAdjust(mm->signature_)); 245ca0551cfSopenharmony_ci 246ca0551cfSopenharmony_ci mm->parameters_ = reinterpret_cast<MetaParameter**>(DeserializeAdjust(mm->parameters_)); 247ca0551cfSopenharmony_ci for (int i = 0; i < mm->parameterNumber_; i++) { 248ca0551cfSopenharmony_ci mm->parameters_[i] = reinterpret_cast<MetaParameter*>(DeserializeAdjust(mm->parameters_[i])); 249ca0551cfSopenharmony_ci MetaParameter* mp = mm->parameters_[i]; 250ca0551cfSopenharmony_ci DeserializeMetaParameter(mp); 251ca0551cfSopenharmony_ci } 252ca0551cfSopenharmony_ci} 253ca0551cfSopenharmony_ci 254ca0551cfSopenharmony_civoid MetadataSerializer::DeserializeMetaParameter(MetaParameter* mp) 255ca0551cfSopenharmony_ci{ 256ca0551cfSopenharmony_ci if (mp == nullptr) { 257ca0551cfSopenharmony_ci return; 258ca0551cfSopenharmony_ci } 259ca0551cfSopenharmony_ci mp->name_ = reinterpret_cast<char*>(DeserializeAdjust(mp->name_)); 260ca0551cfSopenharmony_ci} 261ca0551cfSopenharmony_ci 262ca0551cfSopenharmony_civoid MetadataSerializer::DeserializeMetaType(MetaType* mt) 263ca0551cfSopenharmony_ci{ 264ca0551cfSopenharmony_ci if (mt == nullptr) { 265ca0551cfSopenharmony_ci return; 266ca0551cfSopenharmony_ci } 267ca0551cfSopenharmony_ci mt->nestedTypeIndexes_ = reinterpret_cast<int*>(DeserializeAdjust(mt->nestedTypeIndexes_)); 268ca0551cfSopenharmony_ci} 269ca0551cfSopenharmony_ci 270ca0551cfSopenharmony_ciuintptr_t MetadataSerializer::DeserializeAdjust(const void* addr) 271ca0551cfSopenharmony_ci{ 272ca0551cfSopenharmony_ci return reinterpret_cast<ptrdiff_t>(addr) + baseAddr_; 273ca0551cfSopenharmony_ci} 274ca0551cfSopenharmony_ci} // namespace Idl 275ca0551cfSopenharmony_ci} // namespace OHOS 276