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> ¶m, 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