/*
**
** Copyright 2016, 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.
*/

#include "include/keystore/KeyAttestationApplicationId.h"

#include <binder/Parcel.h>

namespace android {
namespace security {
namespace keymaster {

KeyAttestationApplicationId::KeyAttestationApplicationId() = default;

KeyAttestationApplicationId::KeyAttestationApplicationId(
    std::optional<KeyAttestationPackageInfo> package)
    : packageInfos_(new std::vector<std::optional<KeyAttestationPackageInfo>>()) {
    packageInfos_->push_back(std::move(package));
}

KeyAttestationApplicationId::KeyAttestationApplicationId(PackageInfoVector packages)
    : packageInfos_(std::make_shared<PackageInfoVector>(std::move(packages))) {}

status_t KeyAttestationApplicationId::writeToParcel(Parcel* parcel) const {
    return parcel->writeParcelableVector(packageInfos_);
}

status_t KeyAttestationApplicationId::readFromParcel(const Parcel* parcel) {
    std::optional<std::vector<std::optional<KeyAttestationPackageInfo>>> temp_vector;
    auto rc = parcel->readParcelableVector(&temp_vector);
    if (rc != NO_ERROR) return rc;
    packageInfos_.reset();
    if (temp_vector) {
        packageInfos_ = std::make_shared<PackageInfoVector>(std::move(*temp_vector));
    }
    return NO_ERROR;
}

}  // namespace keymaster
}  // namespace security
}  // namespace android
