Lines Matching refs:sb

33     StringBuilder sb;
35 EmitLicense(sb);
36 sb.Append("\n");
37 EmitHeadMacro(sb, interfaceFullName_);
38 sb.Append("\n");
39 EmitInterfaceInclusions(sb);
40 sb.Append("\n");
41 if (EmitInterfaceUsings(sb)) {
42 sb.Append("\n");
44 EmitInterfaceDefinition(sb);
45 EmitTailMacro(sb, interfaceFullName_);
47 String data = sb.ToString();
53 void CppCodeEmitter::EmitInterfaceInclusions(StringBuilder& sb)
55 EmitInterfaceStdlibInclusions(sb);
56 EmitInterfaceDBinderInclusions(sb);
57 EmitInterfaceSelfDefinedTypeInclusions(sb);
60 void CppCodeEmitter::EmitInterfaceStdlibInclusions(StringBuilder& sb)
74 sb.Append("#include <cstdint>\n");
81 sb.Append("#include <string_ex.h>\n");
89 sb.Append("#include <vector>\n");
96 sb.Append("#include <unordered_map>\n");
107 void CppCodeEmitter::EmitInterfaceDBinderInclusions(StringBuilder& sb)
109 sb.Append("#include <iremote_broker.h>\n");
111 sb.Append("#include \"hilog/log.h\"\n");
145 void CppCodeEmitter::EmitInterfaceSelfDefinedTypeInclusions(StringBuilder& sb)
156 sb.Append("#include ").AppendFormat("\"%s.h\"\n", fileName.string());
164 sb.Append("#include ").AppendFormat("\"%s.h\"\n", fileName.string());
169 bool CppCodeEmitter::EmitInterfaceUsings(StringBuilder& sb)
179 sb.Append("using ").AppendFormat("%s;\n", fullName.string());
191 sb.Append("using ").AppendFormat("%s;\n", fullName.string());
198 void CppCodeEmitter::EmitInterfaceDefinition(StringBuilder& sb)
200 EmitBeginNamespace(sb);
201 sb.AppendFormat("class %s : public IRemoteBroker {\n", metaInterface_->name_);
202 sb.Append("public:\n");
203 EmitInterfaceBody(sb, TAB);
204 EmitInterfaceMemberVariables(sb, TAB);
205 sb.Append("};\n");
206 EmitEndNamespace(sb);
209 void CppCodeEmitter::EmitInterfaceBody(StringBuilder& sb, const String& prefix)
212 sb.Append(TAB).AppendFormat("DECLARE_INTERFACE_DESCRIPTOR(u\"%s\");\n", nameWithoutPath.string());
213 sb.Append("\n");
214 EmitInterfaceMethods(sb, TAB);
217 void CppCodeEmitter::EmitInterfaceMethods(StringBuilder& sb, const String& prefix)
222 EmitInterfaceMethod(mm, sb, prefix);
224 sb.Append("\n");
230 void CppCodeEmitter::EmitInterfaceMethod(MetaMethod* mm, StringBuilder& sb, const String& prefix)
234 sb.Append(prefix).AppendFormat("virtual ErrCode %s() = 0;\n", mm->name_);
236 sb.Append(prefix).AppendFormat("virtual ErrCode %s(\n", mm->name_);
239 EmitInterfaceMethodParameter(mp, sb, prefix + TAB);
241 sb.Append(",\n");
245 EmitInterfaceMethodReturn(returnType, sb, prefix + TAB);
247 sb.Append(") = 0;\n");
251 void CppCodeEmitter::EmitInterfaceMethodParameter(MetaParameter* mp, StringBuilder& sb, const String& prefix)
253 sb.Append(prefix);
257 sb.AppendFormat("%s %s", EmitType(mt, mp->attributes_, false).string(), name.c_str());
260 void CppCodeEmitter::EmitInterfaceMethodReturn(MetaType* mt, StringBuilder& sb, const String& prefix)
262 sb.Append(prefix).AppendFormat("%s result", EmitType(mt, ATTR_OUT, false).string());
265 void CppCodeEmitter::EmitInterfaceMemberVariables(StringBuilder& sb, const String& prefix)
267 sb.Append("protected:\n");
269 sb.Append(prefix).AppendFormat(
273 sb.Append(prefix).Append("const int VECTOR_MAX_SIZE = 102400;\n");
274 sb.Append(prefix).Append("const int LIST_MAX_SIZE = 102400;\n");
275 sb.Append(prefix).Append("const int MAP_MAX_SIZE = 102400;\n");
289 StringBuilder sb;
291 EmitLicense(sb);
292 sb.Append("\n");
293 EmitHeadMacro(sb, proxyFullName_);
294 sb.Append("\n");
295 sb.AppendFormat("#include \"%s.h\"\n", FileName(interfaceName_).string());
296 sb.Append("#include <iremote_proxy.h>\n");
298 sb.Append("#include \"api_cache_manager.h\"\n");
300 sb.Append("\n");
301 EmitInterfaceProxyInHeaderFile(sb);
302 EmitTailMacro(sb, proxyFullName_);
304 String data = sb.ToString();
310 void CppCodeEmitter::EmitInterfaceProxyInHeaderFile(StringBuilder& sb)
312 EmitBeginNamespace(sb);
313 sb.AppendFormat("class %s : public IRemoteProxy<%s> {\n", proxyName_.string(), interfaceName_.string());
314 sb.Append("public:\n");
315 EmitInterfaceProxyConstructor(sb, TAB);
316 sb.Append("\n");
317 EmitInterfaceProxyMethodDecls(sb, TAB);
318 sb.Append("\n");
319 sb.Append("private:\n");
320 EmitInterfaceProxyConstants(sb, TAB);
321 sb.Append("};\n");
322 EmitEndNamespace(sb);
325 void CppCodeEmitter::EmitInterfaceProxyRegisterDeathRecipient(StringBuilder& sb, const String& prefix)
327 sb.Append(prefix).Append("if (remote != nullptr) {\n");
328 sb.Append(prefix + TAB).Append("if (!remote->IsProxyObject()) {\n");
330 sb.Append(prefix + TAB + TAB).Append("HiLog::Error(LABEL, \"remote is not proxy object!\");\n");
332 sb.Append(prefix + TAB + TAB).Append("return;\n");
333 sb.Append(prefix + TAB).Append("}\n");
334 sb.Append(prefix + TAB).AppendFormat("deathRecipient_ = new (std::nothrow) %s(*this);\n",
336 sb.Append(prefix + TAB).Append("if (deathRecipient_ == nullptr) {\n");
338 sb.Append(prefix + TAB + TAB).Append("HiLog::Error(LABEL, \"deathRecipient_ is nullptr!\");\n");
340 sb.Append(prefix + TAB + TAB).Append("return;\n");
341 sb.Append(prefix + TAB).Append("}\n");
342 sb.Append(prefix + TAB).Append("if (!remote->AddDeathRecipient(deathRecipient_)) {\n");
344 sb.Append(prefix + TAB + TAB).Append("HiLog::Error(LABEL, \"AddDeathRecipient failed!\");\n");
346 sb.Append(prefix + TAB + TAB).Append("return;\n");
347 sb.Append(prefix + TAB).Append("}\n");
348 sb.Append(prefix + TAB).Append("remote_ = remote;\n");
349 sb.Append(prefix).Append("}\n");
352 void CppCodeEmitter::EmitInterfaceProxyAddCacheAbleAPI(StringBuilder& sb, const String& prefix)
354 sb.Append("\n");
364 sb.Append(prefix + TAB).AppendFormat(
368 sb.Append(prefix + TAB).AppendFormat(
373 sb.Append("\n");
374 EmitInterfaceProxyRegisterDeathRecipient(sb, prefix + TAB);
377 void CppCodeEmitter::EmitInterfaceProxyUnRegisterDeathRecipient(StringBuilder& sb, const String& prefix)
379 sb.Append(prefix).Append("if (remote_ == nullptr) {\n");
380 sb.Append(prefix).Append(TAB).Append("return;\n");
381 sb.Append(prefix).Append("}\n");
382 sb.Append(prefix).Append("if (deathRecipient_ == nullptr) {\n");
383 sb.Append(prefix).Append(TAB).Append("return;\n");
384 sb.Append(prefix).Append("}\n");
385 sb.Append(prefix).Append("remote_->RemoveDeathRecipient(deathRecipient_);\n");
386 sb.Append(prefix).Append("remote_ = nullptr;\n");
388 sb.Append("\n");
392 sb.Append(prefix).AppendFormat(
400 void CppCodeEmitter::EmitInterfaceProxyConstructor(StringBuilder& sb, const String& prefix)
402 sb.Append(prefix).AppendFormat("explicit %s(\n", proxyName_.string());
403 sb.Append(prefix + TAB).Append("const sptr<IRemoteObject>& remote)\n");
404 sb.Append(prefix + TAB).AppendFormat(": IRemoteProxy<%s>(remote)\n", interfaceName_.string());
405 sb.Append(prefix).Append("{");
406 EmitInterfaceProxyAddCacheAbleAPI(sb, prefix);
407 sb.Append(prefix).Append("}\n\n");
408 sb.Append(prefix).AppendFormat("virtual ~%s()\n", proxyName_.string());
409 sb.Append(prefix).Append("{\n");
411 EmitInterfaceProxyUnRegisterDeathRecipient(sb, prefix + TAB);
413 sb.Append(prefix).Append("}\n");
416 void CppCodeEmitter::EmitInterfaceProxyMethodDecls(StringBuilder& sb, const String& prefix)
421 EmitInterfaceProxyMethodDecl(mm, sb, prefix);
423 sb.Append("\n");
429 void CppCodeEmitter::EmitInterfaceProxyMethodDecl(MetaMethod* mm, StringBuilder& sb, const String& prefix)
433 sb.Append(prefix).AppendFormat("ErrCode %s() override;\n", mm->name_);
435 sb.Append(prefix).AppendFormat("ErrCode %s(\n", mm->name_);
438 EmitInterfaceMethodParameter(mp, sb, prefix + TAB);
440 sb.Append(",\n");
444 EmitInterfaceMethodReturn(returnType, sb, prefix + TAB);
446 sb.Append(") override;\n");
450 void CppCodeEmitter::EmitInterfaceProxyDeathRecipient(StringBuilder& sb, const String& prefix)
452 sb.Append(prefix).AppendFormat("class %s : public IRemoteObject::DeathRecipient {\n", deathRecipientName_.string());
453 sb.Append(prefix).Append("public:\n");
454 sb.Append(prefix + TAB).AppendFormat("explicit %s(%s &client) : client_(client) {}\n", deathRecipientName_.string(),
456 sb.Append(prefix + TAB).AppendFormat("~%s() override = default;\n", deathRecipientName_.string());
457 sb.Append(prefix + TAB).Append("void OnRemoteDied(const wptr<IRemoteObject> &remote) override\n");
458 sb.Append(prefix + TAB).Append("{\n");
459 sb.Append(prefix + TAB + TAB).Append("client_.OnRemoteDied(remote);\n");
460 sb.Append(prefix + TAB).Append("}\n");
461 sb.Append(prefix).Append("private:\n");
462 sb.Append(prefix + TAB).AppendFormat("%s &client_;\n", proxyName_.string());
463 sb.Append(prefix).Append("};\n\n");
465 sb.Append(prefix).Append("void OnRemoteDied(const wptr<IRemoteObject> &remoteObject)\n");
466 sb.Append(prefix).Append("{\n");
467 sb.Append(prefix + TAB).Append("(void)remoteObject;\n");
468 sb.Append(prefix + TAB).Append("ApiCacheManager::GetInstance().ClearCache(GetDescriptor());\n");
469 sb.Append(prefix).Append("}\n");
470 sb.Append(prefix).Append("sptr<IRemoteObject> remote_ = nullptr;\n");
471 sb.Append(prefix).Append("sptr<IRemoteObject::DeathRecipient> deathRecipient_ = nullptr;\n");
474 void CppCodeEmitter::EmitInterfaceProxyConstants(StringBuilder& sb, const String& prefix)
477 EmitInterfaceProxyDeathRecipient(sb, prefix);
479 EmitInterfaceMethodCommands(sb, prefix);
480 sb.Append("\n");
481 sb.Append(prefix).AppendFormat("static inline BrokerDelegator<%s> delegator_;\n", proxyName_.string());
489 StringBuilder sb;
491 EmitLicense(sb);
492 sb.Append("\n");
493 sb.AppendFormat("#include \"%s.h\"\n", FileName(proxyName_).string());
495 sb.Append("#include \"hilog/log.h\"\n");
498 sb.Append("#include \"hitrace_meter.h\"\n");
500 sb.Append("\n");
502 sb.Append("using OHOS::HiviewDFX::HiLog;\n\n");
504 EmitBeginNamespace(sb);
505 EmitInterfaceProxyMethodImpls(sb, "");
506 EmitEndNamespace(sb);
508 String data = sb.ToString();
514 void CppCodeEmitter::EmitInterfaceProxyMethodImpls(StringBuilder& sb, const String& prefix)
519 EmitInterfaceProxyMethodImpl(mm, sb, prefix);
521 sb.Append("\n");
527 void CppCodeEmitter::EmitInterfaceProxyMethodImpl(MetaMethod* mm, StringBuilder& sb, const String& prefix)
531 sb.Append(prefix).AppendFormat("ErrCode %s::%s()\n", proxyName_.string(), mm->name_);
533 sb.Append(prefix).AppendFormat("ErrCode %s::%s(\n", proxyName_.string(), mm->name_);
536 EmitInterfaceMethodParameter(mp, sb, prefix + TAB);
538 sb.Append(",\n");
542 EmitInterfaceMethodReturn(returnType, sb, prefix + TAB);
544 sb.Append(")\n");
546 EmitInterfaceProxyMethodBody(mm, sb, prefix);
549 void CppCodeEmitter::EmitInterfaceProxyMethodPreSendRequest(MetaMethod* mm, StringBuilder& sb, const String& prefix)
552 sb.Append("\n");
553 sb.Append(prefix + TAB).AppendFormat(
556 sb.Append("\n");
557 sb.Append(prefix + TAB).Append("if (hitCache == true) {\n");
558 EmitInterfaceProxyMethodErrCode(sb, prefix + TAB);
559 EmitInterfaceProxyMethodReply(mm, sb, prefix + TAB);
560 sb.Append(prefix + TAB + TAB).Append("return ERR_OK;\n");
561 sb.Append(prefix + TAB).Append("}\n\n");
565 void CppCodeEmitter::EmitInterfaceProxyMethodPostSendRequest(MetaMethod* mm, StringBuilder& sb, const String& prefix)
567 sb.Append(prefix + TAB).AppendFormat(
572 void CppCodeEmitter::EmitInterfaceProxyMethodBody(MetaMethod* mm, StringBuilder& sb, const String& prefix)
574 sb.Append(prefix).Append("{\n");
576 sb.Append(prefix + TAB).AppendFormat("HITRACE_METER_NAME(%s, __PRETTY_FUNCTION__);\n",
579 sb.Append(prefix + TAB).Append("MessageParcel data;\n");
580 sb.Append(prefix + TAB).Append("MessageParcel reply;\n");
581 sb.Append(prefix + TAB).AppendFormat("MessageOption option(%s);\n",
583 sb.Append("\n");
584 sb.Append(prefix + TAB).Append("if (!data.WriteInterfaceToken(GetDescriptor())) {\n");
586 sb.Append(prefix + TAB).Append(TAB).Append("HiLog::Error(LABEL, \"Write interface token failed!\");\n");
588 sb.Append(prefix + TAB).Append(TAB).Append("return ERR_INVALID_VALUE;\n");
589 sb.Append(prefix + TAB).Append("}\n");
590 sb.Append("\n");
595 EmitWriteMethodParameter(mp, "data.", sb, prefix + TAB);
598 EmitInterfaceProxyMethodPreSendRequest(mm, sb, prefix);
599 sb.Append(prefix + TAB).Append("sptr<IRemoteObject> remote = Remote();\n");
600 sb.Append(prefix + TAB).Append("if (remote == nullptr) {\n");
602 sb.Append(prefix + TAB).Append(TAB).Append("HiLog::Error(LABEL, \"Remote is nullptr!\");\n");
604 sb.Append(prefix + TAB).Append(TAB).Append("return ERR_INVALID_DATA;\n");
605 sb.Append(prefix + TAB).Append("}\n\n");
606 sb.Append(prefix + TAB).AppendFormat("int32_t result = remote->SendRequest(COMMAND_%s, data, reply, option);\n",
608 sb.Append(prefix + TAB).Append("if (FAILED(result)) {\n");
610 sb.Append(prefix + TAB).Append(TAB).Append("HiLog::Error(LABEL, \"Send request failed!\");\n");
612 sb.Append(prefix + TAB).Append(" return result;\n");
613 sb.Append(prefix + TAB).Append("}\n");
614 EmitInterfaceProxyMethodRetValue(mm, sb, prefix);
615 sb.Append(prefix).Append("}\n");
618 void CppCodeEmitter::EmitInterfaceProxyMethodErrCode(StringBuilder& sb, const String& prefix)
620 sb.Append(prefix + TAB).Append("ErrCode errCode = reply.ReadInt32();\n");
621 sb.Append(prefix + TAB).Append("if (FAILED(errCode)) {\n");
623 sb.Append(prefix + TAB + TAB).Append("HiLog::Error(LABEL, \"Read Int32 failed!\");\n");
625 sb.Append(prefix + TAB).Append(" return errCode;\n");
626 sb.Append(prefix + TAB).Append("}\n");
629 void CppCodeEmitter::EmitInterfaceProxyMethodReply(MetaMethod* mm, StringBuilder& sb, const String& prefix)
634 EmitReadMethodParameter(mp, "reply.", sb, prefix + TAB);
639 EmitReadVariable("reply.", "result", returnType, sb, prefix + TAB, false);
643 void CppCodeEmitter::EmitInterfaceProxyMethodRetValue(MetaMethod* mm, StringBuilder& sb, const String& prefix)
646 EmitInterfaceProxyMethodErrCode(sb, prefix);
647 sb.Append("\n");
649 EmitInterfaceProxyMethodPostSendRequest(mm, sb, prefix);
651 EmitInterfaceProxyMethodReply(mm, sb, prefix);
653 sb.Append(prefix + TAB).Append("return ERR_OK;\n");
656 void CppCodeEmitter::EmitWriteMethodParameter(MetaParameter* mp, const String& parcelName, StringBuilder& sb,
661 EmitWriteVariable(parcelName, name, mt, sb, prefix);
664 void CppCodeEmitter::EmitReadMethodParameter(MetaParameter* mp, const String& parcelName, StringBuilder& sb,
669 EmitReadVariable(parcelName, name, mt, sb, prefix, false);
683 StringBuilder sb;
685 EmitLicense(sb);
686 sb.Append("\n");
687 EmitHeadMacro(sb, stubFullName_);
688 sb.Append("\n");
689 sb.AppendFormat("#include \"%s.h\"\n", FileName(interfaceName_).string());
690 sb.Append("#include <iremote_stub.h>\n");
691 sb.Append("\n");
692 EmitInterfaceStubInHeaderFile(sb);
693 EmitTailMacro(sb, stubFullName_);
695 String data = sb.ToString();
701 void CppCodeEmitter::EmitInterfaceStubInHeaderFile(StringBuilder& sb)
703 EmitBeginNamespace(sb);
704 sb.AppendFormat("class %s : public IRemoteStub<%s> {\n", stubName_.string(), interfaceName_.string());
705 sb.Append("public:\n");
706 EmitInterfaceStubMethodDecls(sb, TAB);
707 sb.Append("\n");
708 sb.Append("private:\n");
709 EmitInterfaceStubConstants(sb, TAB);
710 sb.Append("};\n");
711 EmitEndNamespace(sb);
714 void CppCodeEmitter::EmitInterfaceStubMethodDecls(StringBuilder& sb, const String& prefix)
716 sb.Append(prefix).Append("int32_t OnRemoteRequest(\n");
717 sb.Append(prefix + TAB).Append("uint32_t code,\n");
718 sb.Append(prefix + TAB).Append("MessageParcel& data,\n");
719 sb.Append(prefix + TAB).Append("MessageParcel& reply,\n");
720 sb.Append(prefix + TAB).Append("MessageOption& option) override;\n");
723 void CppCodeEmitter::EmitInterfaceStubConstants(StringBuilder& sb, const String& prefix)
725 EmitInterfaceMethodCommands(sb, prefix);
733 StringBuilder sb;
735 EmitLicense(sb);
736 sb.Append("\n");
737 sb.AppendFormat("#include \"%s.h\"\n", FileName(stubName_).string());
739 sb.Append("#include \"hilog/log.h\"\n");
742 sb.Append("#include \"hitrace_meter.h\"\n");
744 sb.Append("\n");
746 sb.Append("using OHOS::HiviewDFX::HiLog;\n\n");
748 EmitBeginNamespace(sb);
749 EmitInterfaceStubMethodImpls(sb, "");
750 EmitEndNamespace(sb);
752 String data = sb.ToString();
758 void CppCodeEmitter::EmitInterfaceStubMethodImpls(StringBuilder& sb, const String& prefix)
760 sb.Append(prefix).AppendFormat("int32_t %s::OnRemoteRequest(\n", stubName_.string());
761 sb.Append(prefix + TAB).Append("uint32_t code,\n");
762 sb.Append(prefix + TAB).Append("MessageParcel& data,\n");
763 sb.Append(prefix + TAB).Append("MessageParcel& reply,\n");
764 sb.Append(prefix + TAB).Append("MessageOption& option)\n");
765 sb.Append(prefix).Append("{\n");
767 sb.Append(prefix + TAB).AppendFormat("HITRACE_METER_NAME(%s, __PRETTY_FUNCTION__);\n",
770 sb.Append(prefix + TAB).Append("std::u16string localDescriptor = GetDescriptor();\n");
771 sb.Append(prefix + TAB).Append("std::u16string remoteDescriptor = data.ReadInterfaceToken();\n");
772 sb.Append(prefix + TAB).Append("if (localDescriptor != remoteDescriptor) {\n");
773 sb.Append(prefix + TAB).Append(TAB).Append("return ERR_TRANSACTION_FAILED;\n");
774 sb.Append(prefix + TAB).Append("}\n");
775 sb.Append(prefix + TAB).Append("switch (code) {\n");
778 EmitInterfaceStubMethodImpl(mm, sb, prefix + TAB + TAB);
780 sb.Append(prefix + TAB).Append(TAB).Append("default:\n");
781 sb.Append(prefix + TAB).Append(TAB).Append(TAB).Append(
783 sb.Append(prefix + TAB).Append("}\n\n");
784 sb.Append(prefix + TAB).Append("return ERR_TRANSACTION_FAILED;\n");
785 sb.Append(prefix).Append("}\n");
789 StringBuilder& sb, const String& prefix, MetaType* returnType)
793 sb.Append(prefix + TAB).AppendFormat("%s result = nullptr;\n",
796 sb.Append(prefix + TAB).AppendFormat("%s result;\n", EmitType(returnType, ATTR_IN, true).string());
800 sb.Append(prefix + TAB).AppendFormat("ErrCode errCode = %s();\n", mm->name_);
802 sb.Append(prefix + TAB).AppendFormat("ErrCode errCode = %s(", mm->name_);
812 sb.Append(parameterName.c_str());
814 sb.Append(name.c_str());
818 sb.Append(", ");
822 EmitReturnParameter("result", returnType, sb);
824 sb.AppendFormat(");\n", mm->name_);
828 void CppCodeEmitter::EmitInterfaceStubMethodImpl(MetaMethod* mm, StringBuilder& sb, const String& prefix)
830 sb.Append(prefix).AppendFormat("case COMMAND_%s: {\n", ConstantName(mm->name_).string());
836 EmitReadVariable("data.", name, mt, sb, prefix + TAB);
838 EmitLocalVariable(mp, sb, prefix + TAB);
845 EmitInterfaceStubMethodImplReturn(mm, sb, prefix, returnType);
847 sb.Append(prefix + TAB).Append("if (!reply.WriteInt32(errCode)) {\n");
849 sb.Append(prefix + TAB).Append(TAB).Append("HiLog::Error(LABEL, \"Write Int32 failed!\");\n");
851 sb.Append(prefix + TAB).Append(TAB).Append("return ERR_INVALID_VALUE;\n");
852 sb.Append(prefix + TAB).Append("}\n");
861 sb.Append(prefix + TAB).Append("if (SUCCEEDED(errCode)) {\n");
865 EmitWriteMethodParameter(mp, "reply.", sb, prefix + TAB + TAB);
869 EmitWriteVariable("reply.", "result", returnType, sb, prefix + TAB + TAB);
871 sb.Append(prefix + TAB).Append("}\n");
873 sb.Append(prefix + TAB).Append("return ERR_NONE;\n");
874 sb.Append(prefix).Append("}\n");
877 void CppCodeEmitter::EmitInterfaceMethodCommands(StringBuilder& sb, const String& prefix)
881 sb.Append(prefix).AppendFormat("static constexpr int32_t COMMAND_%s = MIN_TRANSACTION_ID + %d;\n",
886 void CppCodeEmitter::EmitLicense(StringBuilder& sb)
888 sb.Append(metaInterface_->license_).Append("\n");
891 void CppCodeEmitter::EmitHeadMacro(StringBuilder& sb, const String& fullName)
894 sb.Append("#ifndef ").Append(macroName).Append("\n");
895 sb.Append("#define ").Append(macroName).Append("\n");
898 void CppCodeEmitter::EmitTailMacro(StringBuilder& sb, const String& fullName)
901 sb.Append("#endif // ").Append(macroName).Append("\n\n");
904 void CppCodeEmitter::EmitBeginNamespace(StringBuilder& sb)
909 sb.AppendFormat("namespace %s {\n", nspace.Substring(0, index).string());
915 void CppCodeEmitter::EmitEndNamespace(StringBuilder& sb)
921 sb.AppendFormat("} // namespace %s\n", index != -1 ?
928 StringBuilder& sb, const String& prefix)
932 sb.Append(prefix).AppendFormat("if (!%sWriteInt32(%s ? 1 : 0)) {\n", parcelName.string(), name.c_str());
934 sb.Append(prefix).Append(TAB).AppendFormat("HiLog::Error(LABEL, \"Write [%s] failed!\");\n",
937 sb.Append(prefix).Append(TAB).Append("return ERR_INVALID_DATA;\n");
938 sb.Append(prefix).Append("}\n");
944 sb.Append(prefix).AppendFormat("if (!%sWriteInt32(%s)) {\n", parcelName.string(), name.c_str());
946 sb.Append(prefix).Append(TAB).AppendFormat("HiLog::Error(LABEL, \"Write [%s] failed!\");\n",
949 sb.Append(prefix).Append(TAB).Append("return ERR_INVALID_DATA;\n");
950 sb.Append(prefix).Append("}\n");
953 sb.Append(prefix).AppendFormat("if (!%sWriteInt64(%s)) {\n", parcelName.string(), name.c_str());
955 sb.Append(prefix).Append(TAB).AppendFormat("HiLog::Error(LABEL, \"Write [%s] failed!\");\n",
958 sb.Append(prefix).Append(TAB).Append("return ERR_INVALID_DATA;\n");
959 sb.Append(prefix).Append("}\n");
962 EmitWriteVariableFloat(parcelName, name, mt, sb, prefix);
968 const String& parcelName, const std::string& name, MetaType* mt, StringBuilder& sb, const String& prefix)
972 sb.Append(prefix).AppendFormat("if (!%sWriteFloat(%s)) {\n", parcelName.string(), name.c_str());
974 sb.Append(prefix).Append(TAB).AppendFormat("HiLog::Error(LABEL, \"Write [%s] failed!\");\n",
977 sb.Append(prefix).Append(TAB).Append("return ERR_INVALID_DATA;\n");
978 sb.Append(prefix).Append("}\n");
981 sb.Append(prefix).AppendFormat("if (!%sWriteDouble(%s)) {\n", parcelName.string(), name.c_str());
983 sb.Append(prefix).Append(TAB).AppendFormat("HiLog::Error(LABEL, \"Write [%s] failed!\");\n",
986 sb.Append(prefix).Append(TAB).Append("return ERR_INVALID_DATA;\n");
987 sb.Append(prefix).Append("}\n");
990 EmitWriteVariableComplex(parcelName, name, mt, sb, prefix);
996 const String& parcelName, const std::string& name, MetaType* mt, StringBuilder& sb, const String& prefix)
1001 sb.Append(prefix).AppendFormat("if (%s.size() > static_cast<size_t>(VECTOR_MAX_SIZE)) {\n", name.c_str());
1004 sb.Append(prefix).Append(TAB).Append(
1007 sb.Append(prefix).Append(TAB).AppendFormat(
1011 sb.Append(prefix).Append(TAB).Append("return ERR_INVALID_DATA;\n");
1012 sb.Append(prefix).Append("}\n");
1013 sb.Append(prefix).AppendFormat("%sWriteInt32(%s.size());\n", parcelName.string(), name.c_str());
1014 sb.Append(prefix).AppendFormat("for (auto it = %s.begin(); it != %s.end(); ++it) {\n",
1018 EmitWriteVariable(parcelName, "(*it)", innerType, sb, prefix + TAB);
1019 sb.Append(prefix).Append("}\n");
1024 sb.Append(prefix).AppendFormat("if (%s.size() > static_cast<size_t>(MAP_MAX_SIZE)) {\n", name.c_str());
1026 sb.Append(prefix).Append(TAB).AppendFormat(
1029 sb.Append(prefix).Append(TAB).Append("return ERR_INVALID_DATA;\n");
1030 sb.Append(prefix).Append("}\n");
1031 sb.Append("\n");
1032 sb.Append(prefix).AppendFormat("%sWriteInt32(%s.size());\n", parcelName.string(), name.c_str());
1033 sb.Append(prefix).AppendFormat("for (auto it = %s.begin(); it != %s.end(); ++it) {\n",
1037 EmitWriteVariable(parcelName, "(it->first)", keyType, sb, prefix + TAB);
1038 EmitWriteVariable(parcelName, "(it->second)", valueType, sb, prefix + TAB);
1039 sb.Append(prefix).Append("}\n");
1043 EmitWriteVariableObject(parcelName, name, mt, sb, prefix);
1049 const String& parcelName, const std::string& name, MetaType* mt, StringBuilder& sb, const String& prefix)
1053 sb.Append(prefix).AppendFormat("if (!%sWriteString16(Str8ToStr16(%s))) {\n", parcelName.string(),
1056 sb.Append(prefix).Append(TAB).AppendFormat("HiLog::Error(LABEL, \"Write [%s] failed!\");\n",
1059 sb.Append(prefix).Append(TAB).Append("return ERR_INVALID_DATA;\n");
1060 sb.Append(prefix).Append("}\n");
1063 sb.Append(prefix).AppendFormat("if (!%sWriteParcelable(&%s)) {\n", parcelName.string(), name.c_str());
1065 sb.Append(prefix).Append(TAB).AppendFormat("HiLog::Error(LABEL, \"Write [%s] failed!\");\n",
1068 sb.Append(prefix).Append(TAB).Append("return ERR_INVALID_DATA;\n");
1069 sb.Append(prefix).Append("}\n");
1072 sb.Append(prefix).AppendFormat("if (%s == nullptr) {\n", name.c_str());
1074 sb.Append(prefix).Append(TAB).AppendFormat("HiLog::Error(LABEL, \"%s is nullptr!\");\n", name.c_str());
1076 sb.Append(prefix).Append(TAB).Append("return ERR_INVALID_DATA;\n");
1077 sb.Append(prefix).Append("}\n");
1078 sb.Append(prefix).AppendFormat(
1081 sb.Append(prefix).Append(TAB).AppendFormat("HiLog::Error(LABEL, \"Write [%s] failed!\");\n",
1084 sb.Append(prefix).Append(TAB).Append("return ERR_INVALID_DATA;\n");
1085 sb.Append(prefix).Append("}\n");
1093 StringBuilder& sb, const String& prefix, bool emitType)
1098 sb.Append(prefix).AppendFormat("%s %s = %sReadInt32() == 1 ? true : false;\n",
1101 sb.Append(prefix).AppendFormat("%s = %sReadInt32() == 1 ? true : false;\n",
1109 sb.Append(prefix).AppendFormat("%s %s = (%s)%sReadInt32();\n", EmitType(mt, ATTR_IN, true).string(),
1112 sb.Append(prefix).AppendFormat("%s = (%s)%sReadInt32();\n", name.c_str(),
1118 sb.Append(prefix).AppendFormat("%s %s = %sReadInt32();\n",
1121 sb.Append(prefix).AppendFormat("%s = %sReadInt32();\n", name.c_str(), parcelName.string());
1126 sb.Append(prefix).AppendFormat("%s %s = %sReadInt64();\n",
1129 sb.Append(prefix).AppendFormat("%s = %sReadInt64();\n", name.c_str(), parcelName.string());
1133 EmitReadVariableFloat(parcelName, name, mt, sb, prefix, emitType);
1139 StringBuilder& sb, const String& prefix, bool emitType)
1144 sb.Append(prefix).AppendFormat("%s %s = %sReadFloat();\n",
1147 sb.Append(prefix).AppendFormat("%s = %sReadFloat();\n", name.c_str(), parcelName.string());
1152 sb.Append(prefix).AppendFormat("%s %s = %sReadDouble();\n",
1155 sb.Append(prefix).AppendFormat("%s = %sReadDouble();\n", name.c_str(), parcelName.string());
1159 EmitReadVariableComplex(parcelName, name, mt, sb, prefix, emitType);
1165 StringBuilder& sb, const String& prefix, bool emitType)
1170 sb.Append(prefix).AppendFormat("%s %s = Str16ToStr8(%sReadString16());\n",
1173 sb.Append(prefix).AppendFormat("%s = Str16ToStr8(%sReadString16());\n",
1179 sb.Append(prefix).AppendFormat("%s %s;\n", EmitType(mt, ATTR_IN, true).string(), name.c_str());
1181 sb.Append(prefix).AppendFormat("int32_t %sSize = %sReadInt32();\n", name.c_str(), parcelName.string());
1182 sb.Append(prefix).AppendFormat("for (int32_t i = 0; i < %sSize; ++i) {\n", name.c_str());
1185 EmitReadVariable(parcelName, "key", keyType, sb, prefix + TAB);
1186 EmitReadVariable(parcelName, "value", valueType, sb, prefix + TAB);
1187 sb.Append(prefix + TAB).AppendFormat("%s[key] = value;\n", name.c_str());
1188 sb.Append(prefix).Append("}\n");
1192 EmitReadVariableList(parcelName, name, mt, sb, prefix, emitType);
1198 StringBuilder& sb, const String& prefix, bool emitType)
1204 sb.Append(prefix).AppendFormat("%s %s;\n", EmitType(mt, ATTR_IN, true).string(), name.c_str());
1206 sb.Append(prefix).AppendFormat("int32_t %sSize = %sReadInt32();\n", name.c_str(), parcelName.string());
1207 sb.Append(prefix).AppendFormat("if (%sSize > static_cast<int32_t>(VECTOR_MAX_SIZE)) {\n", name.c_str());
1209 sb.Append(prefix + TAB)
1212 sb.Append(prefix + TAB).Append("return ERR_INVALID_DATA;\n");
1213 sb.Append(prefix).Append("}\n");
1219 sb.Append(prefix).AppendFormat("for (int32_t %s = 0; %s < %sSize; ++%s) {\n",
1222 EmitReadVariable(parcelName, valueStr.c_str(), innerType, sb, prefix + TAB);
1224 sb.Append(prefix + TAB).AppendFormat("%s.push_back(*%s);\n", name.c_str(), valueStr.c_str());
1226 sb.Append(prefix + TAB).AppendFormat("%s.push_back(%s);\n", name.c_str(), valueStr.c_str());
1228 sb.Append(prefix).Append("}\n");
1232 EmitReadVariableObject(parcelName, name, mt, sb, prefix, emitType);
1238 StringBuilder& sb, const String& prefix, bool emitType)
1248 sb.Append(prefix).AppendFormat("std::unique_ptr<%s> %s(%sReadParcelable<%s>());\n\n",
1250 sb.Append(prefix).AppendFormat("if (!%s) {\n", name.c_str());
1252 sb.Append(prefix).Append(TAB).AppendFormat(
1255 sb.Append(prefix).Append(TAB).Append("return ERR_INVALID_DATA;\n");
1256 sb.Append(prefix).Append("}\n");
1258 sb.Append(prefix).AppendFormat("std::unique_ptr<%s> info(%sReadParcelable<%s>());\n",
1260 sb.Append(prefix).Append("if (info != nullptr) {\n");
1261 sb.Append(prefix).Append(TAB).AppendFormat("%s = *info;\n", name.c_str());
1262 sb.Append(prefix).Append("}\n\n");
1269 sb.Append(prefix).AppendFormat("%s %s = iface_cast<%s>(%sReadRemoteObject());\n",
1271 sb.Append(prefix).AppendFormat("if (%s == nullptr) {\n", name.c_str());
1273 sb.Append(prefix).Append(TAB).AppendFormat("HiLog::Error(LABEL, \"Read [%s] failed!\");\n",
1276 sb.Append(prefix).Append(TAB).AppendFormat("return ERR_INVALID_DATA;\n");
1277 sb.Append(prefix).Append("}\n\n");
1279 sb.Append(prefix).AppendFormat("%s = iface_cast<%s>(%sReadRemoteObject());\n",
1289 void CppCodeEmitter::EmitLocalVariable(MetaParameter* mp, StringBuilder& sb, const String& prefix)
1296 sb.Append(prefix).AppendFormat("%s %s;\n", EmitType(mt, ATTR_IN, true).string(), name.c_str());
1298 sb.Append(prefix).AppendFormat("%s %s;\n", EmitType(mt, ATTR_IN, true).string(), name.c_str());
1302 void CppCodeEmitter::EmitReturnParameter(const String& name, MetaType* mt, StringBuilder& sb)
1319 sb.Append(name);
1526 StringBuilder sb;
1533 sb.Append('_');
1535 sb.Append(tolower(c));
1537 sb.Append(c);
1541 return sb.ToString().Replace('.', '/');
1560 StringBuilder sb;
1566 sb.Append('_');
1568 sb.Append(c);
1570 sb.Append(toupper(c));
1574 return sb.ToString();