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