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_reader.h" 17ca0551cfSopenharmony_ci 18ca0551cfSopenharmony_ci#include "metadata/metadata_serializer.h" 19ca0551cfSopenharmony_ci#include "util/file.h" 20ca0551cfSopenharmony_ci#include "util/logger.h" 21ca0551cfSopenharmony_ci 22ca0551cfSopenharmony_cinamespace OHOS { 23ca0551cfSopenharmony_cinamespace Idl { 24ca0551cfSopenharmony_cistd::string MetadataReader::tag_ = "MetadataReader"; 25ca0551cfSopenharmony_ci 26ca0551cfSopenharmony_cistd::shared_ptr<MetaComponent> MetadataReader::ReadMetadataFromFile(const std::string& filePath) 27ca0551cfSopenharmony_ci{ 28ca0551cfSopenharmony_ci File file(filePath, File::READ); 29ca0551cfSopenharmony_ci if (!file.IsValid()) { 30ca0551cfSopenharmony_ci Logger::E(tag_.c_str(), "Open \"%s\" file failed.", filePath.c_str()); 31ca0551cfSopenharmony_ci return nullptr; 32ca0551cfSopenharmony_ci } 33ca0551cfSopenharmony_ci 34ca0551cfSopenharmony_ci if (!file.Reset()) { 35ca0551cfSopenharmony_ci Logger::E(tag_.c_str(), "Reset \"%s\" file failed.", filePath.c_str()); 36ca0551cfSopenharmony_ci return nullptr; 37ca0551cfSopenharmony_ci } 38ca0551cfSopenharmony_ci 39ca0551cfSopenharmony_ci MetaComponent header; 40ca0551cfSopenharmony_ci 41ca0551cfSopenharmony_ci if (!file.ReadData((void*)&header, sizeof(MetaComponent))) { 42ca0551cfSopenharmony_ci Logger::E(tag_.c_str(), "Read \"%s\" file failed.", filePath.c_str()); 43ca0551cfSopenharmony_ci return nullptr; 44ca0551cfSopenharmony_ci } 45ca0551cfSopenharmony_ci 46ca0551cfSopenharmony_ci if (header.magic_ != METADATA_MAGIC_NUMBER || header.size_ < 0) { 47ca0551cfSopenharmony_ci Logger::E(tag_.c_str(), "The metadata in \"%s\" file is bad.", filePath.c_str()); 48ca0551cfSopenharmony_ci return nullptr; 49ca0551cfSopenharmony_ci } 50ca0551cfSopenharmony_ci 51ca0551cfSopenharmony_ci if (!file.Reset()) { 52ca0551cfSopenharmony_ci Logger::E(tag_.c_str(), "Reset \"%s\" file failed.", filePath.c_str()); 53ca0551cfSopenharmony_ci return nullptr; 54ca0551cfSopenharmony_ci } 55ca0551cfSopenharmony_ci 56ca0551cfSopenharmony_ci void* data = malloc(header.size_); 57ca0551cfSopenharmony_ci if (data == nullptr) { 58ca0551cfSopenharmony_ci Logger::E(tag_.c_str(), "Malloc metadata failed."); 59ca0551cfSopenharmony_ci return nullptr; 60ca0551cfSopenharmony_ci } 61ca0551cfSopenharmony_ci 62ca0551cfSopenharmony_ci if (!file.ReadData(data, header.size_)) { 63ca0551cfSopenharmony_ci Logger::E(tag_.c_str(), "Read \"%s\" file failed.", filePath.c_str()); 64ca0551cfSopenharmony_ci free(data); 65ca0551cfSopenharmony_ci return nullptr; 66ca0551cfSopenharmony_ci } 67ca0551cfSopenharmony_ci 68ca0551cfSopenharmony_ci std::shared_ptr<MetaComponent> metadata(reinterpret_cast<MetaComponent *>(data), [](MetaComponent* p) { free(p); }); 69ca0551cfSopenharmony_ci 70ca0551cfSopenharmony_ci MetadataSerializer serializer((uintptr_t)data); 71ca0551cfSopenharmony_ci serializer.Deserialize(); 72ca0551cfSopenharmony_ci 73ca0551cfSopenharmony_ci return metadata; 74ca0551cfSopenharmony_ci} 75ca0551cfSopenharmony_ci 76ca0551cfSopenharmony_cistd::unordered_map<std::string, AutoPtr<AST>> MetadataReader::ReadMetadataToAst() 77ca0551cfSopenharmony_ci{ 78ca0551cfSopenharmony_ci std::unordered_map<std::string, AutoPtr<AST>> allAsts; 79ca0551cfSopenharmony_ci 80ca0551cfSopenharmony_ci ast_ = new AST(); 81ca0551cfSopenharmony_ci for (int i = 0; i < metaComponent_->sequenceableNumber_; i++) { 82ca0551cfSopenharmony_ci ReadMetaSequenceable(metaComponent_->sequenceables_[i]); 83ca0551cfSopenharmony_ci } 84ca0551cfSopenharmony_ci 85ca0551cfSopenharmony_ci for (int i = 0; i < metaComponent_->interfaceNumber_; i++) { 86ca0551cfSopenharmony_ci ReadMetaInterface(metaComponent_->interfaces_[i]); 87ca0551cfSopenharmony_ci } 88ca0551cfSopenharmony_ci 89ca0551cfSopenharmony_ci ast_->SetFullName(std::string(reinterpret_cast<char*>(metaComponent_->name_))); 90ca0551cfSopenharmony_ci ast_->SetAStFileType(ASTFileType::AST_IFACE); 91ca0551cfSopenharmony_ci allAsts[std::string(reinterpret_cast<char*>(metaComponent_->name_))] = ast_; 92ca0551cfSopenharmony_ci 93ca0551cfSopenharmony_ci return allAsts; 94ca0551cfSopenharmony_ci} 95ca0551cfSopenharmony_ci 96ca0551cfSopenharmony_civoid MetadataReader::ReadMetaSequenceable(MetaSequenceable* mp) 97ca0551cfSopenharmony_ci{ 98ca0551cfSopenharmony_ci AutoPtr<ASTSequenceableType> seqType = new ASTSequenceableType(); 99ca0551cfSopenharmony_ci 100ca0551cfSopenharmony_ci seqType->SetName(std::string(reinterpret_cast<char*>(mp->name_))); 101ca0551cfSopenharmony_ci seqType->SetNamespace(ast_->ParseNamespace(std::string(reinterpret_cast<char*>(mp->namespace_)))); 102ca0551cfSopenharmony_ci AutoPtr<AST> seqAst = new AST(); 103ca0551cfSopenharmony_ci seqAst->SetFullName(seqType->GetFullName()); 104ca0551cfSopenharmony_ci seqAst->AddSequenceableDef(seqType); 105ca0551cfSopenharmony_ci seqAst->SetAStFileType(ASTFileType::AST_SEQUENCEABLE); 106ca0551cfSopenharmony_ci ast_->AddImport(seqAst); 107ca0551cfSopenharmony_ci ast_->AddSequenceableDef(seqType); 108ca0551cfSopenharmony_ci} 109ca0551cfSopenharmony_ci 110ca0551cfSopenharmony_civoid MetadataReader::ReadMetaInterface(MetaInterface* mi) 111ca0551cfSopenharmony_ci{ 112ca0551cfSopenharmony_ci AutoPtr<ASTInterfaceType> interface = new ASTInterfaceType(); 113ca0551cfSopenharmony_ci AutoPtr<ASTAttr> infAttr = new ASTAttr(); 114ca0551cfSopenharmony_ci if (mi->properties_ == INTERFACE_PROPERTY_ONEWAY) { 115ca0551cfSopenharmony_ci infAttr->SetValue(ASTAttr::ONEWAY); 116ca0551cfSopenharmony_ci } 117ca0551cfSopenharmony_ci interface->SetAttribute(infAttr); 118ca0551cfSopenharmony_ci if (!mi->external_) { 119ca0551cfSopenharmony_ci interface->SetLicense(std::string(reinterpret_cast<char*>(mi->license_))); 120ca0551cfSopenharmony_ci ast_->SetLicense(std::string(reinterpret_cast<char*>(mi->license_))); 121ca0551cfSopenharmony_ci } 122ca0551cfSopenharmony_ci interface->SetName(std::string(reinterpret_cast<char*>(mi->name_))); 123ca0551cfSopenharmony_ci 124ca0551cfSopenharmony_ci interface->SetNamespace(ast_->ParseNamespace(std::string(reinterpret_cast<char*>(mi->namespace_)))); 125ca0551cfSopenharmony_ci interface->SetExternal(mi->external_); 126ca0551cfSopenharmony_ci ast_->AddInterfaceDef(interface); 127ca0551cfSopenharmony_ci for (int i = 0; i < mi->methodNumber_; i++) { 128ca0551cfSopenharmony_ci ReadMetaMethod(interface, mi->methods_[i]); 129ca0551cfSopenharmony_ci } 130ca0551cfSopenharmony_ci} 131ca0551cfSopenharmony_ci 132ca0551cfSopenharmony_civoid MetadataReader::ReadMetaMethod(AutoPtr<ASTInterfaceType>& interface, MetaMethod* mm) 133ca0551cfSopenharmony_ci{ 134ca0551cfSopenharmony_ci AutoPtr<ASTMethod> method = new ASTMethod(); 135ca0551cfSopenharmony_ci AutoPtr<ASTAttr> methodAttr = new ASTAttr(); 136ca0551cfSopenharmony_ci if (mm->properties_ == METHOD_PROPERTY_ONEWAY) { 137ca0551cfSopenharmony_ci methodAttr->SetValue(ASTAttr::ONEWAY); 138ca0551cfSopenharmony_ci } 139ca0551cfSopenharmony_ci method->SetAttribute(methodAttr); 140ca0551cfSopenharmony_ci 141ca0551cfSopenharmony_ci MetaType* type = metaComponent_->types_[mm->returnTypeIndex_]; 142ca0551cfSopenharmony_ci method->SetReturnType(ReadMetaType(type)); 143ca0551cfSopenharmony_ci method->SetName(std::string(reinterpret_cast<char*>((mm->name_)))); 144ca0551cfSopenharmony_ci for (int i = 0; i < mm->parameterNumber_; i++) { 145ca0551cfSopenharmony_ci ReadMetaParam(method, mm->parameters_[i]); 146ca0551cfSopenharmony_ci } 147ca0551cfSopenharmony_ci interface->AddMethod(method); 148ca0551cfSopenharmony_ci} 149ca0551cfSopenharmony_ci 150ca0551cfSopenharmony_civoid MetadataReader::ReadMetaParam(AutoPtr<ASTMethod>& method, MetaParameter* mp) 151ca0551cfSopenharmony_ci{ 152ca0551cfSopenharmony_ci AutoPtr<ASTParamAttr> attr = new ASTParamAttr(ASTParamAttr::PARAM_NONE); 153ca0551cfSopenharmony_ci 154ca0551cfSopenharmony_ci if ((mp->attributes_ & ATTR_IN) == ATTR_IN) { 155ca0551cfSopenharmony_ci attr->value_ |= ASTParamAttr::PARAM_IN; 156ca0551cfSopenharmony_ci } 157ca0551cfSopenharmony_ci 158ca0551cfSopenharmony_ci if ((mp->attributes_ & ATTR_OUT) == ATTR_OUT) { 159ca0551cfSopenharmony_ci attr->value_ |= ASTParamAttr::PARAM_OUT; 160ca0551cfSopenharmony_ci } 161ca0551cfSopenharmony_ci 162ca0551cfSopenharmony_ci MetaType* type = metaComponent_->types_[mp->typeIndex_]; 163ca0551cfSopenharmony_ci AutoPtr<ASTParameter> param = new ASTParameter(std::string(reinterpret_cast<char*>((mp->name_))), 164ca0551cfSopenharmony_ci attr, ReadMetaType(type)); 165ca0551cfSopenharmony_ci method->AddParameter(param); 166ca0551cfSopenharmony_ci} 167ca0551cfSopenharmony_ci 168ca0551cfSopenharmony_ciAutoPtr<ASTType> MetadataReader::ReadMetaType(MetaType* type) 169ca0551cfSopenharmony_ci{ 170ca0551cfSopenharmony_ci std::string typeName = MetaTypeName(type); 171ca0551cfSopenharmony_ci AutoPtr<ASTType> astType = ast_->FindType(typeName); 172ca0551cfSopenharmony_ci switch (type->kind_) { 173ca0551cfSopenharmony_ci case MetaTypeKind::List: 174ca0551cfSopenharmony_ci if (astType == nullptr) { 175ca0551cfSopenharmony_ci MetaType* elementMt = metaComponent_->types_[type->nestedTypeIndexes_[0]]; 176ca0551cfSopenharmony_ci AutoPtr<ASTListType> listType = new ASTListType(); 177ca0551cfSopenharmony_ci listType->SetElementType(ReadMetaType(elementMt)); 178ca0551cfSopenharmony_ci astType = listType.Get(); 179ca0551cfSopenharmony_ci } 180ca0551cfSopenharmony_ci break; 181ca0551cfSopenharmony_ci case MetaTypeKind::Map: 182ca0551cfSopenharmony_ci if (astType == nullptr) { 183ca0551cfSopenharmony_ci MetaType* keyMt = metaComponent_->types_[type->nestedTypeIndexes_[0]]; 184ca0551cfSopenharmony_ci MetaType* valueMt = metaComponent_->types_[type->nestedTypeIndexes_[1]]; 185ca0551cfSopenharmony_ci AutoPtr<ASTMapType> mapType = new ASTMapType(); 186ca0551cfSopenharmony_ci mapType->SetKeyType(ReadMetaType(keyMt)); 187ca0551cfSopenharmony_ci mapType->SetValueType(ReadMetaType(valueMt)); 188ca0551cfSopenharmony_ci astType = mapType.Get(); 189ca0551cfSopenharmony_ci } 190ca0551cfSopenharmony_ci break; 191ca0551cfSopenharmony_ci case MetaTypeKind::Array: 192ca0551cfSopenharmony_ci if (astType == nullptr) { 193ca0551cfSopenharmony_ci MetaType* elementMt = metaComponent_->types_[type->nestedTypeIndexes_[0]]; 194ca0551cfSopenharmony_ci AutoPtr<ASTArrayType> arrayType = new ASTArrayType(); 195ca0551cfSopenharmony_ci arrayType->SetElementType(ReadMetaType(elementMt)); 196ca0551cfSopenharmony_ci astType = arrayType.Get(); 197ca0551cfSopenharmony_ci } 198ca0551cfSopenharmony_ci break; 199ca0551cfSopenharmony_ci default: 200ca0551cfSopenharmony_ci break; 201ca0551cfSopenharmony_ci } 202ca0551cfSopenharmony_ci ast_->AddType(astType); 203ca0551cfSopenharmony_ci return astType; 204ca0551cfSopenharmony_ci} 205ca0551cfSopenharmony_ci 206ca0551cfSopenharmony_cistd::string MetadataReader::MetaTypeName(MetaType* mt) 207ca0551cfSopenharmony_ci{ 208ca0551cfSopenharmony_ci switch (mt->kind_) { 209ca0551cfSopenharmony_ci case MetaTypeKind::Char: 210ca0551cfSopenharmony_ci return "char"; 211ca0551cfSopenharmony_ci case MetaTypeKind::Boolean: 212ca0551cfSopenharmony_ci return "boolean"; 213ca0551cfSopenharmony_ci case MetaTypeKind::Byte: 214ca0551cfSopenharmony_ci return "byte"; 215ca0551cfSopenharmony_ci case MetaTypeKind::Short: 216ca0551cfSopenharmony_ci return "short"; 217ca0551cfSopenharmony_ci case MetaTypeKind::Integer: 218ca0551cfSopenharmony_ci return "int"; 219ca0551cfSopenharmony_ci case MetaTypeKind::Long: 220ca0551cfSopenharmony_ci return "long"; 221ca0551cfSopenharmony_ci case MetaTypeKind::Float: 222ca0551cfSopenharmony_ci return "float"; 223ca0551cfSopenharmony_ci case MetaTypeKind::Double: 224ca0551cfSopenharmony_ci return "double"; 225ca0551cfSopenharmony_ci case MetaTypeKind::String: 226ca0551cfSopenharmony_ci return "String"; 227ca0551cfSopenharmony_ci case MetaTypeKind::Void: 228ca0551cfSopenharmony_ci return "void"; 229ca0551cfSopenharmony_ci case MetaTypeKind::Sequenceable: { 230ca0551cfSopenharmony_ci MetaSequenceable* mp = metaComponent_->sequenceables_[mt->index_]; 231ca0551cfSopenharmony_ci return reinterpret_cast<char*>(mp->name_); 232ca0551cfSopenharmony_ci } 233ca0551cfSopenharmony_ci case MetaTypeKind::Interface: { 234ca0551cfSopenharmony_ci MetaInterface* mi = metaComponent_->interfaces_[mt->index_]; 235ca0551cfSopenharmony_ci return reinterpret_cast<char*>(mi->name_); 236ca0551cfSopenharmony_ci } 237ca0551cfSopenharmony_ci case MetaTypeKind::List: { 238ca0551cfSopenharmony_ci MetaType* elementMt = metaComponent_->types_[mt->nestedTypeIndexes_[0]]; 239ca0551cfSopenharmony_ci return "List<" + MetaTypeName(elementMt) + ">"; 240ca0551cfSopenharmony_ci } 241ca0551cfSopenharmony_ci case MetaTypeKind::Map: { 242ca0551cfSopenharmony_ci MetaType* keyMt = metaComponent_->types_[mt->nestedTypeIndexes_[0]]; 243ca0551cfSopenharmony_ci MetaType* valueMt = metaComponent_->types_[mt->nestedTypeIndexes_[1]]; 244ca0551cfSopenharmony_ci return "Map<" + MetaTypeName(keyMt) + ", " + MetaTypeName(valueMt) + ">"; 245ca0551cfSopenharmony_ci } 246ca0551cfSopenharmony_ci case MetaTypeKind::Array: { 247ca0551cfSopenharmony_ci MetaType* elementMt = metaComponent_->types_[mt->nestedTypeIndexes_[0]]; 248ca0551cfSopenharmony_ci return MetaTypeName(elementMt) + "[]"; 249ca0551cfSopenharmony_ci } 250ca0551cfSopenharmony_ci case MetaTypeKind::Unknown: 251ca0551cfSopenharmony_ci default: 252ca0551cfSopenharmony_ci printf("Unknown %d\n", mt->index_); 253ca0551cfSopenharmony_ci return "unknown"; 254ca0551cfSopenharmony_ci } 255ca0551cfSopenharmony_ci} 256ca0551cfSopenharmony_ci} // namespace Idl 257ca0551cfSopenharmony_ci} // namespace OHOS 258