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