1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #ifndef ANDROID_HARDWARE_CONVERSION_HELPER_HIDL_H 18*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_HARDWARE_CONVERSION_HELPER_HIDL_H 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include <functional> 21*ec779b8eSAndroid Build Coastguard Worker 22*ec779b8eSAndroid Build Coastguard Worker #include <hidl/HidlSupport.h> 23*ec779b8eSAndroid Build Coastguard Worker #include <system/audio.h> 24*ec779b8eSAndroid Build Coastguard Worker 25*ec779b8eSAndroid Build Coastguard Worker namespace android { 26*ec779b8eSAndroid Build Coastguard Worker 27*ec779b8eSAndroid Build Coastguard Worker template<typename HalResult> 28*ec779b8eSAndroid Build Coastguard Worker class ConversionHelperHidl { 29*ec779b8eSAndroid Build Coastguard Worker protected: 30*ec779b8eSAndroid Build Coastguard Worker using HalResultConverter = std::function<status_t(const HalResult&)>; 31*ec779b8eSAndroid Build Coastguard Worker const std::string mClassName; 32*ec779b8eSAndroid Build Coastguard Worker ConversionHelperHidl(std::string_view className,HalResultConverter resultConv)33*ec779b8eSAndroid Build Coastguard Worker ConversionHelperHidl(std::string_view className, HalResultConverter resultConv) 34*ec779b8eSAndroid Build Coastguard Worker : mClassName(className), mResultConverter(resultConv) {} 35*ec779b8eSAndroid Build Coastguard Worker 36*ec779b8eSAndroid Build Coastguard Worker template<typename R, typename T> processReturn(const char * funcName,const::android::hardware::Return<R> & ret,T * retval)37*ec779b8eSAndroid Build Coastguard Worker status_t processReturn(const char* funcName, 38*ec779b8eSAndroid Build Coastguard Worker const ::android::hardware::Return<R>& ret, T *retval) { 39*ec779b8eSAndroid Build Coastguard Worker if (ret.isOk()) { 40*ec779b8eSAndroid Build Coastguard Worker // This way it also works for enum class to unscoped enum conversion. 41*ec779b8eSAndroid Build Coastguard Worker *retval = static_cast<T>(static_cast<R>(ret)); 42*ec779b8eSAndroid Build Coastguard Worker return OK; 43*ec779b8eSAndroid Build Coastguard Worker } 44*ec779b8eSAndroid Build Coastguard Worker return processReturn(funcName, ret); 45*ec779b8eSAndroid Build Coastguard Worker } 46*ec779b8eSAndroid Build Coastguard Worker 47*ec779b8eSAndroid Build Coastguard Worker template<typename T> processReturn(const char * funcName,const::android::hardware::Return<T> & ret)48*ec779b8eSAndroid Build Coastguard Worker status_t processReturn(const char* funcName, const ::android::hardware::Return<T>& ret) { 49*ec779b8eSAndroid Build Coastguard Worker if (!ret.isOk()) { 50*ec779b8eSAndroid Build Coastguard Worker emitError(funcName, ret.description().c_str()); 51*ec779b8eSAndroid Build Coastguard Worker } 52*ec779b8eSAndroid Build Coastguard Worker return ret.isOk() ? OK : FAILED_TRANSACTION; 53*ec779b8eSAndroid Build Coastguard Worker } 54*ec779b8eSAndroid Build Coastguard Worker processReturn(const char * funcName,const::android::hardware::Return<HalResult> & ret)55*ec779b8eSAndroid Build Coastguard Worker status_t processReturn(const char* funcName, 56*ec779b8eSAndroid Build Coastguard Worker const ::android::hardware::Return<HalResult>& ret) { 57*ec779b8eSAndroid Build Coastguard Worker if (!ret.isOk()) { 58*ec779b8eSAndroid Build Coastguard Worker emitError(funcName, ret.description().c_str()); 59*ec779b8eSAndroid Build Coastguard Worker } 60*ec779b8eSAndroid Build Coastguard Worker return ret.isOk() ? mResultConverter(ret) : FAILED_TRANSACTION; 61*ec779b8eSAndroid Build Coastguard Worker } 62*ec779b8eSAndroid Build Coastguard Worker 63*ec779b8eSAndroid Build Coastguard Worker template<typename T> processReturn(const char * funcName,const::android::hardware::Return<T> & ret,HalResult retval)64*ec779b8eSAndroid Build Coastguard Worker status_t processReturn( 65*ec779b8eSAndroid Build Coastguard Worker const char* funcName, const ::android::hardware::Return<T>& ret, HalResult retval) { 66*ec779b8eSAndroid Build Coastguard Worker if (!ret.isOk()) { 67*ec779b8eSAndroid Build Coastguard Worker emitError(funcName, ret.description().c_str()); 68*ec779b8eSAndroid Build Coastguard Worker } 69*ec779b8eSAndroid Build Coastguard Worker return ret.isOk() ? mResultConverter(retval) : FAILED_TRANSACTION; 70*ec779b8eSAndroid Build Coastguard Worker } 71*ec779b8eSAndroid Build Coastguard Worker getClassName()72*ec779b8eSAndroid Build Coastguard Worker const std::string& getClassName() const { 73*ec779b8eSAndroid Build Coastguard Worker return mClassName; 74*ec779b8eSAndroid Build Coastguard Worker } 75*ec779b8eSAndroid Build Coastguard Worker 76*ec779b8eSAndroid Build Coastguard Worker private: 77*ec779b8eSAndroid Build Coastguard Worker HalResultConverter mResultConverter; 78*ec779b8eSAndroid Build Coastguard Worker emitError(const char * funcName,const char * description)79*ec779b8eSAndroid Build Coastguard Worker void emitError(const char* funcName, const char* description) { 80*ec779b8eSAndroid Build Coastguard Worker ALOGE("%s %p %s: %s (from rpc)", mClassName.c_str(), this, funcName, description); 81*ec779b8eSAndroid Build Coastguard Worker } 82*ec779b8eSAndroid Build Coastguard Worker }; 83*ec779b8eSAndroid Build Coastguard Worker 84*ec779b8eSAndroid Build Coastguard Worker } // namespace android 85*ec779b8eSAndroid Build Coastguard Worker 86*ec779b8eSAndroid Build Coastguard Worker #endif // ANDROID_HARDWARE_CONVERSION_HELPER_HIDL_H 87