Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a8bc472e authored by Yu Shan's avatar Yu Shan
Browse files

Add ParcelableUtils.

Add some helper functions to manage parsing/marshaling large
parcelable.

Test: None.
Bug: 200737967
Change-Id: I48729915aafe6d23de725e38ca5f653ba3147253
parent d39d6ee4
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include <aidl/android/hardware/automotive/vehicle/FuelType.h>
#include <aidl/android/hardware/automotive/vehicle/GetValueRequest.h>
#include <aidl/android/hardware/automotive/vehicle/GetValueResult.h>
#include <aidl/android/hardware/automotive/vehicle/GetValueResults.h>
#include <aidl/android/hardware/automotive/vehicle/Obd2CommonIgnitionMonitors.h>
#include <aidl/android/hardware/automotive/vehicle/Obd2FuelSystemStatus.h>
#include <aidl/android/hardware/automotive/vehicle/Obd2FuelType.h>
@@ -34,6 +35,7 @@
#include <aidl/android/hardware/automotive/vehicle/PortLocationType.h>
#include <aidl/android/hardware/automotive/vehicle/SetValueRequest.h>
#include <aidl/android/hardware/automotive/vehicle/SetValueResult.h>
#include <aidl/android/hardware/automotive/vehicle/SetValueResults.h>
#include <aidl/android/hardware/automotive/vehicle/StatusCode.h>
#include <aidl/android/hardware/automotive/vehicle/VehicleApPowerStateReport.h>
#include <aidl/android/hardware/automotive/vehicle/VehicleApPowerStateReq.h>
+32 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@

#include <VehicleHalTypes.h>

#include <android-base/format.h>
#include <android-base/result.h>
#include <utils/Log.h>

@@ -208,6 +209,37 @@ std::string getErrorMsg(const ::android::base::Result<T>& result) {
    return result.error().message();
}

template <class T>
::ndk::ScopedAStatus toScopedAStatus(
        const ::android::base::Result<T>& result,
        ::aidl::android::hardware::automotive::vehicle::StatusCode status,
        std::string additionalErrorMsg) {
    if (result.ok()) {
        return ::ndk::ScopedAStatus::ok();
    }
    return ::ndk::ScopedAStatus::fromServiceSpecificErrorWithMessage(
            toInt(status),
            fmt::format("{}, error: {}", additionalErrorMsg, getErrorMsg(result)).c_str());
}

template <class T>
::ndk::ScopedAStatus toScopedAStatus(
        const ::android::base::Result<T>& result,
        ::aidl::android::hardware::automotive::vehicle::StatusCode status) {
    return toScopedAStatus(result, status, "");
}

template <class T>
::ndk::ScopedAStatus toScopedAStatus(const ::android::base::Result<T>& result) {
    return toScopedAStatus(result, getErrorCode(result));
}

template <class T>
::ndk::ScopedAStatus toScopedAStatus(const ::android::base::Result<T>& result,
                                     std::string additionalErrorMsg) {
    return toScopedAStatus(result, getErrorCode(result), additionalErrorMsg);
}

}  // namespace vehicle
}  // namespace automotive
}  // namespace hardware
+89 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef android_hardware_automotive_vehicle_aidl_impl_vhal_include_ParcelableUtils_H_
#define android_hardware_automotive_vehicle_aidl_impl_vhal_include_ParcelableUtils_H_

#include <LargeParcelableBase.h>
#include <VehicleHalTypes.h>
#include <VehicleUtils.h>

#include <memory>
#include <vector>

namespace android {
namespace hardware {
namespace automotive {
namespace vehicle {

template <class T1, class T2>
::ndk::ScopedAStatus vectorToStableLargeParcelable(std::vector<T1>&& values, T2* output) {
    auto result = ::android::automotive::car_binder_lib::LargeParcelableBase::
            parcelableVectorToStableLargeParcelable(values);
    if (!result.ok()) {
        return toScopedAStatus(
                result, ::aidl::android::hardware::automotive::vehicle::StatusCode::INTERNAL_ERROR);
    }
    auto& fd = result.value();
    if (fd == nullptr) {
        // If we no longer needs values, move it inside the payloads to avoid copying.
        output->payloads = std::move(values);
    } else {
        // Move the returned ScopedFileDescriptor pointer to ScopedFileDescriptor value in
        // 'sharedMemoryFd' field.
        output->sharedMemoryFd = std::move(*fd);
    }
    return ::ndk::ScopedAStatus::ok();
}

template <class T1, class T2>
::ndk::ScopedAStatus vectorToStableLargeParcelable(const std::vector<T1>& values, T2* output) {
    // Because 'values' is passed in as const reference, we have to do a copy here.
    std::vector<T1> valuesCopy = values;

    return vectorToStableLargeParcelable(std::move(valuesCopy), output);
}

template <class T1, class T2>
::android::base::expected<std::vector<T1>, ::ndk::ScopedAStatus> stableLargeParcelableToVector(
        const T2& largeParcelable) {
    ::android::base::Result<std::optional<std::vector<T1>>> result =
            ::android::automotive::car_binder_lib::LargeParcelableBase::
                    stableLargeParcelableToParcelableVector<T1>(largeParcelable.sharedMemoryFd);

    if (!result.ok()) {
        return ::android::base::unexpected(toScopedAStatus(
                result, ::aidl::android::hardware::automotive::vehicle::StatusCode::INVALID_ARG,
                "failed to parse large parcelable"));
    }

    if (!result.value().has_value()) {
        return ::android::base::unexpected(
                ::ndk::ScopedAStatus::fromServiceSpecificErrorWithMessage(
                        toInt(::aidl::android::hardware::automotive::vehicle::StatusCode::
                                      INVALID_ARG),
                        "empty request"));
    }

    return std::move(result.value().value());
}

}  // namespace vehicle
}  // namespace automotive
}  // namespace hardware
}  // namespace android

#endif  // android_hardware_automotive_vehicle_aidl_impl_vhal_include_ParcelableUtils_H_