Sandboxie/SandboxiePlus/MiscHelpers/Archive/ArchiveIO.h

84 lines
1.6 KiB
C++

#pragma once
#include "ArchiveHelper.h"
#ifdef USE_7Z
class CArchiveIO: public IOutStream, public IInStream, public CMyUnknownImp
{
public:
MY_UNKNOWN_IMP2(IOutStream, IInStream)
CArchiveIO(QIODevice* pFile, QIODevice::OpenMode Mode, bool bDelete = true)
{
Q_ASSERT(pFile);
m_pFile = pFile;
if(Mode != QIODevice::NotOpen)
m_pFile->open(Mode);
m_bDelete = bDelete;
}
~CArchiveIO()
{
m_pFile->close();
if(m_bDelete)
delete m_pFile;
}
bool Open(QIODevice::OpenMode Mode) {
return m_pFile->open(Mode);
}
STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize)
{
quint64 read = m_pFile->read((char*)data, size);
if(read == -1)
return E_FAIL;
if(processedSize)
*processedSize = read;
return S_OK;
}
STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize)
{
quint64 writen = m_pFile->write((const char*)data, size);
if(writen == -1)
return E_FAIL;
if(processedSize)
*processedSize = writen;
return S_OK;
}
STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
{
switch(seekOrigin)
{
case 0: break; // FILE_BEGIN
case 1: offset += m_pFile->pos(); break; // FILE_CURRENT
case 2: offset += m_pFile->size(); break; // FILE_END
default: Q_ASSERT(0); return E_FAIL;
}
if(!m_pFile->seek(offset))
return E_FAIL;
if(newPosition)
*newPosition = offset;
return S_OK;
}
STDMETHOD(SetSize)(UInt64 newSize)
{
return S_OK;
}
STDMETHOD(GetSize)(UInt64 *size)
{
*size = m_pFile->size();
return S_OK;
}
protected:
QIODevice* m_pFile;
bool m_bDelete;
};
#endif