ConversionHelperHidl.h revision 4bcd67fbb4eca3654ea929742bdf6ccc7c70daec
14bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard/* 24bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * Copyright (C) 2016 The Android Open Source Project 34bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * 44bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * Licensed under the Apache License, Version 2.0 (the "License"); 54bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * you may not use this file except in compliance with the License. 64bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * You may obtain a copy of the License at 74bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * 84bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * http://www.apache.org/licenses/LICENSE-2.0 94bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * 104bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * Unless required by applicable law or agreed to in writing, software 114bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * distributed under the License is distributed on an "AS IS" BASIS, 124bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * See the License for the specific language governing permissions and 144bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * limitations under the License. 154bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard */ 164bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 174bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard#ifndef ANDROID_HARDWARE_CONVERSION_HELPER_HIDL_H 184bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard#define ANDROID_HARDWARE_CONVERSION_HELPER_HIDL_H 194bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 204bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard#include <android/hardware/audio/2.0/types.h> 214bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard#include <hidl/HidlSupport.h> 224bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard#include <utils/String8.h> 234bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 244bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocardusing ::android::hardware::audio::V2_0::ParameterValue; 254bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocardusing ::android::hardware::Return; 264bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocardusing ::android::hardware::hidl_string; 274bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocardusing ::android::hardware::hidl_vec; 284bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 294bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocardnamespace android { 304bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 314bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocardclass ConversionHelperHidl { 324bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard protected: 334bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard static status_t keysFromHal(const String8& keys, hidl_vec<hidl_string> *hidlKeys); 344bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard static status_t parametersFromHal(const String8& kvPairs, hidl_vec<ParameterValue> *hidlParams); 354bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard static void parametersToHal(const hidl_vec<ParameterValue>& parameters, String8 *values); 364bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 374bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard ConversionHelperHidl(const char* className); 384bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 394bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard template<typename R, typename T> 404bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard status_t processReturn(const char* funcName, const Return<R>& ret, T *retval) { 414bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard if (ret.isOk()) { 424bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard // This way it also works for enum class to unscoped enum conversion. 434bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard *retval = static_cast<T>(static_cast<R>(ret)); 444bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard return OK; 454bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard } 464bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard return processReturn(funcName, ret); 474bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard } 484bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 494bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard template<typename T> 504bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard status_t processReturn(const char* funcName, const Return<T>& ret) { 514bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard if (!ret.isOk()) { 524bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard emitError(funcName, ret.description().c_str()); 534bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard } 544bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard return ret.isOk() ? OK : FAILED_TRANSACTION; 554bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard } 564bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 574bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard status_t processReturn(const char* funcName, const Return<hardware::audio::V2_0::Result>& ret) { 584bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard if (!ret.isOk()) { 594bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard emitError(funcName, ret.description().c_str()); 604bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard } 614bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard return ret.isOk() ? analyzeResult(ret) : FAILED_TRANSACTION; 624bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard } 634bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 644bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard template<typename T> 654bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard status_t processReturn( 664bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard const char* funcName, const Return<T>& ret, hardware::audio::V2_0::Result retval) { 674bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard if (!ret.isOk()) { 684bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard emitError(funcName, ret.description().c_str()); 694bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard } 704bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard return ret.isOk() ? analyzeResult(retval) : FAILED_TRANSACTION; 714bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard } 724bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 734bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard private: 744bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard const char* mClassName; 754bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 764bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard static status_t analyzeResult(const hardware::audio::V2_0::Result& result); 774bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 784bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard void emitError(const char* funcName, const char* description); 794bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard}; 804bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 814bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard} // namespace android 824bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 834bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard#endif // ANDROID_HARDWARE_CONVERSION_HELPER_HIDL_H 84