84 lines
1.6 KiB
C
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
|