/*
**
** 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/KeyAttestationPackageInfo.h"

#include <binder/Parcel.h>

namespace android {
namespace security {
namespace keymaster {

status_t KeyAttestationPackageInfo::writeToParcel(Parcel* parcel) const {
    auto rc = parcel->writeString16(packageName_);
    if (rc != NO_ERROR) return rc;
    rc = parcel->writeInt32(versionCode_);
    if (rc != NO_ERROR) return rc;
    return parcel->writeParcelableVector(signatures_);
}

status_t KeyAttestationPackageInfo::readFromParcel(const Parcel* parcel) {
    auto rc = parcel->readString16(&packageName_);
    if (rc != NO_ERROR) return rc;
    rc = parcel->readInt32(&versionCode_);
    if (rc != NO_ERROR) return rc;

    std::unique_ptr<std::vector<std::unique_ptr<content::pm::Signature>>> temp_vector;
    rc = parcel->readParcelableVector(&temp_vector);
    if (rc != NO_ERROR) return rc;
    signatures_.reset(temp_vector.release());
    return NO_ERROR;
}

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