From 73a17308ccaebc278749c2f1455e75f116a7e34e Mon Sep 17 00:00:00 2001 From: WerWolv Date: Tue, 30 Dec 2025 09:34:37 +0100 Subject: [PATCH] feat: Allow opening special files with no specific size --- lib/external/libwolv | 2 +- .../content/providers/file_provider.cpp | 28 +++++++++++++++---- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/lib/external/libwolv b/lib/external/libwolv index 055e14780..afc2810c9 160000 --- a/lib/external/libwolv +++ b/lib/external/libwolv @@ -1 +1 @@ -Subproject commit 055e14780489e22c82eff752807341fd90d1c596 +Subproject commit afc2810c91dc7153cdbc22a647aac7ea6e1e3002 diff --git a/plugins/builtin/source/content/providers/file_provider.cpp b/plugins/builtin/source/content/providers/file_provider.cpp index 00fc74ebb..8d7528ac7 100644 --- a/plugins/builtin/source/content/providers/file_provider.cpp +++ b/plugins/builtin/source/content/providers/file_provider.cpp @@ -274,12 +274,30 @@ namespace hex::plugin::builtin { if (directAccess) { m_loadedIntoMemory = false; } else { - m_data = m_file.readVectorAtomic(0x00, m_fileSize); - if (!m_data.empty()) { - m_changeTracker = wolv::io::ChangeTracker(m_file); - m_changeTracker.startTracking([this]{ this->handleFileChange(); }); - m_file.close(); + if (m_fileSize == 0) { + while (true) { + constexpr static ssize_t ChunkSize = 1_MiB; + auto startSize = m_data.size(); + m_data.resize(startSize + ChunkSize); + auto result = m_file.readBuffer(m_data.data() + startSize, ChunkSize); + if (result <= 0) { + break; + } else if (result < ChunkSize) { + m_data.resize(startSize + result); + break; + } + } + + m_fileSize = m_data.size(); m_loadedIntoMemory = true; + } else { + m_data = m_file.readVectorAtomic(0x00, m_fileSize); + if (!m_data.empty()) { + m_changeTracker = wolv::io::ChangeTracker(m_file); + m_changeTracker.startTracking([this]{ this->handleFileChange(); }); + m_file.close(); + m_loadedIntoMemory = true; + } } } }