• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3  *
4  * HDF is dual licensed: you can use it either under the terms of
5  * the GPL, or the BSD license, at your option.
6  * See the LICENSE file in the root of this repository for complete details.
7  */
8 
9 #include "codegen/java_client_interface_code_emitter.h"
10 #include "util/file.h"
11 #include "util/logger.h"
12 
13 namespace OHOS {
14 namespace HDI {
ResolveDirectory(const std::string & targetDirectory)15 bool JavaClientInterfaceCodeEmitter::ResolveDirectory(const std::string &targetDirectory)
16 {
17     if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) {
18         directory_ = GetFileParentPath(targetDirectory);
19     } else {
20         return false;
21     }
22 
23     if (!File::CreateParentDir(directory_)) {
24         Logger::E("JavaClientInterfaceCodeEmitter", "Create '%s' failed!", directory_.c_str());
25         return false;
26     }
27 
28     return true;
29 }
30 
EmitCode()31 void JavaClientInterfaceCodeEmitter::EmitCode()
32 {
33     if (mode_ == GenMode::IPC) {
34         EmitInterfaceFile();
35     }
36 }
37 
EmitInterfaceFile()38 void JavaClientInterfaceCodeEmitter::EmitInterfaceFile()
39 {
40     std::string filePath =
41         File::AdapterPath(StringHelper::Format("%s/%s.java", directory_.c_str(), FileName(interfaceName_).c_str()));
42     File file(filePath, File::WRITE);
43     StringBuilder sb;
44 
45     EmitLicense(sb);
46     EmitPackage(sb);
47     sb.Append("\n");
48     EmitInterfaceImports(sb);
49     sb.Append("\n");
50     EmitInterfaceDefinition(sb);
51 
52     std::string data = sb.ToString();
53     file.WriteData(data.c_str(), data.size());
54     file.Flush();
55     file.Close();
56 }
57 
EmitInterfaceImports(StringBuilder & sb) const58 void JavaClientInterfaceCodeEmitter::EmitInterfaceImports(StringBuilder &sb) const
59 {
60     EmitInterfaceCorelibImports(sb);
61     EmitInterfaceSelfDefinedTypeImports(sb);
62     EmitInterfaceDBinderImports(sb);
63 }
64 
EmitInterfaceCorelibImports(StringBuilder & sb) const65 void JavaClientInterfaceCodeEmitter::EmitInterfaceCorelibImports(StringBuilder &sb) const
66 {
67     bool includeList = false;
68     bool includeMap = false;
69 
70     const AST::TypeStringMap &types = ast_->GetTypes();
71     for (const auto &pair : types) {
72         AutoPtr<ASTType> type = pair.second;
73         switch (type->GetTypeKind()) {
74             case TypeKind::TYPE_LIST: {
75                 if (!includeList) {
76                     sb.Append("import java.util.List;\n");
77                     includeList = true;
78                 }
79                 break;
80             }
81             case TypeKind::TYPE_MAP: {
82                 if (!includeMap) {
83                     sb.Append("import java.util.Map;\n");
84                     sb.Append("import java.util.HashMap;\n");
85                     includeMap = true;
86                 }
87                 break;
88             }
89             default:
90                 break;
91         }
92     }
93 }
94 
EmitInterfaceDBinderImports(StringBuilder & sb) const95 void JavaClientInterfaceCodeEmitter::EmitInterfaceDBinderImports(StringBuilder &sb) const
96 {
97     sb.Append("import ohos.rpc.IRemoteBroker;\n");
98     sb.Append("import ohos.rpc.RemoteException;\n");
99 }
100 
EmitInterfaceSelfDefinedTypeImports(StringBuilder & sb) const101 void JavaClientInterfaceCodeEmitter::EmitInterfaceSelfDefinedTypeImports(StringBuilder &sb) const
102 {
103     for (const auto &importPair : ast_->GetImports()) {
104         AutoPtr<AST> import = importPair.second;
105         sb.AppendFormat("import %s;\n", import->GetFullName().c_str());
106     }
107 }
108 
EmitInterfaceDefinition(StringBuilder & sb)109 void JavaClientInterfaceCodeEmitter::EmitInterfaceDefinition(StringBuilder &sb)
110 {
111     sb.AppendFormat("public interface %s extends IRemoteBroker {\n", interface_->GetName().c_str());
112     EmitInterfaceMethods(sb, TAB);
113     sb.Append("}");
114 }
115 
EmitInterfaceMethods(StringBuilder & sb,const std::string & prefix) const116 void JavaClientInterfaceCodeEmitter::EmitInterfaceMethods(StringBuilder &sb, const std::string &prefix) const
117 {
118     for (const auto &method : interface_->GetMethodsBySystem(Options::GetInstance().GetSystemLevel())) {
119         EmitInterfaceMethod(method, sb, prefix);
120         sb.Append("\n");
121     }
122 }
123 
EmitInterfaceMethod(const AutoPtr<ASTMethod> & method,StringBuilder & sb,const std::string & prefix) const124 void JavaClientInterfaceCodeEmitter::EmitInterfaceMethod(
125     const AutoPtr<ASTMethod> &method, StringBuilder &sb, const std::string &prefix) const
126 {
127     if (method->GetParameterNumber() == 0) {
128         sb.Append(prefix).AppendFormat("int %s() throws RemoteException;\n", MethodName(method->GetName()).c_str());
129     } else {
130         StringBuilder paramStr;
131         paramStr.Append(prefix).AppendFormat("int %s(", MethodName(method->GetName()).c_str());
132         for (size_t i = 0; i < method->GetParameterNumber(); i++) {
133             AutoPtr<ASTParameter> param = method->GetParameter(i);
134             EmitInterfaceMethodParameter(param, paramStr, "");
135             if (i + 1 < method->GetParameterNumber()) {
136                 paramStr.Append(", ");
137             }
138         }
139 
140         paramStr.Append(") throws RemoteException;");
141         sb.Append(SpecificationParam(paramStr, prefix + TAB));
142         sb.Append("\n");
143     }
144 }
145 
EmitInterfaceMethodParameter(const AutoPtr<ASTParameter> & param,StringBuilder & sb,const std::string & prefix) const146 void JavaClientInterfaceCodeEmitter::EmitInterfaceMethodParameter(
147     const AutoPtr<ASTParameter> &param, StringBuilder &sb, const std::string &prefix) const
148 {
149     sb.Append(prefix).Append(param->EmitJavaParameter());
150 }
151 } // namespace HDI
152 } // namespace OHOS
153