diff --git a/libs/archivelib.h b/libs/archivelib.h index b9b78fa609..f2f36e3c2c 100644 --- a/libs/archivelib.h +++ b/libs/archivelib.h @@ -81,92 +81,6 @@ class BinaryToTextInputStream : public TextInputStream } }; -/// \brief An ArchiveFile which is stored uncompressed as part of a larger archive file. -class StoredArchiveFile : - public ArchiveFile -{ - std::string m_name; - FileInputStream m_filestream; - SubFileInputStream m_substream; - FileInputStream::size_type m_size; -public: - typedef FileInputStream::size_type size_type; - typedef FileInputStream::position_type position_type; - - StoredArchiveFile(const std::string& name, - const std::string& archiveName, - position_type position, - size_type stream_size, - size_type file_size) - : m_name(name), - m_filestream(archiveName), - m_substream(m_filestream, position, stream_size), - m_size(file_size) - {} - - size_type size() const { - return m_size; - } - - const std::string& getName() const { - return m_name; - } - - InputStream& getInputStream() { - return m_substream; - } -}; - -/// \brief An ArchiveTextFile which is stored uncompressed as part of a larger archive file. -class StoredArchiveTextFile : - public ArchiveTextFile -{ - std::string m_name; - FileInputStream m_filestream; - SubFileInputStream m_substream; - BinaryToTextInputStream m_textStream; - - // Mod directory - std::string _modDir; -public: - typedef FileInputStream::size_type size_type; - typedef FileInputStream::position_type position_type; - - /** - * Constructor. - * - * @param modDir - * Name of the mod directory containing this file. - */ - StoredArchiveTextFile(const std::string& name, - const std::string& archiveName, - const std::string& modDir, - position_type position, - size_type stream_size) - : m_name(name), - m_filestream(archiveName), - m_substream(m_filestream, position, stream_size), - m_textStream(m_substream), - _modDir(game::current::getModPath(modDir)) - {} - - const std::string& getName() const { - return m_name; - } - - TextInputStream& getInputStream() { - return m_textStream; - } - - /** - * Return mod directory. - */ - std::string getModName() const { - return _modDir; - } -}; -typedef std::shared_ptr StoredArchiveTextFilePtr; - /// \brief An ArchiveFile which is stored as a single file on disk. class DirectoryArchiveFile : public ArchiveFile diff --git a/plugins/archivezip/DeflatedArchiveTextFile.h b/plugins/archivezip/DeflatedArchiveTextFile.h index f205261e45..eaaf97045f 100644 --- a/plugins/archivezip/DeflatedArchiveTextFile.h +++ b/plugins/archivezip/DeflatedArchiveTextFile.h @@ -2,7 +2,6 @@ #include "iarchive.h" #include "iregistry.h" -#include "gamelib.h" #include "archivelib.h" namespace archive @@ -22,7 +21,7 @@ class DeflatedArchiveTextFile : BinaryToTextInputStream _textStream; // converts data from _zipstream // Mod directory containing this file - const std::string _modDir; + const std::string _modName; public: typedef FileInputStream::size_type size_type; @@ -36,15 +35,15 @@ class DeflatedArchiveTextFile : */ DeflatedArchiveTextFile(const std::string& name, const std::string& archiveName, // full path to ZIP file - const std::string& modDir, + const std::string& modName, position_type position, - size_type stream_size) - : _name(name), - _istream(archiveName), - _substream(_istream, position, stream_size), - _zipstream(_substream), - _textStream(_zipstream), - _modDir(game::current::getModPath(modDir)) + size_type stream_size) : + _name(name), + _istream(archiveName), + _substream(_istream, position, stream_size), + _zipstream(_substream), + _textStream(_zipstream), + _modName(modName) {} TextInputStream& getInputStream() override @@ -62,7 +61,7 @@ class DeflatedArchiveTextFile : */ std::string getModName() const override { - return _modDir; + return _modName; } }; diff --git a/plugins/archivezip/StoreArchiveFile.h b/plugins/archivezip/StoreArchiveFile.h new file mode 100644 index 0000000000..ae242bf841 --- /dev/null +++ b/plugins/archivezip/StoreArchiveFile.h @@ -0,0 +1,50 @@ +#pragma once + +#include "iarchive.h" +#include "archivelib.h" + +namespace archive +{ + +/// \brief An ArchiveFile which is stored uncompressed as part of a larger archive file. +class StoredArchiveFile : + public ArchiveFile +{ +private: + std::string _name; + FileInputStream _filestream; + SubFileInputStream _substream; // provides a subset of _filestream + FileInputStream::size_type _size; + +public: + typedef FileInputStream::size_type size_type; + typedef FileInputStream::position_type position_type; + + StoredArchiveFile(const std::string& name, + const std::string& archiveName, // full path to the archive file + position_type position, + size_type stream_size, + size_type file_size) : + _name(name), + _filestream(archiveName), + _substream(_filestream, position, stream_size), + _size(file_size) + {} + + size_type size() const override + { + return _size; + } + + const std::string& getName() const override + { + return _name; + } + + InputStream& getInputStream() override + { + return _substream; + } +}; + +} diff --git a/plugins/archivezip/StoredArchiveTextFile.h b/plugins/archivezip/StoredArchiveTextFile.h new file mode 100644 index 0000000000..1be689bfe2 --- /dev/null +++ b/plugins/archivezip/StoredArchiveTextFile.h @@ -0,0 +1,62 @@ +#pragma once + +#include "iarchive.h" +#include "archivelib.h" + +namespace archive +{ + +/// \brief An ArchiveTextFile which is stored uncompressed as part of a larger archive file. +class StoredArchiveTextFile : + public ArchiveTextFile +{ +private: + std::string _name; + FileInputStream _filestream; + SubFileInputStream _substream; // provides a subset of _filestream + BinaryToTextInputStream _textStream; // converts data from _substream + + // Mod directory + std::string _modName; +public: + typedef FileInputStream::size_type size_type; + typedef FileInputStream::position_type position_type; + + /** + * Constructor. + * + * @param modDir + * Name of the mod directory containing this file. + */ + StoredArchiveTextFile(const std::string& name, + const std::string& archiveName, + const std::string& modName, + position_type position, + size_type stream_size) : + _name(name), + _filestream(archiveName), + _substream(_filestream, position, stream_size), + _textStream(_substream), + _modName(modName) + {} + + const std::string& getName() const override + { + return _name; + } + + TextInputStream& getInputStream() override + { + return _textStream; + } + + /** + * Return mod directory. + */ + std::string getModName() const override + { + return _modName; + } +}; + +} diff --git a/plugins/archivezip/ZipArchive.cpp b/plugins/archivezip/ZipArchive.cpp index 1ad41d6bd6..40b695fd17 100644 --- a/plugins/archivezip/ZipArchive.cpp +++ b/plugins/archivezip/ZipArchive.cpp @@ -4,6 +4,7 @@ #include "itextstream.h" #include "iarchive.h" #include "archivelib.h" +#include "gamelib.h" #include #include "os/fs.h" @@ -12,6 +13,8 @@ #include "ZipStreamUtils.h" #include "DeflatedArchiveFile.h" #include "DeflatedArchiveTextFile.h" +#include "StoreArchiveFile.h" +#include "StoredArchiveTextFile.h" namespace archive { @@ -118,21 +121,15 @@ ArchiveTextFilePtr ZipArchive::openTextFile(const std::string& name) } } + std::string modDir = game::current::getModPath(_containingFolder); + switch (file->mode) { case ZipRecord::eStored: - return std::make_shared(name, - _fullPath, - _containingFolder, - _istream.tell(), - file->stream_size); + return std::make_shared(name, _fullPath, modDir, _istream.tell(), file->stream_size); case ZipRecord::eDeflated: - return std::make_shared(name, - _fullPath, - _containingFolder, - _istream.tell(), - file->stream_size); + return std::make_shared(name, _fullPath, modDir, _istream.tell(), file->stream_size); } } diff --git a/tools/msvc/archivezip.vcxproj b/tools/msvc/archivezip.vcxproj index ca853c15ef..2f902f009b 100644 --- a/tools/msvc/archivezip.vcxproj +++ b/tools/msvc/archivezip.vcxproj @@ -311,6 +311,8 @@ + + diff --git a/tools/msvc/archivezip.vcxproj.filters b/tools/msvc/archivezip.vcxproj.filters index 068c07cdd1..77edaf6fb2 100644 --- a/tools/msvc/archivezip.vcxproj.filters +++ b/tools/msvc/archivezip.vcxproj.filters @@ -25,6 +25,12 @@ src + + src + + + src +