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