Annotation of elwix/tools/oldlzma/SRC/7zip/Archive/7z_C/7zExtract.c, revision 1.1
1.1 ! misho 1: /* 7zExtract.c */
! 2:
! 3: #include "7zExtract.h"
! 4: #include "7zDecode.h"
! 5: #include "7zCrc.h"
! 6:
! 7: SZ_RESULT SzExtract(
! 8: ISzInStream *inStream,
! 9: CArchiveDatabaseEx *db,
! 10: UInt32 fileIndex,
! 11: UInt32 *blockIndex,
! 12: Byte **outBuffer,
! 13: size_t *outBufferSize,
! 14: size_t *offset,
! 15: size_t *outSizeProcessed,
! 16: ISzAlloc *allocMain,
! 17: ISzAlloc *allocTemp)
! 18: {
! 19: UInt32 folderIndex = db->FileIndexToFolderIndexMap[fileIndex];
! 20: SZ_RESULT res = SZ_OK;
! 21: *offset = 0;
! 22: *outSizeProcessed = 0;
! 23: if (folderIndex == (UInt32)-1)
! 24: {
! 25: allocMain->Free(*outBuffer);
! 26: *blockIndex = folderIndex;
! 27: *outBuffer = 0;
! 28: *outBufferSize = 0;
! 29: return SZ_OK;
! 30: }
! 31:
! 32: if (*outBuffer == 0 || *blockIndex != folderIndex)
! 33: {
! 34: CFolder *folder = db->Database.Folders + folderIndex;
! 35: CFileSize unPackSize = SzFolderGetUnPackSize(folder);
! 36: #ifndef _LZMA_IN_CB
! 37: CFileSize packSize = SzArDbGetFolderFullPackSize(db, folderIndex);
! 38: Byte *inBuffer = 0;
! 39: size_t processedSize;
! 40: #endif
! 41: *blockIndex = folderIndex;
! 42: allocMain->Free(*outBuffer);
! 43: *outBuffer = 0;
! 44:
! 45: RINOK(inStream->Seek(inStream, SzArDbGetFolderStreamPos(db, folderIndex, 0)));
! 46:
! 47: #ifndef _LZMA_IN_CB
! 48: inBuffer = (Byte *)allocTemp->Alloc((size_t)packSize);
! 49: if (inBuffer == 0)
! 50: return SZE_OUTOFMEMORY;
! 51: res = inStream->Read(inStream, inBuffer, (size_t)packSize, &processedSize);
! 52: if (res == SZ_OK && processedSize != (size_t)packSize)
! 53: res = SZE_FAIL;
! 54: #endif
! 55: if (res == SZ_OK)
! 56: {
! 57: *outBuffer = (Byte *)allocMain->Alloc((size_t)unPackSize);
! 58: *outBufferSize = (size_t)unPackSize;
! 59: if (*outBuffer != 0)
! 60: {
! 61: size_t outRealSize;
! 62: res = SzDecode(db->Database.PackSizes +
! 63: db->FolderStartPackStreamIndex[folderIndex], folder,
! 64: #ifdef _LZMA_IN_CB
! 65: inStream,
! 66: #else
! 67: inBuffer,
! 68: #endif
! 69: *outBuffer, (size_t)unPackSize, &outRealSize, allocTemp);
! 70: if (res == SZ_OK)
! 71: {
! 72: if (outRealSize == (size_t)unPackSize)
! 73: {
! 74: if (folder->UnPackCRCDefined)
! 75: {
! 76: if (!CrcVerifyDigest(folder->UnPackCRC, *outBuffer, (size_t)unPackSize))
! 77: res = SZE_FAIL;
! 78: }
! 79: }
! 80: else
! 81: res = SZE_FAIL;
! 82: }
! 83: }
! 84: else
! 85: res = SZE_OUTOFMEMORY;
! 86: }
! 87: #ifndef _LZMA_IN_CB
! 88: allocTemp->Free(inBuffer);
! 89: #endif
! 90: }
! 91: if (res == SZ_OK)
! 92: {
! 93: UInt32 i;
! 94: CFileItem *fileItem = db->Database.Files + fileIndex;
! 95: *offset = 0;
! 96: for(i = db->FolderStartFileIndex[folderIndex]; i < fileIndex; i++)
! 97: *offset += (UInt32)db->Database.Files[i].Size;
! 98: *outSizeProcessed = (size_t)fileItem->Size;
! 99: if (*offset + *outSizeProcessed > *outBufferSize)
! 100: return SZE_FAIL;
! 101: {
! 102: if (fileItem->IsFileCRCDefined)
! 103: {
! 104: if (!CrcVerifyDigest(fileItem->FileCRC, *outBuffer + *offset, *outSizeProcessed))
! 105: res = SZE_FAIL;
! 106: }
! 107: }
! 108: }
! 109: return res;
! 110: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>