summaryrefslogtreecommitdiff
path: root/Source/Core/DiscIO/CompressedBlob.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/DiscIO/CompressedBlob.cpp')
-rw-r--r--Source/Core/DiscIO/CompressedBlob.cpp45
1 files changed, 19 insertions, 26 deletions
diff --git a/Source/Core/DiscIO/CompressedBlob.cpp b/Source/Core/DiscIO/CompressedBlob.cpp
index 99a982efd9..7f86ee2388 100644
--- a/Source/Core/DiscIO/CompressedBlob.cpp
+++ b/Source/Core/DiscIO/CompressedBlob.cpp
@@ -4,7 +4,6 @@
#include "DiscIO/CompressedBlob.h"
#include <algorithm>
-#include <cstdio>
#include <cstring>
#include <memory>
#include <string>
@@ -19,10 +18,10 @@
#endif
#include "Common/Assert.h"
+#include "Common/BitUtils.h"
#include "Common/CommonTypes.h"
#include "Common/FileUtil.h"
#include "Common/Hash.h"
-#include "Common/IOFile.h"
#include "Common/Logging/Log.h"
#include "Common/MsgHandler.h"
#include "DiscIO/Blob.h"
@@ -32,22 +31,23 @@
namespace DiscIO
{
-bool IsGCZBlob(File::IOFile& file);
+bool IsGCZBlob(File::DirectIOFile& file);
-CompressedBlobReader::CompressedBlobReader(File::IOFile file, const std::string& filename)
+CompressedBlobReader::CompressedBlobReader(File::DirectIOFile file, const std::string& filename)
: m_file(std::move(file)), m_file_name(filename)
{
m_file_size = m_file.GetSize();
m_file.Seek(0, File::SeekOrigin::Begin);
- m_file.ReadArray(&m_header, 1);
+ m_file.Read(Common::AsWritableU8Span(m_header));
SetSectorSize(m_header.block_size);
// cache block pointers and hashes
m_block_pointers.resize(m_header.num_blocks);
- m_file.ReadArray(m_block_pointers.data(), m_header.num_blocks);
+ m_file.Read(Common::AsWritableU8Span(m_block_pointers));
+
m_hashes.resize(m_header.num_blocks);
- m_file.ReadArray(m_hashes.data(), m_header.num_blocks);
+ m_file.Read(Common::AsWritableU8Span(m_hashes));
m_data_offset = (sizeof(CompressedBlobHeader)) +
(sizeof(u64)) * m_header.num_blocks // skip block pointers
@@ -60,7 +60,7 @@ CompressedBlobReader::CompressedBlobReader(File::IOFile file, const std::string&
m_zlib_buffer.resize(zlib_buffer_size);
}
-std::unique_ptr<CompressedBlobReader> CompressedBlobReader::Create(File::IOFile file,
+std::unique_ptr<CompressedBlobReader> CompressedBlobReader::Create(File::DirectIOFile file,
const std::string& filename)
{
if (IsGCZBlob(file))
@@ -74,7 +74,7 @@ CompressedBlobReader::~CompressedBlobReader() = default;
std::unique_ptr<BlobReader> CompressedBlobReader::CopyReader() const
{
- return Create(m_file.Duplicate("rb"), m_file_name);
+ return Create(m_file, m_file_name);
}
// IMPORTANT: Calling this function invalidates all earlier pointers gotten from this function.
@@ -107,12 +107,10 @@ bool CompressedBlobReader::GetBlock(u64 block_num, u8* out_ptr)
// clear unused part of zlib buffer. maybe this can be deleted when it works fully.
memset(&m_zlib_buffer[comp_block_size], 0, m_zlib_buffer.size() - comp_block_size);
- m_file.Seek(offset, File::SeekOrigin::Begin);
- if (!m_file.ReadBytes(m_zlib_buffer.data(), comp_block_size))
+ if (!m_file.OffsetRead(offset, m_zlib_buffer.data(), comp_block_size))
{
ERROR_LOG_FMT(DISCIO, "The disc image \"{}\" is truncated, some of the data is missing.",
m_file_name);
- m_file.ClearError();
return false;
}
@@ -241,7 +239,7 @@ static ConversionResult<OutputParameters> Compress(CompressThreadState* state,
return std::move(output_parameters);
}
-static ConversionResultCode Output(OutputParameters parameters, File::IOFile* outfile,
+static ConversionResultCode Output(OutputParameters parameters, File::DirectIOFile* outfile,
u64* position, std::vector<u64>* offsets, int progress_monitor,
u32 num_blocks, const CompressCB& callback)
{
@@ -252,7 +250,7 @@ static ConversionResultCode Output(OutputParameters parameters, File::IOFile* ou
*position += parameters.data.size();
- if (!outfile->WriteBytes(parameters.data.data(), parameters.data.size()))
+ if (!outfile->Write(parameters.data))
return ConversionResultCode::WriteFailed;
if (parameters.block_number % progress_monitor == 0)
@@ -278,8 +276,8 @@ bool ConvertToGCZ(BlobReader* infile, const std::string& infile_path,
{
ASSERT(infile->GetDataSizeType() == DataSizeType::Accurate);
- File::IOFile outfile(outfile_path, "wb");
- if (!outfile)
+ File::DirectIOFile outfile(outfile_path, File::AccessMode::Write);
+ if (!outfile.IsOpen())
{
PanicAlertFmtT(
"Failed to open the output file \"{0}\".\n"
@@ -365,9 +363,9 @@ bool ConvertToGCZ(BlobReader* infile, const std::string& infile_path,
{
// Okay, go back and fill in headers
outfile.Seek(0, File::SeekOrigin::Begin);
- outfile.WriteArray(&header, 1);
- outfile.WriteArray(offsets.data(), header.num_blocks);
- outfile.WriteArray(hashes.data(), header.num_blocks);
+ outfile.Write(Common::AsU8Span(header));
+ outfile.Write(Common::AsU8Span(offsets));
+ outfile.Write(Common::AsU8Span(hashes));
callback(Common::GetStringT("Done compressing disc image."), 1.0f);
}
@@ -385,15 +383,10 @@ bool ConvertToGCZ(BlobReader* infile, const std::string& infile_path,
return result == ConversionResultCode::Success;
}
-bool IsGCZBlob(File::IOFile& file)
+bool IsGCZBlob(File::DirectIOFile& file)
{
- const u64 position = file.Tell();
- if (!file.Seek(0, File::SeekOrigin::Begin))
- return false;
CompressedBlobHeader header;
- bool is_gcz = file.ReadArray(&header, 1) && header.magic_cookie == GCZ_MAGIC;
- file.Seek(position, File::SeekOrigin::Begin);
- return is_gcz;
+ return file.OffsetRead(0, Common::AsWritableU8Span(header)) && header.magic_cookie == GCZ_MAGIC;
}
} // namespace DiscIO