Changed: Use new LZMA SDK

--HG--
branch : develop
This commit is contained in:
kervala 2019-04-21 14:18:09 +02:00
parent 931b62d2e4
commit 869a5f2b53

View file

@ -86,9 +86,11 @@
#define FILE_ATTRIBUTE_UNIX_EXTENSION 0x8000 /* trick for Unix */ #define FILE_ATTRIBUTE_UNIX_EXTENSION 0x8000 /* trick for Unix */
#define FILE_ATTRIBUTE_WINDOWS 0x5fff #define FILE_ATTRIBUTE_WINDOWS 0x7fff
#define FILE_ATTRIBUTE_UNIX 0xffff0000 #define FILE_ATTRIBUTE_UNIX 0xffff0000
#define kInputBufSize ((size_t)1 << 18)
bool Set7zFileAttrib(const QString &filename, uint32 fileAttributes) bool Set7zFileAttrib(const QString &filename, uint32 fileAttributes)
{ {
if (filename.isEmpty()) return false; if (filename.isEmpty()) return false;
@ -192,7 +194,7 @@ public:
} }
// the read function called by 7zip to read data // the read function called by 7zip to read data
static SRes readFunc(void *object, void *buffer, size_t *size) static SRes readFunc(const ISeekInStream *object, void *buffer, size_t *size)
{ {
Q7zFile *me = (Q7zFile*)object; Q7zFile *me = (Q7zFile*)object;
qint64 len = *size; qint64 len = *size;
@ -210,7 +212,7 @@ public:
} }
// the seek function called by seven zip to seek inside stream // the seek function called by seven zip to seek inside stream
static SRes seekFunc(void *object, Int64 *pos, ESzSeek origin) static SRes seekFunc(const ISeekInStream *object, Int64 *pos, ESzSeek origin)
{ {
Q7zFile *me = (Q7zFile*)object; Q7zFile *me = (Q7zFile*)object;
qint64 newPos = 0; qint64 newPos = 0;
@ -328,19 +330,6 @@ bool CFilesExtractor::extract7z()
UInt16 *temp = NULL; UInt16 *temp = NULL;
size_t tempSize = 0; size_t tempSize = 0;
// register the files read handlers
CLookToRead lookStream;
lookStream.realStream = &inFile;
LookToRead_CreateVTable(&lookStream, False);
LookToRead_Init(&lookStream);
// init CRC table
CrcGenerateTable();
// init 7z
CSzArEx db;
SzArEx_Init(&db);
// register allocators // register allocators
ISzAlloc allocImp; ISzAlloc allocImp;
allocImp.Alloc = SzAlloc; allocImp.Alloc = SzAlloc;
@ -350,11 +339,37 @@ bool CFilesExtractor::extract7z()
allocTempImp.Alloc = SzAllocTemp; allocTempImp.Alloc = SzAllocTemp;
allocTempImp.Free = SzFreeTemp; allocTempImp.Free = SzFreeTemp;
// register the files read handlers
CLookToRead2 lookStream;
LookToRead2_CreateVTable(&lookStream, False);
lookStream.buf = (Byte*)ISzAlloc_Alloc(&allocImp, kInputBufSize);
if (!lookStream.buf)
{
nlwarning("Unable to allocate %u bytes", (uint32)kInputBufSize);
if (m_listener) m_listener->operationFail(QApplication::tr("Unable to allocate %1 bytes").arg(kInputBufSize));
return false;
}
LookToRead2_Init(&lookStream);
lookStream.bufSize = kInputBufSize;
lookStream.realStream = &inFile;
LookToRead2_Init(&lookStream);
// init CRC table
CrcGenerateTable();
// init 7z
CSzArEx db;
SzArEx_Init(&db);
qint64 total = 0, totalUncompressed = 0; qint64 total = 0, totalUncompressed = 0;
QString error; QString error;
// open 7z acrhive // open 7z archive
SRes res = SzArEx_Open(&db, &lookStream.s, &allocImp, &allocTempImp); SRes res = SzArEx_Open(&db, &lookStream.vt, &allocImp, &allocTempImp);
if (res == SZ_OK) if (res == SZ_OK)
{ {
@ -423,6 +438,27 @@ bool CFilesExtractor::extract7z()
modificationTime = convertWindowsFileTimeToUnixTimestamp(db.MTime.Vals[i]); modificationTime = convertWindowsFileTimeToUnixTimestamp(db.MTime.Vals[i]);
} }
FILETIME mtime, ctime;
FILETIME * mtimePtr = NULL;
FILETIME * ctimePtr = NULL;
if (SzBitWithVals_Check(&db.MTime, i))
{
const CNtfsFileTime *t = &db.MTime.Vals[i];
mtime.dwLowDateTime = (DWORD)(t->Low);
mtime.dwHighDateTime = (DWORD)(t->High);
mtimePtr = &mtime;
}
if (SzBitWithVals_Check(&db.CTime, i))
{
const CNtfsFileTime *t = &db.CTime.Vals[i];
ctime.dwLowDateTime = (DWORD)(t->Low);
ctime.dwHighDateTime = (DWORD)(t->High);
ctimePtr = &ctime;
}
if (isDir) if (isDir)
{ {
QDir().mkpath(destPath); QDir().mkpath(destPath);
@ -448,7 +484,7 @@ bool CFilesExtractor::extract7z()
if (m_listener) m_listener->operationProgress(totalUncompressed, filename); if (m_listener) m_listener->operationProgress(totalUncompressed, filename);
res = SzArEx_Extract(&db, &lookStream.s, i, &blockIndex, &outBuffer, &outBufferSize, res = SzArEx_Extract(&db, &lookStream.vt, i, &blockIndex, &outBuffer, &outBufferSize,
&offset, &outSizeProcessed, &allocImp, &allocTempImp); &offset, &outSizeProcessed, &allocImp, &allocTempImp);
if (res != SZ_OK) break; if (res != SZ_OK) break;
@ -518,8 +554,9 @@ bool CFilesExtractor::extract7z()
IAlloc_Free(&allocImp, outBuffer); IAlloc_Free(&allocImp, outBuffer);
} }
SzArEx_Free(&db, &allocImp);
SzFree(NULL, temp); SzFree(NULL, temp);
SzArEx_Free(&db, &allocImp);
ISzAlloc_Free(&allocImp, lookStream.buf);
switch(res) switch(res)
{ {