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 #ifndef OHOS_HDI_ASTARRAYTYPE_H
10 #define OHOS_HDI_ASTARRAYTYPE_H
11 
12 #include "ast/ast_type.h"
13 #include "util/autoptr.h"
14 
15 namespace OHOS {
16 namespace HDI {
17 class ASTArrayType : public ASTType {
18 public:
ASTArrayType()19     ASTArrayType() : ASTType(TypeKind::TYPE_ARRAY, false), elementType_() {}
20 
SetElementType(const AutoPtr<ASTType> & elementType)21     inline void SetElementType(const AutoPtr<ASTType> &elementType)
22     {
23         elementType_ = elementType;
24     }
25 
GetElementType()26     inline AutoPtr<ASTType> GetElementType()
27     {
28         return elementType_;
29     }
30 
31     bool IsArrayType() override;
32 
33     bool HasInnerType(TypeKind innerTypeKind) const override;
34 
35     std::string ToString() const override;
36 
37     TypeKind GetTypeKind() override;
38 
39     std::string EmitCType(TypeMode mode = TypeMode::NO_MODE) const override;
40 
41     std::string EmitCppType(TypeMode mode = TypeMode::NO_MODE) const override;
42 
43     std::string EmitJavaType(TypeMode mode, bool isInnerType = false) const override;
44 
45     void EmitCWriteVar(const std::string &parcelName, const std::string &name, const std::string &ecName,
46         const std::string &gotoLabel, StringBuilder &sb, const std::string &prefix) const override;
47 
48     void EmitCProxyWriteOutVar(const std::string &parcelName, const std::string &name, const std::string &ecName,
49         const std::string &gotoLabel, StringBuilder &sb, const std::string &prefix) const override;
50 
51     void EmitCProxyReadVar(const std::string &parcelName, const std::string &name, bool isInnerType,
52         const std::string &ecName, const std::string &gotoLabel, StringBuilder &sb,
53         const std::string &prefix) const override;
54 
55     void EmitCStubReadVar(const std::string &parcelName, const std::string &name, const std::string &ecName,
56         const std::string &gotoLabel, StringBuilder &sb, const std::string &prefix) const override;
57 
58     void EmitCStubReadOutVar(const std::string &buffSizeName, const std::string &memFlagName,
59         const std::string &parcelName, const std::string &name, const std::string &ecName, const std::string &gotoLabel,
60         StringBuilder &sb, const std::string &prefix) const override;
61 
62     void EmitCppWriteVar(const std::string &parcelName, const std::string &name, StringBuilder &sb,
63         const std::string &prefix, unsigned int innerLevel = 0) const override;
64 
65     void EmitCppReadVar(const std::string &parcelName, const std::string &name, StringBuilder &sb,
66         const std::string &prefix, bool initVariable, unsigned int innerLevel = 0) const override;
67 
68     void EmitCMarshalling(const std::string &name, StringBuilder &sb, const std::string &prefix) const override;
69 
70     void EmitCUnMarshalling(const std::string &name, const std::string &gotoLabel, StringBuilder &sb,
71         const std::string &prefix, std::vector<std::string> &freeObjStatements) const override;
72 
73     void EmitCppMarshalling(const std::string &parcelName, const std::string &name, StringBuilder &sb,
74         const std::string &prefix, unsigned int innerLevel = 0) const override;
75 
76     void EmitCppUnMarshalling(const std::string &parcelName, const std::string &name, StringBuilder &sb,
77         const std::string &prefix, bool emitType, unsigned int innerLevel = 0) const override;
78 
79     void EmitMemoryRecycle(const std::string &name, bool ownership, StringBuilder &sb,
80         const std::string &prefix) const override;
81 
82     void EmitJavaWriteVar(const std::string &parcelName,
83         const std::string &name, StringBuilder &sb, const std::string &prefix) const override;
84 
85     void EmitJavaReadVar(const std::string &parcelName,
86         const std::string &name, StringBuilder &sb, const std::string &prefix) const override;
87 
88     void EmitJavaReadInnerVar(const std::string &parcelName, const std::string &name, bool isInner,
89         StringBuilder &sb, const std::string &prefix) const override;
90 
91     void RegisterWriteMethod(Language language, SerMode mode, UtilMethodMap &methods) const override;
92 
93     void RegisterReadMethod(Language language, SerMode mode, UtilMethodMap &methods) const override;
94 
95     void RegisterWritePodArrayMethod(Language language, SerMode mode, UtilMethodMap &methods) const;
96 
97     void RegisterWriteStringArrayMethod(Language language, SerMode mode, UtilMethodMap &methods) const;
98 
99     void RegisterReadPodArrayMethod(Language language, SerMode mode, UtilMethodMap &methods) const;
100 
101     void RegisterReadStringArrayMethod(Language language, SerMode mode, UtilMethodMap &methods) const;
102 
103     // c methods about reading and writing array with pod element
104 
105     void EmitCWriteMethods(
106         StringBuilder &sb, const std::string &prefix, const std::string &methodPrefix, bool isDecl) const;
107 
108     void EmitCReadMethods(
109         StringBuilder &sb, const std::string &prefix, const std::string &methodPrefix, bool isDecl) const;
110 
111     void EmitCStubReadMethods(
112         StringBuilder &sb, const std::string &prefix, const std::string &methodPrefix, bool isDecl) const;
113 
114     void EmitCStubReadMethodBody(StringBuilder &sb, const std::string &prefix) const;
115 
116     // c methods about reading and writing string array
117 
118     void EmitCWriteStrArrayMethods(
119         StringBuilder &sb, const std::string &prefix, const std::string &methodPrefix, bool isDecl) const;
120 
121     void EmitCReadStrArrayMethods(
122         StringBuilder &sb, const std::string &prefix, const std::string &methodPrefix, bool isDecl) const;
123 
124     void EmitCReadStrArrayMethodBody(StringBuilder &sb, const std::string &prefix) const;
125 
126     void EmitCCheckParamOfReadStringArray(StringBuilder &sb, const std::string &prefix) const;
127 
128     void EmitCStubReadStrArrayMethods(
129         StringBuilder &sb, const std::string &prefix, const std::string &methodPrefix, bool isDecl) const;
130 
131     void EmitCStubReadStrArrayMethodBody(StringBuilder &sb, const std::string &prefix) const;
132 
133     void EmitCStubReadStrArrayFree(StringBuilder &sb, const std::string &prefix) const;
134 
135     // cpp methods about reading and writing array with pod element
136 
137     void EmitCppWriteMethods(
138         StringBuilder &sb, const std::string &prefix, const std::string &methodPrefix, bool isDecl) const;
139 
140     void EmitCppReadMethods(
141         StringBuilder &sb, const std::string &prefix, const std::string &methodPrefix, bool isDecl) const;
142 
143 protected:
144     void EmitJavaWriteArrayVar(
145         const std::string &parcelName, const std::string &name, StringBuilder &sb, const std::string &prefix) const;
146 
147     void EmitCMallocVar(const std::string &name, const std::string &lenName, bool isClient, const std::string &ecName,
148         const std::string &gotoLabel, StringBuilder &sb, const std::string &prefix) const;
149 
150     void EmitCStringElementUnMarshalling(const std::string &name, const std::string &gotoLabel, StringBuilder &sb,
151         const std::string &newPrefix, std::vector<std::string> &freeObjStatements) const;
152 
153     AutoPtr<ASTType> elementType_;
154 };
155 
156 class ASTListType : public ASTArrayType {
157 public:
ASTListType()158     ASTListType() : ASTArrayType()
159     {
160         typeKind_ = TypeKind::TYPE_LIST;
161         isPod_ = false;
162     }
163 
164     bool IsArrayType() override;
165 
166     bool IsListType() override;
167 
168     std::string ToString() const override;
169 
170     TypeKind GetTypeKind() override;
171 
172     std::string EmitJavaType(TypeMode mode, bool isInnerType = false) const override;
173 
174     void EmitJavaWriteVar(const std::string &parcelName, const std::string &name, StringBuilder &sb,
175         const std::string &prefix) const override;
176 
177     void EmitJavaReadVar(const std::string &parcelName, const std::string &name, StringBuilder &sb,
178         const std::string &prefix) const override;
179 
180     void EmitJavaReadInnerVar(const std::string &parcelName, const std::string &name, bool isInner, StringBuilder &sb,
181         const std::string &prefix) const override;
182 };
183 } // namespace HDI
184 } // namespace OHOS
185 
186 #endif // OHOS_HDI_ASTARRAYTYPE_H