• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "metadata/metadata_dumper.h"
17 #include "util/string_builder.h"
18 
19 namespace OHOS {
20 namespace Idl {
21 std::string MetadataDumper::tab_ = "    ";
Dump(const std::string & prefix)22 std::string MetadataDumper::Dump(const std::string& prefix)
23 {
24     if (metaComponent_ == nullptr) {
25         return "";
26     }
27 
28     return DumpMetaComponent(metaComponent_, prefix);
29 }
30 
DumpMetaComponent(MetaComponent * mc,const std::string & prefix)31 std::string MetadataDumper::DumpMetaComponent(MetaComponent* mc, const std::string& prefix)
32 {
33     StringBuilder sb;
34 
35     sb.Append(prefix).Append("MetaComponent\n");
36     sb.Append(prefix).Append("{\n");
37     sb.Append(prefix + tab_).AppendFormat("\"magic_\" : \"0x%x\",\n", mc->magic_);
38     sb.Append(prefix + tab_).AppendFormat("\"size_\" : \"%d\",\n", mc->size_);
39     sb.Append(prefix + tab_).AppendFormat("\"name_\" : \"%s\",\n", mc->name_);
40     sb.Append(prefix + tab_).AppendFormat("\"namespaceNumber_\" : \"%d\",\n", mc->namespaceNumber_);
41     sb.Append(prefix + tab_).AppendFormat("\"sequenceableNumber_\" : \"%d\",\n", mc->sequenceableNumber_);
42     sb.Append(prefix + tab_).AppendFormat("\"rawdataNumber_\" : \"%d\",\n", mc->rawdataNumber_);
43     sb.Append(prefix + tab_).AppendFormat("\"interfaceNumber_\" : \"%d\",\n", mc->interfaceNumber_);
44     sb.Append(prefix + tab_).AppendFormat("\"typeNumber_\" : \"%d\",\n", mc->typeNumber_);
45 
46     DumpMetaNamespaces(sb, mc, prefix);
47     DumpMetaSequenceables(sb, mc, prefix);
48     DumpMetaRawDatas(sb, mc, prefix);
49     DumpMetaInterfaces(sb, mc, prefix);
50 
51     sb.Append(prefix + tab_).AppendFormat("\"stringPoolSize_\" : \"%d\"\n", mc->stringPoolSize_);
52 
53     sb.Append(prefix).Append("}\n");
54 
55     return sb.ToString();
56 }
57 
DumpMetaNamespaces(StringBuilder & sb,MetaComponent * mc,const std::string & prefix)58 void MetadataDumper::DumpMetaNamespaces(StringBuilder& sb, MetaComponent* mc, const std::string& prefix)
59 {
60     if (mc->namespaceNumber_ == 0) {
61         sb.Append(prefix + tab_).Append("\"namespaces_\" : [],\n");
62     } else {
63         sb.Append(prefix + tab_).Append("\"namespaces_\" : [\n");
64         for (int i = 0; i < mc->namespaceNumber_; i++) {
65             DumpMetaNamespace(sb, mc->namespaces_[i], prefix + tab_ + tab_);
66             if (i != mc->namespaceNumber_ - 1) {
67                 sb.Append(",\n");
68             }
69         }
70         sb.Append("\n" + prefix + tab_).Append("],\n");
71     }
72 }
73 
DumpMetaNamespace(StringBuilder & sb,MetaNamespace * mn,const std::string & prefix)74 void MetadataDumper::DumpMetaNamespace(StringBuilder& sb, MetaNamespace* mn, const std::string& prefix)
75 {
76     sb.Append(prefix).Append("{\n");
77     sb.Append(prefix + tab_).AppendFormat("\"name_\" : \"%s\",\n", mn->name_);
78     sb.Append(prefix + tab_).AppendFormat("\"sequenceableNumber_\" : \"%d\",\n", mn->sequenceableNumber_);
79     sb.Append(prefix + tab_).AppendFormat("\"rawdataNumber_\" : \"%d\",\n", mn->rawdataNumber_);
80     sb.Append(prefix + tab_).AppendFormat("\"interfaceNumber_\" : \"%d\",\n", mn->interfaceNumber_);
81     sb.Append(prefix + tab_).AppendFormat("\"namespaceNumber_\" : \"%d\",\n", mn->namespaceNumber_);
82 
83     GetDumpMetaNamespace(sb, mn, prefix);
84 
85     if (mn->interfaceNumber_ == 0) {
86         sb.Append(prefix + tab_).Append("\"interfaceIndexes_\" : [],\n");
87     } else {
88         sb.Append(prefix + tab_).Append("\"interfaceIndexes_\" : [\n");
89         for (int i = 0; i < mn->interfaceNumber_; i++) {
90             MetaInterface* mi = metaComponent_->interfaces_[mn->interfaceIndexes_[i]];
91             sb.Append(prefix + tab_ + tab_).AppendFormat("{ \"name\" : \"%s\" }", mi->name_);
92             if (i != mn->interfaceNumber_ - 1) {
93                 sb.Append(",\n");
94             }
95         }
96         sb.Append("\n" + prefix + tab_).Append("],\n");
97     }
98 
99     if (mn->namespaceNumber_ == 0) {
100         sb.Append(prefix + tab_).Append("\"namespaces_\" : []\n");
101     } else {
102         sb.Append(prefix + tab_).Append("\"namespaces_\" : [\n");
103         for (int i = 0; i < mn->namespaceNumber_; i++) {
104             MetaNamespace* innermn = mn->namespaces_[i];
105             DumpMetaNamespace(sb, innermn, prefix + tab_ + tab_);
106             if (i != mn->namespaceNumber_ - 1) {
107                 sb.Append(",\n");
108             }
109         }
110         sb.Append("\n" + prefix + tab_).Append("]\n");
111     }
112 
113     sb.Append(prefix).Append("}");
114 }
115 
GetDumpMetaNamespace(StringBuilder & sb,MetaNamespace * mn,const std::string & prefix)116 void MetadataDumper::GetDumpMetaNamespace(StringBuilder& sb, MetaNamespace* mn, const std::string& prefix)
117 {
118     if (mn->sequenceableNumber_ == 0) {
119         sb.Append(prefix + tab_).Append("\"sequenceableIndexes_\" : [],\n");
120     } else {
121         sb.Append(prefix + tab_).Append("\"sequenceableIndexes_\" : [\n");
122         for (int i = 0; i < mn->sequenceableNumber_; i++) {
123             MetaSequenceable* mp = metaComponent_->sequenceables_[i];
124             sb.Append(prefix + tab_ + tab_).AppendFormat("{ \"name\" : \"%s\" }", mp->name_);
125             if (i != mn->sequenceableNumber_ - 1) {
126                 sb.Append(",\n");
127             }
128         }
129         sb.Append("\n" + prefix + tab_).Append("],\n");
130     }
131 
132     if (mn->rawdataNumber_ == 0) {
133         sb.Append(prefix + tab_).Append("\"rawdataIndexes_\" : [],\n");
134     } else {
135         sb.Append(prefix + tab_).Append("\"rawdataIndexes_\" : [\n");
136         for (int i = 0; i < mn->rawdataNumber_; i++) {
137             MetaRawData* mp = metaComponent_->rawdatas_[i];
138             sb.Append(prefix + tab_ + tab_).AppendFormat("{ \"name\" : \"%s\" }", mp->name_);
139             if (i != mn->rawdataNumber_ - 1) {
140                 sb.Append(",\n");
141             }
142         }
143         sb.Append("\n" + prefix + tab_).Append("],\n");
144     }
145 }
146 
DumpMetaSequenceables(StringBuilder & sb,MetaComponent * mc,const std::string & prefix)147 void MetadataDumper::DumpMetaSequenceables(StringBuilder& sb, MetaComponent* mc, const std::string& prefix)
148 {
149     if (mc->sequenceableNumber_ == 0) {
150         sb.Append(prefix + tab_).Append("\"sequenceables_\" : [],\n");
151     } else {
152         sb.Append(prefix + tab_).Append("\"sequenceables_\" : [\n");
153         for (int i = 0; i < mc->sequenceableNumber_; i++) {
154             DumpMetaSequenceable(sb, mc->sequenceables_[i], prefix + tab_ + tab_);
155             if (i != mc->sequenceableNumber_ - 1) {
156                 sb.Append(",\n");
157             }
158         }
159         sb.Append("\n" + prefix + tab_).Append("],\n");
160     }
161 }
162 
DumpMetaSequenceable(StringBuilder & sb,MetaSequenceable * mp,const std::string & prefix)163 void MetadataDumper::DumpMetaSequenceable(StringBuilder& sb, MetaSequenceable* mp, const std::string& prefix)
164 {
165     sb.Append(prefix).Append("{\n");
166     sb.Append(prefix + tab_).AppendFormat("\"name_\" : \"%s\",\n", mp->name_);
167     sb.Append(prefix + tab_).AppendFormat("\"namespace_\" : \"%s\"\n", mp->namespace_);
168     sb.Append(prefix).Append("}");
169 }
170 
DumpMetaRawDatas(StringBuilder & sb,MetaComponent * mc,const std::string & prefix)171 void MetadataDumper::DumpMetaRawDatas(StringBuilder& sb, MetaComponent* mc, const std::string& prefix)
172 {
173     if (mc->rawdataNumber_ == 0) {
174         sb.Append(prefix + tab_).Append("\"rawdatas_\" : [],\n");
175     } else {
176         sb.Append(prefix + tab_).Append("\"rawdatas_\" : [\n");
177         for (int i = 0; i < mc->rawdataNumber_; i++) {
178             DumpMetaRawData(sb, mc->rawdatas_[i], prefix + tab_ + tab_);
179             if (i != mc->rawdataNumber_ - 1) {
180                 sb.Append(",\n");
181             }
182         }
183         sb.Append("\n" + prefix + tab_).Append("],\n");
184     }
185 }
186 
DumpMetaRawData(StringBuilder & sb,MetaRawData * mp,const std::string & prefix)187 void MetadataDumper::DumpMetaRawData(StringBuilder& sb, MetaRawData* mp, const std::string& prefix)
188 {
189     sb.Append(prefix).Append("{\n");
190     sb.Append(prefix + tab_).AppendFormat("\"name_\" : \"%s\",\n", mp->name_);
191     sb.Append(prefix + tab_).AppendFormat("\"namespace_\" : \"%s\"\n", mp->namespace_);
192     sb.Append(prefix).Append("}");
193 }
194 
DumpMetaInterfaces(StringBuilder & sb,MetaComponent * mc,const std::string & prefix)195 void MetadataDumper::DumpMetaInterfaces(StringBuilder& sb, MetaComponent* mc, const std::string& prefix)
196 {
197     if (mc->interfaceNumber_ == 0) {
198         sb.Append(prefix + tab_).Append("\"interfaces_\" : [],\n");
199     } else {
200         sb.Append(prefix + tab_).Append("\"interfaces_\" : [\n");
201         for (int i = 0; i < mc->interfaceNumber_; i++) {
202             DumpMetaInterface(sb, mc->interfaces_[i], prefix + tab_ + tab_);
203             if (i != mc->interfaceNumber_ - 1) {
204                 sb.Append(",\n");
205             }
206         }
207         sb.Append("\n" + prefix + tab_).Append("],\n");
208     }
209 }
210 
DumpMetaInterface(StringBuilder & sb,MetaInterface * mi,const std::string & prefix)211 void MetadataDumper::DumpMetaInterface(StringBuilder& sb, MetaInterface* mi, const std::string& prefix)
212 {
213     sb.Append(prefix).Append("{\n");
214     sb.Append(prefix + tab_).AppendFormat("\"name_\" : \"%s\",\n", mi->name_);
215     sb.Append(prefix + tab_).AppendFormat("\"namespace_\" : \"%s\",\n", mi->namespace_);
216     sb.Append(prefix + tab_).AppendFormat("\"properties_\" : \"%s\",\n",
217         (mi->properties_ & INTERFACE_PROPERTY_ONEWAY) != 0 ? "oneway" : "");
218     sb.Append(prefix + tab_).AppendFormat("\"methodNumber_\" : \"%d\",\n", mi->methodNumber_);
219     sb.Append(prefix + tab_).AppendFormat("\"external_\" : \"%d\",\n", mi->external_);
220 
221     if (mi->methodNumber_ == 0) {
222         sb.Append(prefix + tab_).Append("\"methods_\" : []\n");
223     } else {
224         sb.Append(prefix + tab_).Append("\"methods_\" : [\n");
225         for (int i = 0; i < mi->methodNumber_; i++) {
226             DumpMetaMethod(sb, mi->methods_[i], prefix + tab_ + tab_);
227             if (i != mi->methodNumber_ - 1) {
228                 sb.Append(",\n");
229             }
230         }
231         sb.Append("\n" + prefix + tab_).Append("]\n");
232     }
233 
234     sb.Append(prefix).Append("}");
235 }
236 
DumpMetaMethod(StringBuilder & sb,MetaMethod * mm,const std::string & prefix)237 void MetadataDumper::DumpMetaMethod(StringBuilder& sb, MetaMethod* mm, const std::string& prefix)
238 {
239     sb.Append(prefix).Append("{\n");
240     sb.Append(prefix + tab_).AppendFormat("\"name_\" : \"%s\",\n", mm->name_);
241     sb.Append(prefix + tab_).AppendFormat("\"signature_\" : \"%s\",\n", mm->signature_);
242     sb.Append(prefix + tab_).AppendFormat("\"properties_\" : \"%s\",\n",
243         (mm->properties_ & METHOD_PROPERTY_ONEWAY) != 0 ? "oneway" : "");
244     MetaType* type = metaComponent_->types_[mm->returnTypeIndex_];
245     sb.Append(prefix + tab_).AppendFormat("\"returnType_\" : \"%s\",\n", DumpMetaType(type).c_str());
246     sb.Append(prefix + tab_).AppendFormat("\"parameterNumber_\" : \"%d\",\n", mm->parameterNumber_);
247 
248     if (mm->parameterNumber_ == 0) {
249         sb.Append(prefix + tab_).Append("\"parameters_\" : []\n");
250     } else {
251         sb.Append(prefix + tab_).Append("\"parameters_\" : [\n");
252         for (int i = 0; i < mm->parameterNumber_; i++) {
253             DumpMetaParameter(sb, mm->parameters_[i], prefix + tab_ + tab_);
254             if (i != mm->parameterNumber_ - 1) {
255                 sb.Append(",\n");
256             }
257         }
258         sb.Append("\n" + prefix + tab_).Append("]\n");
259     }
260 
261     sb.Append(prefix).Append("}");
262 }
263 
DumpMetaParameter(StringBuilder & sb,MetaParameter * mp,const std::string & prefix)264 void MetadataDumper::DumpMetaParameter(StringBuilder& sb, MetaParameter* mp, const std::string& prefix)
265 {
266     sb.Append(prefix).Append("{\n");
267     sb.Append(prefix + tab_).AppendFormat("\"name_\" : \"%s\",\n", mp->name_);
268     sb.Append(prefix + tab_).Append("\"attributes_\" : \"");
269     bool addComma = false;
270     if ((mp->attributes_ & ATTR_IN) == ATTR_IN) {
271         sb.Append("in");
272         addComma = true;
273     }
274     if ((mp->attributes_ & ATTR_OUT) == ATTR_OUT) {
275         sb.Append(addComma ? ", out" : "out");
276     }
277     sb.Append("\",\n");
278     MetaType* type = metaComponent_->types_[mp->typeIndex_];
279     sb.Append(prefix + tab_).AppendFormat("\"type_\" : \"%s\"\n", DumpMetaType(type).c_str());
280 
281     sb.Append(prefix).Append("}");
282 }
283 
DumpMetaType(MetaType * mt)284 std::string MetadataDumper::DumpMetaType(MetaType* mt)
285 {
286     switch (mt->kind_) {
287         case MetaTypeKind::Char:
288             return "char";
289         case MetaTypeKind::Boolean:
290             return "boolean";
291         case MetaTypeKind::Byte:
292             return "byte";
293         case MetaTypeKind::Short:
294             return "short";
295         case MetaTypeKind::Integer:
296             return "int";
297         case MetaTypeKind::Long:
298             return "long";
299         case MetaTypeKind::Float:
300             return "float";
301         case MetaTypeKind::Double:
302             return "double";
303         case MetaTypeKind::String:
304             return "String";
305         case MetaTypeKind::Void:
306             return "void";
307         case MetaTypeKind::Sequenceable:
308         case MetaTypeKind::RawData:
309         case MetaTypeKind::Interface:
310             return GetDumpMetaType(mt);
311         case MetaTypeKind::List: {
312             MetaType* elementMt = metaComponent_->types_[mt->nestedTypeIndexes_[0]];
313             return "List<" + DumpMetaType(elementMt) + ">";
314         }
315         case MetaTypeKind::Map: {
316             MetaType* keyMt = metaComponent_->types_[mt->nestedTypeIndexes_[0]];
317             MetaType* valueMt = metaComponent_->types_[mt->nestedTypeIndexes_[1]];
318             return "Map<" + DumpMetaType(keyMt) + ", " + DumpMetaType(valueMt) + ">";
319         }
320         case MetaTypeKind::Array: {
321             MetaType* elementMt = metaComponent_->types_[mt->nestedTypeIndexes_[0]];
322             return DumpMetaType(elementMt) + "[]";
323         }
324         case MetaTypeKind::Unknown:
325         default:
326             printf("Unknown %d\n", mt->index_);
327             return "unknown";
328     }
329 }
330 
GetDumpMetaType(MetaType * mt)331 std::string MetadataDumper::GetDumpMetaType(MetaType* mt)
332 {
333     switch (mt->kind_) {
334         case MetaTypeKind::Sequenceable: {
335             MetaSequenceable* mp = metaComponent_->sequenceables_[mt->index_];
336             return reinterpret_cast<char*>(mp->name_);
337         }
338         case MetaTypeKind::RawData: {
339             MetaRawData* mr = metaComponent_->rawdatas_[mt->index_];
340             return reinterpret_cast<char*>(mr->name_);
341         }
342         case MetaTypeKind::Interface: {
343             MetaInterface* mi = metaComponent_->interfaces_[mt->index_];
344             return reinterpret_cast<char*>(mi->name_);
345         }
346         default:
347             return "unknown";
348     }
349 }
350 } // namespace Idl
351 } // namespace OHOS
352