1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-14 10:12:59 +02:00
vcmi/lib/filesystem/MinizipExtensions.cpp

172 lines
4.0 KiB
C++
Raw Normal View History

/*
* MinizipExtensions.cpp, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/
#include "StdInc.h"
#include "MinizipExtensions.h"
2015-08-11 20:20:13 +02:00
#include "CMemoryBuffer.h"
2016-02-05 08:28:36 +02:00
#include "FileStream.h"
2015-08-11 20:20:13 +02:00
///CIOApi
voidpf ZCALLBACK CIOApi::openFileProxy(voidpf opaque, const void * filename, int mode)
{
assert(opaque != nullptr);
2016-02-05 08:28:36 +02:00
boost::filesystem::path path;
if(filename != nullptr)
2016-02-05 08:28:36 +02:00
path = static_cast<const boost::filesystem::path::value_type *>(filename);
return ((CIOApi *)opaque)->openFile(path, mode);
}
uLong ZCALLBACK CIOApi::readFileProxy(voidpf opaque, voidpf stream, void * buf, uLong size)
{
assert(opaque != nullptr);
assert(stream != nullptr);
2016-02-05 08:28:36 +02:00
CInputOutputStream * actualStream = static_cast<CInputOutputStream *>(stream);
2016-02-05 08:28:36 +02:00
return actualStream->read((ui8 *)buf, size);
}
uLong ZCALLBACK CIOApi::writeFileProxy(voidpf opaque, voidpf stream, const void * buf, uLong size)
{
assert(opaque != nullptr);
assert(stream != nullptr);
CInputOutputStream * actualStream = static_cast<CInputOutputStream *>(stream);
return (uLong)actualStream->write((const ui8 *)buf, size);
}
ZPOS64_T ZCALLBACK CIOApi::tellFileProxy(voidpf opaque, voidpf stream)
{
assert(opaque != nullptr);
assert(stream != nullptr);
2016-02-05 08:28:36 +02:00
CInputOutputStream * actualStream = static_cast<CInputOutputStream *>(stream);
return actualStream->tell();
}
long ZCALLBACK CIOApi::seekFileProxy(voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)
{
assert(opaque != nullptr);
assert(stream != nullptr);
2016-02-05 08:28:36 +02:00
CInputOutputStream * actualStream = static_cast<CInputOutputStream *>(stream);
long ret = 0;
switch (origin)
{
case ZLIB_FILEFUNC_SEEK_CUR :
if(actualStream->skip(offset) != offset)
ret = -1;
break;
case ZLIB_FILEFUNC_SEEK_END:
{
const si64 pos = actualStream->getSize() - offset;
if(actualStream->seek(pos) != pos)
ret = -1;
2016-02-05 08:28:36 +02:00
}
break;
case ZLIB_FILEFUNC_SEEK_SET :
if(actualStream->seek(offset) != offset)
ret = -1;
break;
default: ret = -1;
}
if(ret == -1)
2016-02-05 08:28:36 +02:00
logGlobal->error("CIOApi::seekFileProxy: seek failed");
return ret;
}
int ZCALLBACK CIOApi::closeFileProxy(voidpf opaque, voidpf stream)
{
assert(opaque != nullptr);
assert(stream != nullptr);
2016-02-05 08:28:36 +02:00
CInputOutputStream * actualStream = static_cast<CInputOutputStream *>(stream);
2016-02-05 08:28:36 +02:00
2015-08-11 20:20:13 +02:00
((CIOApi *)opaque)->closeFile(actualStream);
2016-02-05 08:28:36 +02:00
return 0;
}
int ZCALLBACK CIOApi::errorFileProxy(voidpf opaque, voidpf stream)
{
return 0;
}
zlib_filefunc64_def CIOApi::getApiStructure() const
{
zlib_filefunc64_def api;
api.opaque = (void *) this;
api.zopen64_file = &openFileProxy;
api.zread_file = &readFileProxy;
api.zwrite_file = &writeFileProxy;
api.ztell64_file = &tellFileProxy;
api.zseek64_file = &seekFileProxy;
api.zclose_file = &closeFileProxy;
2016-02-05 08:28:36 +02:00
api.zerror_file = &errorFileProxy;
return api;
}
2015-08-11 20:20:13 +02:00
void CIOApi::closeFile(CInputOutputStream * stream) const
{
delete stream;
}
///CDefaultIOApi
CDefaultIOApi::CDefaultIOApi()
{
2016-02-05 08:28:36 +02:00
}
CDefaultIOApi::~CDefaultIOApi()
{
2016-02-05 08:28:36 +02:00
}
zlib_filefunc64_def CDefaultIOApi::getApiStructure() const
{
2016-02-05 08:28:36 +02:00
return * FileStream::GetMinizipFilefunc();
}
2016-02-05 08:28:36 +02:00
CInputOutputStream * CDefaultIOApi::openFile(const boost::filesystem::path & filename, int mode) const
{
2016-02-05 08:28:36 +02:00
throw new std::runtime_error("CDefaultIOApi::openFile call not expected.");
}
2015-08-11 20:20:13 +02:00
///CProxyIOApi
CProxyIOApi::CProxyIOApi(CInputOutputStream * buffer):
data(buffer)
{
2016-02-05 08:28:36 +02:00
}
2015-08-11 20:20:13 +02:00
CProxyIOApi::~CProxyIOApi()
{
2016-02-05 08:28:36 +02:00
}
2015-08-11 20:20:13 +02:00
2016-02-05 08:28:36 +02:00
CInputOutputStream * CProxyIOApi::openFile(const boost::filesystem::path & filename, int mode) const
2015-08-11 20:20:13 +02:00
{
2016-02-05 08:28:36 +02:00
logGlobal->traceStream() << "CProxyIOApi: stream opened for " <<filename.string() <<" with mode "<<mode;
2015-08-11 20:20:13 +02:00
data->seek(0);
return data;
2015-08-11 20:20:13 +02:00
}
void CProxyIOApi::closeFile(CInputOutputStream * stream) const
{
logGlobal->traceStream() << "CProxyIOApi: stream closed";
stream->seek(0);//stream is local singleton and even not owned, just seek
}