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