• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef INTERFACE_H_
18 
19 #define INTERFACE_H_
20 
21 #include "Scope.h"
22 #include <vector>
23 
24 namespace android {
25 
26 struct Method;
27 struct InterfaceAndMethod;
28 
29 struct Interface : public Scope {
30     Interface(const char* localName, const Location& location, Scope* parent, Interface* super);
31 
32     bool addMethod(Method *method);
33     bool addAllReservedMethods();
34 
35     bool isElidableType() const override;
36     bool isInterface() const override;
37     bool isBinder() const override;
isRootTypeInterface38     bool isRootType() const { return mSuperType == nullptr; }
isIBaseInterface39     bool isIBase() const { return fqName() == gIBaseFqName; }
40     std::string typeName() const override;
41 
42     const Interface *superType() const;
43 
44     Method *lookupMethod(std::string name) const;
45     // Super type chain to root type.
46     // First element is superType().
47     std::vector<const Interface *> superTypeChain() const;
48     // Super type chain to root type, including myself.
49     // First element is this.
50     std::vector<const Interface *> typeChain() const;
51 
52     // user defined methods (explicit definition in HAL files)
53     const std::vector<Method *> &userDefinedMethods() const;
54     // HIDL reserved methods (every interface has these implicitly defined)
55     const std::vector<Method *> &hidlReservedMethods() const;
56     // the sum of userDefinedMethods() and hidlReservedMethods().
57     std::vector<Method *> methods() const;
58 
59     // userDefinedMethods() for all super type + methods()
60     // The order will be as follows (in the transaction code order):
61     // great-great-...-great-grand parent->userDefinedMethods()
62     // ...
63     // parent->userDefinedMethods()
64     // this->userDefinedMethods()
65     // this->hidlReservedMethods()
66     std::vector<InterfaceAndMethod> allMethodsFromRoot() const;
67 
68     // aliases for corresponding methods in this->fqName()
69     std::string getBaseName() const;
70     std::string getProxyName() const;
71     std::string getStubName() const;
72     std::string getPassthroughName() const;
73     std::string getHwName() const;
74     FQName getProxyFqName() const;
75     FQName getStubFqName() const;
76     FQName getPassthroughFqName() const;
77 
78     std::string getCppType(
79             StorageMode mode,
80             bool specifyNamespaces) const override;
81 
82     std::string getJavaType(bool forInitializer) const override;
83     std::string getVtsType() const override;
84 
85     void emitReaderWriter(
86             Formatter &out,
87             const std::string &name,
88             const std::string &parcelObj,
89             bool parcelObjIsPointer,
90             bool isReader,
91             ErrorMode mode) const override;
92 
93     status_t emitGlobalTypeDeclarations(Formatter &out) const override;
94     status_t emitTypeDefinitions(
95             Formatter &out, const std::string prefix) const override;
96 
97     void emitJavaReaderWriter(
98             Formatter &out,
99             const std::string &parcelObj,
100             const std::string &argName,
101             bool isReader) const override;
102 
103     status_t emitVtsAttributeType(Formatter &out) const override;
104 
105     status_t emitVtsAttributeDeclaration(Formatter &out) const;
106     status_t emitVtsMethodDeclaration(Formatter &out) const;
107 
108     bool hasOnewayMethods() const;
109 
110     bool isJavaCompatible() const override;
111 
112 private:
113     Interface *mSuperType;
114     std::vector<Method *> mUserMethods;
115     std::vector<Method *> mReservedMethods;
116     mutable bool mIsJavaCompatibleInProgress;
117     bool fillPingMethod(Method *method) const;
118     bool fillDescriptorChainMethod(Method *method) const;
119     bool fillGetDescriptorMethod(Method *method) const;
120     bool fillHashChainMethod(Method *method) const;
121     bool fillSyspropsChangedMethod(Method *method) const;
122     bool fillLinkToDeathMethod(Method *method) const;
123     bool fillUnlinkToDeathMethod(Method *method) const;
124     bool fillSetHALInstrumentationMethod(Method *method) const;
125     bool fillGetDebugInfoMethod(Method *method) const;
126     bool fillDebugMethod(Method *method) const;
127 
128     DISALLOW_COPY_AND_ASSIGN(Interface);
129 };
130 
131 // An interface / method tuple.
132 struct InterfaceAndMethod {
InterfaceAndMethodInterfaceAndMethod133     InterfaceAndMethod(const Interface *iface, Method *method)
134         : mInterface(iface),
135           mMethod(method) {}
methodInterfaceAndMethod136     Method *method() const { return mMethod; }
interfaceInterfaceAndMethod137     const Interface *interface() const { return mInterface; }
138 private:
139     // do not own these objects.
140     const Interface *mInterface;
141     Method *mMethod;
142 };
143 
144 }  // namespace android
145 
146 #endif  // INTERFACE_H_
147 
148