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