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