/*

 * Copyright (C) 2025 Huawei Device Co., Ltd.

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



namespace OHOS {

namespace Location {

BeaconFenceRequest::BeaconFenceRequest()

{

    callback_ = nullptr;

    fenceId_ = "";

    fenceExtensionAbilityName_ = "";

    serviceUuid_ = "";

    serviceUuidMask_ = "";

}



BeaconFenceRequest::BeaconFenceRequest(BeaconFenceRequest& beaconFenceRequest)

{

    beacon_ =  beaconFenceRequest.GetBeaconFence();

    callback_ = beaconFenceRequest.GetBeaconFenceTransitionCallback();

    fenceExtensionAbilityName_ = beaconFenceRequest.GetFenceExtensionAbilityName();

    fenceId_ = beaconFenceRequest.GetFenceId();

}



BeaconFenceRequest::~BeaconFenceRequest() {}



std::shared_ptr<BeaconFence> BeaconFenceRequest::GetBeaconFence()

{

    return beacon_;

}



void BeaconFenceRequest::SetBeaconFence(std::shared_ptr<BeaconFence>& beacon)

{

    beacon_ = beacon;

}



void BeaconFenceRequest::ReadFromParcel(Parcel& parcel)

{

    std::unique_lock<std::mutex> lock(beaconFenceRequestMutex_);

    std::shared_ptr<BeaconFence> beacon = std::make_shared<BeaconFence>();

    beacon->SetIdentifier(Str16ToStr8(parcel.ReadString16()));

    beacon->SetBeaconFenceInfoType(static_cast<BeaconFenceInfoType>(parcel.ReadInt32()));

    BeaconManufactureData manufactureData;

    manufactureData.manufactureId = parcel.ReadInt32();

    parcel.ReadUInt8Vector(&manufactureData.manufactureData);

    parcel.ReadUInt8Vector(&manufactureData.manufactureDataMask);

    beacon->SetBeaconManufactureData(manufactureData);

    SetBeaconFence(beacon);

    callback_ = parcel.ReadObject<IRemoteObject>();

    fenceExtensionAbilityName_ = Str16ToStr8(parcel.ReadString16());

}



std::shared_ptr<BeaconFenceRequest> BeaconFenceRequest::UnmarshallingShared(Parcel& parcel)

{

    std::unique_ptr<BeaconFenceRequest> beaconFenceRequest = std::make_unique<BeaconFenceRequest>();

    beaconFenceRequest->ReadFromParcel(parcel);

    return beaconFenceRequest;

}



BeaconFenceRequest* BeaconFenceRequest::Unmarshalling(Parcel& parcel)

{

    auto beaconFenceRequest = new BeaconFenceRequest();

    beaconFenceRequest->ReadFromParcel(parcel);

    return beaconFenceRequest;

}



bool BeaconFenceRequest::Marshalling(Parcel& parcel) const

{

    std::unique_lock<std::mutex> lock(beaconFenceRequestMutex_);

    return parcel.WriteString16(Str8ToStr16(beacon_->GetIdentifier())) &&

            parcel.WriteInt32(static_cast<int>(beacon_->GetBeaconFenceInfoType())) &&

            parcel.WriteInt32(beacon_->GetBeaconManufactureData().manufactureId) &&

            parcel.WriteUInt8Vector(beacon_->GetBeaconManufactureData().manufactureData) &&

            parcel.WriteUInt8Vector(beacon_->GetBeaconManufactureData().manufactureDataMask) &&

            parcel.WriteRemoteObject(callback_) &&

            parcel.WriteString16(Str8ToStr16(fenceExtensionAbilityName_));

}

} // namespace Location

} // namespace OHOS