diff --git a/src/engine/serialize.cpp b/src/engine/serialize.cpp index 4355f5c06e9..4170173fe69 100644 --- a/src/engine/serialize.cpp +++ b/src/engine/serialize.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include "endian_h2.h" #include "logging.h" @@ -230,7 +231,7 @@ OStreamBase & OStreamBase::operator<<( const uint32_t v ) return *this; } -OStreamBase & OStreamBase::operator<<( const std::string & v ) +OStreamBase & OStreamBase::operator<<( const std::string_view v ) { put32( static_cast( v.size() ) ); diff --git a/src/engine/serialize.h b/src/engine/serialize.h index a0b3366289b..5bc6e48c677 100644 --- a/src/engine/serialize.h +++ b/src/engine/serialize.h @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -233,7 +234,7 @@ class OStreamBase : virtual public StreamBase OStreamBase & operator<<( const uint16_t v ); OStreamBase & operator<<( const int32_t v ); OStreamBase & operator<<( const uint32_t v ); - OStreamBase & operator<<( const std::string & v ); + OStreamBase & operator<<( const std::string_view v ); OStreamBase & operator<<( const fheroes2::Point & v ); diff --git a/src/engine/zzlib.cpp b/src/engine/zzlib.cpp index b8c2bd99494..17a8648c971 100644 --- a/src/engine/zzlib.cpp +++ b/src/engine/zzlib.cpp @@ -39,7 +39,7 @@ namespace namespace Compression { - std::vector decompressData( const uint8_t * src, const size_t srcSize, size_t realSize /* = 0 */ ) + std::vector unzipData( const uint8_t * src, const size_t srcSize, size_t realSize /* = 0 */ ) { if ( src == nullptr || srcSize == 0 ) { return {}; @@ -102,7 +102,7 @@ namespace Compression return res; } - std::vector compressData( const uint8_t * src, const size_t srcSize ) + std::vector zipData( const uint8_t * src, const size_t srcSize ) { if ( src == nullptr || srcSize == 0 ) { return {}; @@ -134,46 +134,46 @@ namespace Compression return res; } - bool readFromFileStream( StreamFile & fileStream, RWStreamBuf & output ) + bool unzipStream( IStreamBase & inputStream, OStreamBase & outputStream ) { - const uint32_t rawSize = fileStream.get32(); - const uint32_t zipSize = fileStream.get32(); + const uint32_t rawSize = inputStream.get32(); + const uint32_t zipSize = inputStream.get32(); if ( zipSize == 0 ) { return false; } - const uint16_t version = fileStream.get16(); + const uint16_t version = inputStream.get16(); if ( version != FORMAT_VERSION_0 ) { return false; } - fileStream.skip( 2 ); // Unused bytes + inputStream.skip( 2 ); // Unused bytes - const std::vector zip = fileStream.getRaw( zipSize ); - const std::vector raw = decompressData( zip.data(), zip.size(), rawSize ); + const std::vector zip = inputStream.getRaw( zipSize ); + const std::vector raw = unzipData( zip.data(), zip.size(), rawSize ); if ( raw.size() != rawSize ) { return false; } - output.putRaw( raw.data(), raw.size() ); + outputStream.putRaw( raw.data(), raw.size() ); - return !output.fail(); + return !outputStream.fail(); } - bool writeIntoFileStream( StreamFile & fileStream, IStreamBuf & data ) + bool zipStreamBuf( IStreamBuf & inputStream, OStreamBase & outputStream ) { - const std::vector zip = compressData( data.data(), data.size() ); + const std::vector zip = zipData( inputStream.data(), inputStream.size() ); if ( zip.empty() ) { return false; } - fileStream.put32( static_cast( data.size() ) ); - fileStream.put32( static_cast( zip.size() ) ); - fileStream.put16( FORMAT_VERSION_0 ); - fileStream.put16( 0 ); // Unused bytes - fileStream.putRaw( zip.data(), zip.size() ); + outputStream.put32( static_cast( inputStream.size() ) ); + outputStream.put32( static_cast( zip.size() ) ); + outputStream.put16( FORMAT_VERSION_0 ); + outputStream.put16( 0 ); // Unused bytes + outputStream.putRaw( zip.data(), zip.size() ); - return !fileStream.fail(); + return !outputStream.fail(); } fheroes2::Image CreateImageFromZlib( int32_t width, int32_t height, const uint8_t * imageData, size_t imageSize, bool doubleLayer ) @@ -182,7 +182,7 @@ namespace Compression return {}; } - const std::vector & uncompressedData = decompressData( imageData, imageSize ); + const std::vector & uncompressedData = unzipData( imageData, imageSize ); if ( doubleLayer && ( uncompressedData.size() & 1 ) == 1 ) { return {}; } diff --git a/src/engine/zzlib.h b/src/engine/zzlib.h index f9a8369d09f..6bebd643261 100644 --- a/src/engine/zzlib.h +++ b/src/engine/zzlib.h @@ -30,29 +30,29 @@ #include "image.h" +class IStreamBase; +class OStreamBase; class IStreamBuf; -class RWStreamBuf; -class StreamFile; namespace Compression { - // Zips the input data and returns the compressed data or an empty vector in case of an error. - std::vector compressData( const uint8_t * src, const size_t srcSize ); - // Unzips the input data and returns the uncompressed data or an empty vector in case of an error. // The 'realSize' parameter represents the planned size of the decompressed data and is optional // (it is only used to speed up the decompression process). If this parameter is omitted or set to // zero, the size of the decompressed data will be determined automatically. - std::vector decompressData( const uint8_t * src, const size_t srcSize, size_t realSize = 0 ); + std::vector unzipData( const uint8_t * src, const size_t srcSize, size_t realSize = 0 ); + + // Zips the input data and returns the compressed data or an empty vector in case of an error. + std::vector zipData( const uint8_t * src, const size_t srcSize ); - // Reads & unzips the zipped chunk from the specified file stream and appends - // it to the end of the buffer. Returns true on success or false on error. - bool readFromFileStream( StreamFile & fileStream, RWStreamBuf & output ); + // Reads & unzips the zipped chunk from the given input stream and writes it to the given output + // stream. Returns true on success or false on error. + bool unzipStream( IStreamBase & inputStream, OStreamBase & outputStream ); // Zips the contents of the buffer from the current read position to the end of the buffer and writes - // it to the specified file stream. The current read position of the buffer does not change. Returns + // it to the given output stream. The current read position of the buffer does not change. Returns // true on success and false on error. - bool writeIntoFileStream( StreamFile & fileStream, IStreamBuf & data ); + bool zipStreamBuf( IStreamBuf & inputStream, OStreamBase & outputStream ); fheroes2::Image CreateImageFromZlib( int32_t width, int32_t height, const uint8_t * imageData, size_t imageSize, bool doubleLayer ); } diff --git a/src/fheroes2/game/game_io.cpp b/src/fheroes2/game/game_io.cpp index f72cb65e7f1..298c7f73b27 100644 --- a/src/fheroes2/game/game_io.cpp +++ b/src/fheroes2/game/game_io.cpp @@ -147,7 +147,7 @@ bool Game::Save( const std::string & filePath, const bool autoSave /* = false */ // End-of-data marker dataStream << SAV2ID3; - if ( dataStream.fail() || !Compression::writeIntoFileStream( fileStream, dataStream ) ) { + if ( dataStream.fail() || !Compression::zipStreamBuf( dataStream, fileStream ) ) { return false; } @@ -228,7 +228,7 @@ fheroes2::GameMode Game::Load( const std::string & filePath ) RWStreamBuf dataStream; dataStream.setBigendian( true ); - if ( !Compression::readFromFileStream( fileStream, dataStream ) ) { + if ( !Compression::unzipStream( fileStream, dataStream ) ) { showGenericErrorMessage(); return fheroes2::GameMode::CANCEL; } diff --git a/src/fheroes2/game/highscores.cpp b/src/fheroes2/game/highscores.cpp index 174b2a41eb6..9230a6f19ce 100644 --- a/src/fheroes2/game/highscores.cpp +++ b/src/fheroes2/game/highscores.cpp @@ -137,7 +137,7 @@ namespace fheroes2 RWStreamBuf hdata; hdata.setBigendian( true ); - if ( !Compression::readFromFileStream( fileStream, hdata ) ) { + if ( !Compression::unzipStream( fileStream, hdata ) ) { return false; } @@ -211,7 +211,7 @@ namespace fheroes2 hdata.setBigendian( true ); hdata << highscoreFileMagicValueV2 << _highScoresStandard << _highScoresCampaign; - return !hdata.fail() && Compression::writeIntoFileStream( fileStream, hdata ); + return !hdata.fail() && Compression::zipStreamBuf( hdata, fileStream ); } int32_t HighScoreDataContainer::registerScoreStandard( HighscoreData && data ) diff --git a/src/fheroes2/maps/map_format_info.cpp b/src/fheroes2/maps/map_format_info.cpp index 99f3d9b7328..c110ad57eb9 100644 --- a/src/fheroes2/maps/map_format_info.cpp +++ b/src/fheroes2/maps/map_format_info.cpp @@ -215,7 +215,7 @@ namespace compressed << map.additionalInfo << map.tiles << map.dailyEvents << map.rumors << map.standardMetadata << map.castleMetadata << map.heroMetadata << map.sphinxMetadata << map.signMetadata << map.adventureMapEventMetadata << map.shrineMetadata; - const std::vector temp = Compression::compressData( compressed.data(), compressed.size() ); + const std::vector temp = Compression::zipData( compressed.data(), compressed.size() ); stream.putRaw( temp.data(), temp.size() ); @@ -241,7 +241,7 @@ namespace return false; } - const std::vector decompressedData = Compression::decompressData( temp.data(), temp.size() ); + const std::vector decompressedData = Compression::unzipData( temp.data(), temp.size() ); if ( decompressedData.empty() ) { // This is a corrupted file. map = {};