Method.h revision b58f4185934a93fc511c03a8a970b31c5ea0dfca
116fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk/*
216fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk * Copyright (C) 2016 The Android Open Source Project
316fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk *
416fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk * Licensed under the Apache License, Version 2.0 (the "License");
516fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk * you may not use this file except in compliance with the License.
616fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk * You may obtain a copy of the License at
716fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk *
816fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk *      http://www.apache.org/licenses/LICENSE-2.0
916fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk *
1016fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk * Unless required by applicable law or agreed to in writing, software
1116fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk * distributed under the License is distributed on an "AS IS" BASIS,
1216fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1316fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk * See the License for the specific language governing permissions and
1416fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk * limitations under the License.
1516fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk */
1616fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk
1716fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk#ifndef METHOD_H_
1816fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk
1916fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk#define METHOD_H_
2016fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk
2116fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk#include <android-base/macros.h>
2216fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk#include <hidl-util/Formatter.h>
2316fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk#include <utils/Errors.h>
2416fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk#include <functional>
25448786cc5f3b64f770ae5995c831d6932080169aLucas Dupin#include <map>
26448786cc5f3b64f770ae5995c831d6932080169aLucas Dupin#include <set>
2716fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk#include <string>
2816fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk#include <vector>
2916fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk
3016fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk#include "Location.h"
3116fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk#include "Reference.h"
3216fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk
3316fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monknamespace android {
3416fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk
3516fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monkstruct Annotation;
3616fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monkstruct ConstantExpression;
3716fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monkstruct Formatter;
3816fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monkstruct ScalarType;
3916fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monkstruct Type;
4016fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monkstruct TypedVarVector;
4116fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk
4216fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monkenum MethodImplType {
4316fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    IMPL_INTERFACE,
4416fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    IMPL_PROXY,
4516fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    IMPL_STUB, // overrides the code in onTransact; IMPL_STUB_IMPL will be ignored
4616fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    IMPL_STUB_IMPL, // use this->method() instead of mImpl->method()
4716fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    IMPL_PASSTHROUGH,
4816fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk};
4916fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk
5016fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monkusing MethodImpl = std::map<MethodImplType, std::function<void(Formatter &)>>;
51448786cc5f3b64f770ae5995c831d6932080169aLucas Dupin
5216fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monkstruct Method {
53448786cc5f3b64f770ae5995c831d6932080169aLucas Dupin    Method(const char* name, std::vector<NamedReference<Type>*>* args,
54448786cc5f3b64f770ae5995c831d6932080169aLucas Dupin           std::vector<NamedReference<Type>*>* results, bool oneway,
5516fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk           std::vector<Annotation*>* annotations, const Location& location);
56448786cc5f3b64f770ae5995c831d6932080169aLucas Dupin
57448786cc5f3b64f770ae5995c831d6932080169aLucas Dupin    std::string name() const;
58448786cc5f3b64f770ae5995c831d6932080169aLucas Dupin    const std::vector<NamedReference<Type>*>& args() const;
5916fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    const std::vector<NamedReference<Type>*>& results() const;
60448786cc5f3b64f770ae5995c831d6932080169aLucas Dupin    bool isOneway() const { return mOneway; }
61448786cc5f3b64f770ae5995c831d6932080169aLucas Dupin    bool overridesCppImpl(MethodImplType type) const;
6216fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    bool overridesJavaImpl(MethodImplType type) const;
6316fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    void cppImpl(MethodImplType type, Formatter &out) const;
643be52dbfa6976bdcf551966beb9fc5591116735fAlison Cichowlas    void javaImpl(MethodImplType type, Formatter &out) const;
65448786cc5f3b64f770ae5995c831d6932080169aLucas Dupin    bool isHidlReserved() const { return mIsHidlReserved; }
6616fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    bool isHiddenFromJava() const;
6716fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    const std::vector<Annotation *> &annotations() const;
6816fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk
6916fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    std::vector<Reference<Type>*> getReferences();
7016fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    std::vector<const Reference<Type>*> getReferences() const;
7116fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk
7216fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    std::vector<ConstantExpression*> getConstantExpressions();
7316fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    std::vector<const ConstantExpression*> getConstantExpressions() const;
7416fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk
7516fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    // Make a copy with the same name, args, results, oneway, annotations.
7616fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    // Implementations, serial are not copied.
7716fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    Method *copySignature() const;
7816fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk
7916fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    void setSerialId(size_t serial);
8016fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    size_t getSerialId() const;
8116fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk
8216fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    // Fill implementation for HIDL reserved methods. mIsHidlReserved will be
8316fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    // set to true.
8416fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    void fillImplementation(
8516fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk            size_t serial,
8616fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk            MethodImpl cppImpl,
8716fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk            MethodImpl javaImpl);
8816fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk
8916fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    void generateCppReturnType(Formatter &out, bool specifyNamespaces = true) const;
9016fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    void generateCppSignature(Formatter &out,
9116fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk                              const std::string &className = "",
9216fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk                              bool specifyNamespaces = true) const;
9316fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk
9416fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    bool hasEmptyCppArgSignature() const;
9516fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    void emitCppArgSignature(Formatter &out, bool specifyNamespaces = true) const;
9616fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    void emitCppResultSignature(Formatter &out, bool specifyNamespaces = true) const;
9716fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk
9816fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    void emitJavaArgSignature(Formatter &out) const;
9916fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    void emitJavaResultSignature(Formatter &out) const;
10016fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk
10116fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    const NamedReference<Type>* canElideCallback() const;
10216fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk
10316fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    void dumpAnnotations(Formatter &out) const;
10416fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk
10516fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    bool isJavaCompatible() const;
10616fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk
10716fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    const Location& location() const;
10816fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk
10916fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk   private:
11016fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    std::string mName;
11116fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    size_t mSerial = 0;
11216fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    std::vector<NamedReference<Type>*>* mArgs;
11316fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    std::vector<NamedReference<Type>*>* mResults;
11416fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    bool mOneway;
11516fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    std::vector<Annotation *> *mAnnotations;
11616fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk
11716fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    bool mIsHidlReserved = false;
11816fbd9dd1d2d407aa0bc096800af2630c218cde8Jason Monk    // The following fields have no meaning if mIsHidlReserved is false.
119    // hard-coded implementation for HIDL reserved methods.
120    MethodImpl mCppImpl;
121    MethodImpl mJavaImpl;
122
123    const Location& mLocation;
124
125    DISALLOW_COPY_AND_ASSIGN(Method);
126};
127
128struct TypedVarVector : public std::vector<NamedReference<Type>*> {
129    TypedVarVector() = default;
130
131    bool add(NamedReference<Type>* v);
132
133   private:
134    std::set<std::string> mNames;
135};
136
137}  // namespace android
138
139#endif  // METHOD_H_
140
141