Interface.h revision f5cc2f74e86504f7904a0a24e7fcc00fa19cd579
11aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber/*
21aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * Copyright (C) 2016 The Android Open Source Project
31aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber *
41aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
51aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * you may not use this file except in compliance with the License.
61aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * You may obtain a copy of the License at
71aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber *
81aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
91aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber *
101aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * Unless required by applicable law or agreed to in writing, software
111aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
121aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * See the License for the specific language governing permissions and
141aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * limitations under the License.
151aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber */
161aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber
17c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#ifndef INTERFACE_H_
18c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
19c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#define INTERFACE_H_
20c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
21c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#include "Scope.h"
2210fe0b55e774903fe37b658458053527da8b5a53Yifan Hong#include <vector>
23c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
24c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android {
25c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
26c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberstruct Method;
2710fe0b55e774903fe37b658458053527da8b5a53Yifan Hongstruct InterfaceAndMethod;
28c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
29c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberstruct Interface : public Scope {
30a4b53d0da8c1c6889c361fd30b913adc364163bcYifan Hong    Interface(const char *localName, const Location &location, Interface *super);
31c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
3214ee6749f12bcd43477fe8110fbec38e15376b40Steven Moreland    bool addMethod(Method *method);
33c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
34b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    bool isElidableType() const override;
35a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huber    bool isInterface() const override;
36295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber    bool isBinder() const override;
37fe95aa243eb53df9cb46ca74192e760d7520b611Yifan Hong    bool isRootType() const { return mSuperType == nullptr; }
38c89340422f53046bfe24ff3e529161f9194120f8Yifan Hong    bool isIBase() const { return fqName() == gIBaseFqName; }
3930bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland    std::string typeName() const override;
40c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
416cb08cf9f021a01d9d2b1eaec6729aac6ae70708Andreas Huber    const Interface *superType() const;
42c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
4314ee6749f12bcd43477fe8110fbec38e15376b40Steven Moreland    Method *lookupMethod(std::string name) const;
44fe95aa243eb53df9cb46ca74192e760d7520b611Yifan Hong    // Super type chain to root type.
45fe95aa243eb53df9cb46ca74192e760d7520b611Yifan Hong    // First element is superType().
46fe95aa243eb53df9cb46ca74192e760d7520b611Yifan Hong    std::vector<const Interface *> superTypeChain() const;
4710fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    // Super type chain to root type, including myself.
4810fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    // First element is this.
4910fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    std::vector<const Interface *> typeChain() const;
5010fe0b55e774903fe37b658458053527da8b5a53Yifan Hong
5110fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    // user defined methods (explicit definition in HAL files)
5210fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    const std::vector<Method *> &userDefinedMethods() const;
5310fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    // HIDL reserved methods (every interface has these implicitly defined)
5410fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    const std::vector<Method *> &hidlReservedMethods() const;
5510fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    // the sum of userDefinedMethods() and hidlReservedMethods().
5610fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    std::vector<Method *> methods() const;
5710fe0b55e774903fe37b658458053527da8b5a53Yifan Hong
5810fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    // userDefinedMethods() for all super type + methods()
5910fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    // The order will be as follows (in the transaction code order):
6010fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    // great-great-...-great-grand parent->userDefinedMethods()
6110fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    // ...
6210fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    // parent->userDefinedMethods()
6310fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    // this->userDefinedMethods()
6410fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    // this->hidlReservedMethods()
6510fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    std::vector<InterfaceAndMethod> allMethodsFromRoot() const;
66881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
67eefe4f2405c3cb0f1d164bdb748e5d0ded3624f9Yifan Hong    // aliases for corresponding methods in this->fqName()
684078631353d6d34db21c890d1870e796eca6ea38Steven Moreland    std::string getBaseName() const;
69eefe4f2405c3cb0f1d164bdb748e5d0ded3624f9Yifan Hong    std::string getProxyName() const;
70eefe4f2405c3cb0f1d164bdb748e5d0ded3624f9Yifan Hong    std::string getStubName() const;
71eefe4f2405c3cb0f1d164bdb748e5d0ded3624f9Yifan Hong    std::string getPassthroughName() const;
72eefe4f2405c3cb0f1d164bdb748e5d0ded3624f9Yifan Hong    std::string getHwName() const;
7351a6509db3078657a2401069c37515504b40c12cYifan Hong    FQName getProxyFqName() const;
7451a6509db3078657a2401069c37515504b40c12cYifan Hong    FQName getStubFqName() const;
7551a6509db3078657a2401069c37515504b40c12cYifan Hong    FQName getPassthroughFqName() const;
76158655a90308d8e5f03dc28b8330d5b0cce038f0Yifan Hong
774c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    std::string getCppType(
784c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber            StorageMode mode,
794c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber            bool specifyNamespaces) const override;
80881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
814ed1347cd29e6e07acad368891bb03078c798abaYifan Hong    std::string getJavaType(bool forInitializer) const override;
82a588b23323213c525bf34dc0562679195afe611eZhuoyao Zhang    std::string getVtsType() const override;
832831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
84881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    void emitReaderWriter(
85881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            Formatter &out,
86881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &name,
87881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            const std::string &parcelObj,
88881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool parcelObjIsPointer,
89881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            bool isReader,
90881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            ErrorMode mode) const override;
91881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
92f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    status_t emitGlobalTypeDeclarations(Formatter &out) const override;
93f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    status_t emitTypeDefinitions(
94f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong            Formatter &out, const std::string prefix) const override;
95f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong
962831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    void emitJavaReaderWriter(
972831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            Formatter &out,
982831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &parcelObj,
992831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            const std::string &argName,
1002831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            bool isReader) const override;
1012831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
102864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    status_t emitVtsAttributeType(Formatter &out) const override;
103864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
104864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    status_t emitVtsAttributeDeclaration(Formatter &out) const;
105864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    status_t emitVtsMethodDeclaration(Formatter &out) const;
1065158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
10769e7c70e72dff0734d542b737ba8bb1178244218Steven Moreland    bool hasOnewayMethods() const;
10869e7c70e72dff0734d542b737ba8bb1178244218Steven Moreland
10970a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber    bool isJavaCompatible() const override;
11070a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber
111c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huberprivate:
1126cb08cf9f021a01d9d2b1eaec6729aac6ae70708Andreas Huber    Interface *mSuperType;
11310fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    std::vector<Method *> mUserMethods;
11410fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    std::vector<Method *> mReservedMethods;
115ea081b35840e687dfe7a5c11d4a546f2bf2db99eAndreas Huber    mutable bool mIsJavaCompatibleInProgress;
11610fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    Method *createDescriptorChainMethod() const;
117af712c083e79fb9990e56677cf4c80eacb9c3d3bMartijn Coenen    Method *createSyspropsChangedMethod() const;
118115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    Method *createLinkToDeathMethod() const;
119115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    Method *createUnlinkToDeathMethod() const;
120dd85c5c9cc6ff58737809668d993c5e6eab673d7Zhuoyao Zhang    Method *createSetHALInstrumentationMethod() const;
121c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
122c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber    DISALLOW_COPY_AND_ASSIGN(Interface);
123c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber};
124c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
12510fe0b55e774903fe37b658458053527da8b5a53Yifan Hong// An interface / method tuple.
12610fe0b55e774903fe37b658458053527da8b5a53Yifan Hongstruct InterfaceAndMethod {
12710fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    InterfaceAndMethod(const Interface *iface, Method *method)
12810fe0b55e774903fe37b658458053527da8b5a53Yifan Hong        : mInterface(iface),
12910fe0b55e774903fe37b658458053527da8b5a53Yifan Hong          mMethod(method) {}
13010fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    Method *method() const { return mMethod; }
13110fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    const Interface *interface() const { return mInterface; }
13210fe0b55e774903fe37b658458053527da8b5a53Yifan Hongprivate:
13310fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    // do not own these objects.
13410fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    const Interface *mInterface;
13510fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    Method *mMethod;
13610fe0b55e774903fe37b658458053527da8b5a53Yifan Hong};
13710fe0b55e774903fe37b658458053527da8b5a53Yifan Hong
138c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}  // namespace android
139c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
140c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#endif  // INTERFACE_H_
141c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
142