• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  *
4  * HDF is dual licensed: you can use it either under the terms of
5  * the GPL, or the BSD license, at your option.
6  * See the LICENSE file in the root of this repository for complete details.
7  */
8 
9 #include "codegen/cpp_client_proxy_code_emitter.h"
10 #include "util/file.h"
11 #include "util/logger.h"
12 
13 namespace OHOS {
14 namespace HDI {
ResolveDirectory(const std::string & targetDirectory)15 bool CppClientProxyCodeEmitter::ResolveDirectory(const std::string &targetDirectory)
16 {
17     if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) {
18         directory_ = GetFileParentPath(targetDirectory);
19     } else {
20         return false;
21     }
22 
23     if (!File::CreateParentDir(directory_)) {
24         Logger::E("CppClientProxyCodeEmitter", "Create '%s' failed!", directory_.c_str());
25         return false;
26     }
27 
28     return true;
29 }
30 
EmitCode()31 void CppClientProxyCodeEmitter::EmitCode()
32 {
33     if (Options::GetInstance().DoPassthrough()) {
34         if (!interface_->IsSerializable()) {
35             EmitPassthroughProxySourceFile();
36         }
37     } else {
38         EmitProxyHeaderFile();
39         EmitProxySourceFile();
40     }
41 }
42 
EmitProxyHeaderFile()43 void CppClientProxyCodeEmitter::EmitProxyHeaderFile()
44 {
45     std::string filePath =
46         File::AdapterPath(StringHelper::Format("%s/%s.h", directory_.c_str(), FileName(baseName_ + "Proxy").c_str()));
47     File file(filePath, File::WRITE);
48     StringBuilder sb;
49 
50     EmitLicense(sb);
51     EmitHeadMacro(sb, proxyFullName_);
52     sb.Append("\n");
53     EmitProxyHeaderInclusions(sb);
54     sb.Append("\n");
55     EmitBeginNamespace(sb);
56     sb.Append("\n");
57     EmitProxyDecl(sb, "");
58     sb.Append("\n");
59     EmitEndNamespace(sb);
60     sb.Append("\n");
61     EmitTailMacro(sb, proxyFullName_);
62 
63     std::string data = sb.ToString();
64     file.WriteData(data.c_str(), data.size());
65     file.Flush();
66     file.Close();
67 }
68 
EmitProxyHeaderInclusions(StringBuilder & sb)69 void CppClientProxyCodeEmitter::EmitProxyHeaderInclusions(StringBuilder &sb)
70 {
71     HeaderFile::HeaderFileSet headerFiles;
72 
73     headerFiles.emplace(HeaderFileType::OWN_HEADER_FILE, EmitVersionHeaderName(interfaceName_));
74     GetHeaderOtherLibInclusions(headerFiles);
75 
76     for (const auto &file : headerFiles) {
77         sb.AppendFormat("%s\n", file.ToString().c_str());
78     }
79 }
80 
GetHeaderOtherLibInclusions(HeaderFile::HeaderFileSet & headerFiles)81 void CppClientProxyCodeEmitter::GetHeaderOtherLibInclusions(HeaderFile::HeaderFileSet &headerFiles)
82 {
83     headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "iproxy_broker");
84 }
85 
EmitProxyDecl(StringBuilder & sb,const std::string & prefix)86 void CppClientProxyCodeEmitter::EmitProxyDecl(StringBuilder &sb, const std::string &prefix)
87 {
88     sb.AppendFormat("class %s : public IProxyBroker<%s> {\n", proxyName_.c_str(), interfaceName_.c_str());
89     sb.Append("public:\n");
90     EmitProxyConstructor(sb, TAB);
91     sb.Append("\n");
92     EmitProxyMethodDecls(sb, TAB);
93     sb.Append("\n");
94     sb.Append("private:\n");
95     EmitProxyConstants(sb, TAB);
96     sb.Append("};\n");
97 }
98 
EmitProxyConstructor(StringBuilder & sb,const std::string & prefix)99 void CppClientProxyCodeEmitter::EmitProxyConstructor(StringBuilder &sb, const std::string &prefix)
100 {
101     sb.Append(prefix).AppendFormat("explicit %s(const sptr<IRemoteObject>& remote)", proxyName_.c_str());
102     sb.AppendFormat(" : IProxyBroker<%s>(remote) {}\n\n", interfaceName_.c_str());
103     sb.Append(prefix).AppendFormat("virtual ~%s() = default;\n", proxyName_.c_str());
104 }
105 
EmitProxyMethodDecls(StringBuilder & sb,const std::string & prefix)106 void CppClientProxyCodeEmitter::EmitProxyMethodDecls(StringBuilder &sb, const std::string &prefix)
107 {
108     for (size_t i = 0; i < interface_->GetMethodNumber(); i++) {
109         AutoPtr<ASTMethod> method = interface_->GetMethod(i);
110         EmitProxyMethodDecl(method, sb, prefix);
111         sb.Append("\n");
112     }
113 
114     EmitProxyMethodDecl(interface_->GetVersionMethod(), sb, prefix);
115 }
116 
EmitProxyMethodDecl(const AutoPtr<ASTMethod> & method,StringBuilder & sb,const std::string & prefix)117 void CppClientProxyCodeEmitter::EmitProxyMethodDecl(
118     const AutoPtr<ASTMethod> &method, StringBuilder &sb, const std::string &prefix)
119 {
120     if (method->GetParameterNumber() == 0) {
121         sb.Append(prefix).AppendFormat("int32_t %s() override;\n", method->GetName().c_str());
122     } else {
123         StringBuilder paramStr;
124         paramStr.Append(prefix).AppendFormat("int32_t %s(", method->GetName().c_str());
125 
126         for (size_t i = 0; i < method->GetParameterNumber(); i++) {
127             AutoPtr<ASTParameter> param = method->GetParameter(i);
128             EmitProxyMethodParameter(param, paramStr, "");
129             if (i + 1 < method->GetParameterNumber()) {
130                 paramStr.Append(", ");
131             }
132         }
133 
134         paramStr.Append(") override;");
135 
136         sb.Append(SpecificationParam(paramStr, prefix + TAB));
137         sb.Append("\n");
138     }
139 }
140 
EmitProxyConstants(StringBuilder & sb,const std::string & prefix)141 void CppClientProxyCodeEmitter::EmitProxyConstants(StringBuilder &sb, const std::string &prefix)
142 {
143     sb.Append(prefix).AppendFormat("static inline BrokerDelegator<%s> delegator_;\n", proxyName_.c_str());
144 }
145 
EmitProxyMethodParameter(const AutoPtr<ASTParameter> & param,StringBuilder & sb,const std::string & prefix)146 void CppClientProxyCodeEmitter::EmitProxyMethodParameter(
147     const AutoPtr<ASTParameter> &param, StringBuilder &sb, const std::string &prefix)
148 {
149     sb.Append(prefix).Append(param->EmitCppParameter());
150 }
151 
EmitPassthroughProxySourceFile()152 void CppClientProxyCodeEmitter::EmitPassthroughProxySourceFile()
153 {
154     std::string filePath =
155         File::AdapterPath(StringHelper::Format("%s/%s.cpp", directory_.c_str(), FileName(proxyName_).c_str()));
156     File file(filePath, File::WRITE);
157     StringBuilder sb;
158 
159     EmitLicense(sb);
160     EmitPassthroughProxySourceInclusions(sb);
161     sb.Append("\n");
162     EmitLogTagMacro(sb, FileName(proxyName_));
163     sb.Append("\n");
164     EmitBeginNamespace(sb);
165     EmitGetMethodImpl(sb, "");
166     sb.Append("\n");
167     EmitPassthroughGetInstanceMethodImpl(sb, "");
168     EmitEndNamespace(sb);
169 
170     std::string data = sb.ToString();
171     file.WriteData(data.c_str(), data.size());
172     file.Flush();
173     file.Close();
174 }
175 
EmitPassthroughProxySourceInclusions(StringBuilder & sb)176 void CppClientProxyCodeEmitter::EmitPassthroughProxySourceInclusions(StringBuilder &sb)
177 {
178     HeaderFile::HeaderFileSet headerFiles;
179 
180     headerFiles.emplace(HeaderFileType::OWN_HEADER_FILE, EmitVersionHeaderName(interfaceName_));
181     headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdi_support");
182     headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "string_ex");
183     headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_log");
184 
185     for (const auto &file : headerFiles) {
186         sb.AppendFormat("%s\n", file.ToString().c_str());
187     }
188 }
189 
EmitPassthroughGetInstanceMethodImpl(StringBuilder & sb,const std::string & prefix)190 void CppClientProxyCodeEmitter::EmitPassthroughGetInstanceMethodImpl(StringBuilder &sb, const std::string &prefix)
191 {
192     sb.Append(prefix).AppendFormat("sptr<%s> %s::Get(const std::string &serviceName, bool isStub)\n",
193         interface_->GetName().c_str(), interface_->GetName().c_str());
194     sb.Append(prefix).Append("{\n");
195     EmitProxyPassthroughtLoadImpl(sb, prefix + TAB);
196     sb.Append(prefix + TAB).Append("return nullptr;\n");
197     sb.Append(prefix).Append("}\n");
198 }
199 
EmitProxySourceFile()200 void CppClientProxyCodeEmitter::EmitProxySourceFile()
201 {
202     std::string filePath =
203         File::AdapterPath(StringHelper::Format("%s/%s.cpp", directory_.c_str(), FileName(proxyName_).c_str()));
204     File file(filePath, File::WRITE);
205     StringBuilder sb;
206 
207     EmitLicense(sb);
208     EmitProxySourceInclusions(sb);
209     sb.Append("\n");
210     EmitLogTagMacro(sb, FileName(proxyName_));
211     sb.Append("\n");
212     EmitBeginNamespace(sb);
213     sb.Append("\n");
214     UtilMethodMap utilMethods;
215     GetUtilMethods(utilMethods);
216     EmitUtilMethods(sb, "", utilMethods, true);
217     sb.Append("\n");
218     if (!interface_->IsSerializable()) {
219         EmitGetMethodImpl(sb, "");
220         sb.Append("\n");
221         EmitGetInstanceMethodImpl(sb, "");
222         sb.Append("\n");
223     }
224     EmitUtilMethods(sb, "", utilMethods, false);
225     EmitProxyMethodImpls(sb, "");
226     sb.Append("\n");
227     EmitEndNamespace(sb);
228 
229     std::string data = sb.ToString();
230     file.WriteData(data.c_str(), data.size());
231     file.Flush();
232     file.Close();
233 }
234 
EmitProxySourceInclusions(StringBuilder & sb)235 void CppClientProxyCodeEmitter::EmitProxySourceInclusions(StringBuilder &sb)
236 {
237     HeaderFile::HeaderFileSet headerFiles;
238     headerFiles.emplace(HeaderFileType::OWN_HEADER_FILE, EmitVersionHeaderName(proxyName_));
239     GetSourceOtherLibInclusions(headerFiles);
240 
241     for (const auto &file : headerFiles) {
242         sb.AppendFormat("%s\n", file.ToString().c_str());
243     }
244 }
245 
GetSourceOtherLibInclusions(HeaderFile::HeaderFileSet & headerFiles)246 void CppClientProxyCodeEmitter::GetSourceOtherLibInclusions(HeaderFile::HeaderFileSet &headerFiles)
247 {
248     if (!interface_->IsSerializable()) {
249         headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "iservmgr_hdi");
250     }
251     headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_base");
252     headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_log");
253     headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "message_option");
254     headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "message_parcel");
255     headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdi_support");
256     headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "string_ex");
257 
258     const AST::TypeStringMap &types = ast_->GetTypes();
259     for (const auto &pair : types) {
260         AutoPtr<ASTType> type = pair.second;
261         if (type->GetTypeKind() == TypeKind::TYPE_UNION) {
262             headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "securec");
263             break;
264         }
265     }
266 
267     for (size_t methodIndex = 0; methodIndex < interface_->GetMethodNumber(); methodIndex++) {
268         AutoPtr<ASTMethod> method = interface_->GetMethod(methodIndex);
269         for (size_t paramIndex = 0; paramIndex < method->GetParameterNumber(); paramIndex++) {
270             AutoPtr<ASTParameter> param = method->GetParameter(paramIndex);
271             AutoPtr<ASTType> paramType = param->GetType();
272             if (param->GetAttribute() == ParamAttr::PARAM_IN &&
273                 (paramType->IsInterfaceType() || paramType->HasInnerType(TypeKind::TYPE_INTERFACE))) {
274                 headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "object_collector");
275             }
276 
277             if (param->GetAttribute() == ParamAttr::PARAM_OUT &&
278                 (paramType->IsInterfaceType() || paramType->HasInnerType(TypeKind::TYPE_INTERFACE))) {
279                 headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "iproxy_broker");
280             }
281         }
282     }
283 }
284 
EmitGetMethodImpl(StringBuilder & sb,const std::string & prefix)285 void CppClientProxyCodeEmitter::EmitGetMethodImpl(StringBuilder &sb, const std::string &prefix)
286 {
287     sb.Append(prefix).AppendFormat(
288         "sptr<%s> %s::Get(bool isStub)\n", interface_->GetName().c_str(), interface_->GetName().c_str());
289     sb.Append(prefix).Append("{\n");
290     sb.Append(prefix + TAB)
291         .AppendFormat("return %s::Get(\"%s\", isStub);\n", interfaceName_.c_str(), FileName(implName_).c_str());
292     sb.Append(prefix).Append("}\n");
293 }
294 
EmitGetInstanceMethodImpl(StringBuilder & sb,const std::string & prefix)295 void CppClientProxyCodeEmitter::EmitGetInstanceMethodImpl(StringBuilder &sb, const std::string &prefix)
296 {
297     std::string objName = "proxy";
298     std::string SerMajorName = "serMajorVer";
299     std::string SerMinorName = "serMinorVer";
300     sb.Append(prefix).AppendFormat("sptr<%s> %s::Get(const std::string& serviceName, bool isStub)\n",
301         interface_->GetName().c_str(), interface_->GetName().c_str());
302     sb.Append(prefix).Append("{\n");
303     EmitProxyPassthroughtLoadImpl(sb, prefix + TAB);
304     sb.Append(prefix + TAB).Append("using namespace OHOS::HDI::ServiceManager::V1_0;\n");
305     sb.Append(prefix + TAB).Append("auto servMgr = IServiceManager::Get();\n");
306     sb.Append(prefix + TAB).Append("if (servMgr == nullptr) {\n");
307     sb.Append(prefix + TAB + TAB).Append("HDF_LOGE(\"%{public}s:get IServiceManager failed!\", __func__);\n");
308     sb.Append(prefix + TAB + TAB).Append("return nullptr;\n");
309     sb.Append(prefix + TAB).Append("}\n\n");
310     sb.Append(prefix + TAB).Append("sptr<IRemoteObject> remote = ");
311     sb.Append("servMgr->GetService(serviceName.c_str());\n");
312     sb.Append(prefix + TAB).Append("if (remote == nullptr) {\n");
313     sb.Append(prefix + TAB + TAB).Append("HDF_LOGE(\"%{public}s:get remote object failed!\", __func__);\n");
314     sb.Append(prefix + TAB + TAB).Append("return nullptr;\n");
315     sb.Append(prefix + TAB).Append("}\n\n");
316     sb.Append(prefix + TAB).AppendFormat("sptr<%s> %s = OHOS::HDI::hdi_facecast<%s>(remote);\n",
317         interfaceName_.c_str(), objName.c_str(), interfaceName_.c_str());
318     sb.Append(prefix + TAB).AppendFormat("if (%s == nullptr) {\n", objName.c_str());
319     sb.Append(prefix + TAB + TAB).Append("HDF_LOGE(\"%{public}s:iface_cast failed!\", __func__);\n");
320     sb.Append(prefix + TAB + TAB).Append("return nullptr;\n");
321     sb.Append(prefix + TAB).Append("}\n\n");
322 
323     sb.Append(prefix + TAB).AppendFormat("uint32_t %s = 0;\n", SerMajorName.c_str());
324     sb.Append(prefix + TAB).AppendFormat("uint32_t %s = 0;\n", SerMinorName.c_str());
325     sb.Append(prefix + TAB).AppendFormat("int32_t %s = %s->GetVersion(%s, %s);\n",
326         errorCodeName_.c_str(), objName.c_str(), SerMajorName.c_str(), SerMinorName.c_str());
327     sb.Append(prefix + TAB).AppendFormat("if (%s != HDF_SUCCESS) {\n", errorCodeName_.c_str());
328     sb.Append(prefix + TAB + TAB).Append("HDF_LOGE(\"%{public}s:get version failed!\", __func__);\n");
329     sb.Append(prefix + TAB + TAB).Append("return nullptr;\n");
330     sb.Append(prefix + TAB).Append("}\n\n");
331 
332     sb.Append(prefix + TAB).AppendFormat("if (%s != %s) {\n", SerMajorName.c_str(), majorVerName_.c_str());
333     sb.Append(prefix + TAB + TAB).Append("HDF_LOGE(\"%{public}s:check version failed! ");
334     sb.Append("version of service:%u.%u, version of client:%u.%u\", __func__,\n");
335     sb.Append(prefix + TAB + TAB + TAB).AppendFormat("%s, %s, %s, %s);\n", SerMajorName.c_str(), SerMinorName.c_str(),
336         majorVerName_.c_str(), minorVerName_.c_str());
337     sb.Append(prefix + TAB + TAB).Append("return nullptr;\n");
338     sb.Append(prefix + TAB).Append("}\n\n");
339     sb.Append(prefix + TAB).AppendFormat("return %s;\n", objName.c_str());
340     sb.Append(prefix).Append("}\n");
341 }
342 
EmitProxyPassthroughtLoadImpl(StringBuilder & sb,const std::string & prefix)343 void CppClientProxyCodeEmitter::EmitProxyPassthroughtLoadImpl(StringBuilder &sb, const std::string &prefix)
344 {
345     sb.Append(prefix).AppendFormat("if (isStub) {\n");
346     sb.Append(prefix + TAB)
347         .AppendFormat("std::string desc = Str16ToStr8(%s::GetDescriptor());\n", interfaceName_.c_str());
348     sb.Append(prefix + TAB).Append("void *impl = LoadHdiImpl(desc.c_str(), ");
349     sb.AppendFormat("serviceName == \"%s\" ? \"service\" : serviceName.c_str());\n", FileName(implName_).c_str());
350     sb.Append(prefix + TAB).Append("if (impl == nullptr) {\n");
351     sb.Append(prefix + TAB + TAB).Append("HDF_LOGE(\"failed to load hdi impl %{public}s\", desc.data());\n");
352     sb.Append(prefix + TAB + TAB).Append("return nullptr;\n");
353     sb.Append(prefix + TAB).Append("}\n");
354     sb.Append(prefix + TAB).AppendFormat("return reinterpret_cast<%s *>(impl);\n", interfaceName_.c_str());
355     sb.Append(prefix).Append("}\n\n");
356 }
357 
EmitProxyMethodImpls(StringBuilder & sb,const std::string & prefix)358 void CppClientProxyCodeEmitter::EmitProxyMethodImpls(StringBuilder &sb, const std::string &prefix)
359 {
360     for (size_t i = 0; i < interface_->GetMethodNumber(); i++) {
361         AutoPtr<ASTMethod> method = interface_->GetMethod(i);
362         EmitProxyMethodImpl(method, sb, prefix);
363         sb.Append("\n");
364     }
365 
366     EmitProxyMethodImpl(interface_->GetVersionMethod(), sb, prefix);
367 }
368 
EmitProxyMethodImpl(const AutoPtr<ASTMethod> & method,StringBuilder & sb,const std::string & prefix)369 void CppClientProxyCodeEmitter::EmitProxyMethodImpl(
370     const AutoPtr<ASTMethod> &method, StringBuilder &sb, const std::string &prefix)
371 {
372     if (method->GetParameterNumber() == 0) {
373         sb.Append(prefix).AppendFormat("int32_t %s::%s()\n", proxyName_.c_str(), method->GetName().c_str());
374     } else {
375         StringBuilder paramStr;
376         paramStr.Append(prefix).AppendFormat("int32_t %s::%s(", proxyName_.c_str(), method->GetName().c_str());
377         for (size_t i = 0; i < method->GetParameterNumber(); i++) {
378             AutoPtr<ASTParameter> param = method->GetParameter(i);
379             EmitProxyMethodParameter(param, paramStr, "");
380             if (i + 1 < method->GetParameterNumber()) {
381                 paramStr.Append(", ");
382             }
383         }
384 
385         paramStr.Append(")");
386 
387         sb.Append(SpecificationParam(paramStr, prefix + TAB));
388         sb.Append("\n");
389     }
390     EmitProxyMethodBody(method, sb, prefix);
391 }
392 
EmitProxyMethodBody(const AutoPtr<ASTMethod> & method,StringBuilder & sb,const std::string & prefix)393 void CppClientProxyCodeEmitter::EmitProxyMethodBody(
394     const AutoPtr<ASTMethod> &method, StringBuilder &sb, const std::string &prefix)
395 {
396     std::string option = method->IsOneWay() ? "MessageOption::TF_ASYNC" : "MessageOption::TF_SYNC";
397     sb.Append(prefix).Append("{\n");
398     sb.Append(prefix + TAB).AppendFormat("MessageParcel %s;\n", dataParcelName_.c_str());
399     sb.Append(prefix + TAB).AppendFormat("MessageParcel %s;\n", replyParcelName_.c_str());
400     sb.Append(prefix + TAB).AppendFormat("MessageOption %s(%s);\n", optionName_.c_str(), option.c_str());
401     sb.Append("\n");
402 
403     // write interface token
404     EmitWriteInterfaceToken(dataParcelName_, sb, prefix + TAB);
405     sb.Append("\n");
406 
407     EmitWriteFlagOfNeedSetMem(method, dataParcelName_, sb, prefix + TAB);
408 
409     if (method->GetParameterNumber() > 0) {
410         for (size_t i = 0; i < method->GetParameterNumber(); i++) {
411             AutoPtr<ASTParameter> param = method->GetParameter(i);
412             if (param->GetAttribute() == ParamAttr::PARAM_IN) {
413                 EmitWriteMethodParameter(param, dataParcelName_, sb, prefix + TAB);
414                 sb.Append("\n");
415             }
416         }
417     }
418 
419     sb.Append(prefix + TAB).AppendFormat("int32_t %s = Remote()->SendRequest(%s, %s, %s, %s);\n",
420         errorCodeName_.c_str(), EmitMethodCmdID(method).c_str(), dataParcelName_.c_str(), replyParcelName_.c_str(),
421         optionName_.c_str());
422     sb.Append(prefix + TAB).AppendFormat("if (%s != HDF_SUCCESS) {\n", errorCodeName_.c_str());
423     sb.Append(prefix + TAB + TAB).AppendFormat(
424         "HDF_LOGE(\"%%{public}s failed, error code is %%{public}d\", __func__, %s);\n", errorCodeName_.c_str());
425     sb.Append(prefix + TAB + TAB).AppendFormat("return %s;\n", errorCodeName_.c_str());
426     sb.Append(prefix + TAB).Append("}\n");
427 
428     if (!method->IsOneWay()) {
429         sb.Append("\n");
430         for (size_t i = 0; i < method->GetParameterNumber(); i++) {
431             AutoPtr<ASTParameter> param = method->GetParameter(i);
432             if (param->GetAttribute() == ParamAttr::PARAM_OUT) {
433                 EmitReadMethodParameter(param, replyParcelName_, false, sb, prefix + TAB);
434                 sb.Append("\n");
435             }
436         }
437     }
438 
439     sb.Append(prefix + TAB).AppendFormat("return %s;\n", errorCodeName_.c_str());
440     sb.Append(prefix).Append("}\n");
441 }
442 
EmitWriteInterfaceToken(const std::string & parcelName,StringBuilder & sb,const std::string & prefix)443 void CppClientProxyCodeEmitter::EmitWriteInterfaceToken(
444     const std::string &parcelName, StringBuilder &sb, const std::string &prefix)
445 {
446     sb.Append(prefix).AppendFormat(
447         "if (!%s.WriteInterfaceToken(%s::GetDescriptor())) {\n", parcelName.c_str(), interfaceName_.c_str());
448     sb.Append(prefix + TAB)
449         .AppendFormat("HDF_LOGE(\"%%{public}s: failed to write interface descriptor!\", __func__);\n");
450     sb.Append(prefix + TAB).AppendFormat("return HDF_ERR_INVALID_PARAM;\n");
451     sb.Append(prefix).Append("}\n");
452 }
453 
EmitWriteFlagOfNeedSetMem(const AutoPtr<ASTMethod> & method,const std::string & dataBufName,StringBuilder & sb,const std::string & prefix)454 void CppClientProxyCodeEmitter::EmitWriteFlagOfNeedSetMem(
455     const AutoPtr<ASTMethod> &method, const std::string &dataBufName, StringBuilder &sb, const std::string &prefix)
456 {
457     if (NeedFlag(method)) {
458         sb.Append(prefix).AppendFormat("if (!%s.WriteBool(false)) {\n", dataBufName.c_str());
459         sb.Append(prefix + TAB).Append("HDF_LOGE(\"%{public}s:failed to write flag of memory setting!\", __func__);\n");
460         sb.Append(prefix + TAB).AppendFormat("return HDF_ERR_INVALID_PARAM;\n");
461         sb.Append(prefix).Append("}\n\n");
462     }
463 }
464 
GetUtilMethods(UtilMethodMap & methods)465 void CppClientProxyCodeEmitter::GetUtilMethods(UtilMethodMap &methods)
466 {
467     for (size_t methodIndex = 0; methodIndex < interface_->GetMethodNumber(); methodIndex++) {
468         AutoPtr<ASTMethod> method = interface_->GetMethod(methodIndex);
469         for (size_t paramIndex = 0; paramIndex < method->GetParameterNumber(); paramIndex++) {
470             AutoPtr<ASTParameter> param = method->GetParameter(paramIndex);
471             AutoPtr<ASTType> paramType = param->GetType();
472             if (param->GetAttribute() == ParamAttr::PARAM_IN) {
473                 paramType->RegisterWriteMethod(Options::GetInstance().GetTargetLanguage(), SerMode::PROXY_SER, methods);
474             } else {
475                 paramType->RegisterReadMethod(Options::GetInstance().GetTargetLanguage(), SerMode::PROXY_SER, methods);
476             }
477         }
478     }
479 }
480 } // namespace HDI
481 } // namespace OHOS