1ca0551cfSopenharmony_ci/*
2ca0551cfSopenharmony_ci * Copyright (c) 2022-2023 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 <sstream>
17ca0551cfSopenharmony_ci#include "securec.h"
18ca0551cfSopenharmony_ci#include "util/file.h"
19ca0551cfSopenharmony_ci#include "codegen/cpp_code_emitter.h"
20ca0551cfSopenharmony_ci
21ca0551cfSopenharmony_cinamespace OHOS {
22ca0551cfSopenharmony_cinamespace Idl {
23ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterface()
24ca0551cfSopenharmony_ci{
25ca0551cfSopenharmony_ci    EmitInterfaceHeaderFile();
26ca0551cfSopenharmony_ci}
27ca0551cfSopenharmony_ci
28ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceHeaderFile()
29ca0551cfSopenharmony_ci{
30ca0551cfSopenharmony_ci    String filePath = String::Format("%s/%s.h", directory_.string(), FileName(interfaceName_).string());
31ca0551cfSopenharmony_ci    File file(filePath, File::WRITE);
32ca0551cfSopenharmony_ci
33ca0551cfSopenharmony_ci    StringBuilder sb;
34ca0551cfSopenharmony_ci
35ca0551cfSopenharmony_ci    EmitLicense(sb);
36ca0551cfSopenharmony_ci    sb.Append("\n");
37ca0551cfSopenharmony_ci    EmitHeadMacro(sb, interfaceFullName_);
38ca0551cfSopenharmony_ci    sb.Append("\n");
39ca0551cfSopenharmony_ci    EmitInterfaceInclusions(sb);
40ca0551cfSopenharmony_ci    sb.Append("\n");
41ca0551cfSopenharmony_ci    if (EmitInterfaceUsings(sb)) {
42ca0551cfSopenharmony_ci        sb.Append("\n");
43ca0551cfSopenharmony_ci    }
44ca0551cfSopenharmony_ci    EmitInterfaceDefinition(sb);
45ca0551cfSopenharmony_ci    EmitTailMacro(sb, interfaceFullName_);
46ca0551cfSopenharmony_ci
47ca0551cfSopenharmony_ci    String data = sb.ToString();
48ca0551cfSopenharmony_ci    file.WriteData(data.string(), data.GetLength());
49ca0551cfSopenharmony_ci    file.Flush();
50ca0551cfSopenharmony_ci    file.Close();
51ca0551cfSopenharmony_ci}
52ca0551cfSopenharmony_ci
53ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceInclusions(StringBuilder& sb)
54ca0551cfSopenharmony_ci{
55ca0551cfSopenharmony_ci    EmitInterfaceStdlibInclusions(sb);
56ca0551cfSopenharmony_ci    EmitInterfaceDBinderInclusions(sb);
57ca0551cfSopenharmony_ci    EmitInterfaceSelfDefinedTypeInclusions(sb);
58ca0551cfSopenharmony_ci}
59ca0551cfSopenharmony_ci
60ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceStdlibInclusions(StringBuilder& sb)
61ca0551cfSopenharmony_ci{
62ca0551cfSopenharmony_ci    bool includeString = false;
63ca0551cfSopenharmony_ci    bool includeList = false;
64ca0551cfSopenharmony_ci    bool includeMap = false;
65ca0551cfSopenharmony_ci    bool includeNum = false;
66ca0551cfSopenharmony_ci    if (metaComponent_ == nullptr) {
67ca0551cfSopenharmony_ci        return;
68ca0551cfSopenharmony_ci    }
69ca0551cfSopenharmony_ci    for (int i = 0; i < metaComponent_->typeNumber_; i++) {
70ca0551cfSopenharmony_ci        MetaType* mt = metaComponent_->types_[i];
71ca0551cfSopenharmony_ci        switch (mt->kind_) {
72ca0551cfSopenharmony_ci            case TypeKind::Byte: {
73ca0551cfSopenharmony_ci                if (!includeNum) {
74ca0551cfSopenharmony_ci                    sb.Append("#include <cstdint>\n");
75ca0551cfSopenharmony_ci                    includeNum = true;
76ca0551cfSopenharmony_ci                }
77ca0551cfSopenharmony_ci                break;
78ca0551cfSopenharmony_ci            }
79ca0551cfSopenharmony_ci            case TypeKind::String: {
80ca0551cfSopenharmony_ci                if (!includeString) {
81ca0551cfSopenharmony_ci                    sb.Append("#include <string_ex.h>\n");
82ca0551cfSopenharmony_ci                    includeString = true;
83ca0551cfSopenharmony_ci                }
84ca0551cfSopenharmony_ci                break;
85ca0551cfSopenharmony_ci            }
86ca0551cfSopenharmony_ci            case TypeKind::Array:
87ca0551cfSopenharmony_ci            case TypeKind::List: {
88ca0551cfSopenharmony_ci                if (!includeList) {
89ca0551cfSopenharmony_ci                    sb.Append("#include <vector>\n");
90ca0551cfSopenharmony_ci                    includeList = true;
91ca0551cfSopenharmony_ci                }
92ca0551cfSopenharmony_ci                break;
93ca0551cfSopenharmony_ci            }
94ca0551cfSopenharmony_ci            case TypeKind::Map: {
95ca0551cfSopenharmony_ci                if (!includeMap) {
96ca0551cfSopenharmony_ci                    sb.Append("#include <unordered_map>\n");
97ca0551cfSopenharmony_ci                    includeMap = true;
98ca0551cfSopenharmony_ci                }
99ca0551cfSopenharmony_ci                break;
100ca0551cfSopenharmony_ci            }
101ca0551cfSopenharmony_ci            default:
102ca0551cfSopenharmony_ci                break;
103ca0551cfSopenharmony_ci        }
104ca0551cfSopenharmony_ci    }
105ca0551cfSopenharmony_ci}
106ca0551cfSopenharmony_ci
107ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceDBinderInclusions(StringBuilder& sb)
108ca0551cfSopenharmony_ci{
109ca0551cfSopenharmony_ci    sb.Append("#include <iremote_broker.h>\n");
110ca0551cfSopenharmony_ci    if (logOn_) {
111ca0551cfSopenharmony_ci        sb.Append("#include \"hilog/log.h\"\n");
112ca0551cfSopenharmony_ci    }
113ca0551cfSopenharmony_ci}
114ca0551cfSopenharmony_ci
115ca0551cfSopenharmony_ciString CppCodeEmitter::GetFilePath(const String& fpnp)
116ca0551cfSopenharmony_ci{
117ca0551cfSopenharmony_ci    int pos = fpnp.IndexOf("..");
118ca0551cfSopenharmony_ci    if (pos == -1) {
119ca0551cfSopenharmony_ci        return String();
120ca0551cfSopenharmony_ci    }
121ca0551cfSopenharmony_ci    String res = fpnp.Substring(0, pos + 1);
122ca0551cfSopenharmony_ci    return res;
123ca0551cfSopenharmony_ci}
124ca0551cfSopenharmony_ci
125ca0551cfSopenharmony_ciString CppCodeEmitter::GetFilePathNoPoint(const String& fpnp)
126ca0551cfSopenharmony_ci{
127ca0551cfSopenharmony_ci    int pos = fpnp.IndexOf("..");
128ca0551cfSopenharmony_ci    if (pos == -1) {
129ca0551cfSopenharmony_ci        return String();
130ca0551cfSopenharmony_ci    }
131ca0551cfSopenharmony_ci    String res = fpnp.Substring(0, pos);
132ca0551cfSopenharmony_ci    return res;
133ca0551cfSopenharmony_ci}
134ca0551cfSopenharmony_ci
135ca0551cfSopenharmony_ciString CppCodeEmitter::GetNamespace(const String& fpnp)
136ca0551cfSopenharmony_ci{
137ca0551cfSopenharmony_ci    int pos = fpnp.IndexOf("..");
138ca0551cfSopenharmony_ci    if (pos == -1) {
139ca0551cfSopenharmony_ci        return fpnp;
140ca0551cfSopenharmony_ci    }
141ca0551cfSopenharmony_ci    String res = fpnp.Substring(pos + 2);
142ca0551cfSopenharmony_ci    return res;
143ca0551cfSopenharmony_ci}
144ca0551cfSopenharmony_ci
145ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceSelfDefinedTypeInclusions(StringBuilder& sb)
146ca0551cfSopenharmony_ci{
147ca0551cfSopenharmony_ci    for (int i = 0; i < metaComponent_->sequenceableNumber_; i++) {
148ca0551cfSopenharmony_ci        MetaSequenceable* mp = metaComponent_->sequenceables_[i];
149ca0551cfSopenharmony_ci        if (mp == nullptr) {
150ca0551cfSopenharmony_ci            continue;
151ca0551cfSopenharmony_ci        }
152ca0551cfSopenharmony_ci        String filePath = GetFilePathNoPoint(String(mp->namespace_));
153ca0551cfSopenharmony_ci        String fileName;
154ca0551cfSopenharmony_ci        String sequenceName = mp->name_;
155ca0551cfSopenharmony_ci        filePath.IsEmpty() ? fileName = FileName(sequenceName) : fileName = FileName(filePath);
156ca0551cfSopenharmony_ci        sb.Append("#include ").AppendFormat("\"%s.h\"\n", fileName.string());
157ca0551cfSopenharmony_ci    }
158ca0551cfSopenharmony_ci
159ca0551cfSopenharmony_ci    for (int i = 0; i < metaComponent_->interfaceNumber_; i++) {
160ca0551cfSopenharmony_ci        MetaInterface* mi = metaComponent_->interfaces_[i];
161ca0551cfSopenharmony_ci        if (mi->external_) {
162ca0551cfSopenharmony_ci            String filePath = GetFilePath(String(mi->namespace_));
163ca0551cfSopenharmony_ci            String fileName = FileName(filePath + mi->name_);
164ca0551cfSopenharmony_ci            sb.Append("#include ").AppendFormat("\"%s.h\"\n", fileName.string());
165ca0551cfSopenharmony_ci        }
166ca0551cfSopenharmony_ci    }
167ca0551cfSopenharmony_ci}
168ca0551cfSopenharmony_ci
169ca0551cfSopenharmony_cibool CppCodeEmitter::EmitInterfaceUsings(StringBuilder& sb)
170ca0551cfSopenharmony_ci{
171ca0551cfSopenharmony_ci    bool ret = false;
172ca0551cfSopenharmony_ci    for (int i = 0; i < metaComponent_->sequenceableNumber_; i++) {
173ca0551cfSopenharmony_ci        MetaSequenceable* mp = metaComponent_->sequenceables_[i];
174ca0551cfSopenharmony_ci        String np = GetNamespace(String(mp->namespace_));
175ca0551cfSopenharmony_ci        if (np.IsEmpty()) {
176ca0551cfSopenharmony_ci            continue;
177ca0551cfSopenharmony_ci        }
178ca0551cfSopenharmony_ci        String fullName = CppFullName(np + mp->name_);
179ca0551cfSopenharmony_ci        sb.Append("using ").AppendFormat("%s;\n", fullName.string());
180ca0551cfSopenharmony_ci        ret = true;
181ca0551cfSopenharmony_ci    }
182ca0551cfSopenharmony_ci
183ca0551cfSopenharmony_ci    for (int i = 0; i < metaComponent_->interfaceNumber_; i++) {
184ca0551cfSopenharmony_ci        MetaInterface* mi = metaComponent_->interfaces_[i];
185ca0551cfSopenharmony_ci        if (mi->external_) {
186ca0551cfSopenharmony_ci            String np = GetNamespace(String(mi->namespace_));
187ca0551cfSopenharmony_ci            if (np.IsEmpty()) {
188ca0551cfSopenharmony_ci                continue;
189ca0551cfSopenharmony_ci            }
190ca0551cfSopenharmony_ci            String fullName = CppFullName(np + mi->name_);
191ca0551cfSopenharmony_ci            sb.Append("using ").AppendFormat("%s;\n", fullName.string());
192ca0551cfSopenharmony_ci            ret = true;
193ca0551cfSopenharmony_ci        }
194ca0551cfSopenharmony_ci    }
195ca0551cfSopenharmony_ci    return ret;
196ca0551cfSopenharmony_ci}
197ca0551cfSopenharmony_ci
198ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceDefinition(StringBuilder& sb)
199ca0551cfSopenharmony_ci{
200ca0551cfSopenharmony_ci    EmitBeginNamespace(sb);
201ca0551cfSopenharmony_ci    sb.AppendFormat("class %s : public IRemoteBroker {\n", metaInterface_->name_);
202ca0551cfSopenharmony_ci    sb.Append("public:\n");
203ca0551cfSopenharmony_ci    EmitInterfaceBody(sb, TAB);
204ca0551cfSopenharmony_ci    EmitInterfaceMemberVariables(sb, TAB);
205ca0551cfSopenharmony_ci    sb.Append("};\n");
206ca0551cfSopenharmony_ci    EmitEndNamespace(sb);
207ca0551cfSopenharmony_ci}
208ca0551cfSopenharmony_ci
209ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceBody(StringBuilder& sb, const String& prefix)
210ca0551cfSopenharmony_ci{
211ca0551cfSopenharmony_ci    String nameWithoutPath = GetNamespace(interfaceFullName_);
212ca0551cfSopenharmony_ci    sb.Append(TAB).AppendFormat("DECLARE_INTERFACE_DESCRIPTOR(u\"%s\");\n", nameWithoutPath.string());
213ca0551cfSopenharmony_ci    sb.Append("\n");
214ca0551cfSopenharmony_ci    EmitInterfaceMethods(sb, TAB);
215ca0551cfSopenharmony_ci}
216ca0551cfSopenharmony_ci
217ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceMethods(StringBuilder& sb, const String& prefix)
218ca0551cfSopenharmony_ci{
219ca0551cfSopenharmony_ci    if (metaInterface_->methodNumber_ > 0) {
220ca0551cfSopenharmony_ci        for (int i = 0; i < metaInterface_->methodNumber_; i++) {
221ca0551cfSopenharmony_ci            MetaMethod* mm = metaInterface_->methods_[i];
222ca0551cfSopenharmony_ci            EmitInterfaceMethod(mm, sb, prefix);
223ca0551cfSopenharmony_ci            if (i != metaInterface_->methodNumber_ - 1) {
224ca0551cfSopenharmony_ci                sb.Append("\n");
225ca0551cfSopenharmony_ci            }
226ca0551cfSopenharmony_ci        }
227ca0551cfSopenharmony_ci    }
228ca0551cfSopenharmony_ci}
229ca0551cfSopenharmony_ci
230ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceMethod(MetaMethod* mm, StringBuilder& sb, const String& prefix)
231ca0551cfSopenharmony_ci{
232ca0551cfSopenharmony_ci    MetaType* returnType = metaComponent_->types_[mm->returnTypeIndex_];
233ca0551cfSopenharmony_ci    if (mm->parameterNumber_ == 0 && returnType->kind_ == TypeKind::Void) {
234ca0551cfSopenharmony_ci        sb.Append(prefix).AppendFormat("virtual ErrCode %s() = 0;\n", mm->name_);
235ca0551cfSopenharmony_ci    } else {
236ca0551cfSopenharmony_ci        sb.Append(prefix).AppendFormat("virtual ErrCode %s(\n", mm->name_);
237ca0551cfSopenharmony_ci        for (int i = 0; i < mm->parameterNumber_; i++) {
238ca0551cfSopenharmony_ci            MetaParameter* mp = mm->parameters_[i];
239ca0551cfSopenharmony_ci            EmitInterfaceMethodParameter(mp, sb, prefix + TAB);
240ca0551cfSopenharmony_ci            if (i != mm->parameterNumber_ - 1 || returnType->kind_ != TypeKind::Void) {
241ca0551cfSopenharmony_ci                sb.Append(",\n");
242ca0551cfSopenharmony_ci            }
243ca0551cfSopenharmony_ci        }
244ca0551cfSopenharmony_ci        if (returnType->kind_ != TypeKind::Void) {
245ca0551cfSopenharmony_ci            EmitInterfaceMethodReturn(returnType, sb, prefix + TAB);
246ca0551cfSopenharmony_ci        }
247ca0551cfSopenharmony_ci        sb.Append(") = 0;\n");
248ca0551cfSopenharmony_ci    }
249ca0551cfSopenharmony_ci}
250ca0551cfSopenharmony_ci
251ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceMethodParameter(MetaParameter* mp, StringBuilder& sb, const String& prefix)
252ca0551cfSopenharmony_ci{
253ca0551cfSopenharmony_ci    sb.Append(prefix);
254ca0551cfSopenharmony_ci
255ca0551cfSopenharmony_ci    MetaType* mt = metaComponent_->types_[mp->typeIndex_];
256ca0551cfSopenharmony_ci    const std::string name = mp->name_;
257ca0551cfSopenharmony_ci    sb.AppendFormat("%s %s", EmitType(mt, mp->attributes_, false).string(), name.c_str());
258ca0551cfSopenharmony_ci}
259ca0551cfSopenharmony_ci
260ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceMethodReturn(MetaType* mt, StringBuilder& sb, const String& prefix)
261ca0551cfSopenharmony_ci{
262ca0551cfSopenharmony_ci    sb.Append(prefix).AppendFormat("%s result", EmitType(mt, ATTR_OUT, false).string());
263ca0551cfSopenharmony_ci}
264ca0551cfSopenharmony_ci
265ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceMemberVariables(StringBuilder& sb, const String& prefix)
266ca0551cfSopenharmony_ci{
267ca0551cfSopenharmony_ci    sb.Append("protected:\n");
268ca0551cfSopenharmony_ci    if (!domainId_.IsNull() && !logTag_.IsNull()) {
269ca0551cfSopenharmony_ci        sb.Append(prefix).AppendFormat(
270ca0551cfSopenharmony_ci            "static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, %s, \"%s\"};\n",
271ca0551cfSopenharmony_ci            domainId_.string(), logTag_.string());
272ca0551cfSopenharmony_ci    }
273ca0551cfSopenharmony_ci    sb.Append(prefix).Append("const int VECTOR_MAX_SIZE = 102400;\n");
274ca0551cfSopenharmony_ci    sb.Append(prefix).Append("const int LIST_MAX_SIZE = 102400;\n");
275ca0551cfSopenharmony_ci    sb.Append(prefix).Append("const int MAP_MAX_SIZE = 102400;\n");
276ca0551cfSopenharmony_ci}
277ca0551cfSopenharmony_ci
278ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceProxy()
279ca0551cfSopenharmony_ci{
280ca0551cfSopenharmony_ci    EmitInterfaceProxyHeaderFile();
281ca0551cfSopenharmony_ci    EmitInterfaceProxyCppFile();
282ca0551cfSopenharmony_ci}
283ca0551cfSopenharmony_ci
284ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceProxyHeaderFile()
285ca0551cfSopenharmony_ci{
286ca0551cfSopenharmony_ci    String filePath = String::Format("%s/%s.h", directory_.string(), FileName(proxyName_).string());
287ca0551cfSopenharmony_ci    File file(filePath, File::WRITE);
288ca0551cfSopenharmony_ci
289ca0551cfSopenharmony_ci    StringBuilder sb;
290ca0551cfSopenharmony_ci
291ca0551cfSopenharmony_ci    EmitLicense(sb);
292ca0551cfSopenharmony_ci    sb.Append("\n");
293ca0551cfSopenharmony_ci    EmitHeadMacro(sb, proxyFullName_);
294ca0551cfSopenharmony_ci    sb.Append("\n");
295ca0551cfSopenharmony_ci    sb.AppendFormat("#include \"%s.h\"\n", FileName(interfaceName_).string());
296ca0551cfSopenharmony_ci    sb.Append("#include <iremote_proxy.h>\n");
297ca0551cfSopenharmony_ci    if (metaComponent_->hasCacheableProxyMethods_ == true) {
298ca0551cfSopenharmony_ci        sb.Append("#include \"api_cache_manager.h\"\n");
299ca0551cfSopenharmony_ci    }
300ca0551cfSopenharmony_ci    sb.Append("\n");
301ca0551cfSopenharmony_ci    EmitInterfaceProxyInHeaderFile(sb);
302ca0551cfSopenharmony_ci    EmitTailMacro(sb, proxyFullName_);
303ca0551cfSopenharmony_ci
304ca0551cfSopenharmony_ci    String data = sb.ToString();
305ca0551cfSopenharmony_ci    file.WriteData(data.string(), data.GetLength());
306ca0551cfSopenharmony_ci    file.Flush();
307ca0551cfSopenharmony_ci    file.Close();
308ca0551cfSopenharmony_ci}
309ca0551cfSopenharmony_ci
310ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceProxyInHeaderFile(StringBuilder& sb)
311ca0551cfSopenharmony_ci{
312ca0551cfSopenharmony_ci    EmitBeginNamespace(sb);
313ca0551cfSopenharmony_ci    sb.AppendFormat("class %s : public IRemoteProxy<%s> {\n", proxyName_.string(), interfaceName_.string());
314ca0551cfSopenharmony_ci    sb.Append("public:\n");
315ca0551cfSopenharmony_ci    EmitInterfaceProxyConstructor(sb, TAB);
316ca0551cfSopenharmony_ci    sb.Append("\n");
317ca0551cfSopenharmony_ci    EmitInterfaceProxyMethodDecls(sb, TAB);
318ca0551cfSopenharmony_ci    sb.Append("\n");
319ca0551cfSopenharmony_ci    sb.Append("private:\n");
320ca0551cfSopenharmony_ci    EmitInterfaceProxyConstants(sb, TAB);
321ca0551cfSopenharmony_ci    sb.Append("};\n");
322ca0551cfSopenharmony_ci    EmitEndNamespace(sb);
323ca0551cfSopenharmony_ci}
324ca0551cfSopenharmony_ci
325ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceProxyRegisterDeathRecipient(StringBuilder& sb, const String& prefix)
326ca0551cfSopenharmony_ci{
327ca0551cfSopenharmony_ci    sb.Append(prefix).Append("if (remote != nullptr) {\n");
328ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("if (!remote->IsProxyObject()) {\n");
329ca0551cfSopenharmony_ci    if (logOn_) {
330ca0551cfSopenharmony_ci        sb.Append(prefix + TAB + TAB).Append("HiLog::Error(LABEL, \"remote is not proxy object!\");\n");
331ca0551cfSopenharmony_ci    }
332ca0551cfSopenharmony_ci    sb.Append(prefix + TAB + TAB).Append("return;\n");
333ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("}\n");
334ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).AppendFormat("deathRecipient_ = new (std::nothrow) %s(*this);\n",
335ca0551cfSopenharmony_ci        deathRecipientName_.string());
336ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("if (deathRecipient_ == nullptr) {\n");
337ca0551cfSopenharmony_ci    if (logOn_) {
338ca0551cfSopenharmony_ci        sb.Append(prefix + TAB + TAB).Append("HiLog::Error(LABEL, \"deathRecipient_ is nullptr!\");\n");
339ca0551cfSopenharmony_ci    }
340ca0551cfSopenharmony_ci    sb.Append(prefix + TAB + TAB).Append("return;\n");
341ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("}\n");
342ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("if (!remote->AddDeathRecipient(deathRecipient_)) {\n");
343ca0551cfSopenharmony_ci    if (logOn_) {
344ca0551cfSopenharmony_ci        sb.Append(prefix + TAB + TAB).Append("HiLog::Error(LABEL, \"AddDeathRecipient failed!\");\n");
345ca0551cfSopenharmony_ci    }
346ca0551cfSopenharmony_ci    sb.Append(prefix + TAB + TAB).Append("return;\n");
347ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("}\n");
348ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("remote_ = remote;\n");
349ca0551cfSopenharmony_ci    sb.Append(prefix).Append("}\n");
350ca0551cfSopenharmony_ci}
351ca0551cfSopenharmony_ci
352ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceProxyAddCacheAbleAPI(StringBuilder& sb, const String& prefix)
353ca0551cfSopenharmony_ci{
354ca0551cfSopenharmony_ci    sb.Append("\n");
355ca0551cfSopenharmony_ci    if (metaComponent_->hasCacheableProxyMethods_ == false) {
356ca0551cfSopenharmony_ci        return;
357ca0551cfSopenharmony_ci    }
358ca0551cfSopenharmony_ci    for (int i = 0; i < metaInterface_->methodNumber_; i++) {
359ca0551cfSopenharmony_ci        MetaMethod* mm = metaInterface_->methods_[i];
360ca0551cfSopenharmony_ci        if (mm->cacheable_ == false) {
361ca0551cfSopenharmony_ci            continue;
362ca0551cfSopenharmony_ci        }
363ca0551cfSopenharmony_ci        if (mm->cacheabletime_ != 0) {
364ca0551cfSopenharmony_ci            sb.Append(prefix + TAB).AppendFormat(
365ca0551cfSopenharmony_ci                "ApiCacheManager::GetInstance().AddCacheApi(GetDescriptor(), COMMAND_%s, %d000);\n",
366ca0551cfSopenharmony_ci                ConstantName(mm->name_).string(), mm->cacheabletime_);
367ca0551cfSopenharmony_ci        } else {
368ca0551cfSopenharmony_ci            sb.Append(prefix + TAB).AppendFormat(
369ca0551cfSopenharmony_ci                "ApiCacheManager::GetInstance().AddCacheApi(GetDescriptor(), COMMAND_%s, 0);\n",
370ca0551cfSopenharmony_ci                ConstantName(mm->name_).string());
371ca0551cfSopenharmony_ci        }
372ca0551cfSopenharmony_ci    }
373ca0551cfSopenharmony_ci    sb.Append("\n");
374ca0551cfSopenharmony_ci    EmitInterfaceProxyRegisterDeathRecipient(sb, prefix + TAB);
375ca0551cfSopenharmony_ci}
376ca0551cfSopenharmony_ci
377ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceProxyUnRegisterDeathRecipient(StringBuilder& sb, const String& prefix)
378ca0551cfSopenharmony_ci{
379ca0551cfSopenharmony_ci    sb.Append(prefix).Append("if (remote_ == nullptr) {\n");
380ca0551cfSopenharmony_ci    sb.Append(prefix).Append(TAB).Append("return;\n");
381ca0551cfSopenharmony_ci    sb.Append(prefix).Append("}\n");
382ca0551cfSopenharmony_ci    sb.Append(prefix).Append("if (deathRecipient_ == nullptr) {\n");
383ca0551cfSopenharmony_ci    sb.Append(prefix).Append(TAB).Append("return;\n");
384ca0551cfSopenharmony_ci    sb.Append(prefix).Append("}\n");
385ca0551cfSopenharmony_ci    sb.Append(prefix).Append("remote_->RemoveDeathRecipient(deathRecipient_);\n");
386ca0551cfSopenharmony_ci    sb.Append(prefix).Append("remote_ = nullptr;\n");
387ca0551cfSopenharmony_ci    if (metaInterface_->methodNumber_ > 0) {
388ca0551cfSopenharmony_ci        sb.Append("\n");
389ca0551cfSopenharmony_ci        for (int i = 0; i < metaInterface_->methodNumber_; i++) {
390ca0551cfSopenharmony_ci            MetaMethod* mm = metaInterface_->methods_[i];
391ca0551cfSopenharmony_ci            if (mm->cacheable_) {
392ca0551cfSopenharmony_ci                sb.Append(prefix).AppendFormat(
393ca0551cfSopenharmony_ci                    "ApiCacheManager::GetInstance().DelCacheApi(GetDescriptor(), COMMAND_%s);\n",
394ca0551cfSopenharmony_ci                    ConstantName(mm->name_).string());
395ca0551cfSopenharmony_ci            }
396ca0551cfSopenharmony_ci        }
397ca0551cfSopenharmony_ci    }
398ca0551cfSopenharmony_ci}
399ca0551cfSopenharmony_ci
400ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceProxyConstructor(StringBuilder& sb, const String& prefix)
401ca0551cfSopenharmony_ci{
402ca0551cfSopenharmony_ci    sb.Append(prefix).AppendFormat("explicit %s(\n", proxyName_.string());
403ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("const sptr<IRemoteObject>& remote)\n");
404ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).AppendFormat(": IRemoteProxy<%s>(remote)\n", interfaceName_.string());
405ca0551cfSopenharmony_ci    sb.Append(prefix).Append("{");
406ca0551cfSopenharmony_ci    EmitInterfaceProxyAddCacheAbleAPI(sb, prefix);
407ca0551cfSopenharmony_ci    sb.Append(prefix).Append("}\n\n");
408ca0551cfSopenharmony_ci    sb.Append(prefix).AppendFormat("virtual ~%s()\n", proxyName_.string());
409ca0551cfSopenharmony_ci    sb.Append(prefix).Append("{\n");
410ca0551cfSopenharmony_ci    if (metaComponent_->hasCacheableProxyMethods_) {
411ca0551cfSopenharmony_ci        EmitInterfaceProxyUnRegisterDeathRecipient(sb, prefix + TAB);
412ca0551cfSopenharmony_ci    }
413ca0551cfSopenharmony_ci    sb.Append(prefix).Append("}\n");
414ca0551cfSopenharmony_ci}
415ca0551cfSopenharmony_ci
416ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceProxyMethodDecls(StringBuilder& sb, const String& prefix)
417ca0551cfSopenharmony_ci{
418ca0551cfSopenharmony_ci    if (metaInterface_->methodNumber_ > 0) {
419ca0551cfSopenharmony_ci        for (int i = 0; i < metaInterface_->methodNumber_; i++) {
420ca0551cfSopenharmony_ci            MetaMethod* mm = metaInterface_->methods_[i];
421ca0551cfSopenharmony_ci            EmitInterfaceProxyMethodDecl(mm, sb, prefix);
422ca0551cfSopenharmony_ci            if (i != metaInterface_->methodNumber_ - 1) {
423ca0551cfSopenharmony_ci                sb.Append("\n");
424ca0551cfSopenharmony_ci            }
425ca0551cfSopenharmony_ci        }
426ca0551cfSopenharmony_ci    }
427ca0551cfSopenharmony_ci}
428ca0551cfSopenharmony_ci
429ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceProxyMethodDecl(MetaMethod* mm, StringBuilder& sb, const String& prefix)
430ca0551cfSopenharmony_ci{
431ca0551cfSopenharmony_ci    MetaType* returnType = metaComponent_->types_[mm->returnTypeIndex_];
432ca0551cfSopenharmony_ci    if (mm->parameterNumber_ == 0 && returnType->kind_ == TypeKind::Void) {
433ca0551cfSopenharmony_ci        sb.Append(prefix).AppendFormat("ErrCode %s() override;\n", mm->name_);
434ca0551cfSopenharmony_ci    } else {
435ca0551cfSopenharmony_ci        sb.Append(prefix).AppendFormat("ErrCode %s(\n", mm->name_);
436ca0551cfSopenharmony_ci        for (int i = 0; i < mm->parameterNumber_; i++) {
437ca0551cfSopenharmony_ci            MetaParameter* mp = mm->parameters_[i];
438ca0551cfSopenharmony_ci            EmitInterfaceMethodParameter(mp, sb, prefix + TAB);
439ca0551cfSopenharmony_ci            if (i != mm->parameterNumber_ - 1 || returnType->kind_ != TypeKind::Void) {
440ca0551cfSopenharmony_ci                sb.Append(",\n");
441ca0551cfSopenharmony_ci            }
442ca0551cfSopenharmony_ci        }
443ca0551cfSopenharmony_ci        if (returnType->kind_ != TypeKind::Void) {
444ca0551cfSopenharmony_ci            EmitInterfaceMethodReturn(returnType, sb, prefix + TAB);
445ca0551cfSopenharmony_ci        }
446ca0551cfSopenharmony_ci        sb.Append(") override;\n");
447ca0551cfSopenharmony_ci    }
448ca0551cfSopenharmony_ci}
449ca0551cfSopenharmony_ci
450ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceProxyDeathRecipient(StringBuilder& sb, const String& prefix)
451ca0551cfSopenharmony_ci{
452ca0551cfSopenharmony_ci    sb.Append(prefix).AppendFormat("class %s : public IRemoteObject::DeathRecipient {\n", deathRecipientName_.string());
453ca0551cfSopenharmony_ci    sb.Append(prefix).Append("public:\n");
454ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).AppendFormat("explicit %s(%s &client) : client_(client) {}\n", deathRecipientName_.string(),
455ca0551cfSopenharmony_ci        proxyName_.string());
456ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).AppendFormat("~%s() override = default;\n", deathRecipientName_.string());
457ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("void OnRemoteDied(const wptr<IRemoteObject> &remote) override\n");
458ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("{\n");
459ca0551cfSopenharmony_ci    sb.Append(prefix + TAB + TAB).Append("client_.OnRemoteDied(remote);\n");
460ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("}\n");
461ca0551cfSopenharmony_ci    sb.Append(prefix).Append("private:\n");
462ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).AppendFormat("%s &client_;\n", proxyName_.string());
463ca0551cfSopenharmony_ci    sb.Append(prefix).Append("};\n\n");
464ca0551cfSopenharmony_ci
465ca0551cfSopenharmony_ci    sb.Append(prefix).Append("void OnRemoteDied(const wptr<IRemoteObject> &remoteObject)\n");
466ca0551cfSopenharmony_ci    sb.Append(prefix).Append("{\n");
467ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("(void)remoteObject;\n");
468ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("ApiCacheManager::GetInstance().ClearCache(GetDescriptor());\n");
469ca0551cfSopenharmony_ci    sb.Append(prefix).Append("}\n");
470ca0551cfSopenharmony_ci    sb.Append(prefix).Append("sptr<IRemoteObject> remote_ = nullptr;\n");
471ca0551cfSopenharmony_ci    sb.Append(prefix).Append("sptr<IRemoteObject::DeathRecipient> deathRecipient_ = nullptr;\n");
472ca0551cfSopenharmony_ci}
473ca0551cfSopenharmony_ci
474ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceProxyConstants(StringBuilder& sb, const String& prefix)
475ca0551cfSopenharmony_ci{
476ca0551cfSopenharmony_ci    if (metaComponent_->hasCacheableProxyMethods_) {
477ca0551cfSopenharmony_ci        EmitInterfaceProxyDeathRecipient(sb, prefix);
478ca0551cfSopenharmony_ci    }
479ca0551cfSopenharmony_ci    EmitInterfaceMethodCommands(sb, prefix);
480ca0551cfSopenharmony_ci    sb.Append("\n");
481ca0551cfSopenharmony_ci    sb.Append(prefix).AppendFormat("static inline BrokerDelegator<%s> delegator_;\n", proxyName_.string());
482ca0551cfSopenharmony_ci}
483ca0551cfSopenharmony_ci
484ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceProxyCppFile()
485ca0551cfSopenharmony_ci{
486ca0551cfSopenharmony_ci    String filePath = String::Format("%s/%s.cpp", directory_.string(), FileName(proxyName_).string());
487ca0551cfSopenharmony_ci    File file(filePath, File::WRITE);
488ca0551cfSopenharmony_ci
489ca0551cfSopenharmony_ci    StringBuilder sb;
490ca0551cfSopenharmony_ci
491ca0551cfSopenharmony_ci    EmitLicense(sb);
492ca0551cfSopenharmony_ci    sb.Append("\n");
493ca0551cfSopenharmony_ci    sb.AppendFormat("#include \"%s.h\"\n", FileName(proxyName_).string());
494ca0551cfSopenharmony_ci    if (logOn_) {
495ca0551cfSopenharmony_ci        sb.Append("#include \"hilog/log.h\"\n");
496ca0551cfSopenharmony_ci    }
497ca0551cfSopenharmony_ci    if (hitraceOn_) {
498ca0551cfSopenharmony_ci        sb.Append("#include \"hitrace_meter.h\"\n");
499ca0551cfSopenharmony_ci    }
500ca0551cfSopenharmony_ci    sb.Append("\n");
501ca0551cfSopenharmony_ci    if (logOn_) {
502ca0551cfSopenharmony_ci        sb.Append("using OHOS::HiviewDFX::HiLog;\n\n");
503ca0551cfSopenharmony_ci    }
504ca0551cfSopenharmony_ci    EmitBeginNamespace(sb);
505ca0551cfSopenharmony_ci    EmitInterfaceProxyMethodImpls(sb, "");
506ca0551cfSopenharmony_ci    EmitEndNamespace(sb);
507ca0551cfSopenharmony_ci
508ca0551cfSopenharmony_ci    String data = sb.ToString();
509ca0551cfSopenharmony_ci    file.WriteData(data.string(), data.GetLength());
510ca0551cfSopenharmony_ci    file.Flush();
511ca0551cfSopenharmony_ci    file.Close();
512ca0551cfSopenharmony_ci}
513ca0551cfSopenharmony_ci
514ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceProxyMethodImpls(StringBuilder& sb, const String& prefix)
515ca0551cfSopenharmony_ci{
516ca0551cfSopenharmony_ci    if (metaInterface_->methodNumber_ > 0) {
517ca0551cfSopenharmony_ci        for (int i = 0; i < metaInterface_->methodNumber_; i++) {
518ca0551cfSopenharmony_ci            MetaMethod* mm = metaInterface_->methods_[i];
519ca0551cfSopenharmony_ci            EmitInterfaceProxyMethodImpl(mm, sb, prefix);
520ca0551cfSopenharmony_ci            if (i != metaInterface_->methodNumber_ - 1) {
521ca0551cfSopenharmony_ci                sb.Append("\n");
522ca0551cfSopenharmony_ci            }
523ca0551cfSopenharmony_ci        }
524ca0551cfSopenharmony_ci    }
525ca0551cfSopenharmony_ci}
526ca0551cfSopenharmony_ci
527ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceProxyMethodImpl(MetaMethod* mm, StringBuilder& sb, const String& prefix)
528ca0551cfSopenharmony_ci{
529ca0551cfSopenharmony_ci    MetaType* returnType = metaComponent_->types_[mm->returnTypeIndex_];
530ca0551cfSopenharmony_ci    if (mm->parameterNumber_ == 0 && returnType->kind_ == TypeKind::Void) {
531ca0551cfSopenharmony_ci        sb.Append(prefix).AppendFormat("ErrCode %s::%s()\n", proxyName_.string(), mm->name_);
532ca0551cfSopenharmony_ci    } else {
533ca0551cfSopenharmony_ci        sb.Append(prefix).AppendFormat("ErrCode %s::%s(\n", proxyName_.string(), mm->name_);
534ca0551cfSopenharmony_ci        for (int i = 0; i < mm->parameterNumber_; i++) {
535ca0551cfSopenharmony_ci            MetaParameter* mp = mm->parameters_[i];
536ca0551cfSopenharmony_ci            EmitInterfaceMethodParameter(mp, sb, prefix + TAB);
537ca0551cfSopenharmony_ci            if (i != mm->parameterNumber_ - 1 || returnType->kind_ != TypeKind::Void) {
538ca0551cfSopenharmony_ci                sb.Append(",\n");
539ca0551cfSopenharmony_ci            }
540ca0551cfSopenharmony_ci        }
541ca0551cfSopenharmony_ci        if (returnType->kind_ != TypeKind::Void) {
542ca0551cfSopenharmony_ci            EmitInterfaceMethodReturn(returnType, sb, prefix + TAB);
543ca0551cfSopenharmony_ci        }
544ca0551cfSopenharmony_ci        sb.Append(")\n");
545ca0551cfSopenharmony_ci    }
546ca0551cfSopenharmony_ci    EmitInterfaceProxyMethodBody(mm, sb, prefix);
547ca0551cfSopenharmony_ci}
548ca0551cfSopenharmony_ci
549ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceProxyMethodPreSendRequest(MetaMethod* mm, StringBuilder& sb, const String& prefix)
550ca0551cfSopenharmony_ci{
551ca0551cfSopenharmony_ci    if ((mm->cacheable_ == true) && ((mm->properties_ & METHOD_PROPERTY_ONEWAY) == 0)) {
552ca0551cfSopenharmony_ci        sb.Append("\n");
553ca0551cfSopenharmony_ci        sb.Append(prefix + TAB).AppendFormat(
554ca0551cfSopenharmony_ci            "bool hitCache = ApiCacheManager::GetInstance().PreSendRequest(GetDescriptor(), COMMAND_%s, data, reply);",
555ca0551cfSopenharmony_ci            ConstantName(mm->name_).string());
556ca0551cfSopenharmony_ci        sb.Append("\n");
557ca0551cfSopenharmony_ci        sb.Append(prefix + TAB).Append("if (hitCache == true) {\n");
558ca0551cfSopenharmony_ci        EmitInterfaceProxyMethodErrCode(sb, prefix + TAB);
559ca0551cfSopenharmony_ci        EmitInterfaceProxyMethodReply(mm, sb, prefix + TAB);
560ca0551cfSopenharmony_ci        sb.Append(prefix + TAB + TAB).Append("return ERR_OK;\n");
561ca0551cfSopenharmony_ci        sb.Append(prefix + TAB).Append("}\n\n");
562ca0551cfSopenharmony_ci    }
563ca0551cfSopenharmony_ci}
564ca0551cfSopenharmony_ci
565ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceProxyMethodPostSendRequest(MetaMethod* mm, StringBuilder& sb, const String& prefix)
566ca0551cfSopenharmony_ci{
567ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).AppendFormat(
568ca0551cfSopenharmony_ci        "ApiCacheManager::GetInstance().PostSendRequest(GetDescriptor(), COMMAND_%s, data, reply);\n",
569ca0551cfSopenharmony_ci        ConstantName(mm->name_).string());
570ca0551cfSopenharmony_ci}
571ca0551cfSopenharmony_ci
572ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceProxyMethodBody(MetaMethod* mm, StringBuilder& sb, const String& prefix)
573ca0551cfSopenharmony_ci{
574ca0551cfSopenharmony_ci    sb.Append(prefix).Append("{\n");
575ca0551cfSopenharmony_ci    if (hitraceOn_) {
576ca0551cfSopenharmony_ci        sb.Append(prefix + TAB).AppendFormat("HITRACE_METER_NAME(%s, __PRETTY_FUNCTION__);\n",
577ca0551cfSopenharmony_ci            hitraceTag_.string());
578ca0551cfSopenharmony_ci    }
579ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("MessageParcel data;\n");
580ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("MessageParcel reply;\n");
581ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).AppendFormat("MessageOption option(%s);\n",
582ca0551cfSopenharmony_ci        (mm->properties_ & METHOD_PROPERTY_ONEWAY) != 0 ? "MessageOption::TF_ASYNC" : "MessageOption::TF_SYNC");
583ca0551cfSopenharmony_ci    sb.Append("\n");
584ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("if (!data.WriteInterfaceToken(GetDescriptor())) {\n");
585ca0551cfSopenharmony_ci    if (logOn_) {
586ca0551cfSopenharmony_ci        sb.Append(prefix + TAB).Append(TAB).Append("HiLog::Error(LABEL, \"Write interface token failed!\");\n");
587ca0551cfSopenharmony_ci    }
588ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append(TAB).Append("return ERR_INVALID_VALUE;\n");
589ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("}\n");
590ca0551cfSopenharmony_ci    sb.Append("\n");
591ca0551cfSopenharmony_ci
592ca0551cfSopenharmony_ci    for (int i = 0; i < mm->parameterNumber_; i++) {
593ca0551cfSopenharmony_ci        MetaParameter* mp = mm->parameters_[i];
594ca0551cfSopenharmony_ci        if ((mp->attributes_ & ATTR_IN) != 0) {
595ca0551cfSopenharmony_ci            EmitWriteMethodParameter(mp, "data.", sb, prefix + TAB);
596ca0551cfSopenharmony_ci        }
597ca0551cfSopenharmony_ci    }
598ca0551cfSopenharmony_ci    EmitInterfaceProxyMethodPreSendRequest(mm, sb, prefix);
599ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("sptr<IRemoteObject> remote = Remote();\n");
600ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("if (remote == nullptr) {\n");
601ca0551cfSopenharmony_ci    if (logOn_) {
602ca0551cfSopenharmony_ci        sb.Append(prefix + TAB).Append(TAB).Append("HiLog::Error(LABEL, \"Remote is nullptr!\");\n");
603ca0551cfSopenharmony_ci    }
604ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append(TAB).Append("return ERR_INVALID_DATA;\n");
605ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("}\n\n");
606ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).AppendFormat("int32_t result = remote->SendRequest(COMMAND_%s, data, reply, option);\n",
607ca0551cfSopenharmony_ci        ConstantName(mm->name_).string());
608ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("if (FAILED(result)) {\n");
609ca0551cfSopenharmony_ci    if (logOn_) {
610ca0551cfSopenharmony_ci        sb.Append(prefix + TAB).Append(TAB).Append("HiLog::Error(LABEL, \"Send request failed!\");\n");
611ca0551cfSopenharmony_ci    }
612ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("    return result;\n");
613ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("}\n");
614ca0551cfSopenharmony_ci    EmitInterfaceProxyMethodRetValue(mm, sb, prefix);
615ca0551cfSopenharmony_ci    sb.Append(prefix).Append("}\n");
616ca0551cfSopenharmony_ci}
617ca0551cfSopenharmony_ci
618ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceProxyMethodErrCode(StringBuilder& sb, const String& prefix)
619ca0551cfSopenharmony_ci{
620ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("ErrCode errCode = reply.ReadInt32();\n");
621ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("if (FAILED(errCode)) {\n");
622ca0551cfSopenharmony_ci    if (logOn_) {
623ca0551cfSopenharmony_ci        sb.Append(prefix + TAB + TAB).Append("HiLog::Error(LABEL, \"Read Int32 failed!\");\n");
624ca0551cfSopenharmony_ci    }
625ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("    return errCode;\n");
626ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("}\n");
627ca0551cfSopenharmony_ci}
628ca0551cfSopenharmony_ci
629ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceProxyMethodReply(MetaMethod* mm, StringBuilder& sb, const String& prefix)
630ca0551cfSopenharmony_ci{
631ca0551cfSopenharmony_ci    for (int i = 0; i < mm->parameterNumber_; i++) {
632ca0551cfSopenharmony_ci        MetaParameter* mp = mm->parameters_[i];
633ca0551cfSopenharmony_ci        if ((mp->attributes_ & ATTR_OUT) != 0) {
634ca0551cfSopenharmony_ci            EmitReadMethodParameter(mp, "reply.", sb, prefix + TAB);
635ca0551cfSopenharmony_ci        }
636ca0551cfSopenharmony_ci    }
637ca0551cfSopenharmony_ci    MetaType* returnType = metaComponent_->types_[mm->returnTypeIndex_];
638ca0551cfSopenharmony_ci    if (returnType->kind_ != TypeKind::Void) {
639ca0551cfSopenharmony_ci        EmitReadVariable("reply.", "result", returnType, sb, prefix + TAB, false);
640ca0551cfSopenharmony_ci    }
641ca0551cfSopenharmony_ci}
642ca0551cfSopenharmony_ci
643ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceProxyMethodRetValue(MetaMethod* mm, StringBuilder& sb, const String& prefix)
644ca0551cfSopenharmony_ci{
645ca0551cfSopenharmony_ci    if ((mm->properties_ & METHOD_PROPERTY_ONEWAY) == 0) {
646ca0551cfSopenharmony_ci        EmitInterfaceProxyMethodErrCode(sb, prefix);
647ca0551cfSopenharmony_ci        sb.Append("\n");
648ca0551cfSopenharmony_ci        if (mm->cacheable_ == true) {
649ca0551cfSopenharmony_ci            EmitInterfaceProxyMethodPostSendRequest(mm, sb, prefix);
650ca0551cfSopenharmony_ci        }
651ca0551cfSopenharmony_ci        EmitInterfaceProxyMethodReply(mm, sb, prefix);
652ca0551cfSopenharmony_ci    }
653ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("return ERR_OK;\n");
654ca0551cfSopenharmony_ci}
655ca0551cfSopenharmony_ci
656ca0551cfSopenharmony_civoid CppCodeEmitter::EmitWriteMethodParameter(MetaParameter* mp, const String& parcelName, StringBuilder& sb,
657ca0551cfSopenharmony_ci    const String& prefix)
658ca0551cfSopenharmony_ci{
659ca0551cfSopenharmony_ci    MetaType* mt = metaComponent_->types_[mp->typeIndex_];
660ca0551cfSopenharmony_ci    const std::string name = mp->name_;
661ca0551cfSopenharmony_ci    EmitWriteVariable(parcelName, name, mt, sb, prefix);
662ca0551cfSopenharmony_ci}
663ca0551cfSopenharmony_ci
664ca0551cfSopenharmony_civoid CppCodeEmitter::EmitReadMethodParameter(MetaParameter* mp, const String& parcelName, StringBuilder& sb,
665ca0551cfSopenharmony_ci    const String& prefix)
666ca0551cfSopenharmony_ci{
667ca0551cfSopenharmony_ci    MetaType* mt = metaComponent_->types_[mp->typeIndex_];
668ca0551cfSopenharmony_ci    const std::string name = mp->name_;
669ca0551cfSopenharmony_ci    EmitReadVariable(parcelName, name, mt, sb, prefix, false);
670ca0551cfSopenharmony_ci}
671ca0551cfSopenharmony_ci
672ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceStub()
673ca0551cfSopenharmony_ci{
674ca0551cfSopenharmony_ci    EmitInterfaceStubHeaderFile();
675ca0551cfSopenharmony_ci    EmitInterfaceStubCppFile();
676ca0551cfSopenharmony_ci}
677ca0551cfSopenharmony_ci
678ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceStubHeaderFile()
679ca0551cfSopenharmony_ci{
680ca0551cfSopenharmony_ci    String filePath = String::Format("%s/%s.h", directory_.string(), FileName(stubName_).string());
681ca0551cfSopenharmony_ci    File file(filePath, File::WRITE);
682ca0551cfSopenharmony_ci
683ca0551cfSopenharmony_ci    StringBuilder sb;
684ca0551cfSopenharmony_ci
685ca0551cfSopenharmony_ci    EmitLicense(sb);
686ca0551cfSopenharmony_ci    sb.Append("\n");
687ca0551cfSopenharmony_ci    EmitHeadMacro(sb, stubFullName_);
688ca0551cfSopenharmony_ci    sb.Append("\n");
689ca0551cfSopenharmony_ci    sb.AppendFormat("#include \"%s.h\"\n", FileName(interfaceName_).string());
690ca0551cfSopenharmony_ci    sb.Append("#include <iremote_stub.h>\n");
691ca0551cfSopenharmony_ci    sb.Append("\n");
692ca0551cfSopenharmony_ci    EmitInterfaceStubInHeaderFile(sb);
693ca0551cfSopenharmony_ci    EmitTailMacro(sb, stubFullName_);
694ca0551cfSopenharmony_ci
695ca0551cfSopenharmony_ci    String data = sb.ToString();
696ca0551cfSopenharmony_ci    file.WriteData(data.string(), data.GetLength());
697ca0551cfSopenharmony_ci    file.Flush();
698ca0551cfSopenharmony_ci    file.Close();
699ca0551cfSopenharmony_ci}
700ca0551cfSopenharmony_ci
701ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceStubInHeaderFile(StringBuilder& sb)
702ca0551cfSopenharmony_ci{
703ca0551cfSopenharmony_ci    EmitBeginNamespace(sb);
704ca0551cfSopenharmony_ci    sb.AppendFormat("class %s : public IRemoteStub<%s> {\n", stubName_.string(), interfaceName_.string());
705ca0551cfSopenharmony_ci    sb.Append("public:\n");
706ca0551cfSopenharmony_ci    EmitInterfaceStubMethodDecls(sb, TAB);
707ca0551cfSopenharmony_ci    sb.Append("\n");
708ca0551cfSopenharmony_ci    sb.Append("private:\n");
709ca0551cfSopenharmony_ci    EmitInterfaceStubConstants(sb, TAB);
710ca0551cfSopenharmony_ci    sb.Append("};\n");
711ca0551cfSopenharmony_ci    EmitEndNamespace(sb);
712ca0551cfSopenharmony_ci}
713ca0551cfSopenharmony_ci
714ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceStubMethodDecls(StringBuilder& sb, const String& prefix)
715ca0551cfSopenharmony_ci{
716ca0551cfSopenharmony_ci    sb.Append(prefix).Append("int32_t OnRemoteRequest(\n");
717ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("uint32_t code,\n");
718ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("MessageParcel& data,\n");
719ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("MessageParcel& reply,\n");
720ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("MessageOption& option) override;\n");
721ca0551cfSopenharmony_ci}
722ca0551cfSopenharmony_ci
723ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceStubConstants(StringBuilder& sb, const String& prefix)
724ca0551cfSopenharmony_ci{
725ca0551cfSopenharmony_ci    EmitInterfaceMethodCommands(sb, prefix);
726ca0551cfSopenharmony_ci}
727ca0551cfSopenharmony_ci
728ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceStubCppFile()
729ca0551cfSopenharmony_ci{
730ca0551cfSopenharmony_ci    String filePath = String::Format("%s/%s.cpp", directory_.string(), FileName(stubName_).string());
731ca0551cfSopenharmony_ci    File file(filePath, File::WRITE);
732ca0551cfSopenharmony_ci
733ca0551cfSopenharmony_ci    StringBuilder sb;
734ca0551cfSopenharmony_ci
735ca0551cfSopenharmony_ci    EmitLicense(sb);
736ca0551cfSopenharmony_ci    sb.Append("\n");
737ca0551cfSopenharmony_ci    sb.AppendFormat("#include \"%s.h\"\n", FileName(stubName_).string());
738ca0551cfSopenharmony_ci    if (logOn_) {
739ca0551cfSopenharmony_ci        sb.Append("#include \"hilog/log.h\"\n");
740ca0551cfSopenharmony_ci    }
741ca0551cfSopenharmony_ci    if (hitraceOn_) {
742ca0551cfSopenharmony_ci        sb.Append("#include \"hitrace_meter.h\"\n");
743ca0551cfSopenharmony_ci    }
744ca0551cfSopenharmony_ci    sb.Append("\n");
745ca0551cfSopenharmony_ci    if (logOn_) {
746ca0551cfSopenharmony_ci        sb.Append("using OHOS::HiviewDFX::HiLog;\n\n");
747ca0551cfSopenharmony_ci    }
748ca0551cfSopenharmony_ci    EmitBeginNamespace(sb);
749ca0551cfSopenharmony_ci    EmitInterfaceStubMethodImpls(sb, "");
750ca0551cfSopenharmony_ci    EmitEndNamespace(sb);
751ca0551cfSopenharmony_ci
752ca0551cfSopenharmony_ci    String data = sb.ToString();
753ca0551cfSopenharmony_ci    file.WriteData(data.string(), data.GetLength());
754ca0551cfSopenharmony_ci    file.Flush();
755ca0551cfSopenharmony_ci    file.Close();
756ca0551cfSopenharmony_ci}
757ca0551cfSopenharmony_ci
758ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceStubMethodImpls(StringBuilder& sb, const String& prefix)
759ca0551cfSopenharmony_ci{
760ca0551cfSopenharmony_ci    sb.Append(prefix).AppendFormat("int32_t %s::OnRemoteRequest(\n", stubName_.string());
761ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("uint32_t code,\n");
762ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("MessageParcel& data,\n");
763ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("MessageParcel& reply,\n");
764ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("MessageOption& option)\n");
765ca0551cfSopenharmony_ci    sb.Append(prefix).Append("{\n");
766ca0551cfSopenharmony_ci    if (hitraceOn_) {
767ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).AppendFormat("HITRACE_METER_NAME(%s, __PRETTY_FUNCTION__);\n",
768ca0551cfSopenharmony_ci        hitraceTag_.string());
769ca0551cfSopenharmony_ci    }
770ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("std::u16string localDescriptor = GetDescriptor();\n");
771ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("std::u16string remoteDescriptor = data.ReadInterfaceToken();\n");
772ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("if (localDescriptor != remoteDescriptor) {\n");
773ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append(TAB).Append("return ERR_TRANSACTION_FAILED;\n");
774ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("}\n");
775ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("switch (code) {\n");
776ca0551cfSopenharmony_ci    for (int i = 0; i < metaInterface_->methodNumber_; i++) {
777ca0551cfSopenharmony_ci        MetaMethod* mm = metaInterface_->methods_[i];
778ca0551cfSopenharmony_ci        EmitInterfaceStubMethodImpl(mm, sb, prefix + TAB + TAB);
779ca0551cfSopenharmony_ci    }
780ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append(TAB).Append("default:\n");
781ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append(TAB).Append(TAB).Append(
782ca0551cfSopenharmony_ci        "return IPCObjectStub::OnRemoteRequest(code, data, reply, option);\n");
783ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("}\n\n");
784ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("return ERR_TRANSACTION_FAILED;\n");
785ca0551cfSopenharmony_ci    sb.Append(prefix).Append("}\n");
786ca0551cfSopenharmony_ci}
787ca0551cfSopenharmony_ci
788ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceStubMethodImplReturn(MetaMethod* mm,
789ca0551cfSopenharmony_ci    StringBuilder& sb, const String& prefix, MetaType* returnType)
790ca0551cfSopenharmony_ci{
791ca0551cfSopenharmony_ci    if (returnType->kind_ != TypeKind::Void) {
792ca0551cfSopenharmony_ci        if ((returnType->kind_ == TypeKind::Sequenceable) || (returnType->kind_ == TypeKind::Interface)) {
793ca0551cfSopenharmony_ci            sb.Append(prefix + TAB).AppendFormat("%s result = nullptr;\n",
794ca0551cfSopenharmony_ci                EmitType(returnType, ATTR_IN, true).string());
795ca0551cfSopenharmony_ci        } else {
796ca0551cfSopenharmony_ci            sb.Append(prefix + TAB).AppendFormat("%s result;\n", EmitType(returnType, ATTR_IN, true).string());
797ca0551cfSopenharmony_ci        }
798ca0551cfSopenharmony_ci    }
799ca0551cfSopenharmony_ci    if (mm->parameterNumber_ == 0 && returnType->kind_ == TypeKind::Void) {
800ca0551cfSopenharmony_ci        sb.Append(prefix + TAB).AppendFormat("ErrCode errCode = %s();\n", mm->name_);
801ca0551cfSopenharmony_ci    } else {
802ca0551cfSopenharmony_ci        sb.Append(prefix + TAB).AppendFormat("ErrCode errCode = %s(", mm->name_);
803ca0551cfSopenharmony_ci        for (int i = 0; i < mm->parameterNumber_; i++) {
804ca0551cfSopenharmony_ci            MetaParameter* mp = mm->parameters_[i];
805ca0551cfSopenharmony_ci            if (mp == nullptr) {
806ca0551cfSopenharmony_ci                continue;
807ca0551cfSopenharmony_ci            }
808ca0551cfSopenharmony_ci            const std::string name = mp->name_;
809ca0551cfSopenharmony_ci            MetaType* mGetType = metaComponent_->types_[mp->typeIndex_];
810ca0551cfSopenharmony_ci            if (mGetType != nullptr && mGetType->kind_ == TypeKind::Sequenceable && !mp->isSequenceableForOut_) {
811ca0551cfSopenharmony_ci                const std::string parameterName = "*" + name;
812ca0551cfSopenharmony_ci                sb.Append(parameterName.c_str());
813ca0551cfSopenharmony_ci            } else {
814ca0551cfSopenharmony_ci                sb.Append(name.c_str());
815ca0551cfSopenharmony_ci            }
816ca0551cfSopenharmony_ci
817ca0551cfSopenharmony_ci            if (i != mm->parameterNumber_ - 1 || returnType->kind_ != TypeKind::Void) {
818ca0551cfSopenharmony_ci                sb.Append(", ");
819ca0551cfSopenharmony_ci            }
820ca0551cfSopenharmony_ci        }
821ca0551cfSopenharmony_ci        if (returnType->kind_ != TypeKind::Void) {
822ca0551cfSopenharmony_ci            EmitReturnParameter("result", returnType, sb);
823ca0551cfSopenharmony_ci        }
824ca0551cfSopenharmony_ci        sb.AppendFormat(");\n", mm->name_);
825ca0551cfSopenharmony_ci    }
826ca0551cfSopenharmony_ci}
827ca0551cfSopenharmony_ci
828ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceStubMethodImpl(MetaMethod* mm, StringBuilder& sb, const String& prefix)
829ca0551cfSopenharmony_ci{
830ca0551cfSopenharmony_ci    sb.Append(prefix).AppendFormat("case COMMAND_%s: {\n", ConstantName(mm->name_).string());
831ca0551cfSopenharmony_ci    for (int i = 0; i < mm->parameterNumber_; i++) {
832ca0551cfSopenharmony_ci        MetaParameter* mp = mm->parameters_[i];
833ca0551cfSopenharmony_ci        if ((mp->attributes_ & ATTR_IN) != 0) {
834ca0551cfSopenharmony_ci            MetaType* mt = metaComponent_->types_[mp->typeIndex_];
835ca0551cfSopenharmony_ci            const std::string name = mp->name_;
836ca0551cfSopenharmony_ci            EmitReadVariable("data.", name, mt, sb, prefix + TAB);
837ca0551cfSopenharmony_ci        } else if ((mp->attributes_ & ATTR_OUT) != 0) {
838ca0551cfSopenharmony_ci            EmitLocalVariable(mp, sb, prefix + TAB);
839ca0551cfSopenharmony_ci        }
840ca0551cfSopenharmony_ci    }
841ca0551cfSopenharmony_ci    MetaType* returnType = metaComponent_->types_[mm->returnTypeIndex_];
842ca0551cfSopenharmony_ci    if (returnType == nullptr) {
843ca0551cfSopenharmony_ci        return;
844ca0551cfSopenharmony_ci    }
845ca0551cfSopenharmony_ci    EmitInterfaceStubMethodImplReturn(mm, sb, prefix, returnType);
846ca0551cfSopenharmony_ci
847ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("if (!reply.WriteInt32(errCode)) {\n");
848ca0551cfSopenharmony_ci    if (logOn_) {
849ca0551cfSopenharmony_ci        sb.Append(prefix + TAB).Append(TAB).Append("HiLog::Error(LABEL, \"Write Int32 failed!\");\n");
850ca0551cfSopenharmony_ci    }
851ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append(TAB).Append("return ERR_INVALID_VALUE;\n");
852ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("}\n");
853ca0551cfSopenharmony_ci    bool hasOutParameter = false;
854ca0551cfSopenharmony_ci    for (int i = 0; i < mm->parameterNumber_; i++) {
855ca0551cfSopenharmony_ci        MetaParameter* mp = mm->parameters_[i];
856ca0551cfSopenharmony_ci        if ((mp->attributes_ & ATTR_OUT) != 0) {
857ca0551cfSopenharmony_ci            hasOutParameter = true;
858ca0551cfSopenharmony_ci        }
859ca0551cfSopenharmony_ci    }
860ca0551cfSopenharmony_ci    if (hasOutParameter || returnType->kind_ != TypeKind::Void) {
861ca0551cfSopenharmony_ci        sb.Append(prefix + TAB).Append("if (SUCCEEDED(errCode)) {\n");
862ca0551cfSopenharmony_ci        for (int i = 0; i < mm->parameterNumber_; i++) {
863ca0551cfSopenharmony_ci            MetaParameter* mp = mm->parameters_[i];
864ca0551cfSopenharmony_ci            if ((mp->attributes_ & ATTR_OUT) != 0) {
865ca0551cfSopenharmony_ci                EmitWriteMethodParameter(mp, "reply.", sb, prefix + TAB + TAB);
866ca0551cfSopenharmony_ci            }
867ca0551cfSopenharmony_ci        }
868ca0551cfSopenharmony_ci        if (returnType->kind_ != TypeKind::Void) {
869ca0551cfSopenharmony_ci            EmitWriteVariable("reply.", "result", returnType, sb, prefix + TAB + TAB);
870ca0551cfSopenharmony_ci        }
871ca0551cfSopenharmony_ci        sb.Append(prefix + TAB).Append("}\n");
872ca0551cfSopenharmony_ci    }
873ca0551cfSopenharmony_ci    sb.Append(prefix + TAB).Append("return ERR_NONE;\n");
874ca0551cfSopenharmony_ci    sb.Append(prefix).Append("}\n");
875ca0551cfSopenharmony_ci}
876ca0551cfSopenharmony_ci
877ca0551cfSopenharmony_civoid CppCodeEmitter::EmitInterfaceMethodCommands(StringBuilder& sb, const String& prefix)
878ca0551cfSopenharmony_ci{
879ca0551cfSopenharmony_ci    for (int i = 0; i < metaInterface_->methodNumber_; i++) {
880ca0551cfSopenharmony_ci        MetaMethod* mm = metaInterface_->methods_[i];
881ca0551cfSopenharmony_ci        sb.Append(prefix).AppendFormat("static constexpr int32_t COMMAND_%s = MIN_TRANSACTION_ID + %d;\n",
882ca0551cfSopenharmony_ci            ConstantName(mm->name_).string(), i);
883ca0551cfSopenharmony_ci    }
884ca0551cfSopenharmony_ci}
885ca0551cfSopenharmony_ci
886ca0551cfSopenharmony_civoid CppCodeEmitter::EmitLicense(StringBuilder& sb)
887ca0551cfSopenharmony_ci{
888ca0551cfSopenharmony_ci    sb.Append(metaInterface_->license_).Append("\n");
889ca0551cfSopenharmony_ci}
890ca0551cfSopenharmony_ci
891ca0551cfSopenharmony_civoid CppCodeEmitter::EmitHeadMacro(StringBuilder& sb, const String& fullName)
892ca0551cfSopenharmony_ci{
893ca0551cfSopenharmony_ci    String macroName = MacroName(fullName);
894ca0551cfSopenharmony_ci    sb.Append("#ifndef ").Append(macroName).Append("\n");
895ca0551cfSopenharmony_ci    sb.Append("#define ").Append(macroName).Append("\n");
896ca0551cfSopenharmony_ci}
897ca0551cfSopenharmony_ci
898ca0551cfSopenharmony_civoid CppCodeEmitter::EmitTailMacro(StringBuilder& sb, const String& fullName)
899ca0551cfSopenharmony_ci{
900ca0551cfSopenharmony_ci    String macroName = MacroName(fullName);
901ca0551cfSopenharmony_ci    sb.Append("#endif // ").Append(macroName).Append("\n\n");
902ca0551cfSopenharmony_ci}
903ca0551cfSopenharmony_ci
904ca0551cfSopenharmony_civoid CppCodeEmitter::EmitBeginNamespace(StringBuilder& sb)
905ca0551cfSopenharmony_ci{
906ca0551cfSopenharmony_ci    String nspace = GetNamespace(metaInterface_->namespace_);
907ca0551cfSopenharmony_ci    int index = nspace.IndexOf('.');
908ca0551cfSopenharmony_ci    while (index != -1) {
909ca0551cfSopenharmony_ci        sb.AppendFormat("namespace %s {\n", nspace.Substring(0, index).string());
910ca0551cfSopenharmony_ci        nspace = nspace.Substring(index + 1);
911ca0551cfSopenharmony_ci        index = nspace.IndexOf('.');
912ca0551cfSopenharmony_ci    }
913ca0551cfSopenharmony_ci}
914ca0551cfSopenharmony_ci
915ca0551cfSopenharmony_civoid CppCodeEmitter::EmitEndNamespace(StringBuilder& sb)
916ca0551cfSopenharmony_ci{
917ca0551cfSopenharmony_ci    String nspace = GetNamespace(metaInterface_->namespace_);
918ca0551cfSopenharmony_ci    nspace = nspace.Substring(0, nspace.GetLength() - 1);
919ca0551cfSopenharmony_ci    while (!nspace.IsEmpty()) {
920ca0551cfSopenharmony_ci        int index = nspace.LastIndexOf('.');
921ca0551cfSopenharmony_ci        sb.AppendFormat("} // namespace %s\n", index != -1 ?
922ca0551cfSopenharmony_ci            nspace.Substring(index + 1, nspace.GetLength()).string() : nspace.string());
923ca0551cfSopenharmony_ci        nspace = nspace.Substring(0, index);
924ca0551cfSopenharmony_ci    }
925ca0551cfSopenharmony_ci}
926ca0551cfSopenharmony_ci
927ca0551cfSopenharmony_civoid CppCodeEmitter::EmitWriteVariable(const String& parcelName, const std::string& name, MetaType* mt,
928ca0551cfSopenharmony_ci    StringBuilder& sb, const String& prefix)
929ca0551cfSopenharmony_ci{
930ca0551cfSopenharmony_ci    switch (mt->kind_) {
931ca0551cfSopenharmony_ci        case TypeKind::Boolean:
932ca0551cfSopenharmony_ci            sb.Append(prefix).AppendFormat("if (!%sWriteInt32(%s ? 1 : 0)) {\n", parcelName.string(), name.c_str());
933ca0551cfSopenharmony_ci            if (logOn_) {
934ca0551cfSopenharmony_ci                sb.Append(prefix).Append(TAB).AppendFormat("HiLog::Error(LABEL, \"Write [%s] failed!\");\n",
935ca0551cfSopenharmony_ci                    name.c_str());
936ca0551cfSopenharmony_ci            }
937ca0551cfSopenharmony_ci            sb.Append(prefix).Append(TAB).Append("return ERR_INVALID_DATA;\n");
938ca0551cfSopenharmony_ci            sb.Append(prefix).Append("}\n");
939ca0551cfSopenharmony_ci            break;
940ca0551cfSopenharmony_ci        case TypeKind::Char:
941ca0551cfSopenharmony_ci        case TypeKind::Byte:
942ca0551cfSopenharmony_ci        case TypeKind::Short:
943ca0551cfSopenharmony_ci        case TypeKind::Integer:
944ca0551cfSopenharmony_ci            sb.Append(prefix).AppendFormat("if (!%sWriteInt32(%s)) {\n", parcelName.string(), name.c_str());
945ca0551cfSopenharmony_ci            if (logOn_) {
946ca0551cfSopenharmony_ci                sb.Append(prefix).Append(TAB).AppendFormat("HiLog::Error(LABEL, \"Write [%s] failed!\");\n",
947ca0551cfSopenharmony_ci                    name.c_str());
948ca0551cfSopenharmony_ci            }
949ca0551cfSopenharmony_ci            sb.Append(prefix).Append(TAB).Append("return ERR_INVALID_DATA;\n");
950ca0551cfSopenharmony_ci            sb.Append(prefix).Append("}\n");
951ca0551cfSopenharmony_ci            break;
952ca0551cfSopenharmony_ci        case TypeKind::Long:
953ca0551cfSopenharmony_ci            sb.Append(prefix).AppendFormat("if (!%sWriteInt64(%s)) {\n", parcelName.string(), name.c_str());
954ca0551cfSopenharmony_ci            if (logOn_) {
955ca0551cfSopenharmony_ci                sb.Append(prefix).Append(TAB).AppendFormat("HiLog::Error(LABEL, \"Write [%s] failed!\");\n",
956ca0551cfSopenharmony_ci                    name.c_str());
957ca0551cfSopenharmony_ci            }
958ca0551cfSopenharmony_ci            sb.Append(prefix).Append(TAB).Append("return ERR_INVALID_DATA;\n");
959ca0551cfSopenharmony_ci            sb.Append(prefix).Append("}\n");
960ca0551cfSopenharmony_ci            break;
961ca0551cfSopenharmony_ci        default:
962ca0551cfSopenharmony_ci            EmitWriteVariableFloat(parcelName, name, mt, sb, prefix);
963ca0551cfSopenharmony_ci            break;
964ca0551cfSopenharmony_ci    }
965ca0551cfSopenharmony_ci}
966ca0551cfSopenharmony_ci
967ca0551cfSopenharmony_civoid CppCodeEmitter::EmitWriteVariableFloat(
968ca0551cfSopenharmony_ci    const String& parcelName, const std::string& name, MetaType* mt, StringBuilder& sb, const String& prefix)
969ca0551cfSopenharmony_ci{
970ca0551cfSopenharmony_ci    switch (mt->kind_) {
971ca0551cfSopenharmony_ci        case TypeKind::Float:
972ca0551cfSopenharmony_ci            sb.Append(prefix).AppendFormat("if (!%sWriteFloat(%s)) {\n", parcelName.string(), name.c_str());
973ca0551cfSopenharmony_ci            if (logOn_) {
974ca0551cfSopenharmony_ci                sb.Append(prefix).Append(TAB).AppendFormat("HiLog::Error(LABEL, \"Write [%s] failed!\");\n",
975ca0551cfSopenharmony_ci                    name.c_str());
976ca0551cfSopenharmony_ci            }
977ca0551cfSopenharmony_ci            sb.Append(prefix).Append(TAB).Append("return ERR_INVALID_DATA;\n");
978ca0551cfSopenharmony_ci            sb.Append(prefix).Append("}\n");
979ca0551cfSopenharmony_ci            break;
980ca0551cfSopenharmony_ci        case TypeKind::Double:
981ca0551cfSopenharmony_ci            sb.Append(prefix).AppendFormat("if (!%sWriteDouble(%s)) {\n", parcelName.string(), name.c_str());
982ca0551cfSopenharmony_ci            if (logOn_) {
983ca0551cfSopenharmony_ci                sb.Append(prefix).Append(TAB).AppendFormat("HiLog::Error(LABEL, \"Write [%s] failed!\");\n",
984ca0551cfSopenharmony_ci                    name.c_str());
985ca0551cfSopenharmony_ci            }
986ca0551cfSopenharmony_ci            sb.Append(prefix).Append(TAB).Append("return ERR_INVALID_DATA;\n");
987ca0551cfSopenharmony_ci            sb.Append(prefix).Append("}\n");
988ca0551cfSopenharmony_ci            break;
989ca0551cfSopenharmony_ci        default:
990ca0551cfSopenharmony_ci            EmitWriteVariableComplex(parcelName, name, mt, sb, prefix);
991ca0551cfSopenharmony_ci            break;
992ca0551cfSopenharmony_ci    }
993ca0551cfSopenharmony_ci}
994ca0551cfSopenharmony_ci
995ca0551cfSopenharmony_civoid CppCodeEmitter::EmitWriteVariableComplex(
996ca0551cfSopenharmony_ci    const String& parcelName, const std::string& name, MetaType* mt, StringBuilder& sb, const String& prefix)
997ca0551cfSopenharmony_ci{
998ca0551cfSopenharmony_ci    switch (mt->kind_) {
999ca0551cfSopenharmony_ci        case TypeKind::Array:
1000ca0551cfSopenharmony_ci        case TypeKind::List: {
1001ca0551cfSopenharmony_ci            sb.Append(prefix).AppendFormat("if (%s.size() > static_cast<size_t>(VECTOR_MAX_SIZE)) {\n", name.c_str());
1002ca0551cfSopenharmony_ci            if (logOn_) {
1003ca0551cfSopenharmony_ci                if (mt != nullptr && mt->kind_ == TypeKind::Array) {
1004ca0551cfSopenharmony_ci                    sb.Append(prefix).Append(TAB).Append(
1005ca0551cfSopenharmony_ci                        "HiLog::Error(LABEL, \"The vector/array size exceeds the security limit!\");\n");
1006ca0551cfSopenharmony_ci                } else {
1007ca0551cfSopenharmony_ci                    sb.Append(prefix).Append(TAB).AppendFormat(
1008ca0551cfSopenharmony_ci                        "HiLog::Error(LABEL, \"The list size exceeds the security limit!\");\n");
1009ca0551cfSopenharmony_ci                }
1010ca0551cfSopenharmony_ci            }
1011ca0551cfSopenharmony_ci            sb.Append(prefix).Append(TAB).Append("return ERR_INVALID_DATA;\n");
1012ca0551cfSopenharmony_ci            sb.Append(prefix).Append("}\n");
1013ca0551cfSopenharmony_ci            sb.Append(prefix).AppendFormat("%sWriteInt32(%s.size());\n", parcelName.string(), name.c_str());
1014ca0551cfSopenharmony_ci            sb.Append(prefix).AppendFormat("for (auto it = %s.begin(); it != %s.end(); ++it) {\n",
1015ca0551cfSopenharmony_ci                name.c_str(), name.c_str());
1016ca0551cfSopenharmony_ci            if (mt != nullptr) {
1017ca0551cfSopenharmony_ci                MetaType* innerType = metaComponent_->types_[mt->nestedTypeIndexes_[0]];
1018ca0551cfSopenharmony_ci                EmitWriteVariable(parcelName, "(*it)", innerType, sb, prefix + TAB);
1019ca0551cfSopenharmony_ci                sb.Append(prefix).Append("}\n");
1020ca0551cfSopenharmony_ci            }
1021ca0551cfSopenharmony_ci            break;
1022ca0551cfSopenharmony_ci        }
1023ca0551cfSopenharmony_ci        case TypeKind::Map: {
1024ca0551cfSopenharmony_ci            sb.Append(prefix).AppendFormat("if (%s.size() > static_cast<size_t>(MAP_MAX_SIZE)) {\n", name.c_str());
1025ca0551cfSopenharmony_ci            if (logOn_) {
1026ca0551cfSopenharmony_ci                sb.Append(prefix).Append(TAB).AppendFormat(
1027ca0551cfSopenharmony_ci                    "HiLog::Error(LABEL, \"The map size exceeds the security limit!\");\n");
1028ca0551cfSopenharmony_ci            }
1029ca0551cfSopenharmony_ci            sb.Append(prefix).Append(TAB).Append("return ERR_INVALID_DATA;\n");
1030ca0551cfSopenharmony_ci            sb.Append(prefix).Append("}\n");
1031ca0551cfSopenharmony_ci            sb.Append("\n");
1032ca0551cfSopenharmony_ci            sb.Append(prefix).AppendFormat("%sWriteInt32(%s.size());\n", parcelName.string(), name.c_str());
1033ca0551cfSopenharmony_ci            sb.Append(prefix).AppendFormat("for (auto it = %s.begin(); it != %s.end(); ++it) {\n",
1034ca0551cfSopenharmony_ci                name.c_str(), name.c_str());
1035ca0551cfSopenharmony_ci            MetaType* keyType = metaComponent_->types_[mt->nestedTypeIndexes_[0]];
1036ca0551cfSopenharmony_ci            MetaType* valueType = metaComponent_->types_[mt->nestedTypeIndexes_[1]];
1037ca0551cfSopenharmony_ci            EmitWriteVariable(parcelName, "(it->first)", keyType, sb, prefix + TAB);
1038ca0551cfSopenharmony_ci            EmitWriteVariable(parcelName, "(it->second)", valueType, sb, prefix + TAB);
1039ca0551cfSopenharmony_ci            sb.Append(prefix).Append("}\n");
1040ca0551cfSopenharmony_ci            break;
1041ca0551cfSopenharmony_ci        }
1042ca0551cfSopenharmony_ci        default:
1043ca0551cfSopenharmony_ci            EmitWriteVariableObject(parcelName, name, mt, sb, prefix);
1044ca0551cfSopenharmony_ci            break;
1045ca0551cfSopenharmony_ci    }
1046ca0551cfSopenharmony_ci}
1047ca0551cfSopenharmony_ci
1048ca0551cfSopenharmony_civoid CppCodeEmitter::EmitWriteVariableObject(
1049ca0551cfSopenharmony_ci    const String& parcelName, const std::string& name, MetaType* mt, StringBuilder& sb, const String& prefix)
1050ca0551cfSopenharmony_ci{
1051ca0551cfSopenharmony_ci    switch (mt->kind_) {
1052ca0551cfSopenharmony_ci        case TypeKind::String:
1053ca0551cfSopenharmony_ci            sb.Append(prefix).AppendFormat("if (!%sWriteString16(Str8ToStr16(%s))) {\n", parcelName.string(),
1054ca0551cfSopenharmony_ci                name.c_str());
1055ca0551cfSopenharmony_ci            if (logOn_) {
1056ca0551cfSopenharmony_ci                sb.Append(prefix).Append(TAB).AppendFormat("HiLog::Error(LABEL, \"Write [%s] failed!\");\n",
1057ca0551cfSopenharmony_ci                    name.c_str());
1058ca0551cfSopenharmony_ci            }
1059ca0551cfSopenharmony_ci            sb.Append(prefix).Append(TAB).Append("return ERR_INVALID_DATA;\n");
1060ca0551cfSopenharmony_ci            sb.Append(prefix).Append("}\n");
1061ca0551cfSopenharmony_ci            break;
1062ca0551cfSopenharmony_ci        case TypeKind::Sequenceable:
1063ca0551cfSopenharmony_ci            sb.Append(prefix).AppendFormat("if (!%sWriteParcelable(&%s)) {\n", parcelName.string(), name.c_str());
1064ca0551cfSopenharmony_ci            if (logOn_) {
1065ca0551cfSopenharmony_ci                sb.Append(prefix).Append(TAB).AppendFormat("HiLog::Error(LABEL, \"Write [%s] failed!\");\n",
1066ca0551cfSopenharmony_ci                    name.c_str());
1067ca0551cfSopenharmony_ci            }
1068ca0551cfSopenharmony_ci            sb.Append(prefix).Append(TAB).Append("return ERR_INVALID_DATA;\n");
1069ca0551cfSopenharmony_ci            sb.Append(prefix).Append("}\n");
1070ca0551cfSopenharmony_ci            break;
1071ca0551cfSopenharmony_ci        case TypeKind::Interface:
1072ca0551cfSopenharmony_ci            sb.Append(prefix).AppendFormat("if (%s == nullptr) {\n", name.c_str());
1073ca0551cfSopenharmony_ci            if (logOn_) {
1074ca0551cfSopenharmony_ci                sb.Append(prefix).Append(TAB).AppendFormat("HiLog::Error(LABEL, \"%s is nullptr!\");\n", name.c_str());
1075ca0551cfSopenharmony_ci            }
1076ca0551cfSopenharmony_ci            sb.Append(prefix).Append(TAB).Append("return ERR_INVALID_DATA;\n");
1077ca0551cfSopenharmony_ci            sb.Append(prefix).Append("}\n");
1078ca0551cfSopenharmony_ci            sb.Append(prefix).AppendFormat(
1079ca0551cfSopenharmony_ci                "if (!%sWriteRemoteObject(%s->AsObject())) {\n", parcelName.string(), name.c_str());
1080ca0551cfSopenharmony_ci            if (logOn_) {
1081ca0551cfSopenharmony_ci                sb.Append(prefix).Append(TAB).AppendFormat("HiLog::Error(LABEL, \"Write [%s] failed!\");\n",
1082ca0551cfSopenharmony_ci                    name.c_str());
1083ca0551cfSopenharmony_ci            }
1084ca0551cfSopenharmony_ci            sb.Append(prefix).Append(TAB).Append("return ERR_INVALID_DATA;\n");
1085ca0551cfSopenharmony_ci            sb.Append(prefix).Append("}\n");
1086ca0551cfSopenharmony_ci            break;
1087ca0551cfSopenharmony_ci        default:
1088ca0551cfSopenharmony_ci            break;
1089ca0551cfSopenharmony_ci    }
1090ca0551cfSopenharmony_ci}
1091ca0551cfSopenharmony_ci
1092ca0551cfSopenharmony_civoid CppCodeEmitter::EmitReadVariable(const String& parcelName, const std::string& name, MetaType* mt,
1093ca0551cfSopenharmony_ci    StringBuilder& sb, const String& prefix, bool emitType)
1094ca0551cfSopenharmony_ci{
1095ca0551cfSopenharmony_ci    switch (mt->kind_) {
1096ca0551cfSopenharmony_ci        case TypeKind::Boolean:
1097ca0551cfSopenharmony_ci            if (emitType) {
1098ca0551cfSopenharmony_ci                sb.Append(prefix).AppendFormat("%s %s = %sReadInt32() == 1 ? true : false;\n",
1099ca0551cfSopenharmony_ci                    EmitType(mt, ATTR_IN, true).string(), name.c_str(), parcelName.string());
1100ca0551cfSopenharmony_ci            } else {
1101ca0551cfSopenharmony_ci                sb.Append(prefix).AppendFormat("%s = %sReadInt32() == 1 ? true : false;\n",
1102ca0551cfSopenharmony_ci                    name.c_str(), parcelName.string());
1103ca0551cfSopenharmony_ci            }
1104ca0551cfSopenharmony_ci            break;
1105ca0551cfSopenharmony_ci        case TypeKind::Char:
1106ca0551cfSopenharmony_ci        case TypeKind::Byte:
1107ca0551cfSopenharmony_ci        case TypeKind::Short:
1108ca0551cfSopenharmony_ci            if (emitType) {
1109ca0551cfSopenharmony_ci                sb.Append(prefix).AppendFormat("%s %s = (%s)%sReadInt32();\n", EmitType(mt, ATTR_IN, true).string(),
1110ca0551cfSopenharmony_ci                    name.c_str(), EmitType(mt, ATTR_IN, true).string(), parcelName.string());
1111ca0551cfSopenharmony_ci            } else {
1112ca0551cfSopenharmony_ci                sb.Append(prefix).AppendFormat("%s = (%s)%sReadInt32();\n", name.c_str(),
1113ca0551cfSopenharmony_ci                    EmitType(mt, ATTR_IN, true).string(), parcelName.string());
1114ca0551cfSopenharmony_ci            }
1115ca0551cfSopenharmony_ci            break;
1116ca0551cfSopenharmony_ci        case TypeKind::Integer:
1117ca0551cfSopenharmony_ci            if (emitType) {
1118ca0551cfSopenharmony_ci                sb.Append(prefix).AppendFormat("%s %s = %sReadInt32();\n",
1119ca0551cfSopenharmony_ci                    EmitType(mt, ATTR_IN, true).string(), name.c_str(), parcelName.string());
1120ca0551cfSopenharmony_ci            } else {
1121ca0551cfSopenharmony_ci                sb.Append(prefix).AppendFormat("%s = %sReadInt32();\n", name.c_str(), parcelName.string());
1122ca0551cfSopenharmony_ci            }
1123ca0551cfSopenharmony_ci            break;
1124ca0551cfSopenharmony_ci        case TypeKind::Long:
1125ca0551cfSopenharmony_ci            if (emitType) {
1126ca0551cfSopenharmony_ci                sb.Append(prefix).AppendFormat("%s %s = %sReadInt64();\n",
1127ca0551cfSopenharmony_ci                    EmitType(mt, ATTR_IN, true).string(), name.c_str(), parcelName.string());
1128ca0551cfSopenharmony_ci            } else {
1129ca0551cfSopenharmony_ci                sb.Append(prefix).AppendFormat("%s = %sReadInt64();\n", name.c_str(), parcelName.string());
1130ca0551cfSopenharmony_ci            }
1131ca0551cfSopenharmony_ci            break;
1132ca0551cfSopenharmony_ci        default:
1133ca0551cfSopenharmony_ci            EmitReadVariableFloat(parcelName, name, mt, sb, prefix, emitType);
1134ca0551cfSopenharmony_ci            break;
1135ca0551cfSopenharmony_ci    }
1136ca0551cfSopenharmony_ci}
1137ca0551cfSopenharmony_ci
1138ca0551cfSopenharmony_civoid CppCodeEmitter::EmitReadVariableFloat(const String& parcelName, const std::string& name, MetaType* mt,
1139ca0551cfSopenharmony_ci    StringBuilder& sb, const String& prefix, bool emitType)
1140ca0551cfSopenharmony_ci{
1141ca0551cfSopenharmony_ci    switch (mt->kind_) {
1142ca0551cfSopenharmony_ci        case TypeKind::Float:
1143ca0551cfSopenharmony_ci            if (emitType) {
1144ca0551cfSopenharmony_ci                sb.Append(prefix).AppendFormat("%s %s = %sReadFloat();\n",
1145ca0551cfSopenharmony_ci                    EmitType(mt, ATTR_IN, true).string(), name.c_str(), parcelName.string());
1146ca0551cfSopenharmony_ci            } else {
1147ca0551cfSopenharmony_ci                sb.Append(prefix).AppendFormat("%s = %sReadFloat();\n", name.c_str(), parcelName.string());
1148ca0551cfSopenharmony_ci            }
1149ca0551cfSopenharmony_ci            break;
1150ca0551cfSopenharmony_ci        case TypeKind::Double:
1151ca0551cfSopenharmony_ci            if (emitType) {
1152ca0551cfSopenharmony_ci                sb.Append(prefix).AppendFormat("%s %s = %sReadDouble();\n",
1153ca0551cfSopenharmony_ci                    EmitType(mt, ATTR_IN, true).string(), name.c_str(), parcelName.string());
1154ca0551cfSopenharmony_ci            } else {
1155ca0551cfSopenharmony_ci                sb.Append(prefix).AppendFormat("%s = %sReadDouble();\n", name.c_str(), parcelName.string());
1156ca0551cfSopenharmony_ci            }
1157ca0551cfSopenharmony_ci            break;
1158ca0551cfSopenharmony_ci        default:
1159ca0551cfSopenharmony_ci            EmitReadVariableComplex(parcelName, name, mt, sb, prefix, emitType);
1160ca0551cfSopenharmony_ci            break;
1161ca0551cfSopenharmony_ci    }
1162ca0551cfSopenharmony_ci}
1163ca0551cfSopenharmony_ci
1164ca0551cfSopenharmony_civoid CppCodeEmitter::EmitReadVariableComplex(const String& parcelName, const std::string& name, MetaType* mt,
1165ca0551cfSopenharmony_ci    StringBuilder& sb, const String& prefix, bool emitType)
1166ca0551cfSopenharmony_ci{
1167ca0551cfSopenharmony_ci    switch (mt->kind_) {
1168ca0551cfSopenharmony_ci        case TypeKind::String:
1169ca0551cfSopenharmony_ci            if (emitType) {
1170ca0551cfSopenharmony_ci                sb.Append(prefix).AppendFormat("%s %s = Str16ToStr8(%sReadString16());\n",
1171ca0551cfSopenharmony_ci                    EmitType(mt, ATTR_IN, true).string(), name.c_str(), parcelName.string());
1172ca0551cfSopenharmony_ci            } else {
1173ca0551cfSopenharmony_ci                sb.Append(prefix).AppendFormat("%s = Str16ToStr8(%sReadString16());\n",
1174ca0551cfSopenharmony_ci                    name.c_str(), parcelName.string());
1175ca0551cfSopenharmony_ci            }
1176ca0551cfSopenharmony_ci            break;
1177ca0551cfSopenharmony_ci        case TypeKind::Map: {
1178ca0551cfSopenharmony_ci            if (emitType) {
1179ca0551cfSopenharmony_ci                sb.Append(prefix).AppendFormat("%s %s;\n", EmitType(mt, ATTR_IN, true).string(), name.c_str());
1180ca0551cfSopenharmony_ci            }
1181ca0551cfSopenharmony_ci            sb.Append(prefix).AppendFormat("int32_t %sSize = %sReadInt32();\n", name.c_str(), parcelName.string());
1182ca0551cfSopenharmony_ci            sb.Append(prefix).AppendFormat("for (int32_t i = 0; i < %sSize; ++i) {\n", name.c_str());
1183ca0551cfSopenharmony_ci            MetaType* keyType = metaComponent_->types_[mt->nestedTypeIndexes_[0]];
1184ca0551cfSopenharmony_ci            MetaType* valueType = metaComponent_->types_[mt->nestedTypeIndexes_[1]];
1185ca0551cfSopenharmony_ci            EmitReadVariable(parcelName, "key", keyType, sb, prefix + TAB);
1186ca0551cfSopenharmony_ci            EmitReadVariable(parcelName, "value", valueType, sb, prefix + TAB);
1187ca0551cfSopenharmony_ci            sb.Append(prefix + TAB).AppendFormat("%s[key] = value;\n", name.c_str());
1188ca0551cfSopenharmony_ci            sb.Append(prefix).Append("}\n");
1189ca0551cfSopenharmony_ci            break;
1190ca0551cfSopenharmony_ci        }
1191ca0551cfSopenharmony_ci        default:
1192ca0551cfSopenharmony_ci            EmitReadVariableList(parcelName, name, mt, sb, prefix, emitType);
1193ca0551cfSopenharmony_ci            break;
1194ca0551cfSopenharmony_ci    }
1195ca0551cfSopenharmony_ci}
1196ca0551cfSopenharmony_ci
1197ca0551cfSopenharmony_civoid CppCodeEmitter::EmitReadVariableList(const String& parcelName, const std::string& name, MetaType* mt,
1198ca0551cfSopenharmony_ci    StringBuilder& sb, const String& prefix, bool emitType)
1199ca0551cfSopenharmony_ci{
1200ca0551cfSopenharmony_ci    switch (mt->kind_) {
1201ca0551cfSopenharmony_ci        case TypeKind::Array:
1202ca0551cfSopenharmony_ci        case TypeKind::List: {
1203ca0551cfSopenharmony_ci            if (emitType) {
1204ca0551cfSopenharmony_ci                sb.Append(prefix).AppendFormat("%s %s;\n", EmitType(mt, ATTR_IN, true).string(), name.c_str());
1205ca0551cfSopenharmony_ci            }
1206ca0551cfSopenharmony_ci            sb.Append(prefix).AppendFormat("int32_t %sSize = %sReadInt32();\n", name.c_str(), parcelName.string());
1207ca0551cfSopenharmony_ci            sb.Append(prefix).AppendFormat("if (%sSize > static_cast<int32_t>(VECTOR_MAX_SIZE)) {\n", name.c_str());
1208ca0551cfSopenharmony_ci            if (logOn_) {
1209ca0551cfSopenharmony_ci                sb.Append(prefix + TAB)
1210ca0551cfSopenharmony_ci                    .Append("HiLog::Error(LABEL, \"The vector/array size exceeds the security limit!\");\n");
1211ca0551cfSopenharmony_ci            }
1212ca0551cfSopenharmony_ci            sb.Append(prefix + TAB).Append("return ERR_INVALID_DATA;\n");
1213ca0551cfSopenharmony_ci            sb.Append(prefix).Append("}\n");
1214ca0551cfSopenharmony_ci            circleCount++;
1215ca0551cfSopenharmony_ci            std::stringstream circleCountStr;
1216ca0551cfSopenharmony_ci            circleCountStr << circleCount;
1217ca0551cfSopenharmony_ci            std::string iStr = "i" + circleCountStr.str();
1218ca0551cfSopenharmony_ci            std::string valueStr = "value" + circleCountStr.str();
1219ca0551cfSopenharmony_ci            sb.Append(prefix).AppendFormat("for (int32_t %s = 0; %s < %sSize; ++%s) {\n",
1220ca0551cfSopenharmony_ci                iStr.c_str(), iStr.c_str(), name.c_str(), iStr.c_str());
1221ca0551cfSopenharmony_ci            MetaType* innerType = metaComponent_->types_[mt->nestedTypeIndexes_[0]];
1222ca0551cfSopenharmony_ci            EmitReadVariable(parcelName, valueStr.c_str(), innerType, sb, prefix + TAB);
1223ca0551cfSopenharmony_ci            if (innerType->kind_ == TypeKind::Sequenceable) {
1224ca0551cfSopenharmony_ci                sb.Append(prefix + TAB).AppendFormat("%s.push_back(*%s);\n", name.c_str(), valueStr.c_str());
1225ca0551cfSopenharmony_ci            } else {
1226ca0551cfSopenharmony_ci                sb.Append(prefix + TAB).AppendFormat("%s.push_back(%s);\n", name.c_str(), valueStr.c_str());
1227ca0551cfSopenharmony_ci            }
1228ca0551cfSopenharmony_ci            sb.Append(prefix).Append("}\n");
1229ca0551cfSopenharmony_ci            break;
1230ca0551cfSopenharmony_ci        }
1231ca0551cfSopenharmony_ci        default:
1232ca0551cfSopenharmony_ci            EmitReadVariableObject(parcelName, name, mt, sb, prefix, emitType);
1233ca0551cfSopenharmony_ci            break;
1234ca0551cfSopenharmony_ci    }
1235ca0551cfSopenharmony_ci}
1236ca0551cfSopenharmony_ci
1237ca0551cfSopenharmony_civoid CppCodeEmitter::EmitReadVariableObject(const String& parcelName, const std::string& name, MetaType* mt,
1238ca0551cfSopenharmony_ci    StringBuilder& sb, const String& prefix, bool emitType)
1239ca0551cfSopenharmony_ci{
1240ca0551cfSopenharmony_ci    switch (mt->kind_) {
1241ca0551cfSopenharmony_ci        case TypeKind::Sequenceable: {
1242ca0551cfSopenharmony_ci            MetaSequenceable* mp = metaComponent_->sequenceables_[mt->index_];
1243ca0551cfSopenharmony_ci            if (mp == nullptr) {
1244ca0551cfSopenharmony_ci                break;
1245ca0551cfSopenharmony_ci            }
1246ca0551cfSopenharmony_ci            if (emitType) {
1247ca0551cfSopenharmony_ci                readSequenceable_ = true;
1248ca0551cfSopenharmony_ci                sb.Append(prefix).AppendFormat("std::unique_ptr<%s> %s(%sReadParcelable<%s>());\n\n",
1249ca0551cfSopenharmony_ci                    EmitType(mt, ATTR_IN, true).string(), name.c_str(), parcelName.string(), mp->name_);
1250ca0551cfSopenharmony_ci                sb.Append(prefix).AppendFormat("if (!%s) {\n", name.c_str());
1251ca0551cfSopenharmony_ci                if (logOn_) {
1252ca0551cfSopenharmony_ci                    sb.Append(prefix).Append(TAB).AppendFormat(
1253ca0551cfSopenharmony_ci                        "HiLog::Error(LABEL, \"Read [%s] failed!\");\n", mp->name_);
1254ca0551cfSopenharmony_ci                }
1255ca0551cfSopenharmony_ci                sb.Append(prefix).Append(TAB).Append("return ERR_INVALID_DATA;\n");
1256ca0551cfSopenharmony_ci                sb.Append(prefix).Append("}\n");
1257ca0551cfSopenharmony_ci            } else {
1258ca0551cfSopenharmony_ci                sb.Append(prefix).AppendFormat("std::unique_ptr<%s> info(%sReadParcelable<%s>());\n",
1259ca0551cfSopenharmony_ci                    mp->name_, parcelName.string(), mp->name_);
1260ca0551cfSopenharmony_ci                sb.Append(prefix).Append("if (info != nullptr) {\n");
1261ca0551cfSopenharmony_ci                sb.Append(prefix).Append(TAB).AppendFormat("%s = *info;\n", name.c_str());
1262ca0551cfSopenharmony_ci                sb.Append(prefix).Append("}\n\n");
1263ca0551cfSopenharmony_ci            }
1264ca0551cfSopenharmony_ci            break;
1265ca0551cfSopenharmony_ci        }
1266ca0551cfSopenharmony_ci        case TypeKind::Interface: {
1267ca0551cfSopenharmony_ci            MetaInterface* mi = metaComponent_->interfaces_[mt->index_];
1268ca0551cfSopenharmony_ci            if (emitType) {
1269ca0551cfSopenharmony_ci                sb.Append(prefix).AppendFormat("%s %s = iface_cast<%s>(%sReadRemoteObject());\n",
1270ca0551cfSopenharmony_ci                    EmitType(mt, ATTR_IN, true).string(), name.c_str(), mi->name_, parcelName.string());
1271ca0551cfSopenharmony_ci                sb.Append(prefix).AppendFormat("if (%s == nullptr) {\n", name.c_str());
1272ca0551cfSopenharmony_ci                if (logOn_) {
1273ca0551cfSopenharmony_ci                    sb.Append(prefix).Append(TAB).AppendFormat("HiLog::Error(LABEL, \"Read [%s] failed!\");\n",
1274ca0551cfSopenharmony_ci                        name.c_str());
1275ca0551cfSopenharmony_ci                }
1276ca0551cfSopenharmony_ci                sb.Append(prefix).Append(TAB).AppendFormat("return ERR_INVALID_DATA;\n");
1277ca0551cfSopenharmony_ci                sb.Append(prefix).Append("}\n\n");
1278ca0551cfSopenharmony_ci            } else {
1279ca0551cfSopenharmony_ci                sb.Append(prefix).AppendFormat("%s = iface_cast<%s>(%sReadRemoteObject());\n",
1280ca0551cfSopenharmony_ci                    name.c_str(),  mi->name_, parcelName.string());
1281ca0551cfSopenharmony_ci            }
1282ca0551cfSopenharmony_ci            break;
1283ca0551cfSopenharmony_ci        }
1284ca0551cfSopenharmony_ci        default:
1285ca0551cfSopenharmony_ci            break;
1286ca0551cfSopenharmony_ci    }
1287ca0551cfSopenharmony_ci}
1288ca0551cfSopenharmony_ci
1289ca0551cfSopenharmony_civoid CppCodeEmitter::EmitLocalVariable(MetaParameter* mp, StringBuilder& sb, const String& prefix)
1290ca0551cfSopenharmony_ci{
1291ca0551cfSopenharmony_ci    MetaType* mt = metaComponent_->types_[mp->typeIndex_];
1292ca0551cfSopenharmony_ci    const std::string name = mp->name_;
1293ca0551cfSopenharmony_ci    if ((mt->kind_ == TypeKind::Sequenceable) || (mt->kind_ == TypeKind::Interface)) {
1294ca0551cfSopenharmony_ci        createSequenceableForOut_ = true;
1295ca0551cfSopenharmony_ci        mp->isSequenceableForOut_ = true;
1296ca0551cfSopenharmony_ci        sb.Append(prefix).AppendFormat("%s %s;\n", EmitType(mt, ATTR_IN, true).string(), name.c_str());
1297ca0551cfSopenharmony_ci    } else {
1298ca0551cfSopenharmony_ci        sb.Append(prefix).AppendFormat("%s %s;\n", EmitType(mt, ATTR_IN, true).string(), name.c_str());
1299ca0551cfSopenharmony_ci    }
1300ca0551cfSopenharmony_ci}
1301ca0551cfSopenharmony_ci
1302ca0551cfSopenharmony_civoid CppCodeEmitter::EmitReturnParameter(const String& name, MetaType* mt, StringBuilder& sb)
1303ca0551cfSopenharmony_ci{
1304ca0551cfSopenharmony_ci    switch (mt->kind_) {
1305ca0551cfSopenharmony_ci        case TypeKind::Char:
1306ca0551cfSopenharmony_ci        case TypeKind::Boolean:
1307ca0551cfSopenharmony_ci        case TypeKind::Byte:
1308ca0551cfSopenharmony_ci        case TypeKind::Short:
1309ca0551cfSopenharmony_ci        case TypeKind::Integer:
1310ca0551cfSopenharmony_ci        case TypeKind::Long:
1311ca0551cfSopenharmony_ci        case TypeKind::Float:
1312ca0551cfSopenharmony_ci        case TypeKind::Double:
1313ca0551cfSopenharmony_ci        case TypeKind::String:
1314ca0551cfSopenharmony_ci        case TypeKind::Sequenceable:
1315ca0551cfSopenharmony_ci        case TypeKind::Interface:
1316ca0551cfSopenharmony_ci        case TypeKind::List:
1317ca0551cfSopenharmony_ci        case TypeKind::Map:
1318ca0551cfSopenharmony_ci        case TypeKind::Array:
1319ca0551cfSopenharmony_ci            sb.Append(name);
1320ca0551cfSopenharmony_ci            break;
1321ca0551cfSopenharmony_ci        default:
1322ca0551cfSopenharmony_ci            break;
1323ca0551cfSopenharmony_ci    }
1324ca0551cfSopenharmony_ci}
1325ca0551cfSopenharmony_ci
1326ca0551cfSopenharmony_ciString CppCodeEmitter::EmitType(MetaType* mt, unsigned int attributes, bool isInnerType)
1327ca0551cfSopenharmony_ci{
1328ca0551cfSopenharmony_ci    switch (mt->kind_) {
1329ca0551cfSopenharmony_ci        case TypeKind::Char:
1330ca0551cfSopenharmony_ci            enteredVector_ = false;
1331ca0551cfSopenharmony_ci            if (attributes & ATTR_IN) {
1332ca0551cfSopenharmony_ci                return "zchar";
1333ca0551cfSopenharmony_ci            } else {
1334ca0551cfSopenharmony_ci                return "zchar&";
1335ca0551cfSopenharmony_ci            }
1336ca0551cfSopenharmony_ci        case TypeKind::Boolean:
1337ca0551cfSopenharmony_ci            enteredVector_ = false;
1338ca0551cfSopenharmony_ci            if (attributes & ATTR_IN) {
1339ca0551cfSopenharmony_ci                return "bool";
1340ca0551cfSopenharmony_ci            } else {
1341ca0551cfSopenharmony_ci                return "bool&";
1342ca0551cfSopenharmony_ci            }
1343ca0551cfSopenharmony_ci        case TypeKind::Byte:
1344ca0551cfSopenharmony_ci            enteredVector_ = false;
1345ca0551cfSopenharmony_ci            if (attributes & ATTR_IN) {
1346ca0551cfSopenharmony_ci                return "int8_t";
1347ca0551cfSopenharmony_ci            } else {
1348ca0551cfSopenharmony_ci                return "int8_t&";
1349ca0551cfSopenharmony_ci            }
1350ca0551cfSopenharmony_ci        case TypeKind::Short:
1351ca0551cfSopenharmony_ci            enteredVector_ = false;
1352ca0551cfSopenharmony_ci            if (attributes & ATTR_IN) {
1353ca0551cfSopenharmony_ci                return "short";
1354ca0551cfSopenharmony_ci            } else {
1355ca0551cfSopenharmony_ci                return "short&";
1356ca0551cfSopenharmony_ci            }
1357ca0551cfSopenharmony_ci        case TypeKind::Integer:
1358ca0551cfSopenharmony_ci            enteredVector_ = false;
1359ca0551cfSopenharmony_ci            if (attributes & ATTR_IN) {
1360ca0551cfSopenharmony_ci                return "int32_t";
1361ca0551cfSopenharmony_ci            } else {
1362ca0551cfSopenharmony_ci                return "int32_t&";
1363ca0551cfSopenharmony_ci            }
1364ca0551cfSopenharmony_ci        case TypeKind::Long:
1365ca0551cfSopenharmony_ci            enteredVector_ = false;
1366ca0551cfSopenharmony_ci            if (attributes & ATTR_IN) {
1367ca0551cfSopenharmony_ci                return "long";
1368ca0551cfSopenharmony_ci            } else {
1369ca0551cfSopenharmony_ci                return "long&";
1370ca0551cfSopenharmony_ci            }
1371ca0551cfSopenharmony_ci        default:
1372ca0551cfSopenharmony_ci            return EmitFloatType(mt, attributes, isInnerType);
1373ca0551cfSopenharmony_ci    }
1374ca0551cfSopenharmony_ci}
1375ca0551cfSopenharmony_ci
1376ca0551cfSopenharmony_ci
1377ca0551cfSopenharmony_ciString CppCodeEmitter::EmitFloatType(MetaType* mt, unsigned int attributes, bool isInnerType)
1378ca0551cfSopenharmony_ci{
1379ca0551cfSopenharmony_ci    switch (mt->kind_) {
1380ca0551cfSopenharmony_ci        case TypeKind::Float:
1381ca0551cfSopenharmony_ci            enteredVector_ = false;
1382ca0551cfSopenharmony_ci            if (attributes & ATTR_IN) {
1383ca0551cfSopenharmony_ci                return "float";
1384ca0551cfSopenharmony_ci            } else {
1385ca0551cfSopenharmony_ci                return "float&";
1386ca0551cfSopenharmony_ci            }
1387ca0551cfSopenharmony_ci        case TypeKind::Double:
1388ca0551cfSopenharmony_ci            enteredVector_ = false;
1389ca0551cfSopenharmony_ci            if (attributes & ATTR_IN) {
1390ca0551cfSopenharmony_ci                return "double";
1391ca0551cfSopenharmony_ci            } else {
1392ca0551cfSopenharmony_ci                return "double&";
1393ca0551cfSopenharmony_ci            }
1394ca0551cfSopenharmony_ci        case TypeKind::Void:
1395ca0551cfSopenharmony_ci            enteredVector_ = false;
1396ca0551cfSopenharmony_ci            return "void";
1397ca0551cfSopenharmony_ci        default:
1398ca0551cfSopenharmony_ci            return EmitComplexType(mt, attributes, isInnerType);
1399ca0551cfSopenharmony_ci    }
1400ca0551cfSopenharmony_ci}
1401ca0551cfSopenharmony_ci
1402ca0551cfSopenharmony_ciString CppCodeEmitter::EmitComplexType(MetaType* mt, unsigned int attributes, bool isInnerType)
1403ca0551cfSopenharmony_ci{
1404ca0551cfSopenharmony_ci    switch (mt->kind_) {
1405ca0551cfSopenharmony_ci        case TypeKind::String:
1406ca0551cfSopenharmony_ci            enteredVector_ = false;
1407ca0551cfSopenharmony_ci            if (attributes & ATTR_IN) {
1408ca0551cfSopenharmony_ci                if (!isInnerType) {
1409ca0551cfSopenharmony_ci                    return "const std::string&";
1410ca0551cfSopenharmony_ci                } else {
1411ca0551cfSopenharmony_ci                    return "std::string";
1412ca0551cfSopenharmony_ci                }
1413ca0551cfSopenharmony_ci            } else {
1414ca0551cfSopenharmony_ci                return "std::string&";
1415ca0551cfSopenharmony_ci            }
1416ca0551cfSopenharmony_ci        case TypeKind::Map: {
1417ca0551cfSopenharmony_ci            MetaType* keyType = metaComponent_->types_[mt->nestedTypeIndexes_[0]];
1418ca0551cfSopenharmony_ci            MetaType* valueType = metaComponent_->types_[mt->nestedTypeIndexes_[1]];
1419ca0551cfSopenharmony_ci            if (attributes & ATTR_OUT) {
1420ca0551cfSopenharmony_ci                return String::Format("std::unordered_map<%s, %s>&",
1421ca0551cfSopenharmony_ci                    EmitType(keyType, ATTR_IN, true).string(), EmitType(valueType, ATTR_IN, true).string());
1422ca0551cfSopenharmony_ci            } else {
1423ca0551cfSopenharmony_ci                if (!isInnerType) {
1424ca0551cfSopenharmony_ci                    return String::Format("const std::unordered_map<%s, %s>&",
1425ca0551cfSopenharmony_ci                        EmitType(keyType, ATTR_IN, true).string(), EmitType(valueType, ATTR_IN, true).string());
1426ca0551cfSopenharmony_ci                } else {
1427ca0551cfSopenharmony_ci                    return String::Format("std::unordered_map<%s, %s>",
1428ca0551cfSopenharmony_ci                        EmitType(keyType, ATTR_IN, true).string(), EmitType(valueType, ATTR_IN, true).string());
1429ca0551cfSopenharmony_ci                }
1430ca0551cfSopenharmony_ci            }
1431ca0551cfSopenharmony_ci            break;
1432ca0551cfSopenharmony_ci        }
1433ca0551cfSopenharmony_ci        default:
1434ca0551cfSopenharmony_ci            return EmitListType(mt, attributes, isInnerType);
1435ca0551cfSopenharmony_ci    }
1436ca0551cfSopenharmony_ci}
1437ca0551cfSopenharmony_ci
1438ca0551cfSopenharmony_ciString CppCodeEmitter::EmitListType(MetaType* mt, unsigned int attributes, bool isInnerType)
1439ca0551cfSopenharmony_ci{
1440ca0551cfSopenharmony_ci    switch (mt->kind_) {
1441ca0551cfSopenharmony_ci        case TypeKind::Array:
1442ca0551cfSopenharmony_ci        case TypeKind::List: {
1443ca0551cfSopenharmony_ci            enteredVector_ = true;
1444ca0551cfSopenharmony_ci            MetaType* elementType = metaComponent_->types_[mt->nestedTypeIndexes_[0]];
1445ca0551cfSopenharmony_ci            if (attributes & ATTR_OUT) {
1446ca0551cfSopenharmony_ci                return String::Format("std::vector<%s>&",
1447ca0551cfSopenharmony_ci                                      EmitType(elementType, ATTR_IN, true).string());
1448ca0551cfSopenharmony_ci            } else {
1449ca0551cfSopenharmony_ci                if (!isInnerType) {
1450ca0551cfSopenharmony_ci                    return String::Format("const std::vector<%s>&",
1451ca0551cfSopenharmony_ci                                          EmitType(elementType, ATTR_IN, true).string());
1452ca0551cfSopenharmony_ci                } else {
1453ca0551cfSopenharmony_ci                    return String::Format("std::vector<%s>",
1454ca0551cfSopenharmony_ci                                          EmitType(elementType, ATTR_IN, true).string());
1455ca0551cfSopenharmony_ci                }
1456ca0551cfSopenharmony_ci            }
1457ca0551cfSopenharmony_ci        }
1458ca0551cfSopenharmony_ci        default:
1459ca0551cfSopenharmony_ci            return EmitObjectType(mt, attributes, isInnerType);
1460ca0551cfSopenharmony_ci    }
1461ca0551cfSopenharmony_ci}
1462ca0551cfSopenharmony_ci
1463ca0551cfSopenharmony_ciString CppCodeEmitter::EmitObjectType(MetaType* mt, unsigned int attributes, bool isInnerType)
1464ca0551cfSopenharmony_ci{
1465ca0551cfSopenharmony_ci    switch (mt->kind_) {
1466ca0551cfSopenharmony_ci        case TypeKind::Sequenceable: {
1467ca0551cfSopenharmony_ci            MetaSequenceable* mp = metaComponent_->sequenceables_[mt->index_];
1468ca0551cfSopenharmony_ci            if (mp == nullptr) {
1469ca0551cfSopenharmony_ci                return "unknown type";
1470ca0551cfSopenharmony_ci            }
1471ca0551cfSopenharmony_ci            if (enteredVector_) {
1472ca0551cfSopenharmony_ci                enteredVector_ = false;
1473ca0551cfSopenharmony_ci                return String::Format("%s", mp->name_);
1474ca0551cfSopenharmony_ci            }
1475ca0551cfSopenharmony_ci            if (readSequenceable_) {
1476ca0551cfSopenharmony_ci                readSequenceable_ = false;
1477ca0551cfSopenharmony_ci                return String::Format("%s", mp->name_);
1478ca0551cfSopenharmony_ci            }
1479ca0551cfSopenharmony_ci            if (createSequenceableForOut_) {
1480ca0551cfSopenharmony_ci                createSequenceableForOut_ = false;
1481ca0551cfSopenharmony_ci                return String::Format("%s", mp->name_);
1482ca0551cfSopenharmony_ci            }
1483ca0551cfSopenharmony_ci            if ((attributes & ATTR_MASK) == (ATTR_IN | ATTR_OUT)) {
1484ca0551cfSopenharmony_ci                return String::Format("%s*", mp->name_);
1485ca0551cfSopenharmony_ci            } else if (attributes & ATTR_IN) {
1486ca0551cfSopenharmony_ci                return String::Format("const %s&", mp->name_);
1487ca0551cfSopenharmony_ci            } else {
1488ca0551cfSopenharmony_ci                return String::Format("%s&", mp->name_);
1489ca0551cfSopenharmony_ci            }
1490ca0551cfSopenharmony_ci        }
1491ca0551cfSopenharmony_ci        case TypeKind::Interface: {
1492ca0551cfSopenharmony_ci            MetaInterface* mi = metaComponent_->interfaces_[mt->index_];
1493ca0551cfSopenharmony_ci            if (mi == nullptr) {
1494ca0551cfSopenharmony_ci                return "unknown type";
1495ca0551cfSopenharmony_ci            }
1496ca0551cfSopenharmony_ci            if (attributes & ATTR_IN) {
1497ca0551cfSopenharmony_ci                if (!isInnerType) {
1498ca0551cfSopenharmony_ci                    return String::Format("const sptr<%s>&", mi->name_);
1499ca0551cfSopenharmony_ci                } else {
1500ca0551cfSopenharmony_ci                    return String::Format("sptr<%s>", mi->name_);
1501ca0551cfSopenharmony_ci                }
1502ca0551cfSopenharmony_ci            } else {
1503ca0551cfSopenharmony_ci                return String::Format("sptr<%s>&", mi->name_);
1504ca0551cfSopenharmony_ci            }
1505ca0551cfSopenharmony_ci        }
1506ca0551cfSopenharmony_ci        default:
1507ca0551cfSopenharmony_ci            return "unknown type";
1508ca0551cfSopenharmony_ci    }
1509ca0551cfSopenharmony_ci}
1510ca0551cfSopenharmony_ci
1511ca0551cfSopenharmony_ciString CppCodeEmitter::CppFullName(const String& name)
1512ca0551cfSopenharmony_ci{
1513ca0551cfSopenharmony_ci    if (name.IsEmpty()) {
1514ca0551cfSopenharmony_ci        return name;
1515ca0551cfSopenharmony_ci    }
1516ca0551cfSopenharmony_ci
1517ca0551cfSopenharmony_ci    return name.Replace(".", "::");
1518ca0551cfSopenharmony_ci}
1519ca0551cfSopenharmony_ci
1520ca0551cfSopenharmony_ciString CppCodeEmitter::FileName(const String& name)
1521ca0551cfSopenharmony_ci{
1522ca0551cfSopenharmony_ci    if (name.IsEmpty()) {
1523ca0551cfSopenharmony_ci        return name;
1524ca0551cfSopenharmony_ci    }
1525ca0551cfSopenharmony_ci
1526ca0551cfSopenharmony_ci    StringBuilder sb;
1527ca0551cfSopenharmony_ci
1528ca0551cfSopenharmony_ci    for (int i = 0; i < name.GetLength(); i++) {
1529ca0551cfSopenharmony_ci        char c = name[i];
1530ca0551cfSopenharmony_ci        if (isupper(c) != 0) {
1531ca0551cfSopenharmony_ci            // 2->Index of the last char array.
1532ca0551cfSopenharmony_ci            if (i > 1 && name[i - 1] != '.' && name[i - 2] != '.') {
1533ca0551cfSopenharmony_ci                sb.Append('_');
1534ca0551cfSopenharmony_ci            }
1535ca0551cfSopenharmony_ci            sb.Append(tolower(c));
1536ca0551cfSopenharmony_ci        } else {
1537ca0551cfSopenharmony_ci            sb.Append(c);
1538ca0551cfSopenharmony_ci        }
1539ca0551cfSopenharmony_ci    }
1540ca0551cfSopenharmony_ci
1541ca0551cfSopenharmony_ci    return sb.ToString().Replace('.', '/');
1542ca0551cfSopenharmony_ci}
1543ca0551cfSopenharmony_ci
1544ca0551cfSopenharmony_ciString CppCodeEmitter::MacroName(const String& name)
1545ca0551cfSopenharmony_ci{
1546ca0551cfSopenharmony_ci    if (name.IsEmpty()) {
1547ca0551cfSopenharmony_ci        return name;
1548ca0551cfSopenharmony_ci    }
1549ca0551cfSopenharmony_ci
1550ca0551cfSopenharmony_ci    String macro = name.Replace('.', '_').ToUpperCase() + "_H";
1551ca0551cfSopenharmony_ci    return macro;
1552ca0551cfSopenharmony_ci}
1553ca0551cfSopenharmony_ci
1554ca0551cfSopenharmony_ciString CppCodeEmitter::ConstantName(const String& name)
1555ca0551cfSopenharmony_ci{
1556ca0551cfSopenharmony_ci    if (name.IsEmpty()) {
1557ca0551cfSopenharmony_ci        return name;
1558ca0551cfSopenharmony_ci    }
1559ca0551cfSopenharmony_ci
1560ca0551cfSopenharmony_ci    StringBuilder sb;
1561ca0551cfSopenharmony_ci
1562ca0551cfSopenharmony_ci    for (int i = 0; i < name.GetLength(); i++) {
1563ca0551cfSopenharmony_ci        char c = name[i];
1564ca0551cfSopenharmony_ci        if (isupper(c) != 0) {
1565ca0551cfSopenharmony_ci            if (i > 1) {
1566ca0551cfSopenharmony_ci                sb.Append('_');
1567ca0551cfSopenharmony_ci            }
1568ca0551cfSopenharmony_ci            sb.Append(c);
1569ca0551cfSopenharmony_ci        } else {
1570ca0551cfSopenharmony_ci            sb.Append(toupper(c));
1571ca0551cfSopenharmony_ci        }
1572ca0551cfSopenharmony_ci    }
1573ca0551cfSopenharmony_ci
1574ca0551cfSopenharmony_ci    return sb.ToString();
1575ca0551cfSopenharmony_ci}
1576ca0551cfSopenharmony_ci
1577ca0551cfSopenharmony_ciconst std::string CppCodeEmitter::UnderlineAdded(const String& originName)
1578ca0551cfSopenharmony_ci{
1579ca0551cfSopenharmony_ci    std::string underline("_");
1580ca0551cfSopenharmony_ci    return underline + std::string(originName.string());
1581ca0551cfSopenharmony_ci}
1582ca0551cfSopenharmony_ci} // namespace Idl
1583ca0551cfSopenharmony_ci} // namespace OHOS