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 #ifndef OHOS_IDL_HDI_ARRAYTYPE_EMITTER_H
17 #define OHOS_IDL_HDI_ARRAYTYPE_EMITTER_H
18 
19 #include "codegen/HDI/hdi_type_emitter.h"
20 
21 namespace OHOS {
22 namespace Idl {
23 class HdiArrayTypeEmitter : public HdiTypeEmitter {
24 public:
SetElementEmitter(const AutoPtr<HdiTypeEmitter> & elementEmitter)25     inline void SetElementEmitter(const AutoPtr<HdiTypeEmitter> &elementEmitter)
26     {
27         elementEmitter_ = elementEmitter;
28     }
29 
30     TypeKind GetTypeKind() override;
31 
32     std::string EmitCType(TypeMode mode = TypeMode::NO_MODE) const override;
33 
34     std::string EmitCppType(TypeMode mode = TypeMode::NO_MODE) const override;
35 
36     std::string EmitJavaType(TypeMode mode, bool isInnerType = false) const override;
37 
38     void EmitCWriteVar(TypeMode mode, const std::string &name, const std::string &gotoLabel,
39         StringBuilder &sb, const std::string &prefix) const override;
40 
41     void EmitCProxyWriteOutVar(const std::string &name, const std::string &gotoLabel, StringBuilder &sb,
42         const std::string &prefix) const override;
43 
44     void EmitCProxyReadVar(const std::string &name, bool isInnerType, const std::string &gotoLabel, StringBuilder &sb,
45         const std::string &prefix) const override;
46 
47     void EmitCStubReadVar(const std::string &name, const std::string &gotoLabel, StringBuilder &sb,
48         const std::string &prefix) const override;
49 
50     void  EmitCStubReadOutVar(const std::string &memFlagName, const std::string &name,
51         const std::string &gotoLabel, StringBuilder &sb, const std::string &prefix) const override;
52 
53     void EmitCppWriteVar(const std::string &parcelName, const std::string &name, StringBuilder &sb,
54         const std::string &prefix, unsigned int innerLevel = 0) const override;
55 
56     void EmitCppReadVar(const std::string &name, StringBuilder &sb, const std::string &prefix,
57         TypeMode mode, unsigned int innerLevel = 0) const override;
58 
59     void EmitCMarshalling(const std::string &name, StringBuilder &sb, const std::string &prefix) const override;
60 
61     void EmitCUnMarshalling(const std::string &name, const std::string &gotoLabel, StringBuilder &sb,
62         const std::string &prefix, std::vector<std::string> &freeObjStatements) const override;
63 
64     void EmitCppMarshalling(const std::string &parcelName, const std::string &name, StringBuilder &sb,
65         const std::string &prefix, unsigned int innerLevel = 0) const override;
66 
67     void EmitCppUnMarshalling(const std::string &parcelName, const std::string &name, StringBuilder &sb,
68         const std::string &prefix, unsigned int innerLevel = 0) const override;
69 
70     void EmitMemoryRecycle(const std::string &name, bool ownership, StringBuilder &sb,
71         const std::string &prefix) const override;
72 
73     void EmitJavaWriteVar(const std::string &parcelName, const std::string &name, StringBuilder &sb,
74         const std::string &prefix, TypeMode mode = TypeMode::NO_MODE) const override;
75 
76     void EmitJavaReadVar(const std::string &parcelName,
77         const std::string &name, StringBuilder &sb, const std::string &prefix) const override;
78 
79     void EmitJavaReadInnerVar(const std::string &parcelName, const std::string &name, bool isInner,
80         StringBuilder &sb, const std::string &prefix) const override;
81 
82     // c methods about reading and writing array with pod element
83 
84     void EmitCWriteMethods(UtilMethodMap &methods, const std::string &prefix, const std::string &methodPrefix,
85         bool isDecl) const override;
86 
87     void EmitCReadMethods(UtilMethodMap &methods, const std::string &prefix, const std::string &methodPrefix,
88         bool isDecl) const override;
89 
90     void EmitCStubReadMethods(UtilMethodMap &methods, const std::string &prefix, const std::string &methodPrefix,
91         bool isDecl) const override;
92 
93     void EmitCStubReadMethodBody(StringBuilder &sb, const std::string &prefix) const;
94 
95     // c methods about reading and writing string array
96 
97     void EmitCWriteStrArrayMethods(
98         UtilMethodMap &methods, const std::string &prefix, const std::string &methodPrefix, bool isDecl) const;
99 
100     void EmitCReadStrArrayMethods(
101         UtilMethodMap &methods, const std::string &prefix, const std::string &methodPrefix, bool isDecl) const;
102 
103     void EmitCReadStrArrayMethodBody(StringBuilder &sb, const std::string &prefix) const;
104 
105     void EmitCCheckParamOfReadStringArray(StringBuilder &sb, const std::string &prefix) const;
106 
107     void EmitCStubReadStrArrayMethods(
108         UtilMethodMap &methods, const std::string &prefix, const std::string &methodPrefix, bool isDecl) const;
109 
110     void EmitCStubReadStrArrayMethodBody(StringBuilder &sb, const std::string &prefix) const;
111 
112     void EmitCStubReadStrArrayFree(StringBuilder &sb, const std::string &prefix) const;
113 
114     // cpp methods about reading and writing array with pod element
115 
116     void EmitCppWriteMethods(UtilMethodMap &methods, const std::string &prefix, const std::string &methodPrefix,
117         bool isDecl) const override;
118 
119     void EmitCppReadMethods(UtilMethodMap &methods, const std::string &prefix, const std::string &methodPrefix,
120         bool isDecl) const override;
121 
122 protected:
123     void EmitJavaWriteArrayVar(
124         const std::string &parcelName, const std::string &name, StringBuilder &sb, const std::string &prefix) const;
125 
126     void EmitCMallocVar(const std::string &name, const std::string &lenName,
127         const std::string &gotoLabel, StringBuilder &sb, const std::string &prefix) const;
128 
129     void EmitCStringElementUnMarshalling(const std::string &name, const std::string &gotoLabel, StringBuilder &sb,
130         const std::string &newPrefix, std::vector<std::string> &freeObjStatements) const;
131 
132     void EmitCElementUnMarshallingReadLen(const std::string &lenName, const std::string &gotoLabel,
133     StringBuilder &sb, const std::string &prefix) const;
134 
135     void EmitCReadMethodsBody(StringBuilder &sb, const std::string &prefix) const;
136 
137     AutoPtr<HdiTypeEmitter> elementEmitter_;
138 };
139 
140 class HdiListTypeEmitter : public HdiArrayTypeEmitter {
141 public:
HdiListTypeEmitter()142     HdiListTypeEmitter() : HdiArrayTypeEmitter()
143     {
144         isPod_ = false;
145     }
146 
147     TypeKind GetTypeKind() override;
148 
149     std::string EmitJavaType(TypeMode mode, bool isInnerType = false) const override;
150 
151     void EmitJavaWriteVar(const std::string &parcelName, const std::string &name, StringBuilder &sb,
152         const std::string &prefix, TypeMode mode = TypeMode::NO_MODE) const override;
153 
154     void EmitJavaReadVar(const std::string &parcelName, const std::string &name, StringBuilder &sb,
155         const std::string &prefix) const override;
156 
157     void EmitJavaReadInnerVar(const std::string &parcelName, const std::string &name, bool isInner, StringBuilder &sb,
158         const std::string &prefix) const override;
159 };
160 } // namespace Idl
161 } // namespace OHOS
162 
163 #endif // OHOS_IDL_HDI_ARRAYTYPE_EMITTER_H