dolphin/Source/Core/DiscIO/VolumeFileBlobReader.cpp
JosJuice 162e3be82b Show an OSD message when running a disc image with a large block size
This is intended to catch WIA files which have been created using
wit's default parameters (40 MiB block size), once the WIA PR is
merged. The check does however also work for GCZ files – not that
I think anyone has a GCZ file with a block size that large.
2020-06-07 14:11:00 +02:00

65 lines
1.8 KiB
C++

// Copyright 2017 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.
#include "DiscIO/VolumeFileBlobReader.h"
#include <memory>
#include <string_view>
#include "DiscIO/Filesystem.h"
#include "DiscIO/Volume.h"
namespace DiscIO
{
std::unique_ptr<VolumeFileBlobReader> VolumeFileBlobReader::Create(const Volume& volume,
const Partition& partition,
std::string_view file_path)
{
const FileSystem* file_system = volume.GetFileSystem(partition);
if (!file_system)
return nullptr;
std::unique_ptr<FileInfo> file_info = file_system->FindFileInfo(file_path);
if (!file_info || file_info->IsDirectory())
return nullptr;
return std::unique_ptr<VolumeFileBlobReader>{
new VolumeFileBlobReader(volume, partition, std::move(file_info))};
}
VolumeFileBlobReader::VolumeFileBlobReader(const Volume& volume, const Partition& partition,
std::unique_ptr<FileInfo> file_info)
: m_volume(volume), m_partition(partition), m_file_info(std::move(file_info))
{
}
u64 VolumeFileBlobReader::GetDataSize() const
{
return m_file_info->GetSize();
}
u64 VolumeFileBlobReader::GetRawSize() const
{
return GetDataSize();
}
u64 VolumeFileBlobReader::GetBlockSize() const
{
return m_volume.GetBlobReader().GetBlockSize();
}
bool VolumeFileBlobReader::HasFastRandomAccessInBlock() const
{
return m_volume.GetBlobReader().HasFastRandomAccessInBlock();
}
bool VolumeFileBlobReader::Read(u64 offset, u64 length, u8* out_ptr)
{
if (offset + length > m_file_info->GetSize())
return false;
return m_volume.Read(m_file_info->GetOffset() + offset, length, out_ptr, m_partition);
}
} // namespace DiscIO