#include "stdafx.h" #include #include #include "SZReader.h" #include "UTF8Util.h" #include "../SevenZip/7zMemBuffer.h" SZReader::SZReader() { } SZReader::~SZReader() { SzArEx_Free(&_archive, &_allocImp); } bool SZReader::InternalLoadArchive(void* buffer, size_t size) { if(_initialized) { SzArEx_Free(&_archive, &_allocImp); _initialized = false; } ISzAlloc allocImp{ SzAlloc, SzFree }; ISzAlloc allocTempImp{ SzAllocTemp, SzFreeTemp }; MemBufferInit(&_memBufferStream, &_lookStream, buffer, size); CrcGenerateTable(); SzArEx_Init(&_archive); return !SzArEx_Open(&_archive, &_lookStream.s, &allocImp, &allocTempImp); } bool SZReader::ExtractFile(string filename, vector &output) { bool result = false; if(_initialized) { char16_t *utf16Filename = (char16_t*)SzAlloc(nullptr, 2000); uint32_t blockIndex = 0xFFFFFFFF; uint8_t *outBuffer = 0; size_t outBufferSize = 0; for(uint32_t i = 0; i < _archive.NumFiles; i++) { size_t offset = 0; size_t outSizeProcessed = 0; unsigned isDir = SzArEx_IsDir(&_archive, i); if(isDir) { continue; } SzArEx_GetFileNameUtf16(&_archive, i, (uint16_t*)utf16Filename); string entryName = utf8::utf8::encode(std::u16string(utf16Filename)); if(filename == entryName) { WRes res = SzArEx_Extract(&_archive, &_lookStream.s, i, &blockIndex, &outBuffer, &outBufferSize, &offset, &outSizeProcessed, &_allocImp, &_allocTempImp); if(res == SZ_OK) { output = vector(outBuffer+offset, outBuffer+offset+outSizeProcessed); result = true; } IAlloc_Free(&_allocImp, outBuffer); break; } } SzFree(nullptr, utf16Filename); } return result; } vector SZReader::InternalGetFileList() { vector filenames; char16_t *utf16Filename = (char16_t*)SzAlloc(nullptr, 2000); if(_initialized) { for(uint32_t i = 0; i < _archive.NumFiles; i++) { unsigned isDir = SzArEx_IsDir(&_archive, i); if(isDir) { continue; } SzArEx_GetFileNameUtf16(&_archive, i, (uint16_t*)utf16Filename); string filename = utf8::utf8::encode(std::u16string(utf16Filename)); filenames.push_back(filename); } } SzFree(nullptr, utf16Filename); return filenames; }