mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-12-28 03:37:19 +01: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.
55 lines
1.4 KiB
C++
55 lines
1.4 KiB
C++
// Copyright 2008 Dolphin Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
// DiscScrubber removes the pseudorandom padding data from discs
|
|
|
|
// Note: the technique is inspired by Wiiscrubber, but much simpler - intentionally :)
|
|
|
|
#pragma once
|
|
|
|
#include <array>
|
|
#include <string>
|
|
#include <vector>
|
|
#include "Common/CommonTypes.h"
|
|
|
|
namespace File
|
|
{
|
|
class IOFile;
|
|
}
|
|
|
|
namespace DiscIO
|
|
{
|
|
class FileInfo;
|
|
class Volume;
|
|
struct Partition;
|
|
|
|
class DiscScrubber final
|
|
{
|
|
public:
|
|
DiscScrubber();
|
|
|
|
bool SetupScrub(const Volume& disc);
|
|
|
|
// Returns true if the specified 32 KiB block only contains unused data
|
|
bool CanBlockBeScrubbed(u64 offset) const;
|
|
|
|
static constexpr size_t CLUSTER_SIZE = 0x8000;
|
|
|
|
private:
|
|
void MarkAsUsed(u64 offset, u64 size);
|
|
void MarkAsUsedE(u64 partition_data_offset, u64 offset, u64 size);
|
|
u64 ToClusterOffset(u64 offset) const;
|
|
bool ReadFromVolume(const Volume& disc, u64 offset, u32& buffer, const Partition& partition);
|
|
bool ReadFromVolume(const Volume& disc, u64 offset, u64& buffer, const Partition& partition);
|
|
bool ParseDisc(const Volume& disc);
|
|
bool ParsePartitionData(const Volume& disc, const Partition& partition);
|
|
void ParseFileSystemData(u64 partition_data_offset, const FileInfo& directory);
|
|
|
|
std::vector<u8> m_free_table;
|
|
u64 m_file_size = 0;
|
|
bool m_has_wii_hashes = false;
|
|
bool m_is_scrubbing = false;
|
|
};
|
|
|
|
} // namespace DiscIO
|