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_dumper.h"
17ca0551cfSopenharmony_ci#include "util/string_builder.h"
18ca0551cfSopenharmony_ci
19ca0551cfSopenharmony_cinamespace OHOS {
20ca0551cfSopenharmony_cinamespace Idl {
21ca0551cfSopenharmony_cistd::string MetadataDumper::tab_ = "    ";
22ca0551cfSopenharmony_cistd::string MetadataDumper::Dump(const std::string& prefix)
23ca0551cfSopenharmony_ci{
24ca0551cfSopenharmony_ci    if (metaComponent_ == nullptr) {
25ca0551cfSopenharmony_ci        return "";
26ca0551cfSopenharmony_ci    }
27ca0551cfSopenharmony_ci
28ca0551cfSopenharmony_ci    return DumpMetaComponent(metaComponent_, prefix);
29ca0551cfSopenharmony_ci}
30ca0551cfSopenharmony_ci
31ca0551cfSopenharmony_cistd::string MetadataDumper::DumpMetaComponent(MetaComponent* mc, const std::string& prefix)
32ca0551cfSopenharmony_ci{
33ca0551cfSopenharmony_ci    StringBuilder sb;
34ca0551cfSopenharmony_ci
35ca0551cfSopenharmony_ci    sb.Append(prefix).Append("MetaComponent\n");
36ca0551cfSopenharmony_ci    sb.Append(prefix).Append("{\n");
37ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"magic_\" : \"0x%x\",\n", mc->magic_);
38ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"size_\" : \"%d\",\n", mc->size_);
39ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"name_\" : \"%s\",\n", mc->name_);
40ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"namespaceNumber_\" : \"%d\",\n", mc->namespaceNumber_);
41ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"sequenceableNumber_\" : \"%d\",\n", mc->sequenceableNumber_);
42ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"interfaceNumber_\" : \"%d\",\n", mc->interfaceNumber_);
43ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"typeNumber_\" : \"%d\",\n", mc->typeNumber_);
44ca0551cfSopenharmony_ci
45ca0551cfSopenharmony_ci    DumpMetaNamespaces(sb, mc, prefix);
46ca0551cfSopenharmony_ci    DumpMetaSequenceables(sb, mc, prefix);
47ca0551cfSopenharmony_ci    DumpMetaInterfaces(sb, mc, prefix);
48ca0551cfSopenharmony_ci
49ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"stringPoolSize_\" : \"%d\"\n", mc->stringPoolSize_);
50ca0551cfSopenharmony_ci
51ca0551cfSopenharmony_ci    sb.Append(prefix).Append("}\n");
52ca0551cfSopenharmony_ci
53ca0551cfSopenharmony_ci    return sb.ToString();
54ca0551cfSopenharmony_ci}
55ca0551cfSopenharmony_ci
56ca0551cfSopenharmony_civoid MetadataDumper::DumpMetaNamespaces(StringBuilder& sb, MetaComponent* mc, const std::string& prefix)
57ca0551cfSopenharmony_ci{
58ca0551cfSopenharmony_ci    if (mc->namespaceNumber_ == 0) {
59ca0551cfSopenharmony_ci        sb.Append(prefix + tab_).Append("\"namespaces_\" : [],\n");
60ca0551cfSopenharmony_ci    } else {
61ca0551cfSopenharmony_ci        sb.Append(prefix + tab_).Append("\"namespaces_\" : [\n");
62ca0551cfSopenharmony_ci        for (int i = 0; i < mc->namespaceNumber_; i++) {
63ca0551cfSopenharmony_ci            DumpMetaNamespace(sb, mc->namespaces_[i], prefix + tab_ + tab_);
64ca0551cfSopenharmony_ci            if (i != mc->namespaceNumber_ - 1) {
65ca0551cfSopenharmony_ci                sb.Append(",\n");
66ca0551cfSopenharmony_ci            }
67ca0551cfSopenharmony_ci        }
68ca0551cfSopenharmony_ci        sb.Append("\n" + prefix + tab_).Append("],\n");
69ca0551cfSopenharmony_ci    }
70ca0551cfSopenharmony_ci}
71ca0551cfSopenharmony_ci
72ca0551cfSopenharmony_civoid MetadataDumper::DumpMetaNamespace(StringBuilder& sb, MetaNamespace* mn, const std::string& prefix)
73ca0551cfSopenharmony_ci{
74ca0551cfSopenharmony_ci    sb.Append(prefix).Append("{\n");
75ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"name_\" : \"%s\",\n", mn->name_);
76ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"sequenceableNumber_\" : \"%d\",\n", mn->sequenceableNumber_);
77ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"interfaceNumber_\" : \"%d\",\n", mn->interfaceNumber_);
78ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"namespaceNumber_\" : \"%d\",\n", mn->namespaceNumber_);
79ca0551cfSopenharmony_ci
80ca0551cfSopenharmony_ci    if (mn->sequenceableNumber_ == 0) {
81ca0551cfSopenharmony_ci        sb.Append(prefix + tab_).Append("\"sequenceableIndexes_\" : [],\n");
82ca0551cfSopenharmony_ci    } else {
83ca0551cfSopenharmony_ci        sb.Append(prefix + tab_).Append("\"sequenceableIndexes_\" : [\n");
84ca0551cfSopenharmony_ci        for (int i = 0; i < mn->sequenceableNumber_; i++) {
85ca0551cfSopenharmony_ci            MetaSequenceable* mp = metaComponent_->sequenceables_[i];
86ca0551cfSopenharmony_ci            sb.Append(prefix + tab_ + tab_).AppendFormat("{ \"name\" : \"%s\" }", mp->name_);
87ca0551cfSopenharmony_ci            if (i != mn->sequenceableNumber_ - 1) {
88ca0551cfSopenharmony_ci                sb.Append(",\n");
89ca0551cfSopenharmony_ci            }
90ca0551cfSopenharmony_ci        }
91ca0551cfSopenharmony_ci        sb.Append("\n" + prefix + tab_).Append("],\n");
92ca0551cfSopenharmony_ci    }
93ca0551cfSopenharmony_ci
94ca0551cfSopenharmony_ci    if (mn->interfaceNumber_ == 0) {
95ca0551cfSopenharmony_ci        sb.Append(prefix + tab_).Append("\"interfaceIndexes_\" : [],\n");
96ca0551cfSopenharmony_ci    } else {
97ca0551cfSopenharmony_ci        sb.Append(prefix + tab_).Append("\"interfaceIndexes_\" : [\n");
98ca0551cfSopenharmony_ci        for (int i = 0; i < mn->interfaceNumber_; i++) {
99ca0551cfSopenharmony_ci            MetaInterface* mi = metaComponent_->interfaces_[mn->interfaceIndexes_[i]];
100ca0551cfSopenharmony_ci            sb.Append(prefix + tab_ + tab_).AppendFormat("{ \"name\" : \"%s\" }", mi->name_);
101ca0551cfSopenharmony_ci            if (i != mn->interfaceNumber_ - 1) {
102ca0551cfSopenharmony_ci                sb.Append(",\n");
103ca0551cfSopenharmony_ci            }
104ca0551cfSopenharmony_ci        }
105ca0551cfSopenharmony_ci        sb.Append("\n" + prefix + tab_).Append("],\n");
106ca0551cfSopenharmony_ci    }
107ca0551cfSopenharmony_ci
108ca0551cfSopenharmony_ci    if (mn->namespaceNumber_ == 0) {
109ca0551cfSopenharmony_ci        sb.Append(prefix + tab_).Append("\"namespaces_\" : []\n");
110ca0551cfSopenharmony_ci    } else {
111ca0551cfSopenharmony_ci        sb.Append(prefix + tab_).Append("\"namespaces_\" : [\n");
112ca0551cfSopenharmony_ci        for (int i = 0; i < mn->namespaceNumber_; i++) {
113ca0551cfSopenharmony_ci            MetaNamespace* innermn = mn->namespaces_[i];
114ca0551cfSopenharmony_ci            DumpMetaNamespace(sb, innermn, prefix + tab_ + tab_);
115ca0551cfSopenharmony_ci            if (i != mn->namespaceNumber_ - 1) {
116ca0551cfSopenharmony_ci                sb.Append(",\n");
117ca0551cfSopenharmony_ci            }
118ca0551cfSopenharmony_ci        }
119ca0551cfSopenharmony_ci        sb.Append("\n" + prefix + tab_).Append("]\n");
120ca0551cfSopenharmony_ci    }
121ca0551cfSopenharmony_ci
122ca0551cfSopenharmony_ci    sb.Append(prefix).Append("}");
123ca0551cfSopenharmony_ci}
124ca0551cfSopenharmony_ci
125ca0551cfSopenharmony_civoid MetadataDumper::DumpMetaSequenceables(StringBuilder& sb, MetaComponent* mc, const std::string& prefix)
126ca0551cfSopenharmony_ci{
127ca0551cfSopenharmony_ci    if (mc->sequenceableNumber_ == 0) {
128ca0551cfSopenharmony_ci        sb.Append(prefix + tab_).Append("\"sequenceables_\" : [],\n");
129ca0551cfSopenharmony_ci    } else {
130ca0551cfSopenharmony_ci        sb.Append(prefix + tab_).Append("\"sequenceables_\" : [\n");
131ca0551cfSopenharmony_ci        for (int i = 0; i < mc->sequenceableNumber_; i++) {
132ca0551cfSopenharmony_ci            DumpMetaSequenceable(sb, mc->sequenceables_[i], prefix + tab_ + tab_);
133ca0551cfSopenharmony_ci            if (i != mc->sequenceableNumber_ - 1) {
134ca0551cfSopenharmony_ci                sb.Append(",\n");
135ca0551cfSopenharmony_ci            }
136ca0551cfSopenharmony_ci        }
137ca0551cfSopenharmony_ci        sb.Append("\n" + prefix + tab_).Append("],\n");
138ca0551cfSopenharmony_ci    }
139ca0551cfSopenharmony_ci}
140ca0551cfSopenharmony_ci
141ca0551cfSopenharmony_civoid MetadataDumper::DumpMetaSequenceable(StringBuilder& sb, MetaSequenceable* mp, const std::string& prefix)
142ca0551cfSopenharmony_ci{
143ca0551cfSopenharmony_ci    sb.Append(prefix).Append("{\n");
144ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"name_\" : \"%s\",\n", mp->name_);
145ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"namespace_\" : \"%s\"\n", mp->namespace_);
146ca0551cfSopenharmony_ci    sb.Append(prefix).Append("}");
147ca0551cfSopenharmony_ci}
148ca0551cfSopenharmony_ci
149ca0551cfSopenharmony_civoid MetadataDumper::DumpMetaInterfaces(StringBuilder& sb, MetaComponent* mc, const std::string& prefix)
150ca0551cfSopenharmony_ci{
151ca0551cfSopenharmony_ci    if (mc->interfaceNumber_ == 0) {
152ca0551cfSopenharmony_ci        sb.Append(prefix + tab_).Append("\"interfaces_\" : [],\n");
153ca0551cfSopenharmony_ci    } else {
154ca0551cfSopenharmony_ci        sb.Append(prefix + tab_).Append("\"interfaces_\" : [\n");
155ca0551cfSopenharmony_ci        for (int i = 0; i < mc->interfaceNumber_; i++) {
156ca0551cfSopenharmony_ci            DumpMetaInterface(sb, mc->interfaces_[i], prefix + tab_ + tab_);
157ca0551cfSopenharmony_ci            if (i != mc->interfaceNumber_ - 1) {
158ca0551cfSopenharmony_ci                sb.Append(",\n");
159ca0551cfSopenharmony_ci            }
160ca0551cfSopenharmony_ci        }
161ca0551cfSopenharmony_ci        sb.Append("\n" + prefix + tab_).Append("],\n");
162ca0551cfSopenharmony_ci    }
163ca0551cfSopenharmony_ci}
164ca0551cfSopenharmony_ci
165ca0551cfSopenharmony_civoid MetadataDumper::DumpMetaInterface(StringBuilder& sb, MetaInterface* mi, const std::string& prefix)
166ca0551cfSopenharmony_ci{
167ca0551cfSopenharmony_ci    sb.Append(prefix).Append("{\n");
168ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"name_\" : \"%s\",\n", mi->name_);
169ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"namespace_\" : \"%s\",\n", mi->namespace_);
170ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"properties_\" : \"%s\",\n",
171ca0551cfSopenharmony_ci        (mi->properties_ & INTERFACE_PROPERTY_ONEWAY) != 0 ? "oneway" : "");
172ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"methodNumber_\" : \"%d\",\n", mi->methodNumber_);
173ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"external_\" : \"%d\",\n", mi->external_);
174ca0551cfSopenharmony_ci
175ca0551cfSopenharmony_ci    if (mi->methodNumber_ == 0) {
176ca0551cfSopenharmony_ci        sb.Append(prefix + tab_).Append("\"methods_\" : []\n");
177ca0551cfSopenharmony_ci    } else {
178ca0551cfSopenharmony_ci        sb.Append(prefix + tab_).Append("\"methods_\" : [\n");
179ca0551cfSopenharmony_ci        for (int i = 0; i < mi->methodNumber_; i++) {
180ca0551cfSopenharmony_ci            DumpMetaMethod(sb, mi->methods_[i], prefix + tab_ + tab_);
181ca0551cfSopenharmony_ci            if (i != mi->methodNumber_ - 1) {
182ca0551cfSopenharmony_ci                sb.Append(",\n");
183ca0551cfSopenharmony_ci            }
184ca0551cfSopenharmony_ci        }
185ca0551cfSopenharmony_ci        sb.Append("\n" + prefix + tab_).Append("]\n");
186ca0551cfSopenharmony_ci    }
187ca0551cfSopenharmony_ci
188ca0551cfSopenharmony_ci    sb.Append(prefix).Append("}");
189ca0551cfSopenharmony_ci}
190ca0551cfSopenharmony_ci
191ca0551cfSopenharmony_civoid MetadataDumper::DumpMetaMethod(StringBuilder& sb, MetaMethod* mm, const std::string& prefix)
192ca0551cfSopenharmony_ci{
193ca0551cfSopenharmony_ci    sb.Append(prefix).Append("{\n");
194ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"name_\" : \"%s\",\n", mm->name_);
195ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"signature_\" : \"%s\",\n", mm->signature_);
196ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"properties_\" : \"%s\",\n",
197ca0551cfSopenharmony_ci        (mm->properties_ & METHOD_PROPERTY_ONEWAY) != 0 ? "oneway" : "");
198ca0551cfSopenharmony_ci    MetaType* type = metaComponent_->types_[mm->returnTypeIndex_];
199ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"returnType_\" : \"%s\",\n", DumpMetaType(type).c_str());
200ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"parameterNumber_\" : \"%d\",\n", mm->parameterNumber_);
201ca0551cfSopenharmony_ci
202ca0551cfSopenharmony_ci    if (mm->parameterNumber_ == 0) {
203ca0551cfSopenharmony_ci        sb.Append(prefix + tab_).Append("\"parameters_\" : []\n");
204ca0551cfSopenharmony_ci    } else {
205ca0551cfSopenharmony_ci        sb.Append(prefix + tab_).Append("\"parameters_\" : [\n");
206ca0551cfSopenharmony_ci        for (int i = 0; i < mm->parameterNumber_; i++) {
207ca0551cfSopenharmony_ci            DumpMetaParameter(sb, mm->parameters_[i], prefix + tab_ + tab_);
208ca0551cfSopenharmony_ci            if (i != mm->parameterNumber_ - 1) {
209ca0551cfSopenharmony_ci                sb.Append(",\n");
210ca0551cfSopenharmony_ci            }
211ca0551cfSopenharmony_ci        }
212ca0551cfSopenharmony_ci        sb.Append("\n" + prefix + tab_).Append("]\n");
213ca0551cfSopenharmony_ci    }
214ca0551cfSopenharmony_ci
215ca0551cfSopenharmony_ci    sb.Append(prefix).Append("}");
216ca0551cfSopenharmony_ci}
217ca0551cfSopenharmony_ci
218ca0551cfSopenharmony_civoid MetadataDumper::DumpMetaParameter(StringBuilder& sb, MetaParameter* mp, const std::string& prefix)
219ca0551cfSopenharmony_ci{
220ca0551cfSopenharmony_ci    sb.Append(prefix).Append("{\n");
221ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"name_\" : \"%s\",\n", mp->name_);
222ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).Append("\"attributes_\" : \"");
223ca0551cfSopenharmony_ci    bool addComma = false;
224ca0551cfSopenharmony_ci    if ((mp->attributes_ & ATTR_IN) == ATTR_IN) {
225ca0551cfSopenharmony_ci        sb.Append("in");
226ca0551cfSopenharmony_ci        addComma = true;
227ca0551cfSopenharmony_ci    }
228ca0551cfSopenharmony_ci    if ((mp->attributes_ & ATTR_OUT) == ATTR_OUT) {
229ca0551cfSopenharmony_ci        sb.Append(addComma ? ", out" : "out");
230ca0551cfSopenharmony_ci    }
231ca0551cfSopenharmony_ci    sb.Append("\",\n");
232ca0551cfSopenharmony_ci    MetaType* type = metaComponent_->types_[mp->typeIndex_];
233ca0551cfSopenharmony_ci    sb.Append(prefix + tab_).AppendFormat("\"type_\" : \"%s\"\n", DumpMetaType(type).c_str());
234ca0551cfSopenharmony_ci
235ca0551cfSopenharmony_ci    sb.Append(prefix).Append("}");
236ca0551cfSopenharmony_ci}
237ca0551cfSopenharmony_ci
238ca0551cfSopenharmony_cistd::string MetadataDumper::DumpMetaType(MetaType* mt)
239ca0551cfSopenharmony_ci{
240ca0551cfSopenharmony_ci    switch (mt->kind_) {
241ca0551cfSopenharmony_ci        case MetaTypeKind::Char:
242ca0551cfSopenharmony_ci            return "char";
243ca0551cfSopenharmony_ci        case MetaTypeKind::Boolean:
244ca0551cfSopenharmony_ci            return "boolean";
245ca0551cfSopenharmony_ci        case MetaTypeKind::Byte:
246ca0551cfSopenharmony_ci            return "byte";
247ca0551cfSopenharmony_ci        case MetaTypeKind::Short:
248ca0551cfSopenharmony_ci            return "short";
249ca0551cfSopenharmony_ci        case MetaTypeKind::Integer:
250ca0551cfSopenharmony_ci            return "int";
251ca0551cfSopenharmony_ci        case MetaTypeKind::Long:
252ca0551cfSopenharmony_ci            return "long";
253ca0551cfSopenharmony_ci        case MetaTypeKind::Float:
254ca0551cfSopenharmony_ci            return "float";
255ca0551cfSopenharmony_ci        case MetaTypeKind::Double:
256ca0551cfSopenharmony_ci            return "double";
257ca0551cfSopenharmony_ci        case MetaTypeKind::String:
258ca0551cfSopenharmony_ci            return "String";
259ca0551cfSopenharmony_ci        case MetaTypeKind::Void:
260ca0551cfSopenharmony_ci            return "void";
261ca0551cfSopenharmony_ci        case MetaTypeKind::Sequenceable: {
262ca0551cfSopenharmony_ci            MetaSequenceable* mp = metaComponent_->sequenceables_[mt->index_];
263ca0551cfSopenharmony_ci            return reinterpret_cast<char*>(mp->name_);
264ca0551cfSopenharmony_ci        }
265ca0551cfSopenharmony_ci        case MetaTypeKind::Interface: {
266ca0551cfSopenharmony_ci            MetaInterface* mi = metaComponent_->interfaces_[mt->index_];
267ca0551cfSopenharmony_ci            return reinterpret_cast<char*>(mi->name_);
268ca0551cfSopenharmony_ci        }
269ca0551cfSopenharmony_ci        case MetaTypeKind::List: {
270ca0551cfSopenharmony_ci            MetaType* elementMt = metaComponent_->types_[mt->nestedTypeIndexes_[0]];
271ca0551cfSopenharmony_ci            return "List<" + DumpMetaType(elementMt) + ">";
272ca0551cfSopenharmony_ci        }
273ca0551cfSopenharmony_ci        case MetaTypeKind::Map: {
274ca0551cfSopenharmony_ci            MetaType* keyMt = metaComponent_->types_[mt->nestedTypeIndexes_[0]];
275ca0551cfSopenharmony_ci            MetaType* valueMt = metaComponent_->types_[mt->nestedTypeIndexes_[1]];
276ca0551cfSopenharmony_ci            return "Map<" + DumpMetaType(keyMt) + ", " + DumpMetaType(valueMt) + ">";
277ca0551cfSopenharmony_ci        }
278ca0551cfSopenharmony_ci        case MetaTypeKind::Array: {
279ca0551cfSopenharmony_ci            MetaType* elementMt = metaComponent_->types_[mt->nestedTypeIndexes_[0]];
280ca0551cfSopenharmony_ci            return DumpMetaType(elementMt) + "[]";
281ca0551cfSopenharmony_ci        }
282ca0551cfSopenharmony_ci        case MetaTypeKind::Unknown:
283ca0551cfSopenharmony_ci        default:
284ca0551cfSopenharmony_ci            printf("Unknown %d\n", mt->index_);
285ca0551cfSopenharmony_ci            return "unknown";
286ca0551cfSopenharmony_ci    }
287ca0551cfSopenharmony_ci}
288ca0551cfSopenharmony_ci} // namespace Idl
289ca0551cfSopenharmony_ci} // namespace OHOS
290