mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-12-28 15:28:04 +00:00
335cf4f2db
A deep-copy method CopyReader has been added to BlobReader (virtual) and all of its subclasses (override). This should create a second BlobReader to open the same set of data but with an independent read pointer so that it doesn't interfere with any reads done on the original Reader. As part of this, IOFile has added code to create a deep copy IOFile pointer onto the same file, with code based on the platform in question to find the file ID from the file pointer and open a new one. There has also been a small piece added to FileInfo to enable a deep copy, but its only subclass at this time already had a copy constructor so this was relatively minor.
52 lines
1.5 KiB
C++
52 lines
1.5 KiB
C++
// Copyright 2020 Dolphin Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#pragma once
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
|
|
#include "DiscIO/Blob.h"
|
|
#include "DiscIO/DiscScrubber.h"
|
|
|
|
namespace DiscIO
|
|
{
|
|
// This class wraps another BlobReader and zeroes out data that has been
|
|
// identified by DiscScrubber as unused.
|
|
class ScrubbedBlob : public BlobReader
|
|
{
|
|
public:
|
|
static std::unique_ptr<ScrubbedBlob> Create(const std::string& path);
|
|
|
|
BlobType GetBlobType() const override { return m_blob_reader->GetBlobType(); }
|
|
std::unique_ptr<BlobReader> CopyReader() const override;
|
|
|
|
u64 GetRawSize() const override { return m_blob_reader->GetRawSize(); }
|
|
u64 GetDataSize() const override { return m_blob_reader->GetDataSize(); }
|
|
DataSizeType GetDataSizeType() const override { return m_blob_reader->GetDataSizeType(); }
|
|
|
|
u64 GetBlockSize() const override { return m_blob_reader->GetBlockSize(); }
|
|
bool HasFastRandomAccessInBlock() const override
|
|
{
|
|
return m_blob_reader->HasFastRandomAccessInBlock();
|
|
}
|
|
std::string GetCompressionMethod() const override
|
|
{
|
|
return m_blob_reader->GetCompressionMethod();
|
|
}
|
|
std::optional<int> GetCompressionLevel() const override
|
|
{
|
|
return m_blob_reader->GetCompressionLevel();
|
|
}
|
|
|
|
bool Read(u64 offset, u64 size, u8* out_ptr) override;
|
|
|
|
private:
|
|
ScrubbedBlob(std::unique_ptr<BlobReader> blob_reader, DiscScrubber scrubber);
|
|
|
|
std::unique_ptr<BlobReader> m_blob_reader;
|
|
DiscScrubber m_scrubber;
|
|
};
|
|
|
|
} // namespace DiscIO
|