aboutsummaryrefslogtreecommitdiff
path: root/lib/UnrarXLib/extract.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/UnrarXLib/extract.cpp')
-rw-r--r--lib/UnrarXLib/extract.cpp905
1 files changed, 0 insertions, 905 deletions
diff --git a/lib/UnrarXLib/extract.cpp b/lib/UnrarXLib/extract.cpp
deleted file mode 100644
index 256da0401d..0000000000
--- a/lib/UnrarXLib/extract.cpp
+++ /dev/null
@@ -1,905 +0,0 @@
-#include "rar.hpp"
-#include "Util.h"
-
-// a cautious wrapper around strncpy
-char *strncpy_null_terminated(char *dest, const char *src, size_t n)
-{
- char *result = strncpy(dest, src, n);
- if(n>0) {
- dest[n-1] = '\0';
- }
- return result;
-}
-
-CmdExtract::CmdExtract()
-{
- TotalFileCount=0;
- *Password=0;
- Unp = NULL;
-}
-
-
-CmdExtract::~CmdExtract()
-{
- delete Unp;
- memset(Password,0,sizeof(Password));
-}
-
-
-void CmdExtract::DoExtract(CommandData *Cmd)
-{
- if (!Unp)
- {
- Unp=new Unpack(&DataIO);
- Unp->Init(NULL);
- }
- DataIO.SetCurrentCommand(*Cmd->Command);
-
- struct FindData FD;
- while (Cmd->GetArcName(ArcName,ArcNameW,sizeof(ArcName)))
- if (FindFile::FastFind(ArcName,ArcNameW,&FD))
- DataIO.TotalArcSize+=FD.Size;
- Cmd->ArcNames->Rewind();
- while (Cmd->GetArcName(ArcName,ArcNameW,sizeof(ArcName)))
- {
- while (ExtractArchive(Cmd)==EXTRACT_ARC_REPEAT)
- ;
- if (FindFile::FastFind(ArcName,ArcNameW,&FD))
- DataIO.ProcessedArcSize+=FD.Size;
- }
-
- if (TotalFileCount==0 && *Cmd->Command!='I')
- {
- if (!PasswordCancelled)
- {
- mprintf(St(MExtrNoFiles));
- }
- ErrHandler.SetErrorCode(WARNING);
- }
-#ifndef GUI
- else if (!Cmd->DisableDone)
- {
- if (*Cmd->Command=='I')
- {
- mprintf(St(MDone));
- }
- else
- {
- if (ErrHandler.GetErrorCount()==0)
- {
- mprintf(St(MExtrAllOk));
- }
- else
- {
- mprintf(St(MExtrTotalErr),ErrHandler.GetErrorCount());
- }
- }
- }
-#endif
-}
-
-
-void CmdExtract::ExtractArchiveInit(CommandData *Cmd,Archive &Arc)
-{
- if (!Unp)
- {
- Unp=new Unpack(&DataIO);
- Unp->Init(NULL);
- }
-
- DataIO.UnpArcSize=Arc.FileLength();
-
- FileCount=0;
- MatchedArgs=0;
-#ifndef SFX_MODULE
- FirstFile=true;
-#endif
-
- if (*Cmd->Password!=0)
- strncpy_null_terminated(Password,Cmd->Password, MAXPASSWORD);
- PasswordAll=(*Cmd->Password!=0);
-
- DataIO.UnpVolume=false;
-
- PrevExtracted=false;
- SignatureFound=false;
- AllMatchesExact=true;
- ReconstructDone=false;
-}
-
-
-EXTRACT_ARC_CODE CmdExtract::ExtractArchive(CommandData *Cmd)
-{
- Archive Arc(Cmd);
- if (!Arc.WOpen(ArcName,ArcNameW))
- {
- ErrHandler.SetErrorCode(OPEN_ERROR);
- return(EXTRACT_ARC_NEXT);
- }
-
- if (!Arc.IsArchive(true))
- {
-#ifndef GUI
- mprintf(St(MNotRAR),ArcName);
-#endif
- if (CmpExt(ArcName,"rar"))
- ErrHandler.SetErrorCode(WARNING);
- return(EXTRACT_ARC_NEXT);
- }
-
- if (!Arc.IsOpened())
- return(EXTRACT_ARC_NEXT);
-
-#ifndef SFX_MODULE
- if (Arc.Volume && Arc.NotFirstVolume)
- {
- char FirstVolName[NM];
-
- VolNameToFirstName(ArcName,FirstVolName,(Arc.NewMhd.Flags & MHD_NEWNUMBERING));
- if (stricomp(ArcName,FirstVolName)!=0 && FileExist(FirstVolName) &&
- Cmd->ArcNames->Search(FirstVolName,NULL,false))
- return(EXTRACT_ARC_NEXT);
- }
-#endif
- ExtractArchiveInit(Cmd,Arc);
-
- if (*Cmd->Command=='T' || *Cmd->Command=='I')
- Cmd->Test=true;
-
-#ifndef GUI
- if (*Cmd->Command=='I')
- Cmd->DisablePercentage=true;
- else
- if (Cmd->Test)
- {
- mprintf(St(MExtrTest),ArcName);
- }
- else
- {
- mprintf(St(MExtracting),ArcName);
- }
-#endif
-
- Arc.ViewComment();
-
- while (1)
- {
- int Size=Arc.ReadHeader();
- bool Repeat=false;
- if (!ExtractCurrentFile(Cmd,Arc,Size,Repeat))
- {
- if (Repeat)
- {
- return(EXTRACT_ARC_REPEAT);
- }
- else
- break;
- }
- }
- return(EXTRACT_ARC_NEXT);
-}
-
-
-bool CmdExtract::ExtractCurrentFile(CommandData *Cmd,Archive &Arc,int HeaderSize,bool &Repeat)
-{
- if (!Unp)
- {
- Unp=new Unpack(&DataIO);
- Unp->Init(NULL);
- }
- char Command=*Cmd->Command;
-
- if (HeaderSize<=0)
- {
- if (DataIO.UnpVolume)
- {
-//#ifdef NOVOLUME
-// return(false);
-//#else
- if (!MergeArchive(Arc,NULL,false,Command))
- {
- ErrHandler.SetErrorCode(WARNING);
- return(false);
- }
- SignatureFound=false;
-//#endif
- }
- else
- return(false);
- }
- int HeadType=Arc.GetHeaderType();
- if (HeadType!=FILE_HEAD)
- {
- if (HeadType==AV_HEAD || HeadType==SIGN_HEAD)
- SignatureFound=true;
-#if !defined(SFX_MODULE) && !defined(_WIN_CE)
- if (HeadType==SUB_HEAD && PrevExtracted)
- SetExtraInfo(Cmd,Arc,DestFileName,*DestFileNameW ? DestFileNameW:NULL);
-#endif
- if (HeadType==NEWSUB_HEAD)
- {
- if (Arc.SubHead.CmpName(SUBHEAD_TYPE_AV))
- SignatureFound=true;
-#if !defined(NOSUBBLOCKS) && !defined(_WIN_CE)
- if (PrevExtracted)
- SetExtraInfoNew(Cmd,Arc,DestFileName,*DestFileNameW ? DestFileNameW:NULL);
-#endif
- }
- if (HeadType==ENDARC_HEAD)
- {
- if (Arc.EndArcHead.Flags & EARC_NEXT_VOLUME)
- {
-#ifndef NOVOLUME
- if (!MergeArchive(Arc,NULL,false,Command))
- {
- ErrHandler.SetErrorCode(WARNING);
- return(false);
- }
- SignatureFound=false;
-#endif
- Arc.Seek(Arc.CurBlockPos,SEEK_SET);
- return(true);
- }
- else
- return(false);
- }
- Arc.SeekToNext();
- return(true);
- }
- PrevExtracted=false;
-
- if (SignatureFound ||
- (!Cmd->Recurse && MatchedArgs>=(int)Cmd->FileArgs->ItemsCount() && AllMatchesExact))
- return(false);
-
- char ArcFileName[NM];
-
- IntToExt(Arc.NewLhd.FileName,Arc.NewLhd.FileName);
- strncpy_null_terminated(ArcFileName,Arc.NewLhd.FileName, NM);
-
- wchar ArcFileNameW[NM];
- *ArcFileNameW=0;
-
- int MatchType=MATCH_WILDSUBPATH;
-
- bool EqualNames=false;
- int MatchNumber=Cmd->IsProcessFile(Arc.NewLhd,&EqualNames,MatchType);
- bool ExactMatch=MatchNumber!=0;
-#if !defined(SFX_MODULE) && !defined(_WIN_CE)
- if (Cmd->ExclPath==EXCL_BASEPATH)
- {
- *Cmd->ArcPath=0;
- if (ExactMatch)
- {
- Cmd->FileArgs->Rewind();
- if (Cmd->FileArgs->GetString(Cmd->ArcPath,NULL,sizeof(Cmd->ArcPath),MatchNumber-1))
- *PointToName(Cmd->ArcPath)=0;
- }
- }
-#endif
- if (ExactMatch && !EqualNames)
- AllMatchesExact=false;
-
-#ifdef UNICODE_SUPPORTED
- bool WideName=(Arc.NewLhd.Flags & LHD_UNICODE) && UnicodeEnabled();
-#else
- bool WideName=false;
-#endif
-
-#ifdef _APPLE
- if (WideName)
- {
- WideToUtf(Arc.NewLhd.FileNameW,ArcFileName,sizeof(ArcFileName));
- WideName=false;
- }
-#endif
-
- wchar *DestNameW=WideName ? DestFileNameW:NULL;
-
-#ifdef UNICODE_SUPPORTED
- if (WideName)
- {
- ConvertPath(Arc.NewLhd.FileNameW,ArcFileNameW);
- char Name[NM];
- WideToChar(ArcFileNameW,Name);
- if (IsNameUsable(Name))
- strncpy_null_terminated(ArcFileName,Name, NM);
- }
-#endif
-
- ConvertPath(ArcFileName,ArcFileName);
-
- if (Arc.IsArcLabel())
- return(true);
-
- if (Arc.NewLhd.Flags & LHD_VERSION)
- {
- if (Cmd->VersionControl!=1 && !EqualNames)
- {
- if (Cmd->VersionControl==0)
- ExactMatch=false;
- int Version=ParseVersionFileName(ArcFileName,ArcFileNameW,false);
- if (Cmd->VersionControl-1==Version)
- ParseVersionFileName(ArcFileName,ArcFileNameW,true);
- else
- ExactMatch=false;
- }
- }
- else
- if (!Arc.IsArcDir() && Cmd->VersionControl>1)
- ExactMatch=false;
-
- Arc.ConvertAttributes();
-
-#ifndef SFX_MODULE
- if ((Arc.NewLhd.Flags & (LHD_SPLIT_BEFORE/*|LHD_SOLID*/)) && FirstFile)
- {
- char CurVolName[NM];
- strncpy_null_terminated(CurVolName,ArcName, NM);
-
- VolNameToFirstName(ArcName,ArcName,(Arc.NewMhd.Flags & MHD_NEWNUMBERING) != 0);
- if (stricomp(ArcName,CurVolName)!=0 && FileExist(ArcName))
- {
- *ArcNameW=0;
- Repeat=true;
- return(false);
- }
-#if !defined(RARDLL) && !defined(_WIN_CE)
- if (!ReconstructDone)
- {
- ReconstructDone=true;
-
- RecVolumes RecVol;
- if (RecVol.Restore(Cmd,Arc.FileName,Arc.FileNameW,true))
- {
- Repeat=true;
- return(false);
- }
- }
-#endif
- strncpy_null_terminated(ArcName,CurVolName, NM);
- }
-#endif
-
- DataIO.UnpVolume=(Arc.NewLhd.Flags & LHD_SPLIT_AFTER);
- DataIO.NextVolumeMissing=false;
-
- Arc.Seek(Arc.NextBlockPos-Arc.NewLhd.FullPackSize,SEEK_SET);
-
- bool TestMode=false;
- bool ExtrFile=false;
- bool SkipSolid=false;
-
-#ifndef SFX_MODULE
- if (FirstFile && (ExactMatch || Arc.Solid) && (Arc.NewLhd.Flags & (LHD_SPLIT_BEFORE/*|LHD_SOLID*/))!=0)
- {
- if (ExactMatch)
- {
- Log(Arc.FileName,St(MUnpCannotMerge),(char*) ArcFileName);
-#ifdef RARDLL
- Cmd->DllError=ERAR_BAD_DATA;
-#endif
- ErrHandler.SetErrorCode(WARNING);
- }
- ExactMatch=false;
- }
-
- FirstFile=false;
-#endif
-
- if (ExactMatch || (SkipSolid=Arc.Solid)!=0)
- {
- if (Arc.NewLhd.Flags & LHD_PASSWORD)
-#ifndef RARDLL
- if (*Password==0)
-#endif
- {
-#ifdef RARDLL
- if (*Cmd->Password==0)
- if (Cmd->Callback==NULL ||
- Cmd->Callback(UCM_NEEDPASSWORD,Cmd->UserData,(LONG)Cmd->Password,sizeof(Cmd->Password))==-1)
- return(false);
- strncpy_null_terminated(Password,Cmd->Password, MAXPASSWORD);
-
-#else
- if (!GetPassword(PASSWORD_FILE,ArcFileName,Password,sizeof(Password)))
- {
- PasswordCancelled=true;
- return(false);
- }
-#endif
- }
-#if !defined(GUI) && !defined(SILENT)
- else
- if (!PasswordAll && (!Arc.Solid || Arc.NewLhd.UnpVer>=20 && (Arc.NewLhd.Flags & LHD_SOLID)==0))
- {
- eprintf(St(MUseCurPsw),(char*) ArcFileName);
- switch(Cmd->AllYes ? 1:Ask(St(MYesNoAll)))
- {
- case -1:
- ErrHandler.Exit(USER_BREAK);
- case 2:
- if (!GetPassword(PASSWORD_FILE,ArcFileName,Password,sizeof(Password)))
- {
- return(false);
- }
- break;
- case 3:
- PasswordAll=true;
- break;
- }
- }
-#endif
-
-#ifndef SFX_MODULE
- if (*Cmd->ExtrPath==0 && *Cmd->ExtrPathW!=0)
- WideToChar(Cmd->ExtrPathW,DestFileName);
- else
-#endif
- strncpy_null_terminated(DestFileName,Cmd->ExtrPath, NM);
-
-
-#ifndef SFX_MODULE
- if (Cmd->AppendArcNameToPath)
- {
- AddEndSlash(DestFileName);
- strcat(DestFileName,PointToName(Arc.FileName));
- SetExt(DestFileName,NULL);
- AddEndSlash(DestFileName);
- }
-#endif
-
- char *ExtrName=ArcFileName;
-
- bool EmptyName=false;
-#ifndef SFX_MODULE
- int Length=strlen(Cmd->ArcPath);
- if (Length>1 && IsPathDiv(Cmd->ArcPath[Length-1]) &&
- strlen(ArcFileName)==((unsigned int)Length-1))
- Length--;
- if (Length>0 && strnicomp(Cmd->ArcPath,ArcFileName,Length)==0)
- {
- ExtrName+=Length;
- while (*ExtrName==CPATHDIVIDER)
- ExtrName++;
- if (*ExtrName==0)
- EmptyName=true;
- }
-#endif
-
- bool AbsPaths=Cmd->ExclPath==EXCL_ABSPATH && Command=='X' && IsDriveDiv(':');
- if (AbsPaths)
- *DestFileName=0;
-
- if (DestFileName[strlen(DestFileName)-1] != '\\' && DestFileName[strlen(DestFileName)-1] != '/')
- strcat(DestFileName,"\\");
-
- if (Command=='E' || Cmd->ExclPath==EXCL_SKIPWHOLEPATH)
- {
- strcat(DestFileName,PointToName(ExtrName));
- }
- else
- strcat(DestFileName,ExtrName);
-
- if (AbsPaths && DestFileName[1]=='_' && IsPathDiv(DestFileName[2]))
- DestFileName[1]=':';
-
-#ifndef SFX_MODULE
- if (!WideName && *Cmd->ExtrPathW!=0)
- {
- DestNameW=DestFileNameW;
- WideName=true;
- CharToWide(ArcFileName,ArcFileNameW);
- }
-#endif
-
- if (WideName)
- {
- if (*Cmd->ExtrPathW!=0)
- strcpyw(DestFileNameW,Cmd->ExtrPathW);
- else
- CharToWide(Cmd->ExtrPath,DestFileNameW);
-
-#ifndef SFX_MODULE
- if (Cmd->AppendArcNameToPath)
- {
- wchar FileNameW[NM];
- if (*Arc.FileNameW!=0)
- strcpyw(FileNameW,Arc.FileNameW);
- else
- CharToWide(Arc.FileName,FileNameW);
- strcatw(DestFileNameW,PointToName(FileNameW));
- SetExt(DestFileNameW,NULL);
- AddEndSlash(DestFileNameW);
- }
-#endif
- wchar *ExtrNameW=ArcFileNameW;
-#ifndef SFX_MODULE
- if (Length>0)
- {
- wchar ArcPathW[NM];
- CharToWide(Cmd->ArcPath,ArcPathW);
- Length=strlenw(ArcPathW);
- }
- ExtrNameW+=Length;
- while (*ExtrNameW==CPATHDIVIDER)
- ExtrNameW++;
-#endif
-
- if (AbsPaths)
- *DestFileNameW=0;
-
- if (Command=='E' || Cmd->ExclPath==EXCL_SKIPWHOLEPATH)
- strcatw(DestFileNameW,PointToName(ExtrNameW));
- else
- strcatw(DestFileNameW,ExtrNameW);
-
- if (AbsPaths && DestFileNameW[1]=='_' && IsPathDiv(DestFileNameW[2]))
- DestFileNameW[1]=':';
- }
- else
- *DestFileNameW=0;
-
- ExtrFile=!SkipSolid && !EmptyName && (Arc.NewLhd.Flags & LHD_SPLIT_BEFORE)==0/* && *ExtrName*/;
- if ((Cmd->FreshFiles || Cmd->UpdateFiles) && (Command=='E' || Command=='X'))
- {
- struct FindData FD;
- if (FindFile::FastFind(DestFileName,DestNameW,&FD))
- {
- if (FD.mtime >= Arc.NewLhd.mtime)
- ExtrFile=false;
- }
- else
- if (Cmd->FreshFiles)
- ExtrFile=false;
- }
-
-#ifdef RARDLL
- if (*Cmd->DllDestName)
- {
- strncpy_null_terminated(DestFileName,Cmd->DllDestName,sizeof(DestFileName));
- *DestFileNameW=0;
- if (Cmd->DllOpMode!=RAR_EXTRACT)
- ExtrFile=false;
- }
- if (*Cmd->DllDestNameW)
- {
- strncpyw(DestFileNameW,Cmd->DllDestNameW,sizeof(DestFileNameW)/sizeof(DestFileNameW[0]));
- DestNameW=DestFileNameW;
- if (Cmd->DllOpMode!=RAR_EXTRACT)
- ExtrFile=false;
- }
-#endif
-
-#ifdef SFX_MODULE
- if (Arc.NewLhd.UnpVer!=UNP_VER && Arc.NewLhd.Method!=0x30)
-#else
- if (Arc.NewLhd.UnpVer<13 || Arc.NewLhd.UnpVer>UNP_VER)
-#endif
- {
-#ifndef SILENT
- Log(Arc.FileName,St(MUnknownMeth),(char*) ArcFileName);
-#ifndef SFX_MODULE
- Log(Arc.FileName,St(MVerRequired),Arc.NewLhd.UnpVer/10,Arc.NewLhd.UnpVer%10);
-#endif
-#endif
- ExtrFile=false;
- ErrHandler.SetErrorCode(WARNING);
-#ifdef RARDLL
- Cmd->DllError=ERAR_UNKNOWN_FORMAT;
-#endif
- }
-
- File CurFile;
-
- if (!IsLink(Arc.NewLhd.FileAttr))
- {
- if (Arc.IsArcDir())
- {
- if (!ExtrFile || Command=='P' || Command=='E' || Cmd->ExclPath==EXCL_SKIPWHOLEPATH)
- return(true);
- if (SkipSolid)
- {
-#ifndef GUI
- mprintf(St(MExtrSkipFile),(char*) ArcFileName);
-#endif
- return(true);
- }
- TotalFileCount++;
- if (Cmd->Test)
- {
-#ifndef GUI
- mprintf(St(MExtrTestFile),(char*) ArcFileName);
- mprintf(" %s",St(MOk));
-#endif
- return(true);
- }
- char _name[NM];
- if (WideName)
- WideToUtf(DestFileNameW, _name, sizeof(_name));
- else
- strcpy(_name, DestFileName);
- if (CUtil::CreateDirectoryEx(_name))
- {
-#ifndef GUI
- mprintf(St(MCreatDir),DestFileName);
- mprintf(" %s",St(MOk));
-#endif
- PrevExtracted=true;
- SetFileAttr(DestFileName,DestNameW,Arc.NewLhd.FileAttr);
- PrevExtracted=true;
- }
- else
- {
- Log(Arc.FileName,St(MExtrErrMkDir),DestFileName);
- ErrHandler.SysErrMsg();
-#ifdef RARDLL
- Cmd->DllError=ERAR_ECREATE;
-#endif
- ErrHandler.SetErrorCode(CREATE_ERROR);
- }
- if (PrevExtracted)
- SetDirTime(DestFileName,
- Cmd->xmtime==EXTTIME_NONE ? NULL:&Arc.NewLhd.mtime,
- Cmd->xctime==EXTTIME_NONE ? NULL:&Arc.NewLhd.ctime,
- Cmd->xatime==EXTTIME_NONE ? NULL:&Arc.NewLhd.atime);
- return(true);
- }
- else
- {
- if (Cmd->Test && ExtrFile)
- TestMode=true;
-#if !defined(GUI) && !defined(SFX_MODULE)
- if (Command=='P' && ExtrFile)
- CurFile.SetHandleType(FILE_HANDLESTD);
-#endif
- if ((Command=='E' || Command=='X') && ExtrFile && !Cmd->Test)
- {
- bool UserReject;
-
- if (GetDataIO().UnpackToMemorySize == -1)
- {
- if (!FileCreate(Cmd,&CurFile,DestFileName,DestNameW,Cmd->Overwrite,&UserReject,Arc.NewLhd.UnpSize,Arc.NewLhd.FileTime))
- {
- ExtrFile=false;
- if (!UserReject)
- {
- ErrHandler.CreateErrorMsg(Arc.FileName,DestFileName);
- ErrHandler.SetErrorCode(CREATE_ERROR);
-#ifdef RARDLL
- Cmd->DllError=ERAR_ECREATE;
-#endif
- }
- }
- }
- }
- }
- }
- if (!ExtrFile && Arc.Solid)
- {
- SkipSolid=true;
- TestMode=true;
- ExtrFile=true;
- }
- if (ExtrFile)
- {
- if (!SkipSolid)
- {
- if (!TestMode && Command!='P' && CurFile.IsDevice())
- {
- Log(Arc.FileName,St(MInvalidName),DestFileName);
- ErrHandler.WriteError(Arc.FileName,DestFileName);
- }
- TotalFileCount++;
- }
- FileCount++;
-#ifndef GUI
- if (Command!='I')
- {
- if (SkipSolid)
- mprintf(St(MExtrSkipFile),(char*) ArcFileName);
- else
- {
- switch(Cmd->Test ? 'T':Command)
- {
- case 'T':
- mprintf(St(MExtrTestFile),(char*) ArcFileName);
- break;
-#ifndef SFX_MODULE
- case 'P':
- mprintf(St(MExtrPrinting),(char*) ArcFileName);
- break;
-#endif
- case 'X':
- case 'E':
- mprintf(St(MExtrFile),DestFileName);
- break;
- }
- }
- }
- if (!Cmd->DisablePercentage)
- {
- mprintf(" ");
- }
-#endif
- DataIO.CurUnpRead=0;
- DataIO.CurUnpWrite=0;
- DataIO.UnpFileCRC=Arc.OldFormat ? 0 : 0xffffffff;
- DataIO.PackedCRC=0xffffffff;
- DataIO.SetEncryption(
- (Arc.NewLhd.Flags & LHD_PASSWORD) ? Arc.NewLhd.UnpVer:0,Password,
- (Arc.NewLhd.Flags & LHD_SALT) ? Arc.NewLhd.Salt:NULL,false);
- DataIO.SetPackedSizeToRead(Arc.NewLhd.FullPackSize);
- DataIO.SetFiles(&Arc,&CurFile);
- DataIO.SetTestMode(TestMode);
- DataIO.SetSkipUnpCRC(SkipSolid);
-
-#ifndef _WIN_CE
- if (!TestMode && !Arc.BrokenFileHeader &&
- (Arc.NewLhd.FullPackSize<<11)>Arc.NewLhd.FullUnpSize &&
- (Arc.NewLhd.FullUnpSize<100000000 || Arc.FileLength()>Arc.NewLhd.FullPackSize))
- CurFile.Prealloc(Arc.NewLhd.FullUnpSize);
-#endif
- CurFile.SetAllowDelete(!Cmd->KeepBroken);
-
- bool LinkCreateMode=!Cmd->Test && !SkipSolid;
- if (ExtractLink(DataIO,Arc,DestFileName,DataIO.UnpFileCRC,LinkCreateMode))
- PrevExtracted=LinkCreateMode;
- else if ((Arc.NewLhd.Flags & LHD_SPLIT_BEFORE)==0)
- {
- if (Arc.NewLhd.Method==0x30)
- UnstoreFile(DataIO,Arc.NewLhd.FullUnpSize);
- else
- {
- Unp->SetDestSize(Arc.NewLhd.FullUnpSize);
-#ifndef SFX_MODULE
- if (Arc.NewLhd.UnpVer<=15)
- Unp->DoUnpack(15,FileCount>1 && Arc.Solid);
- else
-#endif
- Unp->DoUnpack(Arc.NewLhd.UnpVer,(Arc.NewLhd.Flags & LHD_SOLID));
- }
- }
-
- if (DataIO.UnpackToMemorySize > -1)
- if (DataIO.hQuit->WaitMSec(1))
- {
- return false;
- }
-
- if (Arc.IsOpened())
- Arc.SeekToNext();
-
- bool BrokenFile=false;
-/* if (!SkipSolid)
- {
- if (Arc.OldFormat && UINT32(DataIO.UnpFileCRC)==UINT32(Arc.NewLhd.FileCRC) ||
- !Arc.OldFormat && UINT32(DataIO.UnpFileCRC)==UINT32(Arc.NewLhd.FileCRC^0xffffffff))
- {
-#ifndef GUI
- if (Command!='P' && Command!='I')
- mprintf("%s%s ",Cmd->DisablePercentage ? " ":"\b\b\b\b\b ",St(MOk));
-#endif
- }
- else
- {
- char *BadArcName=(Arc.NewLhd.Flags & LHD_SPLIT_BEFORE) ? NULL:Arc.FileName;
- if (Arc.NewLhd.Flags & LHD_PASSWORD)
- {
- Log(BadArcName,St(MEncrBadCRC),ArcFileName);
- }
- else
- {
- Log(BadArcName,St(MCRCFailed),ArcFileName);
- }
- BrokenFile=true;
- ErrHandler.SetErrorCode(CRC_ERROR);
-#ifdef RARDLL
- Cmd->DllError=ERAR_BAD_DATA;
-#endif
- Alarm();
- }
- }*/
-#ifndef GUI
-// else
-// mprintf("\b\b\b\b\b ");
-#endif
-
- if (!TestMode && (Command=='X' || Command=='E') &&
- !IsLink(Arc.NewLhd.FileAttr))
- {
-#if defined(_WIN_32) || defined(_EMX)
- if (Cmd->ClearArc)
- Arc.NewLhd.FileAttr&=~FA_ARCH;
-#endif
- if (!BrokenFile || Cmd->KeepBroken)
- {
- if (BrokenFile)
- CurFile.Truncate();
- CurFile.SetOpenFileStat(
- Cmd->xmtime==EXTTIME_NONE ? NULL:&Arc.NewLhd.mtime,
- Cmd->xctime==EXTTIME_NONE ? NULL:&Arc.NewLhd.ctime,
- Cmd->xatime==EXTTIME_NONE ? NULL:&Arc.NewLhd.atime);
- CurFile.Close();
- CurFile.SetCloseFileStat(
- Cmd->xmtime==EXTTIME_NONE ? NULL:&Arc.NewLhd.mtime,
- Cmd->xatime==EXTTIME_NONE ? NULL:&Arc.NewLhd.atime,
- Arc.NewLhd.FileAttr);
- PrevExtracted=true;
- }
- }
- }
- }
- if (ExactMatch)
- MatchedArgs++;
- if (DataIO.NextVolumeMissing || !Arc.IsOpened())
- return(false);
- if (!ExtrFile)
- {
- if (!Arc.Solid)
- Arc.SeekToNext();
- else if (!SkipSolid)
- return(false);
- }
- return(true);
-}
-
-
-void CmdExtract::UnstoreFile(ComprDataIO &DataIO,Int64 DestUnpSize)
-{
- Array<byte> Buffer(0x40000);
- if (DataIO.UnpackToMemorySize > -1)
- {
- while (1)
- {
- if (DataIO.hQuit->WaitMSec(1))
- {
- return;
- }
- int Code=DataIO.UnpRead(&Buffer[0],Buffer.Size());
- if (DataIO.UnpackToMemorySize > -1 && !DataIO.NextVolumeMissing)
- {
- if (DataIO.hSeek->WaitMSec(1))
- continue;
- }
- if (Code > 0)
- {
- DataIO.UnpWrite(&Buffer[0],Code);
- }
- else
- {
- if (DataIO.NextVolumeMissing)
- DataIO.hSeekDone->Set();
- else
- if (DataIO.hSeek->WaitMSec(1))
- continue;
- DataIO.hBufferFilled->Reset();
- DataIO.hBufferEmpty->Set();
- while (! DataIO.hBufferFilled->WaitMSec(1))
- if (DataIO.hQuit->WaitMSec(1))
- return;
- }
- }
- }
- else
- {
- while (1)
- {
- int Code=DataIO.UnpRead(&Buffer[0],Buffer.Size());
- if (Code > 0)
- {
- Code=Code<DestUnpSize ? Code:int64to32(DestUnpSize);
- DataIO.UnpWrite(&Buffer[0],Code);
- if (DestUnpSize>=0)
- DestUnpSize-=Code;
- }
- else if (Code == -1)
- {
- DataIO.NextVolumeMissing = true;
- return;
- }
- else
- return;
- }
- }
-}