mirror of
https://github.com/pocoproject/poco.git
synced 2025-11-24 14:20:10 +01:00
Zip changes from 1.3.5
This commit is contained in:
120
Zip/src/Add.cpp
120
Zip/src/Add.cpp
@@ -1,60 +1,60 @@
|
||||
//
|
||||
// Add.cpp
|
||||
//
|
||||
// $Id: //poco/1.3/Zip/src/Add.cpp#1 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Manipulation
|
||||
// Module: Add
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/Add.h"
|
||||
#include "Poco/Zip/Compress.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
Add::Add(const std::string& zipPath, const std::string& localPath, ZipCommon::CompressionMethod cm, ZipCommon::CompressionLevel cl):
|
||||
_zipPath(zipPath),
|
||||
_localPath(localPath),
|
||||
_cm(cm),
|
||||
_cl(cl)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void Add::execute(Compress& c, std::istream& input)
|
||||
{
|
||||
c.addFile(Poco::Path(_localPath), Poco::Path(_zipPath), _cm, _cl);
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
//
|
||||
// Add.cpp
|
||||
//
|
||||
// $Id: //poco/Main/Zip/src/Add.cpp#1 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Manipulation
|
||||
// Module: Add
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/Add.h"
|
||||
#include "Poco/Zip/Compress.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
Add::Add(const std::string& zipPath, const std::string& localPath, ZipCommon::CompressionMethod cm, ZipCommon::CompressionLevel cl):
|
||||
_zipPath(zipPath),
|
||||
_localPath(localPath),
|
||||
_cm(cm),
|
||||
_cl(cl)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void Add::execute(Compress& c, std::istream& input)
|
||||
{
|
||||
c.addFile(Poco::Path(_localPath), Poco::Path(_zipPath), _cm, _cl);
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
|
||||
@@ -1,252 +1,252 @@
|
||||
//
|
||||
// AutoDetectStream.cpp
|
||||
//
|
||||
// $Id: //poco/1.3/Zip/src/AutoDetectStream.cpp#4 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Zip
|
||||
// Module: AutoDetectStream
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/AutoDetectStream.h"
|
||||
#include "Poco/Zip/ZipLocalFileHeader.h"
|
||||
#include "Poco/Zip/ZipArchiveInfo.h"
|
||||
#include "Poco/Zip/ZipDataInfo.h"
|
||||
#include "Poco/Zip/ZipFileInfo.h"
|
||||
#include "Poco/Exception.h"
|
||||
#include <cstring>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
AutoDetectStreamBuf::AutoDetectStreamBuf(std::istream& in, const std::string& pre, const std::string& post, bool reposition, Poco::UInt32 start):
|
||||
Poco::BufferedStreamBuf(STREAM_BUFFER_SIZE, std::ios::in),
|
||||
_pIstr(&in),
|
||||
_pOstr(0),
|
||||
_eofDetected(false),
|
||||
_matchCnt(0),
|
||||
_prefix(pre),
|
||||
_postfix(post),
|
||||
_reposition(reposition),
|
||||
_start(start)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
AutoDetectStreamBuf::AutoDetectStreamBuf(std::ostream& out):
|
||||
Poco::BufferedStreamBuf(STREAM_BUFFER_SIZE, std::ios::out),
|
||||
_pIstr(0),
|
||||
_pOstr(&out),
|
||||
_eofDetected(false),
|
||||
_matchCnt(0),
|
||||
_prefix(),
|
||||
_postfix(),
|
||||
_reposition(false),
|
||||
_start(0u)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
AutoDetectStreamBuf::~AutoDetectStreamBuf()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
int AutoDetectStreamBuf::readFromDevice(char* buffer, std::streamsize length)
|
||||
{
|
||||
poco_assert_dbg(length >= 8);
|
||||
if (_pIstr == 0 ||length == 0) return -1;
|
||||
|
||||
if (_reposition)
|
||||
{
|
||||
_pIstr->seekg(_start, std::ios_base::beg);
|
||||
_reposition = false;
|
||||
}
|
||||
|
||||
if (!_prefix.empty())
|
||||
{
|
||||
std::streamsize tmp = (_prefix.size() > length)? length: static_cast<std::streamsize>(_prefix.size());
|
||||
std::memcpy(buffer, _prefix.c_str(), tmp);
|
||||
_prefix = _prefix.substr(tmp);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
if (_eofDetected)
|
||||
{
|
||||
if (!_postfix.empty())
|
||||
{
|
||||
std::streamsize tmp = (_postfix.size() > length)? length: static_cast<std::streamsize>(_postfix.size());
|
||||
std::memcpy(buffer, _postfix.c_str(), tmp);
|
||||
_postfix = _postfix.substr(tmp);
|
||||
return tmp;
|
||||
}
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!_pIstr->good())
|
||||
return -1;
|
||||
|
||||
char byte3('\x00');
|
||||
std::streamsize tempPos = 0;
|
||||
static std::istream::int_type eof = std::istream::traits_type::eof();
|
||||
while (_pIstr->good() && !_pIstr->eof() && (tempPos+4) < length)
|
||||
{
|
||||
std::istream::int_type c = _pIstr->get();
|
||||
if (c != eof)
|
||||
{
|
||||
// all zip headers start with the same 2byte prefix
|
||||
if (_matchCnt<2)
|
||||
{
|
||||
if (c == ZipLocalFileHeader::HEADER[_matchCnt])
|
||||
++_matchCnt;
|
||||
else
|
||||
{
|
||||
// matchcnt was either 0 or 1 the headers have all unique chars -> safe to set to 0
|
||||
if (_matchCnt == 1)
|
||||
{
|
||||
buffer[tempPos++] = ZipLocalFileHeader::HEADER[0];
|
||||
}
|
||||
_matchCnt = 0;
|
||||
|
||||
buffer[tempPos++] = static_cast<char>(c);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//the upper 2 bytes differ: the lower one must be in range 1,3,5,7, the upper must be one larger: 2,4,6,8
|
||||
if (_matchCnt == 2)
|
||||
{
|
||||
if (ZipLocalFileHeader::HEADER[2] == c ||
|
||||
ZipArchiveInfo::HEADER[2] == c ||
|
||||
ZipFileInfo::HEADER[2] == c ||
|
||||
ZipDataInfo::HEADER[2] == c)
|
||||
{
|
||||
byte3 = static_cast<char>(c);;
|
||||
_matchCnt++;
|
||||
}
|
||||
else
|
||||
{
|
||||
buffer[tempPos++] = ZipLocalFileHeader::HEADER[0];
|
||||
buffer[tempPos++] = ZipLocalFileHeader::HEADER[1];
|
||||
buffer[tempPos++] = static_cast<char>(c);
|
||||
_matchCnt = 0;
|
||||
}
|
||||
}
|
||||
else if (_matchCnt == 3)
|
||||
{
|
||||
if (c-1 == byte3)
|
||||
{
|
||||
// a match, pushback
|
||||
_pIstr->putback(c);
|
||||
_pIstr->putback(byte3);
|
||||
_pIstr->putback(ZipLocalFileHeader::HEADER[1]);
|
||||
_pIstr->putback(ZipLocalFileHeader::HEADER[0]);
|
||||
_eofDetected = true;
|
||||
return tempPos;
|
||||
}
|
||||
else
|
||||
{
|
||||
buffer[tempPos++] = ZipLocalFileHeader::HEADER[0];
|
||||
buffer[tempPos++] = ZipLocalFileHeader::HEADER[1];
|
||||
buffer[tempPos++] = byte3;
|
||||
buffer[tempPos++] = c;
|
||||
_matchCnt = 0; //the headers have all unique chars -> safe to set to 0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return tempPos;
|
||||
|
||||
}
|
||||
|
||||
|
||||
int AutoDetectStreamBuf::writeToDevice(const char* buffer, std::streamsize length)
|
||||
{
|
||||
if (_pOstr == 0 || length == 0) return -1;
|
||||
_pOstr->write(buffer, length);
|
||||
if (_pOstr->good())
|
||||
return length;
|
||||
throw Poco::IOException("Failed to write to output stream");
|
||||
}
|
||||
|
||||
|
||||
AutoDetectIOS::AutoDetectIOS(std::istream& istr, const std::string& pre, const std::string& post, bool reposition, Poco::UInt32 start):
|
||||
_buf(istr, pre, post, reposition, start)
|
||||
{
|
||||
poco_ios_init(&_buf);
|
||||
}
|
||||
|
||||
|
||||
AutoDetectIOS::AutoDetectIOS(std::ostream& ostr): _buf(ostr)
|
||||
{
|
||||
poco_ios_init(&_buf);
|
||||
}
|
||||
|
||||
|
||||
AutoDetectIOS::~AutoDetectIOS()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
AutoDetectStreamBuf* AutoDetectIOS::rdbuf()
|
||||
{
|
||||
return &_buf;
|
||||
}
|
||||
|
||||
|
||||
AutoDetectInputStream::AutoDetectInputStream(std::istream& istr, const std::string& pre, const std::string& post, bool reposition, Poco::UInt32 start):
|
||||
AutoDetectIOS(istr, pre, post, reposition, start),
|
||||
std::istream(&_buf)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
AutoDetectInputStream::~AutoDetectInputStream()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
AutoDetectOutputStream::AutoDetectOutputStream(std::ostream& ostr):
|
||||
AutoDetectIOS(ostr),
|
||||
std::ostream(&_buf)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
AutoDetectOutputStream::~AutoDetectOutputStream()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
//
|
||||
// AutoDetectStream.cpp
|
||||
//
|
||||
// $Id: //poco/Main/Zip/src/AutoDetectStream.cpp#6 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Zip
|
||||
// Module: AutoDetectStream
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/AutoDetectStream.h"
|
||||
#include "Poco/Zip/ZipLocalFileHeader.h"
|
||||
#include "Poco/Zip/ZipArchiveInfo.h"
|
||||
#include "Poco/Zip/ZipDataInfo.h"
|
||||
#include "Poco/Zip/ZipFileInfo.h"
|
||||
#include "Poco/Exception.h"
|
||||
#include <cstring>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
AutoDetectStreamBuf::AutoDetectStreamBuf(std::istream& in, const std::string& pre, const std::string& post, bool reposition, Poco::UInt32 start):
|
||||
Poco::BufferedStreamBuf(STREAM_BUFFER_SIZE, std::ios::in),
|
||||
_pIstr(&in),
|
||||
_pOstr(0),
|
||||
_eofDetected(false),
|
||||
_matchCnt(0),
|
||||
_prefix(pre),
|
||||
_postfix(post),
|
||||
_reposition(reposition),
|
||||
_start(start)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
AutoDetectStreamBuf::AutoDetectStreamBuf(std::ostream& out):
|
||||
Poco::BufferedStreamBuf(STREAM_BUFFER_SIZE, std::ios::out),
|
||||
_pIstr(0),
|
||||
_pOstr(&out),
|
||||
_eofDetected(false),
|
||||
_matchCnt(0),
|
||||
_prefix(),
|
||||
_postfix(),
|
||||
_reposition(false),
|
||||
_start(0u)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
AutoDetectStreamBuf::~AutoDetectStreamBuf()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
int AutoDetectStreamBuf::readFromDevice(char* buffer, std::streamsize length)
|
||||
{
|
||||
poco_assert_dbg(length >= 8);
|
||||
if (_pIstr == 0 ||length == 0) return -1;
|
||||
|
||||
if (_reposition)
|
||||
{
|
||||
_pIstr->seekg(_start, std::ios_base::beg);
|
||||
_reposition = false;
|
||||
}
|
||||
|
||||
if (!_prefix.empty())
|
||||
{
|
||||
std::streamsize tmp = (_prefix.size() > length)? length: static_cast<std::streamsize>(_prefix.size());
|
||||
std::memcpy(buffer, _prefix.c_str(), tmp);
|
||||
_prefix = _prefix.substr(tmp);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
if (_eofDetected)
|
||||
{
|
||||
if (!_postfix.empty())
|
||||
{
|
||||
std::streamsize tmp = (_postfix.size() > length)? length: static_cast<std::streamsize>(_postfix.size());
|
||||
std::memcpy(buffer, _postfix.c_str(), tmp);
|
||||
_postfix = _postfix.substr(tmp);
|
||||
return tmp;
|
||||
}
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!_pIstr->good())
|
||||
return -1;
|
||||
|
||||
char byte3('\x00');
|
||||
std::streamsize tempPos = 0;
|
||||
static std::istream::int_type eof = std::istream::traits_type::eof();
|
||||
while (_pIstr->good() && !_pIstr->eof() && (tempPos+4) < length)
|
||||
{
|
||||
std::istream::int_type c = _pIstr->get();
|
||||
if (c != eof)
|
||||
{
|
||||
// all zip headers start with the same 2byte prefix
|
||||
if (_matchCnt<2)
|
||||
{
|
||||
if (c == ZipLocalFileHeader::HEADER[_matchCnt])
|
||||
++_matchCnt;
|
||||
else
|
||||
{
|
||||
// matchcnt was either 0 or 1 the headers have all unique chars -> safe to set to 0
|
||||
if (_matchCnt == 1)
|
||||
{
|
||||
buffer[tempPos++] = ZipLocalFileHeader::HEADER[0];
|
||||
}
|
||||
_matchCnt = 0;
|
||||
|
||||
buffer[tempPos++] = static_cast<char>(c);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//the upper 2 bytes differ: the lower one must be in range 1,3,5,7, the upper must be one larger: 2,4,6,8
|
||||
if (_matchCnt == 2)
|
||||
{
|
||||
if (ZipLocalFileHeader::HEADER[2] == c ||
|
||||
ZipArchiveInfo::HEADER[2] == c ||
|
||||
ZipFileInfo::HEADER[2] == c ||
|
||||
ZipDataInfo::HEADER[2] == c)
|
||||
{
|
||||
byte3 = static_cast<char>(c);;
|
||||
_matchCnt++;
|
||||
}
|
||||
else
|
||||
{
|
||||
buffer[tempPos++] = ZipLocalFileHeader::HEADER[0];
|
||||
buffer[tempPos++] = ZipLocalFileHeader::HEADER[1];
|
||||
buffer[tempPos++] = static_cast<char>(c);
|
||||
_matchCnt = 0;
|
||||
}
|
||||
}
|
||||
else if (_matchCnt == 3)
|
||||
{
|
||||
if (c-1 == byte3)
|
||||
{
|
||||
// a match, pushback
|
||||
_pIstr->putback(c);
|
||||
_pIstr->putback(byte3);
|
||||
_pIstr->putback(ZipLocalFileHeader::HEADER[1]);
|
||||
_pIstr->putback(ZipLocalFileHeader::HEADER[0]);
|
||||
_eofDetected = true;
|
||||
return tempPos;
|
||||
}
|
||||
else
|
||||
{
|
||||
buffer[tempPos++] = ZipLocalFileHeader::HEADER[0];
|
||||
buffer[tempPos++] = ZipLocalFileHeader::HEADER[1];
|
||||
buffer[tempPos++] = byte3;
|
||||
buffer[tempPos++] = c;
|
||||
_matchCnt = 0; //the headers have all unique chars -> safe to set to 0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return tempPos;
|
||||
|
||||
}
|
||||
|
||||
|
||||
int AutoDetectStreamBuf::writeToDevice(const char* buffer, std::streamsize length)
|
||||
{
|
||||
if (_pOstr == 0 || length == 0) return -1;
|
||||
_pOstr->write(buffer, length);
|
||||
if (_pOstr->good())
|
||||
return length;
|
||||
throw Poco::IOException("Failed to write to output stream");
|
||||
}
|
||||
|
||||
|
||||
AutoDetectIOS::AutoDetectIOS(std::istream& istr, const std::string& pre, const std::string& post, bool reposition, Poco::UInt32 start):
|
||||
_buf(istr, pre, post, reposition, start)
|
||||
{
|
||||
poco_ios_init(&_buf);
|
||||
}
|
||||
|
||||
|
||||
AutoDetectIOS::AutoDetectIOS(std::ostream& ostr): _buf(ostr)
|
||||
{
|
||||
poco_ios_init(&_buf);
|
||||
}
|
||||
|
||||
|
||||
AutoDetectIOS::~AutoDetectIOS()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
AutoDetectStreamBuf* AutoDetectIOS::rdbuf()
|
||||
{
|
||||
return &_buf;
|
||||
}
|
||||
|
||||
|
||||
AutoDetectInputStream::AutoDetectInputStream(std::istream& istr, const std::string& pre, const std::string& post, bool reposition, Poco::UInt32 start):
|
||||
AutoDetectIOS(istr, pre, post, reposition, start),
|
||||
std::istream(&_buf)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
AutoDetectInputStream::~AutoDetectInputStream()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
AutoDetectOutputStream::AutoDetectOutputStream(std::ostream& ostr):
|
||||
AutoDetectIOS(ostr),
|
||||
std::ostream(&_buf)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
AutoDetectOutputStream::~AutoDetectOutputStream()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
|
||||
@@ -314,9 +314,7 @@ ZipArchive Compress::close()
|
||||
std::string centr(central.createHeader());
|
||||
_out.write(centr.c_str(), static_cast<std::streamsize>(centr.size()));
|
||||
_out.flush();
|
||||
// SunPro C++ fix
|
||||
std::pair<UInt16, ZipArchiveInfo> par(0, central);
|
||||
_dirs.insert(par);
|
||||
_dirs.insert(std::make_pair(0, central));
|
||||
return ZipArchive(_files, _infos, _dirs);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,194 +1,193 @@
|
||||
//
|
||||
// Decompress.cpp
|
||||
//
|
||||
// $Id: //poco/1.3/Zip/src/Decompress.cpp#4 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Zip
|
||||
// Module: Decompress
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/Decompress.h"
|
||||
#include "Poco/Zip/ZipLocalFileHeader.h"
|
||||
#include "Poco/Zip/ZipArchive.h"
|
||||
#include "Poco/Zip/ZipStream.h"
|
||||
#include "Poco/Zip/ZipException.h"
|
||||
#include "Poco/File.h"
|
||||
#include "Poco/Exception.h"
|
||||
#include "Poco/StreamCopier.h"
|
||||
#include "Poco/Delegate.h"
|
||||
#include <fstream>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
Decompress::Decompress(std::istream& in, const Poco::Path& outputDir, bool flattenDirs, bool keepIncompleteFiles):
|
||||
_in(in),
|
||||
_outDir(outputDir),
|
||||
_flattenDirs(flattenDirs),
|
||||
_keepIncompleteFiles(keepIncompleteFiles),
|
||||
_mapping()
|
||||
{
|
||||
_outDir.makeAbsolute();
|
||||
poco_assert (_in.good());
|
||||
Poco::File tmp(_outDir);
|
||||
if (!tmp.exists())
|
||||
{
|
||||
tmp.createDirectories();
|
||||
}
|
||||
if (!tmp.isDirectory())
|
||||
throw Poco::IOException("Failed to create/open directory: " + _outDir.toString());
|
||||
EOk += Poco::Delegate<Decompress, std::pair<const ZipLocalFileHeader, const Poco::Path> >(this, &Decompress::onOk);
|
||||
|
||||
}
|
||||
|
||||
|
||||
Decompress::~Decompress()
|
||||
{
|
||||
EOk -= Poco::Delegate<Decompress, std::pair<const ZipLocalFileHeader, const Poco::Path> >(this, &Decompress::onOk);
|
||||
}
|
||||
|
||||
|
||||
ZipArchive Decompress::decompressAllFiles()
|
||||
{
|
||||
poco_assert (_mapping.empty());
|
||||
ZipArchive arch(_in, *this);
|
||||
return arch;
|
||||
}
|
||||
|
||||
|
||||
bool Decompress::handleZipEntry(std::istream& zipStream, const ZipLocalFileHeader& hdr)
|
||||
{
|
||||
if (hdr.isDirectory())
|
||||
{
|
||||
// directory have 0 size, nth to read
|
||||
if (!_flattenDirs)
|
||||
{
|
||||
std::string dirName = hdr.getFileName();
|
||||
if (dirName.find(ZipCommon::ILLEGAL_PATH) != std::string::npos)
|
||||
throw ZipException("Illegal entry name " + dirName + " containing " + ZipCommon::ILLEGAL_PATH);
|
||||
Poco::Path dir(dirName);
|
||||
dir.makeDirectory();
|
||||
Poco::File aFile(dir);
|
||||
aFile.createDirectories();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
try
|
||||
{
|
||||
std::string fileName = hdr.getFileName();
|
||||
if (_flattenDirs)
|
||||
{
|
||||
// remove path info
|
||||
Poco::Path p(fileName);
|
||||
p.makeFile();
|
||||
fileName = p.getFileName();
|
||||
}
|
||||
|
||||
if (fileName.find(ZipCommon::ILLEGAL_PATH) != std::string::npos)
|
||||
throw ZipException("Illegal entry name " + fileName + " containing " + ZipCommon::ILLEGAL_PATH);
|
||||
|
||||
Poco::Path file(fileName);
|
||||
file.makeFile();
|
||||
Poco::Path dest(_outDir, file);
|
||||
dest.makeFile();
|
||||
if (dest.depth() > 0)
|
||||
{
|
||||
Poco::File aFile(dest.parent());
|
||||
aFile.createDirectories();
|
||||
}
|
||||
std::ofstream out(dest.toString().c_str(), std::ios::binary);
|
||||
if (!out)
|
||||
{
|
||||
std::pair<const ZipLocalFileHeader, const std::string> tmp(hdr, "Failed to open output stream " + dest.toString());
|
||||
EError.notify(this, tmp);
|
||||
return false;
|
||||
}
|
||||
ZipInputStream inp(zipStream, hdr, false);
|
||||
Poco::StreamCopier::copyStream(inp, out);
|
||||
out.close();
|
||||
Poco::File aFile(file);
|
||||
if (!aFile.exists() || !aFile.isFile())
|
||||
{
|
||||
std::pair<const ZipLocalFileHeader, const std::string> tmp(hdr, "Failed to create output stream " + dest.toString());
|
||||
EError.notify(this, tmp);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!inp.crcValid())
|
||||
{
|
||||
if (!_keepIncompleteFiles)
|
||||
aFile.remove();
|
||||
std::pair<const ZipLocalFileHeader, const std::string> tmp(hdr, "CRC mismatch. Corrupt file: " + dest.toString());
|
||||
EError.notify(this, tmp);
|
||||
return false;
|
||||
}
|
||||
|
||||
// cannot check against hdr.getUnCompressedSize if CRC and size are not set in hdr but in a ZipDataInfo
|
||||
// crc is typically enough to detect errors
|
||||
if (aFile.getSize() != hdr.getUncompressedSize() && !hdr.searchCRCAndSizesAfterData())
|
||||
{
|
||||
if (!_keepIncompleteFiles)
|
||||
aFile.remove();
|
||||
std::pair<const ZipLocalFileHeader, const std::string> tmp(hdr, "Filesizes do not match. Corrupt file: " + dest.toString());
|
||||
EError.notify(this, tmp);
|
||||
return false;
|
||||
}
|
||||
|
||||
std::pair<const ZipLocalFileHeader, const Poco::Path> tmp(hdr, file);
|
||||
EOk.notify(this, tmp);
|
||||
}
|
||||
catch (Poco::Exception& e)
|
||||
{
|
||||
std::pair<const ZipLocalFileHeader, const std::string> tmp(hdr, "Exception: " + e.displayText());
|
||||
EError.notify(this, tmp);
|
||||
return false;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
std::pair<const ZipLocalFileHeader, const std::string> tmp(hdr, "Unknown Exception");
|
||||
EError.notify(this, tmp);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void Decompress::onOk(const void*, std::pair<const ZipLocalFileHeader, const Poco::Path>& val)
|
||||
{
|
||||
// std::pair<std::string,Poco::Path> par(val.first.getFileName(), val.second);
|
||||
ZipMapping::value_type p(val.first.getFileName(), val.second);
|
||||
_mapping.insert(p);
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
//
|
||||
// Decompress.cpp
|
||||
//
|
||||
// $Id: //poco/Main/Zip/src/Decompress.cpp#6 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Zip
|
||||
// Module: Decompress
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/Decompress.h"
|
||||
#include "Poco/Zip/ZipLocalFileHeader.h"
|
||||
#include "Poco/Zip/ZipArchive.h"
|
||||
#include "Poco/Zip/ZipStream.h"
|
||||
#include "Poco/Zip/ZipException.h"
|
||||
#include "Poco/File.h"
|
||||
#include "Poco/Exception.h"
|
||||
#include "Poco/StreamCopier.h"
|
||||
#include "Poco/Delegate.h"
|
||||
#include <fstream>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
Decompress::Decompress(std::istream& in, const Poco::Path& outputDir, bool flattenDirs, bool keepIncompleteFiles):
|
||||
_in(in),
|
||||
_outDir(outputDir),
|
||||
_flattenDirs(flattenDirs),
|
||||
_keepIncompleteFiles(keepIncompleteFiles),
|
||||
_mapping()
|
||||
{
|
||||
_outDir.makeAbsolute();
|
||||
_outDir.makeDirectory();
|
||||
poco_assert (_in.good());
|
||||
Poco::File tmp(_outDir);
|
||||
if (!tmp.exists())
|
||||
{
|
||||
tmp.createDirectories();
|
||||
}
|
||||
if (!tmp.isDirectory())
|
||||
throw Poco::IOException("Failed to create/open directory: " + _outDir.toString());
|
||||
EOk += Poco::Delegate<Decompress, std::pair<const ZipLocalFileHeader, const Poco::Path> >(this, &Decompress::onOk);
|
||||
|
||||
}
|
||||
|
||||
|
||||
Decompress::~Decompress()
|
||||
{
|
||||
EOk -= Poco::Delegate<Decompress, std::pair<const ZipLocalFileHeader, const Poco::Path> >(this, &Decompress::onOk);
|
||||
}
|
||||
|
||||
|
||||
ZipArchive Decompress::decompressAllFiles()
|
||||
{
|
||||
poco_assert (_mapping.empty());
|
||||
ZipArchive arch(_in, *this);
|
||||
return arch;
|
||||
}
|
||||
|
||||
|
||||
bool Decompress::handleZipEntry(std::istream& zipStream, const ZipLocalFileHeader& hdr)
|
||||
{
|
||||
if (hdr.isDirectory())
|
||||
{
|
||||
// directory have 0 size, nth to read
|
||||
if (!_flattenDirs)
|
||||
{
|
||||
std::string dirName = hdr.getFileName();
|
||||
if (dirName.find(ZipCommon::ILLEGAL_PATH) != std::string::npos)
|
||||
throw ZipException("Illegal entry name " + dirName + " containing " + ZipCommon::ILLEGAL_PATH);
|
||||
Poco::Path dir(_outDir, dirName);
|
||||
dir.makeDirectory();
|
||||
Poco::File aFile(dir);
|
||||
aFile.createDirectories();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
try
|
||||
{
|
||||
std::string fileName = hdr.getFileName();
|
||||
if (_flattenDirs)
|
||||
{
|
||||
// remove path info
|
||||
Poco::Path p(fileName);
|
||||
p.makeFile();
|
||||
fileName = p.getFileName();
|
||||
}
|
||||
|
||||
if (fileName.find(ZipCommon::ILLEGAL_PATH) != std::string::npos)
|
||||
throw ZipException("Illegal entry name " + fileName + " containing " + ZipCommon::ILLEGAL_PATH);
|
||||
|
||||
Poco::Path file(fileName);
|
||||
file.makeFile();
|
||||
Poco::Path dest(_outDir, file);
|
||||
dest.makeFile();
|
||||
if (dest.depth() > 0)
|
||||
{
|
||||
Poco::File aFile(dest.parent());
|
||||
aFile.createDirectories();
|
||||
}
|
||||
std::ofstream out(dest.toString().c_str(), std::ios::binary);
|
||||
if (!out)
|
||||
{
|
||||
std::pair<const ZipLocalFileHeader, const std::string> tmp = std::make_pair(hdr, "Failed to open output stream " + dest.toString());
|
||||
EError.notify(this, tmp);
|
||||
return false;
|
||||
}
|
||||
ZipInputStream inp(zipStream, hdr, false);
|
||||
Poco::StreamCopier::copyStream(inp, out);
|
||||
out.close();
|
||||
Poco::File aFile(file);
|
||||
if (!aFile.exists() || !aFile.isFile())
|
||||
{
|
||||
std::pair<const ZipLocalFileHeader, const std::string> tmp = std::make_pair(hdr, "Failed to create output stream " + dest.toString());
|
||||
EError.notify(this, tmp);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!inp.crcValid())
|
||||
{
|
||||
if (!_keepIncompleteFiles)
|
||||
aFile.remove();
|
||||
std::pair<const ZipLocalFileHeader, const std::string> tmp = std::make_pair(hdr, "CRC mismatch. Corrupt file: " + dest.toString());
|
||||
EError.notify(this, tmp);
|
||||
return false;
|
||||
}
|
||||
|
||||
// cannot check against hdr.getUnCompressedSize if CRC and size are not set in hdr but in a ZipDataInfo
|
||||
// crc is typically enough to detect errors
|
||||
if (aFile.getSize() != hdr.getUncompressedSize() && !hdr.searchCRCAndSizesAfterData())
|
||||
{
|
||||
if (!_keepIncompleteFiles)
|
||||
aFile.remove();
|
||||
std::pair<const ZipLocalFileHeader, const std::string> tmp = std::make_pair(hdr, "Filesizes do not match. Corrupt file: " + dest.toString());
|
||||
EError.notify(this, tmp);
|
||||
return false;
|
||||
}
|
||||
|
||||
std::pair<const ZipLocalFileHeader, const Poco::Path> tmp = std::make_pair(hdr, file);
|
||||
EOk.notify(this, tmp);
|
||||
}
|
||||
catch (Poco::Exception& e)
|
||||
{
|
||||
std::pair<const ZipLocalFileHeader, const std::string> tmp = std::make_pair(hdr, std::string("Exception: " + e.displayText()));
|
||||
EError.notify(this, tmp);
|
||||
return false;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
std::pair<const ZipLocalFileHeader, const std::string> tmp = std::make_pair(hdr, std::string("Unknown Exception"));
|
||||
EError.notify(this, tmp);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void Decompress::onOk(const void*, std::pair<const ZipLocalFileHeader, const Poco::Path>& val)
|
||||
{
|
||||
_mapping.insert(std::make_pair(val.first.getFileName(), val.second));
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
|
||||
@@ -1,63 +1,56 @@
|
||||
//
|
||||
// Delete.cpp
|
||||
//
|
||||
// $Id: //poco/1.3/Zip/src/Delete.cpp#1 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Manipulation
|
||||
// Module: Delete
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/Delete.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
Delete::Delete(const ZipLocalFileHeader& hdr):
|
||||
_hdr(hdr)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void Delete::execute(Compress& c, std::istream& input)
|
||||
{
|
||||
// due to absolute positioning in compress we don't need to do this
|
||||
/*
|
||||
input.seekg(_hdr.getEndPos(), std::ios_base::beg);
|
||||
if (_hdr.searchCRCAndSizesAfterData())
|
||||
{
|
||||
ZipDataInfo info(in, false);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
//
|
||||
// Delete.cpp
|
||||
//
|
||||
// $Id: //poco/Main/Zip/src/Delete.cpp#2 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Manipulation
|
||||
// Module: Delete
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/Delete.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
Delete::Delete(const ZipLocalFileHeader& hdr):
|
||||
_hdr(hdr)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void Delete::execute(Compress& c, std::istream& input)
|
||||
{
|
||||
// due to absolute positioning in compress we don't need to do anything
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
|
||||
118
Zip/src/Keep.cpp
118
Zip/src/Keep.cpp
@@ -1,59 +1,59 @@
|
||||
//
|
||||
// Keep.cpp
|
||||
//
|
||||
// $Id: //poco/1.3/Zip/src/Keep.cpp#1 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Manipulation
|
||||
// Module: Keep
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/Keep.h"
|
||||
#include "Poco/Zip/Compress.h"
|
||||
#include "Poco/Buffer.h"
|
||||
#include "Poco/StreamCopier.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
Keep::Keep(const ZipLocalFileHeader& hdr):
|
||||
_hdr(hdr)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void Keep::execute(Compress& c, std::istream& input)
|
||||
{
|
||||
c.addFileRaw(input, _hdr, _hdr.getFileName());
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
//
|
||||
// Keep.cpp
|
||||
//
|
||||
// $Id: //poco/Main/Zip/src/Keep.cpp#1 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Manipulation
|
||||
// Module: Keep
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/Keep.h"
|
||||
#include "Poco/Zip/Compress.h"
|
||||
#include "Poco/Buffer.h"
|
||||
#include "Poco/StreamCopier.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
Keep::Keep(const ZipLocalFileHeader& hdr):
|
||||
_hdr(hdr)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void Keep::execute(Compress& c, std::istream& input)
|
||||
{
|
||||
c.addFileRaw(input, _hdr, _hdr.getFileName());
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
|
||||
@@ -1,54 +1,54 @@
|
||||
//
|
||||
// ParseCallback.cpp
|
||||
//
|
||||
// $Id: //poco/1.3/Zip/src/ParseCallback.cpp#3 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Zip
|
||||
// Module: ParseCallback
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/ParseCallback.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
ParseCallback::ParseCallback()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
ParseCallback::~ParseCallback()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
//
|
||||
// ParseCallback.cpp
|
||||
//
|
||||
// $Id: //poco/Main/Zip/src/ParseCallback.cpp#4 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Zip
|
||||
// Module: ParseCallback
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/ParseCallback.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
ParseCallback::ParseCallback()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
ParseCallback::~ParseCallback()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
|
||||
@@ -1,269 +1,269 @@
|
||||
//
|
||||
// PartialStream.cpp
|
||||
//
|
||||
// $Id: //poco/1.3/Zip/src/PartialStream.cpp#3 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Zip
|
||||
// Module: PartialStream
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/PartialStream.h"
|
||||
#include "Poco/Exception.h"
|
||||
#include <cstring>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
PartialStreamBuf::PartialStreamBuf(std::istream& in, std::ios::pos_type start, std::ios::pos_type end, const std::string& pre, const std::string& post, bool initStream):
|
||||
Poco::BufferedStreamBuf(STREAM_BUFFER_SIZE, std::ios::in),
|
||||
_initialized(!initStream),
|
||||
_start(start),
|
||||
_numBytes(end-start),
|
||||
_bytesWritten(0),
|
||||
_pIstr(&in),
|
||||
_pOstr(0),
|
||||
_prefix(pre),
|
||||
_postfix(post),
|
||||
_ignoreStart(0),
|
||||
_buffer(0),
|
||||
_bufferOffset(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
PartialStreamBuf::PartialStreamBuf(std::ostream& out, std::size_t start, std::size_t end, bool initStream):
|
||||
Poco::BufferedStreamBuf(STREAM_BUFFER_SIZE, std::ios::out),
|
||||
_initialized(!initStream),
|
||||
_start(0),
|
||||
_numBytes(0),
|
||||
_bytesWritten(0),
|
||||
_pIstr(0),
|
||||
_pOstr(&out),
|
||||
_ignoreStart(start),
|
||||
_buffer(end),
|
||||
_bufferOffset(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
PartialStreamBuf::~PartialStreamBuf()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
int PartialStreamBuf::readFromDevice(char* buffer, std::streamsize length)
|
||||
{
|
||||
if (_pIstr == 0 ||length == 0) return -1;
|
||||
if (!_initialized)
|
||||
{
|
||||
_initialized = true;
|
||||
_pIstr->clear();
|
||||
_pIstr->seekg(_start, std::ios_base::beg);
|
||||
if (_pIstr->fail())
|
||||
throw Poco::IOException("Failed to reposition in stream");
|
||||
}
|
||||
if (!_prefix.empty())
|
||||
{
|
||||
std::streamsize tmp = (_prefix.size() > length)? length: static_cast<std::streamsize>(_prefix.size());
|
||||
std::memcpy(buffer, _prefix.c_str(), tmp);
|
||||
_prefix = _prefix.substr(tmp);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
if (_numBytes == 0)
|
||||
{
|
||||
if (!_postfix.empty())
|
||||
{
|
||||
std::streamsize tmp = (_postfix.size() > length)? length: static_cast<std::streamsize>(_postfix.size());
|
||||
std::memcpy(buffer, _postfix.c_str(), tmp);
|
||||
_postfix = _postfix.substr(tmp);
|
||||
return tmp;
|
||||
}
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!_pIstr->good())
|
||||
return -1;
|
||||
|
||||
if (_numBytes < length)
|
||||
length = static_cast<std::streamsize>(_numBytes);
|
||||
|
||||
_pIstr->read(buffer, length);
|
||||
std::streamsize bytesRead = _pIstr->gcount();
|
||||
_numBytes -= bytesRead;
|
||||
return bytesRead;
|
||||
|
||||
}
|
||||
|
||||
|
||||
int PartialStreamBuf::writeToDevice(const char* buffer, std::streamsize length)
|
||||
{
|
||||
if (_pOstr == 0 || length == 0) return -1;
|
||||
if (!_initialized)
|
||||
{
|
||||
_initialized = true;
|
||||
_pOstr->clear();
|
||||
if (_pOstr->fail())
|
||||
throw Poco::IOException("Failed to clear stream status");
|
||||
}
|
||||
|
||||
if (_ignoreStart > 0)
|
||||
{
|
||||
if (_ignoreStart > length)
|
||||
{
|
||||
_ignoreStart -= length;
|
||||
// fake return values
|
||||
return length;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::streamsize cnt = static_cast<std::streamsize>(length - _ignoreStart - _buffer.size());
|
||||
if (cnt > 0)
|
||||
{
|
||||
_pOstr->write(buffer+_ignoreStart, cnt);
|
||||
_bytesWritten += cnt;
|
||||
}
|
||||
|
||||
// copy the rest into buffer
|
||||
cnt += static_cast<std::streamsize>(_ignoreStart);
|
||||
_ignoreStart = 0;
|
||||
poco_assert (cnt < length);
|
||||
_bufferOffset = length - cnt;
|
||||
std::memcpy(_buffer.begin(), buffer + cnt, _bufferOffset);
|
||||
|
||||
return length;
|
||||
}
|
||||
}
|
||||
if (_buffer.size() > 0)
|
||||
{
|
||||
// always treat each write as the potential last one
|
||||
// thus first fill the buffer with the last n bytes of the msg
|
||||
|
||||
// how much of the already cached data do we need to write?
|
||||
Poco::Int32 cache = _bufferOffset + length - _buffer.size();
|
||||
if (cache > 0)
|
||||
{
|
||||
if (cache > _bufferOffset)
|
||||
cache = _bufferOffset;
|
||||
_pOstr->write(_buffer.begin(), cache);
|
||||
_bytesWritten += cache;
|
||||
_bufferOffset -= cache;
|
||||
if (_bufferOffset > 0)
|
||||
std::memmove(_buffer.begin(), _buffer.begin()+cache, _bufferOffset);
|
||||
}
|
||||
|
||||
// now fill up _buffer with the last bytes from buffer
|
||||
Poco::Int32 pos = static_cast<Poco::Int32>(length - static_cast<Poco::Int32>(_buffer.size()) + _bufferOffset);
|
||||
if (pos <= 0)
|
||||
{
|
||||
// all of the message goes to _buffer
|
||||
std::memcpy(_buffer.begin() + _bufferOffset, buffer, length);
|
||||
}
|
||||
else
|
||||
{
|
||||
poco_assert (_bufferOffset == 0);
|
||||
std::memcpy(_buffer.begin(), buffer+pos, _buffer.size());
|
||||
_bufferOffset = static_cast<Poco::UInt32>(_buffer.size());
|
||||
// the rest is written
|
||||
_pOstr->write(buffer, static_cast<std::streamsize>(length - _buffer.size()));
|
||||
_bytesWritten += (length - _buffer.size());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_pOstr->write(buffer, length);
|
||||
_bytesWritten += length;
|
||||
}
|
||||
|
||||
if (_pOstr->good())
|
||||
return length;
|
||||
|
||||
throw Poco::IOException("Failed to write to output stream");
|
||||
}
|
||||
|
||||
|
||||
void PartialStreamBuf::close()
|
||||
{
|
||||
// DONT write data from _buffer!
|
||||
}
|
||||
|
||||
|
||||
PartialIOS::PartialIOS(std::istream& istr, std::ios::pos_type start, std::ios::pos_type end, const std::string& pre, const std::string& post, bool initStream): _buf(istr, start, end, pre, post, initStream)
|
||||
{
|
||||
poco_ios_init(&_buf);
|
||||
}
|
||||
|
||||
|
||||
PartialIOS::PartialIOS(std::ostream& ostr, std::size_t start, std::size_t end, bool initStream): _buf(ostr, start, end, initStream)
|
||||
{
|
||||
poco_ios_init(&_buf);
|
||||
}
|
||||
|
||||
|
||||
PartialIOS::~PartialIOS()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
PartialStreamBuf* PartialIOS::rdbuf()
|
||||
{
|
||||
return &_buf;
|
||||
}
|
||||
|
||||
|
||||
PartialInputStream::PartialInputStream(std::istream& istr, std::ios::pos_type start, std::ios::pos_type end, bool initStream, const std::string& pre, const std::string& post):
|
||||
PartialIOS(istr, start, end, pre, post, initStream),
|
||||
std::istream(&_buf)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
PartialInputStream::~PartialInputStream()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
PartialOutputStream::PartialOutputStream(std::ostream& ostr, std::size_t start, std::size_t end, bool initStream):
|
||||
PartialIOS(ostr, start, end, initStream),
|
||||
std::ostream(&_buf)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
PartialOutputStream::~PartialOutputStream()
|
||||
{
|
||||
close();
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
//
|
||||
// PartialStream.cpp
|
||||
//
|
||||
// $Id: //poco/Main/Zip/src/PartialStream.cpp#8 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Zip
|
||||
// Module: PartialStream
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/PartialStream.h"
|
||||
#include "Poco/Exception.h"
|
||||
#include <cstring>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
PartialStreamBuf::PartialStreamBuf(std::istream& in, std::ios::pos_type start, std::ios::pos_type end, const std::string& pre, const std::string& post, bool initStream):
|
||||
Poco::BufferedStreamBuf(STREAM_BUFFER_SIZE, std::ios::in),
|
||||
_initialized(!initStream),
|
||||
_start(start),
|
||||
_numBytes(end-start),
|
||||
_bytesWritten(0),
|
||||
_pIstr(&in),
|
||||
_pOstr(0),
|
||||
_prefix(pre),
|
||||
_postfix(post),
|
||||
_ignoreStart(0),
|
||||
_buffer(0),
|
||||
_bufferOffset(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
PartialStreamBuf::PartialStreamBuf(std::ostream& out, std::size_t start, std::size_t end, bool initStream):
|
||||
Poco::BufferedStreamBuf(STREAM_BUFFER_SIZE, std::ios::out),
|
||||
_initialized(!initStream),
|
||||
_start(0),
|
||||
_numBytes(0),
|
||||
_bytesWritten(0),
|
||||
_pIstr(0),
|
||||
_pOstr(&out),
|
||||
_ignoreStart(start),
|
||||
_buffer(end),
|
||||
_bufferOffset(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
PartialStreamBuf::~PartialStreamBuf()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
int PartialStreamBuf::readFromDevice(char* buffer, std::streamsize length)
|
||||
{
|
||||
if (_pIstr == 0 ||length == 0) return -1;
|
||||
if (!_initialized)
|
||||
{
|
||||
_initialized = true;
|
||||
_pIstr->clear();
|
||||
_pIstr->seekg(_start, std::ios_base::beg);
|
||||
if (_pIstr->fail())
|
||||
throw Poco::IOException("Failed to reposition in stream");
|
||||
}
|
||||
if (!_prefix.empty())
|
||||
{
|
||||
std::streamsize tmp = (_prefix.size() > length)? length: static_cast<std::streamsize>(_prefix.size());
|
||||
std::memcpy(buffer, _prefix.c_str(), tmp);
|
||||
_prefix = _prefix.substr(tmp);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
if (_numBytes == 0)
|
||||
{
|
||||
if (!_postfix.empty())
|
||||
{
|
||||
std::streamsize tmp = (_postfix.size() > length)? length: static_cast<std::streamsize>(_postfix.size());
|
||||
std::memcpy(buffer, _postfix.c_str(), tmp);
|
||||
_postfix = _postfix.substr(tmp);
|
||||
return tmp;
|
||||
}
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!_pIstr->good())
|
||||
return -1;
|
||||
|
||||
if (_numBytes < length)
|
||||
length = static_cast<std::streamsize>(_numBytes);
|
||||
|
||||
_pIstr->read(buffer, length);
|
||||
std::streamsize bytesRead = _pIstr->gcount();
|
||||
_numBytes -= bytesRead;
|
||||
return bytesRead;
|
||||
|
||||
}
|
||||
|
||||
|
||||
int PartialStreamBuf::writeToDevice(const char* buffer, std::streamsize length)
|
||||
{
|
||||
if (_pOstr == 0 || length == 0) return -1;
|
||||
if (!_initialized)
|
||||
{
|
||||
_initialized = true;
|
||||
_pOstr->clear();
|
||||
if (_pOstr->fail())
|
||||
throw Poco::IOException("Failed to clear stream status");
|
||||
}
|
||||
|
||||
if (_ignoreStart > 0)
|
||||
{
|
||||
if (_ignoreStart > length)
|
||||
{
|
||||
_ignoreStart -= length;
|
||||
// fake return values
|
||||
return length;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::streamsize cnt = static_cast<std::streamsize>(length - _ignoreStart - _buffer.size());
|
||||
if (cnt > 0)
|
||||
{
|
||||
_pOstr->write(buffer+_ignoreStart, cnt);
|
||||
_bytesWritten += cnt;
|
||||
}
|
||||
|
||||
// copy the rest into buffer
|
||||
cnt += static_cast<std::streamsize>(_ignoreStart);
|
||||
_ignoreStart = 0;
|
||||
poco_assert (cnt < length);
|
||||
_bufferOffset = length - cnt;
|
||||
std::memcpy(_buffer.begin(), buffer + cnt, _bufferOffset);
|
||||
|
||||
return length;
|
||||
}
|
||||
}
|
||||
if (_buffer.size() > 0)
|
||||
{
|
||||
// always treat each write as the potential last one
|
||||
// thus first fill the buffer with the last n bytes of the msg
|
||||
|
||||
// how much of the already cached data do we need to write?
|
||||
Poco::Int32 cache = _bufferOffset + length - _buffer.size();
|
||||
if (cache > 0)
|
||||
{
|
||||
if (cache > _bufferOffset)
|
||||
cache = _bufferOffset;
|
||||
_pOstr->write(_buffer.begin(), cache);
|
||||
_bytesWritten += cache;
|
||||
_bufferOffset -= cache;
|
||||
if (_bufferOffset > 0)
|
||||
std::memmove(_buffer.begin(), _buffer.begin()+cache, _bufferOffset);
|
||||
}
|
||||
|
||||
// now fill up _buffer with the last bytes from buffer
|
||||
Poco::Int32 pos = static_cast<Poco::Int32>(length - static_cast<Poco::Int32>(_buffer.size()) + _bufferOffset);
|
||||
if (pos <= 0)
|
||||
{
|
||||
// all of the message goes to _buffer
|
||||
std::memcpy(_buffer.begin() + _bufferOffset, buffer, length);
|
||||
}
|
||||
else
|
||||
{
|
||||
poco_assert (_bufferOffset == 0);
|
||||
std::memcpy(_buffer.begin(), buffer+pos, _buffer.size());
|
||||
_bufferOffset = static_cast<Poco::UInt32>(_buffer.size());
|
||||
// the rest is written
|
||||
_pOstr->write(buffer, static_cast<std::streamsize>(length - _buffer.size()));
|
||||
_bytesWritten += (length - _buffer.size());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_pOstr->write(buffer, length);
|
||||
_bytesWritten += length;
|
||||
}
|
||||
|
||||
if (_pOstr->good())
|
||||
return length;
|
||||
|
||||
throw Poco::IOException("Failed to write to output stream");
|
||||
}
|
||||
|
||||
|
||||
void PartialStreamBuf::close()
|
||||
{
|
||||
// DONT write data from _buffer!
|
||||
}
|
||||
|
||||
|
||||
PartialIOS::PartialIOS(std::istream& istr, std::ios::pos_type start, std::ios::pos_type end, const std::string& pre, const std::string& post, bool initStream): _buf(istr, start, end, pre, post, initStream)
|
||||
{
|
||||
poco_ios_init(&_buf);
|
||||
}
|
||||
|
||||
|
||||
PartialIOS::PartialIOS(std::ostream& ostr, std::size_t start, std::size_t end, bool initStream): _buf(ostr, start, end, initStream)
|
||||
{
|
||||
poco_ios_init(&_buf);
|
||||
}
|
||||
|
||||
|
||||
PartialIOS::~PartialIOS()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
PartialStreamBuf* PartialIOS::rdbuf()
|
||||
{
|
||||
return &_buf;
|
||||
}
|
||||
|
||||
|
||||
PartialInputStream::PartialInputStream(std::istream& istr, std::ios::pos_type start, std::ios::pos_type end, bool initStream, const std::string& pre, const std::string& post):
|
||||
PartialIOS(istr, start, end, pre, post, initStream),
|
||||
std::istream(&_buf)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
PartialInputStream::~PartialInputStream()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
PartialOutputStream::PartialOutputStream(std::ostream& ostr, std::size_t start, std::size_t end, bool initStream):
|
||||
PartialIOS(ostr, start, end, initStream),
|
||||
std::ostream(&_buf)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
PartialOutputStream::~PartialOutputStream()
|
||||
{
|
||||
close();
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
|
||||
@@ -1,58 +1,58 @@
|
||||
//
|
||||
// Rename.cpp
|
||||
//
|
||||
// $Id: //poco/1.3/Zip/src/Rename.cpp#1 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Manipulation
|
||||
// Module: Rename
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/Rename.h"
|
||||
#include "Poco/Zip/Compress.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
Rename::Rename(const ZipLocalFileHeader& hdr, const std::string& newZipEntryName):
|
||||
_hdr(hdr),
|
||||
_newZipEntryName(newZipEntryName)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void Rename::execute(Compress& c, std::istream& input)
|
||||
{
|
||||
c.addFileRaw(input, _hdr, _newZipEntryName);
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
//
|
||||
// Rename.cpp
|
||||
//
|
||||
// $Id: //poco/Main/Zip/src/Rename.cpp#1 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Manipulation
|
||||
// Module: Rename
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/Rename.h"
|
||||
#include "Poco/Zip/Compress.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
Rename::Rename(const ZipLocalFileHeader& hdr, const std::string& newZipEntryName):
|
||||
_hdr(hdr),
|
||||
_newZipEntryName(newZipEntryName)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void Rename::execute(Compress& c, std::istream& input)
|
||||
{
|
||||
c.addFileRaw(input, _hdr, _newZipEntryName);
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
|
||||
@@ -1,60 +1,59 @@
|
||||
//
|
||||
// Replace.cpp
|
||||
//
|
||||
// $Id: //poco/1.3/Zip/src/Replace.cpp#1 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Manipulation
|
||||
// Module: Replace
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/Replace.h"
|
||||
#include "Poco/Zip/Compress.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
Replace::Replace(const ZipLocalFileHeader& hdr, const std::string& localPath):
|
||||
_del(hdr),
|
||||
_add(hdr.getFileName(), localPath, hdr.getCompressionMethod(), hdr.getCompressionLevel())
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Replace::execute(Compress& c, std::istream& input)
|
||||
{
|
||||
_del.execute(c, input);
|
||||
_add.execute(c, input);
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
//
|
||||
// Replace.cpp
|
||||
//
|
||||
// $Id: //poco/Main/Zip/src/Replace.cpp#2 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Manipulation
|
||||
// Module: Replace
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/Replace.h"
|
||||
#include "Poco/Zip/Compress.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
Replace::Replace(const ZipLocalFileHeader& hdr, const std::string& localPath):
|
||||
_del(hdr),
|
||||
_add(hdr.getFileName(), localPath, hdr.getCompressionMethod(), hdr.getCompressionLevel())
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void Replace::execute(Compress& c, std::istream& input)
|
||||
{
|
||||
_del.execute(c, input);
|
||||
_add.execute(c, input);
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
|
||||
@@ -1,66 +1,66 @@
|
||||
//
|
||||
// SkipCallback.cpp
|
||||
//
|
||||
// $Id: //poco/1.3/Zip/src/SkipCallback.cpp#4 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Zip
|
||||
// Module: SkipCallback
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/SkipCallback.h"
|
||||
#include "Poco/Zip/ZipLocalFileHeader.h"
|
||||
#include "Poco/Zip/ZipUtil.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
SkipCallback::SkipCallback()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
SkipCallback::~SkipCallback()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
bool SkipCallback::handleZipEntry(std::istream& zipStream, const ZipLocalFileHeader& hdr)
|
||||
{
|
||||
if (!hdr.searchCRCAndSizesAfterData())
|
||||
zipStream.seekg(hdr.getCompressedSize(), std::ios_base::cur);
|
||||
else
|
||||
ZipUtil::sync(zipStream);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
//
|
||||
// SkipCallback.cpp
|
||||
//
|
||||
// $Id: //poco/Main/Zip/src/SkipCallback.cpp#5 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Zip
|
||||
// Module: SkipCallback
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/SkipCallback.h"
|
||||
#include "Poco/Zip/ZipLocalFileHeader.h"
|
||||
#include "Poco/Zip/ZipUtil.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
SkipCallback::SkipCallback()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
SkipCallback::~SkipCallback()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
bool SkipCallback::handleZipEntry(std::istream& zipStream, const ZipLocalFileHeader& hdr)
|
||||
{
|
||||
if (!hdr.searchCRCAndSizesAfterData())
|
||||
zipStream.seekg(hdr.getCompressedSize(), std::ios_base::cur);
|
||||
else
|
||||
ZipUtil::sync(zipStream);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
|
||||
@@ -1,122 +1,121 @@
|
||||
//
|
||||
// ZipArchive.cpp
|
||||
//
|
||||
// $Id: //poco/1.3/Zip/src/ZipArchive.cpp#3 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Zip
|
||||
// Module: ZipArchive
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/ZipArchive.h"
|
||||
#include "Poco/Zip/SkipCallback.h"
|
||||
#include "Poco/Exception.h"
|
||||
#include <cstring>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
ZipArchive::ZipArchive(std::istream& in):
|
||||
_entries(),
|
||||
_infos(),
|
||||
_disks()
|
||||
{
|
||||
poco_assert_dbg (in);
|
||||
SkipCallback skip;
|
||||
parse(in, skip);
|
||||
}
|
||||
|
||||
|
||||
ZipArchive::ZipArchive(const FileHeaders& entries, const FileInfos& infos, const DirectoryInfos& dirs):
|
||||
_entries(entries),
|
||||
_infos(infos),
|
||||
_disks(dirs)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
ZipArchive::ZipArchive(std::istream& in, ParseCallback& pc):
|
||||
_entries(),
|
||||
_infos(),
|
||||
_disks()
|
||||
{
|
||||
poco_assert_dbg (in);
|
||||
parse(in, pc);
|
||||
}
|
||||
|
||||
|
||||
ZipArchive::~ZipArchive()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void ZipArchive::parse(std::istream& in, ParseCallback& pc)
|
||||
{
|
||||
// read 4 bytes
|
||||
while (in.good() && !in.eof())
|
||||
{
|
||||
char header[ZipCommon::HEADER_SIZE]={'\x00', '\x00', '\x00', '\x00'};
|
||||
in.read(header, ZipCommon::HEADER_SIZE);
|
||||
if (in.eof())
|
||||
return;
|
||||
if (std::memcmp(header, ZipLocalFileHeader::HEADER, ZipCommon::HEADER_SIZE) == 0)
|
||||
{
|
||||
ZipLocalFileHeader entry(in, true, pc);
|
||||
poco_assert (_entries.insert(std::make_pair(entry.getFileName(), entry)).second);
|
||||
}
|
||||
else if (std::memcmp(header, ZipFileInfo::HEADER, ZipCommon::HEADER_SIZE) == 0)
|
||||
{
|
||||
ZipFileInfo info(in, true);
|
||||
FileHeaders::iterator it = _entries.find(info.getFileName());
|
||||
if (it != _entries.end())
|
||||
{
|
||||
it->second.setStartPos(info.getRelativeOffsetOfLocalHeader());
|
||||
}
|
||||
poco_assert (_infos.insert(std::make_pair(info.getFileName(), info)).second);
|
||||
}
|
||||
else if (std::memcmp(header, ZipArchiveInfo::HEADER, ZipCommon::HEADER_SIZE) == 0)
|
||||
{
|
||||
ZipArchiveInfo nfo(in, true);
|
||||
poco_assert (_disks.insert(std::make_pair(nfo.getDiskNumber(), nfo)).second);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_disks.empty())
|
||||
throw Poco::IllegalStateException("Illegal header in zip file");
|
||||
else
|
||||
throw Poco::IllegalStateException("Garbage after directory header");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
//
|
||||
// ZipArchive.cpp
|
||||
//
|
||||
// $Id: //poco/Main/Zip/src/ZipArchive.cpp#8 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Zip
|
||||
// Module: ZipArchive
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/ZipArchive.h"
|
||||
#include "Poco/Zip/SkipCallback.h"
|
||||
#include "Poco/Exception.h"
|
||||
#include <cstring>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
ZipArchive::ZipArchive(std::istream& in):
|
||||
_entries(),
|
||||
_infos(),
|
||||
_disks()
|
||||
{
|
||||
poco_assert_dbg (in);
|
||||
SkipCallback skip;
|
||||
parse(in, skip);
|
||||
}
|
||||
|
||||
|
||||
ZipArchive::ZipArchive(const FileHeaders& entries, const FileInfos& infos, const DirectoryInfos& dirs):
|
||||
_entries(entries),
|
||||
_infos(infos),
|
||||
_disks(dirs)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
ZipArchive::ZipArchive(std::istream& in, ParseCallback& pc):
|
||||
_entries(),
|
||||
_infos(),
|
||||
_disks()
|
||||
{
|
||||
poco_assert_dbg (in);
|
||||
parse(in, pc);
|
||||
}
|
||||
|
||||
|
||||
ZipArchive::~ZipArchive()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void ZipArchive::parse(std::istream& in, ParseCallback& pc)
|
||||
{
|
||||
// read 4 bytes
|
||||
while (in.good() && !in.eof())
|
||||
{
|
||||
char header[ZipCommon::HEADER_SIZE]={'\x00', '\x00', '\x00', '\x00'};
|
||||
in.read(header, ZipCommon::HEADER_SIZE);
|
||||
if (in.eof())
|
||||
return;
|
||||
if (std::memcmp(header, ZipLocalFileHeader::HEADER, ZipCommon::HEADER_SIZE) == 0)
|
||||
{
|
||||
ZipLocalFileHeader entry(in, true, pc);
|
||||
poco_assert (_entries.insert(std::make_pair(entry.getFileName(), entry)).second);
|
||||
}
|
||||
else if (std::memcmp(header, ZipFileInfo::HEADER, ZipCommon::HEADER_SIZE) == 0)
|
||||
{
|
||||
ZipFileInfo info(in, true);
|
||||
FileHeaders::iterator it = _entries.find(info.getFileName());
|
||||
if (it != _entries.end())
|
||||
{
|
||||
it->second.setStartPos(info.getRelativeOffsetOfLocalHeader());
|
||||
}
|
||||
poco_assert (_infos.insert(std::make_pair(info.getFileName(), info)).second);
|
||||
}
|
||||
else if (std::memcmp(header, ZipArchiveInfo::HEADER, ZipCommon::HEADER_SIZE) == 0)
|
||||
{
|
||||
ZipArchiveInfo nfo(in, true);
|
||||
poco_assert (_disks.insert(std::make_pair(nfo.getDiskNumber(), nfo)).second);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_disks.empty())
|
||||
throw Poco::IllegalStateException("Illegal header in zip file");
|
||||
else
|
||||
throw Poco::IllegalStateException("Garbage after directory header");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
|
||||
@@ -1,106 +1,106 @@
|
||||
//
|
||||
// ZipArchiveInfo.cpp
|
||||
//
|
||||
// $Id: //poco/1.3/Zip/src/ZipArchiveInfo.cpp#3 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Zip
|
||||
// Module: ZipArchiveInfo
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/ZipArchiveInfo.h"
|
||||
#include "Poco/Buffer.h"
|
||||
#include <istream>
|
||||
#include <cstring>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
const char ZipArchiveInfo::HEADER[ZipCommon::HEADER_SIZE] = {'\x50', '\x4b', '\x05', '\x06'};
|
||||
|
||||
|
||||
ZipArchiveInfo::ZipArchiveInfo(std::istream& in, bool assumeHeaderRead):
|
||||
_rawInfo(),
|
||||
_startPos(in.tellg()),
|
||||
_comment()
|
||||
{
|
||||
if (assumeHeaderRead)
|
||||
_startPos -= ZipCommon::HEADER_SIZE;
|
||||
parse(in, assumeHeaderRead);
|
||||
}
|
||||
|
||||
ZipArchiveInfo::ZipArchiveInfo():
|
||||
_rawInfo(),
|
||||
_startPos(0),
|
||||
_comment()
|
||||
{
|
||||
std::memset(_rawInfo, 0, FULLHEADER_SIZE);
|
||||
std::memcpy(_rawInfo, HEADER, ZipCommon::HEADER_SIZE);
|
||||
}
|
||||
|
||||
|
||||
ZipArchiveInfo::~ZipArchiveInfo()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void ZipArchiveInfo::parse(std::istream& inp, bool assumeHeaderRead)
|
||||
{
|
||||
if (!assumeHeaderRead)
|
||||
{
|
||||
inp.read(_rawInfo, ZipCommon::HEADER_SIZE);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::memcpy(_rawInfo, HEADER, ZipCommon::HEADER_SIZE);
|
||||
}
|
||||
poco_assert (std::memcmp(_rawInfo, HEADER, ZipCommon::HEADER_SIZE) == 0);
|
||||
// read the rest of the header
|
||||
inp.read(_rawInfo + ZipCommon::HEADER_SIZE, FULLHEADER_SIZE - ZipCommon::HEADER_SIZE);
|
||||
Poco::UInt16 len = getZipCommentSize();
|
||||
if (len > 0)
|
||||
{
|
||||
Poco::Buffer<char> buf(len);
|
||||
inp.read(buf.begin(), len);
|
||||
_comment = std::string(buf.begin(), len);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
std::string ZipArchiveInfo::createHeader() const
|
||||
{
|
||||
std::string result(_rawInfo, FULLHEADER_SIZE);
|
||||
result.append(_comment);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
//
|
||||
// ZipArchiveInfo.cpp
|
||||
//
|
||||
// $Id: //poco/Main/Zip/src/ZipArchiveInfo.cpp#7 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Zip
|
||||
// Module: ZipArchiveInfo
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/ZipArchiveInfo.h"
|
||||
#include "Poco/Buffer.h"
|
||||
#include <istream>
|
||||
#include <cstring>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
const char ZipArchiveInfo::HEADER[ZipCommon::HEADER_SIZE] = {'\x50', '\x4b', '\x05', '\x06'};
|
||||
|
||||
|
||||
ZipArchiveInfo::ZipArchiveInfo(std::istream& in, bool assumeHeaderRead):
|
||||
_rawInfo(),
|
||||
_startPos(in.tellg()),
|
||||
_comment()
|
||||
{
|
||||
if (assumeHeaderRead)
|
||||
_startPos -= ZipCommon::HEADER_SIZE;
|
||||
parse(in, assumeHeaderRead);
|
||||
}
|
||||
|
||||
ZipArchiveInfo::ZipArchiveInfo():
|
||||
_rawInfo(),
|
||||
_startPos(0),
|
||||
_comment()
|
||||
{
|
||||
std::memset(_rawInfo, 0, FULLHEADER_SIZE);
|
||||
std::memcpy(_rawInfo, HEADER, ZipCommon::HEADER_SIZE);
|
||||
}
|
||||
|
||||
|
||||
ZipArchiveInfo::~ZipArchiveInfo()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void ZipArchiveInfo::parse(std::istream& inp, bool assumeHeaderRead)
|
||||
{
|
||||
if (!assumeHeaderRead)
|
||||
{
|
||||
inp.read(_rawInfo, ZipCommon::HEADER_SIZE);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::memcpy(_rawInfo, HEADER, ZipCommon::HEADER_SIZE);
|
||||
}
|
||||
poco_assert (std::memcmp(_rawInfo, HEADER, ZipCommon::HEADER_SIZE) == 0);
|
||||
// read the rest of the header
|
||||
inp.read(_rawInfo + ZipCommon::HEADER_SIZE, FULLHEADER_SIZE - ZipCommon::HEADER_SIZE);
|
||||
Poco::UInt16 len = getZipCommentSize();
|
||||
if (len > 0)
|
||||
{
|
||||
Poco::Buffer<char> buf(len);
|
||||
inp.read(buf.begin(), len);
|
||||
_comment = std::string(buf.begin(), len);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
std::string ZipArchiveInfo::createHeader() const
|
||||
{
|
||||
std::string result(_rawInfo, FULLHEADER_SIZE);
|
||||
result.append(_comment);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
|
||||
@@ -1,47 +1,47 @@
|
||||
//
|
||||
// ZipCommon.cpp
|
||||
//
|
||||
// $Id: //poco/1.3/Zip/src/ZipCommon.cpp#3 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Zip
|
||||
// Module: ZipCommon
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/ZipCommon.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
const std::string ZipCommon::ILLEGAL_PATH("..");
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
//
|
||||
// ZipCommon.cpp
|
||||
//
|
||||
// $Id: //poco/Main/Zip/src/ZipCommon.cpp#3 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Zip
|
||||
// Module: ZipCommon
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/ZipCommon.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
const std::string ZipCommon::ILLEGAL_PATH("..");
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
|
||||
@@ -1,79 +1,79 @@
|
||||
//
|
||||
// ZipDataInfo.cpp
|
||||
//
|
||||
// $Id: //poco/1.3/Zip/src/ZipDataInfo.cpp#3 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Zip
|
||||
// Module: ZipDataInfo
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/ZipDataInfo.h"
|
||||
#include <istream>
|
||||
#include <cstring>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
const char ZipDataInfo::HEADER[ZipCommon::HEADER_SIZE] = {'\x50', '\x4b', '\x07', '\x08'};
|
||||
|
||||
|
||||
ZipDataInfo::ZipDataInfo():
|
||||
_rawInfo(),
|
||||
_valid(true)
|
||||
{
|
||||
std::memcpy(_rawInfo, HEADER, ZipCommon::HEADER_SIZE);
|
||||
std::memset(_rawInfo+ZipCommon::HEADER_SIZE, 0, FULLHEADER_SIZE - ZipCommon::HEADER_SIZE);
|
||||
_valid = true;
|
||||
}
|
||||
|
||||
|
||||
ZipDataInfo::ZipDataInfo(std::istream& in, bool assumeHeaderRead):
|
||||
_rawInfo(),
|
||||
_valid(false)
|
||||
{
|
||||
if (assumeHeaderRead)
|
||||
std::memcpy(_rawInfo, HEADER, ZipCommon::HEADER_SIZE);
|
||||
else
|
||||
in.read(_rawInfo, ZipCommon::HEADER_SIZE);
|
||||
poco_assert (std::memcmp(_rawInfo, HEADER, ZipCommon::HEADER_SIZE) == 0);
|
||||
// now copy the rest of the header
|
||||
in.read(_rawInfo+ZipCommon::HEADER_SIZE, FULLHEADER_SIZE - ZipCommon::HEADER_SIZE);
|
||||
_valid = (!in.eof() && in.good());
|
||||
}
|
||||
|
||||
|
||||
ZipDataInfo::~ZipDataInfo()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
//
|
||||
// ZipDataInfo.cpp
|
||||
//
|
||||
// $Id: //poco/Main/Zip/src/ZipDataInfo.cpp#5 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Zip
|
||||
// Module: ZipDataInfo
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/ZipDataInfo.h"
|
||||
#include <istream>
|
||||
#include <cstring>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
const char ZipDataInfo::HEADER[ZipCommon::HEADER_SIZE] = {'\x50', '\x4b', '\x07', '\x08'};
|
||||
|
||||
|
||||
ZipDataInfo::ZipDataInfo():
|
||||
_rawInfo(),
|
||||
_valid(true)
|
||||
{
|
||||
std::memcpy(_rawInfo, HEADER, ZipCommon::HEADER_SIZE);
|
||||
std::memset(_rawInfo+ZipCommon::HEADER_SIZE, 0, FULLHEADER_SIZE - ZipCommon::HEADER_SIZE);
|
||||
_valid = true;
|
||||
}
|
||||
|
||||
|
||||
ZipDataInfo::ZipDataInfo(std::istream& in, bool assumeHeaderRead):
|
||||
_rawInfo(),
|
||||
_valid(false)
|
||||
{
|
||||
if (assumeHeaderRead)
|
||||
std::memcpy(_rawInfo, HEADER, ZipCommon::HEADER_SIZE);
|
||||
else
|
||||
in.read(_rawInfo, ZipCommon::HEADER_SIZE);
|
||||
poco_assert (std::memcmp(_rawInfo, HEADER, ZipCommon::HEADER_SIZE) == 0);
|
||||
// now copy the rest of the header
|
||||
in.read(_rawInfo+ZipCommon::HEADER_SIZE, FULLHEADER_SIZE - ZipCommon::HEADER_SIZE);
|
||||
_valid = (!in.eof() && in.good());
|
||||
}
|
||||
|
||||
|
||||
ZipDataInfo::~ZipDataInfo()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
|
||||
@@ -1,49 +1,49 @@
|
||||
//
|
||||
// ZipException.cpp
|
||||
//
|
||||
// $Id: //poco/1.3/Zip/src/ZipException.cpp#4 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Zip
|
||||
// Module: ZipException
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/ZipException.h"
|
||||
#include <typeinfo>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
POCO_IMPLEMENT_EXCEPTION(ZipException, Poco::RuntimeException, "ZIP Exception")
|
||||
POCO_IMPLEMENT_EXCEPTION(ZipManipulationException, ZipException, "ZIP Manipulation Exception")
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
//
|
||||
// ZipException.cpp
|
||||
//
|
||||
// $Id: //poco/Main/Zip/src/ZipException.cpp#4 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Zip
|
||||
// Module: ZipException
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/ZipException.h"
|
||||
#include <typeinfo>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
POCO_IMPLEMENT_EXCEPTION(ZipException, Poco::RuntimeException, "ZIP Exception")
|
||||
POCO_IMPLEMENT_EXCEPTION(ZipManipulationException, ZipException, "ZIP Manipulation Exception")
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
|
||||
@@ -1,238 +1,238 @@
|
||||
//
|
||||
// ZipLocalFileHeader.cpp
|
||||
//
|
||||
// $Id: //poco/1.3/Zip/src/ZipLocalFileHeader.cpp#4 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Zip
|
||||
// Module: ZipLocalFileHeader
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/ZipLocalFileHeader.h"
|
||||
#include "Poco/Zip/ZipDataInfo.h"
|
||||
#include "Poco/Zip/ParseCallback.h"
|
||||
#include "Poco/Buffer.h"
|
||||
#include "Poco/Exception.h"
|
||||
#include "Poco/File.h"
|
||||
#include <cstring>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
const char ZipLocalFileHeader::HEADER[ZipCommon::HEADER_SIZE] = {'\x50', '\x4b', '\x03', '\x04'};
|
||||
|
||||
|
||||
ZipLocalFileHeader::ZipLocalFileHeader(const Poco::Path& fileName,
|
||||
const Poco::DateTime& lastModifiedAt,
|
||||
ZipCommon::CompressionMethod cm,
|
||||
ZipCommon::CompressionLevel cl):
|
||||
_rawHeader(),
|
||||
_startPos(-1),
|
||||
_endPos(-1),
|
||||
_fileName(),
|
||||
_lastModifiedAt(),
|
||||
_extraField(),
|
||||
_crc32(0),
|
||||
_compressedSize(0),
|
||||
_uncompressedSize(0)
|
||||
{
|
||||
std::memcpy(_rawHeader, HEADER, ZipCommon::HEADER_SIZE);
|
||||
std::memset(_rawHeader+ZipCommon::HEADER_SIZE, 0, FULLHEADER_SIZE - ZipCommon::HEADER_SIZE);
|
||||
ZipCommon::HostSystem hs = ZipCommon::HS_FAT;
|
||||
|
||||
#if (POCO_OS == POCO_OS_CYGWIN)
|
||||
hs = ZipCommon::HS_UNIX;
|
||||
#endif
|
||||
#if (POCO_OS == POCO_OS_VMS)
|
||||
hs = ZipCommon::HS_VMS;
|
||||
#endif
|
||||
#if defined(POCO_OS_FAMILY_UNIX)
|
||||
hs = ZipCommon::HS_UNIX;
|
||||
#endif
|
||||
setHostSystem(hs);
|
||||
setEncryption(false);
|
||||
setExtraFieldSize(0);
|
||||
setLastModifiedAt(lastModifiedAt);
|
||||
init(fileName, cm, cl);
|
||||
}
|
||||
|
||||
|
||||
ZipLocalFileHeader::ZipLocalFileHeader(std::istream& inp, bool assumeHeaderRead, ParseCallback& callback):
|
||||
_rawHeader(),
|
||||
_startPos(inp.tellg()),
|
||||
_endPos(-1),
|
||||
_fileName(),
|
||||
_lastModifiedAt(),
|
||||
_extraField(),
|
||||
_crc32(0),
|
||||
_compressedSize(0),
|
||||
_uncompressedSize(0)
|
||||
{
|
||||
poco_assert_dbg( (EXTRAFIELD_POS+EXTRAFIELD_LENGTH) == FULLHEADER_SIZE);
|
||||
|
||||
if (assumeHeaderRead)
|
||||
_startPos -= ZipCommon::HEADER_SIZE;
|
||||
|
||||
parse(inp, assumeHeaderRead);
|
||||
|
||||
bool ok = callback.handleZipEntry(inp, *this);
|
||||
|
||||
if (ok)
|
||||
{
|
||||
if (searchCRCAndSizesAfterData())
|
||||
{
|
||||
ZipDataInfo nfo(inp, false);
|
||||
setCRC(nfo.getCRC32());
|
||||
setCompressedSize(nfo.getCompressedSize());
|
||||
setUncompressedSize(nfo.getUncompressedSize());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
poco_assert_dbg(!searchCRCAndSizesAfterData());
|
||||
ZipUtil::sync(inp);
|
||||
}
|
||||
_endPos = _startPos + getHeaderSize() + _compressedSize; // exclude the data block!
|
||||
}
|
||||
|
||||
|
||||
ZipLocalFileHeader::~ZipLocalFileHeader()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void ZipLocalFileHeader::parse(std::istream& inp, bool assumeHeaderRead)
|
||||
{
|
||||
if (!assumeHeaderRead)
|
||||
{
|
||||
inp.read(_rawHeader, ZipCommon::HEADER_SIZE);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::memcpy(_rawHeader, HEADER, ZipCommon::HEADER_SIZE);
|
||||
}
|
||||
poco_assert (std::memcmp(_rawHeader, HEADER, ZipCommon::HEADER_SIZE) == 0);
|
||||
// read the rest of the header
|
||||
inp.read(_rawHeader + ZipCommon::HEADER_SIZE, FULLHEADER_SIZE - ZipCommon::HEADER_SIZE);
|
||||
poco_assert (_rawHeader[VERSION_POS + 1]>= ZipCommon::HS_FAT && _rawHeader[VERSION_POS + 1] < ZipCommon::HS_UNUSED);
|
||||
poco_assert (getMajorVersionNumber() <= 2);
|
||||
poco_assert (ZipUtil::get16BitValue(_rawHeader, COMPR_METHOD_POS) < ZipCommon::CM_UNUSED);
|
||||
parseDateTime();
|
||||
Poco::UInt16 len = getFileNameLength();
|
||||
Poco::Buffer<char> buf(len);
|
||||
inp.read(buf.begin(), len);
|
||||
_fileName = std::string(buf.begin(), len);
|
||||
if (hasExtraField())
|
||||
{
|
||||
len = getExtraFieldLength();
|
||||
Poco::Buffer<char> xtra(len);
|
||||
inp.read(xtra.begin(), len);
|
||||
_extraField = std::string(xtra.begin(), len);
|
||||
}
|
||||
if (!searchCRCAndSizesAfterData())
|
||||
{
|
||||
_crc32 = getCRCFromHeader();
|
||||
_compressedSize = getCompressedSizeFromHeader();
|
||||
_uncompressedSize = getUncompressedSizeFromHeader();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool ZipLocalFileHeader::searchCRCAndSizesAfterData() const
|
||||
{
|
||||
if (getCompressionMethod() == ZipCommon::CM_DEFLATE)
|
||||
{
|
||||
// check bit 3
|
||||
return ((ZipUtil::get16BitValue(_rawHeader, GENERAL_PURPOSE_POS) & 0x0008) != 0);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void ZipLocalFileHeader::setFileName(const std::string& fileName, bool isDirectory)
|
||||
{
|
||||
poco_assert (!fileName.empty());
|
||||
Poco::Path aPath(fileName);
|
||||
|
||||
if (isDirectory)
|
||||
{
|
||||
aPath.makeDirectory();
|
||||
setCRC(0);
|
||||
setCompressedSize(0);
|
||||
setUncompressedSize(0);
|
||||
setCompressionMethod(ZipCommon::CM_STORE);
|
||||
setCompressionLevel(ZipCommon::CL_NORMAL);
|
||||
}
|
||||
else
|
||||
{
|
||||
aPath.makeFile();
|
||||
}
|
||||
_fileName = aPath.toString(Poco::Path::PATH_UNIX);
|
||||
if (_fileName[0] == '/')
|
||||
_fileName = _fileName.substr(1);
|
||||
if (isDirectory)
|
||||
{
|
||||
poco_assert_dbg (_fileName[_fileName.size()-1] == '/');
|
||||
}
|
||||
setFileNameLength(static_cast<Poco::UInt16>(_fileName.size()));
|
||||
}
|
||||
|
||||
|
||||
void ZipLocalFileHeader::init( const Poco::Path& fName,
|
||||
ZipCommon::CompressionMethod cm,
|
||||
ZipCommon::CompressionLevel cl)
|
||||
{
|
||||
poco_assert (_fileName.empty());
|
||||
setSearchCRCAndSizesAfterData(false);
|
||||
Poco::Path fileName(fName);
|
||||
fileName.setDevice(""); // clear device!
|
||||
setFileName(fileName.toString(Poco::Path::PATH_UNIX), fileName.isDirectory());
|
||||
setRequiredVersion(2, 0);
|
||||
if (fileName.isFile())
|
||||
{
|
||||
setCompressionMethod(cm);
|
||||
setCompressionLevel(cl);
|
||||
}
|
||||
else
|
||||
setCompressionMethod(ZipCommon::CM_STORE);
|
||||
}
|
||||
|
||||
|
||||
std::string ZipLocalFileHeader::createHeader() const
|
||||
{
|
||||
std::string result(_rawHeader, FULLHEADER_SIZE);
|
||||
result.append(_fileName);
|
||||
result.append(_extraField);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
//
|
||||
// ZipLocalFileHeader.cpp
|
||||
//
|
||||
// $Id: //poco/Main/Zip/src/ZipLocalFileHeader.cpp#9 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Zip
|
||||
// Module: ZipLocalFileHeader
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/ZipLocalFileHeader.h"
|
||||
#include "Poco/Zip/ZipDataInfo.h"
|
||||
#include "Poco/Zip/ParseCallback.h"
|
||||
#include "Poco/Buffer.h"
|
||||
#include "Poco/Exception.h"
|
||||
#include "Poco/File.h"
|
||||
#include <cstring>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
const char ZipLocalFileHeader::HEADER[ZipCommon::HEADER_SIZE] = {'\x50', '\x4b', '\x03', '\x04'};
|
||||
|
||||
|
||||
ZipLocalFileHeader::ZipLocalFileHeader(const Poco::Path& fileName,
|
||||
const Poco::DateTime& lastModifiedAt,
|
||||
ZipCommon::CompressionMethod cm,
|
||||
ZipCommon::CompressionLevel cl):
|
||||
_rawHeader(),
|
||||
_startPos(-1),
|
||||
_endPos(-1),
|
||||
_fileName(),
|
||||
_lastModifiedAt(),
|
||||
_extraField(),
|
||||
_crc32(0),
|
||||
_compressedSize(0),
|
||||
_uncompressedSize(0)
|
||||
{
|
||||
std::memcpy(_rawHeader, HEADER, ZipCommon::HEADER_SIZE);
|
||||
std::memset(_rawHeader+ZipCommon::HEADER_SIZE, 0, FULLHEADER_SIZE - ZipCommon::HEADER_SIZE);
|
||||
ZipCommon::HostSystem hs = ZipCommon::HS_FAT;
|
||||
|
||||
#if (POCO_OS == POCO_OS_CYGWIN)
|
||||
hs = ZipCommon::HS_UNIX;
|
||||
#endif
|
||||
#if (POCO_OS == POCO_OS_VMS)
|
||||
hs = ZipCommon::HS_VMS;
|
||||
#endif
|
||||
#if defined(POCO_OS_FAMILY_UNIX)
|
||||
hs = ZipCommon::HS_UNIX;
|
||||
#endif
|
||||
setHostSystem(hs);
|
||||
setEncryption(false);
|
||||
setExtraFieldSize(0);
|
||||
setLastModifiedAt(lastModifiedAt);
|
||||
init(fileName, cm, cl);
|
||||
}
|
||||
|
||||
|
||||
ZipLocalFileHeader::ZipLocalFileHeader(std::istream& inp, bool assumeHeaderRead, ParseCallback& callback):
|
||||
_rawHeader(),
|
||||
_startPos(inp.tellg()),
|
||||
_endPos(-1),
|
||||
_fileName(),
|
||||
_lastModifiedAt(),
|
||||
_extraField(),
|
||||
_crc32(0),
|
||||
_compressedSize(0),
|
||||
_uncompressedSize(0)
|
||||
{
|
||||
poco_assert_dbg( (EXTRAFIELD_POS+EXTRAFIELD_LENGTH) == FULLHEADER_SIZE);
|
||||
|
||||
if (assumeHeaderRead)
|
||||
_startPos -= ZipCommon::HEADER_SIZE;
|
||||
|
||||
parse(inp, assumeHeaderRead);
|
||||
|
||||
bool ok = callback.handleZipEntry(inp, *this);
|
||||
|
||||
if (ok)
|
||||
{
|
||||
if (searchCRCAndSizesAfterData())
|
||||
{
|
||||
ZipDataInfo nfo(inp, false);
|
||||
setCRC(nfo.getCRC32());
|
||||
setCompressedSize(nfo.getCompressedSize());
|
||||
setUncompressedSize(nfo.getUncompressedSize());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
poco_assert_dbg(!searchCRCAndSizesAfterData());
|
||||
ZipUtil::sync(inp);
|
||||
}
|
||||
_endPos = _startPos + getHeaderSize() + _compressedSize; // exclude the data block!
|
||||
}
|
||||
|
||||
|
||||
ZipLocalFileHeader::~ZipLocalFileHeader()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void ZipLocalFileHeader::parse(std::istream& inp, bool assumeHeaderRead)
|
||||
{
|
||||
if (!assumeHeaderRead)
|
||||
{
|
||||
inp.read(_rawHeader, ZipCommon::HEADER_SIZE);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::memcpy(_rawHeader, HEADER, ZipCommon::HEADER_SIZE);
|
||||
}
|
||||
poco_assert (std::memcmp(_rawHeader, HEADER, ZipCommon::HEADER_SIZE) == 0);
|
||||
// read the rest of the header
|
||||
inp.read(_rawHeader + ZipCommon::HEADER_SIZE, FULLHEADER_SIZE - ZipCommon::HEADER_SIZE);
|
||||
poco_assert (_rawHeader[VERSION_POS + 1]>= ZipCommon::HS_FAT && _rawHeader[VERSION_POS + 1] < ZipCommon::HS_UNUSED);
|
||||
poco_assert (getMajorVersionNumber() <= 2);
|
||||
poco_assert (ZipUtil::get16BitValue(_rawHeader, COMPR_METHOD_POS) < ZipCommon::CM_UNUSED);
|
||||
parseDateTime();
|
||||
Poco::UInt16 len = getFileNameLength();
|
||||
Poco::Buffer<char> buf(len);
|
||||
inp.read(buf.begin(), len);
|
||||
_fileName = std::string(buf.begin(), len);
|
||||
if (hasExtraField())
|
||||
{
|
||||
len = getExtraFieldLength();
|
||||
Poco::Buffer<char> xtra(len);
|
||||
inp.read(xtra.begin(), len);
|
||||
_extraField = std::string(xtra.begin(), len);
|
||||
}
|
||||
if (!searchCRCAndSizesAfterData())
|
||||
{
|
||||
_crc32 = getCRCFromHeader();
|
||||
_compressedSize = getCompressedSizeFromHeader();
|
||||
_uncompressedSize = getUncompressedSizeFromHeader();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool ZipLocalFileHeader::searchCRCAndSizesAfterData() const
|
||||
{
|
||||
if (getCompressionMethod() == ZipCommon::CM_DEFLATE)
|
||||
{
|
||||
// check bit 3
|
||||
return ((ZipUtil::get16BitValue(_rawHeader, GENERAL_PURPOSE_POS) & 0x0008) != 0);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void ZipLocalFileHeader::setFileName(const std::string& fileName, bool isDirectory)
|
||||
{
|
||||
poco_assert (!fileName.empty());
|
||||
Poco::Path aPath(fileName);
|
||||
|
||||
if (isDirectory)
|
||||
{
|
||||
aPath.makeDirectory();
|
||||
setCRC(0);
|
||||
setCompressedSize(0);
|
||||
setUncompressedSize(0);
|
||||
setCompressionMethod(ZipCommon::CM_STORE);
|
||||
setCompressionLevel(ZipCommon::CL_NORMAL);
|
||||
}
|
||||
else
|
||||
{
|
||||
aPath.makeFile();
|
||||
}
|
||||
_fileName = aPath.toString(Poco::Path::PATH_UNIX);
|
||||
if (_fileName[0] == '/')
|
||||
_fileName = _fileName.substr(1);
|
||||
if (isDirectory)
|
||||
{
|
||||
poco_assert_dbg (_fileName[_fileName.size()-1] == '/');
|
||||
}
|
||||
setFileNameLength(static_cast<Poco::UInt16>(_fileName.size()));
|
||||
}
|
||||
|
||||
|
||||
void ZipLocalFileHeader::init( const Poco::Path& fName,
|
||||
ZipCommon::CompressionMethod cm,
|
||||
ZipCommon::CompressionLevel cl)
|
||||
{
|
||||
poco_assert (_fileName.empty());
|
||||
setSearchCRCAndSizesAfterData(false);
|
||||
Poco::Path fileName(fName);
|
||||
fileName.setDevice(""); // clear device!
|
||||
setFileName(fileName.toString(Poco::Path::PATH_UNIX), fileName.isDirectory());
|
||||
setRequiredVersion(2, 0);
|
||||
if (fileName.isFile())
|
||||
{
|
||||
setCompressionMethod(cm);
|
||||
setCompressionLevel(cl);
|
||||
}
|
||||
else
|
||||
setCompressionMethod(ZipCommon::CM_STORE);
|
||||
}
|
||||
|
||||
|
||||
std::string ZipLocalFileHeader::createHeader() const
|
||||
{
|
||||
std::string result(_rawHeader, FULLHEADER_SIZE);
|
||||
result.append(_fileName);
|
||||
result.append(_extraField);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
|
||||
@@ -1,194 +1,194 @@
|
||||
//
|
||||
// ZipManipulator.cpp
|
||||
//
|
||||
// $Id: //poco/1.3/Zip/src/ZipManipulator.cpp#2 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Manipulation
|
||||
// Module: ZipManipulator
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/ZipManipulator.h"
|
||||
#include "Poco/Zip/ZipException.h"
|
||||
#include "Poco/Zip/ZipUtil.h"
|
||||
#include "Poco/Zip/Add.h"
|
||||
#include "Poco/Zip/Delete.h"
|
||||
#include "Poco/Zip/Keep.h"
|
||||
#include "Poco/Zip/Rename.h"
|
||||
#include "Poco/Zip/Replace.h"
|
||||
#include "Poco/Zip/Compress.h"
|
||||
#include "Poco/Delegate.h"
|
||||
#include "Poco/File.h"
|
||||
#include "Poco/FileStream.h"
|
||||
#include <fstream>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
ZipManipulator::ZipManipulator(const std::string& zipFile, bool backupOriginalFile):
|
||||
_zipFile(zipFile),
|
||||
_backupOriginalFile(backupOriginalFile),
|
||||
_changes(),
|
||||
_in(0)
|
||||
{
|
||||
std::ifstream in(zipFile.c_str());
|
||||
_in = new ZipArchive(in);
|
||||
}
|
||||
|
||||
|
||||
ZipManipulator::~ZipManipulator()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void ZipManipulator::deleteFile(const std::string& zipPath)
|
||||
{
|
||||
const ZipLocalFileHeader& entry = getForChange(zipPath);
|
||||
addOperation(zipPath, new Delete(entry));
|
||||
}
|
||||
|
||||
|
||||
void ZipManipulator::replaceFile(const std::string& zipPath, const std::string& localPath)
|
||||
{
|
||||
const ZipLocalFileHeader& entry = getForChange(zipPath);
|
||||
addOperation(zipPath, new Replace(entry, localPath));
|
||||
}
|
||||
|
||||
|
||||
void ZipManipulator::renameFile(const std::string& zipPath, const std::string& newZipPath)
|
||||
{
|
||||
const ZipLocalFileHeader& entry = getForChange(zipPath);
|
||||
// checked later in Compress too but the earlier one gets the error the better
|
||||
std::string fn = ZipUtil::validZipEntryFileName(newZipPath);
|
||||
addOperation(zipPath, new Rename(entry, fn));
|
||||
}
|
||||
|
||||
|
||||
void ZipManipulator::addFile(const std::string& zipPath, const std::string& localPath, ZipCommon::CompressionMethod cm, ZipCommon::CompressionLevel cl)
|
||||
{
|
||||
addOperation(zipPath, new Add(zipPath, localPath, cm, cl));
|
||||
}
|
||||
|
||||
|
||||
ZipArchive ZipManipulator::commit()
|
||||
{
|
||||
// write to a tmp file
|
||||
std::string outFile(_zipFile + ".tmp");
|
||||
ZipArchive retVal(compress(outFile));
|
||||
//renaming
|
||||
{
|
||||
Poco::File aFile(_zipFile);
|
||||
if (_backupOriginalFile)
|
||||
{
|
||||
Poco::File tmp(_zipFile+".bak");
|
||||
if (tmp.exists())
|
||||
tmp.remove();
|
||||
aFile.renameTo(_zipFile+".bak");
|
||||
}
|
||||
else
|
||||
aFile.remove();
|
||||
}
|
||||
|
||||
{
|
||||
Poco::File resFile(outFile);
|
||||
Poco::File zipFile(_zipFile);
|
||||
if (zipFile.exists())
|
||||
zipFile.remove();
|
||||
resFile.renameTo(_zipFile);
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
|
||||
|
||||
const ZipLocalFileHeader& ZipManipulator::getForChange(const std::string& zipPath) const
|
||||
{
|
||||
ZipArchive::FileHeaders::const_iterator it = _in->findHeader(zipPath);
|
||||
if (it == _in->headerEnd())
|
||||
throw ZipManipulationException("entry not found: " + zipPath);
|
||||
|
||||
if (_changes.find(zipPath) != _changes.end())
|
||||
throw ZipManipulationException("A change request exists already for entry " + zipPath);
|
||||
|
||||
return it->second;
|
||||
}
|
||||
|
||||
|
||||
void ZipManipulator::addOperation(const std::string& zipPath, ZipOperation::Ptr ptrOp)
|
||||
{
|
||||
std::pair<Changes::iterator, bool> result = _changes.insert(std::make_pair(zipPath, ptrOp));
|
||||
if (!result.second)
|
||||
throw ZipManipulationException("A change request exists already for entry " + zipPath);
|
||||
}
|
||||
|
||||
|
||||
void ZipManipulator::onEDone(const void*, const ZipLocalFileHeader& hdr)
|
||||
{
|
||||
EDone(this, hdr);
|
||||
}
|
||||
|
||||
|
||||
ZipArchive ZipManipulator::compress(const std::string& outFile)
|
||||
{
|
||||
// write to a tmp file
|
||||
Poco::FileInputStream in(_zipFile);
|
||||
Poco::FileOutputStream out(outFile);
|
||||
Compress c(out, true);
|
||||
c.EDone += Poco::Delegate<ZipManipulator, const ZipLocalFileHeader>(this, &ZipManipulator::onEDone);
|
||||
|
||||
ZipArchive::FileHeaders::const_iterator it = _in->headerBegin();
|
||||
for (; it != _in->headerEnd(); ++it)
|
||||
{
|
||||
Changes::iterator itC = _changes.find(it->first);
|
||||
if (itC != _changes.end())
|
||||
{
|
||||
itC->second->execute(c, in);
|
||||
_changes.erase(itC);
|
||||
}
|
||||
else
|
||||
{
|
||||
Keep k(it->second);
|
||||
k.execute(c, in);
|
||||
}
|
||||
}
|
||||
//Remaining files are add operations!
|
||||
Changes::iterator itC = _changes.begin();
|
||||
for (; itC != _changes.end(); ++itC)
|
||||
{
|
||||
itC->second->execute(c, in);
|
||||
}
|
||||
_changes.clear();
|
||||
c.EDone -= Poco::Delegate<ZipManipulator, const ZipLocalFileHeader>(this, &ZipManipulator::onEDone);
|
||||
in.close();
|
||||
return c.close();
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
//
|
||||
// ZipManipulator.cpp
|
||||
//
|
||||
// $Id: //poco/Main/Zip/src/ZipManipulator.cpp#4 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Manipulation
|
||||
// Module: ZipManipulator
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/ZipManipulator.h"
|
||||
#include "Poco/Zip/ZipException.h"
|
||||
#include "Poco/Zip/ZipUtil.h"
|
||||
#include "Poco/Zip/Add.h"
|
||||
#include "Poco/Zip/Delete.h"
|
||||
#include "Poco/Zip/Keep.h"
|
||||
#include "Poco/Zip/Rename.h"
|
||||
#include "Poco/Zip/Replace.h"
|
||||
#include "Poco/Zip/Compress.h"
|
||||
#include "Poco/Delegate.h"
|
||||
#include "Poco/File.h"
|
||||
#include "Poco/FileStream.h"
|
||||
#include <fstream>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
ZipManipulator::ZipManipulator(const std::string& zipFile, bool backupOriginalFile):
|
||||
_zipFile(zipFile),
|
||||
_backupOriginalFile(backupOriginalFile),
|
||||
_changes(),
|
||||
_in(0)
|
||||
{
|
||||
std::ifstream in(zipFile.c_str(), std::ios::binary);
|
||||
_in = new ZipArchive(in);
|
||||
}
|
||||
|
||||
|
||||
ZipManipulator::~ZipManipulator()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void ZipManipulator::deleteFile(const std::string& zipPath)
|
||||
{
|
||||
const ZipLocalFileHeader& entry = getForChange(zipPath);
|
||||
addOperation(zipPath, new Delete(entry));
|
||||
}
|
||||
|
||||
|
||||
void ZipManipulator::replaceFile(const std::string& zipPath, const std::string& localPath)
|
||||
{
|
||||
const ZipLocalFileHeader& entry = getForChange(zipPath);
|
||||
addOperation(zipPath, new Replace(entry, localPath));
|
||||
}
|
||||
|
||||
|
||||
void ZipManipulator::renameFile(const std::string& zipPath, const std::string& newZipPath)
|
||||
{
|
||||
const ZipLocalFileHeader& entry = getForChange(zipPath);
|
||||
// checked later in Compress too but the earlier one gets the error the better
|
||||
std::string fn = ZipUtil::validZipEntryFileName(newZipPath);
|
||||
addOperation(zipPath, new Rename(entry, fn));
|
||||
}
|
||||
|
||||
|
||||
void ZipManipulator::addFile(const std::string& zipPath, const std::string& localPath, ZipCommon::CompressionMethod cm, ZipCommon::CompressionLevel cl)
|
||||
{
|
||||
addOperation(zipPath, new Add(zipPath, localPath, cm, cl));
|
||||
}
|
||||
|
||||
|
||||
ZipArchive ZipManipulator::commit()
|
||||
{
|
||||
// write to a tmp file
|
||||
std::string outFile(_zipFile + ".tmp");
|
||||
ZipArchive retVal(compress(outFile));
|
||||
//renaming
|
||||
{
|
||||
Poco::File aFile(_zipFile);
|
||||
if (_backupOriginalFile)
|
||||
{
|
||||
Poco::File tmp(_zipFile+".bak");
|
||||
if (tmp.exists())
|
||||
tmp.remove();
|
||||
aFile.renameTo(_zipFile+".bak");
|
||||
}
|
||||
else
|
||||
aFile.remove();
|
||||
}
|
||||
|
||||
{
|
||||
Poco::File resFile(outFile);
|
||||
Poco::File zipFile(_zipFile);
|
||||
if (zipFile.exists())
|
||||
zipFile.remove();
|
||||
resFile.renameTo(_zipFile);
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
|
||||
|
||||
const ZipLocalFileHeader& ZipManipulator::getForChange(const std::string& zipPath) const
|
||||
{
|
||||
ZipArchive::FileHeaders::const_iterator it = _in->findHeader(zipPath);
|
||||
if (it == _in->headerEnd())
|
||||
throw ZipManipulationException("entry not found: " + zipPath);
|
||||
|
||||
if (_changes.find(zipPath) != _changes.end())
|
||||
throw ZipManipulationException("A change request exists already for entry " + zipPath);
|
||||
|
||||
return it->second;
|
||||
}
|
||||
|
||||
|
||||
void ZipManipulator::addOperation(const std::string& zipPath, ZipOperation::Ptr ptrOp)
|
||||
{
|
||||
std::pair<Changes::iterator, bool> result = _changes.insert(std::make_pair(zipPath, ptrOp));
|
||||
if (!result.second)
|
||||
throw ZipManipulationException("A change request exists already for entry " + zipPath);
|
||||
}
|
||||
|
||||
|
||||
void ZipManipulator::onEDone(const void*, const ZipLocalFileHeader& hdr)
|
||||
{
|
||||
EDone(this, hdr);
|
||||
}
|
||||
|
||||
|
||||
ZipArchive ZipManipulator::compress(const std::string& outFile)
|
||||
{
|
||||
// write to a tmp file
|
||||
Poco::FileInputStream in(_zipFile);
|
||||
Poco::FileOutputStream out(outFile);
|
||||
Compress c(out, true);
|
||||
c.EDone += Poco::Delegate<ZipManipulator, const ZipLocalFileHeader>(this, &ZipManipulator::onEDone);
|
||||
|
||||
ZipArchive::FileHeaders::const_iterator it = _in->headerBegin();
|
||||
for (; it != _in->headerEnd(); ++it)
|
||||
{
|
||||
Changes::iterator itC = _changes.find(it->first);
|
||||
if (itC != _changes.end())
|
||||
{
|
||||
itC->second->execute(c, in);
|
||||
_changes.erase(itC);
|
||||
}
|
||||
else
|
||||
{
|
||||
Keep k(it->second);
|
||||
k.execute(c, in);
|
||||
}
|
||||
}
|
||||
//Remaining files are add operations!
|
||||
Changes::iterator itC = _changes.begin();
|
||||
for (; itC != _changes.end(); ++itC)
|
||||
{
|
||||
itC->second->execute(c, in);
|
||||
}
|
||||
_changes.clear();
|
||||
c.EDone -= Poco::Delegate<ZipManipulator, const ZipLocalFileHeader>(this, &ZipManipulator::onEDone);
|
||||
in.close();
|
||||
return c.close();
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
|
||||
@@ -1,54 +1,54 @@
|
||||
//
|
||||
// ZipOperation.cpp
|
||||
//
|
||||
// $Id: //poco/1.3/Zip/src/ZipOperation.cpp#1 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Manipulation
|
||||
// Module: ZipOperation
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/ZipOperation.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
ZipOperation::ZipOperation()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
ZipOperation::~ZipOperation()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
//
|
||||
// ZipOperation.cpp
|
||||
//
|
||||
// $Id: //poco/Main/Zip/src/ZipOperation.cpp#1 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Manipulation
|
||||
// Module: ZipOperation
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/ZipOperation.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
ZipOperation::ZipOperation()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
ZipOperation::~ZipOperation()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
|
||||
@@ -1,212 +1,212 @@
|
||||
//
|
||||
// ZipUtil.cpp
|
||||
//
|
||||
// $Id: //poco/1.3/Zip/src/ZipUtil.cpp#4 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Zip
|
||||
// Module: ZipUtil
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/ZipUtil.h"
|
||||
#include "Poco/Zip/ZipException.h"
|
||||
#include "Poco/Zip/ZipLocalFileHeader.h"
|
||||
#include "Poco/Zip/ZipFileInfo.h"
|
||||
#include "Poco/Zip/ZipDataInfo.h"
|
||||
#include "Poco/Zip/ZipArchiveInfo.h"
|
||||
#include <cstring>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
Poco::DateTime ZipUtil::parseDateTime(const char* pVal, const Poco::UInt32 timePos, const Poco::UInt32 datePos)
|
||||
{
|
||||
Poco::UInt16 time = ZipUtil::get16BitValue(pVal, timePos);
|
||||
Poco::UInt16 date = ZipUtil::get16BitValue(pVal, datePos);
|
||||
//TIME: second 0-4, minute 5-10, hour 11-15, second resolution is 2!
|
||||
int sec = 2*(time & 0x001fu); // 0000 0000 0001 1111
|
||||
int min = ((time & 0x07e0u) >> 5); // 0000 0111 1110 0000
|
||||
int hour= ((time & 0xf800u) >> 11); // 1111 1000 0000 0000
|
||||
|
||||
//DATE: day 0-4, month 5-8, year (starting with 1980): 9-16
|
||||
int day = (date & 0x001fu); // 0000 0000 0001 1111
|
||||
int mon = ((date & 0x01e0u) >> 5); // 0000 0001 1110 0000
|
||||
int year= 1980+((date & 0xfe00u) >> 9); // 1111 1110 0000 0000
|
||||
return Poco::DateTime(year, mon, day, hour, min, sec);
|
||||
}
|
||||
|
||||
|
||||
void ZipUtil::setDateTime(const Poco::DateTime& dt, char* pVal, const Poco::UInt32 timePos, const Poco::UInt32 datePos)
|
||||
{
|
||||
//TIME: second 0-4, minute 5-10, hour 11-15
|
||||
Poco::UInt16 time = static_cast<Poco::UInt16>((dt.second()/2) + (dt.minute()<<5) + (dt.hour()<<11));
|
||||
//DATE: day 0-4, month 5-8, year (starting with 1980): 9-16
|
||||
int year = dt.year() - 1980;
|
||||
if (year<0)
|
||||
year = 0;
|
||||
Poco::UInt16 date = static_cast<Poco::UInt16>(dt.day() + (dt.month()<<5) + (year<<9));
|
||||
ZipUtil::set16BitValue(time, pVal, timePos);
|
||||
ZipUtil::set16BitValue(date, pVal, datePos);
|
||||
|
||||
}
|
||||
|
||||
|
||||
std::string ZipUtil::fakeZLibInitString(ZipCommon::CompressionLevel cl)
|
||||
{
|
||||
std::string init(2, ' ');
|
||||
|
||||
// compression info:
|
||||
// deflate is used, bit 0-3: 0x08
|
||||
// dictionary size is always 32k: calc ld2(32k)-8 = ld2(2^15) - 8 = 15 - 8 = 7 --> bit 4-7: 0x70
|
||||
init[0] = '\x78';
|
||||
|
||||
// now fake flags
|
||||
// bits 0-4 check bits: set them so that init[0]*256+init[1] % 31 == 0
|
||||
// bit 5: preset dictionary? always no for us, set to 0
|
||||
// bits 6-7: compression level: 00 very fast, 01 fast, 10 normal, 11 best
|
||||
if (cl == ZipCommon::CL_SUPERFAST)
|
||||
init[1] = '\x00';
|
||||
else if (cl == ZipCommon::CL_FAST)
|
||||
init[1] = '\x40';
|
||||
else if (cl == ZipCommon::CL_NORMAL)
|
||||
init[1] = '\x80';
|
||||
else
|
||||
init[1] = '\xc0';
|
||||
// now set the last 5 bits
|
||||
Poco::UInt16 tmpVal = ((Poco::UInt16)init[0])*256+((unsigned char)init[1]);
|
||||
char checkBits = (31 - (char)(tmpVal%31));
|
||||
init[1] |= checkBits; // set the lower 5 bits
|
||||
tmpVal = ((Poco::UInt16)init[0])*256+((unsigned char)init[1]);
|
||||
poco_assert_dbg ((tmpVal % 31) == 0);
|
||||
return init;
|
||||
}
|
||||
|
||||
|
||||
void ZipUtil::sync(std::istream& in)
|
||||
{
|
||||
enum
|
||||
{
|
||||
PREFIX = 2,
|
||||
BUFFER_SIZE = 1024
|
||||
};
|
||||
char temp[BUFFER_SIZE];
|
||||
in.read(temp, PREFIX);
|
||||
std::size_t tempPos = PREFIX;
|
||||
|
||||
while (in.good() && !in.eof())
|
||||
{
|
||||
// all zip headers start withe same 2byte prefix
|
||||
if(std::memcmp(ZipLocalFileHeader::HEADER, &temp[tempPos - PREFIX], PREFIX) == 0)
|
||||
{
|
||||
// we have a possible header!
|
||||
// read the next 2 bytes
|
||||
in.read(temp+tempPos, PREFIX);
|
||||
tempPos += PREFIX;
|
||||
if (std::memcmp(ZipLocalFileHeader::HEADER+PREFIX, &temp[tempPos - PREFIX], PREFIX) == 0 ||
|
||||
std::memcmp(ZipArchiveInfo::HEADER+PREFIX, &temp[tempPos - PREFIX], PREFIX) == 0 ||
|
||||
std::memcmp(ZipFileInfo::HEADER+PREFIX, &temp[tempPos - PREFIX], PREFIX) == 0 ||
|
||||
std::memcmp(ZipDataInfo::HEADER+PREFIX, &temp[tempPos - PREFIX], PREFIX) == 0)
|
||||
{
|
||||
if (std::memcmp(ZipLocalFileHeader::HEADER+PREFIX, &temp[tempPos - PREFIX], PREFIX) == 0)
|
||||
{
|
||||
in.putback(ZipLocalFileHeader::HEADER[3]);
|
||||
in.putback(ZipLocalFileHeader::HEADER[2]);
|
||||
in.putback(ZipLocalFileHeader::HEADER[1]);
|
||||
in.putback(ZipLocalFileHeader::HEADER[0]);
|
||||
}
|
||||
else if (std::memcmp(ZipArchiveInfo::HEADER+PREFIX, &temp[tempPos - PREFIX], PREFIX) == 0)
|
||||
{
|
||||
in.putback(ZipArchiveInfo::HEADER[3]);
|
||||
in.putback(ZipArchiveInfo::HEADER[2]);
|
||||
in.putback(ZipArchiveInfo::HEADER[1]);
|
||||
in.putback(ZipArchiveInfo::HEADER[0]);
|
||||
}
|
||||
else if (std::memcmp(ZipFileInfo::HEADER+PREFIX, &temp[tempPos - PREFIX], PREFIX) == 0)
|
||||
{
|
||||
in.putback(ZipFileInfo::HEADER[3]);
|
||||
in.putback(ZipFileInfo::HEADER[2]);
|
||||
in.putback(ZipFileInfo::HEADER[1]);
|
||||
in.putback(ZipFileInfo::HEADER[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
in.putback(ZipDataInfo::HEADER[3]);
|
||||
in.putback(ZipDataInfo::HEADER[2]);
|
||||
in.putback(ZipDataInfo::HEADER[1]);
|
||||
in.putback(ZipDataInfo::HEADER[0]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
// we have read 2 bytes, should only be one: putback the last char
|
||||
in.putback(temp[tempPos - 1]);
|
||||
--tempPos;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// read one byte
|
||||
in.read(temp + tempPos, 1);
|
||||
++tempPos;
|
||||
}
|
||||
|
||||
if (tempPos > (BUFFER_SIZE - ZipCommon::HEADER_SIZE))
|
||||
{
|
||||
std::memcpy(temp, &temp[tempPos - ZipCommon::HEADER_SIZE], ZipCommon::HEADER_SIZE);
|
||||
tempPos = ZipCommon::HEADER_SIZE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void ZipUtil::verifyZipEntryFileName(const std::string& fn)
|
||||
{
|
||||
if (fn.find("\\") != std::string::npos)
|
||||
throw ZipException("Illegal entry name " + fn + " containing \\");
|
||||
if (fn == "/")
|
||||
throw ZipException("Illegal entry name /");
|
||||
if (fn.empty())
|
||||
throw ZipException("Illegal empty entry name");
|
||||
if (fn.find(ZipCommon::ILLEGAL_PATH) != std::string::npos)
|
||||
throw ZipException("Illegal entry name " + fn + " containing " + ZipCommon::ILLEGAL_PATH);
|
||||
}
|
||||
|
||||
|
||||
std::string ZipUtil::validZipEntryFileName(const Poco::Path& entry)
|
||||
{
|
||||
std::string fn = entry.toString(Poco::Path::PATH_UNIX);
|
||||
verifyZipEntryFileName(fn);
|
||||
return fn;
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
//
|
||||
// ZipUtil.cpp
|
||||
//
|
||||
// $Id: //poco/Main/Zip/src/ZipUtil.cpp#8 $
|
||||
//
|
||||
// Library: Zip
|
||||
// Package: Zip
|
||||
// Module: ZipUtil
|
||||
//
|
||||
// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Zip/ZipUtil.h"
|
||||
#include "Poco/Zip/ZipException.h"
|
||||
#include "Poco/Zip/ZipLocalFileHeader.h"
|
||||
#include "Poco/Zip/ZipFileInfo.h"
|
||||
#include "Poco/Zip/ZipDataInfo.h"
|
||||
#include "Poco/Zip/ZipArchiveInfo.h"
|
||||
#include <cstring>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Zip {
|
||||
|
||||
|
||||
Poco::DateTime ZipUtil::parseDateTime(const char* pVal, const Poco::UInt32 timePos, const Poco::UInt32 datePos)
|
||||
{
|
||||
Poco::UInt16 time = ZipUtil::get16BitValue(pVal, timePos);
|
||||
Poco::UInt16 date = ZipUtil::get16BitValue(pVal, datePos);
|
||||
//TIME: second 0-4, minute 5-10, hour 11-15, second resolution is 2!
|
||||
int sec = 2*(time & 0x001fu); // 0000 0000 0001 1111
|
||||
int min = ((time & 0x07e0u) >> 5); // 0000 0111 1110 0000
|
||||
int hour= ((time & 0xf800u) >> 11); // 1111 1000 0000 0000
|
||||
|
||||
//DATE: day 0-4, month 5-8, year (starting with 1980): 9-16
|
||||
int day = (date & 0x001fu); // 0000 0000 0001 1111
|
||||
int mon = ((date & 0x01e0u) >> 5); // 0000 0001 1110 0000
|
||||
int year= 1980+((date & 0xfe00u) >> 9); // 1111 1110 0000 0000
|
||||
return Poco::DateTime(year, mon, day, hour, min, sec);
|
||||
}
|
||||
|
||||
|
||||
void ZipUtil::setDateTime(const Poco::DateTime& dt, char* pVal, const Poco::UInt32 timePos, const Poco::UInt32 datePos)
|
||||
{
|
||||
//TIME: second 0-4, minute 5-10, hour 11-15
|
||||
Poco::UInt16 time = static_cast<Poco::UInt16>((dt.second()/2) + (dt.minute()<<5) + (dt.hour()<<11));
|
||||
//DATE: day 0-4, month 5-8, year (starting with 1980): 9-16
|
||||
int year = dt.year() - 1980;
|
||||
if (year<0)
|
||||
year = 0;
|
||||
Poco::UInt16 date = static_cast<Poco::UInt16>(dt.day() + (dt.month()<<5) + (year<<9));
|
||||
ZipUtil::set16BitValue(time, pVal, timePos);
|
||||
ZipUtil::set16BitValue(date, pVal, datePos);
|
||||
|
||||
}
|
||||
|
||||
|
||||
std::string ZipUtil::fakeZLibInitString(ZipCommon::CompressionLevel cl)
|
||||
{
|
||||
std::string init(2, ' ');
|
||||
|
||||
// compression info:
|
||||
// deflate is used, bit 0-3: 0x08
|
||||
// dictionary size is always 32k: calc ld2(32k)-8 = ld2(2^15) - 8 = 15 - 8 = 7 --> bit 4-7: 0x70
|
||||
init[0] = '\x78';
|
||||
|
||||
// now fake flags
|
||||
// bits 0-4 check bits: set them so that init[0]*256+init[1] % 31 == 0
|
||||
// bit 5: preset dictionary? always no for us, set to 0
|
||||
// bits 6-7: compression level: 00 very fast, 01 fast, 10 normal, 11 best
|
||||
if (cl == ZipCommon::CL_SUPERFAST)
|
||||
init[1] = '\x00';
|
||||
else if (cl == ZipCommon::CL_FAST)
|
||||
init[1] = '\x40';
|
||||
else if (cl == ZipCommon::CL_NORMAL)
|
||||
init[1] = '\x80';
|
||||
else
|
||||
init[1] = '\xc0';
|
||||
// now set the last 5 bits
|
||||
Poco::UInt16 tmpVal = ((Poco::UInt16)init[0])*256+((unsigned char)init[1]);
|
||||
char checkBits = (31 - (char)(tmpVal%31));
|
||||
init[1] |= checkBits; // set the lower 5 bits
|
||||
tmpVal = ((Poco::UInt16)init[0])*256+((unsigned char)init[1]);
|
||||
poco_assert_dbg ((tmpVal % 31) == 0);
|
||||
return init;
|
||||
}
|
||||
|
||||
|
||||
void ZipUtil::sync(std::istream& in)
|
||||
{
|
||||
enum
|
||||
{
|
||||
PREFIX = 2,
|
||||
BUFFER_SIZE = 1024
|
||||
};
|
||||
char temp[BUFFER_SIZE];
|
||||
in.read(temp, PREFIX);
|
||||
std::size_t tempPos = PREFIX;
|
||||
|
||||
while (in.good() && !in.eof())
|
||||
{
|
||||
// all zip headers start withe same 2byte prefix
|
||||
if(std::memcmp(ZipLocalFileHeader::HEADER, &temp[tempPos - PREFIX], PREFIX) == 0)
|
||||
{
|
||||
// we have a possible header!
|
||||
// read the next 2 bytes
|
||||
in.read(temp+tempPos, PREFIX);
|
||||
tempPos += PREFIX;
|
||||
if (std::memcmp(ZipLocalFileHeader::HEADER+PREFIX, &temp[tempPos - PREFIX], PREFIX) == 0 ||
|
||||
std::memcmp(ZipArchiveInfo::HEADER+PREFIX, &temp[tempPos - PREFIX], PREFIX) == 0 ||
|
||||
std::memcmp(ZipFileInfo::HEADER+PREFIX, &temp[tempPos - PREFIX], PREFIX) == 0 ||
|
||||
std::memcmp(ZipDataInfo::HEADER+PREFIX, &temp[tempPos - PREFIX], PREFIX) == 0)
|
||||
{
|
||||
if (std::memcmp(ZipLocalFileHeader::HEADER+PREFIX, &temp[tempPos - PREFIX], PREFIX) == 0)
|
||||
{
|
||||
in.putback(ZipLocalFileHeader::HEADER[3]);
|
||||
in.putback(ZipLocalFileHeader::HEADER[2]);
|
||||
in.putback(ZipLocalFileHeader::HEADER[1]);
|
||||
in.putback(ZipLocalFileHeader::HEADER[0]);
|
||||
}
|
||||
else if (std::memcmp(ZipArchiveInfo::HEADER+PREFIX, &temp[tempPos - PREFIX], PREFIX) == 0)
|
||||
{
|
||||
in.putback(ZipArchiveInfo::HEADER[3]);
|
||||
in.putback(ZipArchiveInfo::HEADER[2]);
|
||||
in.putback(ZipArchiveInfo::HEADER[1]);
|
||||
in.putback(ZipArchiveInfo::HEADER[0]);
|
||||
}
|
||||
else if (std::memcmp(ZipFileInfo::HEADER+PREFIX, &temp[tempPos - PREFIX], PREFIX) == 0)
|
||||
{
|
||||
in.putback(ZipFileInfo::HEADER[3]);
|
||||
in.putback(ZipFileInfo::HEADER[2]);
|
||||
in.putback(ZipFileInfo::HEADER[1]);
|
||||
in.putback(ZipFileInfo::HEADER[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
in.putback(ZipDataInfo::HEADER[3]);
|
||||
in.putback(ZipDataInfo::HEADER[2]);
|
||||
in.putback(ZipDataInfo::HEADER[1]);
|
||||
in.putback(ZipDataInfo::HEADER[0]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
// we have read 2 bytes, should only be one: putback the last char
|
||||
in.putback(temp[tempPos - 1]);
|
||||
--tempPos;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// read one byte
|
||||
in.read(temp + tempPos, 1);
|
||||
++tempPos;
|
||||
}
|
||||
|
||||
if (tempPos > (BUFFER_SIZE - ZipCommon::HEADER_SIZE))
|
||||
{
|
||||
std::memcpy(temp, &temp[tempPos - ZipCommon::HEADER_SIZE], ZipCommon::HEADER_SIZE);
|
||||
tempPos = ZipCommon::HEADER_SIZE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void ZipUtil::verifyZipEntryFileName(const std::string& fn)
|
||||
{
|
||||
if (fn.find("\\") != std::string::npos)
|
||||
throw ZipException("Illegal entry name " + fn + " containing \\");
|
||||
if (fn == "/")
|
||||
throw ZipException("Illegal entry name /");
|
||||
if (fn.empty())
|
||||
throw ZipException("Illegal empty entry name");
|
||||
if (fn.find(ZipCommon::ILLEGAL_PATH) != std::string::npos)
|
||||
throw ZipException("Illegal entry name " + fn + " containing " + ZipCommon::ILLEGAL_PATH);
|
||||
}
|
||||
|
||||
|
||||
std::string ZipUtil::validZipEntryFileName(const Poco::Path& entry)
|
||||
{
|
||||
std::string fn = entry.toString(Poco::Path::PATH_UNIX);
|
||||
verifyZipEntryFileName(fn);
|
||||
return fn;
|
||||
}
|
||||
|
||||
|
||||
} } // namespace Poco::Zip
|
||||
|
||||
Reference in New Issue
Block a user