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