• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "java_client_interface_code_emitter.h"
17 #include "util/file.h"
18 #include "util/logger.h"
19 
20 namespace OHOS {
21 namespace Idl {
ResolveDirectory(const std::string & targetDirectory)22 bool JavaClientInterfaceCodeEmitter::ResolveDirectory(const std::string &targetDirectory)
23 {
24     if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) {
25         directory_ = GetFileParentPath(targetDirectory);
26     } else {
27         return false;
28     }
29 
30     if (!File::CreateParentDir(directory_)) {
31         Logger::E("JavaClientInterfaceCodeEmitter", "Create '%s' failed!", directory_.c_str());
32         return false;
33     }
34 
35     return true;
36 }
37 
EmitCode()38 void JavaClientInterfaceCodeEmitter::EmitCode()
39 {
40     if (mode_ == GenMode::IPC) {
41         EmitInterfaceFile();
42     }
43 }
44 
EmitInterfaceFile()45 void JavaClientInterfaceCodeEmitter::EmitInterfaceFile()
46 {
47     std::string filePath =
48         File::AdapterPath(StringHelper::Format("%s/%s.java", directory_.c_str(), FileName(interfaceName_).c_str()));
49     File file(filePath, File::WRITE);
50     StringBuilder sb;
51     EmitLicense(sb);
52     EmitPackage(sb);
53     sb.Append("\n");
54     EmitInterfaceImports(sb);
55     sb.Append("\n");
56     EmitInterfaceDefinition(sb);
57 
58     std::string data = sb.ToString();
59     file.WriteData(data.c_str(), data.size());
60     file.Flush();
61     file.Close();
62 }
63 
EmitInterfaceImports(StringBuilder & sb) const64 void JavaClientInterfaceCodeEmitter::EmitInterfaceImports(StringBuilder &sb) const
65 {
66     EmitInterfaceCorelibImports(sb);
67     EmitInterfaceSelfDefinedTypeImports(sb);
68     EmitInterfaceDBinderImports(sb);
69 }
70 
EmitInterfaceCorelibImports(StringBuilder & sb) const71 void JavaClientInterfaceCodeEmitter::EmitInterfaceCorelibImports(StringBuilder &sb) const
72 {
73     bool includeList = false;
74     bool includeMap = false;
75 
76     const AST::TypeStringMap &types = ast_->GetTypes();
77     for (const auto &pair : types) {
78         AutoPtr<ASTType> type = pair.second;
79         switch (type->GetTypeKind()) {
80             case TypeKind::TYPE_LIST: {
81                 if (!includeList) {
82                     sb.Append("import java.util.List;\n");
83                     includeList = true;
84                 }
85                 break;
86             }
87             case TypeKind::TYPE_MAP: {
88                 if (!includeMap) {
89                     sb.Append("import java.util.Map;\n");
90                     sb.Append("import java.util.HashMap;\n");
91                     includeMap = true;
92                 }
93                 break;
94             }
95             default:
96                 break;
97         }
98     }
99 }
100 
EmitInterfaceDBinderImports(StringBuilder & sb) const101 void JavaClientInterfaceCodeEmitter::EmitInterfaceDBinderImports(StringBuilder &sb) const
102 {
103     sb.Append("import ohos.rpc.IRemoteBroker;\n");
104     sb.Append("import ohos.rpc.RemoteException;\n");
105 }
106 
EmitInterfaceSelfDefinedTypeImports(StringBuilder & sb) const107 void JavaClientInterfaceCodeEmitter::EmitInterfaceSelfDefinedTypeImports(StringBuilder &sb) const
108 {
109     for (const auto &importPair : ast_->GetImports()) {
110         AutoPtr<AST> import = importPair.second;
111         sb.AppendFormat("import %s;\n", import->GetFullName().c_str());
112     }
113 }
114 
EmitInterfaceDefinition(StringBuilder & sb)115 void JavaClientInterfaceCodeEmitter::EmitInterfaceDefinition(StringBuilder &sb)
116 {
117     sb.AppendFormat("public interface %s extends IRemoteBroker {\n", interface_->GetName().c_str());
118     EmitInterfaceMethods(sb, TAB);
119     sb.Append("}");
120 }
121 
EmitInterfaceMethods(StringBuilder & sb,const std::string & prefix) const122 void JavaClientInterfaceCodeEmitter::EmitInterfaceMethods(StringBuilder &sb, const std::string &prefix) const
123 {
124     for (const auto &method : interface_->GetMethodsBySystem(Options::GetInstance().GetSystemLevel())) {
125         EmitInterfaceMethod(method, sb, prefix);
126         sb.Append("\n");
127     }
128 }
129 
EmitInterfaceMethod(const AutoPtr<ASTMethod> & method,StringBuilder & sb,const std::string & prefix) const130 void JavaClientInterfaceCodeEmitter::EmitInterfaceMethod(
131     const AutoPtr<ASTMethod> &method, StringBuilder &sb, const std::string &prefix) const
132 {
133     if (method->GetParameterNumber() == 0) {
134         sb.Append(prefix).AppendFormat("int %s() throws RemoteException;\n", MethodName(method->GetName()).c_str());
135     } else {
136         StringBuilder paramStr;
137         paramStr.Append(prefix).AppendFormat("int %s(", MethodName(method->GetName()).c_str());
138         for (size_t i = 0; i < method->GetParameterNumber(); i++) {
139             AutoPtr<ASTParameter> param = method->GetParameter(i);
140             EmitInterfaceMethodParameter(param, paramStr, "");
141             if (i + 1 < method->GetParameterNumber()) {
142                 paramStr.Append(", ");
143             }
144         }
145 
146         paramStr.Append(") throws RemoteException;");
147         sb.Append(SpecificationParam(paramStr, prefix + TAB));
148         sb.Append("\n");
149     }
150 }
151 } // namespace Idl
152 } // namespace OHOS
153