From: <sag...@us...> - 2013-10-26 18:12:42
|
Revision: 3045 http://sourceforge.net/p/modplug/code/3045 Author: saga-games Date: 2013-10-26 18:12:34 +0000 (Sat, 26 Oct 2013) Log Message: ----------- [Ref] Use wrapper functions for FileReader access in UnRAR to reduce complexity of dependencies between projects. Modified Paths: -------------- trunk/OpenMPT/include/unrar/UnRAR.vcxproj trunk/OpenMPT/include/unrar/UnRAR.vcxproj.filters trunk/OpenMPT/include/unrar/file.cpp trunk/OpenMPT/include/unrar/file.hpp trunk/OpenMPT/include/unrar/openmpt.hpp trunk/OpenMPT/unarchiver/unrar.cpp trunk/OpenMPT/unarchiver/unrar.h Added Paths: ----------- trunk/OpenMPT/include/unrar/openmpt-callback.hpp Modified: trunk/OpenMPT/include/unrar/UnRAR.vcxproj =================================================================== --- trunk/OpenMPT/include/unrar/UnRAR.vcxproj 2013-10-26 16:37:16 UTC (rev 3044) +++ trunk/OpenMPT/include/unrar/UnRAR.vcxproj 2013-10-26 18:12:34 UTC (rev 3045) @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="utf-8"?> <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup Label="ProjectConfigurations"> <ProjectConfiguration Include="Debug|Win32"> @@ -81,7 +81,7 @@ <ClCompile> <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions> <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions> <MinimalRebuild>false</MinimalRebuild> <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> @@ -106,7 +106,7 @@ <ClCompile> <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions> <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>UNRAR;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions> <MinimalRebuild>false</MinimalRebuild> <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> @@ -132,7 +132,7 @@ <FavorSizeOrSpeed>Neither</FavorSizeOrSpeed> <OmitFramePointers>true</OmitFramePointers> <WholeProgramOptimization>true</WholeProgramOptimization> - <PreprocessorDefinitions>MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions> <MinimalRebuild>false</MinimalRebuild> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> <StructMemberAlignment>Default</StructMemberAlignment> @@ -169,7 +169,7 @@ <FavorSizeOrSpeed>Neither</FavorSizeOrSpeed> <OmitFramePointers>true</OmitFramePointers> <WholeProgramOptimization>false</WholeProgramOptimization> - <PreprocessorDefinitions>UNRAR;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions> <StringPooling>false</StringPooling> <MinimalRebuild>false</MinimalRebuild> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> @@ -289,6 +289,7 @@ <ClInclude Include="log.hpp" /> <ClInclude Include="match.hpp" /> <ClInclude Include="model.hpp" /> + <ClInclude Include="openmpt-callback.hpp" /> <ClInclude Include="openmpt.hpp" /> <ClInclude Include="options.hpp" /> <ClInclude Include="os.hpp" /> Modified: trunk/OpenMPT/include/unrar/UnRAR.vcxproj.filters =================================================================== --- trunk/OpenMPT/include/unrar/UnRAR.vcxproj.filters 2013-10-26 16:37:16 UTC (rev 3044) +++ trunk/OpenMPT/include/unrar/UnRAR.vcxproj.filters 2013-10-26 18:12:34 UTC (rev 3045) @@ -359,5 +359,8 @@ <ClInclude Include="openmpt.hpp"> <Filter>Header Files</Filter> </ClInclude> + <ClInclude Include="openmpt-callback.hpp"> + <Filter>Header Files</Filter> + </ClInclude> </ItemGroup> </Project> \ No newline at end of file Modified: trunk/OpenMPT/include/unrar/file.cpp =================================================================== --- trunk/OpenMPT/include/unrar/file.cpp 2013-10-26 16:37:16 UTC (rev 3044) +++ trunk/OpenMPT/include/unrar/file.cpp 2013-10-26 18:12:34 UTC (rev 3045) @@ -1,9 +1,6 @@ #include "rar.hpp" +#include "openmpt-callback.hpp" // OPENMPT ADDITION -#undef Min // OPENMPT ADDITION -#include "../../common/BuildSettings.h" // OPENMPT ADDITION -#include "../../soundlib/FileReader.h" // OPENMPT ADDITION - File::File() { hFile=BAD_HANDLE; @@ -48,8 +45,8 @@ bool File::Open(const wchar *Name,uint Mode) { - hFile = reinterpret_cast<FileReader *>(const_cast<wchar *>(Name)); // OPENMPT ADDITION - hFile->Rewind(); // OPENMPT ADDITION + hFile = reinterpret_cast<RARFileCallbacks *>(const_cast<wchar *>(Name)); // OPENMPT ADDITION + hFile->Seek(hFile->file, 0); // OPENMPT ADDITION return true; // OPENMPT ADDITION /* // OPENMPT ADDITION ErrorType=FILE_SUCCESS; @@ -345,7 +342,7 @@ int File::Read(void *Data,size_t Size) { - return hFile->ReadRaw(static_cast<char *>(Data), Size); // OPENMPT ADDITION + return hFile->ReadRaw(hFile->file, static_cast<char *>(Data), Size); // OPENMPT ADDITION /* // OPENMPT ADDITION int64 FilePos=0; // Initialized only to suppress some compilers warning. @@ -457,7 +454,7 @@ Offset=(Method==SEEK_CUR ? Tell():FileLength())+Offset; Method=SEEK_SET; } - return hFile->Seek((FileReader::off_t)Offset); // OPENMPT ADDITION + return hFile->Seek(hFile->file, (size_t)Offset); // OPENMPT ADDITION /* // OPENMPT ADDITION #ifdef _WIN_ALL LONG HighDist=(LONG)(Offset>>32); @@ -480,7 +477,7 @@ int64 File::Tell() { - return hFile->GetPosition(); // OPENMPT ADDITION + return hFile->GetPosition(hFile->file); // OPENMPT ADDITION /* // OPENMPT ADDITION if (hFile==BAD_HANDLE) if (AllowExceptions) @@ -637,7 +634,7 @@ int64 File::FileLength() { - return hFile->GetLength(); // OPENMPT ADDITION + return hFile->GetLength(hFile->file); // OPENMPT ADDITION /* // OPENMPT ADDITION SaveFilePos SavePos(*this); Seek(0,SEEK_END); Modified: trunk/OpenMPT/include/unrar/file.hpp =================================================================== --- trunk/OpenMPT/include/unrar/file.hpp 2013-10-26 16:37:16 UTC (rev 3044) +++ trunk/OpenMPT/include/unrar/file.hpp 2013-10-26 18:12:34 UTC (rev 3045) @@ -1,8 +1,8 @@ #ifndef _RAR_FILE_ #define _RAR_FILE_ -class FileReader; // OPENMPT ADDITION -typedef FileReader* FileHandle; // OPENMPT ADDITION +struct RARFileCallbacks; // OPENMPT ADDITION +typedef RARFileCallbacks* FileHandle; // OPENMPT ADDITION #define BAD_HANDLE nullptr // OPENMPT ADDITION /* // OPENMPT ADDITION Added: trunk/OpenMPT/include/unrar/openmpt-callback.hpp =================================================================== --- trunk/OpenMPT/include/unrar/openmpt-callback.hpp (rev 0) +++ trunk/OpenMPT/include/unrar/openmpt-callback.hpp 2013-10-26 18:12:34 UTC (rev 3045) @@ -0,0 +1,30 @@ +/* + * openmpt-callback.hpp + * -------------------- + * Purpose: Wrapper functions for FileReader, so that it can be used easily in UnRAR. + * Notes : (currently none) + * Authors: OpenMPT Devs + * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. + */ + +#pragma once + +class FileReader; + +struct RARFileCallbacks +{ + typedef size_t (CALLBACK *RAR_READRAW) (FileReader &file, char *data, size_t size); + typedef bool (CALLBACK *RAR_SEEK) (FileReader &file, size_t offset); + typedef size_t (CALLBACK *RAR_GETPOSITION) (FileReader &file); + typedef size_t (CALLBACK *RAR_GETLENGTH) (FileReader &file); + + RAR_READRAW ReadRaw; + RAR_SEEK Seek; + RAR_GETPOSITION GetPosition; + RAR_GETLENGTH GetLength; + + FileReader &file; + + RARFileCallbacks(RAR_READRAW readFunc, RAR_SEEK seekFunc, RAR_GETPOSITION getPosFunc, RAR_GETLENGTH getLenFunc, FileReader &f) + : ReadRaw(readFunc), Seek(seekFunc), GetPosition(getPosFunc), GetLength(getLenFunc), file(f) { } +}; Modified: trunk/OpenMPT/include/unrar/openmpt.hpp =================================================================== --- trunk/OpenMPT/include/unrar/openmpt.hpp 2013-10-26 16:37:16 UTC (rev 3044) +++ trunk/OpenMPT/include/unrar/openmpt.hpp 2013-10-26 18:12:34 UTC (rev 3045) @@ -1,4 +1,12 @@ -// OpenMPT definitions (so that unrar project settings are identical to settings when including rar.hpp) +/* + * openmpt.hpp + * ----------- + * Purpose: Various definitions, so that UnRAR project settings are identical to OpenMPT's settings when including rar.hpp + * Notes : (currently none) + * Authors: OpenMPT Devs + * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. + */ + #undef Log #undef STRICT #define UNRAR @@ -6,4 +14,4 @@ #define RARDLL #define RAR_NOCRYPT #define NOVOLUME -#define NOMINMAX // For windows.h +#define NOMINMAX // For windows.h Modified: trunk/OpenMPT/unarchiver/unrar.cpp =================================================================== --- trunk/OpenMPT/unarchiver/unrar.cpp 2013-10-26 16:37:16 UTC (rev 3044) +++ trunk/OpenMPT/unarchiver/unrar.cpp 2013-10-26 18:12:34 UTC (rev 3045) @@ -9,6 +9,7 @@ #include "stdafx.h" #include "unrar.h" +#include "../include/unrar/openmpt-callback.hpp" #if MPT_COMPILER_MSVC // Disable "unreferenced formal parameter" and type conversion warnings @@ -24,38 +25,37 @@ { CommandData Cmd; Archive Arc; + RARFileCallbacks callbacks; int64 firstBlock; - RARData() : Arc(&Cmd) { } -}; + RARData(FileReader &file) : Arc(&Cmd), callbacks(ReadRaw, Seek, GetPosition, GetLength, file) { } + // FileReader callbacks + static size_t CALLBACK ReadRaw(FileReader &file, char *data, size_t size) { return file.ReadRaw(data, size); }; + static bool CALLBACK Seek(FileReader &file, size_t offset) { return file.Seek(offset); }; + static size_t CALLBACK GetPosition(FileReader &file) { return file.GetPosition(); }; + static size_t CALLBACK GetLength(FileReader &file) { return file.GetLength(); }; -static int CALLBACK ProcessRARDataProc(unsigned int msg, LPARAM userData, LPARAM p1, LPARAM p2) -//--------------------------------------------------------------------------------------------- -{ - if(msg == UCM_PROCESSDATA) + static int CALLBACK RARCallback(unsigned int msg, LPARAM userData, LPARAM p1, LPARAM p2) { - // Receive extracted data - CRarArchive *that = reinterpret_cast<CRarArchive *>(userData); - that->WriteData(reinterpret_cast<const char *>(p1), p2); - return 1; + if(msg == UCM_PROCESSDATA) + { + // Receive extracted data + CRarArchive *that = reinterpret_cast<CRarArchive *>(userData); + const char *data = reinterpret_cast<const char *>(p1); + that->data.insert(that->data.end(), data, data + p2); + return 1; + } + // No support for passwords or volumes + return 0; } - // No support for passwords or volumes - return 0; -} +}; -void CRarArchive::WriteData(const char *d, size_t s) -//-------------------------------------------------- -{ - data.insert(data.end(), d, d + s); -} - - CRarArchive::CRarArchive(FileReader &file) : ArchiveBase(file) //------------------------------------------------------------ { - rarData = new (std::nothrow) RARData(); + rarData = new (std::nothrow) RARData(inFile); if(rarData == nullptr) { return; @@ -66,7 +66,7 @@ rarData->Cmd.FileArgs.AddString(MASKALL); rarData->Cmd.VersionControl = 1; - rarData->Arc.Open(reinterpret_cast<wchar *>(&inFile), 0); + rarData->Arc.Open(reinterpret_cast<wchar *>(&rarData->callbacks), 0); if(!rarData->Arc.IsArchive(false)) { return; @@ -142,7 +142,7 @@ // Extract real file data.clear(); data.reserve(static_cast<size_t>(rarData->Arc.FileHead.UnpSize)); - rarData->Cmd.Callback = ProcessRARDataProc; + rarData->Cmd.Callback = RARData::RARCallback; Extract.ExtractCurrentFile(&rarData->Cmd, rarData->Arc, headerSize, repeat); return !data.empty(); } catch(...) Modified: trunk/OpenMPT/unarchiver/unrar.h =================================================================== --- trunk/OpenMPT/unarchiver/unrar.h 2013-10-26 16:37:16 UTC (rev 3044) +++ trunk/OpenMPT/unarchiver/unrar.h 2013-10-26 18:12:34 UTC (rev 3045) @@ -18,6 +18,7 @@ //==================================== { protected: + friend struct RARData; RARData *rarData; public: @@ -25,6 +26,4 @@ virtual ~CRarArchive(); virtual bool ExtractFile(std::size_t index); - - void WriteData(const char *d, size_t s); }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |