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