mirror of
https://github.com/WinampDesktop/winamp.git
synced 2025-05-18 22:25:41 -04:00
Common: Add MinizipHelpers (RAM and UTF-8 compatible fopen)
This commit is contained in:
parent
6e586311e8
commit
7cafb8c515
@ -51,6 +51,8 @@ add_library(common
|
|||||||
log.h
|
log.h
|
||||||
md5_digest.cpp
|
md5_digest.cpp
|
||||||
md5_digest.h
|
md5_digest.h
|
||||||
|
minizip_helpers.cpp
|
||||||
|
minizip_helpers.h
|
||||||
null_audio_stream.cpp
|
null_audio_stream.cpp
|
||||||
null_audio_stream.h
|
null_audio_stream.h
|
||||||
rectangle.h
|
rectangle.h
|
||||||
@ -94,7 +96,7 @@ add_library(common
|
|||||||
|
|
||||||
target_include_directories(common PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/..")
|
target_include_directories(common PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/..")
|
||||||
target_include_directories(common PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/..")
|
target_include_directories(common PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/..")
|
||||||
target_link_libraries(common PRIVATE glad libcue stb Threads::Threads cubeb libchdr glslang vulkan-loader)
|
target_link_libraries(common PRIVATE glad libcue stb Threads::Threads cubeb libchdr glslang vulkan-loader zlib minizip)
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
target_sources(common PRIVATE
|
target_sources(common PRIVATE
|
||||||
|
@ -79,6 +79,7 @@
|
|||||||
<ClInclude Include="timestamp.h" />
|
<ClInclude Include="timestamp.h" />
|
||||||
<ClInclude Include="types.h" />
|
<ClInclude Include="types.h" />
|
||||||
<ClInclude Include="cd_xa.h" />
|
<ClInclude Include="cd_xa.h" />
|
||||||
|
<ClInclude Include="minizip_helpers.h" />
|
||||||
<ClInclude Include="vulkan\builders.h" />
|
<ClInclude Include="vulkan\builders.h" />
|
||||||
<ClInclude Include="vulkan\context.h" />
|
<ClInclude Include="vulkan\context.h" />
|
||||||
<ClInclude Include="vulkan\shader_cache.h" />
|
<ClInclude Include="vulkan\shader_cache.h" />
|
||||||
@ -122,6 +123,7 @@
|
|||||||
<ClCompile Include="cd_subchannel_replacement.cpp" />
|
<ClCompile Include="cd_subchannel_replacement.cpp" />
|
||||||
<ClCompile Include="log.cpp" />
|
<ClCompile Include="log.cpp" />
|
||||||
<ClCompile Include="md5_digest.cpp" />
|
<ClCompile Include="md5_digest.cpp" />
|
||||||
|
<ClCompile Include="minizip_helpers.cpp" />
|
||||||
<ClCompile Include="null_audio_stream.cpp" />
|
<ClCompile Include="null_audio_stream.cpp" />
|
||||||
<ClCompile Include="progress_callback.cpp" />
|
<ClCompile Include="progress_callback.cpp" />
|
||||||
<ClCompile Include="state_wrapper.cpp" />
|
<ClCompile Include="state_wrapper.cpp" />
|
||||||
@ -303,7 +305,7 @@
|
|||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)dep\glad\include;$(SolutionDir)dep\cubeb\include;$(SolutionDir)dep\libcue\include;$(SolutionDir)dep\libchdr\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)dep\glslang;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(SolutionDir)dep\glad\include;$(SolutionDir)dep\cubeb\include;$(SolutionDir)dep\libcue\include;$(SolutionDir)dep\libchdr\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)dep\glslang;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\minizip\include;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
<LanguageStandard>stdcpp17</LanguageStandard>
|
<LanguageStandard>stdcpp17</LanguageStandard>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
@ -329,7 +331,7 @@
|
|||||||
<PreprocessorDefinitions>_ITERATOR_DEBUG_LEVEL=1;WIN32;_DEBUGFAST;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_ITERATOR_DEBUG_LEVEL=1;WIN32;_DEBUGFAST;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)dep\glad\include;$(SolutionDir)dep\cubeb\include;$(SolutionDir)dep\libcue\include;$(SolutionDir)dep\libchdr\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)dep\glslang;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(SolutionDir)dep\glad\include;$(SolutionDir)dep\cubeb\include;$(SolutionDir)dep\libcue\include;$(SolutionDir)dep\libchdr\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)dep\glslang;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\minizip\include;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
||||||
<SupportJustMyCode>false</SupportJustMyCode>
|
<SupportJustMyCode>false</SupportJustMyCode>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
@ -358,7 +360,7 @@
|
|||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)dep\glad\include;$(SolutionDir)dep\cubeb\include;$(SolutionDir)dep\libcue\include;$(SolutionDir)dep\libchdr\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)dep\glslang;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(SolutionDir)dep\glad\include;$(SolutionDir)dep\cubeb\include;$(SolutionDir)dep\libcue\include;$(SolutionDir)dep\libchdr\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)dep\glslang;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\minizip\include;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
<LanguageStandard>stdcpp17</LanguageStandard>
|
<LanguageStandard>stdcpp17</LanguageStandard>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
@ -384,7 +386,7 @@
|
|||||||
<PreprocessorDefinitions>_ITERATOR_DEBUG_LEVEL=1;WIN32;_DEBUGFAST;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_ITERATOR_DEBUG_LEVEL=1;WIN32;_DEBUGFAST;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)dep\glad\include;$(SolutionDir)dep\cubeb\include;$(SolutionDir)dep\libcue\include;$(SolutionDir)dep\libchdr\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)dep\glslang;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(SolutionDir)dep\glad\include;$(SolutionDir)dep\cubeb\include;$(SolutionDir)dep\libcue\include;$(SolutionDir)dep\libchdr\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)dep\glslang;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\minizip\include;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
||||||
<SupportJustMyCode>false</SupportJustMyCode>
|
<SupportJustMyCode>false</SupportJustMyCode>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
@ -414,7 +416,7 @@
|
|||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)dep\glad\include;$(SolutionDir)dep\cubeb\include;$(SolutionDir)dep\libcue\include;$(SolutionDir)dep\libchdr\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)dep\glslang;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(SolutionDir)dep\glad\include;$(SolutionDir)dep\cubeb\include;$(SolutionDir)dep\libcue\include;$(SolutionDir)dep\libchdr\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)dep\glslang;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\minizip\include;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
<LanguageStandard>stdcpp17</LanguageStandard>
|
<LanguageStandard>stdcpp17</LanguageStandard>
|
||||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
@ -444,7 +446,7 @@
|
|||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)dep\glad\include;$(SolutionDir)dep\cubeb\include;$(SolutionDir)dep\libcue\include;$(SolutionDir)dep\libchdr\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)dep\glslang;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(SolutionDir)dep\glad\include;$(SolutionDir)dep\cubeb\include;$(SolutionDir)dep\libcue\include;$(SolutionDir)dep\libchdr\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)dep\glslang;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\minizip\include;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<OmitFramePointers>true</OmitFramePointers>
|
<OmitFramePointers>true</OmitFramePointers>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
<LanguageStandard>stdcpp17</LanguageStandard>
|
<LanguageStandard>stdcpp17</LanguageStandard>
|
||||||
@ -474,7 +476,7 @@
|
|||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)dep\glad\include;$(SolutionDir)dep\cubeb\include;$(SolutionDir)dep\libcue\include;$(SolutionDir)dep\libchdr\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)dep\glslang;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(SolutionDir)dep\glad\include;$(SolutionDir)dep\cubeb\include;$(SolutionDir)dep\libcue\include;$(SolutionDir)dep\libchdr\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)dep\glslang;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\minizip\include;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
<LanguageStandard>stdcpp17</LanguageStandard>
|
<LanguageStandard>stdcpp17</LanguageStandard>
|
||||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
@ -504,7 +506,7 @@
|
|||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)dep\glad\include;$(SolutionDir)dep\cubeb\include;$(SolutionDir)dep\libcue\include;$(SolutionDir)dep\libchdr\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)dep\glslang;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(SolutionDir)dep\glad\include;$(SolutionDir)dep\cubeb\include;$(SolutionDir)dep\libcue\include;$(SolutionDir)dep\libchdr\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)dep\glslang;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\minizip\include;$(SolutionDir)src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<OmitFramePointers>true</OmitFramePointers>
|
<OmitFramePointers>true</OmitFramePointers>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
<LanguageStandard>stdcpp17</LanguageStandard>
|
<LanguageStandard>stdcpp17</LanguageStandard>
|
||||||
|
@ -99,6 +99,7 @@
|
|||||||
<Filter>vulkan</Filter>
|
<Filter>vulkan</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="image.h" />
|
<ClInclude Include="image.h" />
|
||||||
|
<ClInclude Include="minizip_helpers.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="jit_code_buffer.cpp" />
|
<ClCompile Include="jit_code_buffer.cpp" />
|
||||||
@ -191,6 +192,7 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="image.cpp" />
|
<ClCompile Include="image.cpp" />
|
||||||
<ClCompile Include="cd_image_memory.cpp" />
|
<ClCompile Include="cd_image_memory.cpp" />
|
||||||
|
<ClCompile Include="minizip_helpers.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Natvis Include="bitfield.natvis" />
|
<Natvis Include="bitfield.natvis" />
|
||||||
|
90
src/common/minizip_helpers.cpp
Normal file
90
src/common/minizip_helpers.cpp
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
#include "minizip_helpers.h"
|
||||||
|
#include "file_system.h"
|
||||||
|
#include "ioapi.h"
|
||||||
|
#include "types.h"
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
namespace MinizipHelpers {
|
||||||
|
|
||||||
|
unzFile OpenUnzMemoryFile(const void* memory, size_t memory_size)
|
||||||
|
{
|
||||||
|
struct MemoryFileInfo
|
||||||
|
{
|
||||||
|
const u8* data;
|
||||||
|
ZPOS64_T data_size;
|
||||||
|
ZPOS64_T position;
|
||||||
|
};
|
||||||
|
|
||||||
|
MemoryFileInfo* fi = new MemoryFileInfo;
|
||||||
|
fi->data = static_cast<const u8*>(memory);
|
||||||
|
fi->data_size = static_cast<ZPOS64_T>(memory_size);
|
||||||
|
fi->position = 0;
|
||||||
|
|
||||||
|
#define FI static_cast<MemoryFileInfo*>(stream)
|
||||||
|
|
||||||
|
zlib_filefunc64_def funcs = {
|
||||||
|
[](voidpf opaque, const void* filename, int mode) -> voidpf { return opaque; }, // open
|
||||||
|
[](voidpf opaque, voidpf stream, void* buf, uLong size) -> uLong { // read
|
||||||
|
const ZPOS64_T remaining = FI->data_size - FI->position;
|
||||||
|
const ZPOS64_T to_read = std::min(remaining, static_cast<ZPOS64_T>(size));
|
||||||
|
if (to_read > 0)
|
||||||
|
{
|
||||||
|
std::memcpy(buf, FI->data + FI->position, to_read);
|
||||||
|
FI->position += to_read;
|
||||||
|
}
|
||||||
|
|
||||||
|
return static_cast<uLong>(to_read);
|
||||||
|
},
|
||||||
|
[](voidpf opaque, voidpf stream, const void* buf, uLong size) -> uLong { return 0; }, // write
|
||||||
|
[](voidpf opaque, voidpf stream) -> ZPOS64_T { return static_cast<ZPOS64_T>(FI->position); }, // tell
|
||||||
|
[](voidpf opaque, voidpf stream, ZPOS64_T offset, int origin) -> long { // seek
|
||||||
|
ZPOS64_T new_position = FI->position;
|
||||||
|
if (origin == SEEK_SET)
|
||||||
|
new_position = static_cast<int>(offset);
|
||||||
|
else if (origin == SEEK_CUR)
|
||||||
|
new_position += static_cast<int>(offset);
|
||||||
|
else
|
||||||
|
new_position = FI->data_size;
|
||||||
|
if (new_position < 0 || new_position > FI->data_size)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
FI->position = new_position;
|
||||||
|
return 0;
|
||||||
|
},
|
||||||
|
[](voidpf opaque, voidpf stream) -> int {
|
||||||
|
delete FI;
|
||||||
|
return 0;
|
||||||
|
}, // close
|
||||||
|
[](voidpf opaque, voidpf stream) -> int { return 0; }, // testerror
|
||||||
|
static_cast<voidpf>(fi)};
|
||||||
|
|
||||||
|
#undef FI
|
||||||
|
|
||||||
|
unzFile zf = unzOpen2_64("", &funcs);
|
||||||
|
if (!zf)
|
||||||
|
delete fi;
|
||||||
|
|
||||||
|
return zf;
|
||||||
|
}
|
||||||
|
|
||||||
|
unzFile OpenUnzFile(const char* filename)
|
||||||
|
{
|
||||||
|
zlib_filefunc64_def funcs;
|
||||||
|
fill_fopen64_filefunc(&funcs);
|
||||||
|
|
||||||
|
funcs.zopen64_file = [](voidpf opaque, const void* filename, int mode) -> voidpf {
|
||||||
|
const char* mode_fopen = NULL;
|
||||||
|
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) == ZLIB_FILEFUNC_MODE_READ)
|
||||||
|
mode_fopen = "rb";
|
||||||
|
else if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
|
||||||
|
mode_fopen = "r+b";
|
||||||
|
else if (mode & ZLIB_FILEFUNC_MODE_CREATE)
|
||||||
|
mode_fopen = "wb";
|
||||||
|
|
||||||
|
return FileSystem::OpenCFile(static_cast<const char*>(filename), mode_fopen);
|
||||||
|
};
|
||||||
|
|
||||||
|
return unzOpen2_64(filename, &funcs);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace MinizipHelpers
|
9
src/common/minizip_helpers.h
Normal file
9
src/common/minizip_helpers.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "unzip.h"
|
||||||
|
|
||||||
|
namespace MinizipHelpers {
|
||||||
|
|
||||||
|
unzFile OpenUnzMemoryFile(const void* memory, size_t memory_size);
|
||||||
|
unzFile OpenUnzFile(const char* filename);
|
||||||
|
|
||||||
|
} // namespace MinizipHelpers
|
@ -1,5 +1,6 @@
|
|||||||
#include "gamelistsettingswidget.h"
|
#include "gamelistsettingswidget.h"
|
||||||
#include "common/assert.h"
|
#include "common/assert.h"
|
||||||
|
#include "common/minizip_helpers.h"
|
||||||
#include "common/string_util.h"
|
#include "common/string_util.h"
|
||||||
#include "core/game_list.h"
|
#include "core/game_list.h"
|
||||||
#include "gamelistsearchdirectoriesmodel.h"
|
#include "gamelistsearchdirectoriesmodel.h"
|
||||||
@ -18,7 +19,6 @@
|
|||||||
#include <QtWidgets/QMessageBox>
|
#include <QtWidgets/QMessageBox>
|
||||||
#include <QtWidgets/QProgressDialog>
|
#include <QtWidgets/QProgressDialog>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <unzip.h>
|
|
||||||
|
|
||||||
static constexpr char REDUMP_DOWNLOAD_URL[] = "http://redump.org/datfile/psx/serial,version,description";
|
static constexpr char REDUMP_DOWNLOAD_URL[] = "http://redump.org/datfile/psx/serial,version,description";
|
||||||
|
|
||||||
@ -153,52 +153,7 @@ static bool ExtractRedumpDatabase(const QByteArray& data, const QString& destina
|
|||||||
if (data.isEmpty())
|
if (data.isEmpty())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
struct MemoryFileInfo
|
unzFile zf = MinizipHelpers::OpenUnzMemoryFile(data.constData(), data.size());
|
||||||
{
|
|
||||||
const QByteArray& data;
|
|
||||||
int position;
|
|
||||||
};
|
|
||||||
|
|
||||||
MemoryFileInfo fi{data, 0};
|
|
||||||
|
|
||||||
#define FI static_cast<MemoryFileInfo*>(stream)
|
|
||||||
|
|
||||||
zlib_filefunc64_def funcs = {
|
|
||||||
[](voidpf opaque, const void* filename, int mode) -> voidpf { return opaque; }, // open
|
|
||||||
[](voidpf opaque, voidpf stream, void* buf, uLong size) -> uLong { // read
|
|
||||||
const int remaining = FI->data.size() - FI->position;
|
|
||||||
const int to_read = std::min(remaining, static_cast<int>(size));
|
|
||||||
if (to_read > 0)
|
|
||||||
{
|
|
||||||
std::memcpy(buf, FI->data.constData() + FI->position, to_read);
|
|
||||||
FI->position += to_read;
|
|
||||||
}
|
|
||||||
|
|
||||||
return static_cast<uLong>(to_read);
|
|
||||||
},
|
|
||||||
[](voidpf opaque, voidpf stream, const void* buf, uLong size) -> uLong { return 0; }, // write
|
|
||||||
[](voidpf opaque, voidpf stream) -> ZPOS64_T { return static_cast<ZPOS64_T>(FI->position); }, // tell
|
|
||||||
[](voidpf opaque, voidpf stream, ZPOS64_T offset, int origin) -> long { // seek
|
|
||||||
int new_position = FI->position;
|
|
||||||
if (origin == SEEK_SET)
|
|
||||||
new_position = static_cast<int>(offset);
|
|
||||||
else if (origin == SEEK_CUR)
|
|
||||||
new_position += static_cast<int>(offset);
|
|
||||||
else
|
|
||||||
new_position = FI->data.size();
|
|
||||||
if (new_position < 0 || new_position > FI->data.size())
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
FI->position = new_position;
|
|
||||||
return 0;
|
|
||||||
},
|
|
||||||
[](voidpf opaque, voidpf stream) -> int { return 0; }, // close
|
|
||||||
[](voidpf opaque, voidpf stream) -> int { return 0; }, // testerror
|
|
||||||
static_cast<voidpf>(&fi)};
|
|
||||||
|
|
||||||
#undef FI
|
|
||||||
|
|
||||||
unzFile zf = unzOpen2_64("", &funcs);
|
|
||||||
if (!zf)
|
if (!zf)
|
||||||
{
|
{
|
||||||
qCritical() << "unzOpen2_64() failed";
|
qCritical() << "unzOpen2_64() failed";
|
||||||
|
Loading…
x
Reference in New Issue
Block a user