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