1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 *
4 * HDF is dual licensed: you can use it either under the terms of
5 * the GPL, or the BSD license, at your option.
6 * See the LICENSE file in the root of this repository for complete details.
7 */
8
9 #include "ast/ast_interface_type.h"
10 #include "util/string_builder.h"
11
12 namespace OHOS {
13 namespace HDI {
SetNamespace(const AutoPtr<ASTNamespace> & nspace)14 void ASTInterfaceType::SetNamespace(const AutoPtr<ASTNamespace>& nspace)
15 {
16 ASTType::SetNamespace(nspace);
17 if (namespace_ != nullptr) {
18 namespace_->AddInterface(this);
19 }
20 }
21
AddMethod(const AutoPtr<ASTMethod> & method)22 void ASTInterfaceType::AddMethod(const AutoPtr<ASTMethod>& method)
23 {
24 if (method == nullptr) {
25 return;
26 }
27 methods_.push_back(method);
28 }
29
GetMethod(size_t index)30 AutoPtr<ASTMethod> ASTInterfaceType::GetMethod(size_t index)
31 {
32 if (index >= methods_.size()) {
33 return nullptr;
34 }
35
36 return methods_[index];
37 }
38
IsInterfaceType()39 bool ASTInterfaceType::IsInterfaceType()
40 {
41 return true;
42 }
43
ToString()44 String ASTInterfaceType::ToString()
45 {
46 return name_;
47 }
48
Dump(const String & prefix)49 String ASTInterfaceType::Dump(const String& prefix)
50 {
51 StringBuilder sb;
52
53 sb.Append(prefix);
54
55 std::vector<String> attributes;
56 if (isOneWay_) attributes.push_back("oneway");
57 if (isCallback_) attributes.push_back("callback");
58 if (isFull_) attributes.push_back("full");
59 if (isLite_) attributes.push_back("lite");
60 if (attributes.size() > 0) {
61 sb.Append("[");
62 for (size_t i = 0; i < attributes.size(); i++) {
63 sb.Append(attributes[i]);
64 if (i < attributes.size() - 1) {
65 sb.Append(',');
66 }
67 }
68 sb.Append("] ");
69 }
70
71 sb.AppendFormat("interface %s {\n", name_.string());
72
73 for (auto method : methods_) {
74 String info = method->Dump(prefix + " ");
75 sb.Append(info);
76 if (method != methods_[methods_.size() - 1]) {
77 sb.Append('\n');
78 }
79 }
80 sb.Append(prefix).Append("}\n");
81
82 return sb.ToString();
83 }
84
GetTypeKind()85 TypeKind ASTInterfaceType::GetTypeKind()
86 {
87 return TypeKind::TYPE_INTERFACE;
88 }
89
GetFullName() const90 String ASTInterfaceType::GetFullName() const
91 {
92 return namespace_->ToString() + name_;
93 }
94
EmitCType(TypeMode mode) const95 String ASTInterfaceType::EmitCType(TypeMode mode) const
96 {
97 switch (mode) {
98 case TypeMode::NO_MODE:
99 return String::Format("struct %s", name_.string());
100 case TypeMode::PARAM_IN:
101 return String::Format("struct %s*", name_.string());
102 case TypeMode::PARAM_OUT:
103 return String::Format("struct %s**", name_.string());
104 case TypeMode::LOCAL_VAR:
105 return String::Format("struct %s*", name_.string());
106 default:
107 return "unknow type";
108 }
109 }
110
EmitCppType(TypeMode mode) const111 String ASTInterfaceType::EmitCppType(TypeMode mode) const
112 {
113 switch (mode) {
114 case TypeMode::NO_MODE:
115 return String::Format("%s", name_.string());
116 case TypeMode::PARAM_IN:
117 return String::Format("const sptr<%s>&", name_.string());
118 case TypeMode::PARAM_OUT:
119 return String::Format("sptr<%s>&", name_.string());
120 case TypeMode::LOCAL_VAR:
121 return String::Format("sptr<%s>", name_.string());
122 default:
123 return "unknow type";
124 }
125 }
126
EmitJavaType(TypeMode mode,bool isInnerType) const127 String ASTInterfaceType::EmitJavaType(TypeMode mode, bool isInnerType) const
128 {
129 return name_;
130 }
131
EmitCWriteVar(const String & parcelName,const String & name,const String & ecName,const String & gotoLabel,StringBuilder & sb,const String & prefix) const132 void ASTInterfaceType::EmitCWriteVar(const String& parcelName, const String& name, const String& ecName,
133 const String& gotoLabel, StringBuilder& sb, const String& prefix) const
134 {
135 sb.Append(prefix).AppendFormat("if (HdfSbufWriteRemoteService(%s, %s->AsObject(%s)) != 0) {\n",
136 parcelName.string(), name.string(), name.string());
137 sb.Append(prefix + g_tab).AppendFormat(
138 "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string());
139 sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string());
140 sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string());
141 sb.Append(prefix).Append("}\n");
142 }
143
EmitCProxyReadVar(const String & parcelName,const String & name,bool isInnerType,const String & ecName,const String & gotoLabel,StringBuilder & sb,const String & prefix) const144 void ASTInterfaceType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType,
145 const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const
146 {
147 String remoteName = String::Format("%sRemote", name.string());
148 String miName = name_.StartsWith("I") ? name_.Substring(1) : name_;
149
150 sb.Append(prefix).AppendFormat("struct HdfRemoteService *%s = HdfSbufReadRemoteService(%s);\n",
151 remoteName.string(), parcelName.string());
152 sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", remoteName.string());
153 sb.Append(prefix + g_tab).AppendFormat(
154 "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", remoteName.string());
155 sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string());
156 sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string());
157 sb.Append(prefix).Append("}\n");
158
159 sb.Append(prefix).AppendFormat("*%s = %sGet(%s);\n",
160 name.string(), miName.string(), remoteName.string());
161 }
162
EmitCStubReadVar(const String & parcelName,const String & name,const String & ecName,const String & gotoLabel,StringBuilder & sb,const String & prefix) const163 void ASTInterfaceType::EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName,
164 const String& gotoLabel, StringBuilder& sb, const String& prefix) const
165 {
166 String remoteName = String::Format("%sRemote", name.string());
167 String miName = name_.StartsWith("I") ? name_.Substring(1) : name_;
168
169 sb.Append(prefix).AppendFormat("struct HdfRemoteService *%s = HdfSbufReadRemoteService(%s);\n",
170 remoteName.string(), parcelName.string());
171 sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", remoteName.string());
172 sb.Append(prefix + g_tab).AppendFormat(
173 "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", remoteName.string());
174 sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string());
175 sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string());
176 sb.Append(prefix).Append("}\n");
177 sb.Append(prefix).AppendFormat("%s = %sGet(%s);\n",
178 name.string(), miName.string(), remoteName.string());
179 }
180
EmitCppWriteVar(const String & parcelName,const String & name,StringBuilder & sb,const String & prefix,unsigned int innerLevel) const181 void ASTInterfaceType::EmitCppWriteVar(const String& parcelName, const String& name, StringBuilder& sb,
182 const String& prefix, unsigned int innerLevel) const
183 {
184 sb.Append(prefix).AppendFormat("if (!%s.WriteRemoteObject(%s->AsObject())) {\n",
185 parcelName.string(), name.string());
186 sb.Append(prefix + g_tab).AppendFormat(
187 "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string());
188 sb.Append(prefix + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n");
189 sb.Append(prefix).Append("}\n");
190 }
191
EmitCppReadVar(const String & parcelName,const String & name,StringBuilder & sb,const String & prefix,bool initVariable,unsigned int innerLevel) const192 void ASTInterfaceType::EmitCppReadVar(const String& parcelName, const String& name, StringBuilder& sb,
193 const String& prefix, bool initVariable, unsigned int innerLevel) const
194 {
195 if (initVariable) {
196 sb.Append(prefix).AppendFormat("sptr<%s> %s;\n", name_.string(), name.string());
197 }
198
199 String remoteName = "remote";
200 sb.Append(prefix).Append("{\n");
201 sb.Append(prefix + g_tab).AppendFormat("sptr<IRemoteObject> %s = %s.ReadRemoteObject();\n", remoteName.string(),
202 parcelName.string());
203 sb.Append(prefix + g_tab).AppendFormat("if (%s == nullptr) {\n", remoteName.string());
204 sb.Append(prefix + g_tab + g_tab).AppendFormat(
205 "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", remoteName.string());
206 sb.Append(prefix + g_tab + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n");
207 sb.Append(prefix + g_tab).Append("}\n\n");
208 sb.Append(prefix + g_tab).AppendFormat("%s = iface_cast<%s>(%s);\n", name.string(), name_.string(),
209 remoteName.string());
210 sb.Append(prefix + g_tab).AppendFormat("if (%s == nullptr) {\n", name.string());
211 sb.Append(prefix + g_tab + g_tab).AppendFormat(
212 "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string());
213 sb.Append(prefix + g_tab + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n");
214 sb.Append(prefix + g_tab).Append("}\n");
215 sb.Append(prefix).Append("}\n");
216 }
217
EmitJavaWriteVar(const String & parcelName,const String & name,StringBuilder & sb,const String & prefix) const218 void ASTInterfaceType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb,
219 const String& prefix) const
220 {
221 sb.Append(prefix).AppendFormat("%s.writeRemoteObject(%s.asObject());\n", parcelName.string(),
222 name.string());
223 }
224
EmitJavaReadVar(const String & parcelName,const String & name,StringBuilder & sb,const String & prefix) const225 void ASTInterfaceType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb,
226 const String& prefix) const
227 {
228 String stubName = name_.StartsWith("I") ? (name_.Substring(1) + "Stub") : (name_ + "Stub");
229 sb.Append(prefix).AppendFormat("%s = %s.asInterface(%s.readRemoteObject());\n",
230 name.string(), stubName.string(), parcelName.string());
231 }
232
EmitJavaReadInnerVar(const String & parcelName,const String & name,bool isInner,StringBuilder & sb,const String & prefix) const233 void ASTInterfaceType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner,
234 StringBuilder& sb, const String& prefix) const
235 {
236 String stubName = name_.StartsWith("I") ? (name_.Substring(1) + "Stub") : (name_ + "Stub");
237 sb.Append(prefix).AppendFormat("%s %s = %s.asInterface(%s.readRemoteObject());\n",
238 EmitJavaType(TypeMode::NO_MODE).string(), name.string(), stubName.string(), parcelName.string());
239 }
240 } // namespace HDI
241 } // namespace OHOS