mirror of
https://github.com/pocoproject/poco.git
synced 2025-11-06 05:00:04 +01:00
Added CM_AUTO, which automatically selects CM_STORE or CM_DEFLATE based on file extension. Used to avoid double-compression of already compressed file formats such as images.
This commit is contained in:
@@ -23,6 +23,7 @@
|
||||
#include "Poco/StreamCopier.h"
|
||||
#include "Poco/File.h"
|
||||
#include "Poco/FileStream.h"
|
||||
#include "Poco/String.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
@@ -37,6 +38,10 @@ Compress::Compress(std::ostream& out, bool seekableOut):
|
||||
_dirs(),
|
||||
_offset(0)
|
||||
{
|
||||
_storeExtensions.insert("gif");
|
||||
_storeExtensions.insert("png");
|
||||
_storeExtensions.insert("jpg");
|
||||
_storeExtensions.insert("jpeg");
|
||||
}
|
||||
|
||||
|
||||
@@ -47,6 +52,15 @@ Compress::~Compress()
|
||||
|
||||
void Compress::addEntry(std::istream& in, const Poco::DateTime& lastModifiedAt, const Poco::Path& fileName, ZipCommon::CompressionMethod cm, ZipCommon::CompressionLevel cl)
|
||||
{
|
||||
if (cm == ZipCommon::CM_AUTO)
|
||||
{
|
||||
std::string ext = Poco::toLower(fileName.getExtension());
|
||||
if (_storeExtensions.find(ext) != _storeExtensions.end())
|
||||
cm = ZipCommon::CM_STORE;
|
||||
else
|
||||
cm = ZipCommon::CM_DEFLATE;
|
||||
}
|
||||
|
||||
std::string fn = ZipUtil::validZipEntryFileName(fileName);
|
||||
|
||||
if (_files.size() >= 65535)
|
||||
@@ -300,4 +314,14 @@ ZipArchive Compress::close()
|
||||
}
|
||||
|
||||
|
||||
void Compress::setStoreExtensions(const std::set<std::string>& extensions)
|
||||
{
|
||||
_storeExtensions.clear();
|
||||
for (std::set<std::string>::const_iterator it = extensions.begin(); it != extensions.end(); ++it)
|
||||
{
|
||||
_storeExtensions.insert(Poco::toLower(*it));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
|
||||
Reference in New Issue
Block a user