• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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