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> ¶m, 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