Annotation of elwix/tools/oldlzma/SRC/7zip/Archive/7z_C/7zExtract.c, revision 1.1.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>