• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 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_C_CLIENT_PROXY_CODE_EMITTER_H
10 #define OHOS_HDI_C_CLIENT_PROXY_CODE_EMITTER_H
11 
12 #include "codegen/c_code_emitter.h"
13 
14 namespace OHOS {
15 namespace HDI {
16 class CClientProxyCodeEmitter : public CCodeEmitter {
17 public:
CClientProxyCodeEmitter()18     CClientProxyCodeEmitter() : CCodeEmitter() {}
19 
20     ~CClientProxyCodeEmitter() override = default;
21 
22 private:
23     bool ResolveDirectory(const std::string &targetDirectory) override;
24 
25     void EmitCode() override;
26 
27     void EmitPassthroughProxySourceFile();
28 
29     void EmitPassthroughProxyInclusions(StringBuilder &sb);
30 
31     void EmitPassthroughGetInstanceMethod(StringBuilder &sb) const;
32 
33     void EmitPassthroughReleaseInstanceMethod(StringBuilder &sb) const;
34 
35     void EmitProxySourceFile();
36 
37     void EmitProxyDefinition(StringBuilder &sb) const;
38 
39     void EmitProxyInclusions(StringBuilder &sb);
40 
41     void GetHeaderOtherLibInclusions(HeaderFile::HeaderFileSet &headerFiles) const;
42 
43     void EmitProxyCallMethodImpl(StringBuilder &sb) const;
44 
45     void EmitProxyKernelCallMethodImpl(StringBuilder &sb) const;
46 
47     void EmitProxyMethodImpls(StringBuilder &sb);
48 
49     void EmitProxyMethodImpl(const AutoPtr<ASTMethod> &method, StringBuilder &sb);
50 
51     void EmitProxyMethodBody(const AutoPtr<ASTMethod> &method, StringBuilder &sb, const std::string &prefix);
52 
53     void EmitCreateBuf(const std::string &dataBufName,
54         const std::string &replyBufName, StringBuilder &sb, const std::string &prefix) const;
55 
56     void EmitCheckThisPointer(StringBuilder &sb, const std::string &prefix) const;
57 
58     void EmitWriteInterfaceToken(const std::string &dataBufName, StringBuilder &sb, const std::string &prefix) const;
59 
60     void EmitWriteFlagOfNeedSetMem(const AutoPtr<ASTMethod> &method,
61         const std::string &dataBufName, StringBuilder &sb, const std::string &prefix) const;
62 
63     void EmitReleaseBuf(const std::string &dataBufName,
64         const std::string &replyBufName, StringBuilder &sb, const std::string &prefix) const;
65 
66     void EmitReadProxyMethodParameter(const AutoPtr<ASTParameter> &param, const std::string &parcelName,
67         const std::string &gotoLabel, StringBuilder &sb, const std::string &prefix) const;
68 
69     void EmitStubCallMethod(const AutoPtr<ASTMethod> &method, StringBuilder &sb, const std::string &prefix);
70 
71     void EmitProxyAsObjectMethodImpl(StringBuilder &sb) const;
72 
73     void EmitProxyConstruction(StringBuilder &sb) const;
74 
75     void EmitProxyExternalMethodImpl(StringBuilder &sb);
76 
77 	// the get method for getting kernel driver client object
78     void EmitKernelProxyGetMethodImpl(StringBuilder &sb) const;
79 
80     void EmitKernelProxyGetInstanceMethodImpl(const std::string &objName, const std::string &serMajorName,
81         const std::string &serMinorName, const std::string &remoteName, const std::string &serviceName,
82         StringBuilder &sb) const;
83 
84     // the release metod for releasing kernel driver client object
85     void EmitKernelProxyReleaseMethodImpl(const std::string &remoteName, const std::string &recycleFuncName,
86         StringBuilder &sb) const;
87 
88     // the get method for getting interface object
89     void EmitIfaceProxyGetMethodImpl(const std::string &objName, const std::string &serMajorName,
90         const std::string &serMinorName, const std::string &remoteName, StringBuilder &sb);
91 
92     // the release metod for releasing interface obj
93     void EmitIfaceProxyReleaseMethodImpl(
94         const std::string &remoteName, const std::string &recycleFuncName, StringBuilder &sb) const;
95 
96     void EmitCbProxyReleaseMethodImpl(
97         const std::string &remoteName, const std::string &recycleFuncName, StringBuilder &sb) const;
98 
99     // the get method for getting driver client object
100     void EmitProxyGetMethodImpl(StringBuilder &sb) const;
101 
102     void EmitProxyGetInstanceMethodImpl(const std::string &objName, const std::string &serMajorName,
103         const std::string &serMinorName, const std::string &remoteName, const std::string &serviceName,
104         StringBuilder &sb) const;
105 
106     void EmitProxyGetRemoteService(const std::string &remoteName,
107         const std::string &serviceName, StringBuilder &sb, const std::string &prefix) const;
108 
109     void EmitProxySetInterfaceDesc(const std::string &remoteName, const std::string &recycleFuncName,
110         StringBuilder &sb, const std::string &prefix) const;
111 
112     void EmitProxyCreateProxyObject(const std::string &clientObjName, const std::string &remoteName,
113         const std::string &recycleFuncName, StringBuilder &sb, const std::string &prefix) const;
114 
115     void EmitProxyCheckVersion(const std::string &clientObjName, const std::string &serMajorName,
116         const std::string &serMinorName, StringBuilder &sb, const std::string &prefix) const;
117 
118     // the release metod for releasing driver client obj
119     void EmitProxyReleaseMethodImpl(StringBuilder &sb) const;
120 
121     void EmitProxyReleaseInstanceMethodImpl(const std::string &serviceName, const std::string &remoteName,
122         const std::string &recycleFuncName, StringBuilder &sb);
123 
124     void EmitProxyLoadOrUnLoadHdiImpl(const std::string &serviceName, bool isLoad, StringBuilder &sb,
125         const std::string &prefix) const;
126 
127     void GetUtilMethods(UtilMethodMap &methods) override;
128 
129     std::vector<std::string> freeObjStatements_;
130 };
131 } // namespace HDI
132 } // namespace OHOS
133 
134 #endif // OHOS_HDI_C_CLIENT_PROXY_CODE_EMITTER_H