blob: 07f4d7e5e3eb157b5fdb6d9e2fddf885df76b46e [file] [log] [blame]
// Copyright 2021 Google LLC
//
// 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 <flasher/device/mutated.hpp>
#include <cstring>
#include <utility>
namespace flasher
{
namespace device
{
Mutated::Mutated(Mutate& mut, Device& dev) :
Device(DeviceInfo{dev.getInfo()}), mut(&mut), dev(&dev)
{}
std::span<std::byte> Mutated::readAt(std::span<std::byte> buf, size_t offset)
{
auto ret = dev->readAt(buf, offset);
mut->reverse(ret, offset);
return ret;
}
std::span<const std::byte>
Mutated::writeAt(std::span<const std::byte> data, size_t offset)
{
if (buf.size() < data.size())
buf.resize(data.size());
if (!data.empty())
std::memcpy(buf.data(), data.data(), data.size());
auto ret = std::span<std::byte>(buf).subspan(0, data.size());
mut->forward(ret, offset);
return data.subspan(0, dev->writeAt(ret, offset).size());
}
void Mutated::eraseBlocks(size_t idx, size_t num)
{
dev->eraseBlocks(idx, num);
}
MutatedOwned::MutatedOwned(std::unique_ptr<Mutate>&& mut,
std::unique_ptr<Device>&& dev) :
Mutated(*mut, *dev), mut(std::move(mut)), dev(std::move(dev))
{}
} // namespace device
} // namespace flasher