diff options
author | Stefan Saraev <stefan@saraev.ca> | 2017-03-27 22:12:40 +0300 |
---|---|---|
committer | Stefan Saraev <stefan@saraev.ca> | 2017-04-07 20:14:12 +0300 |
commit | bee51e139fff45c788b9eb1e161b297d5ee7895b (patch) | |
tree | 69ad126aa511f7cf8ef70047c4ec28cad1f21888 /lib/UnrarXLib | |
parent | 1d718acfb13b0681805867dc6ce4f9715c0d0216 (diff) |
[cleanup] remove UnrarXLib
Diffstat (limited to 'lib/UnrarXLib')
121 files changed, 0 insertions, 19358 deletions
diff --git a/lib/UnrarXLib/CMakeLists.txt b/lib/UnrarXLib/CMakeLists.txt deleted file mode 100644 index 54037fe304..0000000000 --- a/lib/UnrarXLib/CMakeLists.txt +++ /dev/null @@ -1,54 +0,0 @@ -set(SOURCES archive.cpp - arcread.cpp - cmddata.cpp - consio.cpp - crc.cpp - crypt.cpp - encname.cpp - errhnd.cpp - extinfo.cpp - extract.cpp - filcreat.cpp - file.cpp - filefn.cpp - filestr.cpp - find.cpp - getbits.cpp - global.cpp - int64.cpp - isnt.cpp - log.cpp - match.cpp - options.cpp - pathfn.cpp - rar.cpp - rarvm.cpp - rawread.cpp - rdwrfn.cpp - recvol.cpp - resource.cpp - rijndael.cpp - rs.cpp - savepos.cpp - scantree.cpp - sha1.cpp - strfn.cpp - strlist.cpp - system.cpp - timefn.cpp - ulinks.cpp - unicode.cpp - unpack.cpp - volume.cpp) - -add_library(unrarxlib STATIC ${SOURCES} ${HEADERS}) -if(NOT CORE_SYSTEM_NAME STREQUAL windows) - target_compile_definitions(unrarxlib PRIVATE -DSILENT) -else() - target_compile_definitions(unrarxlib PRIVATE -D_XBMC) - add_precompiled_header(unrarxlib rar.hpp rar.cpp - EXCLUDE_SOURCES consio.cpp global.cpp) -endif() -set_target_properties(unrarxlib PROPERTIES FOLDER lib) -source_group_by_folder(unrarxlib) -set(core_DEPENDS unrarxlib ${core_DEPENDS} CACHE STRING "" FORCE) diff --git a/lib/UnrarXLib/Readme.txt b/lib/UnrarXLib/Readme.txt deleted file mode 100755 index 1852b76637..0000000000 --- a/lib/UnrarXLib/Readme.txt +++ /dev/null @@ -1,14 +0,0 @@ - UnrarX Manual - ~~~~~~~~~~~~~ - -UnrarX is a XBOX port of the UnRAR utility by Eugene Roshal, from -http://www.rarlab.com/rar_add.htm. -It provided an easy interface for extracting RAR files. The interface -is an adaptation of the interface provided in UniquE RAR File Library -(http://www.unrarlib.org/). - -The interface is in UnrarX.hpp. It includes a function to list the -contents of the archive (and a companion to free the archive list -structure), -and another funtion to uncompress. See the comments in the header file -for more info. diff --git a/lib/UnrarXLib/UnrarX.hpp b/lib/UnrarXLib/UnrarX.hpp deleted file mode 100644 index 716d89ee2a..0000000000 --- a/lib/UnrarXLib/UnrarX.hpp +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef _xbox_unrar_interface_ -#define _xbox_unrar_interface_ - - -/* This structure is used for listing archive content */ -struct RAR20_archive_entry /* These infos about files are */ -{ /* stored in RAR v2.0 archives */ - char *Name; - wchar_t *NameW; - unsigned short NameSize; - unsigned long PackSize; - int64_t UnpSize; - unsigned char HostOS; /* MSDOS=0,OS2=1,WIN32=2,UNIX=3 */ - unsigned long FileCRC; - unsigned long FileTime; - unsigned char UnpVer; - unsigned char Method; - unsigned long FileAttr; - int64_t iOffset; -}; - -/* used to list archives */ -typedef struct archivelist -{ - struct RAR20_archive_entry item; - struct archivelist *next; -} ArchiveList_struct; - -/*-------------------------------------------------------------------------*\ - Extract a RAR file - rarfile - Name of the RAR file to uncompress - targetPath - The path to which we want to uncompress - fileToExtract - The file inside the archive we want to uncompress, - or NULL for all files. - libpassword - Password (for encrypted archives) -\*-------------------------------------------------------------------------*/ -typedef bool (*progress_callback)(void*, int, const char*); -int urarlib_get(char *rarfile, char *targetPath, char *fileToExtract, char *libpassword = NULL, int64_t* iOffset=NULL, progress_callback progress = NULL, void *context = NULL); - -/*-------------------------------------------------------------------------*\ - List the files in a RAR file - rarfile - Name of the RAR file to uncompress - list - Output. A list of file data of the files in the archive. - The list should be freed with urarlib_freelist(). - libpassword - Password (for encrypted archives) -\*-------------------------------------------------------------------------*/ -int urarlib_list(char *rarfile, ArchiveList_struct **ppList, char *libpassword = NULL, bool stopattwo=false); - -/*-------------------------------------------------------------------------*\ - Free the file list returned by urarlib_list() - list - The output from urarlib_list() -\*-------------------------------------------------------------------------*/ -void urarlib_freelist(ArchiveList_struct *list); - -/*-------------------------------------------------------------------------*\ - Function used internally to change filenames if - they are fatx incompatible - unnedded and unused -\*-------------------------------------------------------------------------*/ -void MakeNameUsable(char* szPath,bool KeepExtension, bool IsFatx); - -#endif /* _xbox_unrar_interface_ */ diff --git a/lib/UnrarXLib/UnrarXLib.sln b/lib/UnrarXLib/UnrarXLib.sln deleted file mode 100644 index 1114578b29..0000000000 --- a/lib/UnrarXLib/UnrarXLib.sln +++ /dev/null @@ -1,30 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UnrarXLib", "UnrarXLib.vcproj", "{FE0A91C0-E30A-47CD-8A92-A508C9292452}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Profile = Profile - Profile_FastCap = Profile_FastCap - Release = Release - Release_LTCG = Release_LTCG - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {FE0A91C0-E30A-47CD-8A92-A508C9292452}.Debug.ActiveCfg = Debug|Xbox - {FE0A91C0-E30A-47CD-8A92-A508C9292452}.Debug.Build.0 = Debug|Xbox - {FE0A91C0-E30A-47CD-8A92-A508C9292452}.Profile.ActiveCfg = Profile|Xbox - {FE0A91C0-E30A-47CD-8A92-A508C9292452}.Profile.Build.0 = Profile|Xbox - {FE0A91C0-E30A-47CD-8A92-A508C9292452}.Profile_FastCap.ActiveCfg = Profile_FastCap|Xbox - {FE0A91C0-E30A-47CD-8A92-A508C9292452}.Profile_FastCap.Build.0 = Profile_FastCap|Xbox - {FE0A91C0-E30A-47CD-8A92-A508C9292452}.Release.ActiveCfg = Release|Xbox - {FE0A91C0-E30A-47CD-8A92-A508C9292452}.Release.Build.0 = Release|Xbox - {FE0A91C0-E30A-47CD-8A92-A508C9292452}.Release_LTCG.ActiveCfg = Release_LTCG|Xbox - {FE0A91C0-E30A-47CD-8A92-A508C9292452}.Release_LTCG.Build.0 = Release_LTCG|Xbox - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/lib/UnrarXLib/arccmt.cpp b/lib/UnrarXLib/arccmt.cpp deleted file mode 100644 index accfcd9016..0000000000 --- a/lib/UnrarXLib/arccmt.cpp +++ /dev/null @@ -1,183 +0,0 @@ -bool Archive::GetComment(Array<byte> &CmtData) -{ - if (!MainComment) - return(false); - SaveFilePos SavePos(*this); - - ushort CmtLength; -#ifndef SFX_MODULE - if (OldFormat) - { - Seek(SFXSize+SIZEOF_OLDMHD,SEEK_SET); - CmtLength=GetByte()+(GetByte()<<8); - } - else -#endif - { - if (NewMhd.Flags & MHD_COMMENT) - { - Seek(SFXSize+SIZEOF_MARKHEAD+SIZEOF_NEWMHD,SEEK_SET); - ReadHeader(); - } - else - { - Seek(SFXSize+SIZEOF_MARKHEAD+NewMhd.HeadSize,SEEK_SET); - return(SearchSubBlock(SUBHEAD_TYPE_CMT)!=0 && ReadCommentData(CmtData)!=0); - } -#ifndef SFX_MODULE - if (CommHead.HeadCRC!=HeaderCRC) - { - Log(FileName,St(MLogCommHead)); - Alarm(); - return(false); - } - CmtLength=CommHead.HeadSize-SIZEOF_COMMHEAD; -#endif - } -#ifndef SFX_MODULE - if ((OldFormat && (OldMhd.Flags & MHD_PACK_COMMENT)) || (!OldFormat && CommHead.Method!=0x30)) - { - if (!OldFormat && (CommHead.UnpVer < 15 || CommHead.UnpVer > UNP_VER || CommHead.Method > 0x35)) - return(false); - ComprDataIO DataIO; - Unpack Unpack(&DataIO); - Unpack.Init(); - DataIO.SetTestMode(true); - uint UnpCmtLength; - if (OldFormat) - { - UnpCmtLength=GetByte()+(GetByte()<<8); - CmtLength-=2; - DataIO.SetCmt13Encryption(); - } - else - UnpCmtLength=CommHead.UnpSize; - DataIO.SetFiles(this,NULL); - DataIO.EnableShowProgress(false); - DataIO.SetPackedSizeToRead(CmtLength); - Unpack.SetDestSize(UnpCmtLength); - Unpack.DoUnpack(CommHead.UnpVer,false); - - if (!OldFormat && ((~DataIO.UnpFileCRC)&0xffff)!=CommHead.CommCRC) - { - Log(FileName,St(MLogCommBrk)); - Alarm(); - return(false); - } - else - { - unsigned char *UnpData; - uint UnpDataSize; - DataIO.GetUnpackedData(&UnpData,&UnpDataSize); - CmtData.Alloc(UnpDataSize); - memcpy(&CmtData[0],UnpData,UnpDataSize); - } - } - else - { - CmtData.Alloc(CmtLength); - - Read(&CmtData[0],CmtLength); - if (!OldFormat && CommHead.CommCRC!=(~CRC(0xffffffff,&CmtData[0],CmtLength)&0xffff)) - { - Log(FileName,St(MLogCommBrk)); - Alarm(); - CmtData.Reset(); - return(false); - } - } -#endif -#if defined(_WIN_32) && !defined(_WIN_CE) && !defined(_XBOX) && !defined(_LINUX) - //if (CmtData.Size()>0) - // OemToCharBuff((char*)&CmtData[0],(char*)&CmtData[0],CmtData.Size()); -#endif - return(CmtData.Size()>0); -} - - -int Archive::ReadCommentData(Array<byte> &CmtData) -{ - bool Unicode=SubHead.SubFlags & SUBHEAD_FLAGS_CMT_UNICODE; - if (!ReadSubData(&CmtData,NULL)) - return(0); - int CmtSize=CmtData.Size(); - if (Unicode) - { - CmtSize/=2; - Array<wchar> CmtDataW(CmtSize+1); - RawToWide(&CmtData[0],&CmtDataW[0],CmtSize); - CmtDataW[CmtSize]=0; - CmtData.Alloc(CmtSize*2); - WideToChar(&CmtDataW[0],(char *)&CmtData[0]); - CmtSize=strlen((char *)&CmtData[0]); - CmtData.Alloc(CmtSize); - } - return(CmtSize); -} - - -void Archive::ViewComment() -{ -#ifndef GUI - if (Cmd->DisableComment) - return; - Array<byte> CmtBuf; - if (GetComment(CmtBuf)) - { - int CmtSize=CmtBuf.Size(); - char *ChPtr=(char *)memchr(&CmtBuf[0],0x1A,CmtSize); - if (ChPtr!=NULL) - CmtSize=ChPtr-(char *)&CmtBuf[0]; - mprintf("\n"); - OutComment((char *)&CmtBuf[0],CmtSize); - } -#endif -} - - -#ifndef SFX_MODULE -void Archive::ViewFileComment() -{ - if (!(NewLhd.Flags & LHD_COMMENT) || Cmd->DisableComment || OldFormat) - return; -#ifndef GUI - mprintf(St(MFileComment)); -#endif - const int MaxSize=0x8000; - Array<char> CmtBuf(MaxSize); - SaveFilePos SavePos(*this); - Seek(CurBlockPos+SIZEOF_NEWLHD+NewLhd.NameSize,SEEK_SET); - Int64 SaveCurBlockPos=CurBlockPos; - Int64 SaveNextBlockPos=NextBlockPos; - - int Size=ReadHeader(); - - CurBlockPos=SaveCurBlockPos; - NextBlockPos=SaveNextBlockPos; - - if (Size<7 || CommHead.HeadType!=COMM_HEAD) - return; - if (CommHead.HeadCRC!=HeaderCRC) - { - #ifndef GUI - Log(FileName,St(MLogCommHead)); -#endif - return; - } - if (CommHead.UnpVer < 15 || CommHead.UnpVer > UNP_VER || - CommHead.Method > 0x30 || CommHead.UnpSize > MaxSize) - return; - Read(&CmtBuf[0],CommHead.UnpSize); - if (CommHead.CommCRC!=((~CRC(0xffffffff,&CmtBuf[0],CommHead.UnpSize)&0xffff))) - { - Log(FileName,St(MLogBrokFCmt)); - } - else - { - OutComment(&CmtBuf[0],CommHead.UnpSize); -#ifndef GUI - mprintf("\n"); -#endif - } -} -#endif diff --git a/lib/UnrarXLib/archive.cpp b/lib/UnrarXLib/archive.cpp deleted file mode 100644 index 91faa02768..0000000000 --- a/lib/UnrarXLib/archive.cpp +++ /dev/null @@ -1,246 +0,0 @@ -#include "rar.hpp" - -#ifndef SHELL_EXT -#include "arccmt.cpp" -#endif - - -Archive::Archive(RAROptions *InitCmd) -{ - Cmd=InitCmd==NULL ? &DummyCmd:InitCmd; - OpenShared=Cmd->OpenShared; - OldFormat=false; - Solid=false; - Volume=false; - MainComment=false; - Locked=false; - Signed=false; - NotFirstVolume=false; - SFXSize=0; - LatestTime.Reset(); - Protected=false; - Encrypted=false; - BrokenFileHeader=false; - LastReadBlock=0; - - CurBlockPos=0; - NextBlockPos=0; - - RecoveryPos=SIZEOF_MARKHEAD; - RecoverySectors=-1; - - memset(&NewMhd,0,sizeof(NewMhd)); - NewMhd.HeadType=MAIN_HEAD; - NewMhd.HeadSize=SIZEOF_NEWMHD; - HeaderCRC=0; - VolWrite=0; - AddingFilesSize=0; - AddingHeadersSize=0; -#if !defined(SHELL_EXT) && !defined(NOCRYPT) - *HeadersSalt=0; - *SubDataSalt=0; -#endif - *FirstVolumeName=0; - *FirstVolumeNameW=0; - - Splitting=false; - NewArchive=false; - - SilentOpen=false; -} - - -#ifndef SHELL_EXT -void Archive::CheckArc(bool EnableBroken) -{ - if (!IsArchive(EnableBroken)) - { - Log(FileName,St(MBadArc),FileName); - ErrHandler.Exit(FATAL_ERROR); - } -} -#endif - - -#if !defined(SHELL_EXT) && !defined(SFX_MODULE) -void Archive::CheckOpen(char *Name,wchar *NameW) -{ - TOpen(Name,NameW); - CheckArc(false); -} -#endif - - -bool Archive::WCheckOpen(char *Name,wchar *NameW) -{ - if (!WOpen(Name,NameW)) - return(false); - if (!IsArchive(false)) - { -#ifndef SHELL_EXT - Log(FileName,St(MNotRAR),FileName); -#endif - Close(); - return(false); - } - return(true); -} - - -bool Archive::IsSignature(byte *D) -{ - bool Valid=false; - if (D[0]==0x52) - { -#ifndef SFX_MODULE - if (D[1]==0x45 && D[2]==0x7e && D[3]==0x5e) - { - OldFormat=true; - Valid=true; - } - else -#endif - { - if (D[1]==0x61 && D[2]==0x72 && D[3]==0x21 && D[4]==0x1a && D[5]==0x07 && D[6]==0x00) - { - OldFormat=false; - Valid=true; - } - } - } - return(Valid); -} - - -bool Archive::IsArchive(bool EnableBroken) -{ - Encrypted=false; -#ifndef SFX_MODULE - if (IsDevice()) - { -#ifndef SHELL_EXT - Log(FileName,St(MInvalidName),FileName); -#endif - return(false); - } -#endif - if (Read(MarkHead.Mark,SIZEOF_MARKHEAD)!=SIZEOF_MARKHEAD) - return(false); - - SFXSize=0; - if (IsSignature(MarkHead.Mark)) - { - if (OldFormat) - Seek(0,SEEK_SET); - } - else - { - Array<char> Buffer(0x80000); - long CurPos=int64to32(Tell()); - int ReadSize=Read(&Buffer[0],Buffer.Size()-16); - for (int I=0;I<ReadSize;I++) - if (Buffer[I]==0x52 && IsSignature((byte *)&Buffer[I])) - { - if (OldFormat && I>0 && CurPos<28 && ReadSize>31) - { - char *D=&Buffer[28-CurPos]; - if (D[0]!=0x52 || D[1]!=0x53 || D[2]!=0x46 || D[3]!=0x58) - continue; - } - SFXSize=CurPos+I; - Seek(SFXSize,SEEK_SET); - if (!OldFormat) - Read(MarkHead.Mark,SIZEOF_MARKHEAD); - break; - } - if (SFXSize==0) - return(false); - } - ReadHeader(); - SeekToNext(); -#ifndef SFX_MODULE - if (OldFormat) - { - NewMhd.Flags=OldMhd.Flags & 0x3f; - NewMhd.HeadSize=OldMhd.HeadSize; - } - else -#endif - { - if (HeaderCRC!=NewMhd.HeadCRC) - { -#ifndef SHELL_EXT - Log(FileName,St(MLogMainHead)); -#endif - Alarm(); - if (!EnableBroken) - return(false); - } - } - Volume=(NewMhd.Flags & MHD_VOLUME); - Solid=(NewMhd.Flags & MHD_SOLID)!=0; - MainComment=(NewMhd.Flags & MHD_COMMENT)!=0; - Locked=(NewMhd.Flags & MHD_LOCK)!=0; - Signed=(NewMhd.PosAV!=0); - Protected=(NewMhd.Flags & MHD_PROTECT)!=0; - Encrypted=(NewMhd.Flags & MHD_PASSWORD)!=0; - -#ifdef RARDLL - SilentOpen=true; -#endif - if (!SilentOpen || !Encrypted) - { - SaveFilePos SavePos(*this); - Int64 SaveCurBlockPos=CurBlockPos,SaveNextBlockPos=NextBlockPos; - - NotFirstVolume=false; - while (ReadHeader()) - { - int HeaderType=GetHeaderType(); - if (HeaderType==NEWSUB_HEAD) - { - if (SubHead.CmpName(SUBHEAD_TYPE_CMT)) - MainComment=true; - if ((SubHead.Flags & LHD_SPLIT_BEFORE) || - (Volume && (NewMhd.Flags & MHD_FIRSTVOLUME)==0)) - NotFirstVolume=true; - } - else - { - if ((HeaderType==FILE_HEAD && ((NewLhd.Flags & LHD_SPLIT_BEFORE)!=0)) || - (Volume && NewLhd.UnpVer>=29 && (NewMhd.Flags & MHD_FIRSTVOLUME)==0)) - NotFirstVolume=true; - break; - } - SeekToNext(); - } - CurBlockPos=SaveCurBlockPos; - NextBlockPos=SaveNextBlockPos; - } - return(true); -} - - - - -void Archive::SeekToNext() -{ - Seek(NextBlockPos,SEEK_SET); -} - - -#ifndef SFX_MODULE -int Archive::GetRecoverySize(bool Required) -{ - if (!Protected) - return(0); - if (RecoverySectors!=-1 || !Required) - return(RecoverySectors); - SaveFilePos SavePos(*this); - Seek(SFXSize,SEEK_SET); - SearchSubBlock(SUBHEAD_TYPE_RR); - return(RecoverySectors); -} -#endif - - diff --git a/lib/UnrarXLib/archive.hpp b/lib/UnrarXLib/archive.hpp deleted file mode 100644 index c076b5b73f..0000000000 --- a/lib/UnrarXLib/archive.hpp +++ /dev/null @@ -1,128 +0,0 @@ -#ifndef _RAR_ARCHIVE_ -#define _RAR_ARCHIVE_ - -class Pack; - -enum {EN_LOCK=1,EN_VOL=2,EN_FIRSTVOL=4}; - -class Archive:public File -{ - private: - bool IsSignature(byte *D); - void UpdateLatestTime(FileHeader *CurBlock); - void Protect(int RecSectors); - void ConvertNameCase(char *Name); - void ConvertNameCase(wchar *Name); - void ConvertUnknownHeader(); - bool AddArcComment(char *NameToShow); - int ReadOldHeader(); - void PrepareExtraTime(FileHeader *hd,EXTTIME_MODE etm,EXTTIME_MODE etc,EXTTIME_MODE eta,EXTTIME_MODE etarc,Array<byte> &TimeData); - -#if !defined(SHELL_EXT) && !defined(NOCRYPT) - CryptData HeadersCrypt; - byte HeadersSalt[SALT_SIZE]; -#endif -#ifndef SHELL_EXT - ComprDataIO SubDataIO; - byte SubDataSalt[SALT_SIZE]; -#endif - RAROptions *Cmd,DummyCmd; - - MarkHeader MarkHead; - OldMainHeader OldMhd; - - int RecoverySectors; - Int64 RecoveryPos; - - RarTime LatestTime; - int LastReadBlock; - int CurHeaderType; - - bool SilentOpen; - public: - Archive(RAROptions *InitCmd=NULL); - bool IsArchive(bool EnableBroken); - int SearchBlock(int BlockType); - int SearchSubBlock(const char *Type); - int ReadBlock(int BlockType); - void WriteBlock(int BlockType,BaseBlock *wb=NULL); - int PrepareNamesToWrite(char *Name,wchar *NameW,char *DestName,byte *DestNameW); - void SetLhdSize(); - int ReadHeader(); - void CheckArc(bool EnableBroken); - void CheckOpen(char *Name,wchar *NameW=NULL); - bool WCheckOpen(char *Name,wchar *NameW=NULL); - bool TestLock(int Mode); - void MakeTemp(); - void CopyMainHeader(Archive &Src,bool CopySFX=true,char *NameToDisplay=NULL); - bool ProcessToFileHead(Archive &Src,bool LastBlockAdded, - Pack *Pack=NULL,const char *SkipName=NULL); - void TmpToArc(Archive &Src); - void CloseNew(int AdjustRecovery,bool CloseVolume); - void WriteEndBlock(bool CloseVolume); - void CopyFileRecord(Archive &Src); - void CopyArchiveData(Archive &Src); - bool GetComment(Array<byte> &CmtData); - void ViewComment(); - void ViewFileComment(); - void SetLatestTime(RarTime *NewTime); - void SeekToNext(); - bool CheckAccess(); - bool IsArcDir(); - bool IsArcLabel(); - void ConvertAttributes(); - int GetRecoverySize(bool Required); - void VolSubtractHeaderSize(int SubSize); - void AddSubData(byte *SrcData,int DataSize,File *SrcFile,char *Name,bool AllowSplit); - bool ReadSubData(Array<byte> *UnpData,File *DestFile); - int GetHeaderType() {return(CurHeaderType);}; - int ReadCommentData(Array<byte> &CmtData); - void WriteCommentData(byte *Data,int DataSize,bool FileComment); - RAROptions* GetRAROptions() {return(Cmd);} - void SetSilentOpen(bool Mode) {SilentOpen=Mode;} - - BaseBlock ShortBlock; - MainHeader NewMhd; - FileHeader NewLhd; - EndArcHeader EndArcHead; - SubBlockHeader SubBlockHead; - FileHeader SubHead; - CommentHeader CommHead; - ProtectHeader ProtectHead; - AVHeader AVHead; - SignHeader SignHead; - UnixOwnersHeader UOHead; - MacFInfoHeader MACHead; - EAHeader EAHead; - StreamHeader StreamHead; - - Int64 CurBlockPos; - Int64 NextBlockPos; - - bool OldFormat; - bool Solid; - bool Volume; - bool MainComment; - bool Locked; - bool Signed; - bool NotFirstVolume; - bool Protected; - bool Encrypted; - uint SFXSize; - bool BrokenFileHeader; - - bool Splitting; - - ushort HeaderCRC; - - Int64 VolWrite; - Int64 AddingFilesSize; - uint AddingHeadersSize; - - bool NewArchive; - - char FirstVolumeName[NM]; - wchar FirstVolumeNameW[NM]; -}; - -#endif diff --git a/lib/UnrarXLib/arcread.cpp b/lib/UnrarXLib/arcread.cpp deleted file mode 100644 index 0f89ed17bd..0000000000 --- a/lib/UnrarXLib/arcread.cpp +++ /dev/null @@ -1,642 +0,0 @@ -#include "rar.hpp" - -int Archive::SearchBlock(int BlockType) -{ - int Size,Count=0; - while ((Size=ReadHeader())!=0 && - (BlockType==ENDARC_HEAD || GetHeaderType()!=ENDARC_HEAD)) - { - if ((++Count & 127)==0) - Wait(); - if (GetHeaderType()==BlockType) - return(Size); - SeekToNext(); - } - return(0); -} - - -int Archive::SearchSubBlock(const char *Type) -{ - int Size; - while ((Size=ReadHeader())!=0 && GetHeaderType()!=ENDARC_HEAD) - { - if (GetHeaderType()==NEWSUB_HEAD && SubHead.CmpName(Type)) - return(Size); - SeekToNext(); - } - return(0); -} - - -int Archive::ReadHeader() -{ - CurBlockPos=Tell(); - -#ifndef SFX_MODULE - if (OldFormat) - return(ReadOldHeader()); -#endif - - RawRead Raw(this); - - bool Decrypt=Encrypted && CurBlockPos>=SFXSize+SIZEOF_MARKHEAD+SIZEOF_NEWMHD; - - if (Decrypt) - { -#if defined(SHELL_EXT) || defined(NOCRYPT) - return(0); -#else - if (Read(HeadersSalt,SALT_SIZE)!=SALT_SIZE) - return(0); - if (*Cmd->Password==0) -#ifdef RARDLL - if (Cmd->Callback==NULL || - Cmd->Callback(UCM_NEEDPASSWORD,Cmd->UserData,(LONG)Cmd->Password,sizeof(Cmd->Password))==-1) - { - Close(); - ErrHandler.Exit(USER_BREAK); - } - -#else - if (!GetPassword(PASSWORD_ARCHIVE,FileName,Cmd->Password,sizeof(Cmd->Password))) - { - Close(); - ErrHandler.Exit(USER_BREAK); - } -#endif - HeadersCrypt.SetCryptKeys(Cmd->Password,HeadersSalt,false); - Raw.SetCrypt(&HeadersCrypt); -#endif - } - - Raw.Read(SIZEOF_SHORTBLOCKHEAD); - if (Raw.Size()==0) - { - Int64 ArcSize=FileLength(); - if (CurBlockPos>ArcSize || NextBlockPos>ArcSize) - { - #ifndef SHELL_EXT - Log(FileName,St(MLogUnexpEOF)); - #endif - ErrHandler.SetErrorCode(WARNING); - } - return(0); - } - - Raw.Get(ShortBlock.HeadCRC); - byte HeadType; - Raw.Get(HeadType); - ShortBlock.HeadType=(HEADER_TYPE)HeadType; - Raw.Get(ShortBlock.Flags); - Raw.Get(ShortBlock.HeadSize); - if (ShortBlock.HeadSize<SIZEOF_SHORTBLOCKHEAD) - { -#ifndef SHELL_EXT - Log(FileName,St(MLogFileHead),"???"); -#endif - BrokenFileHeader=true; - ErrHandler.SetErrorCode(CRC_ERROR); - return(0); - } - - if (ShortBlock.HeadType==COMM_HEAD) - Raw.Read(SIZEOF_COMMHEAD-SIZEOF_SHORTBLOCKHEAD); - else - if (ShortBlock.HeadType==MAIN_HEAD && (ShortBlock.Flags & MHD_COMMENT)!=0) - Raw.Read(SIZEOF_NEWMHD-SIZEOF_SHORTBLOCKHEAD); - else - Raw.Read(ShortBlock.HeadSize-SIZEOF_SHORTBLOCKHEAD); - - NextBlockPos=CurBlockPos+ShortBlock.HeadSize; - - switch(ShortBlock.HeadType) - { - case MAIN_HEAD: - *(BaseBlock *)&NewMhd=ShortBlock; - Raw.Get(NewMhd.HighPosAV); - Raw.Get(NewMhd.PosAV); - break; - case ENDARC_HEAD: - *(BaseBlock *)&EndArcHead=ShortBlock; - if (EndArcHead.Flags & EARC_DATACRC) - Raw.Get(EndArcHead.ArcDataCRC); - if (EndArcHead.Flags & EARC_VOLNUMBER) - Raw.Get(EndArcHead.VolNumber); - break; - case FILE_HEAD: - case NEWSUB_HEAD: - { - FileHeader *hd=ShortBlock.HeadType==FILE_HEAD ? &NewLhd:&SubHead; - *(BaseBlock *)hd=ShortBlock; - Raw.Get(hd->PackSize); - Raw.Get(hd->UnpSize); - Raw.Get(hd->HostOS); - Raw.Get(hd->FileCRC); - Raw.Get(hd->FileTime); - Raw.Get(hd->UnpVer); - Raw.Get(hd->Method); - Raw.Get(hd->NameSize); - Raw.Get(hd->FileAttr); - if (hd->Flags & LHD_LARGE) - { - Raw.Get(hd->HighPackSize); - Raw.Get(hd->HighUnpSize); - } - else - { - hd->HighPackSize=hd->HighUnpSize=0; - if (hd->UnpSize==0xffffffff) - { - hd->UnpSize=int64to32(INT64MAX); - hd->HighUnpSize=int64to32(INT64MAX>>32); - } - } - hd->FullPackSize=int32to64(hd->HighPackSize,hd->PackSize); - hd->FullUnpSize=int32to64(hd->HighUnpSize,hd->UnpSize); - - char FileName[NM*4]; - int NameSize=Min(hd->NameSize,sizeof(FileName)-1); - Raw.Get((byte *)FileName,NameSize); - FileName[NameSize]=0; - - strncpy(hd->FileName,FileName,sizeof(hd->FileName)); - hd->FileName[sizeof(hd->FileName)-1]=0; - - if (hd->HeadType==NEWSUB_HEAD) - { - int DataSize=hd->HeadSize-hd->NameSize-SIZEOF_NEWLHD; - if (hd->Flags & LHD_SALT) - DataSize-=SALT_SIZE; - if (DataSize>0) - { - hd->SubData.Alloc(DataSize); - Raw.Get(&hd->SubData[0],DataSize); - if (hd->CmpName(SUBHEAD_TYPE_RR)) - { - byte *D=&hd->SubData[8]; - RecoverySectors=D[0]+((uint)D[1]<<8)+((uint)D[2]<<16)+((uint)D[3]<<24); - } - } - } - else - if (hd->HeadType==FILE_HEAD) - { - if (hd->Flags & LHD_UNICODE) - { - EncodeFileName NameCoder; - int Length=strlen(FileName)+1; - NameCoder.Decode(FileName,(byte *)FileName+Length, - hd->NameSize-Length,hd->FileNameW, - sizeof(hd->FileNameW)/sizeof(hd->FileNameW[0])); - if (*hd->FileNameW==0) - hd->Flags &= ~LHD_UNICODE; - } - else - *hd->FileNameW=0; -#ifndef SFX_MODULE - ConvertNameCase(hd->FileName); - ConvertNameCase(hd->FileNameW); -#endif - ConvertUnknownHeader(); - } - if (hd->Flags & LHD_SALT) - Raw.Get(hd->Salt,SALT_SIZE); - hd->mtime.SetDos(hd->FileTime); - hd->ctime.Reset(); - hd->atime.Reset(); - hd->arctime.Reset(); - if (hd->Flags & LHD_EXTTIME) - { - ushort Flags; - Raw.Get(Flags); - RarTime *tbl[4]; - tbl[0]=&NewLhd.mtime; - tbl[1]=&NewLhd.ctime; - tbl[2]=&NewLhd.atime; - tbl[3]=&NewLhd.arctime; - for (int I=0;I<4;I++) - { - RarTime *CurTime=tbl[I]; - uint rmode=Flags>>(3-I)*4; - if ((rmode & 8)==0) - continue; - if (I!=0) - { - uint DosTime; - Raw.Get(DosTime); - CurTime->SetDos(DosTime); - } - RarLocalTime rlt; - CurTime->GetLocal(&rlt); - if (rmode & 4) - rlt.Second++; - rlt.Reminder=0; - int count=rmode&3; - for (int J=0;J<count;J++) - { - byte CurByte; - Raw.Get(CurByte); - rlt.Reminder|=(((uint)CurByte)<<((J+3-count)*8)); - } - CurTime->SetLocal(&rlt); - } - } - NextBlockPos+=hd->FullPackSize; - bool CRCProcessedOnly=(hd->Flags & LHD_COMMENT)!=0; - HeaderCRC = ~Raw.GetCRC(CRCProcessedOnly) & 0xffff; - if (hd->HeadCRC!=HeaderCRC) - { - if (hd->HeadType==NEWSUB_HEAD) - strcat(hd->FileName,"- ???"); - BrokenFileHeader=true; - ErrHandler.SetErrorCode(WARNING); -#ifndef SHELL_EXT - Log(Archive::FileName,St(MLogFileHead),IntNameToExt(hd->FileName)); - Alarm(); -#endif - } - } - break; -#ifndef SFX_MODULE - case COMM_HEAD: - *(BaseBlock *)&CommHead=ShortBlock; - Raw.Get(CommHead.UnpSize); - Raw.Get(CommHead.UnpVer); - Raw.Get(CommHead.Method); - Raw.Get(CommHead.CommCRC); - break; - case SIGN_HEAD: - *(BaseBlock *)&SignHead=ShortBlock; - Raw.Get(SignHead.CreationTime); - Raw.Get(SignHead.ArcNameSize); - Raw.Get(SignHead.UserNameSize); - break; - case AV_HEAD: - *(BaseBlock *)&AVHead=ShortBlock; - Raw.Get(AVHead.UnpVer); - Raw.Get(AVHead.Method); - Raw.Get(AVHead.AVVer); - Raw.Get(AVHead.AVInfoCRC); - break; - case PROTECT_HEAD: - *(BaseBlock *)&ProtectHead=ShortBlock; - Raw.Get(ProtectHead.DataSize); - Raw.Get(ProtectHead.Version); - Raw.Get(ProtectHead.RecSectors); - Raw.Get(ProtectHead.TotalBlocks); - Raw.Get(ProtectHead.Mark,8); - NextBlockPos+=ProtectHead.DataSize; - RecoverySectors=ProtectHead.RecSectors; - break; - case SUB_HEAD: - *(BaseBlock *)&SubBlockHead=ShortBlock; - Raw.Get(SubBlockHead.DataSize); - NextBlockPos+=SubBlockHead.DataSize; - Raw.Get(SubBlockHead.SubType); - Raw.Get(SubBlockHead.Level); - switch(SubBlockHead.SubType) - { - case UO_HEAD: - *(SubBlockHeader *)&UOHead=SubBlockHead; - Raw.Get(UOHead.OwnerNameSize); - Raw.Get(UOHead.GroupNameSize); - if (UOHead.OwnerNameSize>NM-1) - UOHead.OwnerNameSize=NM-1; - if (UOHead.GroupNameSize>NM-1) - UOHead.GroupNameSize=NM-1; - Raw.Get((byte *)UOHead.OwnerName,UOHead.OwnerNameSize); - Raw.Get((byte *)UOHead.GroupName,UOHead.GroupNameSize); - UOHead.OwnerName[UOHead.OwnerNameSize]=0; - UOHead.GroupName[UOHead.GroupNameSize]=0; - break; - case MAC_HEAD: - *(SubBlockHeader *)&MACHead=SubBlockHead; - Raw.Get(MACHead.fileType); - Raw.Get(MACHead.fileCreator); - break; - case EA_HEAD: - case BEEA_HEAD: - case NTACL_HEAD: - *(SubBlockHeader *)&EAHead=SubBlockHead; - Raw.Get(EAHead.UnpSize); - Raw.Get(EAHead.UnpVer); - Raw.Get(EAHead.Method); - Raw.Get(EAHead.EACRC); - break; - case STREAM_HEAD: - *(SubBlockHeader *)&StreamHead=SubBlockHead; - Raw.Get(StreamHead.UnpSize); - Raw.Get(StreamHead.UnpVer); - Raw.Get(StreamHead.Method); - Raw.Get(StreamHead.StreamCRC); - Raw.Get(StreamHead.StreamNameSize); - if (StreamHead.StreamNameSize>NM-1) - StreamHead.StreamNameSize=NM-1; - Raw.Get((byte *)StreamHead.StreamName,StreamHead.StreamNameSize); - StreamHead.StreamName[StreamHead.StreamNameSize]=0; - break; - } - break; -#endif - default: - if (ShortBlock.Flags & LONG_BLOCK) - { - uint DataSize; - Raw.Get(DataSize); - NextBlockPos+=DataSize; - } - break; - } - HeaderCRC=~Raw.GetCRC(false)&0xffff; - CurHeaderType=ShortBlock.HeadType; - if (Decrypt) - { - NextBlockPos+=Raw.PaddedSize()+SALT_SIZE; - - if (ShortBlock.HeadCRC!=HeaderCRC) - { - bool Recovered=false; - if (ShortBlock.HeadType==ENDARC_HEAD && (EndArcHead.Flags & EARC_REVSPACE)!=0) - { - SaveFilePos SavePos(*this); - Int64 Length=Tell(); - Seek(Length-7,SEEK_SET); - Recovered=true; - for (int J=0;J<7;J++) - if (GetByte()!=0) - Recovered=false; - } - if (!Recovered) - { -#ifndef SILENT - Log(FileName,St(MEncrBadCRC),FileName); -#endif - Close(); - - BrokenFileHeader=true; - ErrHandler.SetErrorCode(CRC_ERROR); - return(0); -// ErrHandler.Exit(CRC_ERROR); - } - } - } - - if (NextBlockPos<=CurBlockPos) - { -#ifndef SHELL_EXT - Log(FileName,St(MLogFileHead),"???"); -#endif - BrokenFileHeader=true; - ErrHandler.SetErrorCode(CRC_ERROR); - return(0); - } - return(Raw.Size()); -} - - -#ifndef SFX_MODULE -int Archive::ReadOldHeader() -{ - RawRead Raw(this); - if (CurBlockPos<=SFXSize) - { - Raw.Read(SIZEOF_OLDMHD); - Raw.Get(OldMhd.Mark,4); - Raw.Get(OldMhd.HeadSize); - Raw.Get(OldMhd.Flags); - NextBlockPos=CurBlockPos+OldMhd.HeadSize; - CurHeaderType=MAIN_HEAD; - } - else - { - OldFileHeader OldLhd; - Raw.Read(SIZEOF_OLDLHD); - NewLhd.HeadType=FILE_HEAD; - Raw.Get(NewLhd.PackSize); - Raw.Get(NewLhd.UnpSize); - Raw.Get(OldLhd.FileCRC); - Raw.Get(NewLhd.HeadSize); - Raw.Get(NewLhd.FileTime); - Raw.Get(OldLhd.FileAttr); - Raw.Get(OldLhd.Flags); - Raw.Get(OldLhd.UnpVer); - Raw.Get(OldLhd.NameSize); - Raw.Get(OldLhd.Method); - - NewLhd.Flags=OldLhd.Flags|LONG_BLOCK; - NewLhd.UnpVer=(OldLhd.UnpVer==2) ? 13 : 10; - NewLhd.Method=OldLhd.Method+0x30; - NewLhd.NameSize=OldLhd.NameSize; - NewLhd.FileAttr=OldLhd.FileAttr; - NewLhd.FileCRC=OldLhd.FileCRC; - NewLhd.FullPackSize=NewLhd.PackSize; - NewLhd.FullUnpSize=NewLhd.UnpSize; - - NewLhd.mtime.SetDos(NewLhd.FileTime); - NewLhd.ctime.Reset(); - NewLhd.atime.Reset(); - NewLhd.arctime.Reset(); - - Raw.Read(OldLhd.NameSize); - Raw.Get((byte *)NewLhd.FileName,OldLhd.NameSize); - NewLhd.FileName[OldLhd.NameSize]=0; - ConvertNameCase(NewLhd.FileName); - *NewLhd.FileNameW=0; - - if (Raw.Size()!=0) - NextBlockPos=CurBlockPos+NewLhd.HeadSize+NewLhd.PackSize; - CurHeaderType=FILE_HEAD; - } - return(NextBlockPos>CurBlockPos ? Raw.Size():0); -} -#endif - - -void Archive::ConvertNameCase(char *Name) -{ - if (Cmd->ConvertNames==NAMES_UPPERCASE) - { - IntToExt(Name,Name); - strupper(Name); - ExtToInt(Name,Name); - } - if (Cmd->ConvertNames==NAMES_LOWERCASE) - { - IntToExt(Name,Name); - strlower(Name); - ExtToInt(Name,Name); - } -} - - -#ifndef SFX_MODULE -void Archive::ConvertNameCase(wchar *Name) -{ - if (Cmd->ConvertNames==NAMES_UPPERCASE) - strupperw(Name); - if (Cmd->ConvertNames==NAMES_LOWERCASE) - strlowerw(Name); -} -#endif - - -bool Archive::IsArcDir() -{ - return((NewLhd.Flags & LHD_WINDOWMASK)==LHD_DIRECTORY); -} - - -bool Archive::IsArcLabel() -{ - return(NewLhd.HostOS<=HOST_WIN32 && (NewLhd.FileAttr & 8)); -} - - -void Archive::ConvertAttributes() -{ -#if defined(_WIN_32) || defined(_EMX) - switch(NewLhd.HostOS) - { - case HOST_MSDOS: - case HOST_OS2: - case HOST_WIN32: - break; - case HOST_UNIX: - case HOST_BEOS: - if ((NewLhd.Flags & LHD_WINDOWMASK)==LHD_DIRECTORY) - NewLhd.FileAttr=0x10; - else - NewLhd.FileAttr=0x20; - break; - default: - if ((NewLhd.Flags & LHD_WINDOWMASK)==LHD_DIRECTORY) - NewLhd.FileAttr=0x10; - else - NewLhd.FileAttr=0x20; - break; - } -#endif -#ifdef _UNIX - static mode_t mask = (mode_t) -1; - - if (mask == (mode_t) -1) - { - mask = umask(022); - umask(mask); - } - switch(NewLhd.HostOS) - { - case HOST_MSDOS: - case HOST_OS2: - case HOST_WIN32: - if (NewLhd.FileAttr & 0x10) - NewLhd.FileAttr=0x41ff & ~mask; - else - if (NewLhd.FileAttr & 1) - NewLhd.FileAttr=0x8124 & ~mask; - else - NewLhd.FileAttr=0x81b6 & ~mask; - break; - case HOST_UNIX: - case HOST_BEOS: - break; - default: - if ((NewLhd.Flags & LHD_WINDOWMASK)==LHD_DIRECTORY) - NewLhd.FileAttr=0x41ff & ~mask; - else - NewLhd.FileAttr=0x81b6 & ~mask; - break; - } -#endif -} - - -void Archive::ConvertUnknownHeader() -{ - if (NewLhd.UnpVer<20 && (NewLhd.FileAttr & 0x10)) - NewLhd.Flags|=LHD_DIRECTORY; - if (NewLhd.HostOS>=HOST_MAX) - { - if ((NewLhd.Flags & LHD_WINDOWMASK)==LHD_DIRECTORY) - NewLhd.FileAttr=0x10; - else - NewLhd.FileAttr=0x20; - } - for (char *s=NewLhd.FileName;*s!=0;s=charnext(s)) - { - if (*s=='/' || *s=='\\') - *s=CPATHDIVIDER; -#if defined(_APPLE) && !defined(UNICODE_SUPPORTED) - if ((byte)*s<32 || (byte)*s>127) - *s='_'; -#endif - } - for (wchar *s=NewLhd.FileNameW;*s!=0;s++) - if (*s=='/' || *s=='\\') - *s=CPATHDIVIDER; -} - -#ifndef SHELL_EXT -bool Archive::ReadSubData(Array<byte> *UnpData,File *DestFile) -{ - if (HeaderCRC!=SubHead.HeadCRC) - { -#ifndef SHELL_EXT - Log(FileName,St(MSubHeadCorrupt)); -#endif - ErrHandler.SetErrorCode(CRC_ERROR); - return(false); - } - if (SubHead.Method<0x30 || SubHead.Method>0x35 || SubHead.UnpVer>PACK_VER) - { -#ifndef SHELL_EXT - Log(FileName,St(MSubHeadUnknown)); -#endif - return(false); - } - - if (SubHead.PackSize==0 && (SubHead.Flags & LHD_SPLIT_AFTER)==0) - return(true); - - SubDataIO.Init(); - Unpack Unpack(&SubDataIO); - Unpack.Init(); - - if (DestFile==NULL) - { - UnpData->Alloc(SubHead.UnpSize); - SubDataIO.SetUnpackToMemory(&(*UnpData)[0],SubHead.UnpSize); - } - if (SubHead.Flags & LHD_PASSWORD) - { - if (*Cmd->Password) - SubDataIO.SetEncryption(SubHead.UnpVer,Cmd->Password, - (SubHead.Flags & LHD_SALT) ? SubHead.Salt:NULL,false); - else - return(false); - } - SubDataIO.SetPackedSizeToRead(SubHead.PackSize); - SubDataIO.EnableShowProgress(false); - SubDataIO.SetFiles(this,DestFile); - SubDataIO.UnpVolume=(SubHead.Flags & LHD_SPLIT_AFTER); - SubDataIO.SetSubHeader(&SubHead,NULL); - Unpack.SetDestSize(SubHead.UnpSize); - if (SubHead.Method==0x30) - CmdExtract::UnstoreFile(SubDataIO,SubHead.UnpSize); - else - Unpack.DoUnpack(SubHead.UnpVer,false); - - if (SubHead.FileCRC!=~SubDataIO.UnpFileCRC) - { -#ifndef SHELL_EXT - Log(FileName,St(MSubHeadDataCRC),SubHead.FileName); -#endif - ErrHandler.SetErrorCode(CRC_ERROR); - if (UnpData!=NULL) - UnpData->Reset(); - return(false); - } - return(true); -} -#endif diff --git a/lib/UnrarXLib/array.hpp b/lib/UnrarXLib/array.hpp deleted file mode 100644 index 3afec70c13..0000000000 --- a/lib/UnrarXLib/array.hpp +++ /dev/null @@ -1,121 +0,0 @@ -#ifndef _RAR_ARRAY_ -#define _RAR_ARRAY_ - -extern ErrorHandler ErrHandler; - -template <class T> class Array -{ - private: - T *Buffer; - int BufSize; - int AllocSize; - public: - Array(); - Array(int Size); - ~Array(); - inline void CleanData(); - inline T& operator [](int Item); - inline int Size(); - void Add(int Items); - void Alloc(int Items); - void Reset(); - void operator = (Array<T> &Src); - void Push(T Item); -}; - -template <class T> void Array<T>::CleanData() -{ - Buffer=NULL; - BufSize=0; - AllocSize=0; -} - - -template <class T> Array<T>::Array() -{ - CleanData(); -} - - -template <class T> Array<T>::Array(int Size) -{ - Buffer=(T *)rarmalloc(sizeof(T)*Size); - if (Buffer==NULL && Size!=0) - ErrHandler.MemoryError(); - - AllocSize=BufSize=Size; -} - - -template <class T> Array<T>::~Array() -{ - if (Buffer!=NULL) - rarfree(Buffer); -} - - -template <class T> inline T& Array<T>::operator [](int Item) -{ - return(Buffer[Item]); -} - - -template <class T> inline int Array<T>::Size() -{ - return(BufSize); -} - - -template <class T> void Array<T>::Add(int Items) -{ - BufSize+=Items; - if (BufSize>AllocSize) - { - int Suggested=AllocSize+AllocSize/4+32; - int NewSize=Max(BufSize,Suggested); - - Buffer=(T *)rarrealloc(Buffer,NewSize*sizeof(T)); - if (Buffer==NULL) - ErrHandler.MemoryError(); - AllocSize=NewSize; - } -} - - -template <class T> void Array<T>::Alloc(int Items) -{ - if (Items>AllocSize) - Add(Items-BufSize); - else - BufSize=Items; -} - - -template <class T> void Array<T>::Reset() -{ - if (Buffer!=NULL) - { - rarfree(Buffer); - Buffer=NULL; - } - BufSize=0; - AllocSize=0; -} - - -template <class T> void Array<T>::operator =(Array<T> &Src) -{ - Reset(); - Alloc(Src.BufSize); - if (Src.BufSize!=0) - memcpy((void *)Buffer,(void *)Src.Buffer,Src.BufSize*sizeof(T)); -} - - -template <class T> void Array<T>::Push(T Item) -{ - Add(1); - (*this)[Size()-1]=Item; -} - -#endif diff --git a/lib/UnrarXLib/cmddata.cpp b/lib/UnrarXLib/cmddata.cpp deleted file mode 100644 index 2d338a1660..0000000000 --- a/lib/UnrarXLib/cmddata.cpp +++ /dev/null @@ -1,1148 +0,0 @@ -#include "rar.hpp" - -CommandData::CommandData() -{ - FileArgs=ExclArgs=InclArgs=StoreArgs=ArcNames=NULL; - Init(); -} - - -CommandData::~CommandData() -{ - Close(); -} - - -void CommandData::Init() -{ - Close(); - - *Command=0; - *ArcName=0; - *ArcNameW=0; - FileLists=false; - NoMoreSwitches=false; - TimeConverted=false; - - FileArgs=new StringList; - ExclArgs=new StringList; - InclArgs=new StringList; - StoreArgs=new StringList; - ArcNames=new StringList; -} - - -void CommandData::Close() -{ - delete FileArgs; - delete ExclArgs; - delete InclArgs; - delete StoreArgs; - delete ArcNames; - FileArgs=ExclArgs=InclArgs=StoreArgs=ArcNames=NULL; - NextVolSizes.Reset(); -} - - -#if !defined(SFX_MODULE) && !defined(_WIN_CE) -void CommandData::ParseArg(char *Arg,wchar *ArgW) -{ - if (IsSwitch(*Arg) && !NoMoreSwitches) - if (Arg[1]=='-') - NoMoreSwitches=true; - else - ProcessSwitch(&Arg[1]); - else - if (*Command==0) - { - strncpy(Command,Arg,sizeof(Command)); - if (ArgW!=NULL) - strncpyw(CommandW,ArgW,sizeof(CommandW)/sizeof(CommandW[0])); - if (toupper(*Command)=='S') - { - const char *SFXName=Command[1] ? Command+1:DefSFXName; - if (PointToName(SFXName)!=SFXName || FileExist(SFXName)) - strcpy(SFXModule,SFXName); - else - GetConfigName(SFXName,SFXModule,true); - } -#ifndef GUI - *Command=toupper(*Command); - if (*Command!='I' && *Command!='S') - strupper(Command); -#endif - } - else - if (*ArcName==0) - { - strncpy(ArcName,Arg,sizeof(ArcName)); - if (ArgW!=NULL) - strncpyw(ArcNameW,ArgW,sizeof(ArcNameW)/sizeof(ArcNameW[0])); - } - else - { - int Length=strlen(Arg); - char EndChar=Arg[Length-1]; - char CmdChar=toupper(*Command); - bool Add=strchr("AFUM",CmdChar)!=NULL; - bool Extract=CmdChar=='X' || CmdChar=='E'; - if ((IsDriveDiv(EndChar) || IsPathDiv(EndChar)) && !Add) - strcpy(ExtrPath,Arg); - else - if ((Add || CmdChar=='T') && *Arg!='@') - FileArgs->AddString(Arg); - else - { - struct FindData FileData; - bool Found=FindFile::FastFind(Arg,NULL,&FileData); - if (!Found && *Arg=='@' && !IsWildcard(Arg)) - { - ReadTextFile(Arg+1,FileArgs,false,true,true,true,true); - FileLists=true; - } - else - if (Found && FileData.IsDir && Extract && *ExtrPath==0) - { - strcpy(ExtrPath,Arg); - AddEndSlash(ExtrPath); - } - else - FileArgs->AddString(Arg); - } - } -} -#endif - - -void CommandData::ParseDone() -{ - if (FileArgs->ItemsCount()==0 && !FileLists) - FileArgs->AddString(MASKALL); - char CmdChar=toupper(*Command); - bool Extract=CmdChar=='X' || CmdChar=='E'; - if (Test && Extract) - Test=false; - BareOutput=(CmdChar=='L' || CmdChar=='V') && Command[1]=='B'; -} - - -#if !defined(SFX_MODULE) && !defined(_WIN_CE) && !defined(TARGET_POSIX) -void CommandData::ParseEnvVar() -{ - char *EnvStr=getenv("RAR"); - if (EnvStr!=NULL) - ProcessSwitchesString(EnvStr); -} -#endif - - -#if !defined(GUI) && !defined(SFX_MODULE) -bool CommandData::IsConfigEnabled(int argc,char *argv[]) -{ - bool ConfigEnabled=true; - for (int I=1;I<argc;I++) - if (IsSwitch(*argv[I])) - { - if (stricomp(&argv[I][1],"cfg-")==0) - ConfigEnabled=false; - if (strnicomp(&argv[I][1],"ilog",4)==0) - { - ProcessSwitch(&argv[I][1]); - InitLogOptions(LogName); - } - } - return(ConfigEnabled);} -#endif - - -#if !defined(GUI) && !defined(SFX_MODULE) -void CommandData::ReadConfig(int argc,char *argv[]) -{ - StringList List; - if (ReadTextFile((char*)DefConfigName,&List,true)) - { - char *Str; - while ((Str=List.GetString())!=NULL) - if (strnicomp(Str,"switches=",9)==0) - ProcessSwitchesString(Str+9); - } -} -#endif - - -#if !defined(SFX_MODULE) && !defined(_WIN_CE) -void CommandData::ProcessSwitchesString(char *Str) -{ - while (*Str) - { - while (!IsSwitch(*Str) && *Str!=0) - Str++; - if (*Str==0) - break; - char *Next=Str; - while (!(Next[0]==' ' && IsSwitch(Next[1])) && *Next!=0) - Next++; - char NextChar=*Next; - *Next=0; - ProcessSwitch(Str+1); - *Next=NextChar; - Str=Next; - } -} -#endif - - -#if !defined(SFX_MODULE) && !defined(_WIN_CE) -void CommandData::ProcessSwitch(char *Switch) -{ - - switch(toupper(Switch[0])) - { - case 'I': - if (strnicomp(&Switch[1],"LOG",3)==0) - { - strncpy(LogName,Switch[4] ? Switch+4:DefLogName,sizeof(LogName)); - break; - } - if (stricomp(&Switch[1],"SND")==0) - { - Sound=true; - break; - } - if (stricomp(&Switch[1],"ERR")==0) - { - MsgStream=MSG_STDERR; - break; - } - if (strnicomp(&Switch[1],"EML",3)==0) - { - strncpy(EmailTo,Switch[4] ? Switch+4:"@",sizeof(EmailTo)); - EmailTo[sizeof(EmailTo)-1]=0; - break; - } - if (stricomp(&Switch[1],"NUL")==0) - { - MsgStream=MSG_NULL; - break; - } - if (toupper(Switch[1])=='D') - { - for (int I=2;Switch[I]!=0;I++) - switch(toupper(Switch[I])) - { - case 'Q': - MsgStream=MSG_ERRONLY; - break; - case 'C': - DisableCopyright=true; - break; - case 'D': - DisableDone=true; - break; - case 'P': - DisablePercentage=true; - break; - } - break; - } - if (stricomp(&Switch[1],"OFF")==0) - { - Shutdown=true; - break; - } - break; - case 'T': - switch(toupper(Switch[1])) - { - case 'K': - ArcTime=ARCTIME_KEEP; - break; - case 'L': - ArcTime=ARCTIME_LATEST; - break; - case 'O': - FileTimeBefore.SetAgeText(Switch+2); - break; - case 'N': - FileTimeAfter.SetAgeText(Switch+2); - break; - case 'B': - FileTimeBefore.SetIsoText(Switch+2); - break; - case 'A': - FileTimeAfter.SetIsoText(Switch+2); - break; - case 'S': - { - EXTTIME_MODE Mode=EXTTIME_HIGH3; - bool CommonMode=Switch[2]>='0' && Switch[2]<='4'; - if (CommonMode) - Mode=(EXTTIME_MODE)(Switch[2]-'0'); - if (Switch[2]=='-') - Mode=EXTTIME_NONE; - if (CommonMode || Switch[2]=='-' || Switch[2]=='+' || Switch[2]==0) - xmtime=xctime=xatime=Mode; - else - { - if (Switch[3]>='0' && Switch[3]<='4') - Mode=(EXTTIME_MODE)(Switch[3]-'0'); - if (Switch[3]=='-') - Mode=EXTTIME_NONE; - switch(toupper(Switch[2])) - { - case 'M': - xmtime=Mode; - break; - case 'C': - xctime=Mode; - break; - case 'A': - xatime=Mode; - break; - case 'R': - xarctime=Mode; - break; - } - } - } - break; - case '-': - Test=false; - break; - case 0: - Test=true; - break; - default: - BadSwitch(Switch); - break; - } - break; - case 'A': - switch(toupper(Switch[1])) - { - case 'C': - ClearArc=true; - break; - case 'D': - AppendArcNameToPath=true; - break; - case 'G': - if (Switch[2]=='-' && Switch[3]==0) - GenerateArcName=0; - else - { - GenerateArcName=true; - strncpy(GenerateMask,Switch+2,sizeof(GenerateMask)); - } - break; - case 'N': //reserved for archive name - break; - case 'O': - AddArcOnly=true; - break; - case 'P': - strcpy(ArcPath,Switch+2); - break; - case 'S': - SyncFiles=true; - break; - } - break; - case 'D': - if (Switch[2]==0) - switch(toupper(Switch[1])) - { - case 'S': - DisableSortSolid=true; - break; - case 'H': - OpenShared=true; - break; - case 'F': - DeleteFiles=true; - break; - } - break; - case 'O': - switch(toupper(Switch[1])) - { - case '+': - Overwrite=OVERWRITE_ALL; - break; - case '-': - Overwrite=OVERWRITE_NONE; - break; - case 'W': - ProcessOwners=true; - break; -#ifdef SAVE_LINKS - case 'L': - SaveLinks=true; - break; -#endif -#ifdef _WIN_32 - case 'S': - SaveStreams=true; - break; - case 'C': - SetCompressedAttr=true; - break; -#endif - default : - BadSwitch(Switch); - break; - } - break; - case 'R': - switch(toupper(Switch[1])) - { - case 0: - Recurse=RECURSE_ALWAYS; - break; - case '-': - Recurse=0; - break; - case '0': - Recurse=RECURSE_WILDCARDS; - break; - case 'I': - { - Priority=atoi(Switch+2); - char *ChPtr=strchr(Switch+2,':'); - if (ChPtr!=NULL) - { - SleepTime=atoi(ChPtr+1); - InitSystemOptions(SleepTime); - } - SetPriority(Priority); - } - break; - } - break; - case 'Y': - AllYes=true; - break; - case 'N': - case 'X': - if (Switch[1]!=0) - { - StringList *Args=toupper(Switch[0])=='N' ? InclArgs:ExclArgs; - if (Switch[1]=='@' && !IsWildcard(Switch)) - ReadTextFile(Switch+2,Args,false,true,true,true,true); - else - Args->AddString(Switch+1); - } - break; - case 'E': - switch(toupper(Switch[1])) - { - case 'P': - switch(Switch[2]) - { - case 0: - ExclPath=EXCL_SKIPWHOLEPATH; - break; - case '1': - ExclPath=EXCL_BASEPATH; - break; - case '2': - ExclPath=EXCL_SAVEFULLPATH; - break; - case '3': - ExclPath=EXCL_ABSPATH; - break; - } - break; - case 'D': - ExclEmptyDir=true; - break; - case 'E': - ProcessEA=false; - break; - case 'N': - NoEndBlock=true; - break; - default: - if (Switch[1]=='+') - { - InclFileAttr=GetExclAttr(&Switch[2]); - InclAttrSet=true; - } - else - ExclFileAttr=GetExclAttr(&Switch[1]); - break; - } - break; - case 'P': - if (Switch[1]==0) - { - GetPassword(PASSWORD_GLOBAL,NULL,Password,sizeof(Password)); - eprintf("\n"); - } - else - strncpy(Password,Switch+1,sizeof(Password)); - break; - case 'H': - if (toupper(Switch[1])=='P') - { - EncryptHeaders=true; - if (Switch[2]!=0) - strncpy(Password,Switch+2,sizeof(Password)); - else - if (*Password==0) - { - GetPassword(PASSWORD_GLOBAL,NULL,Password,sizeof(Password)); - eprintf("\n"); - } - } - break; - case 'Z': - strncpy(CommentFile,Switch[1]!=0 ? Switch+1:"stdin",sizeof(CommentFile)); - break; - case 'M': - switch(toupper(Switch[1])) - { - case 'C': - { - char *Str=Switch+2; - if (*Str=='-') - for (unsigned int I=0;I<sizeof(FilterModes)/sizeof(FilterModes[0]);I++) - FilterModes[I].State=FILTER_DISABLE; - else - while (*Str) - { - int Param1=0,Param2=0; - FilterState State=FILTER_AUTO; - FilterType Type=FILTER_NONE; - if (isdigit(*Str)) - { - Param1=atoi(Str); - while (isdigit(*Str)) - Str++; - } - if (*Str==':' && isdigit(Str[1])) - { - Param2=atoi(++Str); - while (isdigit(*Str)) - Str++; - } - switch(toupper(*(Str++))) - { - case 'T': Type=FILTER_PPM; break; - case 'E': Type=FILTER_E8; break; - case 'D': Type=FILTER_DELTA; break; - case 'A': Type=FILTER_AUDIO; break; - case 'C': Type=FILTER_RGB; break; - case 'I': Type=FILTER_ITANIUM; break; - case 'L': Type=FILTER_UPCASETOLOW; break; - } - if (*Str=='+' || *Str=='-') - State=*(Str++)=='+' ? FILTER_FORCE:FILTER_DISABLE; - FilterModes[Type].State=State; - FilterModes[Type].Param1=Param1; - FilterModes[Type].Param2=Param2; - } - } - break; - case 'M': - break; - case 'D': - { - if ((WinSize=atoi(&Switch[2]))==0) - WinSize=0x10000<<(toupper(Switch[2])-'A'); - else - WinSize*=1024; - if (!CheckWinSize()) - BadSwitch(Switch); - } - break; - case 'S': - { - char *Names=Switch+2,DefNames[512]; - if (*Names==0) - { - strcpy(DefNames,DefaultStoreList); - Names=DefNames; - } - while (*Names!=0) - { - char *End=strchr(Names,';'); - if (End!=NULL) - *End=0; - if (*Names=='.') - Names++; - char Mask[NM]; - if (strpbrk(Names,"*?.")==NULL) - sprintf(Mask,"*.%s",Names); - else - strcpy(Mask,Names); - StoreArgs->AddString(Mask); - if (End==NULL) - break; - Names=End+1; - } - } - break; - default: - Method=Switch[1]-'0'; - if (Method>5 || Method<0) - BadSwitch(Switch); - break; - } - break; - case 'V': - switch(toupper(Switch[1])) - { -#ifdef _WIN_32 - case 'D': - EraseDisk=true; - break; -#endif - case 'N': - OldNumbering=true; - break; - case 'P': - VolumePause=true; - break; - case 'E': - if (toupper(Switch[2])=='R') - VersionControl=atoi(Switch+3)+1; - break; - case '-': - VolSize=0; - break; - default: - { - Int64 NewVolSize=atoil(&Switch[1]); - - if (NewVolSize==0) - NewVolSize=INT64ERR; - else - switch (Switch[strlen(Switch)-1]) - { - case 'f': - case 'F': - switch(int64to32(NewVolSize)) - { - case 360: - NewVolSize=362496; - break; - case 720: - NewVolSize=730112; - break; - case 1200: - NewVolSize=1213952; - break; - case 1440: - NewVolSize=1457664; - break; - case 2880: - NewVolSize=2915328; - break; - } - break; - case 'k': - NewVolSize*=1024; - break; - case 'm': - NewVolSize*=1024*1024; - break; - case 'M': - NewVolSize*=1000*1000; - break; - case 'g': - NewVolSize*=1024*1024; - NewVolSize*=1024; - break; - case 'G': - NewVolSize*=1000*1000; - NewVolSize*=1000; - break; - case 'b': - case 'B': - break; - default: - NewVolSize*=1000; - break; - } - if (VolSize==0) - VolSize=NewVolSize; - else - NextVolSizes.Push(NewVolSize); - } - break; - } - break; - case 'F': - if (Switch[1]==0) - FreshFiles=true; - break; - case 'U': - if (Switch[1]==0) - UpdateFiles=true; - break; - case 'W': - strncpy(TempPath,&Switch[1],sizeof(TempPath)-1); - AddEndSlash(TempPath); - break; - case 'S': - if (strnicomp(Switch,"SFX",3)==0) - { - const char *SFXName=Switch[3] ? Switch+3:DefSFXName; - if (PointToName(SFXName)!=SFXName || FileExist(SFXName)) - strcpy(SFXModule,SFXName); - else - GetConfigName(SFXName,SFXModule,true); - } - if (isdigit(Switch[1])) - { - Solid|=SOLID_COUNT; - SolidCount=atoi(&Switch[1]); - } - else - switch(toupper(Switch[1])) - { - case 0: - Solid|=SOLID_NORMAL; - break; - case '-': - Solid=SOLID_NONE; - break; - case 'E': - Solid|=SOLID_FILEEXT; - break; - case 'V': - Solid|=Switch[2]=='-' ? SOLID_VOLUME_DEPENDENT:SOLID_VOLUME_INDEPENDENT; - break; - case 'D': - Solid|=SOLID_VOLUME_DEPENDENT; - break; - } - break; - case 'C': - if (Switch[2]==0) - switch(toupper(Switch[1])) - { - case '-': - DisableComment=true; - break; - case 'U': - ConvertNames=NAMES_UPPERCASE; - break; - case 'L': - ConvertNames=NAMES_LOWERCASE; - break; - } - break; - case 'K': - switch(toupper(Switch[1])) - { - case 'B': - KeepBroken=true; - break; - case 0: - Lock=true; - break; - } - break; -#ifndef GUI - case '?' : - OutHelp(); - break; -#endif - default : - BadSwitch(Switch); - break; - } -} -#endif - - -#if !defined(SFX_MODULE) && !defined(_WIN_CE) -void CommandData::BadSwitch(char *Switch) -{ - mprintf(St(MUnknownOption),Switch); - ErrHandler.Exit(USER_ERROR); -} -#endif - - -#ifndef GUI -void CommandData::OutTitle() -{ - if (BareOutput || DisableCopyright) - return; -#if defined(__GNUC__) && defined(SFX_MODULE) - mprintf(St(MCopyrightS)); -#else -#ifndef SILENT - static bool TitleShown=false; - if (TitleShown) - return; - TitleShown=true; - char Version[50]; - int Beta=RARVER_BETA; - if (Beta!=0) - sprintf(Version,"%d.%02d %s %d",RARVER_MAJOR,RARVER_MINOR,St(MBeta),RARVER_BETA); - else - sprintf(Version,"%d.%02d",RARVER_MAJOR,RARVER_MINOR); -#ifdef UNRAR - mprintf(St(MUCopyright),Version,RARVER_YEAR); -#else -#endif -#endif -#endif -} -#endif - - -void CommandData::OutHelp() -{ -#if !defined(GUI) && !defined(SILENT) - OutTitle(); - static MSGID Help[]={ -#ifdef SFX_MODULE - MCHelpCmd,MSHelpCmdE,MSHelpCmdT,MSHelpCmdV -#elif defined(UNRAR) - MUNRARTitle1,MRARTitle2,MCHelpCmd,MCHelpCmdE,MCHelpCmdL,MCHelpCmdP, - MCHelpCmdT,MCHelpCmdV,MCHelpCmdX,MCHelpSw,MCHelpSwm,MCHelpSwAC,MCHelpSwAD, - MCHelpSwAP,MCHelpSwAVm,MCHelpSwCm,MCHelpSwCFGm,MCHelpSwCL,MCHelpSwCU, - MCHelpSwDH,MCHelpSwEP,MCHelpSwEP3,MCHelpSwF,MCHelpSwIDP,MCHelpSwIERR, - MCHelpSwINUL,MCHelpSwIOFF,MCHelpSwKB,MCHelpSwN,MCHelpSwNa,MCHelpSwNal, - MCHelpSwOp,MCHelpSwOm,MCHelpSwOC,MCHelpSwOW,MCHelpSwP,MCHelpSwPm, - MCHelpSwR,MCHelpSwRI,MCHelpSwTA,MCHelpSwTB,MCHelpSwTN,MCHelpSwTO, - MCHelpSwTS,MCHelpSwU,MCHelpSwVUnr,MCHelpSwVER,MCHelpSwVP,MCHelpSwX, - MCHelpSwXa,MCHelpSwXal,MCHelpSwY -#else - MRARTitle1,MRARTitle2,MCHelpCmd,MCHelpCmdA,MCHelpCmdC,MCHelpCmdCF, - MCHelpCmdCW,MCHelpCmdD,MCHelpCmdE,MCHelpCmdF,MCHelpCmdI,MCHelpCmdK, - MCHelpCmdL,MCHelpCmdM,MCHelpCmdP,MCHelpCmdR,MCHelpCmdRC,MCHelpCmdRN, - MCHelpCmdRR,MCHelpCmdRV,MCHelpCmdS,MCHelpCmdT,MCHelpCmdU,MCHelpCmdV, - MCHelpCmdX,MCHelpSw,MCHelpSwm,MCHelpSwAC,MCHelpSwAD,MCHelpSwAG, - MCHelpSwAO,MCHelpSwAP,MCHelpSwAS,MCHelpSwAV,MCHelpSwAVm,MCHelpSwCm, - MCHelpSwCFGm,MCHelpSwCL,MCHelpSwCU,MCHelpSwDF,MCHelpSwDH,MCHelpSwDS, - MCHelpSwEa,MCHelpSwED,MCHelpSwEE,MCHelpSwEN,MCHelpSwEP,MCHelpSwEP1, - MCHelpSwEP2,MCHelpSwEP3,MCHelpSwF,MCHelpSwHP,MCHelpSwIDP,MCHelpSwIEML, - MCHelpSwIERR,MCHelpSwILOG,MCHelpSwINUL,MCHelpSwIOFF,MCHelpSwISND, - MCHelpSwK,MCHelpSwKB,MCHelpSwMn,MCHelpSwMC,MCHelpSwMD,MCHelpSwMS, - MCHelpSwN,MCHelpSwNa,MCHelpSwNal,MCHelpSwOp,MCHelpSwOm,MCHelpSwOC, - MCHelpSwOL,MCHelpSwOS,MCHelpSwOW,MCHelpSwP,MCHelpSwPm,MCHelpSwR, - MCHelpSwR0,MCHelpSwRI,MCHelpSwRR,MCHelpSwRV,MCHelpSwS,MCHelpSwSm, - MCHelpSwSFX,MCHelpSwSI,MCHelpSwT,MCHelpSwTA,MCHelpSwTB,MCHelpSwTK, - MCHelpSwTL,MCHelpSwTN,MCHelpSwTO,MCHelpSwTS,MCHelpSwU,MCHelpSwV, - MCHelpSwVn,MCHelpSwVD,MCHelpSwVER,MCHelpSwVN,MCHelpSwVP,MCHelpSwW, - MCHelpSwX,MCHelpSwXa,MCHelpSwXal,MCHelpSwY,MCHelpSwZ -#endif - }; - - for (int I=0;I<sizeof(Help)/sizeof(Help[0]);I++) - { -#ifndef SFX_MODULE -#ifdef DISABLEAUTODETECT - if (Help[I]==MCHelpSwV) - continue; -#endif -#ifndef _WIN_32 - static MSGID Win32Only[]={ - MCHelpSwIEML,MCHelpSwVD,MCHelpSwAC,MCHelpSwAO,MCHelpSwOS,MCHelpSwIOFF, - MCHelpSwEP2,MCHelpSwOC - }; - bool Found=false; - for (int J=0;J<sizeof(Win32Only)/sizeof(Win32Only[0]);J++) - if (Help[I]==Win32Only[J]) - { - Found=true; - break; - } - if (Found) continue; -#endif -#if !defined(_UNIX) && !defined(_WIN_32) - if (Help[I]==MCHelpSwOW) - continue; -#endif -#ifndef SAVE_LINKS - if (Help[I]==MCHelpSwOL) - continue; -#endif -#if defined(_WIN_32) - if (Help[I]==MCHelpSwRI) - continue; -#endif -#if !defined(_BEOS) - if (Help[I]==MCHelpSwEE) - { -#if defined(_EMX) && !defined(_DJGPP) - if (_osmode != OS2_MODE) - continue; -#else - continue; -#endif - } -#endif -#endif - mprintf(St(Help[I])); - } - mprintf("\n"); - ErrHandler.Exit(0); -#endif -} - - -bool CommandData::ExclCheckArgs(StringList *Args,char *CheckName,bool CheckFullPath,int MatchMode) -{ - char *Name=ConvertPath(CheckName,NULL); - char FullName[NM],*CurName; - *FullName=0; - Args->Rewind(); - while ((CurName=Args->GetString())!=NULL) -#ifndef SFX_MODULE - if (CheckFullPath && IsFullPath(CurName)) - { - if (*FullName==0) - ConvertNameToFull(CheckName,FullName); - if (CmpName(CurName,FullName,MatchMode)) - return(true); - } - else -#endif - if (CmpName(ConvertPath(CurName,NULL),Name,MatchMode)) - return(true); - return(false); -} - - -bool CommandData::ExclCheck(char *CheckName,bool CheckFullPath) -{ - if (ExclCheckArgs(ExclArgs,CheckName,CheckFullPath,MATCH_WILDSUBPATH)) - return(true); - if (InclArgs->ItemsCount()==0) - return(false); - if (ExclCheckArgs(InclArgs,CheckName,CheckFullPath,MATCH_NAMES)) - return(false); - return(true); -} - - - - -#ifndef SFX_MODULE -bool CommandData::TimeCheck(RarTime &ft) -{ - if (FileTimeBefore.IsSet() && ft>=FileTimeBefore) - return(true); - if (FileTimeAfter.IsSet() && ft<=FileTimeAfter) - return(true); -/* - if (FileTimeOlder!=0 || FileTimeNewer!=0) - { - if (!TimeConverted) - { - if (FileTimeOlder!=0) - FileTimeOlder=SecondsToDosTime(FileTimeOlder); - if (FileTimeNewer!=0) - FileTimeNewer=SecondsToDosTime(FileTimeNewer); - TimeConverted=true; - } - if (FileTimeOlder!=0 && ft>=FileTimeOlder) - return(true); - if (FileTimeNewer!=0 && ft<=FileTimeNewer) - return(true); - - } -*/ - return(false); -} -#endif - - -int CommandData::IsProcessFile(FileHeader &NewLhd,bool *ExactMatch,int MatchType) -{ - if (strlen(NewLhd.FileName)>=NM || strlenw(NewLhd.FileNameW)>=NM) - return(0); - if (ExclCheck(NewLhd.FileName,false)) - return(0); -#ifndef SFX_MODULE - if (TimeCheck(NewLhd.mtime)) - return(0); -#endif - char *ArgName; - wchar *ArgNameW; - FileArgs->Rewind(); - for (int StringCount=1;FileArgs->GetString(&ArgName,&ArgNameW);StringCount++) - { -#ifndef SFX_MODULE - bool Unicode=(NewLhd.Flags & LHD_UNICODE) || ArgNameW!=NULL; - if (Unicode) - { - wchar NameW[NM],ArgW[NM],*NamePtr=NewLhd.FileNameW; - bool CorrectUnicode=true; - if (ArgNameW==NULL) - { - if (!CharToWide(ArgName,ArgW) || *ArgW==0) - CorrectUnicode=false; - ArgNameW=ArgW; - } - if ((NewLhd.Flags & LHD_UNICODE)==0) - { - if (!CharToWide(NewLhd.FileName,NameW) || *NameW==0) - CorrectUnicode=false; - NamePtr=NameW; - } - if (CmpName(ArgNameW,NamePtr,MatchType)) - { - if (ExactMatch!=NULL) - *ExactMatch=stricompcw(ArgNameW,NamePtr)==0; - return(StringCount); - } - if (CorrectUnicode) - continue; - } -#endif - if (CmpName(ArgName,NewLhd.FileName,MatchType)) - { - if (ExactMatch!=NULL) - *ExactMatch=stricompc(ArgName,NewLhd.FileName)==0; - return(StringCount); - } - } - return(0); -} - - -#ifndef _WIN_CE -void CommandData::ProcessCommand() -{ -#ifndef SFX_MODULE - if ((Command[1] && (strchr("FUADPXETK",*Command)!=NULL)) || *ArcName==0) - OutHelp(); - -#ifdef _UNIX - if (GetExt(ArcName)==NULL && (!FileExist(ArcName) || IsDir(GetFileAttr(ArcName)))) - strcat(ArcName,".rar"); -#else - if (GetExt(ArcName)==NULL) - strcat(ArcName,".rar"); -#endif - - if (strchr("AFUMD",*Command)==NULL) - { - StringList ArcMasks; - ArcMasks.AddString(ArcName); - ScanTree Scan(&ArcMasks,Recurse,SaveLinks,SCAN_SKIPDIRS); - FindData FindData; - while (Scan.GetNext(&FindData)==SCAN_SUCCESS) - AddArcName(FindData.Name,FindData.NameW); - } - else - AddArcName(ArcName,NULL); -#endif - - switch(Command[0]) - { - case 'P': - case 'X': - case 'E': - case 'T': - case 'I': - { - CmdExtract Extract; - Extract.DoExtract(this); - } - break; -#if !defined(GUI) && !defined(SILENT) - case 'V': - case 'L': - ListArchive(this); - break; - default: - OutHelp(); -#endif - } -#ifndef GUI - if (!BareOutput) - { - mprintf("\n"); - } -#endif -} -#endif - - -void CommandData::AddArcName(char *Name,wchar *NameW) -{ - ArcNames->AddString(Name,NameW); -} - - -bool CommandData::GetArcName(char *Name,wchar *NameW,int MaxSize) -{ - if (!ArcNames->GetString(Name,NameW,NM)) - return(false); - return(true); -} - - -bool CommandData::IsSwitch(int Ch) -{ -#if defined(_WIN_32) || defined(_EMX) - return(Ch=='-' || Ch=='/'); -#else - return(Ch=='-'); -#endif -} - - -#ifndef SFX_MODULE -uint CommandData::GetExclAttr(char *Str) -{ - if (isdigit(*Str)) - return(strtol(Str,NULL,0)); - else - { - uint Attr; - for (Attr=0;*Str;Str++) - switch(toupper(*Str)) - { -#ifdef _UNIX - case 'D': - Attr|=S_IFDIR; - break; - case 'V': - Attr|=S_IFCHR; - break; -#elif defined(_WIN_32) || defined(_EMX) - case 'R': - Attr|=0x1; - break; - case 'H': - Attr|=0x2; - break; - case 'S': - Attr|=0x4; - break; - case 'D': - Attr|=0x10; - break; - case 'A': - Attr|=0x20; - break; -#endif - } - return(Attr); - } -} -#endif - -#ifndef SFX_MODULE -bool CommandData::CheckWinSize() -{ - static unsigned int ValidSize[]={ - 0x10000,0x20000,0x40000,0x80000,0x100000,0x200000,0x400000 - }; - for (unsigned int I=0;I<sizeof(ValidSize)/sizeof(ValidSize[0]);I++) - if (WinSize==ValidSize[I]) - return(true); - WinSize=0x400000; - return(false); -} -#endif diff --git a/lib/UnrarXLib/cmddata.hpp b/lib/UnrarXLib/cmddata.hpp deleted file mode 100644 index 08b92c116a..0000000000 --- a/lib/UnrarXLib/cmddata.hpp +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef _RAR_CMDDATA_ -#define _RAR_CMDDATA_ - -#define DefaultStoreList "ace;arj;bz2;cab;gz;jpeg;jpg;lha;lzh;mp3;rar;zip;taz;tgz;z" - -class CommandData:public RAROptions -{ - private: - void ProcessSwitchesString(char *Str); - void ProcessSwitch(char *Switch); - void BadSwitch(char *Switch); - bool ExclCheckArgs(StringList *Args,char *CheckName,bool CheckFullPath,int MatchMode); - uint GetExclAttr(char *Str); - - bool FileLists; - bool NoMoreSwitches; - bool TimeConverted; - bool BareOutput; - public: - CommandData(); - ~CommandData(); - void Init(); - void Close(); - void ParseArg(char *Arg,wchar *ArgW); - void ParseDone(); - void ParseEnvVar(); - void ReadConfig(int argc,char *argv[]); - bool IsConfigEnabled(int argc,char *argv[]); - void OutTitle(); - void OutHelp(); - bool IsSwitch(int Ch); - bool ExclCheck(char *CheckName,bool CheckFullPath); - bool StoreCheck(char *CheckName); - bool TimeCheck(RarTime &ft); - int IsProcessFile(FileHeader &NewLhd,bool *ExactMatch=NULL,int MatchType=MATCH_WILDSUBPATH); - void ProcessCommand(); - void AddArcName(char *Name,wchar *NameW); - bool GetArcName(char *Name,wchar *NameW,int MaxSize); - bool CheckWinSize(); - - int GetRecoverySize(char *Str,int DefSize); - - char Command[NM+16]; - wchar CommandW[NM+16]; - - char ArcName[NM]; - wchar ArcNameW[NM]; - - StringList *FileArgs; - StringList *ExclArgs; - StringList *InclArgs; - StringList *ArcNames; - StringList *StoreArgs; -}; - -#endif diff --git a/lib/UnrarXLib/coder.cpp b/lib/UnrarXLib/coder.cpp deleted file mode 100644 index d556f0e18c..0000000000 --- a/lib/UnrarXLib/coder.cpp +++ /dev/null @@ -1,47 +0,0 @@ - - -inline unsigned int RangeCoder::GetChar() -{ - return(UnpackRead->GetChar()); -} - - -void RangeCoder::InitDecoder(Unpack *UnpackRead) -{ - RangeCoder::UnpackRead=UnpackRead; - - low=code=0; - range=uint(-1); - for (int i=0;i < 4;i++) - code=(code << 8) | GetChar(); -} - - -#define ARI_DEC_NORMALIZE(code,low,range,read) \ -{ \ - while ((low^(low+range))<TOP || (range<BOT && ((range=-low&(BOT-1)),1))) \ - { \ - code=(code << 8) | read->GetChar(); \ - range <<= 8; \ - low <<= 8; \ - } \ -} - - -inline int RangeCoder::GetCurrentCount() -{ - return (code-low)/(range /= SubRange.scale); -} - - -inline uint RangeCoder::GetCurrentShiftCount(uint SHIFT) -{ - return (code-low)/(range >>= SHIFT); -} - - -inline void RangeCoder::Decode() -{ - low += range*SubRange.LowCount; - range *= SubRange.HighCount-SubRange.LowCount; -} diff --git a/lib/UnrarXLib/coder.hpp b/lib/UnrarXLib/coder.hpp deleted file mode 100644 index f09f911c09..0000000000 --- a/lib/UnrarXLib/coder.hpp +++ /dev/null @@ -1,24 +0,0 @@ -/**************************************************************************** - * Contents: 'Carryless rangecoder' by Dmitry Subbotin * - ****************************************************************************/ - -const uint TOP=1 << 24, BOT=1 << 15; - -class RangeCoder -{ - public: - void InitDecoder(Unpack *UnpackRead); - inline int GetCurrentCount(); - inline uint GetCurrentShiftCount(uint SHIFT); - inline void Decode(); - inline void PutChar(unsigned int c); - inline unsigned int GetChar(); - - uint low, code, range; - struct SUBRANGE - { - uint LowCount, HighCount, scale; - } SubRange; - - Unpack *UnpackRead; -}; diff --git a/lib/UnrarXLib/compress.hpp b/lib/UnrarXLib/compress.hpp deleted file mode 100644 index 5ffcee5a79..0000000000 --- a/lib/UnrarXLib/compress.hpp +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef _RAR_COMPRESS_ -#define _RAR_COMPRESS_ - -class ComprDataIO; -class PackingFileTable; - -#define CODEBUFSIZE 0x4000 -#define MAXWINMEMSIZE 0x40000 // 256k buffer for memory reading -#define MAXWINSIZE 0x400000 -#define MAXWINMASK (MAXWINSIZE-1) - -#define LOW_DIST_REP_COUNT 16 - -#define NC 299 /* alphabet = {0, 1, 2, ..., NC - 1} */ -#define DC 60 -#define LDC 17 -#define RC 28 -#define HUFF_TABLE_SIZE (NC+DC+RC+LDC) -#define BC 20 - -#define NC20 298 /* alphabet = {0, 1, 2, ..., NC - 1} */ -#define DC20 48 -#define RC20 28 -#define BC20 19 -#define MC20 257 - -enum {CODE_HUFFMAN,CODE_LZ,CODE_LZ2,CODE_REPEATLZ,CODE_CACHELZ, - CODE_STARTFILE,CODE_ENDFILE,CODE_VM,CODE_VMDATA}; - - -enum FilterType { - FILTER_NONE, FILTER_PPM /*dummy*/, FILTER_E8, FILTER_E8E9, - FILTER_UPCASETOLOW, FILTER_AUDIO, FILTER_RGB, FILTER_DELTA, - FILTER_ITANIUM, FILTER_E8E9V2 -}; - -#endif diff --git a/lib/UnrarXLib/consio.cpp b/lib/UnrarXLib/consio.cpp deleted file mode 100644 index cf8ada1aae..0000000000 --- a/lib/UnrarXLib/consio.cpp +++ /dev/null @@ -1,300 +0,0 @@ -#if !defined(TARGET_POSIX) && !defined(_XBMC) -#include "rar.hpp" - -#ifndef GUI -#include "log.cpp" -#endif - -static void RawPrint(char *Msg,MESSAGE_TYPE MessageType); - -static MESSAGE_TYPE MsgStream=MSG_STDOUT; -static bool Sound=false; -const int MaxMsgSize=2*NM+2048; - -void InitConsoleOptions(MESSAGE_TYPE MsgStream,bool Sound) -{ - ::MsgStream=MsgStream; - ::Sound=Sound; -} - -#if !defined(GUI) && !defined(SILENT) -void mprintf(const char *fmt,...) -{ - if (MsgStream==MSG_NULL || MsgStream==MSG_ERRONLY) - return; - safebuf char Msg[MaxMsgSize]; - va_list argptr; - va_start(argptr,fmt); - vsprintf(Msg,fmt,argptr); - RawPrint(Msg,MsgStream); - va_end(argptr); -} -#endif - - -#if !defined(GUI) && !defined(SILENT) -void eprintf(const char *fmt,...) -{ - if (MsgStream==MSG_NULL) - return; - safebuf char Msg[MaxMsgSize]; - va_list argptr; - va_start(argptr,fmt); - vsprintf(Msg,fmt,argptr); - RawPrint(Msg,MSG_STDERR); - va_end(argptr); -} -#endif - - -#if !defined(GUI) && !defined(SILENT) -void RawPrint(char *Msg,MESSAGE_TYPE MessageType) -{ - File OutFile; - switch(MessageType) - { - case MSG_STDOUT: - OutFile.SetHandleType(FILE_HANDLESTD); - break; - case MSG_STDERR: - case MSG_ERRONLY: - OutFile.SetHandleType(FILE_HANDLEERR); - break; - default: - return; - } -#ifdef _WIN_32 - CharToOem(Msg,Msg); - - char OutMsg[MaxMsgSize],*OutPos=OutMsg; - for (int I=0;Msg[I]!=0;I++) - { - if (Msg[I]=='\n' && (I==0 || Msg[I-1]!='\r')) - *(OutPos++)='\r'; - *(OutPos++)=Msg[I]; - } - *OutPos=0; - strcpy(Msg,OutMsg); -#endif -#if defined(_UNIX) || defined(_EMX) - char OutMsg[MaxMsgSize],*OutPos=OutMsg; - for (int I=0;Msg[I]!=0;I++) - if (Msg[I]!='\r') - *(OutPos++)=Msg[I]; - *OutPos=0; - strcpy(Msg,OutMsg); -#endif - - OutFile.Write(Msg,strlen(Msg)); -// OutFile.Flush(); -} -#endif - - -#ifndef SILENT -void Alarm() -{ -#ifndef SFX_MODULE - if (Sound) - putchar('\007'); -#endif -} -#endif - - -#ifndef SILENT -#ifndef GUI -void GetPasswordText(char *Str,int MaxLength) -{ -#ifdef _WIN_32 - HANDLE hConIn=GetStdHandle(STD_INPUT_HANDLE); - HANDLE hConOut=GetStdHandle(STD_OUTPUT_HANDLE); - DWORD ConInMode,ConOutMode; - DWORD Read=0; - GetConsoleMode(hConIn,&ConInMode); - GetConsoleMode(hConOut,&ConOutMode); - SetConsoleMode(hConIn,ENABLE_LINE_INPUT); - SetConsoleMode(hConOut,ENABLE_PROCESSED_OUTPUT|ENABLE_WRAP_AT_EOL_OUTPUT); - ReadConsole(hConIn,Str,MaxLength-1,&Read,NULL); - Str[Read]=0; - OemToChar(Str,Str); - SetConsoleMode(hConIn,ConInMode); - SetConsoleMode(hConOut,ConOutMode); -#elif defined(_EMX) || defined(_BEOS) - fgets(Str,MaxLength-1,stdin); -#else - strncpy(Str,getpass(""),MaxLength-1); -#endif - RemoveLF(Str); -} -#endif -#endif - - -#if !defined(GUI) && !defined(SILENT) -unsigned int GetKey() -{ -#ifdef SILENT - return(0); -#else - char Str[80]; -#ifdef __GNUC__ - fgets(Str,sizeof(Str),stdin); - return(Str[0]); -#else - File SrcFile; - SrcFile.SetHandleType(FILE_HANDLESTD); - SrcFile.Read(Str,sizeof(Str)); - return(Str[0]); -#endif -#endif -} -#endif - - -#ifndef SILENT -bool GetPassword(PASSWORD_TYPE Type,const char *FileName,char *Password,int MaxLength) -{ - Alarm(); - while (true) - { - char PromptStr[256]; -#if defined(_EMX) || defined(_BEOS) - strcpy(PromptStr,St(MAskPswEcho)); -#else - strcpy(PromptStr,St(MAskPsw)); -#endif - if (Type!=PASSWORD_GLOBAL) - { - strcat(PromptStr,St(MFor)); - strcat(PromptStr,PointToName(FileName)); - } - eprintf("\n%s: ",PromptStr); - GetPasswordText(Password,MaxLength); - if (*Password==0 && Type==PASSWORD_GLOBAL) - return(false); - if (Type==PASSWORD_GLOBAL) - { - strcpy(PromptStr,St(MReAskPsw)); - eprintf(PromptStr); - char CmpStr[256]; - GetPasswordText(CmpStr,sizeof(CmpStr)); - if (*CmpStr==0 || strcmp(Password,CmpStr)!=0) - { - strcpy(PromptStr,St(MNotMatchPsw)); -/* -#ifdef _WIN_32 - CharToOem(PromptStr,PromptStr); -#endif -*/ - eprintf(PromptStr); - memset(Password,0,MaxLength); - memset(CmpStr,0,sizeof(CmpStr)); - continue; - } - memset(CmpStr,0,sizeof(CmpStr)); - } - break; - } - return(true); -} -#endif - - -#if !defined(GUI) && !defined(SILENT) -int Ask(const char *AskStr) -{ - const int MaxItems=10; - char Item[MaxItems][40]; - int ItemKeyPos[MaxItems],NumItems=0; - - for (const char *NextItem=AskStr;NextItem!=NULL;NextItem=strchr(NextItem+1,'_')) - { - char *CurItem=Item[NumItems]; - strncpy(CurItem,NextItem+1,sizeof(Item[0])); - char *EndItem=strchr(CurItem,'_'); - if (EndItem!=NULL) - *EndItem=0; - int KeyPos=0,CurKey; - while ((CurKey=CurItem[KeyPos])!=0) - { - bool Found=false; - for (int I=0;I<NumItems && !Found;I++) - if (loctoupper(Item[I][ItemKeyPos[I]])==loctoupper(CurKey)) - Found=true; - if (!Found && CurKey!=' ') - break; - KeyPos++; - } - ItemKeyPos[NumItems]=KeyPos; - NumItems++; - } - - for (int I=0;I<NumItems;I++) - { - eprintf(I==0 ? (NumItems>4 ? "\n":" "):", "); - int KeyPos=ItemKeyPos[I]; - for (int J=0;J<KeyPos;J++) - eprintf("%c",Item[I][J]); - eprintf("[%c]%s",Item[I][KeyPos],&Item[I][KeyPos+1]); - } - eprintf(" "); - int Ch=GetKey(); -#if defined(_WIN_32) - OemToCharBuff((LPCSTR)&Ch,(LPTSTR)&Ch,1); -#endif - Ch=loctoupper(Ch); - for (int I=0;I<NumItems;I++) - if (Ch==Item[I][ItemKeyPos[I]]) - return(I+1); - return(0); -} -#endif - - -int KbdAnsi(char *Addr,int Size) -{ - int RetCode=0; -#ifndef GUI - for (int I=0;I<Size;I++) - if (Addr[I]==27 && Addr[I+1]=='[') - { - for (int J=I+2;J<Size;J++) - { - if (Addr[J]=='\"') - return(2); - if (!isdigit(Addr[J]) && Addr[J]!=';') - break; - } - RetCode=1; - } -#endif - return(RetCode); -} - - -void OutComment(char *Comment,int Size) -{ -#ifndef GUI - if (KbdAnsi(Comment,Size)==2) - return; - const int MaxOutSize=0x400; - for (int I=0;I<Size;I+=MaxOutSize) - { - char Msg[MaxOutSize+1]; - int CopySize=Min(MaxOutSize,Size-I); - strncpy(Msg,Comment+I,CopySize); - Msg[CopySize]=0; - mprintf("%s",Msg); - } - mprintf("\n"); -#endif -} - -#else - -void OutComment(char *Comment,int Size) -{ -} - -#endif diff --git a/lib/UnrarXLib/consio.hpp b/lib/UnrarXLib/consio.hpp deleted file mode 100644 index 780ae7f362..0000000000 --- a/lib/UnrarXLib/consio.hpp +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef _RAR_CONSIO_ -#define _RAR_CONSIO_ - -enum {ALARM_SOUND,ERROR_SOUND,QUESTION_SOUND}; - -enum PASSWORD_TYPE {PASSWORD_GLOBAL,PASSWORD_FILE,PASSWORD_ARCHIVE}; - -void InitConsoleOptions(MESSAGE_TYPE MsgStream,bool Sound); - -#ifndef SILENT -void mprintf(const char *fmt,...); -void eprintf(const char *fmt,...); -void Alarm(); -void GetPasswordText(char *Str,int MaxLength); -unsigned int GetKey(); -bool GetPassword(PASSWORD_TYPE Type,const char *FileName,char *Password,int MaxLength); -int Ask(const char *AskStr); -#endif - -int KbdAnsi(char *Addr,int Size); -void OutComment(char *Comment,int Size); - -#ifdef SILENT -#ifdef __GNUC__ - #define mprintf(args...) - #define eprintf(args...) -#else - inline void mprintf(const char *fmt,const char *a=NULL,const char *b=NULL) {} - inline void eprintf(const char *fmt,const char *a=NULL,const char *b=NULL) {} - inline void mprintf(const char *fmt,int b) {} - inline void eprintf(const char *fmt,int b) {} - inline void mprintf(const char *fmt,const char *a,int b) {} - inline void eprintf(const char *fmt,const char *a,int b) {} -#endif -inline void Alarm() {} -inline void GetPasswordText(char *Str,int MaxLength) {} -inline unsigned int GetKey() {return(0);} -inline bool GetPassword(PASSWORD_TYPE Type,const char *FileName,char *Password,int MaxLength) {return(false);} -inline int Ask(const char *AskStr) {return(0);} -#endif - -#endif diff --git a/lib/UnrarXLib/crc.cpp b/lib/UnrarXLib/crc.cpp deleted file mode 100644 index 0dd7c8fc86..0000000000 --- a/lib/UnrarXLib/crc.cpp +++ /dev/null @@ -1,61 +0,0 @@ -#include "rar.hpp" - -uint CRCTab[256]; - -void InitCRC() -{ - for (int I=0;I<256;I++) - { - uint C=I; - for (int J=0;J<8;J++) - C=(C & 1) ? (C>>1)^0xEDB88320L : (C>>1); - CRCTab[I]=C; - } -} - - -uint CRC(uint StartCRC,const void *Addr,uint Size) -{ - if (CRCTab[1]==0) - InitCRC(); - byte *Data=(byte *)Addr; -#if defined(LITTLE_ENDIAN) && defined(PRESENT_INT32) - while (Size>0 && ((intptr_t)Data & 7)) - { - StartCRC=CRCTab[(byte)(StartCRC^Data[0])]^(StartCRC>>8); - Size--; - Data++; - } - while (Size>=8) - { - StartCRC^=*(uint32 *)Data; - StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8); - StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8); - StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8); - StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8); - StartCRC^=*(uint32 *)(Data+4); - StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8); - StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8); - StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8); - StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8); - Data+=8; - Size-=8; - } -#endif - for (unsigned int I=0;I<Size;I++) - StartCRC=CRCTab[(byte)(StartCRC^Data[I])]^(StartCRC>>8); - return(StartCRC); -} - -#ifndef SFX_MODULE -ushort OldCRC(ushort StartCRC,const void *Addr,uint Size) -{ - byte *Data=(byte *)Addr; - for (unsigned int I=0;I<Size;I++) - { - StartCRC=(StartCRC+Data[I])&0xffff; - StartCRC=((StartCRC<<1)|(StartCRC>>15))&0xffff; - } - return(StartCRC); -} -#endif diff --git a/lib/UnrarXLib/crc.hpp b/lib/UnrarXLib/crc.hpp deleted file mode 100644 index 47ee7e230b..0000000000 --- a/lib/UnrarXLib/crc.hpp +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _RAR_CRC_ -#define _RAR_CRC_ - -extern uint CRCTab[256]; - -void InitCRC(); -uint CRC(uint StartCRC,const void *Addr,uint Size); -ushort OldCRC(ushort StartCRC,const void *Addr,uint Size); - -#endif diff --git a/lib/UnrarXLib/credits.txt b/lib/UnrarXLib/credits.txt deleted file mode 100755 index 3014b57130..0000000000 --- a/lib/UnrarXLib/credits.txt +++ /dev/null @@ -1,3 +0,0 @@ -grebulon from Xbox-Scene sent me this code based on UnRAR 3.3.6 to be used in UnleashX dashboard. I have successfully tested and integrated this with the dash. I'm releasing the source code in behalf of grebulon and hope that others will find this useful. - -Thanks, grebulon, I owe you one ;). Keep it up.
\ No newline at end of file diff --git a/lib/UnrarXLib/crypt.cpp b/lib/UnrarXLib/crypt.cpp deleted file mode 100644 index 4d1a95e247..0000000000 --- a/lib/UnrarXLib/crypt.cpp +++ /dev/null @@ -1,373 +0,0 @@ -#include "rar.hpp" - -#ifndef SFX_MODULE -extern uint CRCTab[256]; -#endif - -#define NROUNDS 32 - -#define rol(x,n,xsize) (((x)<<(n)) | ((x)>>(xsize-(n)))) -#define ror(x,n,xsize) (((x)>>(n)) | ((x)<<(xsize-(n)))) - -#define substLong(t) ( (uint)SubstTable[(uint)t&255] | \ - ((uint)SubstTable[(int)(t>> 8)&255]<< 8) | \ - ((uint)SubstTable[(int)(t>>16)&255]<<16) | \ - ((uint)SubstTable[(int)(t>>24)&255]<<24) ) - -CryptKeyCacheItem CryptData::Cache[4]; -int CryptData::CachePos=0; - - -#ifndef SFX_MODULE -static byte InitSubstTable[256]={ - 215, 19,149, 35, 73,197,192,205,249, 28, 16,119, 48,221, 2, 42, - 232, 1,177,233, 14, 88,219, 25,223,195,244, 90, 87,239,153,137, - 255,199,147, 70, 92, 66,246, 13,216, 40, 62, 29,217,230, 86, 6, - 71, 24,171,196,101,113,218,123, 93, 91,163,178,202, 67, 44,235, - 107,250, 75,234, 49,167,125,211, 83,114,157,144, 32,193,143, 36, - 158,124,247,187, 89,214,141, 47,121,228, 61,130,213,194,174,251, - 97,110, 54,229,115, 57,152, 94,105,243,212, 55,209,245, 63, 11, - 164,200, 31,156, 81,176,227, 21, 76, 99,139,188,127, 17,248, 51, - 207,120,189,210, 8,226, 41, 72,183,203,135,165,166, 60, 98, 7, - 122, 38,155,170, 69,172,252,238, 39,134, 59,128,236, 27,240, 80, - 131, 3, 85,206,145, 79,154,142,159,220,201,133, 74, 64, 20,129, - 224,185,138,103,173,182, 43, 34,254, 82,198,151,231,180, 58, 10, - 118, 26,102, 12, 50,132, 22,191,136,111,162,179, 45, 4,148,108, - 161, 56, 78,126,242,222, 15,175,146, 23, 33,241,181,190, 77,225, - 0, 46,169,186, 68, 95,237, 65, 53,208,253,168, 9, 18,100, 52, - 116,184,160, 96,109, 37, 30,106,140,104,150, 5,204,117,112, 84 -}; -#endif - - - -void CryptData::DecryptBlock(byte *Buf,int Size) -{ - rin.blockDecrypt(Buf,Size,Buf); -} - - -#ifndef SFX_MODULE -void CryptData::EncryptBlock20(byte *Buf) -{ - uint A,B,C,D,T,TA,TB; -#if defined(BIG_ENDIAN) || !defined(PRESENT_INT32) || !defined(ALLOW_NOT_ALIGNED_INT) - A=((uint)Buf[0]|((uint)Buf[1]<<8)|((uint)Buf[2]<<16)|((uint)Buf[3]<<24))^Key[0]; - B=((uint)Buf[4]|((uint)Buf[5]<<8)|((uint)Buf[6]<<16)|((uint)Buf[7]<<24))^Key[1]; - C=((uint)Buf[8]|((uint)Buf[9]<<8)|((uint)Buf[10]<<16)|((uint)Buf[11]<<24))^Key[2]; - D=((uint)Buf[12]|((uint)Buf[13]<<8)|((uint)Buf[14]<<16)|((uint)Buf[15]<<24))^Key[3]; -#else - uint32 *BufPtr=(uint32 *)Buf; - A=BufPtr[0]^Key[0]; - B=BufPtr[1]^Key[1]; - C=BufPtr[2]^Key[2]; - D=BufPtr[3]^Key[3]; -#endif - for(int I=0;I<NROUNDS;I++) - { - T=((C+rol(D,11,32))^Key[I&3]); - TA=A^substLong(T); - T=((D^rol(C,17,32))+Key[I&3]); - TB=B^substLong(T); - A=C; - B=D; - C=TA; - D=TB; - } -#if defined(BIG_ENDIAN) || !defined(PRESENT_INT32) || !defined(ALLOW_NOT_ALIGNED_INT) - C^=Key[0]; - Buf[0]=(byte)C; - Buf[1]=(byte)(C>>8); - Buf[2]=(byte)(C>>16); - Buf[3]=(byte)(C>>24); - D^=Key[1]; - Buf[4]=(byte)D; - Buf[5]=(byte)(D>>8); - Buf[6]=(byte)(D>>16); - Buf[7]=(byte)(D>>24); - A^=Key[2]; - Buf[8]=(byte)A; - Buf[9]=(byte)(A>>8); - Buf[10]=(byte)(A>>16); - Buf[11]=(byte)(A>>24); - B^=Key[3]; - Buf[12]=(byte)B; - Buf[13]=(byte)(B>>8); - Buf[14]=(byte)(B>>16); - Buf[15]=(byte)(B>>24); -#else - BufPtr[0]=C^Key[0]; - BufPtr[1]=D^Key[1]; - BufPtr[2]=A^Key[2]; - BufPtr[3]=B^Key[3]; -#endif - UpdKeys(Buf); -} - - -void CryptData::DecryptBlock20(byte *Buf) -{ - byte InBuf[16]; - uint A,B,C,D,T,TA,TB; -#if defined(BIG_ENDIAN) || !defined(PRESENT_INT32) || !defined(ALLOW_NOT_ALIGNED_INT) - A=((uint)Buf[0]|((uint)Buf[1]<<8)|((uint)Buf[2]<<16)|((uint)Buf[3]<<24))^Key[0]; - B=((uint)Buf[4]|((uint)Buf[5]<<8)|((uint)Buf[6]<<16)|((uint)Buf[7]<<24))^Key[1]; - C=((uint)Buf[8]|((uint)Buf[9]<<8)|((uint)Buf[10]<<16)|((uint)Buf[11]<<24))^Key[2]; - D=((uint)Buf[12]|((uint)Buf[13]<<8)|((uint)Buf[14]<<16)|((uint)Buf[15]<<24))^Key[3]; -#else - uint32 *BufPtr=(uint32 *)Buf; - A=BufPtr[0]^Key[0]; - B=BufPtr[1]^Key[1]; - C=BufPtr[2]^Key[2]; - D=BufPtr[3]^Key[3]; -#endif - memcpy(InBuf,Buf,sizeof(InBuf)); - for(int I=NROUNDS-1;I>=0;I--) - { - T=((C+rol(D,11,32))^Key[I&3]); - TA=A^substLong(T); - T=((D^rol(C,17,32))+Key[I&3]); - TB=B^substLong(T); - A=C; - B=D; - C=TA; - D=TB; - } -#if defined(BIG_ENDIAN) || !defined(PRESENT_INT32) || !defined(ALLOW_NOT_ALIGNED_INT) - C^=Key[0]; - Buf[0]=(byte)C; - Buf[1]=(byte)(C>>8); - Buf[2]=(byte)(C>>16); - Buf[3]=(byte)(C>>24); - D^=Key[1]; - Buf[4]=(byte)D; - Buf[5]=(byte)(D>>8); - Buf[6]=(byte)(D>>16); - Buf[7]=(byte)(D>>24); - A^=Key[2]; - Buf[8]=(byte)A; - Buf[9]=(byte)(A>>8); - Buf[10]=(byte)(A>>16); - Buf[11]=(byte)(A>>24); - B^=Key[3]; - Buf[12]=(byte)B; - Buf[13]=(byte)(B>>8); - Buf[14]=(byte)(B>>16); - Buf[15]=(byte)(B>>24); -#else - BufPtr[0]=C^Key[0]; - BufPtr[1]=D^Key[1]; - BufPtr[2]=A^Key[2]; - BufPtr[3]=B^Key[3]; -#endif - UpdKeys(InBuf); -} - - -void CryptData::UpdKeys(byte *Buf) -{ - for (int I=0;I<16;I+=4) - { - Key[0]^=CRCTab[Buf[I]]; - Key[1]^=CRCTab[Buf[I+1]]; - Key[2]^=CRCTab[Buf[I+2]]; - Key[3]^=CRCTab[Buf[I+3]]; - } -} - - -void CryptData::Swap(byte *Ch1,byte *Ch2) -{ - byte Ch=*Ch1; - *Ch1=*Ch2; - *Ch2=Ch; -} -#endif - - -void CryptData::SetCryptKeys(char *Password,byte *Salt,bool Encrypt,bool OldOnly) -{ - if (*Password==0) - return; - if (OldOnly) - { -#ifndef SFX_MODULE - if (CRCTab[1]==0) - InitCRC(); - byte Psw[MAXPASSWORD]; - SetOldKeys(Password); - Key[0]=0xD3A3B879L; - Key[1]=0x3F6D12F7L; - Key[2]=0x7515A235L; - Key[3]=0xA4E7F123L; - memset(Psw,0,sizeof(Psw)); - strncpy((char *)Psw,Password,MAXPASSWORD-1); - int PswLength=strlen(Password); - memcpy(SubstTable,InitSubstTable,sizeof(SubstTable)); - for (int J=0;J<256;J++) - for (int I=0;I<PswLength;I+=2) - { - uint N1=(byte)CRCTab[(Psw[I]-J)&0xff]; - uint N2=(byte)CRCTab[(Psw[I+1]+J)&0xff]; - for (int K=1;N1!=N2;N1=(N1+1)&0xff,K++) - Swap(&SubstTable[N1],&SubstTable[(N1+I+K)&0xff]); - } - for (int I=0;I<PswLength;I+=16) - EncryptBlock20(&Psw[I]); -#endif - return; - } - - bool Cached=false; - for (unsigned int I=0;I<sizeof(Cache)/sizeof(Cache[0]);I++) - if (strcmp(Cache[I].Password,Password)==0 && - ((Salt==NULL && !Cache[I].SaltPresent) || - (Salt!=NULL && Cache[I].SaltPresent && memcmp(Cache[I].Salt,Salt,SALT_SIZE)==0))) - { - memcpy(AESKey,Cache[I].AESKey,sizeof(AESKey)); - memcpy(AESInit,Cache[I].AESInit,sizeof(AESInit)); - Cached=true; - break; - } - - if (!Cached) - { - wchar PswW[MAXPASSWORD]; - CharToWide(Password,PswW,MAXPASSWORD-1); - PswW[MAXPASSWORD-1]=0; - byte RawPsw[2*MAXPASSWORD+SALT_SIZE]; - WideToRaw(PswW,RawPsw); - int RawLength=2*strlenw(PswW); - if (Salt!=NULL) - { - memcpy(RawPsw+RawLength,Salt,SALT_SIZE); - RawLength+=SALT_SIZE; - } - hash_context c; - hash_initial(&c); - - const int HashRounds=0x40000; - for (int I=0;I<HashRounds;I++) - { - hash_process( &c, RawPsw, RawLength); - byte PswNum[3]; - PswNum[0]=(byte)I; - PswNum[1]=(byte)(I>>8); - PswNum[2]=(byte)(I>>16); - hash_process( &c, PswNum, 3); - if (I%(HashRounds/16)==0) - { - hash_context tempc=c; - uint32 digest[5]; - hash_final( &tempc, digest); - AESInit[I/(HashRounds/16)]=(byte)digest[4]; - } - } - uint32 digest[5]; - hash_final( &c, digest); - for (int I=0;I<4;I++) - for (int J=0;J<4;J++) - AESKey[I*4+J]=(byte)(digest[I]>>(J*8)); - - strcpy(Cache[CachePos].Password,Password); - if ((Cache[CachePos].SaltPresent=(Salt!=NULL))==true) - memcpy(Cache[CachePos].Salt,Salt,SALT_SIZE); - memcpy(Cache[CachePos].AESKey,AESKey,sizeof(AESKey)); - memcpy(Cache[CachePos].AESInit,AESInit,sizeof(AESInit)); - CachePos=(CachePos+1)%(sizeof(Cache)/sizeof(Cache[0])); - } - rin.init(Encrypt ? Rijndael::Encrypt : Rijndael::Decrypt,AESKey,AESInit); -} - - -#ifndef SFX_MODULE -void CryptData::SetOldKeys(char *Password) -{ - uint PswCRC=CRC(0xffffffff,Password,strlen(Password)); - OldKey[0]=PswCRC&0xffff; - OldKey[1]=(PswCRC>>16)&0xffff; - OldKey[2]=OldKey[3]=0; - PN1=PN2=PN3=0; - byte Ch; - while ((Ch=*Password)!=0) - { - PN1+=Ch; - PN2^=Ch; - PN3+=Ch; - PN3=(byte)rol(PN3,1,8); - OldKey[2]^=Ch^CRCTab[Ch]; - OldKey[3]+=Ch+(CRCTab[Ch]>>16); - Password++; - } -} - - -void CryptData::SetAV15Encryption() -{ - OldKey[0]=0x4765; - OldKey[1]=0x9021; - OldKey[2]=0x7382; - OldKey[3]=0x5215; -} - - -void CryptData::SetCmt13Encryption() -{ - PN1=0; - PN2=7; - PN3=77; -} - - -void CryptData::Crypt(byte *Data,uint Count,int Method) -{ - if (Method==OLD_DECODE) - Decode13(Data,Count); - else - if (Method==OLD_ENCODE) - Encode13(Data,Count); - else - Crypt15(Data,Count); -} - - -void CryptData::Encode13(byte *Data,uint Count) -{ - while (Count--) - { - PN2+=PN3; - PN1+=PN2; - *Data+=PN1; - Data++; - } -} - - -void CryptData::Decode13(byte *Data,uint Count) -{ - while (Count--) - { - PN2+=PN3; - PN1+=PN2; - *Data-=PN1; - Data++; - } -} - - -void CryptData::Crypt15(byte *Data,uint Count) -{ - while (Count--) - { - OldKey[0]+=0x1234; - OldKey[1]^=CRCTab[(OldKey[0] & 0x1fe)>>1]; - OldKey[2]-=CRCTab[(OldKey[0] & 0x1fe)>>1]>>16; - OldKey[0]^=OldKey[2]; - OldKey[3]=ror(OldKey[3]&0xffff,1,16)^OldKey[1]; - OldKey[3]=ror(OldKey[3]&0xffff,1,16); - OldKey[0]^=OldKey[3]; - *Data^=(byte)(OldKey[0]>>8); - Data++; - } -} -#endif diff --git a/lib/UnrarXLib/crypt.hpp b/lib/UnrarXLib/crypt.hpp deleted file mode 100644 index 809d76a53d..0000000000 --- a/lib/UnrarXLib/crypt.hpp +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef _RAR_CRYPT_ -#define _RAR_CRYPT_ - -enum { OLD_DECODE=0,OLD_ENCODE=1,NEW_CRYPT=2 }; - -struct CryptKeyCacheItem -{ -#ifndef _SFX_RTL_ - CryptKeyCacheItem() - { - *Password=0; - } - - ~CryptKeyCacheItem() - { - memset(AESKey,0,sizeof(AESKey)); - memset(AESInit,0,sizeof(AESInit)); - memset(Password,0,sizeof(Password)); - } -#endif - byte AESKey[16],AESInit[16]; - char Password[MAXPASSWORD]; - bool SaltPresent; - byte Salt[SALT_SIZE]; -}; - -class CryptData -{ - private: - void Encode13(byte *Data,uint Count); - void Decode13(byte *Data,uint Count); - void Crypt15(byte *Data,uint Count); - void UpdKeys(byte *Buf); - void Swap(byte *Ch1,byte *Ch2); - void SetOldKeys(char *Password); - - Rijndael rin; - - byte SubstTable[256]; - uint Key[4]; - ushort OldKey[4]; - byte PN1,PN2,PN3; - - byte AESKey[16],AESInit[16]; - - static CryptKeyCacheItem Cache[4]; - static int CachePos; - public: - void SetCryptKeys(char *Password,byte *Salt,bool Encrypt,bool OldOnly=false); - void SetAV15Encryption(); - void SetCmt13Encryption(); - void EncryptBlock20(byte *Buf); - void DecryptBlock20(byte *Buf); - void EncryptBlock(byte *Buf,int Size); - void DecryptBlock(byte *Buf,int Size); - void Crypt(byte *Data,uint Count,int Method); - static void SetSalt(byte *Salt,int SaltSize); -}; - -#endif diff --git a/lib/UnrarXLib/dll.cpp b/lib/UnrarXLib/dll.cpp deleted file mode 100644 index c706fb34fd..0000000000 --- a/lib/UnrarXLib/dll.cpp +++ /dev/null @@ -1,360 +0,0 @@ -#include "rar.hpp" -#include "dll.hpp" - -static int RarErrorToDll(int ErrCode); - -struct DataSet -{ - CommandData Cmd; - CmdExtract Extract; - Archive Arc; - int OpenMode; - int HeaderSize; - - DataSet():Arc(&Cmd) {}; -}; - - -HANDLE PASCAL RAROpenArchive(struct RAROpenArchiveData *r) -{ - RAROpenArchiveDataEx rx; - memset(&rx,0,sizeof(rx)); - rx.ArcName=r->ArcName; - rx.OpenMode=r->OpenMode; - rx.CmtBuf=r->CmtBuf; - rx.CmtBufSize=r->CmtBufSize; - HANDLE hArc=RAROpenArchiveEx(&rx); - r->OpenResult=rx.OpenResult; - r->CmtSize=rx.CmtSize; - r->CmtState=rx.CmtState; - return(hArc); -} - - -HANDLE PASCAL RAROpenArchiveEx(struct RAROpenArchiveDataEx *r) -{ - try - { - r->OpenResult=0; - DataSet *Data=new DataSet; - Data->OpenMode=r->OpenMode; - Data->Cmd.FileArgs->AddString("*"); - - char an[NM]; - if (r->ArcName==NULL && r->ArcNameW!=NULL) - { - WideToChar(r->ArcNameW,an,NM); - r->ArcName=an; - } - - Data->Cmd.AddArcName(r->ArcName,r->ArcNameW); - Data->Cmd.Overwrite=OVERWRITE_ALL; - Data->Cmd.VersionControl=1; - if (!Data->Arc.Open(r->ArcName,r->ArcNameW)) - { - delete Data; - r->OpenResult=ERAR_EOPEN; - return(NULL); - } - if (!Data->Arc.IsArchive(false)) - { - delete Data; - r->OpenResult=ERAR_BAD_ARCHIVE; - return(NULL); - } - r->Flags=Data->Arc.NewMhd.Flags; - Array<byte> CmtData; - if (r->CmtBufSize!=0 && Data->Arc.GetComment(CmtData)) - { - r->Flags|=2; - int Size=CmtData.Size()+1; - r->CmtState=Size>r->CmtBufSize ? ERAR_SMALL_BUF:1; - r->CmtSize=Min(Size,r->CmtBufSize); - memcpy(r->CmtBuf,&CmtData[0],r->CmtSize-1); - if (Size<=r->CmtBufSize) - r->CmtBuf[r->CmtSize-1]=0; - } - else - r->CmtState=r->CmtSize=0; - if (Data->Arc.Signed) - r->Flags|=0x20; - Data->Extract.ExtractArchiveInit(&Data->Cmd,Data->Arc); - return((HANDLE)Data); - } - catch (int ErrCode) - { - r->OpenResult=RarErrorToDll(ErrCode); - return(NULL); - } -} - - -int PASCAL RARCloseArchive(HANDLE hArcData) -{ - DataSet *Data=(DataSet *)hArcData; - bool Success=Data==NULL ? false:Data->Arc.Close(); - delete Data; - return(Success ? 0:ERAR_ECLOSE); -} - - -int PASCAL RARReadHeader(HANDLE hArcData,struct RARHeaderData *D) -{ - DataSet *Data=(DataSet *)hArcData; - try - { - if ((Data->HeaderSize=Data->Arc.SearchBlock(FILE_HEAD))<=0) - { - if (Data->Arc.Volume && Data->Arc.GetHeaderType()==ENDARC_HEAD && - (Data->Arc.EndArcHead.Flags & EARC_NEXT_VOLUME)) - if (MergeArchive(Data->Arc,NULL,false,'L')) - { - Data->Arc.Seek(Data->Arc.CurBlockPos,SEEK_SET); - return(RARReadHeader(hArcData,D)); - } - else - return(ERAR_EOPEN); - return(Data->Arc.BrokenFileHeader ? ERAR_BAD_DATA:ERAR_END_ARCHIVE); - } - if (Data->OpenMode==RAR_OM_LIST && (Data->Arc.NewLhd.Flags & LHD_SPLIT_BEFORE)) - { - int Code=RARProcessFile(hArcData,RAR_SKIP,NULL,NULL); - if (Code==0) - return(RARReadHeader(hArcData,D)); - else - return(Code); - } - strncpy(D->ArcName,Data->Arc.FileName,sizeof(D->ArcName)); - strncpy(D->FileName,Data->Arc.NewLhd.FileName,sizeof(D->FileName)); - D->Flags=Data->Arc.NewLhd.Flags; - D->PackSize=Data->Arc.NewLhd.PackSize; - D->UnpSize=Data->Arc.NewLhd.UnpSize; - D->HostOS=Data->Arc.NewLhd.HostOS; - D->FileCRC=Data->Arc.NewLhd.FileCRC; - D->FileTime=Data->Arc.NewLhd.FileTime; - D->UnpVer=Data->Arc.NewLhd.UnpVer; - D->Method=Data->Arc.NewLhd.Method; - D->FileAttr=Data->Arc.NewLhd.FileAttr; - D->CmtSize=0; - D->CmtState=0; - } - catch (int ErrCode) - { - return(RarErrorToDll(ErrCode)); - } - return(0); -} - - -int PASCAL RARReadHeaderEx(HANDLE hArcData,struct RARHeaderDataEx *D) -{ - DataSet *Data=(DataSet *)hArcData; - try - { - if ((Data->HeaderSize=Data->Arc.SearchBlock(FILE_HEAD))<=0) - { - if (Data->Arc.Volume && Data->Arc.GetHeaderType()==ENDARC_HEAD && - (Data->Arc.EndArcHead.Flags & EARC_NEXT_VOLUME)) - if (MergeArchive(Data->Arc,NULL,false,'L')) - { - Data->Arc.Seek(Data->Arc.CurBlockPos,SEEK_SET); - return(RARReadHeaderEx(hArcData,D)); - } - else - return(ERAR_EOPEN); - return(Data->Arc.BrokenFileHeader ? ERAR_BAD_DATA:ERAR_END_ARCHIVE); - } - if (Data->OpenMode==RAR_OM_LIST && (Data->Arc.NewLhd.Flags & LHD_SPLIT_BEFORE)) - { - int Code=RARProcessFile(hArcData,RAR_SKIP,NULL,NULL); - if (Code==0) - return(RARReadHeaderEx(hArcData,D)); - else - return(Code); - } - strncpy(D->ArcName,Data->Arc.FileName,sizeof(D->ArcName)); - if (*Data->Arc.FileNameW) - strncpyw(D->ArcNameW,Data->Arc.FileNameW,sizeof(D->ArcNameW)); - else - CharToWide(Data->Arc.FileName,D->ArcNameW); - strncpy(D->FileName,Data->Arc.NewLhd.FileName,sizeof(D->FileName)); - if (*Data->Arc.NewLhd.FileNameW) - strncpyw(D->FileNameW,Data->Arc.NewLhd.FileNameW,sizeof(D->FileNameW)); - else - { -#ifdef _WIN_32 - char AnsiName[NM]; - OemToChar(Data->Arc.NewLhd.FileName,AnsiName); - CharToWide(AnsiName,D->FileNameW); -#else - CharToWide(Data->Arc.NewLhd.FileName,D->FileNameW); -#endif - } - D->Flags=Data->Arc.NewLhd.Flags; - D->PackSize=Data->Arc.NewLhd.PackSize; - D->PackSizeHigh=Data->Arc.NewLhd.HighPackSize; - D->UnpSize=Data->Arc.NewLhd.UnpSize; - D->UnpSizeHigh=Data->Arc.NewLhd.HighUnpSize; - D->HostOS=Data->Arc.NewLhd.HostOS; - D->FileCRC=Data->Arc.NewLhd.FileCRC; - D->FileTime=Data->Arc.NewLhd.FileTime; - D->UnpVer=Data->Arc.NewLhd.UnpVer; - D->Method=Data->Arc.NewLhd.Method; - D->FileAttr=Data->Arc.NewLhd.FileAttr; - D->CmtSize=0; - D->CmtState=0; - } - catch (int ErrCode) - { - return(RarErrorToDll(ErrCode)); - } - return(0); -} - - -int PASCAL ProcessFile(HANDLE hArcData,int Operation,char *DestPath,char *DestName,wchar *DestPathW,wchar *DestNameW) -{ - DataSet *Data=(DataSet *)hArcData; - try - { - Data->Cmd.DllError=0; - if (Data->OpenMode==RAR_OM_LIST || Operation==RAR_SKIP && !Data->Arc.Solid) - { - if (/*Data->OpenMode==RAR_OM_LIST && */Data->Arc.Volume && - Data->Arc.GetHeaderType()==FILE_HEAD && - (Data->Arc.NewLhd.Flags & LHD_SPLIT_AFTER)!=0) - if (MergeArchive(Data->Arc,NULL,false,'L')) - { - Data->Arc.Seek(Data->Arc.CurBlockPos,SEEK_SET); - return(0); - } - else - return(ERAR_EOPEN); - Data->Arc.SeekToNext(); - } - else - { - Data->Cmd.DllOpMode=Operation; - - if (DestPath!=NULL || DestName!=NULL) - { -#ifdef _WIN_32 - OemToChar(NullToEmpty(DestPath),Data->Cmd.ExtrPath); -#else - strcpy(Data->Cmd.ExtrPath,NullToEmpty(DestPath)); -#endif - AddEndSlash(Data->Cmd.ExtrPath); -#ifdef _WIN_32 - OemToChar(NullToEmpty(DestName),Data->Cmd.DllDestName); -#else - strcpy(Data->Cmd.DllDestName,NullToEmpty(DestName)); -#endif - } - else - { - *Data->Cmd.ExtrPath=0; - *Data->Cmd.DllDestName=0; - } - - if (DestPathW!=NULL || DestNameW!=NULL) - { - strncpyw(Data->Cmd.ExtrPathW,NullToEmpty(DestPathW),NM-2); - AddEndSlash(Data->Cmd.ExtrPathW); - strncpyw(Data->Cmd.DllDestNameW,NullToEmpty(DestNameW),NM-1); - } - else - { - *Data->Cmd.ExtrPathW=0; - *Data->Cmd.DllDestNameW=0; - } - - strcpy(Data->Cmd.Command,Operation==RAR_EXTRACT ? "X":"T"); - Data->Cmd.Test=Operation!=RAR_EXTRACT; - bool Repeat=false; - Data->Extract.ExtractCurrentFile(&Data->Cmd,Data->Arc,Data->HeaderSize,Repeat); - - while (Data->Arc.ReadHeader()!=0 && Data->Arc.GetHeaderType()==NEWSUB_HEAD) - { - Data->Extract.ExtractCurrentFile(&Data->Cmd,Data->Arc,Data->HeaderSize,Repeat); - Data->Arc.SeekToNext(); - } - Data->Arc.Seek(Data->Arc.CurBlockPos,SEEK_SET); - } - } - catch (int ErrCode) - { - return(RarErrorToDll(ErrCode)); - } - return(Data->Cmd.DllError); -} - - -int PASCAL RARProcessFile(HANDLE hArcData,int Operation,char *DestPath,char *DestName) -{ - return(ProcessFile(hArcData,Operation,DestPath,DestName,NULL,NULL)); -} - - -int PASCAL RARProcessFileW(HANDLE hArcData,int Operation,wchar *DestPath,wchar *DestName) -{ - return(ProcessFile(hArcData,Operation,NULL,NULL,DestPath,DestName)); -} - - -void PASCAL RARSetChangeVolProc(HANDLE hArcData,CHANGEVOLPROC ChangeVolProc) -{ - DataSet *Data=(DataSet *)hArcData; - Data->Cmd.ChangeVolProc=ChangeVolProc; -} - - -void PASCAL RARSetCallback(HANDLE hArcData,UNRARCALLBACK Callback,LONG UserData) -{ - DataSet *Data=(DataSet *)hArcData; - Data->Cmd.Callback=Callback; - Data->Cmd.UserData=UserData; -} - - -void PASCAL RARSetProcessDataProc(HANDLE hArcData,PROCESSDATAPROC ProcessDataProc) -{ - DataSet *Data=(DataSet *)hArcData; - Data->Cmd.ProcessDataProc=ProcessDataProc; -} - - -void PASCAL RARSetPassword(HANDLE hArcData,char *Password) -{ - DataSet *Data=(DataSet *)hArcData; - strncpy(Data->Cmd.Password,Password,sizeof(Data->Cmd.Password)); -} - - -int PASCAL RARGetDllVersion() -{ - return(RAR_DLL_VERSION); -} - - -static int RarErrorToDll(int ErrCode) -{ - switch(ErrCode) - { - case FATAL_ERROR: - return(ERAR_EREAD); - case CRC_ERROR: - return(ERAR_BAD_DATA); - case WRITE_ERROR: - return(ERAR_EWRITE); - case OPEN_ERROR: - return(ERAR_EOPEN); - case CREATE_ERROR: - return(ERAR_ECREATE); - case MEMORY_ERROR: - return(ERAR_NO_MEMORY); - case SUCCESS: - return(0); - default: - return(ERAR_UNKNOWN); - } -} diff --git a/lib/UnrarXLib/dll.hpp b/lib/UnrarXLib/dll.hpp deleted file mode 100644 index 6b3a26dfa7..0000000000 --- a/lib/UnrarXLib/dll.hpp +++ /dev/null @@ -1,137 +0,0 @@ -#ifndef _UNRAR_DLL_ -#define _UNRAR_DLL_ - -#define ERAR_END_ARCHIVE 10 -#define ERAR_NO_MEMORY 11 -#define ERAR_BAD_DATA 12 -#define ERAR_BAD_ARCHIVE 13 -#define ERAR_UNKNOWN_FORMAT 14 -#define ERAR_EOPEN 15 -#define ERAR_ECREATE 16 -#define ERAR_ECLOSE 17 -#define ERAR_EREAD 18 -#define ERAR_EWRITE 19 -#define ERAR_SMALL_BUF 20 -#define ERAR_UNKNOWN 21 - -#define RAR_OM_LIST 0 -#define RAR_OM_EXTRACT 1 - -#define RAR_SKIP 0 -#define RAR_TEST 1 -#define RAR_EXTRACT 2 - -#define RAR_VOL_ASK 0 -#define RAR_VOL_NOTIFY 1 - -#define RAR_DLL_VERSION 4 - -#ifdef _UNIX -#define CALLBACK -#define PASCAL -#define LONG long -#define HANDLE void * -#define UINT unsigned int -#endif - -struct RARHeaderData -{ - char ArcName[260]; - char FileName[260]; - unsigned int Flags; - unsigned int PackSize; - unsigned int UnpSize; - unsigned int HostOS; - unsigned int FileCRC; - unsigned int FileTime; - unsigned int UnpVer; - unsigned int Method; - unsigned int FileAttr; - char *CmtBuf; - unsigned int CmtBufSize; - unsigned int CmtSize; - unsigned int CmtState; -}; - - -struct RARHeaderDataEx -{ - char ArcName[1024]; - wchar_t ArcNameW[1024]; - char FileName[1024]; - wchar_t FileNameW[1024]; - unsigned int Flags; - unsigned int PackSize; - unsigned int PackSizeHigh; - unsigned int UnpSize; - unsigned int UnpSizeHigh; - unsigned int HostOS; - unsigned int FileCRC; - unsigned int FileTime; - unsigned int UnpVer; - unsigned int Method; - unsigned int FileAttr; - char *CmtBuf; - unsigned int CmtBufSize; - unsigned int CmtSize; - unsigned int CmtState; - unsigned int Reserved[1024]; -}; - - -struct RAROpenArchiveData -{ - char *ArcName; - unsigned int OpenMode; - unsigned int OpenResult; - char *CmtBuf; - unsigned int CmtBufSize; - unsigned int CmtSize; - unsigned int CmtState; -}; - -struct RAROpenArchiveDataEx -{ - char *ArcName; - wchar_t *ArcNameW; - unsigned int OpenMode; - unsigned int OpenResult; - char *CmtBuf; - unsigned int CmtBufSize; - unsigned int CmtSize; - unsigned int CmtState; - unsigned int Flags; - unsigned int Reserved[32]; -}; - -enum UNRARCALLBACK_MESSAGES { - UCM_CHANGEVOLUME,UCM_PROCESSDATA,UCM_NEEDPASSWORD -}; - -typedef int (CALLBACK *UNRARCALLBACK)(UINT msg,LONG UserData,LONG P1,LONG P2); - -typedef int (PASCAL *CHANGEVOLPROC)(char *ArcName,int Mode); -typedef int (PASCAL *PROCESSDATAPROC)(unsigned char *Addr,int Size); - -#ifdef __cplusplus -extern "C" { -#endif - -HANDLE PASCAL RAROpenArchive(struct RAROpenArchiveData *ArchiveData); -HANDLE PASCAL RAROpenArchiveEx(struct RAROpenArchiveDataEx *ArchiveData); -int PASCAL RARCloseArchive(HANDLE hArcData); -int PASCAL RARReadHeader(HANDLE hArcData,struct RARHeaderData *HeaderData); -int PASCAL RARReadHeaderEx(HANDLE hArcData,struct RARHeaderDataEx *HeaderData); -int PASCAL RARProcessFile(HANDLE hArcData,int Operation,char *DestPath,char *DestName); -int PASCAL RARProcessFileW(HANDLE hArcData,int Operation,wchar_t *DestPath,wchar_t *DestName); -void PASCAL RARSetCallback(HANDLE hArcData,UNRARCALLBACK Callback,LONG UserData); -void PASCAL RARSetChangeVolProc(HANDLE hArcData,CHANGEVOLPROC ChangeVolProc); -void PASCAL RARSetProcessDataProc(HANDLE hArcData,PROCESSDATAPROC ProcessDataProc); -void PASCAL RARSetPassword(HANDLE hArcData,char *Password); -int PASCAL RARGetDllVersion(); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/UnrarXLib/encname.cpp b/lib/UnrarXLib/encname.cpp deleted file mode 100644 index 6f57cd912b..0000000000 --- a/lib/UnrarXLib/encname.cpp +++ /dev/null @@ -1,57 +0,0 @@ -#include "rar.hpp" - -EncodeFileName::EncodeFileName() -{ - Flags=0; - FlagBits=0; - FlagsPos=0; - DestSize=0; -} - - - - -void EncodeFileName::Decode(char *Name,byte *EncName,int EncSize,wchar *NameW, - int MaxDecSize) -{ - int EncPos=0,DecPos=0; - byte HighByte=EncName[EncPos++]; - while (EncPos<EncSize && DecPos<MaxDecSize) - { - if (FlagBits==0) - { - Flags=EncName[EncPos++]; - FlagBits=8; - } - switch(Flags>>6) - { - case 0: - NameW[DecPos++]=EncName[EncPos++]; - break; - case 1: - NameW[DecPos++]=EncName[EncPos++]+(HighByte<<8); - break; - case 2: - NameW[DecPos++]=EncName[EncPos]+(EncName[EncPos+1]<<8); - EncPos+=2; - break; - case 3: - { - int Length=EncName[EncPos++]; - if (Length & 0x80) - { - byte Correction=EncName[EncPos++]; - for (Length=(Length&0x7f)+2;Length>0 && DecPos<MaxDecSize;Length--,DecPos++) - NameW[DecPos]=((Name[DecPos]+Correction)&0xff)+(HighByte<<8); - } - else - for (Length+=2;Length>0 && DecPos<MaxDecSize;Length--,DecPos++) - NameW[DecPos]=Name[DecPos]; - } - break; - } - Flags<<=2; - FlagBits-=2; - } - NameW[DecPos<MaxDecSize ? DecPos:MaxDecSize-1]=0; -} diff --git a/lib/UnrarXLib/encname.hpp b/lib/UnrarXLib/encname.hpp deleted file mode 100644 index 586f4216f1..0000000000 --- a/lib/UnrarXLib/encname.hpp +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef _RAR_ENCNAME_ -#define _RAR_ENCNAME_ - -class EncodeFileName -{ - private: - void AddFlags(int Value); - - byte *EncName; - byte Flags; - int FlagBits; - int FlagsPos; - int DestSize; - public: - EncodeFileName(); - int Encode(char *Name,wchar *NameW,byte *EncName); - void Decode(char *Name,byte *EncName,int EncSize,wchar *NameW,int MaxDecSize); -}; - -#endif diff --git a/lib/UnrarXLib/errhnd.cpp b/lib/UnrarXLib/errhnd.cpp deleted file mode 100644 index 4b74312605..0000000000 --- a/lib/UnrarXLib/errhnd.cpp +++ /dev/null @@ -1,355 +0,0 @@ -#include "rar.hpp" - - -static bool UserBreak; - -ErrorHandler::ErrorHandler() -{ - Clean(); -} - - -void ErrorHandler::Clean() -{ - ExitCode=SUCCESS; - ErrCount=0; - EnableBreak=true; - Silent=false; - DoShutdown=false; -} - - -void ErrorHandler::MemoryError() -{ - MemoryErrorMsg(); - Throw(MEMORY_ERROR); -} - - -void ErrorHandler::OpenError(const char *FileName) -{ -#ifndef SILENT - OpenErrorMsg(FileName); - Throw(OPEN_ERROR); -#endif -} - - -void ErrorHandler::CloseError(const char *FileName) -{ -#ifndef SILENT - if (!UserBreak) - { - ErrMsg(NULL,St(MErrFClose),FileName); - SysErrMsg(); - } -#endif -#if !defined(SILENT) || defined(RARDLL) - Throw(FATAL_ERROR); -#endif -} - - -void ErrorHandler::ReadError(const char *FileName) -{ -#ifndef SILENT - ReadErrorMsg(NULL,FileName); -#endif -#if !defined(SILENT) || defined(RARDLL) - Throw(FATAL_ERROR); -#endif -} - - -bool ErrorHandler::AskRepeatRead(const char *FileName) -{ -#if !defined(SILENT) && !defined(SFX_MODULE) && !defined(_WIN_CE) - if (!Silent) - { - mprintf("\n"); - Log(NULL,St(MErrRead),FileName); - return(Ask(St(MRetryAbort))==1); - } -#endif - return(false); -} - - -void ErrorHandler::WriteError(const char *ArcName,const char *FileName) -{ -#ifndef SILENT - WriteErrorMsg(ArcName,FileName); -#endif -#if !defined(SILENT) || defined(RARDLL) - Throw(WRITE_ERROR); -#endif -} - - -#ifdef _WIN_32 -void ErrorHandler::WriteErrorFAT(const char *FileName) -{ -#if !defined(SILENT) && !defined(SFX_MODULE) - SysErrMsg(); - ErrMsg(NULL,St(MNTFSRequired),FileName); -#endif -#if !defined(SILENT) && !defined(SFX_MODULE) || defined(RARDLL) - Throw(WRITE_ERROR); -#endif -} -#endif - - -bool ErrorHandler::AskRepeatWrite(const char *FileName) -{ -#if !defined(SILENT) && !defined(_WIN_CE) - if (!Silent) - { - mprintf("\n"); - Log(NULL,St(MErrWrite),FileName); - return(Ask(St(MRetryAbort))==1); - } -#endif - return(false); -} - - -void ErrorHandler::SeekError(const char *FileName) -{ -#ifndef SILENT - if (!UserBreak) - { - ErrMsg(NULL,St(MErrSeek),FileName); - SysErrMsg(); - } -#endif -#if !defined(SILENT) || defined(RARDLL) - Throw(FATAL_ERROR); -#endif -} - - -void ErrorHandler::MemoryErrorMsg() -{ -#ifndef SILENT - ErrMsg(NULL,St(MErrOutMem)); -#endif -} - - -void ErrorHandler::OpenErrorMsg(const char *FileName) -{ - OpenErrorMsg(NULL,FileName); -} - - -void ErrorHandler::OpenErrorMsg(const char *ArcName,const char *FileName) -{ -#ifndef SILENT - Log(ArcName && *ArcName ? ArcName:NULL,St(MCannotOpen),FileName); - Alarm(); - SysErrMsg(); -#endif -} - - -void ErrorHandler::CreateErrorMsg(const char *FileName) -{ - CreateErrorMsg(NULL,FileName); -} - - -void ErrorHandler::CreateErrorMsg(const char *ArcName,const char *FileName) -{ -#ifndef SILENT - Log(ArcName && *ArcName ? ArcName:NULL,St(MCannotCreate),FileName); - Alarm(); -#if defined(_WIN_32) && !defined(_WIN_CE) && !defined(SFX_MODULE) && defined(MAXPATH) - if (GetLastError()==ERROR_PATH_NOT_FOUND) - { - int NameLength=strlen(FileName); - if (!IsFullPath(FileName)) - { - char CurDir[NM]; - GetCurrentDirectory(sizeof(CurDir),CurDir); - NameLength+=strlen(CurDir)+1; - } - if (NameLength>MAXPATH) - { - Log(ArcName && *ArcName ? ArcName:NULL,St(MMaxPathLimit),MAXPATH); - } - } -#endif - SysErrMsg(); -#endif -} - - -void ErrorHandler::ReadErrorMsg(const char *ArcName,const char *FileName) -{ -#ifndef SILENT - ErrMsg(ArcName,St(MErrRead),FileName); - SysErrMsg(); -#endif -} - - -void ErrorHandler::WriteErrorMsg(const char *ArcName,const char *FileName) -{ -#ifndef SILENT - ErrMsg(ArcName,St(MErrWrite),FileName); - SysErrMsg(); -#endif -} - - -void ErrorHandler::Exit(int ExitCode) -{ -#ifndef SFX_MODULE - Alarm(); -#endif - Throw(ExitCode); -} - - -#ifndef GUI -void ErrorHandler::ErrMsg(const char *ArcName,const char *fmt,...) -{ - safebuf char Msg[NM+1024]; - va_list argptr; - va_start(argptr,fmt); - vsprintf(Msg,fmt,argptr); - va_end(argptr); -#ifdef _WIN_32 - if (UserBreak) - Sleep(5000); -#endif - Alarm(); - if (*Msg) - { - Log(ArcName,"\n%s",Msg); - mprintf("\n%s\n",St(MProgAborted)); - } -} -#endif - - -void ErrorHandler::SetErrorCode(int Code) -{ - switch(Code) - { - case WARNING: - case USER_BREAK: - if (ExitCode==SUCCESS) - ExitCode=Code; - break; - case FATAL_ERROR: - if (ExitCode==SUCCESS || ExitCode==WARNING) - ExitCode=FATAL_ERROR; - break; - default: - ExitCode=Code; - break; - } - ErrCount++; -} - - -#if !defined(GUI) && !defined(_SFX_RTL_) -#ifdef _WIN_32 -BOOL __stdcall ProcessSignal(DWORD SigType) -#else -#if defined(__sun) -extern "C" -#endif -void _stdfunction ProcessSignal(int SigType) -#endif -{ -#if defined(_WIN_32) && !defined(TARGET_POSIX) - if (SigType==CTRL_LOGOFF_EVENT) - return(TRUE); -#endif - UserBreak=true; - mprintf(St(MBreak)); - for (int I=0;!File::RemoveCreated() && I<3;I++) - { -#ifdef _WIN_32 - Sleep(100); -#endif - } -#if defined(USE_RC) && !defined(SFX_MODULE) && !defined(_WIN_CE) - ExtRes.UnloadDLL(); -#endif -#if !defined(TARGET_POSIX) - exit(USER_BREAK); -#endif -#ifdef _WIN_32 - return(TRUE); -#endif -} -#endif - - -void ErrorHandler::SetSignalHandlers(bool Enable) -{ - EnableBreak=Enable; -#if !defined(GUI) && !defined(_SFX_RTL_) -#ifdef _WIN_32 - SetConsoleCtrlHandler(Enable ? ProcessSignal:NULL,TRUE); -#else - signal(SIGINT,Enable ? ProcessSignal:SIG_IGN); - signal(SIGTERM,Enable ? ProcessSignal:SIG_IGN); -#endif -#endif -} - - -void ErrorHandler::Throw(int Code) -{ - if (Code==USER_BREAK && !EnableBreak) - return; - ErrHandler.SetErrorCode(Code); -#ifdef ALLOW_EXCEPTIONS - throw Code; -#else - File::RemoveCreated(); -#if !defined(_XBMC) && !defined(TARGET_POSIX) - exit(Code); -#endif -#endif -} - - -void ErrorHandler::SysErrMsg() -{ -#if defined(_WIN_32) && !defined(SFX_MODULE) && !defined(SILENT) - #define STRCHR strchr - #define ERRCHAR char - ERRCHAR *lpMsgBuf=NULL; - int ErrType=GetLastError(); - if (ErrType!=0 && FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, - NULL,ErrType,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR)&lpMsgBuf,0,NULL)) - { - ERRCHAR *CurMsg=lpMsgBuf; - while (CurMsg!=NULL) - { - while (*CurMsg=='\r' || *CurMsg=='\n') - CurMsg++; - if (*CurMsg==0) - break; - ERRCHAR *EndMsg=STRCHR(CurMsg,'\r'); - if (EndMsg==NULL) - EndMsg=STRCHR(CurMsg,'\n'); - if (EndMsg!=NULL) - { - *EndMsg=0; - EndMsg++; - } - Log(NULL,"\n%s",CurMsg); - CurMsg=EndMsg; - } - } - LocalFree( lpMsgBuf ); -#endif -} diff --git a/lib/UnrarXLib/errhnd.hpp b/lib/UnrarXLib/errhnd.hpp deleted file mode 100644 index 9e276222da..0000000000 --- a/lib/UnrarXLib/errhnd.hpp +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef _RAR_ERRHANDLER_ -#define _RAR_ERRHANDLER_ - -#if (defined(GUI) || !defined(_WIN_32)) && !defined(SFX_MODULE) && !defined(_WIN_CE) || defined(RARDLL) -#define ALLOW_EXCEPTIONS -#endif - - - -#define rarmalloc malloc -#define rarcalloc calloc -#define rarrealloc realloc -#define rarfree free -#define rarstrdup strdup - - - -enum { SUCCESS,WARNING,FATAL_ERROR,CRC_ERROR,LOCK_ERROR,WRITE_ERROR, - OPEN_ERROR,USER_ERROR,MEMORY_ERROR,CREATE_ERROR,USER_BREAK=255}; - -class ErrorHandler -{ - private: - void ErrMsg(const char *ArcName,const char *fmt,...); - - int ExitCode; - int ErrCount; - bool EnableBreak; - bool Silent; - bool DoShutdown; - public: - ErrorHandler(); - void Clean(); - void MemoryError(); - void OpenError(const char *FileName); - void CloseError(const char *FileName); - void ReadError(const char *FileName); - bool AskRepeatRead(const char *FileName); - void WriteError(const char *ArcName,const char *FileName); - void WriteErrorFAT(const char *FileName); - bool AskRepeatWrite(const char *FileName); - void SeekError(const char *FileName); - void MemoryErrorMsg(); - void OpenErrorMsg(const char *FileName); - void OpenErrorMsg(const char *ArcName,const char *FileName); - void CreateErrorMsg(const char *FileName); - void CreateErrorMsg(const char *ArcName,const char *FileName); - void ReadErrorMsg(const char *ArcName,const char *FileName); - void WriteErrorMsg(const char *ArcName,const char *FileName); - void Exit(int ExitCode); - void SetErrorCode(int Code); - int GetErrorCode() {return(ExitCode);} - int GetErrorCount() {return(ErrCount);} - void SetSignalHandlers(bool Enable); - void Throw(int Code); - void SetSilent(bool Mode) {Silent=Mode;}; - void SetShutdown(bool Mode) {DoShutdown=Mode;}; - void SysErrMsg(); -}; - -#endif diff --git a/lib/UnrarXLib/extinfo.cpp b/lib/UnrarXLib/extinfo.cpp deleted file mode 100644 index 13239fe72c..0000000000 --- a/lib/UnrarXLib/extinfo.cpp +++ /dev/null @@ -1,76 +0,0 @@ -#include "rar.hpp" - -#ifdef _WIN_32 -#include "win32acl.cpp" -#include "win32stm.cpp" -#endif -#ifdef _BEOS -#include "beosea.cpp" -#endif -#if defined(_EMX) && !defined(_DJGPP) -#include "os2ea.cpp" -#endif -#ifdef _UNIX -#include "uowners.cpp" -#endif - - - -#ifndef SFX_MODULE -void SetExtraInfo(CommandData *Cmd,Archive &Arc,char *Name,wchar *NameW) -{ - switch(Arc.SubBlockHead.SubType) - { -#if defined(_EMX) && !defined(_DJGPP) - case EA_HEAD: - if (Cmd->ProcessEA) - ExtractOS2EA(Arc,Name); - break; -#endif -#ifdef _UNIX - case UO_HEAD: - if (Cmd->ProcessOwners) - ExtractUnixOwner(Arc,Name); - break; -#endif -#ifdef _BEOS - case BEEA_HEAD: - if (Cmd->ProcessEA) - ExtractBeEA(Arc,Name); - break; -#endif -#ifdef _WIN_32 - case NTACL_HEAD: - if (Cmd->ProcessOwners) - ExtractACL(Arc,Name,NameW); - break; - case STREAM_HEAD: - ExtractStreams(Arc,Name,NameW); - break; -#endif - } -} -#endif - - -void SetExtraInfoNew(CommandData *Cmd,Archive &Arc,char *Name,wchar *NameW) -{ -#if defined(_EMX) && !defined(_DJGPP) - if (Cmd->ProcessEA && Arc.SubHead.CmpName(SUBHEAD_TYPE_OS2EA)) - ExtractOS2EANew(Arc,Name); -#endif -#ifdef _UNIX - if (Cmd->ProcessOwners && Arc.SubHead.CmpName(SUBHEAD_TYPE_UOWNER)) - ExtractUnixOwnerNew(Arc,Name); -#endif -#ifdef _BEOS - if (Cmd->ProcessEA && Arc.SubHead.CmpName(SUBHEAD_TYPE_UOWNER)) - ExtractUnixOwnerNew(Arc,Name); -#endif -#ifdef _WIN_32 - if (Cmd->ProcessOwners && Arc.SubHead.CmpName(SUBHEAD_TYPE_ACL)) - ExtractACLNew(Arc,Name,NameW); - if (Arc.SubHead.CmpName(SUBHEAD_TYPE_STREAM)) - ExtractStreamsNew(Arc,Name,NameW); -#endif -} diff --git a/lib/UnrarXLib/extinfo.hpp b/lib/UnrarXLib/extinfo.hpp deleted file mode 100644 index db7cea53f8..0000000000 --- a/lib/UnrarXLib/extinfo.hpp +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef _RAR_EXTINFO_ -#define _RAR_EXTINFO_ - - -void SetExtraInfo(CommandData *Cmd,Archive &Arc,char *Name,wchar *NameW); -void SetExtraInfoNew(CommandData *Cmd,Archive &Arc,char *Name,wchar *NameW); - -#endif 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; - } - } -} diff --git a/lib/UnrarXLib/extract.hpp b/lib/UnrarXLib/extract.hpp deleted file mode 100644 index 5de6f72f15..0000000000 --- a/lib/UnrarXLib/extract.hpp +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef _RAR_EXTRACT_ -#define _RAR_EXTRACT_ - -enum EXTRACT_ARC_CODE {EXTRACT_ARC_NEXT,EXTRACT_ARC_REPEAT}; - -class CmdExtract -{ - private: - ComprDataIO DataIO; - Unpack *Unp; - long TotalFileCount; - - long FileCount; - long MatchedArgs; - bool FirstFile; - bool AllMatchesExact; - bool ReconstructDone; - - char ArcName[NM]; - wchar ArcNameW[NM]; - - char Password[MAXPASSWORD]; - bool PasswordAll; - bool PrevExtracted; - bool SignatureFound; - char DestFileName[NM]; - wchar DestFileNameW[NM]; - bool PasswordCancelled; - public: - CmdExtract(); - ~CmdExtract(); - void DoExtract(CommandData *Cmd); - void ExtractArchiveInit(CommandData *Cmd,Archive &Arc); - EXTRACT_ARC_CODE ExtractArchive(CommandData *Cmd); - bool ExtractCurrentFile(CommandData *Cmd,Archive &Arc,int HeaderSize, - bool &Repeat); - static void UnstoreFile(ComprDataIO &DataIO,Int64 DestUnpSize); -//#ifdef XBMC - ComprDataIO &GetDataIO() {return DataIO;} -//#endif -}; - -#endif - diff --git a/lib/UnrarXLib/filcreat.cpp b/lib/UnrarXLib/filcreat.cpp deleted file mode 100644 index 3df48c039d..0000000000 --- a/lib/UnrarXLib/filcreat.cpp +++ /dev/null @@ -1,78 +0,0 @@ -#include "rar.hpp" - -bool FileCreate(RAROptions *Cmd,File *NewFile,char *Name,wchar *NameW, - OVERWRITE_MODE Mode,bool *UserReject,Int64 FileSize, - uint FileTime) -{ - if (UserReject!=NULL) - *UserReject=false; - while (FileExist(Name,NameW)) - { - if (Mode==OVERWRITE_NONE) - { - if (UserReject!=NULL) - *UserReject=true; - return(false); - } -#ifdef SILENT - Mode=OVERWRITE_ALL; -#endif - if (Cmd->AllYes || Mode==OVERWRITE_ALL) - break; - if (Mode==OVERWRITE_ASK) - { - eprintf(St(MFileExists),Name); - int Choice=Ask(St(MYesNoAllRenQ)); - if (Choice==1) - break; - if (Choice==2) - { - if (UserReject!=NULL) - *UserReject=true; - return(false); - } - if (Choice==3) - { - Cmd->Overwrite=OVERWRITE_ALL; - break; - } - if (Choice==4) - { - if (UserReject!=NULL) - *UserReject=true; - Cmd->Overwrite=OVERWRITE_NONE; - return(false); - } - if (Choice==5) - { - mprintf(St(MAskNewName)); - - char NewName[NM]; -#ifdef _WIN_32 - File SrcFile; - SrcFile.SetHandleType(FILE_HANDLESTD); - int Size=SrcFile.Read(NewName,NM); - NewName[Size]=0; - //OemToChar(NewName,NewName); -#else - if (!fgets(NewName,sizeof(NewName),stdin)) - continue; -#endif - RemoveLF(NewName); - if (PointToName(NewName)==NewName) - strcpy(PointToName(Name),NewName); - else - strcpy(Name,NewName); - if (NameW!=NULL) - *NameW=0; - continue; - } - if (Choice==6) - ErrHandler.Exit(USER_BREAK); - } - } - if (NewFile!=NULL && NewFile->Create(Name,NameW)) - return(true); - PrepareToDelete(Name,NameW); - return(NewFile!=NULL ? NewFile->Create(Name,NameW):DelFile(Name,NameW)); -} diff --git a/lib/UnrarXLib/filcreat.hpp b/lib/UnrarXLib/filcreat.hpp deleted file mode 100644 index 2462bb3e5e..0000000000 --- a/lib/UnrarXLib/filcreat.hpp +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef _RAR_FILECREATE_ -#define _RAR_FILECREATE_ - -bool FileCreate(RAROptions *Cmd,File *NewFile,char *Name,wchar *NameW, - OVERWRITE_MODE Mode,bool *UserReject,Int64 FileSize=INT64ERR, - uint FileTime=0); - -#endif diff --git a/lib/UnrarXLib/file.cpp b/lib/UnrarXLib/file.cpp deleted file mode 100644 index d70ad84884..0000000000 --- a/lib/UnrarXLib/file.cpp +++ /dev/null @@ -1,767 +0,0 @@ -#include "rar.hpp" - -// BE WARNED THIS FILE IS HEAVILY MODIFIED TO BE USED WITH XBMC - -#include "filesystem/Directory.h" -#include "filesystem/File.h" -#include "Util.h" -#include "utils/URIUtils.h" - -//static File *CreatedFiles[32]; -static int RemoveCreatedActive=0; - -File::File() - : m_File(*(new XFILE::CFile())) - -{ -// hFile=BAD_HANDLE; - *FileName=0; - *FileNameW=0; - NewFile=false; - LastWrite=false; - HandleType=FILE_HANDLENORMAL; - SkipClose=false; - IgnoreReadErrors=false; - ErrorType=FILE_SUCCESS; - OpenShared=false; - AllowDelete=true; - CloseCount=0; - AllowExceptions=true; -} - - -File::~File() -{ - /*if (hFile!=BAD_HANDLE && !SkipClose) - if (NewFile) - Delete(); - else - Close();*/ - m_File.Close(); - delete &m_File; -} - - -void File::operator = (File &SrcFile) -{ - //hFile=SrcFile.hFile; - m_File = SrcFile.m_File; - strcpy(FileName,SrcFile.FileName); - NewFile=SrcFile.NewFile; - LastWrite=SrcFile.LastWrite; - HandleType=SrcFile.HandleType; - SrcFile.SkipClose=true; -} - - -bool File::Open(const char *Name,const wchar *NameW,bool OpenShared,bool Update) -{ - // Below commented code was left behind on spiffs request for possible later usage - - /*ErrorType=FILE_SUCCESS; - FileHandle hNewFile; - if (File::OpenShared) - OpenShared=true; -#ifdef _WIN_32 - uint Access=GENERIC_READ; - if (Update) - Access|=GENERIC_WRITE; - uint ShareMode=FILE_SHARE_READ; - if (OpenShared) - ShareMode|=FILE_SHARE_WRITE; -#ifndef _XBOX - if (WinNT() && NameW!=NULL && *NameW!=0) - hNewFile=CreateFileW(NameW,Access,ShareMode,NULL,OPEN_EXISTING, - FILE_FLAG_SEQUENTIAL_SCAN,NULL); - else -#endif - hNewFile=CreateFile(Name,Access,ShareMode,NULL,OPEN_EXISTING, - FILE_FLAG_SEQUENTIAL_SCAN,NULL); - - if (hNewFile==BAD_HANDLE && GetLastError()==ERROR_FILE_NOT_FOUND) - ErrorType=FILE_NOTFOUND; -#else - int flags=Update ? O_RDWR:O_RDONLY; -#ifdef O_BINARY - flags|=O_BINARY; -#if defined(_AIX) && defined(_LARGE_FILE_API) - flags|=O_LARGEFILE; -#endif -#endif -#if defined(_EMX) && !defined(_DJGPP) - int sflags=OpenShared ? SH_DENYNO:SH_DENYWR; - int handle=sopen(Name,flags,sflags); -#else - int handle=open(Name,flags); -#ifdef LOCK_EX - if (!OpenShared && Update && handle>=0 && flock(handle,LOCK_EX|LOCK_NB)==-1) - { - close(handle); - return(false); - } -#endif -#endif - hNewFile=handle==-1 ? BAD_HANDLE:fdopen(handle,Update ? UPDATEBINARY:READBINARY); - if (hNewFile==BAD_HANDLE && errno==ENOENT) - ErrorType=FILE_NOTFOUND; -#endif - NewFile=false; - HandleType=FILE_HANDLENORMAL; - SkipClose=false; - bool success=hNewFile!=BAD_HANDLE;*/ - char _name[NM]; - if (NameW!=NULL) - WideToUtf(NameW, _name, sizeof(_name)); - else - strcpy(_name, Name); - bool success; - if (Update) - success = m_File.OpenForWrite(_name); - else - success = m_File.Open(_name); - if (success) - { -// hFile=hNewFile; - if (NameW!=NULL) - strcpyw(FileNameW,NameW); - else - *FileNameW=0; - if (Name!=NULL) - strcpy(FileName,Name); - else - WideToChar(NameW,FileName); - //AddFileToList(hFile); - AddFileToList(); - } - return(success); -} - - -#if !defined(SHELL_EXT) && !defined(SFX_MODULE) -void File::TOpen(const char *Name,const wchar *NameW) -{ - if (!WOpen(Name,NameW)) - ErrHandler.Exit(OPEN_ERROR); -} -#endif - - -bool File::WOpen(const char *Name,const wchar *NameW) -{ - if (Open(Name,NameW)) - return(true); - ErrHandler.OpenErrorMsg(Name); - return(false); -} - - -bool File::Create(const char *Name,const wchar *NameW) -{ -// Below commented code was left behind on spiffs request for possible later usage -/*#ifdef _WIN_32 -#ifndef _XBOX - if (WinNT() && NameW!=NULL && *NameW!=0) - hFile=CreateFileW(NameW,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL, - CREATE_ALWAYS,0,NULL); - else -#endif - hFile=CreateFile(Name,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL, - CREATE_ALWAYS,0,NULL); -#else - hFile=fopen(Name,CREATEBINARY); -#endif*/ - char _name[NM]; - if (NameW!=NULL) - WideToUtf(NameW, _name, sizeof(_name)); - else - strcpy(_name, Name); - std::string strPath = URIUtils::GetDirectory(_name); - CUtil::CreateDirectoryEx(strPath); - m_File.OpenForWrite(_name,true); - NewFile=true; - HandleType=FILE_HANDLENORMAL; - SkipClose=false; - if (NameW!=NULL) - strcpyw(FileNameW,NameW); - else - *FileNameW=0; - if (Name!=NULL) - strcpy(FileName,Name); - else - WideToChar(NameW,FileName); - //AddFileToList(hFile); - AddFileToList(); - //return(hFile!=BAD_HANDLE); - return true; -} - - -//void File::AddFileToList(FileHandle hFile) -void File::AddFileToList() -{ - //if (hFile!=BAD_HANDLE) - //for (int I=0;I<sizeof(CreatedFiles)/sizeof(CreatedFiles[0]);I++) - /*for (int I=0;I<32;I++) - if (CreatedFiles[I]==NULL) - { - CreatedFiles[I]=this; - break; - }*/ -} - - -#if !defined(SHELL_EXT) && !defined(SFX_MODULE) -void File::TCreate(const char *Name,const wchar *NameW) -{ - if (!WCreate(Name,NameW)) - ErrHandler.Exit(FATAL_ERROR); -} -#endif - - -bool File::WCreate(const char *Name,const wchar *NameW) -{ - if (Create(Name,NameW)) - return(true); - ErrHandler.SetErrorCode(CREATE_ERROR); - ErrHandler.CreateErrorMsg(Name); - return(false); -} - - -bool File::Close() -{ - bool success=true; - /*if (HandleType!=FILE_HANDLENORMAL) - HandleType=FILE_HANDLENORMAL; - else - if (hFile!=BAD_HANDLE) - {*/ - if (!SkipClose) - { -#if defined(_WIN_32) || defined(TARGET_POSIX) - //success=CloseHandle(hFile) != FALSE; - m_File.Close(); -#else - success=fclose(hFile)!=EOF; -#endif -/* if (success || !RemoveCreatedActive) - //for (int I=0;I<sizeof(CreatedFiles)/sizeof(CreatedFiles[0]);I++) - for (int I=0;I<32;I++) - if (CreatedFiles[I]==this) - { - CreatedFiles[I]=NULL; - break; - }*/ - } - //hFile=BAD_HANDLE; - if (!success && AllowExceptions) - ErrHandler.CloseError(FileName); - //} - CloseCount++; - return(success); - //return(true); -} - - -void File::Flush() -{ - m_File.Flush(); -/*#ifdef _WIN_32 - FlushFileBuffers(hFile); -#else - fflush(hFile); -#endif*/ -} - - -bool File::Delete() -{ - /*if (HandleType!=FILE_HANDLENORMAL || !AllowDelete) - return(false); - if (hFile!=BAD_HANDLE) - Close(); - return(DelFile(FileName,FileNameW));*/ - return m_File.Delete(FileName); -} - - -bool File::Rename(const char *NewName) -{ - bool success=strcmp(FileName,NewName)==0; - if (!success) - success=rename(FileName,NewName)==0; - if (success) - { - strcpy(FileName,NewName); - *FileNameW=0; - } - return(success); -} - - -void File::Write(const void *Data,int Size) -{ -// Below commented code was left behind on spiffs request for possible later usage - /*if (Size==0) - return; -//#ifndef _WIN_CE -#if !defined(_WIN_CE) && !defined(_XBOX) - if (HandleType!=FILE_HANDLENORMAL) - switch(HandleType) - { - case FILE_HANDLESTD: -#ifdef _WIN_32 - hFile=GetStdHandle(STD_OUTPUT_HANDLE); -#else - hFile=stdout; -#endif - break; - case FILE_HANDLEERR: -#ifdef _WIN_32 - hFile=GetStdHandle(STD_ERROR_HANDLE); -#else - hFile=stderr; -#endif - break; - } -#endif*/ - while (1) - { - bool success = true; -#if defined(_WIN_32) || defined(TARGET_POSIX) - DWORD Written=0; - if (HandleType!=FILE_HANDLENORMAL) - { - const int MaxSize=0x4000; - for (int I = 0; I < Size && success; I += MaxSize) - success = m_File.Write((byte*)Data + I, Min(Size - I, MaxSize)) == Min(Size - I, MaxSize); - } - else - { - success = m_File.Write(Data, Size) == Size; - } -#else - success=fwrite(Data,1,Size,hFile)==Size && !ferror(hFile); -#endif - if (!success && AllowExceptions && HandleType==FILE_HANDLENORMAL) - { -#if defined(_WIN_32) && !defined(SFX_MODULE) && !defined(RARDLL) - int ErrCode=GetLastError(); - Int64 FilePos=Tell(); - Int64 FreeSize=GetFreeDisk(FileName); - SetLastError(ErrCode); - if (FreeSize>Size && FilePos-Size<=0xffffffff && FilePos+Size>0xffffffff) - ErrHandler.WriteErrorFAT(FileName); -#endif - if (ErrHandler.AskRepeatWrite(FileName)) - { -#if !defined(_WIN_32) && !defined(TARGET_POSIX) - clearerr(hFile); -#endif - if (Written<(unsigned int)Size && Written>0) - Seek(Tell()-Written,SEEK_SET); - continue; - } - ErrHandler.WriteError(NULL,FileName); - } - break; - } - LastWrite=true; -} - - -int File::Read(void *Data,int Size) -{ - Int64 FilePos = 0; - if (IgnoreReadErrors) - FilePos=Tell(); - int ReadSize; - while (true) - { - ReadSize=DirectRead(Data,Size); - if (ReadSize==-1) - { - ErrorType=FILE_READERROR; - if (AllowExceptions) - { - if (IgnoreReadErrors) - { - ReadSize=0; - for (int I=0;I<Size;I+=512) - { - Seek(FilePos+I,SEEK_SET); - int SizeToRead=Min(Size-I,512); - int ReadCode=DirectRead(Data,SizeToRead); - ReadSize+=(ReadCode==-1) ? 512:ReadCode; - } - } - else - { - if (HandleType==FILE_HANDLENORMAL && ErrHandler.AskRepeatRead(FileName)) - continue; - ErrHandler.ReadError(FileName); - } - } - } - break; - } - - return(ReadSize); -} - - -int File::DirectRead(void *Data,int Size) -{ - int Read = 0; - while (Size) - { - int nRead = m_File.Read(Data,Size); - if (nRead <= 0) - break; - Read += nRead; - Data = (void*)(((char*)Data)+nRead); - Size -= nRead; - } - //if (Read == 0) - // return -1; - - return Read; -#if 0 - #ifdef _WIN_32 - const int MaxDeviceRead=20000; -#endif -// Below commented code was left behind on spiffs request for possible later usage - -//#ifndef _WIN_CE -/*#if !defined(_WIN_CE) && !defined(_XBOX) - if (HandleType==FILE_HANDLESTD) - { -#ifdef _WIN_32 - if (Size>MaxDeviceRead) - Size=MaxDeviceRead; - hFile=GetStdHandle(STD_INPUT_HANDLE); -#else - hFile=stdin; -#endif - } -#endif -#ifdef _WIN_32 - DWORD Read; - //if (!ReadFile(hFile,Data,Size,&Read,NULL)) - Read = m_File.Read(Data,Size); - if ((Read != Size) && (m_File.GetPosition() != m_File.GetLength())) - { - if (IsDevice() && Size>MaxDeviceRead) - return(DirectRead(Data,MaxDeviceRead)); - if (HandleType==FILE_HANDLESTD && GetLastError()==ERROR_BROKEN_PIPE) - return(0); - return(-1); - } - return(Read); -#else - if (LastWrite) - { - fflush(hFile); - LastWrite=false; - } - clearerr(hFile); - int ReadSize=fread(Data,1,Size,hFile); - if (ferror(hFile)) - return(-1); - return(ReadSize); -#endif*/ -#endif -} - - -void File::Seek(Int64 Offset,int Method) -{ - if (!RawSeek(Offset,Method) && AllowExceptions) - ErrHandler.SeekError(FileName); -} - - -bool File::RawSeek(Int64 Offset,int Method) -{ - /*if (hFile==BAD_HANDLE) - return(true);*/ - /*if (!is64plus(Offset) && Method!=SEEK_SET) - { - Offset=(Method==SEEK_CUR ? Tell():FileLength())+Offset; - Method=SEEK_SET; - }*/ -#if defined(_WIN_32) || defined(TARGET_POSIX) - //LONG HighDist=int64to32(Offset>>32); - //if (SetFilePointer(hFile,int64to32(Offset),&HighDist,Method)==0xffffffff && - if (Offset > FileLength()) - return false; - - if (m_File.Seek(Offset,Method) < 0) - { - return(false); - } -#else - LastWrite=false; -#ifdef _LARGEFILE_SOURCE - if (fseeko(hFile,Offset,Method)!=0) -#else - if (fseek(hFile,int64to32(Offset),Method)!=0) -#endif - return(false); -#endif - return(true); -} - - -Int64 File::Tell() -{ -#if defined(_WIN_32) || defined(TARGET_POSIX) - //LONG HighDist=0; - //uint LowDist=SetFilePointer(hFile,0,&HighDist,FILE_CURRENT); - //Int64 pos = m_File.GetPosition(); - return m_File.GetPosition(); - /*if (LowDist==0xffffffff && GetLastError()!=NO_ERROR) - if (AllowExceptions) - ErrHandler.SeekError(FileName); - else - return(-1); - return(int32to64(HighDist,LowDist));*/ -#else -#ifdef _LARGEFILE_SOURCE - return(ftello(hFile)); -#else - return(ftell(hFile)); -#endif -#endif -} - - -void File::Prealloc(Int64 Size) -{ -#ifdef _WIN_32 - if (RawSeek(Size,SEEK_SET)) - { - Truncate(); - Seek(0,SEEK_SET); - } -#endif -} - - -byte File::GetByte() -{ - byte Byte=0; - Read(&Byte,1); - return(Byte); -} - - -void File::PutByte(byte Byte) -{ - Write(&Byte,1); -} - - -bool File::Truncate() -{ -#ifdef _WIN_32 - //return(SetEndOfFile(hFile) != FALSE); - return true; -#else - return(false); -#endif -} - - -void File::SetOpenFileTime(RarTime *ftm,RarTime *ftc,RarTime *fta) -{ -#ifdef _WIN_32 -// Below commented code was left behind on spiffs request for possible later usage - - /*bool sm=ftm!=NULL && ftm->IsSet(); - bool sc=ftc!=NULL && ftc->IsSet(); - bool sa=fta!=NULL && fta->IsSet(); - FILETIME fm,fc,fa; - if (sm) - ftm->GetWin32(&fm); - if (sc) - ftc->GetWin32(&fc); - if (sa) - fta->GetWin32(&fa); - //SetFileTime(hFile,sc ? &fc:NULL,sa ? &fa:NULL,sm ? &fm:NULL);*/ -#endif -} - - -void File::SetCloseFileTime(RarTime *ftm,RarTime *fta) -{ -#if defined(_UNIX) || defined(_EMX) - SetCloseFileTimeByName(FileName,ftm,fta); -#endif -} - - -void File::SetCloseFileTimeByName(const char *Name,RarTime *ftm,RarTime *fta) -{ -#if defined(_UNIX) || defined(_EMX) - bool setm=ftm!=NULL && ftm->IsSet(); - bool seta=fta!=NULL && fta->IsSet(); - if (setm || seta) - { - struct utimbuf ut; - if (setm) - ut.modtime=ftm->GetUnix(); - else - ut.modtime=fta->GetUnix(); - if (seta) - ut.actime=fta->GetUnix(); - else - ut.actime=ut.modtime; - utime(Name,&ut); - } -#endif -} - - -void File::GetOpenFileTime(RarTime *ft) -{ -#if defined(_WIN_32) || defined(TARGET_POSIX) -/* FILETIME FileTime; - GetFileTime(hFile,NULL,NULL,&FileTime); - *ft=FileTime;*/ -#endif -/* -#if defined(_UNIX) || defined(_EMX) - struct stat st; - fstat(fileno(hFile),&st); - *ft=st.st_mtime; -#endif -*/ -} - - -void File::SetOpenFileStat(RarTime *ftm,RarTime *ftc,RarTime *fta) -{ -#ifdef _WIN_32 - //SetOpenFileTime(ftm,ftc,fta); -#endif -} - - -void File::SetCloseFileStat(RarTime *ftm,RarTime *fta,uint FileAttr) -{ -#ifdef _WIN_32 - //SetFileAttr(FileName,FileNameW,FileAttr); -#endif -#ifdef _EMX - SetCloseFileTime(ftm,fta); - SetFileAttr(FileName,FileNameW,FileAttr); -#endif -#ifdef _UNIX - SetCloseFileTime(ftm,fta); - chmod(FileName,(mode_t)FileAttr); -#endif -} - - -Int64 File::FileLength() -{ - return (m_File.GetLength()); -} - - -void File::SetHandleType(FILE_HANDLETYPE Type) -{ - HandleType=Type; -} - - -bool File::IsDevice() -{ - /*if (hFile==BAD_HANDLE) - return(false);*/ -#if defined(_XBOX) || defined(TARGET_POSIX) || defined(_XBMC) - return false; -//#ifdef _WIN_32 -#elif defined(_WIN_32) - uint Type=GetFileType(hFile); - return(Type==FILE_TYPE_CHAR || Type==FILE_TYPE_PIPE); -#else - return(isatty(fileno(hFile))); -#endif -} - - -#ifndef SFX_MODULE -void File::fprintf(const char *fmt,...) -{ - va_list argptr; - va_start(argptr,fmt); - safebuf char Msg[2*NM+1024],OutMsg[2*NM+1024]; - vsprintf(Msg,fmt,argptr); -#ifdef _WIN_32 - for (int Src=0,Dest=0;;Src++) - { - char CurChar=Msg[Src]; - if (CurChar=='\n') - OutMsg[Dest++]='\r'; - OutMsg[Dest++]=CurChar; - if (CurChar==0) - break; - } -#else - strcpy(OutMsg,Msg); -#endif - Write(OutMsg,strlen(OutMsg)); - va_end(argptr); -} -#endif - - -bool File::RemoveCreated() -{ - RemoveCreatedActive++; - bool RetCode=true; - //for (int I=0;I<sizeof(CreatedFiles)/sizeof(CreatedFiles[0]);I++) - /*for (int I=0;I<32;I++) - if (CreatedFiles[I]!=NULL) - { - CreatedFiles[I]->SetExceptions(false); - bool success; - if (CreatedFiles[I]->NewFile) - success=CreatedFiles[I]->Delete(); - else - success=CreatedFiles[I]->Close(); - if (success) - CreatedFiles[I]=NULL; - else - RetCode=false; - } - RemoveCreatedActive--;*/ - return(RetCode); -} - - -#ifndef SFX_MODULE -long File::Copy(File &Dest,Int64 Length) -{ - Array<char> Buffer(0x10000); - long CopySize=0; - bool CopyAll=(Length==INT64ERR); - - while (CopyAll || Length>0) - { - Wait(); - int SizeToRead=(!CopyAll && Length<Buffer.Size()) ? int64to32(Length):Buffer.Size(); - int ReadSize=Read(&Buffer[0],SizeToRead); - if (ReadSize==0) - break; - Dest.Write(&Buffer[0],ReadSize); - CopySize+=ReadSize; - if (!CopyAll) - Length-=ReadSize; - } - return(CopySize); -} -#endif diff --git a/lib/UnrarXLib/file.hpp b/lib/UnrarXLib/file.hpp deleted file mode 100644 index 5eca0053ca..0000000000 --- a/lib/UnrarXLib/file.hpp +++ /dev/null @@ -1,101 +0,0 @@ -#ifndef _RAR_FILE_ -#define _RAR_FILE_ - -#ifdef _WIN_32 -typedef HANDLE FileHandle; -#define BAD_HANDLE INVALID_HANDLE_VALUE -#else -typedef FILE* FileHandle; -#define BAD_HANDLE NULL -#endif - -class RAROptions; - -enum FILE_HANDLETYPE {FILE_HANDLENORMAL,FILE_HANDLESTD,FILE_HANDLEERR}; - -enum FILE_ERRORTYPE {FILE_SUCCESS,FILE_NOTFOUND,FILE_READERROR}; - -struct FileStat -{ - uint FileAttr; - uint FileTime; - Int64 FileSize; - bool IsDir; -}; - -namespace XFILE { - class CFile; -}; - -class File -{ - private: - //void AddFileToList(FileHandle hFile); - void AddFileToList(); - - //FileHandle hFile; - XFILE::CFile &m_File; - - bool LastWrite; - FILE_HANDLETYPE HandleType; - bool SkipClose; - bool IgnoreReadErrors; - bool NewFile; - bool AllowDelete; - bool AllowExceptions; - protected: - bool OpenShared; - public: - char FileName[NM]; - wchar FileNameW[NM]; - - FILE_ERRORTYPE ErrorType; - - uint CloseCount; - public: - File(); - virtual ~File(); - void operator = (File &SrcFile); - bool Open(const char *Name,const wchar *NameW=NULL,bool OpenShared=false,bool Update=false); - void TOpen(const char *Name,const wchar *NameW=NULL); - bool WOpen(const char *Name,const wchar *NameW=NULL); - bool Create(const char *Name,const wchar *NameW=NULL); - void TCreate(const char *Name,const wchar *NameW=NULL); - bool WCreate(const char *Name,const wchar *NameW=NULL); - bool Close(); - void Flush(); - bool Delete(); - bool Rename(const char *NewName); - void Write(const void *Data,int Size); - int Read(void *Data,int Size); - int DirectRead(void *Data,int Size); - void Seek(Int64 Offset,int Method); - bool RawSeek(Int64 Offset,int Method); - Int64 Tell(); - void Prealloc(Int64 Size); - byte GetByte(); - void PutByte(byte Byte); - bool Truncate(); - void SetOpenFileTime(RarTime *ftm,RarTime *ftc=NULL,RarTime *fta=NULL); - void SetCloseFileTime(RarTime *ftm,RarTime *fta=NULL); - static void SetCloseFileTimeByName(const char *Name,RarTime *ftm,RarTime *fta); - void SetOpenFileStat(RarTime *ftm,RarTime *ftc,RarTime *fta); - void SetCloseFileStat(RarTime *ftm,RarTime *fta,uint FileAttr); - void GetOpenFileTime(RarTime *ft); - //bool IsOpened() {return(hFile!=BAD_HANDLE);}; - bool IsOpened() {return true;}; // wtf - Int64 FileLength(); - void SetHandleType(FILE_HANDLETYPE Type); - FILE_HANDLETYPE GetHandleType() {return(HandleType);}; - bool IsDevice(); - void fprintf(const char *fmt,...); - static bool RemoveCreated(); - //FileHandle GetHandle() {return(hFile);}; - void SetIgnoreReadErrors(bool Mode) {IgnoreReadErrors=Mode;}; - char *GetName() {return(FileName);} - long Copy(File &Dest,Int64 Length=INT64ERR); - void SetAllowDelete(bool Allow) {AllowDelete=Allow;} - void SetExceptions(bool Allow) {AllowExceptions=Allow;} -}; - -#endif diff --git a/lib/UnrarXLib/filefn.cpp b/lib/UnrarXLib/filefn.cpp deleted file mode 100644 index 591a29d3e1..0000000000 --- a/lib/UnrarXLib/filefn.cpp +++ /dev/null @@ -1,439 +0,0 @@ -#include "rar.hpp" -#ifdef TARGET_POSIX -#include "XFileUtils.h" -#endif - - -void SetDirTime(const char *Name,RarTime *ftm,RarTime *ftc,RarTime *fta) -{ -#ifdef _WIN_32 - - bool sm=ftm!=NULL && ftm->IsSet(); - bool sc=ftc!=NULL && ftc->IsSet(); - bool sa=ftc!=NULL && fta->IsSet(); - if (!WinNT()) - return; - HANDLE hFile=CreateFile(unrarxlib::ToW(Name).c_str(),GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE, - NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL); - if (hFile==INVALID_HANDLE_VALUE) - return; - FILETIME fm,fc,fa; - if (sm) - ftm->GetWin32(&fm); - if (sc) - ftc->GetWin32(&fc); - if (sa) - fta->GetWin32(&fa); - SetFileTime(hFile,sc ? &fc:NULL,sa ? &fa:NULL,sm ? &fm:NULL); - CloseHandle(hFile); -#endif -#if defined(_UNIX) || defined(_EMX) - File::SetCloseFileTimeByName(Name,ftm,fta); -#endif -} - - -bool IsRemovable(const char *Name) -{ -#if defined(TARGET_POSIX) - return false; -//#ifdef _WIN_32 -#elif defined(_WIN_32) - char Root[NM]; - GetPathRoot(Name,Root); - int Type=GetDriveType(*Root ? unrarxlib::ToW(Root).c_str():NULL); - return(Type==DRIVE_REMOVABLE || Type==DRIVE_CDROM); -#elif defined(_EMX) - char Drive=toupper(Name[0]); - return((Drive=='A' || Drive=='B') && Name[1]==':'); -#else - return(false); -#endif -} - - -#ifndef SFX_MODULE -Int64 GetFreeDisk(const char *Name) -{ -#if defined(TARGET_POSIX) - char Root[NM]; - GetPathRoot(Name,Root); - - ULARGE_INTEGER uiTotalSize,uiTotalFree,uiUserFree; - uiUserFree.u.LowPart=uiUserFree.u.HighPart=0; - if ( GetDiskFreeSpaceEx( Root, &uiUserFree, &uiTotalSize, &uiTotalFree ) ) { - return(int32to64(uiUserFree.u.HighPart,uiUserFree.u.LowPart)); - } - return 0; - -//#ifdef _WIN_32 -#elif defined(_WIN_32) - char Root[NM]; - GetPathRoot(Name,Root); - - typedef BOOL (WINAPI *GETDISKFREESPACEEX)( - LPCTSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER - ); - static GETDISKFREESPACEEX pGetDiskFreeSpaceEx=NULL; - - if (pGetDiskFreeSpaceEx==NULL) - { - HMODULE hKernel=GetModuleHandle(L"kernel32.dll"); - if (hKernel!=NULL) - pGetDiskFreeSpaceEx=(GETDISKFREESPACEEX)GetProcAddress(hKernel,"GetDiskFreeSpaceExA"); - } - if (pGetDiskFreeSpaceEx!=NULL) - { - GetFilePath(Name,Root); - ULARGE_INTEGER uiTotalSize,uiTotalFree,uiUserFree; - uiUserFree.u.LowPart=uiUserFree.u.HighPart=0; - if (pGetDiskFreeSpaceEx(*Root ? unrarxlib::ToW(Root).c_str():NULL,&uiUserFree,&uiTotalSize,&uiTotalFree) && - uiUserFree.u.HighPart<=uiTotalFree.u.HighPart) - return(int32to64(uiUserFree.u.HighPart,uiUserFree.u.LowPart)); - } - - DWORD SectorsPerCluster,BytesPerSector,FreeClusters,TotalClusters; - if (!GetDiskFreeSpace(*Root ? unrarxlib::ToW(Root).c_str():NULL,&SectorsPerCluster,&BytesPerSector,&FreeClusters,&TotalClusters)) - return(1457664); - Int64 FreeSize=SectorsPerCluster*BytesPerSector; - FreeSize=FreeSize*FreeClusters; - return(FreeSize); -#elif defined(_BEOS) - char Root[NM]; - GetFilePath(Name,Root); - dev_t Dev=dev_for_path(*Root ? Root:"."); - if (Dev<0) - return(1457664); - fs_info Info; - if (fs_stat_dev(Dev,&Info)!=0) - return(1457664); - Int64 FreeSize=Info.block_size; - FreeSize=FreeSize*Info.free_blocks; - return(FreeSize); -#elif defined(_UNIX) - return(1457664); -#elif defined(_EMX) - int Drive=(!isalpha(Name[0]) || Name[1]!=':') ? 0:toupper(Name[0])-'A'+1; - if (_osmode == OS2_MODE) - { - FSALLOCATE fsa; - if (DosQueryFSInfo(Drive,1,&fsa,sizeof(fsa))!=0) - return(1457664); - Int64 FreeSize=fsa.cSectorUnit*fsa.cbSector; - FreeSize=FreeSize*fsa.cUnitAvail; - return(FreeSize); - } - else - { - union REGS regs,outregs; - memset(®s,0,sizeof(regs)); - regs.h.ah=0x36; - regs.h.dl=Drive; - _int86 (0x21,®s,&outregs); - if (outregs.x.ax==0xffff) - return(1457664); - Int64 FreeSize=outregs.x.ax*outregs.x.cx; - FreeSize=FreeSize*outregs.x.bx; - return(FreeSize); - } -#else - #define DISABLEAUTODETECT - return(1457664); -#endif -} -#endif - - -bool FileExist(const char *Name,const wchar *NameW) -{ -#ifdef _WIN_32 -#if !defined(TARGET_POSIX) - if (WinNT() && NameW!=NULL && *NameW!=0) - return(GetFileAttributesW(NameW)!=0xffffffff); - else -#endif - return(GetFileAttributes(unrarxlib::ToW(Name).c_str())!=0xffffffff); -#elif defined(ENABLE_ACCESS) - return(access(Name,0)==0); -#else - struct FindData FD; - return(FindFile::FastFind(Name,NameW,&FD)); -#endif -} - - -bool WildFileExist(const char *Name,const wchar *NameW) -{ - if (IsWildcard(Name,NameW)) - { - FindFile Find; - Find.SetMask(Name); - Find.SetMaskW(NameW); - struct FindData fd; - return(Find.Next(&fd)); - } - return(FileExist(Name,NameW)); -} - - -bool IsDir(uint Attr) -{ -#if defined (_WIN_32) || defined(_EMX) - return(Attr!=0xffffffff && (Attr & 0x10)!=0); -#endif -#if defined(_UNIX) - return((Attr & 0xF000)==0x4000); -#endif -} - - -bool IsUnreadable(uint Attr) -{ -#if defined(_UNIX) && defined(S_ISFIFO) && defined(S_ISSOCK) && defined(S_ISCHR) - return(S_ISFIFO(Attr) || S_ISSOCK(Attr) || S_ISCHR(Attr)); -#endif - return(false); -} - - -bool IsLabel(uint Attr) -{ -#if defined (_WIN_32) || defined(_EMX) - return((Attr & 8)!=0); -#else - return(false); -#endif -} - - -bool IsLink(uint Attr) -{ -#ifdef _UNIX - return((Attr & 0xF000)==0xA000); -#endif - return(false); -} - - - - - - -bool IsDeleteAllowed(uint FileAttr) -{ -#if defined(_WIN_32) || defined(_EMX) - return((FileAttr & (FA_RDONLY|FA_SYSTEM|FA_HIDDEN))==0); -#else - return((FileAttr & (S_IRUSR|S_IWUSR))==(S_IRUSR|S_IWUSR)); -#endif -} - - -void PrepareToDelete(const char *Name,const wchar *NameW) -{ -#if defined(_WIN_32) || defined(_EMX) - SetFileAttr(Name,NameW,0); -#endif -#ifdef _UNIX - chmod(Name,S_IRUSR|S_IWUSR|S_IXUSR); -#endif -} - - -uint GetFileAttr(const char *Name,const wchar *NameW) -{ -#ifdef _WIN_32 -#if !defined(TARGET_POSIX) - if (WinNT() && NameW!=NULL && *NameW!=0) - return(GetFileAttributesW(NameW)); - else -#endif - return(GetFileAttributes(unrarxlib::ToW(Name).c_str())); -#elif defined(_DJGPP) - return(_chmod(Name,0)); -#else - struct stat st; - if (stat(Name,&st)!=0) - return(0); -#ifdef _EMX - return(st.st_attr); -#else - return(st.st_mode); -#endif -#endif -} - - -bool SetFileAttr(const char *Name,const wchar *NameW,uint Attr) -{ - bool success; -#ifdef _WIN_32 -#if !defined(TARGET_POSIX) - if (WinNT() && NameW!=NULL && *NameW!=0) - success=SetFileAttributesW(NameW,Attr)!=0; - else -#endif - success=SetFileAttributes(unrarxlib::ToW(Name).c_str(),Attr)!=0; -#elif defined(_DJGPP) - success=_chmod(Name,1,Attr)!=-1; -#elif defined(_EMX) - success=__chmod(Name,1,Attr)!=-1; -#elif defined(_UNIX) - success=chmod(Name,(mode_t)Attr)==0; -#else - success=false; -#endif - return(success); -} - - -void ConvertNameToFull(const char *Src,char *Dest) -{ -#ifdef _WIN_32 -//#ifndef _WIN_CE -#if !defined(_WIN_CE) && !defined(TARGET_POSIX) - wchar_t FullName[NM],*NamePtr; - if (GetFullPathName(unrarxlib::ToW(Src).c_str(),sizeof(FullName),FullName,&NamePtr)) - strcpy(Dest,unrarxlib::FromW(FullName).c_str()); - else -#endif - if (Src!=Dest) - strcpy(Dest,Src); -#else - char FullName[NM]; - if (IsPathDiv(*Src) || IsDiskLetter(Src)) - strcpy(FullName,Src); - else - { - if (getcwd(FullName,sizeof(FullName))) - { - AddEndSlash(FullName); - strcat(FullName,Src); - } - } - strcpy(Dest,FullName); -#endif -} - - -#ifndef SFX_MODULE -void ConvertNameToFull(const wchar *Src,wchar *Dest) -{ - if (Src==NULL || *Src==0) - { - *Dest=0; - return; - } -#ifdef _WIN_32 -#ifndef _WIN_CE - if (WinNT()) -#endif - { -//#ifndef _WIN_CE -#if !defined(_WIN_CE) && !defined(TARGET_POSIX) - wchar FullName[NM],*NamePtr; - if (GetFullPathNameW(Src,sizeof(FullName)/sizeof(FullName[0]),FullName,&NamePtr)) - strcpyw(Dest,FullName); - else -#endif - if (Src!=Dest) - strcpyw(Dest,Src); - } -#ifndef _WIN_CE - else - { - char AnsiName[NM]; - WideToChar(Src,AnsiName); - ConvertNameToFull(AnsiName,AnsiName); - CharToWide(AnsiName,Dest); - } -#endif -#else - char AnsiName[NM]; - WideToChar(Src,AnsiName); - ConvertNameToFull(AnsiName,AnsiName); - CharToWide(AnsiName,Dest); -#endif -} -#endif - - -#ifndef SFX_MODULE -char *MkTemp(char *Name) -{ - int Length=strlen(Name); - if (Length<=6) - return(NULL); - int Random=clock(); - for (int Attempt=0;;Attempt++) - { - sprintf(Name+Length-6,"%06u",Random+Attempt); - Name[Length-4]='.'; - if (!FileExist(Name)) - break; - if (Attempt==1000) - return(NULL); - } - return(Name); -} -#endif - - - - -#ifndef SFX_MODULE -uint CalcFileCRC(File *SrcFile,Int64 Size) -{ - SaveFilePos SavePos(*SrcFile); - const int BufSize=0x10000; - Array<byte> Data(BufSize); - Int64 BlockCount=0; - uint DataCRC=0xffffffff; - int ReadSize; - - - SrcFile->Seek(0,SEEK_SET); - while ((ReadSize=SrcFile->Read(&Data[0],int64to32(Size==INT64ERR ? Int64(BufSize):Min(Int64(BufSize),Size))))!=0) - { - ++BlockCount; - if ((BlockCount & 15)==0) - { - Wait(); - } - DataCRC=CRC(DataCRC,&Data[0],ReadSize); - if (Size!=INT64ERR) - Size-=ReadSize; - } - return(DataCRC^0xffffffff); -} -#endif - - -bool RenameFile(const char *SrcName,const wchar *SrcNameW,const char *DestName,const wchar *DestNameW) -{ - return(rename(SrcName,DestName)==0); -} - - -bool DelFile(const char *Name) -{ - return(DelFile(Name,NULL)); -} - - -bool DelFile(const char *Name,const wchar *NameW) -{ - return(remove(Name)==0); -} - - -bool DelDir(const char *Name) -{ - return(DelDir(Name,NULL)); -} - - -bool DelDir(const char *Name,const wchar *NameW) -{ - return(rmdir(Name)==0); -} diff --git a/lib/UnrarXLib/filefn.hpp b/lib/UnrarXLib/filefn.hpp deleted file mode 100644 index cffbc507b0..0000000000 --- a/lib/UnrarXLib/filefn.hpp +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef _RAR_FILEFN_ -#define _RAR_FILEFN_ - -void SetDirTime(const char *Name,RarTime *ftm,RarTime *ftc,RarTime *fta); -bool IsRemovable(const char *Name); -Int64 GetFreeDisk(const char *Name); -bool FileExist(const char *Name,const wchar *NameW=NULL); -bool WildFileExist(const char *Name,const wchar *NameW=NULL); -bool IsDir(uint Attr); -bool IsUnreadable(uint Attr); -bool IsLabel(uint Attr); -bool IsLink(uint Attr); -void SetSFXMode(const char *FileName); -void EraseDiskContents(const char *FileName); -bool IsDeleteAllowed(uint FileAttr); -void PrepareToDelete(const char *Name,const wchar *NameW=NULL); -uint GetFileAttr(const char *Name,const wchar *NameW=NULL); -bool SetFileAttr(const char *Name,const wchar *NameW,uint Attr); -void ConvertNameToFull(const char *Src,char *Dest); -void ConvertNameToFull(const wchar *Src,wchar *Dest); -char* MkTemp(char *Name); - - -uint CalcFileCRC(File *SrcFile,Int64 Size=INT64ERR); -bool RenameFile(const char *SrcName,const wchar *SrcNameW,const char *DestName,const wchar *DestNameW); -bool DelFile(const char *Name); -bool DelFile(const char *Name,const wchar *NameW); -bool DelDir(const char *Name); -bool DelDir(const char *Name,const wchar *NameW); - -#endif diff --git a/lib/UnrarXLib/filestr.cpp b/lib/UnrarXLib/filestr.cpp deleted file mode 100644 index ae7eeb46e7..0000000000 --- a/lib/UnrarXLib/filestr.cpp +++ /dev/null @@ -1,139 +0,0 @@ -#include "rar.hpp" - -static bool IsUnicode(byte *Data,int Size); - -bool ReadTextFile(char *Name,StringList *List,bool Config,bool AbortOnError, - bool ConvertToAnsi,bool Unquote,bool SkipComments) -{ - char FileName[NM]; - if (Config) - GetConfigName(Name,FileName,true); - else - strcpy(FileName,Name); - - File SrcFile; - if (*FileName) - { - bool OpenCode=AbortOnError ? SrcFile.WOpen(FileName):SrcFile.Open(FileName); - - if (!OpenCode) - { - if (AbortOnError) - ErrHandler.Exit(OPEN_ERROR); - return(false); - } - } - else - SrcFile.SetHandleType(FILE_HANDLESTD); - - unsigned int DataSize=0,ReadSize; - const int ReadBlock=1024; - Array<char> Data(ReadBlock+5); - while ((ReadSize=SrcFile.Read(&Data[DataSize],ReadBlock))!=0) - { - DataSize+=ReadSize; - Data.Add(ReadSize); - } - - memset(&Data[DataSize],0,5); - - if (IsUnicode((byte *)&Data[0],DataSize)) - { - wchar *CurStr=(wchar *)&Data[2]; - Array<char> AnsiName; - - while (*CurStr!=0) - { - wchar *NextStr=CurStr,*CmtPtr=NULL; - while (*NextStr!='\r' && *NextStr!='\n' && *NextStr!=0) - { - if (SkipComments && NextStr[0]=='/' && NextStr[1]=='/') - { - *NextStr=0; - CmtPtr=NextStr; - } - NextStr++; - } - *NextStr=0; - for (wchar *SpacePtr=(CmtPtr ? CmtPtr:NextStr)-1;SpacePtr>=CurStr;SpacePtr--) - { - if (*SpacePtr!=' ' && *SpacePtr!='\t') - break; - *SpacePtr=0; - } - if (*CurStr) - { - int Length=strlenw(CurStr); - int AddSize=Length-AnsiName.Size()+1; - if (AddSize>0) - AnsiName.Add(AddSize); - if (Unquote && *CurStr=='\"' && CurStr[Length-1]=='\"') - { - CurStr[Length-1]=0; - CurStr++; - } - WideToChar(CurStr,&AnsiName[0]); - List->AddString(&AnsiName[0],CurStr); - } - CurStr=NextStr+1; - while (*CurStr=='\r' || *CurStr=='\n') - CurStr++; - } - } - else - { - char *CurStr=&Data[0]; - while (*CurStr!=0) - { - char *NextStr=CurStr,*CmtPtr=NULL; - while (*NextStr!='\r' && *NextStr!='\n' && *NextStr!=0) - { - if (SkipComments && NextStr[0]=='/' && NextStr[1]=='/') - { - *NextStr=0; - CmtPtr=NextStr; - } - NextStr++; - } - *NextStr=0; - for (char *SpacePtr=(CmtPtr ? CmtPtr:NextStr)-1;SpacePtr>=CurStr;SpacePtr--) - { - if (*SpacePtr!=' ' && *SpacePtr!='\t') - break; - *SpacePtr=0; - } - if (*CurStr) - { - if (Unquote && *CurStr=='\"') - { - int Length=strlen(CurStr); - if (CurStr[Length-1]=='\"') - { - CurStr[Length-1]=0; - CurStr++; - } - } -#if defined(_WIN_32) && !defined(TARGET_POSIX) - //if (ConvertToAnsi) - // OemToChar(CurStr,CurStr); -#endif - List->AddString(CurStr); - } - CurStr=NextStr+1; - while (*CurStr=='\r' || *CurStr=='\n') - CurStr++; - } - } - return(true); -} - - -bool IsUnicode(byte *Data,int Size) -{ - if (Size<4 || Data[0]!=0xff || Data[1]!=0xfe) - return(false); - for (int I=2;I<Size;I++) - if (Data[I]<32) - return(true); - return(false); -} diff --git a/lib/UnrarXLib/filestr.hpp b/lib/UnrarXLib/filestr.hpp deleted file mode 100644 index b2bcbe0e6e..0000000000 --- a/lib/UnrarXLib/filestr.hpp +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef _RAR_FILESTR_ -#define _RAR_FILESTR_ - -bool ReadTextFile(char *Name,StringList *List,bool Config, - bool AbortOnError=false,bool ConvertToAnsi=false, - bool Unquote=false,bool SkipComments=false); - -#endif diff --git a/lib/UnrarXLib/find.cpp b/lib/UnrarXLib/find.cpp deleted file mode 100644 index 724645cefd..0000000000 --- a/lib/UnrarXLib/find.cpp +++ /dev/null @@ -1,288 +0,0 @@ -#include "rar.hpp" - -FindFile::FindFile() -{ - *FindMask=0; - *FindMaskW=0; - FirstCall=TRUE; -#ifdef _WIN_32 - hFind=INVALID_HANDLE_VALUE; -#else - dirp=NULL; -#endif -} - - -FindFile::~FindFile() -{ -#ifdef _WIN_32 - if (hFind!=INVALID_HANDLE_VALUE) - FindClose(hFind); -#else - if (dirp!=NULL) - closedir(dirp); -#endif -} - - -void FindFile::SetMask(const char *FindMask) -{ - strcpy(FindFile::FindMask,FindMask); - if (*FindMaskW==0) - CharToWide(FindMask,FindMaskW); - FirstCall=TRUE; -} - - -void FindFile::SetMaskW(const wchar *FindMaskW) -{ - if (FindMaskW==NULL) - return; - strcpyw(FindFile::FindMaskW,FindMaskW); - if (*FindMask==0) - WideToChar(FindMaskW,FindMask); - FirstCall=TRUE; -} - - -bool FindFile::Next(struct FindData *fd,bool GetSymLink) -{ - fd->Error=false; - if (*FindMask==0) - return(false); -#ifdef _WIN_32 - if (FirstCall) - { - if ((hFind=Win32Find(INVALID_HANDLE_VALUE,FindMask,FindMaskW,fd))==INVALID_HANDLE_VALUE) - return(false); - } - else - if (Win32Find(hFind,FindMask,FindMaskW,fd)==INVALID_HANDLE_VALUE) - return(false); -#else - if (FirstCall) - { - char DirName[NM]; - strcpy(DirName,FindMask); - RemoveNameFromPath(DirName); - if (*DirName==0) - strcpy(DirName,"."); -/* - else - { - int Length=strlen(DirName); - if (Length>1 && DirName[Length-1]==CPATHDIVIDER && (Length!=3 || !IsDriveDiv(DirName[1]))) - DirName[Length-1]=0; - } -*/ - if ((dirp=opendir(DirName))==NULL) - { - fd->Error=(errno!=ENOENT); - return(false); - } - } - while (1) - { - struct dirent *ent=readdir(dirp); - if (ent==NULL) - return(false); - if (strcmp(ent->d_name,".")==0 || strcmp(ent->d_name,"..")==0) - continue; - if (CmpName(FindMask,ent->d_name,MATCH_NAMES)) - { - char FullName[NM]; - strcpy(FullName,FindMask); - strcpy(PointToName(FullName),ent->d_name); - if (!FastFind(FullName,NULL,fd,GetSymLink)) - { - ErrHandler.OpenErrorMsg(FullName); - continue; - } - strcpy(fd->Name,FullName); - break; - } - } - *fd->NameW=0; -#ifdef _APPLE - if (!LowAscii(fd->Name)) - UtfToWide(fd->Name,fd->NameW,sizeof(fd->NameW)); -#elif defined(UNICODE_SUPPORTED) - if (!LowAscii(fd->Name) && UnicodeEnabled()) - CharToWide(fd->Name,fd->NameW); -#endif -#endif - fd->IsDir=IsDir(fd->FileAttr); - FirstCall=FALSE; - char *Name=PointToName(fd->Name); - if (strcmp(Name,".")==0 || strcmp(Name,"..")==0) - return(Next(fd)); - return(true); -} - - -bool FindFile::FastFind(const char *FindMask,const wchar *FindMaskW,struct FindData *fd,bool GetSymLink) -{ - fd->Error=false; -#ifndef _UNIX - if (IsWildcard(FindMask,FindMaskW)) - return(false); -#endif -#ifdef _WIN_32 - HANDLE hFind=Win32Find(INVALID_HANDLE_VALUE,FindMask,FindMaskW,fd); - if (hFind==INVALID_HANDLE_VALUE) - return(false); - FindClose(hFind); -#else - struct stat st; - if (GetSymLink) - { -#ifdef SAVE_LINKS - if (lstat(FindMask,&st)!=0) -#else - if (stat(FindMask,&st)!=0) -#endif - { - fd->Error=(errno!=ENOENT); - return(false); - } - } - else - if (stat(FindMask,&st)!=0) - { - fd->Error=(errno!=ENOENT); - return(false); - } -#ifdef _DJGPP - fd->FileAttr=chmod(FindMask,0); -#elif defined(_EMX) - fd->FileAttr=st.st_attr; -#else - fd->FileAttr=st.st_mode; -#endif - fd->IsDir=IsDir(st.st_mode); - fd->Size=st.st_size; - fd->mtime=st.st_mtime; - fd->atime=st.st_atime; - fd->ctime=st.st_ctime; - fd->FileTime=fd->mtime.GetDos(); - strcpy(fd->Name,FindMask); - *fd->NameW=0; -#ifdef _APPLE - if (!LowAscii(fd->Name)) - UtfToWide(fd->Name,fd->NameW,sizeof(fd->NameW)); -#elif defined(UNICODE_SUPPORTED) - if (!LowAscii(fd->Name) && UnicodeEnabled()) - CharToWide(fd->Name,fd->NameW); -#endif -#endif - fd->IsDir=IsDir(fd->FileAttr); - return(true); -} - - -#ifdef _WIN_32 -HANDLE FindFile::Win32Find(HANDLE hFind,const char *Mask,const wchar *MaskW,struct FindData *fd) -{ -#if !defined(TARGET_POSIX) -#ifndef _WIN_CE - if (WinNT()) -#endif - { - wchar WideMask[NM]; - if (MaskW!=NULL && *MaskW!=0) - strcpyw(WideMask,MaskW); - else - CharToWide(Mask,WideMask); - - WIN32_FIND_DATAW FindData; - if (hFind==INVALID_HANDLE_VALUE) - { - hFind=FindFirstFileW(WideMask,&FindData); - if (hFind==INVALID_HANDLE_VALUE) - { - int SysErr=GetLastError(); - fd->Error=(SysErr!=ERROR_FILE_NOT_FOUND && - SysErr!=ERROR_PATH_NOT_FOUND && - SysErr!=ERROR_NO_MORE_FILES); - } - } - else - if (!FindNextFileW(hFind,&FindData)) - { - hFind=INVALID_HANDLE_VALUE; - fd->Error=GetLastError()!=ERROR_NO_MORE_FILES; - } - - if (hFind!=INVALID_HANDLE_VALUE) - { - strcpyw(fd->NameW,WideMask); - strcpyw(PointToName(fd->NameW),FindData.cFileName); - WideToChar(fd->NameW,fd->Name); - fd->Size=int32to64(FindData.nFileSizeHigh,FindData.nFileSizeLow); - fd->FileAttr=FindData.dwFileAttributes; - WideToChar(FindData.cAlternateFileName,fd->ShortName); - fd->ftCreationTime=FindData.ftCreationTime; - fd->ftLastAccessTime=FindData.ftLastAccessTime; - fd->ftLastWriteTime=FindData.ftLastWriteTime; - fd->mtime=FindData.ftLastWriteTime; - fd->ctime=FindData.ftCreationTime; - fd->atime=FindData.ftLastAccessTime; - fd->FileTime=fd->mtime.GetDos(); - -#ifndef _WIN_CE - if (LowAscii(fd->NameW)) - *fd->NameW=0; -#endif - } - } -#ifndef _WIN_CE - else -#endif - { - char CharMask[NM]; - if (Mask!=NULL && *Mask!=0) - strcpy(CharMask,Mask); - else - WideToChar(MaskW,CharMask); - - WIN32_FIND_DATA FindData; - if (hFind==INVALID_HANDLE_VALUE) - { - hFind=FindFirstFile(unrarxlib::ToW(CharMask).c_str(),&FindData); - if (hFind==INVALID_HANDLE_VALUE) - { - int SysErr=GetLastError(); - fd->Error=SysErr!=ERROR_FILE_NOT_FOUND && SysErr!=ERROR_PATH_NOT_FOUND; - } - } - else - if (!FindNextFile(hFind,&FindData)) - { - hFind=INVALID_HANDLE_VALUE; - fd->Error=GetLastError()!=ERROR_NO_MORE_FILES; - } - - if (hFind!=INVALID_HANDLE_VALUE) - { - strcpy(fd->Name,CharMask); - strcpy(PointToName(fd->Name),unrarxlib::FromW(FindData.cFileName).c_str()); - CharToWide(fd->Name,fd->NameW); - fd->Size=int32to64(FindData.nFileSizeHigh,FindData.nFileSizeLow); - fd->FileAttr=FindData.dwFileAttributes; - strcpy(fd->ShortName,unrarxlib::FromW(FindData.cAlternateFileName).c_str()); - fd->ftCreationTime=FindData.ftCreationTime; - fd->ftLastAccessTime=FindData.ftLastAccessTime; - fd->ftLastWriteTime=FindData.ftLastWriteTime; - fd->mtime=FindData.ftLastWriteTime; - fd->ctime=FindData.ftCreationTime; - fd->atime=FindData.ftLastAccessTime; - fd->FileTime=fd->mtime.GetDos(); - if (LowAscii(fd->Name)) - *fd->NameW=0; - } - } -#endif - return(hFind); -} -#endif - diff --git a/lib/UnrarXLib/find.hpp b/lib/UnrarXLib/find.hpp deleted file mode 100644 index 81548199c3..0000000000 --- a/lib/UnrarXLib/find.hpp +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef _RAR_FINDDATA_ -#define _RAR_FINDDATA_ - -struct FindData -{ - char Name[NM]; - wchar NameW[NM]; - Int64 Size; - uint FileAttr; - uint FileTime; - bool IsDir; - RarTime mtime; - RarTime ctime; - RarTime atime; -#ifdef _WIN_32 - char ShortName[NM]; - FILETIME ftCreationTime; - FILETIME ftLastAccessTime; - FILETIME ftLastWriteTime; -#endif - bool Error; -}; - -class FindFile -{ - private: -#ifdef _WIN_32 - static HANDLE Win32Find(HANDLE hFind,const char *Mask,const wchar *MaskW,struct FindData *fd); -#endif - - char FindMask[NM]; - wchar FindMaskW[NM]; - int FirstCall; -#ifdef _WIN_32 - HANDLE hFind; -#else - DIR *dirp; -#endif - public: - FindFile(); - ~FindFile(); - void SetMask(const char *FindMask); - void SetMaskW(const wchar *FindMaskW); - bool Next(struct FindData *fd,bool GetSymLink=false); - static bool FastFind(const char *FindMask,const wchar *FindMaskW,struct FindData *fd,bool GetSymLink=false); -}; - -#endif diff --git a/lib/UnrarXLib/getbits.cpp b/lib/UnrarXLib/getbits.cpp deleted file mode 100644 index 71ecfc875c..0000000000 --- a/lib/UnrarXLib/getbits.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include "rar.hpp" - -BitInput::BitInput() -{ - InBuf=new byte[MAX_SIZE]; -} - - -BitInput::~BitInput() -{ - delete[] InBuf; -} - - -void BitInput::faddbits(int Bits) -{ - addbits(Bits); -} - - -unsigned int BitInput::fgetbits() -{ - return(getbits()); -} diff --git a/lib/UnrarXLib/getbits.hpp b/lib/UnrarXLib/getbits.hpp deleted file mode 100644 index 8819f53ab5..0000000000 --- a/lib/UnrarXLib/getbits.hpp +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef _RAR_GETBITS_ -#define _RAR_GETBITS_ - -class BitInput -{ - public: - enum BufferSize {MAX_SIZE=0x8000}; - protected: - int InAddr,InBit; - public: - BitInput(); - ~BitInput(); - - byte *InBuf; - - void InitBitInput() - { - InAddr=InBit=0; - } - void addbits(int Bits) - { - Bits+=InBit; - InAddr+=Bits>>3; - InBit=Bits&7; - } - unsigned int getbits() - { - unsigned int BitField=(uint)InBuf[InAddr] << 16; - BitField|=(uint)InBuf[InAddr+1] << 8; - BitField|=(uint)InBuf[InAddr+2]; - BitField >>= (8-InBit); - return(BitField & 0xffff); - } - void faddbits(int Bits); - unsigned int fgetbits(); -}; -#endif diff --git a/lib/UnrarXLib/global.cpp b/lib/UnrarXLib/global.cpp deleted file mode 100644 index 593a057cbf..0000000000 --- a/lib/UnrarXLib/global.cpp +++ /dev/null @@ -1,4 +0,0 @@ -#define INCLUDEGLOBAL - - -#include "rar.hpp" diff --git a/lib/UnrarXLib/global.hpp b/lib/UnrarXLib/global.hpp deleted file mode 100644 index 35c6cf9130..0000000000 --- a/lib/UnrarXLib/global.hpp +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef _RAR_GLOBAL_ -#define _RAR_GLOBAL_ - -#ifdef INCLUDEGLOBAL - #define EXTVAR -#else - #define EXTVAR extern -#endif - -EXTVAR ErrorHandler ErrHandler; - - - -#endif diff --git a/lib/UnrarXLib/headers.hpp b/lib/UnrarXLib/headers.hpp deleted file mode 100644 index f719a7ec97..0000000000 --- a/lib/UnrarXLib/headers.hpp +++ /dev/null @@ -1,304 +0,0 @@ -#ifndef _RAR_HEADERS_ -#define _RAR_HEADERS_ - -#define SIZEOF_MARKHEAD 7 -#define SIZEOF_OLDMHD 7 -#define SIZEOF_NEWMHD 13 -#define SIZEOF_OLDLHD 21 -#define SIZEOF_NEWLHD 32 -#define SIZEOF_SHORTBLOCKHEAD 7 -#define SIZEOF_LONGBLOCKHEAD 11 -#define SIZEOF_SUBBLOCKHEAD 14 -#define SIZEOF_COMMHEAD 13 -#define SIZEOF_PROTECTHEAD 26 -#define SIZEOF_AVHEAD 14 -#define SIZEOF_SIGNHEAD 15 -#define SIZEOF_UOHEAD 18 -#define SIZEOF_MACHEAD 22 -#define SIZEOF_EAHEAD 24 -#define SIZEOF_BEEAHEAD 24 -#define SIZEOF_STREAMHEAD 26 - -#define PACK_VER 29 -#define PACK_CRYPT_VER 29 -#define UNP_VER 29 -#define CRYPT_VER 29 -#define AV_VER 20 -#define PROTECT_VER 20 - -#define MHD_VOLUME 0x0001 -#define MHD_COMMENT 0x0002 -#define MHD_LOCK 0x0004 -#define MHD_SOLID 0x0008 -#define MHD_PACK_COMMENT 0x0010 -#define MHD_NEWNUMBERING 0x0010 -#define MHD_AV 0x0020 -#define MHD_PROTECT 0x0040 -#define MHD_PASSWORD 0x0080 -#define MHD_FIRSTVOLUME 0x0100 - -#define LHD_SPLIT_BEFORE 0x0001 -#define LHD_SPLIT_AFTER 0x0002 -#define LHD_PASSWORD 0x0004 -#define LHD_COMMENT 0x0008 -#define LHD_SOLID 0x0010 - -#define LHD_WINDOWMASK 0x00e0 -#define LHD_WINDOW64 0x0000 -#define LHD_WINDOW128 0x0020 -#define LHD_WINDOW256 0x0040 -#define LHD_WINDOW512 0x0060 -#define LHD_WINDOW1024 0x0080 -#define LHD_WINDOW2048 0x00a0 -#define LHD_WINDOW4096 0x00c0 -#define LHD_DIRECTORY 0x00e0 - -#define LHD_LARGE 0x0100 -#define LHD_UNICODE 0x0200 -#define LHD_SALT 0x0400 -#define LHD_VERSION 0x0800 -#define LHD_EXTTIME 0x1000 -#define LHD_EXTFLAGS 0x2000 - -#define SKIP_IF_UNKNOWN 0x4000 -#define LONG_BLOCK 0x8000 - -#define EARC_NEXT_VOLUME 0x0001 -#define EARC_DATACRC 0x0002 -#define EARC_REVSPACE 0x0004 -#define EARC_VOLNUMBER 0x0008 - -enum HEADER_TYPE { - MARK_HEAD=0x72,MAIN_HEAD=0x73,FILE_HEAD=0x74,COMM_HEAD=0x75,AV_HEAD=0x76, - SUB_HEAD=0x77,PROTECT_HEAD=0x78,SIGN_HEAD=0x79,NEWSUB_HEAD=0x7a, - ENDARC_HEAD=0x7b -}; - -enum { EA_HEAD=0x100,UO_HEAD=0x101,MAC_HEAD=0x102,BEEA_HEAD=0x103, - NTACL_HEAD=0x104,STREAM_HEAD=0x105 }; - -enum HOST_SYSTEM { - HOST_MSDOS=0,HOST_OS2=1,HOST_WIN32=2,HOST_UNIX=3,HOST_MACOS=4, - HOST_BEOS=5,HOST_MAX -}; - -#define SUBHEAD_TYPE_CMT "CMT" -#define SUBHEAD_TYPE_ACL "ACL" -#define SUBHEAD_TYPE_STREAM "STM" -#define SUBHEAD_TYPE_UOWNER "UOW" -#define SUBHEAD_TYPE_AV "AV" -#define SUBHEAD_TYPE_RR "RR" -#define SUBHEAD_TYPE_OS2EA "EA2" -#define SUBHEAD_TYPE_BEOSEA "EABE" - -/* new file inherits a subblock when updating a host file */ -#define SUBHEAD_FLAGS_INHERITED 0x80000000 - -#define SUBHEAD_FLAGS_CMT_UNICODE 0x00000001 - -struct OldMainHeader -{ - byte Mark[4]; - ushort HeadSize; - byte Flags; -}; - - -struct OldFileHeader -{ - uint PackSize; - uint UnpSize; - ushort FileCRC; - ushort HeadSize; - uint FileTime; - byte FileAttr; - byte Flags; - byte UnpVer; - byte NameSize; - byte Method; -}; - - -struct MarkHeader -{ - byte Mark[7]; -}; - - -struct BaseBlock -{ - ushort HeadCRC; - HEADER_TYPE HeadType;//byte - ushort Flags; - ushort HeadSize; - - bool IsSubBlock() - { - if (HeadType==SUB_HEAD) - return(true); - if (HeadType==NEWSUB_HEAD && (Flags & LHD_SOLID)!=0) - return(true); - return(false); - } -}; - -struct BlockHeader:BaseBlock -{ - union { - uint DataSize; - uint PackSize; - }; -}; - - -struct MainHeader:BlockHeader -{ - ushort HighPosAV; - uint PosAV; -}; - - -#define SALT_SIZE 8 - -struct FileHeader:BlockHeader -{ - uint UnpSize; - byte HostOS; - uint FileCRC; - uint FileTime; - byte UnpVer; - byte Method; - ushort NameSize; - union { - uint FileAttr; - uint SubFlags; - }; -/* optional */ - uint HighPackSize; - uint HighUnpSize; -/* names */ - char FileName[NM]; - wchar FileNameW[NM]; -/* optional */ - Array<byte> SubData; - byte Salt[SALT_SIZE]; - - RarTime mtime; - RarTime ctime; - RarTime atime; - RarTime arctime; -/* dummy */ - Int64 FullPackSize; - Int64 FullUnpSize; - - void Clear(int SubDataSize) - { - SubData.Alloc(SubDataSize); - Flags=LONG_BLOCK; - SubFlags=0; - } - - bool CmpName(const char *Name) - { - return(strcmp(FileName,Name)==0); - } - - FileHeader& operator = (FileHeader &hd) - { - SubData.Reset(); - memcpy(this,&hd,sizeof(*this)); - SubData.CleanData(); - SubData=hd.SubData; - return(*this); - } -}; - - -struct EndArcHeader:BaseBlock -{ - uint ArcDataCRC; - ushort VolNumber; -}; - - -struct SubBlockHeader:BlockHeader -{ - ushort SubType; - byte Level; -}; - - -struct CommentHeader:BaseBlock -{ - ushort UnpSize; - byte UnpVer; - byte Method; - ushort CommCRC; -}; - - -struct ProtectHeader:BlockHeader -{ - byte Version; - ushort RecSectors; - uint TotalBlocks; - byte Mark[8]; -}; - - -struct AVHeader:BaseBlock -{ - byte UnpVer; - byte Method; - byte AVVer; - uint AVInfoCRC; -}; - - -struct SignHeader:BaseBlock -{ - uint CreationTime; - ushort ArcNameSize; - ushort UserNameSize; -}; - - -struct UnixOwnersHeader:SubBlockHeader -{ - ushort OwnerNameSize; - ushort GroupNameSize; -/* dummy */ - char OwnerName[NM]; - char GroupName[NM]; -}; - - -struct EAHeader:SubBlockHeader -{ - uint UnpSize; - byte UnpVer; - byte Method; - uint EACRC; -}; - - -struct StreamHeader:SubBlockHeader -{ - uint UnpSize; - byte UnpVer; - byte Method; - uint StreamCRC; - ushort StreamNameSize; -/* dummy */ - byte StreamName[NM]; -}; - - -struct MacFInfoHeader:SubBlockHeader -{ - uint fileType; - uint fileCreator; -}; - - -#endif diff --git a/lib/UnrarXLib/int64.cpp b/lib/UnrarXLib/int64.cpp deleted file mode 100644 index 996d0ea62d..0000000000 --- a/lib/UnrarXLib/int64.cpp +++ /dev/null @@ -1,274 +0,0 @@ -#include "rar.hpp" - -#ifndef NATIVE_INT64 - -Int64::Int64() -{ -} - - -Int64::Int64(uint n) -{ - HighPart=0; - LowPart=n; -} - - -Int64::Int64(uint HighPart,uint LowPart) -{ - Int64::HighPart=HighPart; - Int64::LowPart=LowPart; -} - - -/* -Int64 Int64::operator = (Int64 n) -{ - HighPart=n.HighPart; - LowPart=n.LowPart; - return(*this); -} -*/ - - -Int64 Int64::operator << (int n) -{ - Int64 res=*this; - while (n--) - { - res.HighPart<<=1; - if (res.LowPart & 0x80000000) - res.HighPart|=1; - res.LowPart<<=1; - } - return(res); -} - - -Int64 Int64::operator >> (int n) -{ - Int64 res=*this; - while (n--) - { - res.LowPart>>=1; - if (res.HighPart & 1) - res.LowPart|=0x80000000; - res.HighPart>>=1; - } - return(res); -} - - -Int64 operator / (Int64 n1,Int64 n2) -{ - if (n1.HighPart==0 && n2.HighPart==0) - return(Int64(0,n1.LowPart/n2.LowPart)); - int ShiftCount=0; - while (n1>n2) - { - n2=n2<<1; - if (++ShiftCount>64) - return(0); - } - Int64 res=0; - while (ShiftCount-- >= 0) - { - res=res<<1; - if (n1>=n2) - { - n1-=n2; - ++res; - } - n2=n2>>1; - } - return(res); -} - - -Int64 operator * (Int64 n1,Int64 n2) -{ - if (n1<0x10000 && n2<0x10000) - return(Int64(0,n1.LowPart*n2.LowPart)); - Int64 res=0; - for (int I=0;I<64;I++) - { - if (n2.LowPart & 1) - res+=n1; - n1=n1<<1; - n2=n2>>1; - } - return(res); -} - - -Int64 operator % (Int64 n1,Int64 n2) -{ - if (n1.HighPart==0 && n2.HighPart==0) - return(Int64(0,n1.LowPart%n2.LowPart)); - return(n1-n1/n2*n2); -} - - -Int64 operator + (Int64 n1,Int64 n2) -{ - n1.LowPart+=n2.LowPart; - if (n1.LowPart<n2.LowPart) - n1.HighPart++; - n1.HighPart+=n2.HighPart; - return(n1); -} - - -Int64 operator - (Int64 n1,Int64 n2) -{ - if (n1.LowPart<n2.LowPart) - n1.HighPart--; - n1.LowPart-=n2.LowPart; - n1.HighPart-=n2.HighPart; - return(n1); -} - - -Int64 operator += (Int64 &n1,Int64 n2) -{ - n1=n1+n2; - return(n1); -} - - -Int64 operator -= (Int64 &n1,Int64 n2) -{ - n1=n1-n2; - return(n1); -} - - -Int64 operator *= (Int64 &n1,Int64 n2) -{ - n1=n1*n2; - return(n1); -} - - -Int64 operator /= (Int64 &n1,Int64 n2) -{ - n1=n1/n2; - return(n1); -} - - -Int64 operator | (Int64 n1,Int64 n2) -{ - n1.LowPart|=n2.LowPart; - n1.HighPart|=n2.HighPart; - return(n1); -} - - -Int64 operator & (Int64 n1,Int64 n2) -{ - n1.LowPart&=n2.LowPart; - n1.HighPart&=n2.HighPart; - return(n1); -} - - -/* -inline void operator -= (Int64 &n1,unsigned int n2) -{ - if (n1.LowPart<n2) - n1.HighPart--; - n1.LowPart-=n2; -} - - -inline void operator ++ (Int64 &n) -{ - if (++n.LowPart == 0) - ++n.HighPart; -} - - -inline void operator -- (Int64 &n) -{ - if (n.LowPart-- == 0) - n.HighPart--; -} -*/ - -bool operator == (Int64 n1,Int64 n2) -{ - return(n1.LowPart==n2.LowPart && n1.HighPart==n2.HighPart); -} - - -bool operator > (Int64 n1,Int64 n2) -{ - return((int)n1.HighPart>(int)n2.HighPart || n1.HighPart==n2.HighPart && n1.LowPart>n2.LowPart); -} - - -bool operator < (Int64 n1,Int64 n2) -{ - return((int)n1.HighPart<(int)n2.HighPart || n1.HighPart==n2.HighPart && n1.LowPart<n2.LowPart); -} - - -bool operator != (Int64 n1,Int64 n2) -{ - return(n1.LowPart!=n2.LowPart || n1.HighPart!=n2.HighPart); -} - - -bool operator >= (Int64 n1,Int64 n2) -{ - return(n1>n2 || n1==n2); -} - - -bool operator <= (Int64 n1,Int64 n2) -{ - return(n1<n2 || n1==n2); -} - - -void Int64::Set(uint HighPart,uint LowPart) -{ - Int64::HighPart=HighPart; - Int64::LowPart=LowPart; -} -#endif - -void itoa(Int64 n,char *Str) -{ - if (n<=0xffffffff) - { - sprintf(Str,"%u",int64to32(n)); - return; - } - - char NumStr[50]; - int Pos=0; - - do - { - NumStr[Pos++]=int64to32(n%10)+'0'; - n=n/10; - } while (n!=0); - - for (int I=0;I<Pos;I++) - Str[I]=NumStr[Pos-I-1]; - Str[Pos]=0; -} - - -Int64 atoil(char *Str) -{ - Int64 n=0; - while (*Str>='0' && *Str<='9') - { - n=n*10+*Str-'0'; - Str++; - } - return(n); -} diff --git a/lib/UnrarXLib/int64.hpp b/lib/UnrarXLib/int64.hpp deleted file mode 100644 index a8057522e4..0000000000 --- a/lib/UnrarXLib/int64.hpp +++ /dev/null @@ -1,86 +0,0 @@ -#ifndef _RAR_INT64_ -#define _RAR_INT64_ - -#if defined(__BORLANDC__) || defined(_MSC_VER) -#define NATIVE_INT64 -typedef __int64 Int64; -#endif - -#if defined(__GNUC__) || defined(__HP_aCC) -#define NATIVE_INT64 -typedef long long Int64; -#endif - -#ifdef NATIVE_INT64 - -#define int64to32(x) ((uint)(x)) -#define int32to64(high,low) ((((Int64)(high))<<32)+(low)) -#define is64plus(x) (x>=0) - -#else - -class Int64 -{ - public: - Int64(); - Int64(uint n); - Int64(uint HighPart,uint LowPart); - -// Int64 operator = (Int64 n); - Int64 operator << (int n); - Int64 operator >> (int n); - - friend Int64 operator / (Int64 n1,Int64 n2); - friend Int64 operator * (Int64 n1,Int64 n2); - friend Int64 operator % (Int64 n1,Int64 n2); - friend Int64 operator + (Int64 n1,Int64 n2); - friend Int64 operator - (Int64 n1,Int64 n2); - friend Int64 operator += (Int64 &n1,Int64 n2); - friend Int64 operator -= (Int64 &n1,Int64 n2); - friend Int64 operator *= (Int64 &n1,Int64 n2); - friend Int64 operator /= (Int64 &n1,Int64 n2); - friend Int64 operator | (Int64 n1,Int64 n2); - friend Int64 operator & (Int64 n1,Int64 n2); - inline friend void operator -= (Int64 &n1,unsigned int n2) - { - if (n1.LowPart<n2) - n1.HighPart--; - n1.LowPart-=n2; - } - inline friend void operator ++ (Int64 &n) - { - if (++n.LowPart == 0) - ++n.HighPart; - } - inline friend void operator -- (Int64 &n) - { - if (n.LowPart-- == 0) - n.HighPart--; - } - friend bool operator == (Int64 n1,Int64 n2); - friend bool operator > (Int64 n1,Int64 n2); - friend bool operator < (Int64 n1,Int64 n2); - friend bool operator != (Int64 n1,Int64 n2); - friend bool operator >= (Int64 n1,Int64 n2); - friend bool operator <= (Int64 n1,Int64 n2); - - void Set(uint HighPart,uint LowPart); - uint GetLowPart() {return(LowPart);} - - uint LowPart; - uint HighPart; -}; - -inline uint int64to32(Int64 n) {return(n.GetLowPart());} -#define int32to64(high,low) (Int64((high),(low))) -#define is64plus(x) ((int)(x).HighPart>=0) - -#endif - -#define INT64ERR int32to64(0x80000000,0) -#define INT64MAX int32to64(0x7fffffff,0) - -void itoa(Int64 n,char *Str); -Int64 atoil(char *Str); - -#endif diff --git a/lib/UnrarXLib/isnt.cpp b/lib/UnrarXLib/isnt.cpp deleted file mode 100644 index 493a9eb918..0000000000 --- a/lib/UnrarXLib/isnt.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "rar.hpp" - -#ifdef _WIN_32 -int WinNT() -{ - static int dwPlatformId=-1,dwMajorVersion; - if (dwPlatformId==-1) - { - OSVERSIONINFO WinVer; - WinVer.dwOSVersionInfoSize=sizeof(WinVer); - GetVersionEx(&WinVer); - dwPlatformId=WinVer.dwPlatformId; - dwMajorVersion=WinVer.dwMajorVersion; - } - return(dwPlatformId==VER_PLATFORM_WIN32_NT ? dwMajorVersion:0); -} -#endif diff --git a/lib/UnrarXLib/isnt.hpp b/lib/UnrarXLib/isnt.hpp deleted file mode 100644 index 026523614f..0000000000 --- a/lib/UnrarXLib/isnt.hpp +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _RAR_ISNT_ -#define _RAR_ISNT_ - -int WinNT(); - -#endif diff --git a/lib/UnrarXLib/license.txt b/lib/UnrarXLib/license.txt deleted file mode 100755 index 29dcd0ab30..0000000000 --- a/lib/UnrarXLib/license.txt +++ /dev/null @@ -1,41 +0,0 @@ - ****** ***** ****** unRAR - free utility for RAR archives - ** ** ** ** ** ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ****** ******* ****** License for use and distribution of - ** ** ** ** ** ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ** ** ** ** ** ** FREE portable version - ~~~~~~~~~~~~~~~~~~~~~ - - The source code of unRAR utility is freeware. This means: - - 1. All copyrights to RAR and the utility unRAR are exclusively - owned by the author - Eugene Roshal. - - 2. The unRAR sources may be used in any software to handle RAR - archives without limitations free of charge, but cannot be used - to re-create the RAR compression algorithm, which is proprietary. - Distribution of modified unRAR sources in separate form or as a - part of other software is permitted, provided that it is clearly - stated in the documentation and source comments that the code may - not be used to develop a RAR (WinRAR) compatible archiver. - - 3. The unRAR utility may be freely distributed. No person or company - may charge a fee for the distribution of unRAR without written - permission from the copyright holder. - - 4. THE RAR ARCHIVER AND THE UNRAR UTILITY ARE DISTRIBUTED "AS IS". - NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED. YOU USE AT - YOUR OWN RISK. THE AUTHOR WILL NOT BE LIABLE FOR DATA LOSS, - DAMAGES, LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING - OR MISUSING THIS SOFTWARE. - - 5. Installing and using the unRAR utility signifies acceptance of - these terms and conditions of the license. - - 6. If you don't agree with terms of the license you must remove - unRAR files from your storage devices and cease to use the - utility. - - Thank you for your interest in RAR and unRAR. - - - Eugene Roshal
\ No newline at end of file diff --git a/lib/UnrarXLib/list.hpp b/lib/UnrarXLib/list.hpp deleted file mode 100644 index 7721ae521d..0000000000 --- a/lib/UnrarXLib/list.hpp +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _RAR_LIST_ -#define _RAR_LIST_ - -void ListArchive(CommandData *Cmd); - -#endif diff --git a/lib/UnrarXLib/loclang.hpp b/lib/UnrarXLib/loclang.hpp deleted file mode 100644 index 05eefdde01..0000000000 --- a/lib/UnrarXLib/loclang.hpp +++ /dev/null @@ -1,340 +0,0 @@ -#define MYesNo "_Yes_No" -#define MYesNoAll "_Yes_No_All" -#define MYesNoAllRenQ "_Yes_No_All_nEver_Rename_Quit" -#define MContinueQuit "_Continue_Quit" -#define MRetryAbort "_Retry_Abort" -#define MCopyright "\nRAR %s Copyright (c) 1993-%d Alexander Roshal %d %s %d" -#define MRegTo "\nRegistered to %s\n" -#define MShare "\nShareware version Type RAR -? for help\n" -#define MUCopyright "\nUNRAR %s freeware Copyright (c) 1993-%d Alexander Roshal\n" -#define MBeta "beta" -#define MMonthJan "Jan" -#define MMonthFeb "Feb" -#define MMonthMar "Mar" -#define MMonthApr "Apr" -#define MMonthMay "May" -#define MMonthJun "Jun" -#define MMonthJul "Jul" -#define MMonthAug "Aug" -#define MMonthSep "Sep" -#define MMonthOct "Oct" -#define MMonthNov "Nov" -#define MMonthDec "Dec" -#define MRARTitle1 "\nUsage: rar <command> -<switch 1> -<switch N> <archive> <files...>" -#define MUNRARTitle1 "\nUsage: unrar <command> -<switch 1> -<switch N> <archive> <files...>" -#define MRARTitle2 "\n <@listfiles...> <path_to_extract\\>" -#define MCHelpCmd "\n\n<Commands>" -#define MCHelpCmdA "\n a Add files to archive" -#define MCHelpCmdC "\n c Add archive comment" -#define MCHelpCmdCF "\n cf Add files comment" -#define MCHelpCmdCW "\n cw Write archive comment to file" -#define MCHelpCmdD "\n d Delete files from archive" -#define MCHelpCmdE "\n e Extract files to current directory" -#define MCHelpCmdF "\n f Freshen files in archive" -#define MCHelpCmdI "\n i[par]=<str> Find string in archives" -#define MCHelpCmdK "\n k Lock archive" -#define MCHelpCmdL "\n l[t,b] List archive [technical, bare]" -#define MCHelpCmdM "\n m[f] Move to archive [files only]" -#define MCHelpCmdP "\n p Print file to stdout" -#define MCHelpCmdR "\n r Repair archive" -#define MCHelpCmdRC "\n rc Reconstruct missing volumes" -#define MCHelpCmdRN "\n rn Rename archived files" -#define MCHelpCmdRR "\n rr[N] Add data recovery record" -#define MCHelpCmdRV "\n rv[N] Create recovery volumes" -#define MCHelpCmdS "\n s[name|-] Convert archive to or from SFX" -#define MCHelpCmdT "\n t Test archive files" -#define MCHelpCmdU "\n u Update files in archive" -#define MCHelpCmdV "\n v[t,b] Verbosely list archive [technical,bare]" -#define MCHelpCmdX "\n x Extract files with full path" -#define MCHelpSw "\n\n<Switches>" -#define MCHelpSwm "\n - Stop switches scanning" -#define MCHelpSwAC "\n ac Clear Archive attribute after compression or extraction" -#define MCHelpSwAD "\n ad Append archive name to destination path" -#define MCHelpSwAG "\n ag[format] Generate archive name using the current date" -#define MCHelpSwAO "\n ao Add files with Archive attribute set" -#define MCHelpSwAP "\n ap<path> Set path inside archive" -#define MCHelpSwAS "\n as Synchronize archive contents" -#define MCHelpSwAV "\n av Put authenticity verification (registered versions only)" -#define MCHelpSwAVm "\n av- Disable authenticity verification check" -#define MCHelpSwCm "\n c- Disable comments show" -#define MCHelpSwCFGm "\n cfg- Disable read configuration" -#define MCHelpSwCL "\n cl Convert names to lower case" -#define MCHelpSwCU "\n cu Convert names to upper case" -#define MCHelpSwDF "\n df Delete files after archiving" -#define MCHelpSwDH "\n dh Open shared files" -#define MCHelpSwDS "\n ds Disable name sort for solid archive" -#define MCHelpSwEa "\n e[+]<attr> Set file exclude and include attributes" -#define MCHelpSwED "\n ed Do not add empty directories" -#define MCHelpSwEE "\n ee Do not save and extract extended attributes" -#define MCHelpSwEN "\n en Do not put 'end of archive' block" -#define MCHelpSwEP "\n ep Exclude paths from names" -#define MCHelpSwEP1 "\n ep1 Exclude base directory from names" -#define MCHelpSwEP2 "\n ep2 Expand paths to full" -#define MCHelpSwEP3 "\n ep3 Expand paths to full including the drive letter" -#define MCHelpSwF "\n f Freshen files" -#define MCHelpSwHP "\n hp[password] Encrypt both file data and headers" -#define MCHelpSwIDP "\n id[c,d,p,q] Disable messages" -#define MCHelpSwIEML "\n ieml[addr] Send archive by email" -#define MCHelpSwIERR "\n ierr Send all messages to stderr" -#define MCHelpSwILOG "\n ilog[name] Log errors to file (registered versions only)" -#define MCHelpSwINUL "\n inul Disable all messages" -#define MCHelpSwIOFF "\n ioff Turn PC off after completing an operation" -#define MCHelpSwISND "\n isnd Enable sound" -#define MCHelpSwK "\n k Lock archive" -#define MCHelpSwKB "\n kb Keep broken extracted files" -#define MCHelpSwMn "\n m<0..5> Set compression level (0-store...3-default...5-maximal)" -#define MCHelpSwMC "\n mc<par> Set advanced compression parameters" -#define MCHelpSwMD "\n md<size> Dictionary size in KB (64,128,256,512,1024,2048,4096 or A-G)" -#define MCHelpSwMS "\n ms[ext;ext] Specify file types to store" -#define MCHelpSwN "\n n<file> Include only specified file" -#define MCHelpSwNa "\n n@ Read file names to include from stdin" -#define MCHelpSwNal "\n n@<list> Include files in specified list file" -#define MCHelpSwOp "\n o+ Overwrite existing files" -#define MCHelpSwOm "\n o- Do not overwrite existing files" -#define MCHelpSwOC "\n oc Set NTFS Compressed attribute" -#define MCHelpSwOL "\n ol Save symbolic links as the link instead of the file" -#define MCHelpSwOS "\n os Save NTFS streams" -#define MCHelpSwOW "\n ow Save or restore file owner and group" -#define MCHelpSwP "\n p[password] Set password" -#define MCHelpSwPm "\n p- Do not query password" -#define MCHelpSwR "\n r Recurse subdirectories" -#define MCHelpSwR0 "\n r0 Recurse subdirectories for wildcard names only" -#define MCHelpSwRI "\n ri<P>[:<S>] Set priority (0-default,1-min..15-max) and sleep time in ms" -#define MCHelpSwRR "\n rr[N] Add data recovery record" -#define MCHelpSwRV "\n rv[N] Create recovery volumes" -#define MCHelpSwS "\n s[<N>,v[-],e] Create solid archive" -#define MCHelpSwSm "\n s- Disable solid archiving" -#define MCHelpSwSFX "\n sfx[name] Create SFX archive" -#define MCHelpSwSI "\n si[name] Read data from standard input (stdin)" -#define MCHelpSwT "\n t Test files after archiving" -#define MCHelpSwTK "\n tk Keep original archive time" -#define MCHelpSwTL "\n tl Set archive time to latest file" -#define MCHelpSwTN "\n tn<time> Process files newer than <time>" -#define MCHelpSwTO "\n to<time> Process files older than <time>" -#define MCHelpSwTA "\n ta<date> Process files modified after <date> in YYYYMMDDHHMMSS format" -#define MCHelpSwTB "\n tb<date> Process files modified before <date> in YYYYMMDDHHMMSS format" -#define MCHelpSwTS "\n ts<m,c,a>[N] Save or restore file time (modification, creation, access)" -#define MCHelpSwU "\n u Update files" -#define MCHelpSwV "\n v Create volumes with size autodetection or list all volumes" -#define MCHelpSwVUnr "\n v List all volumes" -#define MCHelpSwVn "\n v<size>[k,b] Create volumes with size=<size>*1000 [*1024, *1]" -#define MCHelpSwVD "\n vd Erase disk contents before creating volume" -#define MCHelpSwVER "\n ver[n] File version control" -#define MCHelpSwVN "\n vn Use the old style volume naming scheme" -#define MCHelpSwVP "\n vp Pause before each volume" -#define MCHelpSwW "\n w<path> Assign work directory" -#define MCHelpSwX "\n x<file> Exclude specified file" -#define MCHelpSwXa "\n x@ Read file names to exclude from stdin" -#define MCHelpSwXal "\n x@<list> Exclude files in specified list file" -#define MCHelpSwY "\n y Assume Yes on all queries" -#define MCHelpSwZ "\n z<file> Read archive comment from file" -#define MBadArc "\nERROR: Bad archive %s\n" -#define MAskPsw "Enter password (will not be echoed)" -#define MAskPswEcho "Enter password" -#define MReAskPsw "\nReenter password: " -#define MFor " for " -#define MNotMatchPsw "\nERROR: Passwords do not match\n" -#define MErrWrite "Write error in the file %s" -#define MErrRead "Read error in the file %s" -#define MErrSeek "Seek error in the file %s" -#define MErrFClose "Cannot close the file %s" -#define MErrOutMem "Not enough memory" -#define MErrBrokenArc "Corrupt archive - use 'Repair' command" -#define MProgAborted "Program aborted" -#define MErrRename "\nCannot rename %s to %s" -#define MAbsNextVol "\nCannot find volume %s" -#define MBreak "\nUser break\n" -#define MAskCreatVol "\nCreate next volume ?" -#define MAskNextDisk "\nDisk full. Insert next" -#define MCreatVol "\n\nCreating %sarchive %s\n" -#define MAskNextVol "\nInsert disk with %s" -#define MTestVol "\n\nTesting archive %s\n" -#define MExtrVol "\n\nExtracting from %s\n" -#define MConverting "\nConverting %s" -#define MCvtToSFX "\nConvert archives to SFX" -#define MCvtFromSFX "\nRemoving SFX module" -#define MNotSFX "\n%s is not SFX archive" -#define MNotRAR "\n%s is not RAR archive" -#define MNotFirstVol "\n%s is not the first volume" -#define MCvtOldFormat "\n%s - cannot convert to SFX archive with old format" -#define MCannotCreate "\nCannot create %s" -#define MCannotOpen "\nCannot open %s" -#define MUnknownMeth "\nUnknown method in %s" -#define MVerRequired "\nYou need RAR %d.%d to unpack it" -#define MOk " OK" -#define MDone "\nDone" -#define MLockingArc "\nLocking archive" -#define MNotMdfOld "\n\nERROR: Cannot modify old format archive" -#define MNotMdfLock "\n\nERROR: Locked archive" -#define MNotMdfVol "\n\nERROR: Cannot modify volume" -#define MVerifyAV "\nVerifying authenticity information ... " -#define MFailedAV " Failed\n" -#define MStrAV1 "\n\nArchive %s" -#define MStrAV2 "\ncreated at %s" -#define MStrAV3 "\nby %s\n" -#define MLogFailedAV "Invalid authenticity information" -#define MAddingAV "\nAdding authenticity verification " -#define MAVOldStyle "\n\nOld style authenticity information" -#define MPackAskReg "\nEvaluation copy. Please register.\n" -#define MCreateArchive "\nCreating %sarchive %s\n" -#define MUpdateArchive "\nUpdating %sarchive %s\n" -#define MAddSolid "solid " -#define MAddFile "\nAdding %-58s " -#define MUpdFile "\nUpdating %-58s " -#define MAddPoints "\n... %-58s " -#define MCannotUpdPswSolid "\nERROR: Cannot update solid archives with password\n" -#define MMoveDelFiles "\n\nDeleting files %s..." -#define MMoveDelDirs "and directories" -#define MMoveDelFile "\nDeleting %-30s" -#define MMoveDeleted " deleted" -#define MMoveNotDeleted " NOT DELETED" -#define MClearAttrib "\n\nClearing attributes..." -#define MMoveDelDir "\nDeleting directory %-30s" -#define MWarErrFOpen "\nWARNING: Cannot open %d %s" -#define MErrOpenFiles "files" -#define MErrOpenFile "file" -#define MAddNoFiles "\nWARNING: No files" -#define MMdfEncrSol "\n%s: encrypted" -#define MCannotMdfEncrSol "\nCannot modify solid archive containing encrypted files" -#define MAddAnalyze "\nAnalyzing archived files: " -#define MRepacking "\nRepacking archived files: " -#define MCRCFailed "\n%-20s - CRC failed" -#define MExtrTest "\n\nTesting archive %s\n" -#define MExtracting "\n\nExtracting from %s\n" -#define MUseCurPsw "\n%s - use current password ?" -#define MCreatDir "\nCreating %-56s" -#define MExtrSkipFile "\nSkipping %-56s" -#define MExtrTestFile "\nTesting %-56s" -#define MExtrFile "\nExtracting %-56s" -#define MExtrPoints "\n... %-56s" -#define MExtrErrMkDir "\nCannot create directory %s" -#define MExtrPrinting "\n------ Printing %s\n\n" -#define MEncrBadCRC "\nEncrypted file: CRC failed in %s (password incorrect ?)" -#define MExtrNoFiles "\nNo files to extract" -#define MExtrAllOk "\nAll OK" -#define MExtrTotalErr "\nTotal errors: %ld" -#define MFileExists "\n\n%s already exists. Overwrite it ?" -#define MAskOverwrite "\nOverwrite %s ?" -#define MAskNewName "\nEnter new name: " -#define MLogMainHead "\nThe archive header is corrupt" -#define MLogFileHead "\n%s - the file header is corrupt" -#define MLogCommHead "\nThe comment header is corrupt\n" -#define MLogProtectHead "The data recovery header is corrupt" -#define MReadStdinCmt "\nReading comment from stdin\n" -#define MReadCommFrom "\nReading comment from %s" -#define MDelComment "\nDeleting comment from %s" -#define MAddComment "\nAdding comment to %s" -#define MFCommAdd "\nAdding file comments" -#define MAskFComm "\n\nReading comment for %s : %s from stdin\n" -#define MLogCommBrk "\nThe archive comment is corrupt" -#define MCommAskCont "\nPress 'Enter' to continue or 'Q' to quit:" -#define MLogBrokFCmt "\nThe file comment is corrupt" -#define MAbsDestName "\nDestination file name required" -#define MWriteCommTo "\nWrite comment to %s" -#define MCommNotPres "\nComment is not present" -#define MDelFrom "\nDeleting from %s" -#define MDeleting "\nDeleting %s" -#define MEraseArc "\nErasing empty archive %s" -#define MNoDelFiles "\nNo files to delete" -#define MLogTitle "\n\n-------- %2d %s %d, archive %s\n" -#define MPathTooLong "\nERROR: Path too long\n" -#define MListSolid "Solid " -#define MListSFX "SFX " -#define MListVol1 "volume" -#define MListVol2 "Volume" -#define MListArc1 "archive" -#define MListArc2 "Archive" -#define MListRecRec "\nRecovery record is present\n" -#define MListLock "\nLock is present\n" -#define MListPathComm "\nPathname/Comment\n " -#define MListName "\n Name " -#define MListTitle " Size Packed Ratio Date Time Attr CRC Meth Ver\n" -#define MListTechTitle " Host OS Solid Old\n" -#define MListEAHead "\n OS/2 extended attributes" -#define MListUOHead "\n Unix Owner/Group data: %-14s %-14s" -#define MListBeEAHead "\n BeOS extended attributes" -#define MListNTACLHead "\n NTFS security data" -#define MListStrmHead "\n NTFS stream: %s" -#define MListUnkHead "\n Unknown subheader type: 0x%04x" -#define MFileComment "\nComment: " -#define MYes "Yes" -#define MNo "No" -#define MListNoFiles " 0 files\n" -#define MRprReconstr "\nReconstructing %s" -#define MRprBuild "\nBuilding %s" -#define MRprOldFormat "\nCannot repair archive with old format" -#define MRprFind "\nFound %s" -#define MRprAskIsSol "\nThe archive header is corrupt. Mark archive as solid ?" -#define MRprNoFiles "\nNo files found" -#define MRprSuspEntry "\n\nSuspicious entry %s" -#define MRprDir "\nDirectory" -#define MRprSuspSize "\nSize %ld Packed %ld" -#define MRprSuspAdd "\nAdd it to archive ?" -#define MLogUnexpEOF "\nUnexpected end of archive" -#define MRepAskReconst "\nReconstruct archive structure ?" -#define MRecScanning "\nScanning..." -#define MRecRNotFound "\nData recovery record not found" -#define MRecRFound "\nData recovery record found" -#define MRecSecDamage "\nSector %ld (offsets %lX...%lX) damaged" -#define MRecCorrected " - data recovered" -#define MRecFailed " - cannot recover data" -#define MAddRecRec "\nAdding data recovery record" -#define MEraseForVolume "\n\nErasing contents of drive %c:\n" -#define MGetOwnersError "\nWARNING: Cannot get %s owner and group\n" -#define MErrGetOwnerID "\nWARNING: Cannot get owner %s ID\n" -#define MErrGetGroupID "\nWARNING: Cannot get group %s ID\n" -#define MOwnersBroken "\nERROR: %s group and owner data are corrupt\n" -#define MSetOwnersError "\nWARNING: Cannot set %s owner and group\n" -#define MErrLnkRead "\nWARNING: Cannot read symbolic link %s" -#define MErrCreateLnk "\nWARNING: Cannot create link %s" -#define MSymLinkExists "\nWARNING: Symbolic link %s already exists" -#define MAskRetryCreate "\nCannot create %s. Retry ?" -#define MListMACHead1 "\n MacOS file type: %c%c%c%c ; " -#define MListMACHead2 "file creator: %c%c%c%c\n" -#define MDataBadCRC "\n%-20s : packed data CRC failed in volume %s" -#define MFileRO "\n%s is read-only" -#define MACLGetError "\nWARNING: Cannot get %s security data\n" -#define MACLSetError "\nWARNING: Cannot set %s security data\n" -#define MACLBroken "\nERROR: %s security data are corrupt\n" -#define MACLUnknown "\nWARNING: Unknown format of %s security data\n" -#define MStreamBroken "\nERROR: %s stream data are corrupt\n" -#define MStreamUnknown "\nWARNING: Unknown format of %s stream data\n" -#define MInvalidName "\nERROR: Invalid file name %s" -#define MEABroken "\nERROR: %s extended attributes are corrupt\n" -#define MEAUnknHeader "\nWARNING: %s - unknown format of extended attributes\n" -#define MCannotSetEA "\nWARNING: cannot set extended attributes to %s\n" -#define MCannotGetEA "\nERROR: Cannot get extended attributes of %s\n" -#define MShowEA " (+EA)" -#define MSkipEA "\n...skipping extended attributes" -#define MProcessArc "\n\nProcessing archive %s" -#define MSyncScanError "\nFile search errors, cannot synchronize archive" -#define MCorrectingName "\nWARNING: Attempting to correct the invalid file name" -#define MUnpCannotMerge "\nWARNING: You need to start extraction from a previous volume to unpack %s" -#define MUnknownOption "\nERROR: Unknown option: %s" -#define MSubHeadCorrupt "\nERROR: Corrupt data header found, ignored" -#define MSubHeadUnknown "\nWARNING: Unknown data header format, ignored" -#define MSubHeadDataCRC "\nERROR: Corrupt %s data block" -#define MSubHeadType "\nData header type: %s" -#define MScanError "\nCannot read contents of %s" -#define MNotVolume "\n%s is not volume" -#define MRecVolDiffSets "\nERROR: %s and %s belong to different sets" -#define MRecVolMissing "\n%d volumes missing" -#define MRecVolFound "\n%d recovery volumes found" -#define MRecVolAllExist "\nNothing to reconstruct" -#define MRecVolCannotFix "\nReconstruction impossible" -#define MReconstructing "\nReconstructing..." -#define MCreating "\nCreating %s" -#define MRenaming "\nRenaming %s to %s" -#define MNTFSRequired "\nWrite error: only NTFS file system supports files larger than 4 GB" -#define MErrChangeAttr "\nWARNING: Cannot change attributes of %s" -#define MWrongSFXVer "\nERROR: default SFX module does not support RAR %d.%d archives" -#define MCannotEncName "\nCannot encrypt archive already contained encrypted files" -#define MCannotEmail "\nCannot email the file %s" -#define MCopyrightS "\nRAR SFX archive" -#define MSHelpCmd "\n\n<Commands>" -#define MSHelpCmdE "\n -x Extract from archive (default)" -#define MSHelpCmdT "\n -t Test archive files" -#define MSHelpCmdV "\n -v Verbosely list contents of archive" -#define MMaxPathLimit "\nTotal path and file name length must not exceed %d characters" -#define MRecVolLimit "\nTotal number of usual and recovery volumes must not exceed 255" -#define MVolumeNumber "volume %d" diff --git a/lib/UnrarXLib/log.cpp b/lib/UnrarXLib/log.cpp deleted file mode 100644 index 966e9de150..0000000000 --- a/lib/UnrarXLib/log.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include "rar.hpp" - - -static char LogName[NM]; - -void InitLogOptions(char *LogName) -{ - strcpy(::LogName,LogName); -} - - -#ifndef SILENT -void Log(const char *ArcName,const char *Format,...) -{ - safebuf char Msg[2*NM+1024]; - va_list ArgPtr; - va_start(ArgPtr,Format); - vsprintf(Msg,Format,ArgPtr); - va_end(ArgPtr); - eprintf("%s",Msg); -} -#endif - - diff --git a/lib/UnrarXLib/log.hpp b/lib/UnrarXLib/log.hpp deleted file mode 100644 index 52d6b8d56d..0000000000 --- a/lib/UnrarXLib/log.hpp +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _RAR_LOG_ -#define _RAR_LOG_ - -void InitLogOptions(char *LogName); - -#ifndef SILENT -void Log(const char *ArcName,const char *Format,...); -#endif - -#ifdef SILENT -#ifdef __GNUC__ -#define Log(args...) -#else -inline void Log(const char *a,const char *b,const char *c=NULL,const char *d=NULL) {} -#endif -#endif - -#endif diff --git a/lib/UnrarXLib/match.cpp b/lib/UnrarXLib/match.cpp deleted file mode 100644 index f3bbedfe6f..0000000000 --- a/lib/UnrarXLib/match.cpp +++ /dev/null @@ -1,257 +0,0 @@ -#include "rar.hpp" - -static bool match(char *pattern,char *string); -static bool match(wchar *pattern,wchar *string); - -inline uint toupperc(byte ch) -{ -/* -*/ -#if defined(_WIN_32) - return((uint)CharUpper((LPTSTR)(ch))); -#elif defined(_UNIX) - return(ch); -#else - return(toupper(ch)); -#endif -} - - -inline uint touppercw(uint ch) -{ -/* -*/ -#if defined(_UNIX) - return(ch); -#else - return(toupperw(ch)); -#endif -} - - -bool CmpName(char *Wildcard,char *Name,int CmpPath) -{ - CmpPath&=MATCH_MODEMASK; - - if (CmpPath!=MATCH_NAMES) - { - int WildLength=strlen(Wildcard); - if (CmpPath!=MATCH_EXACTPATH && strnicompc(Wildcard,Name,WildLength)==0) - { - char NextCh=Name[WildLength]; - if (NextCh=='\\' || NextCh=='/' || NextCh==0) - return(true); - } - char Path1[NM],Path2[NM]; - GetFilePath(Wildcard,Path1); - GetFilePath(Name,Path2); - if (stricompc(Wildcard,Path2)==0) - return(true); - if ((CmpPath==MATCH_PATH || CmpPath==MATCH_EXACTPATH) && stricompc(Path1,Path2)!=0) - return(false); - if (CmpPath==MATCH_SUBPATH || CmpPath==MATCH_WILDSUBPATH) - { - if (IsWildcard(Path1)) - return(match(Wildcard,Name)); - else if (CmpPath==MATCH_SUBPATH || IsWildcard(Wildcard)) - { - if (*Path1 && strnicompc(Path1,Path2,strlen(Path1))!=0) - return(false); - } - else if (stricompc(Path1,Path2)!=0) - return(false); - } - } - char *Name1=PointToName(Wildcard); - char *Name2=PointToName(Name); - if (strnicompc("__rar_",Name2,6)==0) - return(false); - return(match(Name1,Name2)); -} - - -#ifndef SFX_MODULE -bool CmpName(wchar *Wildcard,wchar *Name,int CmpPath) -{ - CmpPath&=MATCH_MODEMASK; - - if (CmpPath!=MATCH_NAMES) - { - int WildLength=strlenw(Wildcard); - if (CmpPath!=MATCH_EXACTPATH && strnicompcw(Wildcard,Name,WildLength)==0) - { - wchar NextCh=Name[WildLength]; - if (NextCh==L'\\' || NextCh==L'/' || NextCh==0) - return(true); - } - wchar Path1[NM],Path2[NM]; - GetFilePath(Wildcard,Path1); - GetFilePath(Name,Path2); - if ((CmpPath==MATCH_PATH || CmpPath==MATCH_EXACTPATH) && stricompcw(Path1,Path2)!=0) - return(false); - if (CmpPath==MATCH_SUBPATH || CmpPath==MATCH_WILDSUBPATH) - { - if (IsWildcard(NULL,Path1)) - return(match(Wildcard,Name)); - else if (CmpPath==MATCH_SUBPATH || IsWildcard(NULL,Wildcard)) - { - if (*Path1 && strnicompcw(Path1,Path2,strlenw(Path1))!=0) - return(false); - } - else if (stricompcw(Path1,Path2)!=0) - return(false); - } - } - wchar *Name1=PointToName(Wildcard); - wchar *Name2=PointToName(Name); - if (strnicompcw(L"__rar_",Name2,6)==0) - return(false); - return(match(Name1,Name2)); -} -#endif - - -bool match(char *pattern,char *string) -{ - for (;; ++string) - { - char stringc=toupperc(*string); - char patternc=toupperc(*pattern++); - switch (patternc) - { - case 0: - return(stringc==0); - case '?': - if (stringc == 0) - return(false); - break; - case '*': - if (*pattern==0) - return(true); - if (*pattern=='.') - { - if (pattern[1]=='*' && pattern[2]==0) - return(true); - char *dot=strchr(string,'.'); - if (pattern[1]==0) - return (dot==NULL || dot[1]==0); - if (dot!=NULL) - { - string=dot; - if (strpbrk(pattern,"*?")==NULL && strchr(string+1,'.')==NULL) - return(stricompc(pattern+1,string+1)==0); - } - } - - while (*string) - if (match(pattern,string++)) - return(true); - return(false); - default: - if (patternc != stringc) - { - if (patternc=='.' && stringc==0) - return(match(pattern,string)); - else - return(false); - } - break; - } - } -} - - -#ifndef SFX_MODULE -bool match(wchar *pattern,wchar *string) -{ - for (;; ++string) - { - wchar stringc=touppercw(*string); - wchar patternc=touppercw(*pattern++); - switch (patternc) - { - case 0: - return(stringc==0); - case '?': - if (stringc == 0) - return(false); - break; - case '*': - if (*pattern==0) - return(true); - if (*pattern=='.') - { - if (pattern[1]=='*' && pattern[2]==0) - return(true); - wchar *dot=strchrw(string,'.'); - if (pattern[1]==0) - return (dot==NULL || dot[1]==0); - if (dot!=NULL) - { - string=dot; - if (strpbrkw(pattern,L"*?")==NULL && strchrw(string+1,'.')==NULL) - return(stricompcw(pattern+1,string+1)==0); - } - } - - while (*string) - if (match(pattern,string++)) - return(true); - return(false); - default: - if (patternc != stringc) - { - if (patternc=='.' && stringc==0) - return(match(pattern,string)); - else - return(false); - } - break; - } - } -} -#endif - - -int stricompc(const char *Str1,const char *Str2) -{ -#if defined(_UNIX) - return(strcmp(Str1,Str2)); -#else - return(stricomp(Str1,Str2)); -#endif -} - - -#ifndef SFX_MODULE -int stricompcw(const wchar *Str1,const wchar *Str2) -{ -#if defined(_UNIX) - return(strcmpw(Str1,Str2)); -#else - return(stricmpw(Str1,Str2)); -#endif -} -#endif - - -int strnicompc(const char *Str1,const char *Str2,int N) -{ -#if defined(_UNIX) - return(strncmp(Str1,Str2,N)); -#else - return(strnicomp(Str1,Str2,N)); -#endif -} - - -#ifndef SFX_MODULE -int strnicompcw(const wchar *Str1,const wchar *Str2,int N) -{ -#if defined(_UNIX) - return(strncmpw(Str1,Str2,N)); -#else - return(strnicmpw(Str1,Str2,N)); -#endif -} -#endif diff --git a/lib/UnrarXLib/match.hpp b/lib/UnrarXLib/match.hpp deleted file mode 100644 index a7367772f9..0000000000 --- a/lib/UnrarXLib/match.hpp +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _RAR_MATCH_ -#define _RAR_MATCH_ - -enum {MATCH_NAMES,MATCH_PATH,MATCH_EXACTPATH,MATCH_SUBPATH,MATCH_WILDSUBPATH}; - -#define MATCH_MODEMASK 0x0000ffff - -bool CmpName(char *Wildcard,char *Name,int CmpPath); -bool CmpName(wchar *Wildcard,wchar *Name,int CmpPath); - -int stricompc(const char *Str1,const char *Str2); -int stricompcw(const wchar *Str1,const wchar *Str2); -int strnicompc(const char *Str1,const char *Str2,int N); -int strnicompcw(const wchar *Str1,const wchar *Str2,int N); - -#endif diff --git a/lib/UnrarXLib/model.cpp b/lib/UnrarXLib/model.cpp deleted file mode 100644 index dfee8efe86..0000000000 --- a/lib/UnrarXLib/model.cpp +++ /dev/null @@ -1,600 +0,0 @@ -/**************************************************************************** - * This file is part of PPMd project * - * Written and distributed to public domain by Dmitry Shkarin 1997, * - * 1999-2000 * - * Contents: model description and encoding/decoding routines * - ****************************************************************************/ - -inline PPM_CONTEXT* PPM_CONTEXT::createChild(ModelPPM *Model,STATE* pStats, - STATE& FirstState) -{ - PPM_CONTEXT* pc = (PPM_CONTEXT*) Model->SubAlloc.AllocContext(); - if ( pc ) - { - pc->NumStats=1; - pc->OneState=FirstState; - pc->Suffix=this; - pStats->Successor=pc; - } - return pc; -} - - -ModelPPM::ModelPPM() -{ - MinContext=NULL; - MaxContext=NULL; - MedContext=NULL; -} - - -void ModelPPM::RestartModelRare() -{ - int i, k, m; - memset(CharMask,0,sizeof(CharMask)); - SubAlloc.InitSubAllocator(); - InitRL=-(MaxOrder < 12 ? MaxOrder:12)-1; - MinContext = MaxContext = (PPM_CONTEXT*) SubAlloc.AllocContext(); - if (!MinContext) - return; - MinContext->Suffix=NULL; - OrderFall=MaxOrder; - MinContext->U.SummFreq=(MinContext->NumStats=256)+1; - FoundState=MinContext->U.Stats=(STATE*)SubAlloc.AllocUnits(256/2); - for (RunLength=InitRL, PrevSuccess=i=0;i < 256;i++) - { - MinContext->U.Stats[i].Symbol=i; - MinContext->U.Stats[i].Freq=1; - MinContext->U.Stats[i].Successor=NULL; - } - - static const ushort InitBinEsc[]={ - 0x3CDD,0x1F3F,0x59BF,0x48F3,0x64A1,0x5ABC,0x6632,0x6051 - }; - - for (i=0;i < 128;i++) - for (k=0;k < 8;k++) - for (m=0;m < 64;m += 8) - BinSumm[i][k+m]=BIN_SCALE-InitBinEsc[k]/(i+2); - for (i=0;i < 25;i++) - for (k=0;k < 16;k++) - SEE2Cont[i][k].init(5*i+10); -} - - -void ModelPPM::StartModelRare(int MaxOrder) -{ - int i, k, m ,Step; - EscCount=1; -/* - if (MaxOrder < 2) - { - memset(CharMask,0,sizeof(CharMask)); - OrderFall=ModelPPM::MaxOrder; - MinContext=MaxContext; - while (MinContext->Suffix != NULL) - { - MinContext=MinContext->Suffix; - OrderFall--; - } - FoundState=MinContext->U.Stats; - MinContext=MaxContext; - } - else -*/ - { - ModelPPM::MaxOrder=MaxOrder; - RestartModelRare(); - NS2BSIndx[0]=2*0; - NS2BSIndx[1]=2*1; - memset(NS2BSIndx+2,2*2,9); - memset(NS2BSIndx+11,2*3,256-11); - for (i=0;i < 3;i++) - NS2Indx[i]=i; - for (m=i, k=Step=1;i < 256;i++) - { - NS2Indx[i]=m; - if ( !--k ) - { - k = ++Step; - m++; - } - } - memset(HB2Flag,0,0x40); - memset(HB2Flag+0x40,0x08,0x100-0x40); - DummySEE2Cont.Shift=PERIOD_BITS; - } -} - - -void PPM_CONTEXT::rescale(ModelPPM *Model) -{ - int OldNS=NumStats, i=NumStats-1, Adder, EscFreq; - STATE* p1, * p; - for (p=Model->FoundState;p != U.Stats;p--) - _PPMD_SWAP(p[0],p[-1]); - U.Stats->Freq += 4; - U.SummFreq += 4; - EscFreq=U.SummFreq-p->Freq; - Adder=(Model->OrderFall != 0); - U.SummFreq = (p->Freq=(p->Freq+Adder) >> 1); - do - { - EscFreq -= (++p)->Freq; - U.SummFreq += (p->Freq=(p->Freq+Adder) >> 1); - if (p[0].Freq > p[-1].Freq) - { - STATE tmp=*(p1=p); - do - { - p1[0]=p1[-1]; - } while (--p1 != U.Stats && tmp.Freq > p1[-1].Freq); - *p1=tmp; - } - } while ( --i ); - if (p->Freq == 0) - { - do - { - i++; - } while ((--p)->Freq == 0); - EscFreq += i; - if ((NumStats -= i) == 1) - { - STATE tmp=*U.Stats; - do - { - tmp.Freq-=(tmp.Freq >> 1); - EscFreq>>=1; - } while (EscFreq > 1); - Model->SubAlloc.FreeUnits(U.Stats,(OldNS+1) >> 1); - *(Model->FoundState=&OneState)=tmp; return; - } - } - U.SummFreq += (EscFreq -= (EscFreq >> 1)); - int n0=(OldNS+1) >> 1, n1=(NumStats+1) >> 1; - if (n0 != n1) - U.Stats = (STATE*) Model->SubAlloc.ShrinkUnits(U.Stats,n0,n1); - Model->FoundState=U.Stats; -} - - -inline PPM_CONTEXT* ModelPPM::CreateSuccessors(bool Skip,STATE* p1) -{ -#ifdef __ICL - static -#endif - STATE UpState; - PPM_CONTEXT* pc=MinContext, * UpBranch=FoundState->Successor; - STATE * p, * ps[MAX_O], ** pps=ps; - if ( !Skip ) - { - *pps++ = FoundState; - if ( !pc->Suffix ) - goto NO_LOOP; - } - if ( p1 ) - { - p=p1; - pc=pc->Suffix; - goto LOOP_ENTRY; - } - do - { - pc=pc->Suffix; - if (pc->NumStats != 1) - { - if ((p=pc->U.Stats)->Symbol != FoundState->Symbol) - do - { - p++; - } while (p->Symbol != FoundState->Symbol); - } - else - p=&(pc->OneState); -LOOP_ENTRY: - if (p->Successor != UpBranch) - { - pc=p->Successor; - break; - } - *pps++ = p; - } while ( pc->Suffix ); -NO_LOOP: - if (pps == ps) - return pc; - UpState.Symbol=*(byte*) UpBranch; - UpState.Successor=(PPM_CONTEXT*) (((byte*) UpBranch)+1); - if (pc->NumStats != 1) - { - if ((byte*) pc <= SubAlloc.pText) - return(NULL); - if ((p=pc->U.Stats)->Symbol != UpState.Symbol) - do - { - p++; - } while (p->Symbol != UpState.Symbol); - uint cf=p->Freq-1; - uint s0=pc->U.SummFreq-pc->NumStats-cf; - UpState.Freq=1+((2*cf <= s0)?(5*cf > s0):((2*cf+3*s0-1)/(2*s0))); - } - else - UpState.Freq=pc->OneState.Freq; - do - { - pc = pc->createChild(this,*--pps,UpState); - if ( !pc ) - return NULL; - } while (pps != ps); - return pc; -} - - -inline void ModelPPM::UpdateModel() -{ - STATE fs = *FoundState, *p = NULL; - PPM_CONTEXT *pc, *Successor; - uint ns1, ns, cf, sf, s0; - if (fs.Freq < MAX_FREQ/4 && (pc=MinContext->Suffix) != NULL) - { - if (pc->NumStats != 1) - { - if ((p=pc->U.Stats)->Symbol != fs.Symbol) - { - do - { - p++; - } while (p->Symbol != fs.Symbol); - if (p[0].Freq >= p[-1].Freq) - { - _PPMD_SWAP(p[0],p[-1]); - p--; - } - } - if (p->Freq < MAX_FREQ-9) - { - p->Freq += 2; - pc->U.SummFreq += 2; - } - } - else - { - p=&(pc->OneState); - p->Freq += (p->Freq < 32); - } - } - if ( !OrderFall ) - { - MinContext=MaxContext=FoundState->Successor=CreateSuccessors(TRUE,p); - if ( !MinContext ) - goto RESTART_MODEL; - return; - } - *SubAlloc.pText++ = fs.Symbol; - Successor = (PPM_CONTEXT*) SubAlloc.pText; - if (SubAlloc.pText >= SubAlloc.FakeUnitsStart) - goto RESTART_MODEL; - if ( fs.Successor ) - { - if ((byte*) fs.Successor <= SubAlloc.pText && - (fs.Successor=CreateSuccessors(FALSE,p)) == NULL) - goto RESTART_MODEL; - if ( !--OrderFall ) - { - Successor=fs.Successor; - SubAlloc.pText -= (MaxContext != MinContext); - } - } - else - { - FoundState->Successor=Successor; - fs.Successor=MinContext; - } - s0=MinContext->U.SummFreq-(ns=MinContext->NumStats)-(fs.Freq-1); - for (pc=MaxContext;pc != MinContext;pc=pc->Suffix) - { - if ((ns1=pc->NumStats) != 1) - { - if ((ns1 & 1) == 0) - { - pc->U.Stats=(STATE*) SubAlloc.ExpandUnits(pc->U.Stats,ns1 >> 1); - if ( !pc->U.Stats ) - goto RESTART_MODEL; - } - pc->U.SummFreq += (2*ns1 < ns)+2*((4*ns1 <= ns) & (pc->U.SummFreq <= 8*ns1)); - } - else - { - p=(STATE*) SubAlloc.AllocUnits(1); - if ( !p ) - goto RESTART_MODEL; - *p=pc->OneState; - pc->U.Stats=p; - if (p->Freq < MAX_FREQ/4-1) - p->Freq += p->Freq; - else - p->Freq = MAX_FREQ-4; - pc->U.SummFreq=p->Freq+InitEsc+(ns > 3); - } - cf=2*fs.Freq*(pc->U.SummFreq+6); - sf=s0+pc->U.SummFreq; - if (cf < 6*sf) - { - cf=1+(cf > sf)+(cf >= 4*sf); - pc->U.SummFreq += 3; - } - else - { - cf=4+(cf >= 9*sf)+(cf >= 12*sf)+(cf >= 15*sf); - pc->U.SummFreq += cf; - } - p=pc->U.Stats+ns1; - p->Successor=Successor; - p->Symbol = fs.Symbol; - p->Freq = cf; - pc->NumStats=++ns1; - } - MaxContext=MinContext=fs.Successor; - return; -RESTART_MODEL: - RestartModelRare(); - EscCount=0; -} - - -// Tabulated escapes for exponential symbol distribution -static const byte ExpEscape[16]={ 25,14, 9, 7, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2 }; -#define GET_MEAN(SUMM,SHIFT,ROUND) ((SUMM+(1 << (SHIFT-ROUND))) >> (SHIFT)) - - - -inline void PPM_CONTEXT::decodeBinSymbol(ModelPPM *Model) -{ - STATE& rs=OneState; - Model->HiBitsFlag=Model->HB2Flag[Model->FoundState->Symbol]; - ushort& bs=Model->BinSumm[rs.Freq-1][Model->PrevSuccess+ - Model->NS2BSIndx[Suffix->NumStats-1]+ - Model->HiBitsFlag+2*Model->HB2Flag[rs.Symbol]+ - ((Model->RunLength >> 26) & 0x20)]; - if (Model->Coder.GetCurrentShiftCount(TOT_BITS) < bs) - { - Model->FoundState=&rs; - rs.Freq += (rs.Freq < 128); - Model->Coder.SubRange.LowCount=0; - Model->Coder.SubRange.HighCount=bs; - bs = SHORT16(bs+INTERVAL-GET_MEAN(bs,PERIOD_BITS,2)); - Model->PrevSuccess=1; - Model->RunLength++; - } - else - { - Model->Coder.SubRange.LowCount=bs; - bs = SHORT16(bs-GET_MEAN(bs,PERIOD_BITS,2)); - Model->Coder.SubRange.HighCount=BIN_SCALE; - Model->InitEsc=ExpEscape[bs >> 10]; - Model->NumMasked=1; - Model->CharMask[rs.Symbol]=Model->EscCount; - Model->PrevSuccess=0; - Model->FoundState=NULL; - } -} - - -inline void PPM_CONTEXT::update1(ModelPPM *Model,STATE* p) -{ - (Model->FoundState=p)->Freq += 4; - U.SummFreq += 4; - if (p[0].Freq > p[-1].Freq) - { - _PPMD_SWAP(p[0],p[-1]); - Model->FoundState=--p; - if (p->Freq > MAX_FREQ) - rescale(Model); - } -} - - - - -inline bool PPM_CONTEXT::decodeSymbol1(ModelPPM *Model) -{ - Model->Coder.SubRange.scale=U.SummFreq; - STATE* p=U.Stats; - int i, HiCnt; - int count=Model->Coder.GetCurrentCount(); - if ((uint)count>=Model->Coder.SubRange.scale) - return(false); - if (count < (HiCnt=p->Freq)) - { - Model->PrevSuccess=(2*(Model->Coder.SubRange.HighCount=HiCnt) > Model->Coder.SubRange.scale); - Model->RunLength += Model->PrevSuccess; - (Model->FoundState=p)->Freq=(HiCnt += 4); - U.SummFreq += 4; - if (HiCnt > MAX_FREQ) - rescale(Model); - Model->Coder.SubRange.LowCount=0; - return(true); - } - else - if (Model->FoundState==NULL) - return(false); - Model->PrevSuccess=0; - i=NumStats-1; - while ((HiCnt += (++p)->Freq) <= count) - if (--i == 0) - { - Model->HiBitsFlag=Model->HB2Flag[Model->FoundState->Symbol]; - Model->Coder.SubRange.LowCount=HiCnt; - Model->CharMask[p->Symbol]=Model->EscCount; - i=(Model->NumMasked=NumStats)-1; - Model->FoundState=NULL; - do - { - Model->CharMask[(--p)->Symbol]=Model->EscCount; - } while ( --i ); - Model->Coder.SubRange.HighCount=Model->Coder.SubRange.scale; - return(true); - } - Model->Coder.SubRange.LowCount=(Model->Coder.SubRange.HighCount=HiCnt)-p->Freq; - update1(Model,p); - return(true); -} - - -inline void PPM_CONTEXT::update2(ModelPPM *Model,STATE* p) -{ - (Model->FoundState=p)->Freq += 4; - U.SummFreq += 4; - if (p->Freq > MAX_FREQ) - rescale(Model); - Model->EscCount++; - Model->RunLength=Model->InitRL; -} - - -inline SEE2_CONTEXT* PPM_CONTEXT::makeEscFreq2(ModelPPM *Model,int Diff) -{ - SEE2_CONTEXT* psee2c; - if (NumStats != 256) - { - psee2c=Model->SEE2Cont[Model->NS2Indx[Diff-1]]+ - (Diff < Suffix->NumStats-NumStats)+ - 2*(U.SummFreq < 11*NumStats)+4*(Model->NumMasked > Diff)+ - Model->HiBitsFlag; - Model->Coder.SubRange.scale=psee2c->getMean(); - } - else - { - psee2c=&Model->DummySEE2Cont; - Model->Coder.SubRange.scale=1; - } - return psee2c; -} - - - - -inline bool PPM_CONTEXT::decodeSymbol2(ModelPPM *Model) -{ - int count, HiCnt, i=NumStats-Model->NumMasked; - SEE2_CONTEXT* psee2c=makeEscFreq2(Model,i); - STATE* ps[256], ** pps=ps, * p=U.Stats-1; - HiCnt=0; - do - { - do - { - p++; - } while (Model->CharMask[p->Symbol] == Model->EscCount); - HiCnt += p->Freq; - *pps++ = p; - } while ( --i ); - Model->Coder.SubRange.scale += HiCnt; - count=Model->Coder.GetCurrentCount(); - if ((uint)count>=Model->Coder.SubRange.scale) - return(false); - p=*(pps=ps); - if (count < HiCnt) - { - HiCnt=0; - while ((HiCnt += p->Freq) <= count) - p=*++pps; - Model->Coder.SubRange.LowCount = (Model->Coder.SubRange.HighCount=HiCnt)-p->Freq; - psee2c->update(); - update2(Model,p); - } - else - { - Model->Coder.SubRange.LowCount=HiCnt; - Model->Coder.SubRange.HighCount=Model->Coder.SubRange.scale; - i=NumStats-Model->NumMasked; - pps--; - do - { - Model->CharMask[(*++pps)->Symbol]=Model->EscCount; - } while ( --i ); - psee2c->Summ += Model->Coder.SubRange.scale; - Model->NumMasked = NumStats; - } - return(true); -} - - -inline void ModelPPM::ClearMask() -{ - EscCount=1; - memset(CharMask,0,sizeof(CharMask)); -} - - - - -bool ModelPPM::DecodeInit(Unpack *UnpackRead,int &EscChar) -{ - int MaxOrder=UnpackRead->GetChar(); - bool Reset=(MaxOrder & 0x20); - - int MaxMB=0; - if (Reset) - MaxMB=UnpackRead->GetChar(); - else - if (SubAlloc.GetAllocatedMemory()==0) - return(false); - if (MaxOrder & 0x40) - EscChar=UnpackRead->GetChar(); - Coder.InitDecoder(UnpackRead); - if (Reset) - { - MaxOrder=(MaxOrder & 0x1f)+1; - if (MaxOrder>16) - MaxOrder=16+(MaxOrder-16)*3; - if (MaxOrder==1) - { - SubAlloc.StopSubAllocator(); - return(false); - } - SubAlloc.StartSubAllocator(MaxMB+1); - StartModelRare(MaxOrder); - } - return(MinContext!=NULL); -} - - -int ModelPPM::DecodeChar() -{ - if ((byte*)MinContext <= SubAlloc.pText || (byte*)MinContext>SubAlloc.HeapEnd) - return(-1); - if (MinContext->NumStats != 1) - { - if (!MinContext->decodeSymbol1(this)) - return(-1); - } - else - MinContext->decodeBinSymbol(this); - Coder.Decode(); - while ( !FoundState ) - { - ARI_DEC_NORMALIZE(Coder.code,Coder.low,Coder.range,Coder.UnpackRead); - do - { - OrderFall++; - MinContext=MinContext->Suffix; - if ((byte*)MinContext <= SubAlloc.pText || (byte*)MinContext>SubAlloc.HeapEnd) - return(-1); - } while (MinContext->NumStats == NumMasked); - if (!MinContext->decodeSymbol2(this)) - return(-1); - Coder.Decode(); - } - int Symbol=FoundState->Symbol; - if (!OrderFall && (byte*) FoundState->Successor > SubAlloc.pText) - MinContext=MaxContext=FoundState->Successor; - else - { - UpdateModel(); - if (EscCount == 0) - ClearMask(); - } - ARI_DEC_NORMALIZE(Coder.code,Coder.low,Coder.range,Coder.UnpackRead); - return(Symbol); -} diff --git a/lib/UnrarXLib/model.hpp b/lib/UnrarXLib/model.hpp deleted file mode 100644 index bcaaa3661c..0000000000 --- a/lib/UnrarXLib/model.hpp +++ /dev/null @@ -1,126 +0,0 @@ -#ifndef _RAR_PPMMODEL_ -#define _RAR_PPMMODEL_ - -#include "coder.hpp" -#include "suballoc.hpp" - -const int MAX_O=64; /* maximum allowed model order */ - -const int INT_BITS=7, PERIOD_BITS=7, TOT_BITS=INT_BITS+PERIOD_BITS, - INTERVAL=1 << INT_BITS, BIN_SCALE=1 << TOT_BITS, MAX_FREQ=124; - -#pragma pack(1) - -struct SEE2_CONTEXT -{ // SEE-contexts for PPM-contexts with masked symbols - ushort Summ; - byte Shift, Count; - void init(int InitVal) - { - Summ=InitVal << (Shift=PERIOD_BITS-4); - Count=4; - } - uint getMean() - { - uint RetVal=SHORT16(Summ) >> Shift; - Summ -= RetVal; - return RetVal+(RetVal == 0); - } - void update() - { - if (Shift < PERIOD_BITS && --Count == 0) - { - Summ += Summ; - Count=3 << Shift++; - } - } -} _PACK_ATTR; - -class ModelPPM; -struct PPM_CONTEXT; - -struct STATE -{ - byte Symbol; - byte Freq; - PPM_CONTEXT* Successor; -}; - -struct FreqData -{ - ushort SummFreq; - STATE _PACK_ATTR * Stats; -}; - -struct PPM_CONTEXT -{ - ushort NumStats; - union - { - FreqData U; - - STATE OneState; - }; - - PPM_CONTEXT* Suffix; - inline void encodeBinSymbol(ModelPPM *Model,int symbol); // MaxOrder: - inline void encodeSymbol1(ModelPPM *Model,int symbol); // ABCD context - inline void encodeSymbol2(ModelPPM *Model,int symbol); // BCD suffix - inline void decodeBinSymbol(ModelPPM *Model); // BCDE successor - inline bool decodeSymbol1(ModelPPM *Model); // other orders: - inline bool decodeSymbol2(ModelPPM *Model); // BCD context - inline void update1(ModelPPM *Model,STATE* p); // CD suffix - inline void update2(ModelPPM *Model,STATE* p); // BCDE successor - void rescale(ModelPPM *Model); - inline PPM_CONTEXT* createChild(ModelPPM *Model,STATE* pStats,STATE& FirstState); - inline SEE2_CONTEXT* makeEscFreq2(ModelPPM *Model,int Diff); -}; -#ifdef _AIX -#pragma pack(pop) -#else -#pragma pack() -#endif - -const uint UNIT_SIZE=sizeof(PPM_CONTEXT); -const uint FIXED_UNIT_SIZE=12; - -/* -inline PPM_CONTEXT::PPM_CONTEXT(STATE* pStats,PPM_CONTEXT* ShorterContext): - NumStats(1), Suffix(ShorterContext) { pStats->Successor=this; } -inline PPM_CONTEXT::PPM_CONTEXT(): NumStats(0) {} -*/ - -template <class T> -inline void _PPMD_SWAP(T& t1,T& t2) { T tmp=t1; t1=t2; t2=tmp; } - - -class ModelPPM -{ - private: - friend struct PPM_CONTEXT; - - SEE2_CONTEXT SEE2Cont[25][16], DummySEE2Cont; - - struct PPM_CONTEXT *MinContext, *MedContext, *MaxContext; - STATE* FoundState; // found next state transition - int NumMasked, InitEsc, OrderFall, MaxOrder, RunLength, InitRL; - byte CharMask[256], NS2Indx[256], NS2BSIndx[256], HB2Flag[256]; - byte EscCount, PrevSuccess, HiBitsFlag; - ushort BinSumm[128][64]; // binary SEE-contexts - - RangeCoder Coder; - SubAllocator SubAlloc; - - void RestartModelRare(); - void StartModelRare(int MaxOrder); - inline PPM_CONTEXT* CreateSuccessors(bool Skip,STATE* p1); - - inline void UpdateModel(); - inline void ClearMask(); - public: - ModelPPM(); - bool DecodeInit(Unpack *UnpackRead,int &EscChar); - int DecodeChar(); -}; - -#endif diff --git a/lib/UnrarXLib/options.cpp b/lib/UnrarXLib/options.cpp deleted file mode 100644 index ffa2752de8..0000000000 --- a/lib/UnrarXLib/options.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include "rar.hpp" - -RAROptions::RAROptions() -{ - Init(); -} - - -RAROptions::~RAROptions() -{ - memset(this,0,sizeof(RAROptions)); -} - - -void RAROptions::Init() -{ - memset(this,0,sizeof(RAROptions)); - WinSize=0x400000; - Overwrite=OVERWRITE_ASK; - Method=3; - MsgStream=MSG_STDOUT; - ConvertNames=NAMES_ORIGINALCASE; - ProcessEA=true; - xmtime=EXTTIME_HIGH3; - CurVolNum=0; -} diff --git a/lib/UnrarXLib/options.hpp b/lib/UnrarXLib/options.hpp deleted file mode 100644 index e38069fc48..0000000000 --- a/lib/UnrarXLib/options.hpp +++ /dev/null @@ -1,128 +0,0 @@ -#ifndef _RAR_OPTIONS_ -#define _RAR_OPTIONS_ - -#define DEFAULT_RECOVERY -1 - -#define DEFAULT_RECVOLUMES -10 - -enum PathExclMode { - EXCL_NONE,EXCL_BASEPATH,EXCL_SKIPWHOLEPATH,EXCL_SAVEFULLPATH, - EXCL_SKIPABSPATH,EXCL_ABSPATH}; -enum {SOLID_NONE=0,SOLID_NORMAL=1,SOLID_COUNT=2,SOLID_FILEEXT=4, - SOLID_VOLUME_DEPENDENT=8,SOLID_VOLUME_INDEPENDENT=16}; -enum {ARCTIME_NONE,ARCTIME_KEEP,ARCTIME_LATEST}; -enum EXTTIME_MODE { - EXTTIME_NONE,EXTTIME_1S,EXTTIME_HIGH1,EXTTIME_HIGH2,EXTTIME_HIGH3 -}; -enum {NAMES_ORIGINALCASE,NAMES_UPPERCASE,NAMES_LOWERCASE}; -enum MESSAGE_TYPE {MSG_STDOUT,MSG_STDERR,MSG_ERRONLY,MSG_NULL}; -enum OVERWRITE_MODE { OVERWRITE_ASK,OVERWRITE_ALL,OVERWRITE_NONE}; - -#define MAX_FILTERS 16 -enum FilterState {FILTER_DEFAULT=0,FILTER_AUTO,FILTER_FORCE,FILTER_DISABLE}; - -struct FilterMode -{ - FilterState State; - int Param1; - int Param2; -}; - - -class RAROptions -{ - public: - RAROptions(); - ~RAROptions(); - void Init(); - - uint ExclFileAttr; - uint InclFileAttr; - bool InclAttrSet; - uint WinSize; - char TempPath[NM]; - char SFXModule[NM]; - char ExtrPath[NM+16]; - wchar ExtrPathW[NM]; - char CommentFile[NM]; - char ArcPath[NM]; - char Password[MAXPASSWORD]; - bool EncryptHeaders; - char LogName[NM]; - MESSAGE_TYPE MsgStream; - bool Sound; - OVERWRITE_MODE Overwrite; - int Method; - int Recovery; - int RecVolNumber; - bool DisablePercentage; - bool DisableCopyright; - bool DisableDone; - int Solid; - int SolidCount; - bool ClearArc; - bool AddArcOnly; - bool AV; - bool DisableComment; - bool FreshFiles; - bool UpdateFiles; - PathExclMode ExclPath; - int Recurse; - Int64 VolSize; - Array<Int64> NextVolSizes; - int CurVolNum; - bool AllYes; - bool DisableViewAV; - bool DisableSortSolid; - int ArcTime; - int ConvertNames; - bool ProcessOwners; - bool SaveLinks; - int Priority; - int SleepTime; - bool KeepBroken; - bool EraseDisk; - bool OpenShared; - bool ExclEmptyDir; - bool DeleteFiles; - bool SyncFiles; - bool GenerateArcName; - char GenerateMask[80]; - bool ProcessEA; - bool SaveStreams; - bool SetCompressedAttr; - uint FileTimeOlder; - uint FileTimeNewer; - RarTime FileTimeBefore; - RarTime FileTimeAfter; - bool OldNumbering; - bool Lock; - bool Test; - bool VolumePause; - FilterMode FilterModes[MAX_FILTERS]; - char EmailTo[NM]; - int VersionControl; - bool NoEndBlock; - bool AppendArcNameToPath; - bool Shutdown; - EXTTIME_MODE xmtime; - EXTTIME_MODE xctime; - EXTTIME_MODE xatime; - EXTTIME_MODE xarctime; - char CompressStdin[NM]; - - - -#if defined(RARDLL) - char DllDestName[NM]; - wchar DllDestNameW[NM]; - int DllOpMode; - int DllError; - LONG UserData; - UNRARCALLBACK Callback; - CHANGEVOLPROC ChangeVolProc; - PROCESSDATAPROC ProcessDataProc; -#endif -}; -#endif - diff --git a/lib/UnrarXLib/os.hpp b/lib/UnrarXLib/os.hpp deleted file mode 100644 index e7abcdc12e..0000000000 --- a/lib/UnrarXLib/os.hpp +++ /dev/null @@ -1,229 +0,0 @@ -#ifndef _RAR_OS_ -#define _RAR_OS_ - -#ifdef TARGET_WINDOWS -#include <windows.h> -#endif - -#define FALSE 0 -#define TRUE 1 - -#ifdef __EMX__ - #define INCL_BASE -#endif - -#if defined(_WIN_32) || defined(_EMX) -#define ENABLE_BAD_ALLOC -#endif - - -#if defined(_WIN_32) || defined(_EMX) - -#define LITTLE_ENDIAN -#define NM 1024 - -#ifdef _WIN_32 - -//#define STRICT -//#define WINVER 0x0400 -#if _WIN32_WINNT < 0x0300 -#undef _WIN32_WINNT -#define _WIN32_WINNT 0x0300 -#endif - -#ifndef XBMC -#define WIN32_LEAN_AND_MEAN -#endif - - -#include "system.h" -#include <prsht.h> -#if defined(TARGET_POSIX) -#include "PlatformDefs.h" -#endif - -#endif - -#ifndef _WIN_CE -#include <sys/types.h> -#include <sys/stat.h> -#include <dos.h> -#endif - -#if !defined(_EMX) && !defined(_MSC_VER) && !defined(_WIN_CE) - #define ENABLE_MKTEMP - #include <dir.h> -#endif -#ifdef _MSC_VER -// #define for if (0) ; else for -#ifndef _WIN_CE - #include <direct.h> -#endif -#else - #include <dirent.h> -#endif - -#ifndef _WIN_CE -#include <share.h> -#endif - -#if defined(ENABLE_BAD_ALLOC) && !defined(_WIN_CE) - #include <new.h> -#endif - -#ifdef _EMX - #include <unistd.h> - #include <pwd.h> - #include <grp.h> - #include <errno.h> - #ifdef _DJGPP - #include <utime.h> - #else - #include <os2.h> - #include <sys/utime.h> - #include <emx/syscalls.h> - #endif -#else - #if defined(_MSC_VER) || defined(__MINGW32__) - #include <exception> - #else - #include <except.h> - #endif -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <stdarg.h> -#include <string.h> -#include <ctype.h> -#ifndef _WIN_CE - #include <fcntl.h> - #include <dos.h> - #include <io.h> - #include <time.h> - #include <signal.h> -#endif - -/* -#ifdef _WIN_32 -#pragma hdrstop -#endif -*/ - -#define ENABLE_ACCESS - -#define DefConfigName "rar.ini" -#define DefLogName "rar.log" - - -#define PATHDIVIDER "\\" -#define PATHDIVIDERW L"\\" -#define CPATHDIVIDER '\\' -#define MASKALL "*" -#define MASKALLW L"*" - -#define READBINARY "rb" -#define READTEXT "rt" -#define UPDATEBINARY "r+b" -#define CREATEBINARY "w+b" -#define APPENDTEXT "at" - -#if defined(_WIN_32) - #ifdef _MSC_VER - #define _stdfunction __cdecl - #else - #define _stdfunction _USERENTRY - #endif -#else - #define _stdfunction -#endif - -#endif - -#ifdef _UNIX - -#define NM 1024 - -#ifdef _BEOS -#include <be/kernel/fs_info.h> -#include <be/kernel/fs_attr.h> -#endif - -#include <unistd.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/file.h> -#if defined(__QNXNTO__) - #include <sys/param.h> -#endif -#if defined(__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) || defined(__APPLE__) - #include <sys/param.h> - #include <sys/mount.h> -#else -#endif -#include <pwd.h> -#include <grp.h> -#include <stdio.h> -#include <stdlib.h> -#include <stdarg.h> -#include <string.h> -#include <ctype.h> -#include <fcntl.h> -#include <errno.h> -#include <dirent.h> -#include <time.h> -#include <signal.h> -#include <utime.h> -#include <locale.h> - -#ifdef S_IFLNK -#define SAVE_LINKS -#endif - -#define ENABLE_ACCESS - -#define DefConfigName ".rarrc" -#define DefLogName ".rarlog" - - -#define PATHDIVIDER "/" -#define PATHDIVIDERW L"/" -#define CPATHDIVIDER '/' -#define MASKALL "*" -#define MASKALLW L"*" - -#define READBINARY "r" -#define READTEXT "r" -#define UPDATEBINARY "r+" -#define CREATEBINARY "w+" -#define APPENDTEXT "a" - -#define _stdfunction - -#if defined(__sparc) || defined(sparc) || defined(__hpux) - #ifndef BIG_ENDIAN - #define BIG_ENDIAN - #endif -#endif - -#endif - -typedef const char* MSGID; - -#define safebuf static - -#if defined(LITTLE_ENDIAN) && defined(BIG_ENDIAN) - #if defined(BYTE_ORDER) && BYTE_ORDER == BIG_ENDIAN - #undef LITTLE_ENDIAN - #elif defined(BYTE_ORDER) && BYTE_ORDER == LITTLE_ENDIAN - #undef BIG_ENDIAN - #else - #error "Both LITTLE_ENDIAN and BIG_ENDIAN are defined. Undef something one" - #endif -#endif - -#if !defined(BIG_ENDIAN) && !defined(_WIN_CE) && defined(_WIN_32) -#define ALLOW_NOT_ALIGNED_INT -#endif - -#endif // _RAR_OS_ diff --git a/lib/UnrarXLib/pathfn.cpp b/lib/UnrarXLib/pathfn.cpp deleted file mode 100644 index 11aad0426d..0000000000 --- a/lib/UnrarXLib/pathfn.cpp +++ /dev/null @@ -1,709 +0,0 @@ -// THIS FILE IS MODIFIED TO WORK WITH XBMC - -#include "rar.hpp" - -char* PointToName(const char *Path) -{ - //const char *Found=NULL; - for (const char *s=&Path[strlen(Path)-1];s>=Path;s--) - if (IsPathDiv(*s)) - return (char*)(s+1); -// if (Found!=NULL) - // return((char*)Found); - return (char*)((*Path && IsDriveDiv(Path[1]) && charnext(Path)==Path+1) ? Path+2:Path); -} - -/* -Dumbass broken routine!! -Not searching in reverse to strip off filename portion of path! -{ - const char *Found=NULL; - for (const char *s=Path;*s!=0;s=charnext(s)) - if (IsPathDiv(*s)) - Found=(char*)(s+1); - if (Found!=NULL) - return((char*)Found); - return (char*)((*Path && IsDriveDiv(Path[1]) && charnext(Path)==Path+1) ? Path+2:Path); -} -*/ - -wchar* PointToName(const wchar *Path) -{ - for (int I=strlenw(Path)-1;I>=0;I--) - if (IsPathDiv(Path[I])) - return (wchar*)&Path[I+1]; - return (wchar*)((*Path && IsDriveDiv(Path[1])) ? Path+2:Path); -} - - -char* PointToLastChar(const char *Path) -{ - for (const char *s=Path,*p=Path;;p=s,s=charnext(s)) - if (*s==0) - return((char *)p); -} - - -char* ConvertPath(const char *SrcPath,char *DestPath) -{ - const char *DestPtr=SrcPath; - for (const char *s=DestPtr;*s!=0;s++) - if (IsPathDiv(s[0]) && s[1]=='.' && s[2]=='.' && IsPathDiv(s[3])) - DestPtr=s+4; - while (*DestPtr) - { - const char *s=DestPtr; - if (s[0] && IsDriveDiv(s[1])) - s+=2; - if (s[0]=='\\' && s[1]=='\\') - { - const char *Slash=strchr(s+2,'\\'); - if (Slash!=NULL && (Slash=strchr(Slash+1,'\\'))!=NULL) - s=Slash+1; - } - for (const char *t=s;*t!=0;t++) - if (IsPathDiv(*t)) - s=t+1; - else - if (*t!='.') - break; - if (s==DestPtr) - break; - DestPtr=s; - } - if (DestPath!=NULL) - { - char TmpStr[NM]; - strncpy(TmpStr,DestPtr,sizeof(TmpStr)-1); - strcpy(DestPath,TmpStr); - } - return((char *)DestPtr); -} - - -wchar* ConvertPath(const wchar *SrcPath,wchar *DestPath) -{ - const wchar *DestPtr=SrcPath; - for (const wchar *s=DestPtr;*s!=0;s++) - if (IsPathDiv(s[0]) && s[1]=='.' && s[2]=='.' && IsPathDiv(s[3])) - DestPtr=s+4; - while (*DestPtr) - { - const wchar *s=DestPtr; - if (s[0] && IsDriveDiv(s[1])) - s+=2; - if (s[0]=='\\' && s[1]=='\\') - { - const wchar *Slash=strchrw(s+2,'\\'); - if (Slash!=NULL && (Slash=strchrw(Slash+1,'\\'))!=NULL) - s=Slash+1; - } - for (const wchar *t=s;*t!=0;t++) - if (IsPathDiv(*t)) - s=t+1; - else - if (*t!='.') - break; - if (s==DestPtr) - break; - DestPtr=s; - } - if (DestPath!=NULL) - { - wchar TmpStr[NM]; - strncpyw(TmpStr,DestPtr,sizeof(TmpStr)/sizeof(TmpStr[0])-1); - strcpyw(DestPath,TmpStr); - } - return((wchar *)DestPtr); -} - - -void SetExt(char *Name,const char *NewExt) -{ - char *Dot=GetExt(Name); - if (NewExt==NULL) - { - if (Dot!=NULL) - *Dot=0; - } - else - if (Dot==NULL) - { - strcat(Name,"."); - strcat(Name,NewExt); - } - else - strcpy(Dot+1,NewExt); -} - - -#ifndef SFX_MODULE -void SetExt(wchar *Name,const wchar *NewExt) -{ - if (Name==NULL || *Name==0) - return; - wchar *Dot=GetExt(Name); - if (NewExt==NULL) - { - if (Dot!=NULL) - *Dot=0; - } - else - if (Dot==NULL) - { - strcatw(Name,L"."); - strcatw(Name,NewExt); - } - else - strcpyw(Dot+1,NewExt); -} -#endif - - -#ifndef SFX_MODULE -void SetSFXExt(char *SFXName) -{ -#ifdef _UNIX - SetExt(SFXName,"sfx"); -#endif - -#if defined(_WIN_32) || defined(_EMX) - SetExt(SFXName,"exe"); -#endif -} -#endif - - -#ifndef SFX_MODULE -void SetSFXExt(wchar *SFXName) -{ - if (SFXName==NULL || *SFXName==0) - return; - -#ifdef _UNIX - SetExt(SFXName,L"sfx"); -#endif - -#if defined(_WIN_32) || defined(_EMX) - SetExt(SFXName,L"exe"); -#endif -} -#endif - - -char *GetExt(const char *Name) -{ - if (Name) - return (char*)strrchr(Name, '.'); - return NULL; -} - -wchar *GetExt(const wchar *Name) -{ - if (Name) - return strrchrw(Name, L'.'); - return NULL; -} - - -bool CmpExt(const char *Name,const char *Ext) -{ - char *NameExt=GetExt(Name); - return(NameExt!=NULL && stricomp(NameExt+1,Ext)==0); -} - - -bool IsWildcard(const char *Str,const wchar *StrW) -{ - if (StrW!=NULL && *StrW!=0) - return(strpbrkw(StrW,L"*?")!=NULL); - return(Str==NULL ? false:strpbrk(Str,"*?")!=NULL); -} - - -bool IsPathDiv(int Ch) -{ -#if defined(_WIN_32) || defined(_EMX) - return(Ch=='\\' || Ch=='/'); -#else - return(Ch==CPATHDIVIDER); -#endif -} - - -bool IsDriveDiv(int Ch) -{ -#ifdef _UNIX - return(false); -#else - return(Ch==':'); -#endif -} - - -int GetPathDisk(const char *Path) -{ - if (IsDiskLetter(Path)) - return(toupper(*Path)-'A'); - else - return(-1); -} - - -void AddEndSlash(char *Path) -{ - char *LastChar=PointToLastChar(Path); - if (*LastChar!=0 && *LastChar!=CPATHDIVIDER) - strcat(LastChar,PATHDIVIDER); -} - - -void AddEndSlash(wchar *Path) -{ - int Length=strlenw(Path); - if (Length>0 && Path[Length-1]!=CPATHDIVIDER) - strcatw(Path,PATHDIVIDERW); -} - - -void GetFilePath(const char *FullName,char *Path) -{ - int PathLength=PointToName(FullName)-FullName; - strncpy(Path,FullName,PathLength); - Path[PathLength]=0; -} - - -void GetFilePath(const wchar *FullName,wchar *Path) -{ - const wchar *PathPtr=/*(*FullName && IsDriveDiv(FullName[1])) ? FullName+2:*/FullName; - int PathLength=PointToName(FullName)-FullName; - strncpyw(Path,PathPtr,PathLength); - Path[PathLength]=0; -} - - -void RemoveNameFromPath(char *Path) -{ - char *Name=PointToName(Path); - if (Name>=Path+2 && (!IsDriveDiv(Path[1]) || Name>=Path+4)) - Name--; - *Name=0; -} - - -#ifndef SFX_MODULE -void RemoveNameFromPath(wchar *Path) -{ - wchar *Name=PointToName(Path); - if (Name>=Path+2 && (!IsDriveDiv(Path[1]) || Name>=Path+4)) - Name--; - *Name=0; -} -#endif - - -#ifndef SFX_MODULE -bool EnumConfigPaths(char *Path,int Number) -{ -#ifdef _EMX - static char RARFileName[NM]; - if (Number==-1) - strcpy(RARFileName,Path); - if (Number!=0) - return(false); - if (_osmode==OS2_MODE) - { - PTIB ptib; - PPIB ppib; - DosGetInfoBlocks(&ptib, &ppib); - DosQueryModuleName(ppib->pib_hmte,NM,Path); - } - else - strcpy(Path,RARFileName); - RemoveNameFromPath(Path); - return(true); -#elif defined(_UNIX) - if (Number==0) - { - char *EnvStr=getenv("HOME"); - if (EnvStr==NULL) - return(false); - strncpy(Path,EnvStr,NM); - Path[NM-1]=0; - return(true); - } - static const char *AltPath[]={ - "/etc","/usr/lib","/usr/local/lib","/usr/local/etc" - }; - Number--; - if (Number<0 || Number>=(int)(sizeof(AltPath)/sizeof(AltPath[0]))) - return(false); - strcpy(Path,AltPath[Number]); - return(true); -#elif defined(_WIN_32) - if (Number!=0) - return(false); -#if !defined(TARGET_POSIX) - GetModuleFileName(NULL,(LPWSTR)unrarxlib::ToW(Path).c_str(),NM); - RemoveNameFromPath(Path); -#endif - return(true); -#else - return(false); -#endif -} -#endif - - -#ifndef SFX_MODULE -void GetConfigName(const char *Name,char *FullName, bool CheckExist) -{ - for (int I=0;EnumConfigPaths(FullName,I);I++) - { - AddEndSlash(FullName); - strcat(FullName,Name); - if (!CheckExist || WildFileExist(FullName)) - break; - } -} -#endif - - -char* GetVolNumPart(char *ArcName) -{ - char *ChPtr=ArcName+strlen(ArcName)-1; - while (!isdigit(*ChPtr) && ChPtr>ArcName) - ChPtr--; - char *NumPtr=ChPtr; - while (isdigit(*NumPtr) && NumPtr>ArcName) - NumPtr--; - while (NumPtr>ArcName && *NumPtr!='.') - { - if (isdigit(*NumPtr)) - { - char *Dot=strchrd(PointToName(ArcName),'.'); - if (Dot!=NULL && Dot<NumPtr) - ChPtr=NumPtr; - break; - } - NumPtr--; - } - return(ChPtr); -} - - -void NextVolumeName(char *ArcName,bool OldNumbering) -{ - char *ChPtr; - if ((ChPtr=GetExt(ArcName))==NULL) - { - strcat(ArcName,".rar"); - ChPtr=GetExt(ArcName); - } - else - if (ChPtr[1]==0 || stricomp(ChPtr+1,"exe")==0 || stricomp(ChPtr+1,"sfx")==0) - strcpy(ChPtr+1,"rar"); - if (!OldNumbering) - { - ChPtr=GetVolNumPart(ArcName); - - while ((++(*ChPtr))=='9'+1) - { - *ChPtr='0'; - ChPtr--; - if (ChPtr<ArcName || !isdigit(*ChPtr)) - { - for (char *EndPtr=ArcName+strlen(ArcName);EndPtr!=ChPtr;EndPtr--) - *(EndPtr+1)=*EndPtr; - *(ChPtr+1)='1'; - break; - } - } - } - else - if (!isdigit(*(ChPtr+2)) || !isdigit(*(ChPtr+3))) - strcpy(ChPtr+2,"00"); - else - { - ChPtr+=3; - while ((++(*ChPtr))=='9'+1) - if (*(ChPtr-1)=='.') - { - *ChPtr='A'; - break; - } - else - { - *ChPtr='0'; - ChPtr--; - } - } -} - - -bool IsNameUsable(const char *Name) -{ - // only for xbox - if ( Name == NULL) return false; - char cIllegalChars[] = "<>=?;\"*+,/|"; - unsigned int iIllegalCharSize = strlen(cIllegalChars); - bool isIllegalChar; - unsigned int iSize = strlen(Name); - if(iSize > 42) return false; - - for (unsigned int i = 0; i < iSize; i++) - { - isIllegalChar = false; - // check for illegal chars - for (unsigned j = 0; j < iIllegalCharSize; j++) - if (Name[i] == cIllegalChars[j]) isIllegalChar = true; - // FATX only allows chars from 32 till 127 - if (isIllegalChar == true || Name[i] < 32 || Name[i] > 126) return false; - } - return true; - /* -#ifndef _UNIX - if (Name[0] && Name[1] && strchr(Name+2,':')!=NULL) - return(false); -#endif - if (strlen(Name) < 43) return 1; - else return 0; - return(*Name!=0 && strpbrk(Name,"?*<>|")==NULL); - */ -} - - -void MakeNameUsable(char *Name, bool bKeepExtension, bool IsFATX) -{ - // Changed to be compatible with xbmc's MakeLegalFileName function - // (xbox only) - - if ( Name == NULL) return; - char cIllegalChars[] = "<>=?;\"*+,/|"; - unsigned int iIllegalCharSize = strlen(cIllegalChars); - bool isIllegalChar; - unsigned int iSize = strlen(Name); - unsigned int iNewStringSize = 0; - char* strNewString = new char[iSize + 1]; - - // only copy the legal characters to the new filename - for (unsigned int i = 0; i < iSize; i++) - { - isIllegalChar = false; - // check for illigal chars - for (unsigned j = 0; j < iIllegalCharSize; j++) - if (Name[i] == cIllegalChars[j]) isIllegalChar = true; - // FATX only allows chars from 32 till 127 - if (isIllegalChar == false && - Name[i] > 31 && Name[i] < 127) strNewString[iNewStringSize++] = Name[i]; - } - strNewString[iNewStringSize] = '\0'; - - if (IsFATX) - { - // since we can only write to samba shares and hd, we assume this has to be a fatx filename - // thus we have to strip it down to 42 chars (samba doesn't have this limitation) - - char* FileName = PointToName(strNewString); - int iFileNameSize = strlen(FileName); - // no need to keep the extension, just strip it down to 42 characters - if (iFileNameSize > 42 && bKeepExtension == false) FileName[42] = '\0'; - - // we want to keep the extension - else if (iFileNameSize > 42 && bKeepExtension == true) - { - char strExtension[42]; - unsigned int iExtensionLength = iFileNameSize - (strrchr(FileName, '.') - FileName); - strcpy(strExtension, (FileName + iFileNameSize - iExtensionLength)); - - strcpy(FileName + (42 - iExtensionLength), strExtension); - } - } - - strcpy(Name, strNewString); - delete[] strNewString; -} - -char* UnixSlashToDos(char *SrcName,char *DestName,uint MaxLength) -{ - if (DestName!=NULL && DestName!=SrcName) - strcpy(DestName,SrcName); - for (char *s=SrcName;*s!=0;s=charnext(s)) - { - if (*s=='/') - { - if (DestName==NULL) - *s='\\'; - else - DestName[s-SrcName]='\\'; - } - } - return(DestName==NULL ? SrcName:DestName); -} - - -char* DosSlashToUnix(char *SrcName,char *DestName,uint MaxLength) -{ - if (DestName!=NULL && DestName!=SrcName) - { - if (strlen(SrcName)>=MaxLength) - { - *DestName=0; - return(DestName); - } - else - strcpy(DestName,SrcName); - } - for (char *s=SrcName;*s!=0;s=charnext(s)) - { - if (*s=='\\') - { - if (DestName==NULL) - *s='/'; - else - DestName[s-SrcName]='/'; - } - } - return(DestName==NULL ? SrcName:DestName); -} - - -bool IsFullPath(const char *Path) -{ - char PathOnly[NM]; - GetFilePath(Path,PathOnly); - if (IsWildcard(PathOnly)) - return(true); -#if defined(_WIN_32) || defined(_EMX) - return(Path[0]=='\\' && Path[1]=='\\' || - IsDiskLetter(Path) && IsPathDiv(Path[2])); -#else - return(IsPathDiv(Path[0])); -#endif -} - - -bool IsDiskLetter(const char *Path) -{ - char Letter=toupper(Path[0]); - return(Letter>='A' && Letter<='Z' && IsDriveDiv(Path[1])); -} - - -void GetPathRoot(const char *Path,char *Root) -{ - *Root=0; - if (IsDiskLetter(Path)) - sprintf(Root,"%c:\\",*Path); - else - if (Path[0]=='\\' && Path[1]=='\\') - { - const char *Slash=strchr(Path+2,'\\'); - if (Slash!=NULL) - { - int Length; - if ((Slash=strchr(Slash+1,'\\'))!=NULL) - Length=Slash-Path+1; - else - Length=strlen(Path); - strncpy(Root,Path,Length); - Root[Length]=0; - } - } -} - - -int ParseVersionFileName(char *Name,wchar *NameW,bool Truncate) -{ - int Version=0; - char *VerText=strrchrd(Name,';'); - if (VerText!=NULL) - { - Version=atoi(VerText+1); - if (Truncate) - *VerText=0; - } - if (NameW!=NULL) - { - wchar *VerTextW=strrchrw(NameW,';'); - if (VerTextW!=NULL) - { - if (Version==0) - Version=atoiw(VerTextW+1); - if (Truncate) - *VerTextW=0; - } - } - return(Version); -} - - -#ifndef SFX_MODULE -char* VolNameToFirstName(const char *VolName,char *FirstName,bool NewNumbering) -{ - if (FirstName!=VolName) - strcpy(FirstName,VolName); - char *VolNumStart=FirstName; - if (NewNumbering) - { - int N='1'; - for (char *ChPtr=GetVolNumPart(FirstName);ChPtr>FirstName;ChPtr--) - if (isdigit(*ChPtr)) - { - *ChPtr=N; - N='0'; - } - else - if (N=='0') - { - VolNumStart=ChPtr+1; - break; - } - } - else - { - SetExt(FirstName,"rar"); - VolNumStart=GetExt(FirstName); - } - if (!FileExist(FirstName)) - { - char Mask[NM]; - strcpy(Mask,FirstName); - SetExt(Mask,"*"); - FindFile Find; - Find.SetMask(Mask); - struct FindData FD; - while (Find.Next(&FD)) - { - Archive Arc; - if (Arc.Open(FD.Name,FD.NameW) && Arc.IsArchive(true) && !Arc.NotFirstVolume) - { - strcpy(FirstName,FD.Name); - break; - } - } - } - return(VolNumStart); -} -#endif - - - - -wchar* GetWideName(const char *Name,const wchar *NameW,wchar *DestW) -{ - if (NameW!=NULL && *NameW!=0) - { - if (DestW!=NameW) - strcpyw(DestW,NameW); - } - else - CharToWide(Name,DestW); - return(DestW); -} - - - - - diff --git a/lib/UnrarXLib/pathfn.hpp b/lib/UnrarXLib/pathfn.hpp deleted file mode 100644 index 4f2fd7c3d5..0000000000 --- a/lib/UnrarXLib/pathfn.hpp +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef _RAR_PATHFN_ -#define _RAR_PATHFN_ - -char* PointToName(const char *Path); -wchar* PointToName(const wchar *Path); -char* PointToLastChar(const char *Path); -char* ConvertPath(const char *SrcPath,char *DestPath); -wchar* ConvertPath(const wchar *SrcPath,wchar *DestPath); -void SetExt(char *Name,const char *NewExt); -void SetExt(wchar *Name,const wchar *NewExt); -void SetSFXExt(char *SFXName); -void SetSFXExt(wchar *SFXName); -char *GetExt(const char *Name); -wchar *GetExt(const wchar *Name); -bool CmpExt(const char *Name,const char *Ext); -bool IsWildcard(const char *Str,const wchar *StrW=NULL); -bool IsPathDiv(int Ch); -bool IsDriveDiv(int Ch); -int GetPathDisk(const char *Path); -void AddEndSlash(char *Path); -void AddEndSlash(wchar *Path); -void GetFilePath(const char *FullName,char *Path); -void GetFilePath(const wchar *FullName,wchar *Path); -void RemoveNameFromPath(char *Path); -void RemoveNameFromPath(wchar *Path); -bool EnumConfigPaths(char *Path,int Number); -void GetConfigName(const char *Name,char *FullName,bool CheckExist); -char* GetVolNumPart(char *ArcName); -void NextVolumeName(char *ArcName,bool OldNumbering); -bool IsNameUsable(const char *Name); -void MakeNameUsable(char *Name,bool KeepExtension, bool IsFatx); -char* UnixSlashToDos(char *SrcName,char *DestName=NULL,uint MaxLength=NM); -char* DosSlashToUnix(char *SrcName,char *DestName=NULL,uint MaxLength=NM); -bool IsFullPath(const char *Path); -bool IsDiskLetter(const char *Path); -void GetPathRoot(const char *Path,char *Root); -int ParseVersionFileName(char *Name,wchar *NameW,bool Truncate); -char* VolNameToFirstName(const char *VolName,char *FirstName,bool NewNumbering); -wchar* GetWideName(const char *Name,const wchar *NameW,wchar *DestW); - -void MakeSubRar(char * destname, char * rarname); - -inline char* GetOutputName(const char *Name) {return((char *)Name);} - -#endif diff --git a/lib/UnrarXLib/rar.cpp b/lib/UnrarXLib/rar.cpp deleted file mode 100644 index 2a2de90898..0000000000 --- a/lib/UnrarXLib/rar.cpp +++ /dev/null @@ -1,442 +0,0 @@ -#include "rar.hpp" -#include "UnrarX.hpp" -#include "filesystem/File.h" -#include "smallfn.cpp" -#include <memory> - -using namespace std; - -#ifdef _DJGPP -extern "C" char **__crt0_glob_function (char *arg) { return 0; } -extern "C" void __crt0_load_environment_file (char *progname) { } -#endif - -#if !defined(GUI) && !defined(RARDLL) && !defined(TARGET_POSIX) && !defined(_XBMC) -int main(int argc, char *argv[]) -{ -#ifdef _UNIX - setlocale(LC_ALL,""); -#endif -#ifndef SFX_MODULE - setbuf(stdout,NULL); - - #ifdef _EMX - EnumConfigPaths(argv[0],-1); - #endif -#endif - - ErrHandler.SetSignalHandlers(true); - - RARInitData(); - -#ifdef SFX_MODULE - char ModuleName[NM]; -#ifdef _WIN_32 - GetModuleFileName(NULL,ModuleName,sizeof(ModuleName)); -#else - strcpy(ModuleName,argv[0]); -#endif -#endif - -#ifdef _WIN_32 - SetErrorMode(SEM_FAILCRITICALERRORS|SEM_NOOPENFILEERRORBOX); - - -#endif - -#ifdef ALLOW_EXCEPTIONS - try -#endif - { - - CommandData Cmd; -#ifdef SFX_MODULE - strcpy(Cmd.Command,"X"); - char *Switch=NULL; -#ifdef _SFX_RTL_ - char *CmdLine=GetCommandLine(); - if (CmdLine!=NULL && *CmdLine=='\"') - CmdLine=strchr(CmdLine+1,'\"'); - if (CmdLine!=NULL && (CmdLine=strpbrk(CmdLine," /"))!=NULL) - { - while (isspace(*CmdLine)) - CmdLine++; - Switch=CmdLine; - } -#else - Switch=argc>1 ? argv[1]:NULL; -#endif - if (Switch!=NULL && Cmd.IsSwitch(Switch[0])) - { - int UpperCmd=toupper(Switch[1]); - switch(UpperCmd) - { - case 'T': - case 'V': - Cmd.Command[0]=UpperCmd; - break; - case '?': - Cmd.OutHelp(); - break; - } - } - Cmd.AddArcName(ModuleName,NULL); -#else - if (Cmd.IsConfigEnabled(argc,argv)) - { - Cmd.ReadConfig(argc,argv); - Cmd.ParseEnvVar(); - } - for (int I=1;I<argc;I++) - Cmd.ParseArg(argv[I],NULL); -#endif - Cmd.ParseDone(); - - - InitConsoleOptions(Cmd.MsgStream,Cmd.Sound); - InitSystemOptions(Cmd.SleepTime); - InitLogOptions(Cmd.LogName); - ErrHandler.SetSilent(Cmd.AllYes || Cmd.MsgStream==MSG_NULL); - ErrHandler.SetShutdown(Cmd.Shutdown); - - Cmd.OutTitle(); - Cmd.ProcessCommand(); - } -#ifdef ALLOW_EXCEPTIONS - catch (int ErrCode) - { - ErrHandler.SetErrorCode(ErrCode); - } -#ifdef ENABLE_BAD_ALLOC - catch (bad_alloc) - { - ErrHandler.SetErrorCode(MEMORY_ERROR); - } -#endif - catch (...) - { - ErrHandler.SetErrorCode(FATAL_ERROR); - } -#endif - File::RemoveCreated(); -#if defined(SFX_MODULE) && defined(_DJGPP) - _chmod(ModuleName,1,0x20); -#endif - return(ErrHandler.GetErrorCode()); -} -#endif - - -#if defined(TARGET_POSIX) || defined(_XBMC) -/*-------------------------------------------------------------------------*\ - XBOX interface -\*-------------------------------------------------------------------------*/ - -/*-------------------------------------------------------------------------*\ - Extract a RAR file - rarfile - Name of the RAR file to uncompress - targetPath - The path to which we want to uncompress - fileToExtract - The file inside the archive we want to uncompress, - or NULL for all files. - libpassword - Password (for encrypted archives) -\*-------------------------------------------------------------------------*/ -int urarlib_get(char *rarfile, char *targetPath, char *fileToExtract, char *libpassword, int64_t* iOffset, progress_callback progress, void *context) -{ - InitCRC(); - int bRes = 1; - - // Set the arguments for the extract command - auto_ptr<CommandData> pCmd (new CommandData); - - if( pCmd.get() ) - { - strcpy(pCmd->Command, "X"); - pCmd->AddArcName(rarfile,NULL); - strncpy(pCmd->ExtrPath, targetPath, sizeof(pCmd->Command) - 2); - pCmd->ExtrPath[sizeof(pCmd->Command) - 2] = '\0'; - AddEndSlash(pCmd->ExtrPath); - pCmd->ParseArg((char*)"-va",NULL); - if (fileToExtract) - { - if (*fileToExtract) - { - pCmd->FileArgs->AddString(fileToExtract); - // Uncomment this if you want to extract a single file without the full path - strcpy(pCmd->Command, "E"); - } - } - else - { - pCmd->FileArgs->AddString(MASKALL); - } - - // Set password for encrypted archives - if (libpassword) - if (strlen(libpassword)!=0) - { - strncpy(pCmd->Password, libpassword, sizeof(pCmd->Password) - 1); - pCmd->Password[sizeof(pCmd->Password) - 1] = '\0'; - } - - // Opent the archive - auto_ptr<Archive> pArc( new Archive(pCmd.get()) ); - - if( pArc.get() ) - { - if (!pArc->WOpen(rarfile,NULL)) - return 0; - - if (pArc->IsOpened() && pArc->IsArchive(true)) - { - auto_ptr<CmdExtract> pExtract( new CmdExtract ); - - if( pExtract.get() ) - { - pExtract->GetDataIO().SetCurrentCommand(*(pCmd->Command)); - struct FindData FD; - if (FindFile::FastFind(rarfile,NULL,&FD)) - pExtract->GetDataIO().TotalArcSize+=FD.Size; - pExtract->ExtractArchiveInit(pCmd.get(),*pArc); - - pExtract->GetDataIO().m_progress = progress; - pExtract->GetDataIO().m_context = context; - - int64_t iOff=0; - bool bSeeked = false; - while (1) - { - iOff = pArc->Tell(); - int Size=pArc->ReadHeader(); - int Type=pArc->GetHeaderType(); - - if (Type == ENDARC_HEAD) - break; - - if (Type != FILE_HEAD) - { - pArc->SeekToNext(); - continue; - } - - bool Repeat=false; - if (!pExtract->ExtractCurrentFile(pCmd.get(),*pArc,Size,Repeat)) - { - bRes = FALSE; - break; - } - - if (pExtract->GetDataIO().bQuit) - { - bRes = 2; - break; - } - - if (fileToExtract) - { - if (*fileToExtract) - { - bool EqualNames=false; - int MatchNumber=pCmd->IsProcessFile(pArc->NewLhd,&EqualNames); - bool ExactMatch=MatchNumber!=0; - if (ExactMatch) - { - if (iOffset) - *iOffset = iOff; - break; - } - } - } - if (iOffset && !bSeeked && !pArc->Solid) - { - if (*iOffset > -1) - { - bSeeked = true; - pArc->Seek(*iOffset,SEEK_SET); - } - } - } - - pExtract->GetDataIO().ProcessedArcSize+=FD.Size; - } - } - } - } - - File::RemoveCreated(); - return bRes; -} - -/*-------------------------------------------------------------------------*\ - List the files in a RAR file - rarfile - Name of the RAR file to uncompress - list - Output. A list of file data of the files in the archive. - The list should be freed with urarlib_freelist(). - libpassword - Password (for encrypted archives) -\*-------------------------------------------------------------------------*/ -int urarlib_list(char *rarfile, ArchiveList_struct **ppList, char *libpassword, bool stopattwo) -{ - if (!ppList) - return 0; - uint FileCount = 0; - InitCRC(); - - // Set the arguments for the extract command - auto_ptr<CommandData> pCmd( new CommandData ); - - { - strcpy(pCmd->Command, "L"); - pCmd->AddArcName(rarfile, NULL); - pCmd->FileArgs->AddString(MASKALL); - pCmd->ParseArg((char*)"-va",NULL); - - // Set password for encrypted archives - if (libpassword) - { - strncpy(pCmd->Password, libpassword, sizeof(pCmd->Password) - 1); - pCmd->Password[sizeof(pCmd->Password) - 1] = '\0'; - } - - // Opent the archive - auto_ptr<Archive> pArc( new Archive(pCmd.get()) ); - if ( pArc.get() ) - { - if (!pArc->WOpen(rarfile,NULL)) - return 0; - - FileCount=0; - *ppList = NULL; - ArchiveList_struct *pPrev = NULL; - int iArchive=0; - while (1) - { - if (pArc->IsOpened() && pArc->IsArchive(true)) - { - int64_t iOffset = pArc->NextBlockPos; - while(pArc->ReadHeader()>0) - { - if (pArc->GetHeaderType() == FILE_HEAD) - { - if (pPrev) - if (stricmp(pArc->NewLhd.FileName,pPrev->item.Name)==0) - { - iOffset = pArc->NextBlockPos; - pArc->SeekToNext(); - continue; - } - - IntToExt(pArc->NewLhd.FileName,pArc->NewLhd.FileName); - ArchiveList_struct *pCurr = (ArchiveList_struct *)malloc(sizeof(ArchiveList_struct)); - if (!pCurr) - break; - if (pPrev) - pPrev->next = pCurr; - if (!*ppList) - *ppList = pCurr; - pCurr->item.NameSize = strlen(pArc->NewLhd.FileName); - // sanity check - if it fails the archive is likely corrupt - if (pCurr->item.NameSize > NM) - { - File::RemoveCreated(); - return 0; - } - - pCurr->item.Name = (char *)malloc(pCurr->item.NameSize + 1); - strcpy(pCurr->item.Name, pArc->NewLhd.FileName); - pCurr->item.NameW = (wchar *)malloc((pCurr->item.NameSize + 1)*sizeof(wchar)); - wcscpy(pCurr->item.NameW, pArc->NewLhd.FileNameW); - pCurr->item.PackSize = pArc->NewLhd.PackSize; - pCurr->item.UnpSize = int32to64(pArc->NewLhd.HighUnpSize,pArc->NewLhd.UnpSize); - pCurr->item.HostOS = pArc->NewLhd.HostOS; - pCurr->item.FileCRC = pArc->NewLhd.FileCRC; - pCurr->item.FileTime = pArc->NewLhd.FileTime; - pCurr->item.UnpVer = pArc->NewLhd.UnpVer; - pCurr->item.Method = pArc->NewLhd.Method; - pCurr->item.FileAttr = pArc->NewLhd.FileAttr; - pCurr->item.iOffset = iOffset; - pCurr->next = NULL; - pPrev = pCurr; - FileCount++; - if (stopattwo && FileCount > 1) - break; - } - iOffset = pArc->NextBlockPos; - if (iOffset > pArc->FileLength()) - { - File::RemoveCreated(); - return 0; - } - pArc->SeekToNext(); - } - if (pCmd->VolSize!=0 && ((pArc->NewLhd.Flags & LHD_SPLIT_AFTER) || (pArc->GetHeaderType()==ENDARC_HEAD && (pArc->EndArcHead.Flags & EARC_NEXT_VOLUME)!=0))) - { - if (FileCount == 1 && iArchive==0) - { - char NextName[NM]; - char LastName[NM]; - strcpy(NextName,pArc->FileName); - while (XFILE::CFile::Exists(NextName)) - { - strcpy(LastName,NextName); - NextVolumeName(NextName,(pArc->NewMhd.Flags & MHD_NEWNUMBERING)==0 || pArc->OldFormat); - } - Archive arc; - if (arc.WOpen(LastName,NULL)) - { - bool bBreak=false; - while(arc.ReadHeader()>0) - { - if (arc.GetHeaderType() == FILE_HEAD) - if (stricmp(arc.NewLhd.FileName,pPrev->item.Name)==0) - { - bBreak=true; - break; - } -// iOffset = pArc->Tell(); - arc.SeekToNext(); - } - if (bBreak) - { - break; - } - } - } - if (MergeArchive(*pArc,NULL,false,*pCmd->Command)) - { - iArchive++; - pArc->Seek(0,SEEK_SET); - } - else - break; - } - else - break; - } - else - break; - } - } - } - - File::RemoveCreated(); - return FileCount; -} - -/*-------------------------------------------------------------------------*\ - Free the file list returned by urarlib_list() - list - The output from urarlib_list() -\*-------------------------------------------------------------------------*/ -void urarlib_freelist(ArchiveList_struct *list) -{ - ArchiveList_struct *p; - while (list) - { - p = list->next; - free(list->item.Name); - free(list->item.NameW); - free(list); - list = p; - } -} - - -#endif diff --git a/lib/UnrarXLib/rar.hpp b/lib/UnrarXLib/rar.hpp deleted file mode 100644 index bee2e46890..0000000000 --- a/lib/UnrarXLib/rar.hpp +++ /dev/null @@ -1,79 +0,0 @@ -#ifndef _RAR_RARCOMMON_ -#define _RAR_RARCOMMON_ - -#include "raros.hpp" -#include "os.hpp" - - -#ifdef RARDLL -#include "dll.hpp" -#endif - -#ifndef _WIN_CE -#include "version.hpp" -#endif -#include "rartypes.hpp" -#include "rardefs.hpp" -#include "rarlang.hpp" -#include "int64.hpp" -#include "unicode.hpp" -#include "errhnd.hpp" -#include "array.hpp" -#include "timefn.hpp" -#include "headers.hpp" -#include "rarfn.hpp" -#include "pathfn.hpp" -#include "strfn.hpp" -#include "strlist.hpp" -#include "file.hpp" -#include "sha1.hpp" -#include "crc.hpp" -#include "rijndael.hpp" -#include "crypt.hpp" -#include "filefn.hpp" -#include "filestr.hpp" -#include "find.hpp" -#include "scantree.hpp" -#include "savepos.hpp" -#include "getbits.hpp" -#include "rdwrfn.hpp" -#include "options.hpp" -#include "archive.hpp" -#include "match.hpp" -#include "cmddata.hpp" -#include "filcreat.hpp" -#include "consio.hpp" -#include "system.hpp" -#include "isnt.hpp" -#include "log.hpp" -#include "rawread.hpp" -#include "encname.hpp" -#include "resource.hpp" -#include "compress.hpp" - -#include "rarvm.hpp" -#include "model.hpp" - - -#include "unpack.hpp" - - -#include "extinfo.hpp" -#include "extract.hpp" - - - -#include "list.hpp" - - - -#include "rs.hpp" -#include "recvol.hpp" -#include "volume.hpp" -#include "smallfn.hpp" -#include "ulinks.hpp" - -#include "global.hpp" - - -#endif diff --git a/lib/UnrarXLib/rardefs.hpp b/lib/UnrarXLib/rardefs.hpp deleted file mode 100644 index 516616581c..0000000000 --- a/lib/UnrarXLib/rardefs.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef _RAR_DEFS_ -#define _RAR_DEFS_ - -#define Min(x,y) (((x)<(y)) ? (x):(y)) -#define Max(x,y) (((x)>(y)) ? (x):(y)) - -#define MAXPASSWORD 128 - -#define DefSFXName "default.sfx" -#define DefSortListName "rarfiles.lst" - -#ifndef FA_RDONLY - #define FA_RDONLY 0x01 - #define FA_HIDDEN 0x02 - #define FA_SYSTEM 0x04 - #define FA_LABEL 0x08 - #define FA_DIREC 0x10 - #define FA_ARCH 0x20 -#endif - -#endif diff --git a/lib/UnrarXLib/rarfn.hpp b/lib/UnrarXLib/rarfn.hpp deleted file mode 100644 index 05ffdbcffd..0000000000 --- a/lib/UnrarXLib/rarfn.hpp +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _RAR_FN_ -#define _RAR_FN_ - -void RARInitData(); - - -#endif diff --git a/lib/UnrarXLib/rarlang.hpp b/lib/UnrarXLib/rarlang.hpp deleted file mode 100644 index 6151d15a94..0000000000 --- a/lib/UnrarXLib/rarlang.hpp +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _RAR_LANG_ -#define _RAR_LANG_ - - #ifdef USE_RC - #include "rarres.hpp" - #else - #include "loclang.hpp" - #endif - -#endif diff --git a/lib/UnrarXLib/raros.hpp b/lib/UnrarXLib/raros.hpp deleted file mode 100644 index 3483da3548..0000000000 --- a/lib/UnrarXLib/raros.hpp +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef _RAR_RAROS_ -#define _RAR_RAROS_ - -#if defined(_XBMC) -#ifndef _WIN_32 - #define _WIN_32 -#endif - #define SILENT -#endif - -#ifdef __EMX__ - #define _EMX -#endif - -#ifdef __DJGPP__ - #define _DJGPP - #define _EMX -#endif - -#if (defined(__WIN32__) || defined(_WIN32)) && !defined(_WIN_32) - #define _WIN_32 -#endif - -#ifdef _WIN32_WCE - #define _WIN_32 - #define _WIN_CE - #ifdef WM_FILECHANGEINFO - #define PC2002 - #else - #undef PC2002 - #endif -#endif - -#ifdef __BEOS__ - #define _UNIX - #define _BEOS -#endif - -#ifdef __APPLE__ - #define _UNIX - #define _APPLE -#endif - -#if !defined(_EMX) && !defined(_WIN_32) && !defined(_BEOS) && !defined(_APPLE) - #define _UNIX -#endif - -#endif diff --git a/lib/UnrarXLib/rartypes.hpp b/lib/UnrarXLib/rartypes.hpp deleted file mode 100644 index 9e4f640fec..0000000000 --- a/lib/UnrarXLib/rartypes.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef _RAR_TYPES_ -#define _RAR_TYPES_ - -typedef unsigned char byte; //8 bits -typedef unsigned short ushort; //preferably 16 bits, but can be more -typedef unsigned int uint; //32 bits or more - -typedef unsigned int uint32; //32 bits exactly -typedef int sint32; //signed 32 bits exactly -#define PRESENT_INT32 - -#if defined(_WIN_32) || defined(__GNUC__) || defined(__sgi) || defined(_AIX) || defined(__sun) || defined(__hpux) -typedef wchar_t wchar; -#else -typedef ushort wchar; -#endif - -#define SHORT16(x) (sizeof(ushort)==2 ? (ushort)(x):((x)&0xffff)) -#define UINT32(x) (sizeof(uint32)==4 ? (uint32)(x):((x)&0xffffffff)) - -#endif diff --git a/lib/UnrarXLib/rarvm.cpp b/lib/UnrarXLib/rarvm.cpp deleted file mode 100644 index 901c35dcb4..0000000000 --- a/lib/UnrarXLib/rarvm.cpp +++ /dev/null @@ -1,1054 +0,0 @@ -#include "rar.hpp" - -#include "rarvmtbl.cpp" - -RarVM::RarVM() -{ - Mem=NULL; -} - - -RarVM::~RarVM() -{ - delete[] Mem; -} - - -void RarVM::Init() -{ - if (Mem==NULL) - Mem=new byte[VM_MEMSIZE+4]; -} - - -inline uint RarVM::GetValue(bool ByteMode,uint *Addr) -{ - if (ByteMode) - return(*(byte *)Addr); - else - { -#if defined(BIG_ENDIAN) || !defined(ALLOW_NOT_ALIGNED_INT) - byte *B=(byte *)Addr; - return UINT32((uint)B[0]|((uint)B[1]<<8)|((uint)B[2]<<16)|((uint)B[3]<<24)); -#else - return UINT32(*Addr); -#endif - } -} - -#if defined(BIG_ENDIAN) || !defined(ALLOW_NOT_ALIGNED_INT) - #define GET_VALUE(ByteMode,Addr) GetValue(ByteMode,(uint *)Addr) -#else - #define GET_VALUE(ByteMode,Addr) ((ByteMode) ? (*(byte *)(Addr)):UINT32(*(uint *)(Addr))) -#endif - - -inline void RarVM::SetValue(bool ByteMode,uint *Addr,uint Value) -{ - if (ByteMode) - *(byte *)Addr=Value; - else - { -#if defined(BIG_ENDIAN) || !defined(ALLOW_NOT_ALIGNED_INT) || !defined(PRESENT_INT32) - ((byte *)Addr)[0]=(byte)Value; - ((byte *)Addr)[1]=(byte)(Value>>8); - ((byte *)Addr)[2]=(byte)(Value>>16); - ((byte *)Addr)[3]=(byte)(Value>>24); -#else - *(uint32 *)Addr=Value; -#endif - } -} - -#if defined(BIG_ENDIAN) || !defined(ALLOW_NOT_ALIGNED_INT) || !defined(PRESENT_INT32) - #define SET_VALUE(ByteMode,Addr,Value) SetValue(ByteMode,(uint *)Addr,Value) -#else - #define SET_VALUE(ByteMode,Addr,Value) ((ByteMode) ? (*(byte *)(Addr)=(Value)):(*(uint32 *)(Addr)=((uint32)(Value)))) -#endif - - -void RarVM::SetValue(uint *Addr,uint Value) -{ - SetValue(false,Addr,Value); -} - - -inline uint* RarVM::GetOperand(VM_PreparedOperand *CmdOp) -{ - if (CmdOp->Type==VM_OPREGMEM) - return((uint *)&Mem[(*CmdOp->Addr+CmdOp->Base)&VM_MEMMASK]); - else - return(CmdOp->Addr); -} - - -void RarVM::Execute(VM_PreparedProgram *Prg) -{ - memcpy(R,Prg->InitR,sizeof(Prg->InitR)); - unsigned int GlobalSize=Min(Prg->GlobalData.Size(),VM_GLOBALMEMSIZE); - if (GlobalSize) - memcpy(Mem+VM_GLOBALMEMADDR,&Prg->GlobalData[0],GlobalSize); - unsigned int StaticSize=Min((uint)Prg->StaticData.Size(),VM_GLOBALMEMSIZE-GlobalSize); - if (StaticSize) - memcpy(Mem+VM_GLOBALMEMADDR+GlobalSize,&Prg->StaticData[0],StaticSize); - - R[7]=VM_MEMSIZE; - Flags=0; - - VM_PreparedCommand *PreparedCode=Prg->AltCmd ? Prg->AltCmd:&Prg->Cmd[0]; - if (!ExecuteCode(PreparedCode,Prg->CmdCount)) - PreparedCode[0].OpCode=VM_RET; - uint NewBlockPos=GET_VALUE(false,&Mem[VM_GLOBALMEMADDR+0x20])&VM_MEMMASK; - uint NewBlockSize=GET_VALUE(false,&Mem[VM_GLOBALMEMADDR+0x1c])&VM_MEMMASK; - if (NewBlockPos+NewBlockSize>=VM_MEMSIZE) - NewBlockPos=NewBlockSize=0; - Prg->FilteredData=Mem+NewBlockPos; - Prg->FilteredDataSize=NewBlockSize; - - Prg->GlobalData.Reset(); - uint DataSize=Min(GET_VALUE(false,(uint*)&Mem[VM_GLOBALMEMADDR+0x30]),VM_GLOBALMEMSIZE); - if (DataSize!=0) - { - Prg->GlobalData.Add(DataSize+VM_FIXEDGLOBALSIZE); - memcpy(&Prg->GlobalData[0],&Mem[VM_GLOBALMEMADDR],DataSize+VM_FIXEDGLOBALSIZE); - } -} - - -#define SET_IP(IP) \ - if ((IP)>=(uint)CodeSize) \ - return(true); \ - if (--MaxOpCount<=0) \ - return(false); \ - Cmd=PreparedCode+(IP); - -bool RarVM::ExecuteCode(VM_PreparedCommand *PreparedCode,int CodeSize) -{ - int MaxOpCount=25000000; - VM_PreparedCommand *Cmd=PreparedCode; - while (1) - { - uint *Op1=GetOperand(&Cmd->Op1); - uint *Op2=GetOperand(&Cmd->Op2); - switch(Cmd->OpCode) - { -#ifndef NORARVM - case VM_MOV: - SET_VALUE(Cmd->ByteMode,Op1,GET_VALUE(Cmd->ByteMode,Op2)); - break; -#ifdef VM_OPTIMIZE - case VM_MOVB: - SET_VALUE(true,Op1,GET_VALUE(true,Op2)); - break; - case VM_MOVD: - SET_VALUE(false,Op1,GET_VALUE(false,Op2)); - break; -#endif - case VM_CMP: - { - uint Value1=GET_VALUE(Cmd->ByteMode,Op1); - uint Result=UINT32(Value1-GET_VALUE(Cmd->ByteMode,Op2)); - Flags=Result==0 ? VM_FZ:(Result>Value1)|(Result&VM_FS); - } - break; -#ifdef VM_OPTIMIZE - case VM_CMPB: - { - uint Value1=GET_VALUE(true,Op1); - uint Result=UINT32(Value1-GET_VALUE(true,Op2)); - Flags=Result==0 ? VM_FZ:(Result>Value1)|(Result&VM_FS); - } - break; - case VM_CMPD: - { - uint Value1=GET_VALUE(false,Op1); - uint Result=UINT32(Value1-GET_VALUE(false,Op2)); - Flags=Result==0 ? VM_FZ:(Result>Value1)|(Result&VM_FS); - } - break; -#endif - case VM_ADD: - { - uint Value1=GET_VALUE(Cmd->ByteMode,Op1); - uint Result=UINT32(Value1+GET_VALUE(Cmd->ByteMode,Op2)); - Flags=Result==0 ? VM_FZ:(Result<Value1)|(Result&VM_FS); - SET_VALUE(Cmd->ByteMode,Op1,Result); - } - break; -#ifdef VM_OPTIMIZE - case VM_ADDB: - SET_VALUE(true,Op1,GET_VALUE(true,Op1)+GET_VALUE(true,Op2)); - break; - case VM_ADDD: - SET_VALUE(false,Op1,GET_VALUE(false,Op1)+GET_VALUE(false,Op2)); - break; -#endif - case VM_SUB: - { - uint Value1=GET_VALUE(Cmd->ByteMode,Op1); - uint Result=UINT32(Value1-GET_VALUE(Cmd->ByteMode,Op2)); - Flags=Result==0 ? VM_FZ:(Result>Value1)|(Result&VM_FS); - SET_VALUE(Cmd->ByteMode,Op1,Result); - } - break; -#ifdef VM_OPTIMIZE - case VM_SUBB: - SET_VALUE(true,Op1,GET_VALUE(true,Op1)-GET_VALUE(true,Op2)); - break; - case VM_SUBD: - SET_VALUE(false,Op1,GET_VALUE(false,Op1)-GET_VALUE(false,Op2)); - break; -#endif - case VM_JZ: - if ((Flags & VM_FZ)!=0) - { - SET_IP(GET_VALUE(false,Op1)); - continue; - } - break; - case VM_JNZ: - if ((Flags & VM_FZ)==0) - { - SET_IP(GET_VALUE(false,Op1)); - continue; - } - break; - case VM_INC: - { - uint Result=UINT32(GET_VALUE(Cmd->ByteMode,Op1)+1); - SET_VALUE(Cmd->ByteMode,Op1,Result); - Flags=Result==0 ? VM_FZ:Result&VM_FS; - } - break; -#ifdef VM_OPTIMIZE - case VM_INCB: - SET_VALUE(true,Op1,GET_VALUE(true,Op1)+1); - break; - case VM_INCD: - SET_VALUE(false,Op1,GET_VALUE(false,Op1)+1); - break; -#endif - case VM_DEC: - { - uint Result=UINT32(GET_VALUE(Cmd->ByteMode,Op1)-1); - SET_VALUE(Cmd->ByteMode,Op1,Result); - Flags=Result==0 ? VM_FZ:Result&VM_FS; - } - break; -#ifdef VM_OPTIMIZE - case VM_DECB: - SET_VALUE(true,Op1,GET_VALUE(true,Op1)-1); - break; - case VM_DECD: - SET_VALUE(false,Op1,GET_VALUE(false,Op1)-1); - break; -#endif - case VM_JMP: - SET_IP(GET_VALUE(false,Op1)); - continue; - case VM_XOR: - { - uint Result=UINT32(GET_VALUE(Cmd->ByteMode,Op1)^GET_VALUE(Cmd->ByteMode,Op2)); - Flags=Result==0 ? VM_FZ:Result&VM_FS; - SET_VALUE(Cmd->ByteMode,Op1,Result); - } - break; - case VM_AND: - { - uint Result=UINT32(GET_VALUE(Cmd->ByteMode,Op1)&GET_VALUE(Cmd->ByteMode,Op2)); - Flags=Result==0 ? VM_FZ:Result&VM_FS; - SET_VALUE(Cmd->ByteMode,Op1,Result); - } - break; - case VM_OR: - { - uint Result=UINT32(GET_VALUE(Cmd->ByteMode,Op1)|GET_VALUE(Cmd->ByteMode,Op2)); - Flags=Result==0 ? VM_FZ:Result&VM_FS; - SET_VALUE(Cmd->ByteMode,Op1,Result); - } - break; - case VM_TEST: - { - uint Result=UINT32(GET_VALUE(Cmd->ByteMode,Op1)&GET_VALUE(Cmd->ByteMode,Op2)); - Flags=Result==0 ? VM_FZ:Result&VM_FS; - } - break; - case VM_JS: - if ((Flags & VM_FS)!=0) - { - SET_IP(GET_VALUE(false,Op1)); - continue; - } - break; - case VM_JNS: - if ((Flags & VM_FS)==0) - { - SET_IP(GET_VALUE(false,Op1)); - continue; - } - break; - case VM_JB: - if ((Flags & VM_FC)!=0) - { - SET_IP(GET_VALUE(false,Op1)); - continue; - } - break; - case VM_JBE: - if ((Flags & (VM_FC|VM_FZ))!=0) - { - SET_IP(GET_VALUE(false,Op1)); - continue; - } - break; - case VM_JA: - if ((Flags & (VM_FC|VM_FZ))==0) - { - SET_IP(GET_VALUE(false,Op1)); - continue; - } - break; - case VM_JAE: - if ((Flags & VM_FC)==0) - { - SET_IP(GET_VALUE(false,Op1)); - continue; - } - break; - case VM_PUSH: - R[7]-=4; - SET_VALUE(false,(uint *)&Mem[R[7]&VM_MEMMASK],GET_VALUE(false,Op1)); - break; - case VM_POP: - SET_VALUE(false,Op1,GET_VALUE(false,(uint *)&Mem[R[7] & VM_MEMMASK])); - R[7]+=4; - break; - case VM_CALL: - R[7]-=4; - SET_VALUE(false,(uint *)&Mem[R[7]&VM_MEMMASK],Cmd-PreparedCode+1); - SET_IP(GET_VALUE(false,Op1)); - continue; - case VM_NOT: - SET_VALUE(Cmd->ByteMode,Op1,~GET_VALUE(Cmd->ByteMode,Op1)); - break; - case VM_SHL: - { - uint Value1=GET_VALUE(Cmd->ByteMode,Op1); - uint Value2=GET_VALUE(Cmd->ByteMode,Op2); - uint Result=UINT32(Value1<<Value2); - Flags=(Result==0 ? VM_FZ:(Result&VM_FS))|((Value1<<(Value2-1))&0x80000000 ? VM_FC:0); - SET_VALUE(Cmd->ByteMode,Op1,Result); - } - break; - case VM_SHR: - { - uint Value1=GET_VALUE(Cmd->ByteMode,Op1); - uint Value2=GET_VALUE(Cmd->ByteMode,Op2); - uint Result=UINT32(Value1>>Value2); - Flags=(Result==0 ? VM_FZ:(Result&VM_FS))|((Value1>>(Value2-1))&VM_FC); - SET_VALUE(Cmd->ByteMode,Op1,Result); - } - break; - case VM_SAR: - { - uint Value1=GET_VALUE(Cmd->ByteMode,Op1); - uint Value2=GET_VALUE(Cmd->ByteMode,Op2); - uint Result=UINT32(((int)Value1)>>Value2); - Flags=(Result==0 ? VM_FZ:(Result&VM_FS))|((Value1>>(Value2-1))&VM_FC); - SET_VALUE(Cmd->ByteMode,Op1,Result); - } - break; - case VM_NEG: - { - uint Result=UINT32(-GET_VALUE(Cmd->ByteMode,Op1)); - Flags=Result==0 ? VM_FZ:VM_FC|(Result&VM_FS); - SET_VALUE(Cmd->ByteMode,Op1,Result); - } - break; -#ifdef VM_OPTIMIZE - case VM_NEGB: - SET_VALUE(true,Op1,-GET_VALUE(true,Op1)); - break; - case VM_NEGD: - SET_VALUE(false,Op1,-GET_VALUE(false,Op1)); - break; -#endif - case VM_PUSHA: - { - const int RegCount=sizeof(R)/sizeof(R[0]); - for (int I=0,SP=R[7]-4;I<RegCount;I++,SP-=4) - SET_VALUE(false,(uint *)&Mem[SP & VM_MEMMASK],R[I]); - R[7]-=RegCount*4; - } - break; - case VM_POPA: - { - const uint RegCount=sizeof(R)/sizeof(R[0]); - for (uint I=0,SP=R[7];I<RegCount;I++,SP+=4) - R[7-I]=GET_VALUE(false,(uint *)&Mem[SP & VM_MEMMASK]); - } - break; - case VM_PUSHF: - R[7]-=4; - SET_VALUE(false,(uint *)&Mem[R[7]&VM_MEMMASK],Flags); - break; - case VM_POPF: - Flags=GET_VALUE(false,(uint *)&Mem[R[7] & VM_MEMMASK]); - R[7]+=4; - break; - case VM_MOVZX: - SET_VALUE(false,Op1,GET_VALUE(true,Op2)); - break; - case VM_MOVSX: - SET_VALUE(false,Op1,(signed char)GET_VALUE(true,Op2)); - break; - case VM_XCHG: - { - uint Value1=GET_VALUE(Cmd->ByteMode,Op1); - SET_VALUE(Cmd->ByteMode,Op1,GET_VALUE(Cmd->ByteMode,Op2)); - SET_VALUE(Cmd->ByteMode,Op2,Value1); - } - break; - case VM_MUL: - { - uint Result=GET_VALUE(Cmd->ByteMode,Op1)*GET_VALUE(Cmd->ByteMode,Op2); - SET_VALUE(Cmd->ByteMode,Op1,Result); - } - break; - case VM_DIV: - { - uint Divider=GET_VALUE(Cmd->ByteMode,Op2); - if (Divider!=0) - { - uint Result=GET_VALUE(Cmd->ByteMode,Op1)/Divider; - SET_VALUE(Cmd->ByteMode,Op1,Result); - } - } - break; - case VM_ADC: - { - uint Value1=GET_VALUE(Cmd->ByteMode,Op1); - uint FC=(Flags&VM_FC); - uint Result=UINT32(Value1+GET_VALUE(Cmd->ByteMode,Op2)+FC); - Flags=Result==0 ? VM_FZ:(Result<Value1 || (Result==Value1 && FC))|(Result&VM_FS); - SET_VALUE(Cmd->ByteMode,Op1,Result); - } - break; - case VM_SBB: - { - uint Value1=GET_VALUE(Cmd->ByteMode,Op1); - uint FC=(Flags&VM_FC); - uint Result=UINT32(Value1-GET_VALUE(Cmd->ByteMode,Op2)-FC); - Flags=Result==0 ? VM_FZ:(Result>Value1 || (Result==Value1 && FC))|(Result&VM_FS); - SET_VALUE(Cmd->ByteMode,Op1,Result); - } - break; -#endif - case VM_RET: - if (R[7]>=VM_MEMSIZE) - return(true); - SET_IP(GET_VALUE(false,(uint *)&Mem[R[7] & VM_MEMMASK])); - R[7]+=4; - continue; -#ifdef VM_STANDARDFILTERS - case VM_STANDARD: - ExecuteStandardFilter((VM_StandardFilters)Cmd->Op1.Data); - break; -#endif - case VM_PRINT: -#ifdef DEBUG - PrintState(Cmd-PreparedCode); -#endif - break; - } - Cmd++; - --MaxOpCount; - } -} - - -void RarVM::PrintState(uint IP) -{ -#if defined(DEBUG) && !defined(GUI) && !defined(SILENT) - mprintf("\n"); - for (int I=0;I<sizeof(R)/sizeof(R[0]);I++) - mprintf("R%d=%08X\t%s",I,R[I],I==3 ? "\n":""); - mprintf("\nIP=%08X\tFlags: C=%d S=%d",IP,(Flags & VM_FC)!=0,(Flags & VM_FS)!=0); - mprintf("\n"); -#endif -} - - -void RarVM::Prepare(byte *Code,int CodeSize,VM_PreparedProgram *Prg) -{ - InitBitInput(); - memcpy(InBuf,Code,Min(CodeSize,BitInput::MAX_SIZE)); - - byte XorSum=0; - for (int I=1;I<CodeSize;I++) - XorSum^=Code[I]; - - faddbits(8); - - Prg->CmdCount=0; - if (XorSum==Code[0]) - { -#ifdef VM_STANDARDFILTERS - VM_StandardFilters FilterType=IsStandardFilter(Code,CodeSize); - if (FilterType!=VMSF_NONE) - { - Prg->Cmd.Add(1); - VM_PreparedCommand *CurCmd=&Prg->Cmd[Prg->CmdCount++]; - CurCmd->OpCode=VM_STANDARD; - CurCmd->Op1.Data=FilterType; - CurCmd->Op1.Addr=&CurCmd->Op1.Data; - CurCmd->Op2.Addr=&CurCmd->Op2.Data; - CurCmd->Op1.Type=CurCmd->Op2.Type=VM_OPNONE; - CodeSize=0; - } -#endif - uint DataFlag=fgetbits(); - faddbits(1); - if (DataFlag&0x8000) - { - int DataSize=ReadData(*this)+1; - for (int I=0;InAddr<CodeSize && I<DataSize;I++) - { - Prg->StaticData.Add(1); - Prg->StaticData[I]=fgetbits()>>8; - faddbits(8); - } - } - while (InAddr<CodeSize) - { - Prg->Cmd.Add(1); - VM_PreparedCommand *CurCmd=&Prg->Cmd[Prg->CmdCount]; - uint Data=fgetbits(); - if ((Data&0x8000)==0) - { - CurCmd->OpCode=(VM_Commands)(Data>>12); - faddbits(4); - } - else - { - CurCmd->OpCode=(VM_Commands)((Data>>10)-24); - faddbits(6); - } - if (VM_CmdFlags[CurCmd->OpCode] & VMCF_BYTEMODE) - { - CurCmd->ByteMode=fgetbits()>>15; - faddbits(1); - } - else - CurCmd->ByteMode=0; - CurCmd->Op1.Type=CurCmd->Op2.Type=VM_OPNONE; - int OpNum=(VM_CmdFlags[CurCmd->OpCode] & VMCF_OPMASK); - CurCmd->Op1.Addr=CurCmd->Op2.Addr=NULL; - if (OpNum>0) - { - DecodeArg(CurCmd->Op1,CurCmd->ByteMode); - if (OpNum==2) - DecodeArg(CurCmd->Op2,CurCmd->ByteMode); - else - { - if (CurCmd->Op1.Type==VM_OPINT && (VM_CmdFlags[CurCmd->OpCode]&(VMCF_JUMP|VMCF_PROC))) - { - int Distance=CurCmd->Op1.Data; - if (Distance>=256) - Distance-=256; - else - { - if (Distance>=136) - Distance-=264; - else - if (Distance>=16) - Distance-=8; - else - if (Distance>=8) - Distance-=16; - Distance+=Prg->CmdCount; - } - CurCmd->Op1.Data=Distance; - } - } - } - Prg->CmdCount++; - } - } - Prg->Cmd.Add(1); - VM_PreparedCommand *CurCmd=&Prg->Cmd[Prg->CmdCount++]; - CurCmd->OpCode=VM_RET; - CurCmd->Op1.Addr=&CurCmd->Op1.Data; - CurCmd->Op2.Addr=&CurCmd->Op2.Data; - CurCmd->Op1.Type=CurCmd->Op2.Type=VM_OPNONE; - - for (int I=0;I<Prg->CmdCount;I++) - { - VM_PreparedCommand *Cmd=&Prg->Cmd[I]; - if (Cmd->Op1.Addr==NULL) - Cmd->Op1.Addr=&Cmd->Op1.Data; - if (Cmd->Op2.Addr==NULL) - Cmd->Op2.Addr=&Cmd->Op2.Data; - } - -#ifdef VM_OPTIMIZE - if (CodeSize!=0) - Optimize(Prg); -#endif -} - - -void RarVM::DecodeArg(VM_PreparedOperand &Op,bool ByteMode) -{ - uint Data=fgetbits(); - if (Data & 0x8000) - { - Op.Type=VM_OPREG; - Op.Data=(Data>>12)&7; - Op.Addr=&R[Op.Data]; - faddbits(4); - } - else - if ((Data & 0xc000)==0) - { - Op.Type=VM_OPINT; - if (ByteMode) - { - Op.Data=(Data>>6) & 0xff; - faddbits(10); - } - else - { - faddbits(2); - Op.Data=ReadData(*this); - } - } - else - { - Op.Type=VM_OPREGMEM; - if ((Data & 0x2000)==0) - { - Op.Data=(Data>>10)&7; - Op.Addr=&R[Op.Data]; - Op.Base=0; - faddbits(6); - } - else - { - if ((Data & 0x1000)==0) - { - Op.Data=(Data>>9)&7; - Op.Addr=&R[Op.Data]; - faddbits(7); - } - else - { - Op.Data=0; - faddbits(4); - } - Op.Base=ReadData(*this); - } - } -} - - -uint RarVM::ReadData(BitInput &Inp) -{ - uint Data=Inp.fgetbits(); - switch(Data&0xc000) - { - case 0: - Inp.faddbits(6); - return((Data>>10)&0xf); - case 0x4000: - if ((Data&0x3c00)==0) - { - Data=0xffffff00|((Data>>2)&0xff); - Inp.faddbits(14); - } - else - { - Data=(Data>>6)&0xff; - Inp.faddbits(10); - } - return(Data); - case 0x8000: - Inp.faddbits(2); - Data=Inp.fgetbits(); - Inp.faddbits(16); - return(Data); - default: - Inp.faddbits(2); - Data=(Inp.fgetbits()<<16); - Inp.faddbits(16); - Data|=Inp.fgetbits(); - Inp.faddbits(16); - return(Data); - } -} - - -void RarVM::SetMemory(unsigned int Pos,byte *Data,unsigned int DataSize) -{ - if (Pos<VM_MEMSIZE && Data!=Mem+Pos) - memmove(Mem+Pos,Data,Min(DataSize,VM_MEMSIZE-Pos)); -} - - -#ifdef VM_OPTIMIZE -void RarVM::Optimize(VM_PreparedProgram *Prg) -{ - VM_PreparedCommand *Code=&Prg->Cmd[0]; - int CodeSize=Prg->CmdCount; - - for (int I=0;I<CodeSize;I++) - { - VM_PreparedCommand *Cmd=Code+I; - switch(Cmd->OpCode) - { - case VM_MOV: - Cmd->OpCode=Cmd->ByteMode ? VM_MOVB:VM_MOVD; - continue; - case VM_CMP: - Cmd->OpCode=Cmd->ByteMode ? VM_CMPB:VM_CMPD; - continue; - default: - break; - } - if ((VM_CmdFlags[Cmd->OpCode] & VMCF_CHFLAGS)==0) - continue; - bool FlagsRequired=false; - for (int J=I+1;J<CodeSize;J++) - { - int Flags=VM_CmdFlags[Code[J].OpCode]; - if (Flags & (VMCF_JUMP|VMCF_PROC|VMCF_USEFLAGS)) - { - FlagsRequired=true; - break; - } - if (Flags & VMCF_CHFLAGS) - break; - } - if (FlagsRequired) - continue; - switch(Cmd->OpCode) - { - case VM_ADD: - Cmd->OpCode=Cmd->ByteMode ? VM_ADDB:VM_ADDD; - continue; - case VM_SUB: - Cmd->OpCode=Cmd->ByteMode ? VM_SUBB:VM_SUBD; - continue; - case VM_INC: - Cmd->OpCode=Cmd->ByteMode ? VM_INCB:VM_INCD; - continue; - case VM_DEC: - Cmd->OpCode=Cmd->ByteMode ? VM_DECB:VM_DECD; - continue; - case VM_NEG: - Cmd->OpCode=Cmd->ByteMode ? VM_NEGB:VM_NEGD; - continue; - default: - break; - } - } -} -#endif - - -#ifdef VM_STANDARDFILTERS -VM_StandardFilters RarVM::IsStandardFilter(byte *Code,int CodeSize) -{ - struct StandardFilterSignature - { - int Length; - uint CRC; - VM_StandardFilters Type; - } StdList[]={ - {53, 0xad576887, VMSF_E8}, - {57, 0x3cd7e57e, VMSF_E8E9}, - {120, 0x3769893f, VMSF_ITANIUM}, - {29, 0x0e06077d, VMSF_DELTA}, - {149, 0x1c2c5dc8, VMSF_RGB}, - {216, 0xbc85e701, VMSF_AUDIO}, - {40, 0x46b9c560, VMSF_UPCASE} - }; - uint CodeCRC=CRC(0xffffffff,Code,CodeSize)^0xffffffff; - for (unsigned int I=0;I<sizeof(StdList)/sizeof(StdList[0]);I++) - if (StdList[I].CRC==CodeCRC && StdList[I].Length==CodeSize) - return(StdList[I].Type); - return(VMSF_NONE); -} - - -void RarVM::ExecuteStandardFilter(VM_StandardFilters FilterType) -{ - switch(FilterType) - { - case VMSF_E8: - case VMSF_E8E9: - { - byte *Data=Mem; - int DataSize=R[4]; - uint FileOffset=R[6]; - - if (DataSize>=VM_GLOBALMEMADDR) - break; - - const int FileSize=0x1000000; - byte CmpByte2=FilterType==VMSF_E8E9 ? 0xe9:0xe8; - for (uint CurPos=0;CurPos<((uint)DataSize-4);) - { - byte CurByte=*(Data++); - CurPos++; - if (CurByte==0xe8 || CurByte==CmpByte2) - { -#ifdef PRESENT_INT32 - sint32 Offset=CurPos+FileOffset; - sint32 Addr=GET_VALUE(false,Data); - if (Addr<0) - { - if (Addr+Offset>=0) - SET_VALUE(false,Data,Addr+FileSize); - } - else - if (Addr<FileSize) - SET_VALUE(false,Data,Addr-Offset); -#else - long Offset=CurPos+FileOffset; - long Addr=GET_VALUE(false,Data); - if ((Addr & 0x80000000)!=0) - { - if (((Addr+Offset) & 0x80000000)==0) - SET_VALUE(false,Data,Addr+FileSize); - } - else - if (((Addr-FileSize) & 0x80000000)!=0) - SET_VALUE(false,Data,Addr-Offset); -#endif - Data+=4; - CurPos+=4; - } - } - } - break; - case VMSF_ITANIUM: - { - byte *Data=Mem; - uint DataSize=R[4]; - uint FileOffset=R[6]; - - if (DataSize>=VM_GLOBALMEMADDR) - break; - - uint CurPos=0; - - FileOffset>>=4; - - while (CurPos<DataSize-21) - { - int Byte=(Data[0]&0x1f)-0x10; - if (Byte>=0) - { - static byte Masks[16]={4,4,6,6,0,0,7,7,4,4,0,0,4,4,0,0}; - byte CmdMask=Masks[Byte]; - if (CmdMask!=0) - for (int I=0;I<=2;I++) - if (CmdMask & (1<<I)) - { - int StartPos=I*41+5; - int OpType=FilterItanium_GetBits(Data,StartPos+37,4); - if (OpType==5) - { - int Offset=FilterItanium_GetBits(Data,StartPos+13,20); - FilterItanium_SetBits(Data,(Offset-FileOffset)&0xfffff,StartPos+13,20); - } - } - } - Data+=16; - CurPos+=16; - FileOffset++; - } - } - break; - case VMSF_DELTA: - { - int DataSize=R[4],Channels=R[0],SrcPos=0,Border=DataSize*2; - SET_VALUE(false,&Mem[VM_GLOBALMEMADDR+0x20],DataSize); - if (DataSize>=VM_GLOBALMEMADDR/2) - break; - for (int CurChannel=0;CurChannel<Channels;CurChannel++) - { - byte PrevByte=0; - for (int DestPos=DataSize+CurChannel;DestPos<Border;DestPos+=Channels) - Mem[DestPos]=(PrevByte-=Mem[SrcPos++]); - } - } - break; - case VMSF_RGB: - { - int DataSize=R[4],Width=R[0]-3,PosR=R[1]; - byte *SrcData=Mem,*DestData=SrcData+DataSize; - const int Channels=3; - SET_VALUE(false,&Mem[VM_GLOBALMEMADDR+0x20],DataSize); - if (DataSize>=VM_GLOBALMEMADDR/2) - break; - for (int CurChannel=0;CurChannel<Channels;CurChannel++) - { - unsigned int PrevByte=0; - - for (int I=CurChannel;I<DataSize;I+=Channels) - { - unsigned int Predicted; - int UpperPos=I-Width; - if (UpperPos>=3) - { - byte *UpperData=DestData+UpperPos; - unsigned int UpperByte=*UpperData; - unsigned int UpperLeftByte=*(UpperData-3); - Predicted=PrevByte+UpperByte-UpperLeftByte; - int pa=abs((int)(Predicted-PrevByte)); - int pb=abs((int)(Predicted-UpperByte)); - int pc=abs((int)(Predicted-UpperLeftByte)); - if (pa<=pb && pa<=pc) - Predicted=PrevByte; - else - if (pb<=pc) - Predicted=UpperByte; - else - Predicted=UpperLeftByte; - } - else - Predicted=PrevByte; - DestData[I]=PrevByte=(byte)(Predicted-*(SrcData++)); - } - } - for (int I=PosR,Border=DataSize-2;I<Border;I+=3) - { - byte G=DestData[I+1]; - DestData[I]+=G; - DestData[I+2]+=G; - } - } - break; - case VMSF_AUDIO: - { - int DataSize=R[4],Channels=R[0]; - byte *SrcData=Mem,*DestData=SrcData+DataSize; - SET_VALUE(false,&Mem[VM_GLOBALMEMADDR+0x20],DataSize); - if (DataSize>=VM_GLOBALMEMADDR/2) - break; - for (int CurChannel=0;CurChannel<Channels;CurChannel++) - { - unsigned int PrevByte=0,PrevDelta=0,Dif[7]; - int D1=0,D2=0,D3; - int K1=0,K2=0,K3=0; - memset(Dif,0,sizeof(Dif)); - - for (int I=CurChannel,ByteCount=0;I<DataSize;I+=Channels,ByteCount++) - { - D3=D2; - D2=PrevDelta-D1; - D1=PrevDelta; - - unsigned int Predicted=8*PrevByte+K1*D1+K2*D2+K3*D3; - Predicted=(Predicted>>3) & 0xff; - - unsigned int CurByte=*(SrcData++); - - Predicted-=CurByte; - DestData[I]=Predicted; - PrevDelta=(signed char)(Predicted-PrevByte); - PrevByte=Predicted; - - int D=((signed char)CurByte)<<3; - - Dif[0]+=abs(D); - Dif[1]+=abs(D-D1); - Dif[2]+=abs(D+D1); - Dif[3]+=abs(D-D2); - Dif[4]+=abs(D+D2); - Dif[5]+=abs(D-D3); - Dif[6]+=abs(D+D3); - - if ((ByteCount & 0x1f)==0) - { - unsigned int MinDif=Dif[0],NumMinDif=0; - Dif[0]=0; - for (unsigned int J=1;J<sizeof(Dif)/sizeof(Dif[0]);J++) - { - if (Dif[J]<MinDif) - { - MinDif=Dif[J]; - NumMinDif=J; - } - Dif[J]=0; - } - switch(NumMinDif) - { - case 1: if (K1>=-16) K1--; break; - case 2: if (K1 < 16) K1++; break; - case 3: if (K2>=-16) K2--; break; - case 4: if (K2 < 16) K2++; break; - case 5: if (K3>=-16) K3--; break; - case 6: if (K3 < 16) K3++; break; - } - } - } - } - } - break; - case VMSF_UPCASE: - { - int DataSize=R[4],SrcPos=0,DestPos=DataSize; - if (DataSize>=VM_GLOBALMEMADDR/2) - break; - while (SrcPos<DataSize) - { - byte CurByte=Mem[SrcPos++]; - if (CurByte==2 && (CurByte=Mem[SrcPos++])!=2) - CurByte-=32; - Mem[DestPos++]=CurByte; - } - SET_VALUE(false,&Mem[VM_GLOBALMEMADDR+0x1c],DestPos-DataSize); - SET_VALUE(false,&Mem[VM_GLOBALMEMADDR+0x20],DataSize); - } - break; - default: - break; - } -} - - -unsigned int RarVM::FilterItanium_GetBits(byte *Data,int BitPos,int BitCount) -{ - int InAddr=BitPos/8; - int InBit=BitPos&7; - unsigned int BitField=(uint)Data[InAddr++]; - BitField|=(uint)Data[InAddr++] << 8; - BitField|=(uint)Data[InAddr++] << 16; - BitField|=(uint)Data[InAddr] << 24; - BitField >>= InBit; - return(BitField & (0xffffffff>>(32-BitCount))); -} - - -void RarVM::FilterItanium_SetBits(byte *Data,unsigned int BitField,int BitPos, - int BitCount) -{ - int InAddr=BitPos/8; - int InBit=BitPos&7; - unsigned int AndMask=0xffffffff>>(32-BitCount); - AndMask=~(AndMask<<InBit); - - BitField<<=InBit; - - for (int I=0;I<4;I++) - { - Data[InAddr+I]&=AndMask; - Data[InAddr+I]|=BitField; - AndMask=(AndMask>>8)|0xff000000; - BitField>>=8; - } -} -#endif diff --git a/lib/UnrarXLib/rarvm.hpp b/lib/UnrarXLib/rarvm.hpp deleted file mode 100644 index f330390b7d..0000000000 --- a/lib/UnrarXLib/rarvm.hpp +++ /dev/null @@ -1,110 +0,0 @@ -#ifndef _RAR_VM_ -#define _RAR_VM_ - -#define VM_STANDARDFILTERS - -#ifndef SFX_MODULE -#define VM_OPTIMIZE -#endif - - -#define VM_MEMSIZE 0x40000 -#define VM_MEMMASK (VM_MEMSIZE-1) -#define VM_GLOBALMEMADDR 0x3C000 -#define VM_GLOBALMEMSIZE 0x2000 -#define VM_FIXEDGLOBALSIZE 64 - -enum VM_Commands -{ - VM_MOV, VM_CMP, VM_ADD, VM_SUB, VM_JZ, VM_JNZ, VM_INC, VM_DEC, - VM_JMP, VM_XOR, VM_AND, VM_OR, VM_TEST, VM_JS, VM_JNS, VM_JB, - VM_JBE, VM_JA, VM_JAE, VM_PUSH, VM_POP, VM_CALL, VM_RET, VM_NOT, - VM_SHL, VM_SHR, VM_SAR, VM_NEG, VM_PUSHA,VM_POPA, VM_PUSHF,VM_POPF, - VM_MOVZX,VM_MOVSX,VM_XCHG, VM_MUL, VM_DIV, VM_ADC, VM_SBB, VM_PRINT, - -#ifdef VM_OPTIMIZE - VM_MOVB, VM_MOVD, VM_CMPB, VM_CMPD, - - VM_ADDB, VM_ADDD, VM_SUBB, VM_SUBD, VM_INCB, VM_INCD, VM_DECB, VM_DECD, - VM_NEGB, VM_NEGD, -#endif - - VM_STANDARD -}; - -enum VM_StandardFilters { - VMSF_NONE, VMSF_E8, VMSF_E8E9, VMSF_ITANIUM, VMSF_RGB, VMSF_AUDIO, - VMSF_DELTA, VMSF_UPCASE -}; - -enum VM_Flags {VM_FC=1,VM_FZ=2,VM_FS=0x80000000}; - -enum VM_OpType {VM_OPREG,VM_OPINT,VM_OPREGMEM,VM_OPNONE}; - -struct VM_PreparedOperand -{ - VM_OpType Type; - uint Data; - uint Base; - uint *Addr; -}; - -struct VM_PreparedCommand -{ - VM_Commands OpCode; - bool ByteMode; - VM_PreparedOperand Op1,Op2; -}; - - -struct VM_PreparedProgram -{ - VM_PreparedProgram() {AltCmd=NULL;} - - Array<VM_PreparedCommand> Cmd; - VM_PreparedCommand *AltCmd; - int CmdCount; - - Array<byte> GlobalData; - Array<byte> StaticData; - uint InitR[7]; - - byte *FilteredData; - unsigned int FilteredDataSize; -}; - -class RarVM:private BitInput -{ - private: - inline uint GetValue(bool ByteMode,uint *Addr); - inline void SetValue(bool ByteMode,uint *Addr,uint Value); - inline uint* GetOperand(VM_PreparedOperand *CmdOp); - void PrintState(uint IP); - void DecodeArg(VM_PreparedOperand &Op,bool ByteMode); -#ifdef VM_OPTIMIZE - void Optimize(VM_PreparedProgram *Prg); -#endif - bool ExecuteCode(VM_PreparedCommand *PreparedCode,int CodeSize); -#ifdef VM_STANDARDFILTERS - VM_StandardFilters IsStandardFilter(byte *Code,int CodeSize); - void ExecuteStandardFilter(VM_StandardFilters FilterType); - unsigned int FilterItanium_GetBits(byte *Data,int BitPos,int BitCount); - void FilterItanium_SetBits(byte *Data,unsigned int BitField,int BitPos, - int BitCount); -#endif - - byte *Mem; - uint R[8]; - uint Flags; - public: - RarVM(); - ~RarVM(); - void Init(); - void Prepare(byte *Code,int CodeSize,VM_PreparedProgram *Prg); - void Execute(VM_PreparedProgram *Prg); - void SetValue(uint *Addr,uint Value); - void SetMemory(unsigned int Pos,byte *Data,unsigned int DataSize); - static uint ReadData(BitInput &Inp); -}; - -#endif diff --git a/lib/UnrarXLib/rarvmtbl.cpp b/lib/UnrarXLib/rarvmtbl.cpp deleted file mode 100644 index b5e6c7201c..0000000000 --- a/lib/UnrarXLib/rarvmtbl.cpp +++ /dev/null @@ -1,53 +0,0 @@ -#define VMCF_OP0 0 -#define VMCF_OP1 1 -#define VMCF_OP2 2 -#define VMCF_OPMASK 3 -#define VMCF_BYTEMODE 4 -#define VMCF_JUMP 8 -#define VMCF_PROC 16 -#define VMCF_USEFLAGS 32 -#define VMCF_CHFLAGS 64 - -static byte VM_CmdFlags[]= -{ - /* VM_MOV */ VMCF_OP2 | VMCF_BYTEMODE , - /* VM_CMP */ VMCF_OP2 | VMCF_BYTEMODE | VMCF_CHFLAGS , - /* VM_ADD */ VMCF_OP2 | VMCF_BYTEMODE | VMCF_CHFLAGS , - /* VM_SUB */ VMCF_OP2 | VMCF_BYTEMODE | VMCF_CHFLAGS , - /* VM_JZ */ VMCF_OP1 | VMCF_JUMP | VMCF_USEFLAGS , - /* VM_JNZ */ VMCF_OP1 | VMCF_JUMP | VMCF_USEFLAGS , - /* VM_INC */ VMCF_OP1 | VMCF_BYTEMODE | VMCF_CHFLAGS , - /* VM_DEC */ VMCF_OP1 | VMCF_BYTEMODE | VMCF_CHFLAGS , - /* VM_JMP */ VMCF_OP1 | VMCF_JUMP , - /* VM_XOR */ VMCF_OP2 | VMCF_BYTEMODE | VMCF_CHFLAGS , - /* VM_AND */ VMCF_OP2 | VMCF_BYTEMODE | VMCF_CHFLAGS , - /* VM_OR */ VMCF_OP2 | VMCF_BYTEMODE | VMCF_CHFLAGS , - /* VM_TEST */ VMCF_OP2 | VMCF_BYTEMODE | VMCF_CHFLAGS , - /* VM_JS */ VMCF_OP1 | VMCF_JUMP | VMCF_USEFLAGS , - /* VM_JNS */ VMCF_OP1 | VMCF_JUMP | VMCF_USEFLAGS , - /* VM_JB */ VMCF_OP1 | VMCF_JUMP | VMCF_USEFLAGS , - /* VM_JBE */ VMCF_OP1 | VMCF_JUMP | VMCF_USEFLAGS , - /* VM_JA */ VMCF_OP1 | VMCF_JUMP | VMCF_USEFLAGS , - /* VM_JAE */ VMCF_OP1 | VMCF_JUMP | VMCF_USEFLAGS , - /* VM_PUSH */ VMCF_OP1 , - /* VM_POP */ VMCF_OP1 , - /* VM_CALL */ VMCF_OP1 | VMCF_PROC , - /* VM_RET */ VMCF_OP0 | VMCF_PROC , - /* VM_NOT */ VMCF_OP1 | VMCF_BYTEMODE , - /* VM_SHL */ VMCF_OP2 | VMCF_BYTEMODE | VMCF_CHFLAGS , - /* VM_SHR */ VMCF_OP2 | VMCF_BYTEMODE | VMCF_CHFLAGS , - /* VM_SAR */ VMCF_OP2 | VMCF_BYTEMODE | VMCF_CHFLAGS , - /* VM_NEG */ VMCF_OP1 | VMCF_BYTEMODE | VMCF_CHFLAGS , - /* VM_PUSHA */ VMCF_OP0 , - /* VM_POPA */ VMCF_OP0 , - /* VM_PUSHF */ VMCF_OP0 | VMCF_USEFLAGS , - /* VM_POPF */ VMCF_OP0 | VMCF_CHFLAGS , - /* VM_MOVZX */ VMCF_OP2 , - /* VM_MOVSX */ VMCF_OP2 , - /* VM_XCHG */ VMCF_OP2 | VMCF_BYTEMODE , - /* VM_MUL */ VMCF_OP2 | VMCF_BYTEMODE , - /* VM_DIV */ VMCF_OP2 | VMCF_BYTEMODE , - /* VM_ADC */ VMCF_OP2 | VMCF_BYTEMODE | VMCF_USEFLAGS | VMCF_CHFLAGS , - /* VM_SBB */ VMCF_OP2 | VMCF_BYTEMODE | VMCF_USEFLAGS | VMCF_CHFLAGS , - /* VM_PRINT */ VMCF_OP0 -}; diff --git a/lib/UnrarXLib/rawread.cpp b/lib/UnrarXLib/rawread.cpp deleted file mode 100644 index e032aaef85..0000000000 --- a/lib/UnrarXLib/rawread.cpp +++ /dev/null @@ -1,101 +0,0 @@ -#include "rar.hpp" - -RawRead::RawRead(File *SrcFile) -{ - RawRead::SrcFile=SrcFile; - ReadPos=0; - DataSize=0; -#ifndef SHELL_EXT - Crypt=NULL; -#endif -} - - -void RawRead::Read(int Size) -{ -#if !defined(SHELL_EXT) && !defined(NOCRYPT) - if (Crypt!=NULL) - { - int CurSize=Data.Size(); - int SizeToRead=Size-(CurSize-DataSize); - if (SizeToRead>0) - { - int AlignedReadSize=SizeToRead+((~SizeToRead+1)&0xf); - Data.Add(AlignedReadSize); - int ReadSize=SrcFile->Read(&Data[CurSize],AlignedReadSize); - Crypt->DecryptBlock(&Data[CurSize],AlignedReadSize); - DataSize+=ReadSize==0 ? 0:Size; - } - else - DataSize+=Size; - } - else -#endif - if (Size!=0) - { - Data.Add(Size); - DataSize+=SrcFile->Read(&Data[DataSize],Size); - } -} - - -void RawRead::Read(byte *SrcData,int Size) -{ - if (Size!=0) - { - Data.Add(Size); - memcpy(&Data[DataSize],SrcData,Size); - DataSize+=Size; - } -} - - -void RawRead::Get(byte &Field) -{ - Field=Data[ReadPos]; - ReadPos++; -} - - -void RawRead::Get(ushort &Field) -{ - Field=Data[ReadPos]+(Data[ReadPos+1]<<8); - ReadPos+=2; -} - - -void RawRead::Get(uint &Field) -{ - Field=Data[ReadPos]+(Data[ReadPos+1]<<8)+(Data[ReadPos+2]<<16)+ - (Data[ReadPos+3]<<24); - ReadPos+=4; -} - - -void RawRead::Get8(Int64 &Field) -{ - uint Low,High; - Get(Low); - Get(High); - Field=int32to64(High,Low); -} - - -void RawRead::Get(byte *Field,int Size) -{ - memcpy(Field,&Data[ReadPos],Size); - ReadPos+=Size; -} - - -void RawRead::Get(wchar *Field,int Size) -{ - RawToWide(&Data[ReadPos],Field,Size); - ReadPos+=2*Size; -} - - -uint RawRead::GetCRC(bool ProcessedOnly) -{ - return(DataSize>2 ? CRC(0xffffffff,&Data[2],(ProcessedOnly ? ReadPos:DataSize)-2):0xffffffff); -} diff --git a/lib/UnrarXLib/rawread.hpp b/lib/UnrarXLib/rawread.hpp deleted file mode 100644 index 47c2bbcba6..0000000000 --- a/lib/UnrarXLib/rawread.hpp +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef _RAR_RAWREAD_ -#define _RAR_RAWREAD_ - -class RawRead -{ - private: - Array<byte> Data; - File *SrcFile; - int DataSize; - int ReadPos; -#ifndef SHELL_EXT - CryptData *Crypt; -#endif - public: - RawRead(File *SrcFile); - void Read(int Size); - void Read(byte *SrcData,int Size); - void Get(byte &Field); - void Get(ushort &Field); - void Get(uint &Field); - void Get8(Int64 &Field); - void Get(byte *Field,int Size); - void Get(wchar *Field,int Size); - uint GetCRC(bool ProcessedOnly); - int Size() {return DataSize;} - int PaddedSize() {return Data.Size()-DataSize;} -#ifndef SHELL_EXT - void SetCrypt(CryptData *Crypt) {RawRead::Crypt=Crypt;} -#endif -}; - -#endif diff --git a/lib/UnrarXLib/rdwrfn.cpp b/lib/UnrarXLib/rdwrfn.cpp deleted file mode 100644 index 0ca2208f94..0000000000 --- a/lib/UnrarXLib/rdwrfn.cpp +++ /dev/null @@ -1,346 +0,0 @@ -#include "rar.hpp" -#include "URL.h" - -ComprDataIO::ComprDataIO() -{ - Init(); -} - - -void ComprDataIO::Init() -{ - UnpackFromMemory=false; - UnpackToMemory=false; - UnpackToMemorySize=-1; - UnpPackedSize=0; - ShowProgress=true; - TestMode=false; - SkipUnpCRC=true; - PackVolume=false; - UnpVolume=false; - NextVolumeMissing=false; - SrcFile=NULL; - DestFile=NULL; - UnpWrSize=0; - Command=NULL; - Encryption=0; - Decryption=0; - TotalPackRead=0; - CurPackRead=CurPackWrite=CurUnpRead=CurUnpWrite=CurUnpStart=0; - PackFileCRC=UnpFileCRC=PackedCRC=0xffffffff; - LastPercent=-1; - SubHead=NULL; - SubHeadPos=NULL; - CurrentCommand=0; - ProcessedArcSize=TotalArcSize=0; - bQuit = false; - m_progress = NULL; - m_context = NULL; - } - -int ComprDataIO::UnpRead(byte *Addr,uint Count) -{ - int RetCode=0,TotalRead=0; - byte *ReadAddr; - ReadAddr=Addr; - while (Count > 0) - { - Archive *SrcArc=(Archive *)SrcFile; - - uint ReadSize=(Count>UnpPackedSize) ? int64to32(UnpPackedSize):Count; - if (UnpackFromMemory) - { - memcpy(Addr,UnpackFromMemoryAddr,UnpackFromMemorySize); - RetCode=UnpackFromMemorySize; - UnpackFromMemorySize=0; - } - else - { - bool bRead = true; - if (!SrcFile->IsOpened()) - { - NextVolumeMissing = true; - return(-1); - } - if (UnpackToMemory) - if (hSeek->WaitMSec(1)) // we are seeking - { - if (m_iSeekTo > CurUnpStart+SrcArc->NewLhd.FullPackSize) // need to seek outside this block - { - TotalRead += (int)(SrcArc->NextBlockPos-SrcFile->Tell()); - CurUnpRead=CurUnpStart+SrcArc->NewLhd.FullPackSize; - UnpPackedSize=0; - RetCode = 0; - bRead = false; - } - else - { - Int64 iStartOfFile = SrcArc->NextBlockPos-SrcArc->NewLhd.FullPackSize; - m_iStartOfBuffer = CurUnpStart; - Int64 iSeekTo=m_iSeekTo-CurUnpStart<MAXWINMEMSIZE/2?iStartOfFile:iStartOfFile+m_iSeekTo-CurUnpStart-MAXWINMEMSIZE/2; - if (iSeekTo == iStartOfFile) // front - { - if (CurUnpStart+MAXWINMEMSIZE>SrcArc->NewLhd.FullUnpSize) - { - m_iSeekTo=iStartOfFile; - UnpPackedSize = SrcArc->NewLhd.FullPackSize; - } - else - { - m_iSeekTo=MAXWINMEMSIZE-(m_iSeekTo-CurUnpStart); - UnpPackedSize = SrcArc->NewLhd.FullPackSize - (m_iStartOfBuffer - CurUnpStart); - } - } - else - { - m_iStartOfBuffer = m_iSeekTo-MAXWINMEMSIZE/2; // front - if (m_iSeekTo+MAXWINMEMSIZE/2>SrcArc->NewLhd.FullUnpSize) - { - iSeekTo = iStartOfFile+SrcArc->NewLhd.FullPackSize-MAXWINMEMSIZE; - m_iStartOfBuffer = CurUnpStart+SrcArc->NewLhd.FullPackSize-MAXWINMEMSIZE; - m_iSeekTo = MAXWINMEMSIZE-(m_iSeekTo-m_iStartOfBuffer); - UnpPackedSize = MAXWINMEMSIZE; - } - else - { - m_iSeekTo=MAXWINMEMSIZE/2; - UnpPackedSize = SrcArc->NewLhd.FullPackSize - (m_iStartOfBuffer - CurUnpStart); - } - } - - SrcFile->Seek(iSeekTo,SEEK_SET); - TotalRead = 0; - CurUnpRead = CurUnpStart + iSeekTo - iStartOfFile; - CurUnpWrite = SrcFile->Tell() - iStartOfFile + CurUnpStart; - - hSeek->Reset(); - hSeekDone->Set(); - } - } - if (bRead) - { - ReadSize=(Count>UnpPackedSize) ? int64to32(UnpPackedSize):Count; - RetCode=SrcFile->Read(ReadAddr,ReadSize); - FileHeader *hd=SubHead!=NULL ? SubHead:&SrcArc->NewLhd; - if (hd->Flags & LHD_SPLIT_AFTER) - { - PackedCRC=CRC(PackedCRC,ReadAddr,ReadSize); - } - } - } - CurUnpRead+=RetCode; - ReadAddr+=RetCode; - TotalRead+=RetCode; - Count-=RetCode; - UnpPackedSize-=RetCode; - if (UnpPackedSize == 0 && UnpVolume) - { -#ifndef NOVOLUME - if (!MergeArchive(*SrcArc,this,true,CurrentCommand)) -#endif - { - NextVolumeMissing=true; - return(-1); - } - CurUnpStart = CurUnpRead; - if (m_progress) - m_progress(m_context, -1, SrcArc->FileName); - } - else - break; - } - Archive *SrcArc=(Archive *)SrcFile; - if (SrcArc!=NULL) - ShowUnpRead(SrcArc->CurBlockPos+CurUnpRead,UnpArcSize); - if (RetCode!=-1) - { - RetCode=TotalRead; -#ifndef NOCRYPT - if (Decryption) - { -#ifndef SFX_MODULE - if (Decryption<20) - Decrypt.Crypt(Addr,RetCode,(Decryption==15) ? NEW_CRYPT : OLD_DECODE); - else if (Decryption==20) - for (int I=0;I<RetCode;I+=16) - Decrypt.DecryptBlock20(&Addr[I]); - else -#endif - { - int CryptSize=(RetCode & 0xf)==0 ? RetCode:((RetCode & ~0xf)+16); - Decrypt.DecryptBlock(Addr,CryptSize); - } - } -#endif - } - Wait(); - return(RetCode); -} - -void ComprDataIO::UnpWrite(byte *Addr,uint Count) -{ -#ifdef RARDLL - RAROptions *Cmd=((Archive *)SrcFile)->GetRAROptions(); - if (Cmd->DllOpMode!=RAR_SKIP) - { - if (Cmd->Callback!=NULL && - Cmd->Callback(UCM_PROCESSDATA,Cmd->UserData,(LONG)Addr,Count)==-1) - ErrHandler.Exit(USER_BREAK); - if (Cmd->ProcessDataProc!=NULL) - { -#ifdef _WIN_32 - _EBX=_ESP; -#endif - int RetCode=Cmd->ProcessDataProc(Addr,Count); -#ifdef _WIN_32 - _ESP=_EBX; -#endif - if (RetCode==0) - ErrHandler.Exit(USER_BREAK); - } - } -#endif - UnpWrAddr=Addr; - UnpWrSize=Count; - if (UnpackToMemory) - { - while(UnpackToMemorySize < (int)Count) - { - hBufferEmpty->Set(); - while(! hBufferFilled->WaitMSec(1)) - if (hQuit->WaitMSec(1)) - return; - } - - if (! hSeek->WaitMSec(1)) // we are seeking - { - memcpy(UnpackToMemoryAddr,Addr,Count); - UnpackToMemoryAddr+=Count; - UnpackToMemorySize-=Count; - } - else - return; - } - else - if (!TestMode) - DestFile->Write(Addr,Count); - - CurUnpWrite+=Count; - if (!SkipUnpCRC) - { -#ifndef SFX_MODULE - if (((Archive *)SrcFile)->OldFormat) - UnpFileCRC=OldCRC((ushort)UnpFileCRC,Addr,Count); - else -#endif - UnpFileCRC=CRC(UnpFileCRC,Addr,Count); - } - ShowUnpWrite(); - Wait(); - if (m_progress) - { - if (!m_progress(m_context, int(float(CurUnpWrite)/float(((Archive*)SrcFile)->NewLhd.FullUnpSize)*100), NULL)) - bQuit = true; - } -} - - - - - - -void ComprDataIO::ShowUnpRead(Int64 ArcPos,Int64 ArcSize) -{ - if (ShowProgress && SrcFile!=NULL) - { - Archive *SrcArc=(Archive *)SrcFile; - RAROptions *Cmd=SrcArc->GetRAROptions(); - if (TotalArcSize!=0) - ArcSize=TotalArcSize; - ArcPos+=ProcessedArcSize; - if (!SrcArc->Volume) - { - int CurPercent=ToPercent(ArcPos,ArcSize); - if (!Cmd->DisablePercentage && CurPercent!=LastPercent) - { - mprintf("\b\b\b\b%3d%%",CurPercent); - LastPercent=CurPercent; - } - } - } -} - - -void ComprDataIO::ShowUnpWrite() -{ -} - - - - - - - - -void ComprDataIO::SetFiles(File *SrcFile,File *DestFile) -{ - if (SrcFile!=NULL) - ComprDataIO::SrcFile=SrcFile; - if (DestFile!=NULL) - ComprDataIO::DestFile=DestFile; - LastPercent=-1; -} - - -void ComprDataIO::GetUnpackedData(byte **Data,uint *Size) -{ - *Data=UnpWrAddr; - *Size=UnpWrSize; -} - - -void ComprDataIO::SetEncryption(int Method,char *Password,byte *Salt,bool Encrypt) -{ - if (Encrypt) - { - Encryption=*Password ? Method:0; -#ifndef NOCRYPT - Crypt.SetCryptKeys(Password,Salt,Encrypt); -#endif - } - else - { - Decryption=*Password ? Method:0; -#ifndef NOCRYPT - Decrypt.SetCryptKeys(Password,Salt,Encrypt,Method<29); -#endif - } -} - - -#ifndef SFX_MODULE -void ComprDataIO::SetAV15Encryption() -{ - Decryption=15; - Decrypt.SetAV15Encryption(); -} -#endif - - -#ifndef SFX_MODULE -void ComprDataIO::SetCmt13Encryption() -{ - Decryption=13; - Decrypt.SetCmt13Encryption(); -} -#endif - - - - -void ComprDataIO::SetUnpackToMemory(byte *Addr,uint Size) -{ - UnpackToMemory=true; - UnpackToMemoryAddr=Addr; - UnpackToMemorySize=Size; -} diff --git a/lib/UnrarXLib/rdwrfn.hpp b/lib/UnrarXLib/rdwrfn.hpp deleted file mode 100644 index cf6691da2d..0000000000 --- a/lib/UnrarXLib/rdwrfn.hpp +++ /dev/null @@ -1,101 +0,0 @@ -#ifndef _RAR_DATAIO_ -#define _RAR_DATAIO_ - -class CmdAdd; -class Unpack; - -#include "system.h" -#include "threads/Event.h" - -typedef bool (*progress_callback)(void*, int, const char*); - -class ComprDataIO -{ - private: - void ShowUnpRead(Int64 ArcPos,Int64 ArcSize); - void ShowUnpWrite(); - - - bool UnpackFromMemory; - uint UnpackFromMemorySize; - byte *UnpackFromMemoryAddr; - - bool UnpackToMemory; - //uint UnpackToMemorySize; - byte *UnpackToMemoryAddr; - - uint UnpWrSize; - byte *UnpWrAddr; - - Int64 UnpPackedSize; - - bool ShowProgress; - bool TestMode; - bool SkipUnpCRC; - - File *SrcFile; - File *DestFile; - - CmdAdd *Command; - - FileHeader *SubHead; - Int64 *SubHeadPos; - -#ifndef NOCRYPT - CryptData Crypt; - CryptData Decrypt; -#endif - - - int LastPercent; - - char CurrentCommand; - - public: - ComprDataIO(); - void Init(); - int UnpRead(byte *Addr,uint Count); - void UnpWrite(byte *Addr,uint Count); - void EnableShowProgress(bool Show) {ShowProgress=Show;} - void GetUnpackedData(byte **Data,uint *Size); - void SetPackedSizeToRead(Int64 Size) {UnpPackedSize=Size;} - void SetTestMode(bool Mode) {TestMode=Mode;} - void SetSkipUnpCRC(bool Skip) {SkipUnpCRC=Skip;} - void SetFiles(File *SrcFile,File *DestFile); - void SetCommand(CmdAdd *Cmd) {Command=Cmd;} - void SetSubHeader(FileHeader *hd,Int64 *Pos) {SubHead=hd;SubHeadPos=Pos;} - void SetEncryption(int Method,char *Password,byte *Salt,bool Encrypt); - void SetAV15Encryption(); - void SetCmt13Encryption(); - void SetUnpackToMemory(byte *Addr,uint Size); - void SetCurrentCommand(char Cmd) {CurrentCommand=Cmd;} - - bool PackVolume; - bool UnpVolume; - bool NextVolumeMissing; - Int64 TotalPackRead; - Int64 UnpArcSize; - Int64 CurPackRead,CurPackWrite,CurUnpRead,CurUnpWrite; - Int64 ProcessedArcSize,TotalArcSize; - - uint PackFileCRC,UnpFileCRC,PackedCRC; - - int Encryption; - int Decryption; - int UnpackToMemorySize; - - // added stuff - CEvent* hBufferFilled; - CEvent* hBufferEmpty; - CEvent* hSeek; - CEvent* hSeekDone; - CEvent* hQuit; - progress_callback m_progress; - void* m_context; - bool bQuit; - Int64 m_iSeekTo; - Int64 m_iStartOfBuffer; - Int64 CurUnpStart; -}; - -#endif diff --git a/lib/UnrarXLib/readme_bj.txt b/lib/UnrarXLib/readme_bj.txt deleted file mode 100755 index 024594bf20..0000000000 --- a/lib/UnrarXLib/readme_bj.txt +++ /dev/null @@ -1,20 +0,0 @@ -MXM's version of UnRar Lib by BenJeremy - -One line might need to be commented out - the "E" option line in the -unrar code. That's the one that lets me extract per file and ignore -original pathing. - -It's in VS.NET 2003 vproj format for the 5558 XDK. - -PS! UNZIP seems to be hosed. Don't know what's happening there at all. - -BenJeremy - -Credits to unleashx who originaly ported it from Unrar utility 3.3.6 -see X-S forum: http://forums.xbox-scene.com/index.php?showtopic=200415 - -Unrar utility by Eugene Roshal -http://www.rarlab.com/rar_add.htm - -interface is a adaptation of the one provided in UniquE RAR File Library -http://www.unrarlib.org/ diff --git a/lib/UnrarXLib/recvol.cpp b/lib/UnrarXLib/recvol.cpp deleted file mode 100644 index daf0463a41..0000000000 --- a/lib/UnrarXLib/recvol.cpp +++ /dev/null @@ -1,378 +0,0 @@ -#include "rar.hpp" - -#define RECVOL_BUFSIZE 0x800 - -RecVolumes::RecVolumes() -{ - Buf.Alloc(RECVOL_BUFSIZE*256); - memset(SrcFile,0,sizeof(SrcFile)); -} - - -RecVolumes::~RecVolumes() -{ - for (unsigned int I=0;I<sizeof(SrcFile)/sizeof(SrcFile[0]);I++) - delete SrcFile[I]; -} - - - - -bool RecVolumes::Restore(RAROptions *Cmd,const char *Name, - const wchar *NameW,bool Silent) -{ - char ArcName[NM]; - wchar ArcNameW[NM]; - strcpy(ArcName,Name); - strcpyw(ArcNameW,NameW); - char *Ext=GetExt(ArcName); - bool NewStyle=false; - bool RevName=Ext!=NULL && stricomp(Ext,".rev")==0; - if (RevName) - { - for (int DigitGroup=0;Ext>ArcName && DigitGroup<3;Ext--) - if (!isdigit(*Ext)) - { - if (isdigit(*(Ext-1)) && (*Ext=='_' || DigitGroup<2)) - DigitGroup++; - else if (DigitGroup<2) - { - NewStyle=true; - break; - } - } - while (isdigit(*Ext) && Ext>ArcName+1) - Ext--; - strcpy(Ext,"*.*"); - FindFile Find; - Find.SetMask(ArcName); - struct FindData FD; - while (Find.Next(&FD)) - { - Archive Arc(Cmd); - if (Arc.WOpen(FD.Name,FD.NameW) && Arc.IsArchive(true)) - { - strcpy(ArcName,FD.Name); - *ArcNameW=0; - break; - } - } - } - - Archive Arc(Cmd); - if (!Arc.WCheckOpen(ArcName,ArcNameW)) - return(false); - if (!Arc.Volume) - { -#ifndef SILENT - Log(ArcName,St(MNotVolume),ArcName); -#endif - return(false); - } - bool NewNumbering=(Arc.NewMhd.Flags & MHD_NEWNUMBERING); - Arc.Close(); - char *VolNumStart=VolNameToFirstName(ArcName,ArcName,NewNumbering); - char RecVolMask[NM]; - strcpy(RecVolMask,ArcName); - int BaseNamePartLength=VolNumStart-ArcName; - strcpy(RecVolMask+BaseNamePartLength,"*.rev"); - -#ifndef SILENT - Int64 RecFileSize=0; -#endif - FindFile Find; - Find.SetMask(RecVolMask); - struct FindData RecData; - int FileNumber=0,RecVolNumber=0,FoundRecVolumes=0,MissingVolumes=0; - char PrevName[NM]; - while (Find.Next(&RecData)) - { - char *Name=RecData.Name; - int P[3]; - if (!RevName && !NewStyle) - { - NewStyle=true; - char *Dot=GetExt(Name); - if (Dot!=NULL) - { - int LineCount=0; - Dot--; - while (Dot>Name && *Dot!='.') - { - if (*Dot=='_') - LineCount++; - Dot--; - } - if (LineCount==2) - NewStyle=false; - } - } - if (NewStyle) - { - File CurFile; - CurFile.TOpen(Name); - CurFile.Seek(0,SEEK_END); - Int64 Length=CurFile.Tell(); - CurFile.Seek(Length-7,SEEK_SET); - for (int I=0;I<3;I++) - P[2-I]=CurFile.GetByte()+1; - uint FileCRC=0; - for (int I=0;I<4;I++) - FileCRC|=CurFile.GetByte()<<(I*8); - if (FileCRC!=CalcFileCRC(&CurFile,Length-4)) - { -#ifndef SILENT - mprintf(St(MCRCFailed),Name); -#endif - continue; - } - } - else - { - char *Dot=GetExt(Name); - if (Dot==NULL) - continue; - bool WrongParam=false; - for (unsigned int I=0;I<sizeof(P)/sizeof(P[0]);I++) - { - do - { - Dot--; - } while (isdigit(*Dot) && Dot>=Name+BaseNamePartLength); - P[I]=atoi(Dot+1); - if (P[I]==0 || P[I]>255) - WrongParam=true; - } - if (WrongParam) - continue; - } - if (P[1]+P[2]>255) - continue; - if ((RecVolNumber!=0 && RecVolNumber!=P[1]) || (FileNumber!=0 && FileNumber!=P[2])) - { -#ifndef SILENT - Log(NULL,St(MRecVolDiffSets),Name,PrevName); -#endif - return(false); - } - RecVolNumber=P[1]; - FileNumber=P[2]; - strcpy(PrevName,Name); - File *NewFile=new File; - NewFile->TOpen(Name); - SrcFile[FileNumber+P[0]-1]=NewFile; - FoundRecVolumes++; -#ifndef SILENT - if (RecFileSize==0) - RecFileSize=NewFile->FileLength(); -#endif - } -#ifndef SILENT - if (!Silent || FoundRecVolumes!=0) - { - mprintf(St(MRecVolFound),FoundRecVolumes); - } -#endif - if (FoundRecVolumes==0) - return(false); - - bool WriteFlags[256]; - memset(WriteFlags,0,sizeof(WriteFlags)); - - char LastVolName[NM]; - *LastVolName=0; - - for (int CurArcNum=0;CurArcNum<FileNumber;CurArcNum++) - { - Archive *NewFile=new Archive; - bool ValidVolume=FileExist(ArcName); - if (ValidVolume) - { - NewFile->TOpen(ArcName); - ValidVolume=NewFile->IsArchive(false); - if (ValidVolume) - { - bool EndFound=false,EndBlockRequired=false; - while (!EndFound && NewFile->ReadHeader()!=0) - { - if (NewFile->GetHeaderType()==FILE_HEAD) - { - if (NewFile->NewLhd.UnpVer>=29) - EndBlockRequired=true; - if (!EndBlockRequired && (NewFile->NewLhd.Flags & LHD_SPLIT_AFTER)) - EndFound=true; - } - if (NewFile->GetHeaderType()==ENDARC_HEAD) - { - if ((NewFile->EndArcHead.Flags&EARC_DATACRC)!=0 && - NewFile->EndArcHead.ArcDataCRC!=CalcFileCRC(NewFile,NewFile->CurBlockPos)) - { - ValidVolume=false; -#ifndef SILENT - mprintf(St(MCRCFailed),ArcName); -#endif - } - EndFound=true; - } - NewFile->SeekToNext(); - } - if (!EndFound) - ValidVolume=false; - } - if (!ValidVolume) - { - NewFile->Close(); - char NewName[NM]; - strcpy(NewName,ArcName); - strcat(NewName,".bad"); -#ifndef SILENT - mprintf(St(MBadArc),ArcName); - mprintf(St(MRenaming),ArcName,NewName); -#endif - rename(ArcName,NewName); - } - NewFile->Seek(0,SEEK_SET); - } - if (!ValidVolume) - { - NewFile->TCreate(ArcName); - WriteFlags[CurArcNum]=true; - MissingVolumes++; - - if (CurArcNum==FileNumber-1) - strcpy(LastVolName,ArcName); - -#ifndef SILENT - mprintf(St(MAbsNextVol),ArcName); -#endif - } - SrcFile[CurArcNum]=(File*)NewFile; - NextVolumeName(ArcName,!NewNumbering); - } - -#ifndef SILENT - mprintf(St(MRecVolMissing),MissingVolumes); -#endif - - if (MissingVolumes==0) - { -#ifndef SILENT - mprintf(St(MRecVolAllExist)); -#endif - return(false); - } - - if (MissingVolumes>FoundRecVolumes) - { -#ifndef SILENT - mprintf(St(MRecVolCannotFix)); -#endif - return(false); - } -#ifndef SILENT - mprintf(St(MReconstructing)); -#endif - - RSCoder RSC(RecVolNumber); - - int TotalFiles=FileNumber+RecVolNumber; - int Erasures[256],EraSize=0; - - for (int I=0;I<TotalFiles;I++) - if (WriteFlags[I] || SrcFile[I]==NULL) - Erasures[EraSize++]=I; - -#ifndef SILENT - Int64 ProcessedSize=0; -#ifndef GUI - int LastPercent=-1; - mprintf(" "); -#endif -#endif - int RecCount=0; - - while (true) - { - if ((++RecCount & 15)==0) - Wait(); - int MaxRead=0; - for (int I=0;I<TotalFiles;I++) - if (WriteFlags[I] || SrcFile[I]==NULL) - memset(&Buf[I*RECVOL_BUFSIZE],0,RECVOL_BUFSIZE); - else - { - int ReadSize=SrcFile[I]->Read(&Buf[I*RECVOL_BUFSIZE],RECVOL_BUFSIZE); - if (ReadSize!=RECVOL_BUFSIZE) - memset(&Buf[I*RECVOL_BUFSIZE+ReadSize],0,RECVOL_BUFSIZE-ReadSize); - if (ReadSize>MaxRead) - MaxRead=ReadSize; - } - if (MaxRead==0) - break; -#ifndef SILENT - int CurPercent=ToPercent(ProcessedSize,RecFileSize); - if (!Cmd->DisablePercentage && CurPercent!=LastPercent) - { - mprintf("\b\b\b\b%3d%%",CurPercent); - LastPercent=CurPercent; - } - ProcessedSize+=MaxRead; -#endif - for (int BufPos=0;BufPos<MaxRead;BufPos++) - { - byte Data[256]; - for (int I=0;I<TotalFiles;I++) - Data[I]=Buf[I*RECVOL_BUFSIZE+BufPos]; - RSC.Decode(Data,TotalFiles,Erasures,EraSize); - for (int I=0;I<EraSize;I++) - Buf[Erasures[I]*RECVOL_BUFSIZE+BufPos]=Data[Erasures[I]]; -/* - for (int I=0;I<FileNumber;I++) - Buf[I*RECVOL_BUFSIZE+BufPos]=Data[I]; -*/ - } - for (int I=0;I<FileNumber;I++) - if (WriteFlags[I]) - SrcFile[I]->Write(&Buf[I*RECVOL_BUFSIZE],MaxRead); - } - for (int I=0;I<RecVolNumber+FileNumber;I++) - if (SrcFile[I]!=NULL) - { - File *CurFile=SrcFile[I]; - if (NewStyle && WriteFlags[I]) - { - Int64 Length=CurFile->Tell(); - CurFile->Seek(Length-7,SEEK_SET); - for (int J=0;J<7;J++) - CurFile->PutByte(0); - } - CurFile->Close(); - SrcFile[I]=NULL; - } - if (*LastVolName) - { - Archive Arc(Cmd); - if (Arc.Open(LastVolName,NULL,false,true) && Arc.IsArchive(true) && - Arc.SearchBlock(ENDARC_HEAD)) - { - Arc.Seek(Arc.NextBlockPos,SEEK_SET); - char Buf[8192]; - int ReadSize=Arc.Read(Buf,sizeof(Buf)); - int ZeroCount=0; - while (ZeroCount<ReadSize && Buf[ZeroCount]==0) - ZeroCount++; - if (ZeroCount==ReadSize) - { - Arc.Seek(Arc.NextBlockPos,SEEK_SET); - Arc.Truncate(); - } - } - } -#if !defined(GUI) && !defined(SILENT) - if (!Cmd->DisablePercentage) - mprintf("\b\b\b\b100%%"); - if (!Silent && !Cmd->DisableDone) - mprintf(St(MDone)); -#endif - return(true); -} diff --git a/lib/UnrarXLib/recvol.hpp b/lib/UnrarXLib/recvol.hpp deleted file mode 100644 index 5a0abe58ab..0000000000 --- a/lib/UnrarXLib/recvol.hpp +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _RAR_RECVOL_ -#define _RAR_RECVOL_ - -class RecVolumes -{ - private: - File *SrcFile[256]; - Array<byte> Buf; - public: - RecVolumes(); - ~RecVolumes(); - void Make(RAROptions *Cmd,char *ArcName,wchar *ArcNameW); - bool Restore(RAROptions *Cmd,const char *Name,const wchar *NameW,bool Silent); -}; - -#endif diff --git a/lib/UnrarXLib/resource.cpp b/lib/UnrarXLib/resource.cpp deleted file mode 100644 index b33fd022d8..0000000000 --- a/lib/UnrarXLib/resource.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "rar.hpp" - - - -#if !defined(SILENT) || !defined(RARDLL) -const char *St(MSGID StringId) -{ - return(StringId); -} -#endif diff --git a/lib/UnrarXLib/resource.hpp b/lib/UnrarXLib/resource.hpp deleted file mode 100644 index 581b34b426..0000000000 --- a/lib/UnrarXLib/resource.hpp +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef _RAR_RESOURCE_ -#define _RAR_RESOURCE_ - -#if defined(SILENT) && defined(RARDLL) -#define St(x) ("") -#else -const char *St(MSGID StringId); -#endif - - -inline const char *StT(MSGID StringId) {return(St(StringId));} - - -#endif diff --git a/lib/UnrarXLib/rijndael.cpp b/lib/UnrarXLib/rijndael.cpp deleted file mode 100644 index 99f20536f0..0000000000 --- a/lib/UnrarXLib/rijndael.cpp +++ /dev/null @@ -1,298 +0,0 @@ -/************************************************************************** - * This code is based on Szymon Stefanek AES implementation: * - * http://www.esat.kuleuven.ac.be/~rijmen/rijndael/rijndael-cpplib.tar.gz * - * * - * Dynamic tables generation is based on the Brian Gladman work: * - * http://fp.gladman.plus.com/cryptography_technology/rijndael * - **************************************************************************/ -#include "rar.hpp" - -const int uKeyLenInBytes=16, m_uRounds=10; - -static byte S[256],S5[256],rcon[30]; -static byte T1[256][4],T2[256][4],T3[256][4],T4[256][4]; -static byte T5[256][4],T6[256][4],T7[256][4],T8[256][4]; -static byte U1[256][4],U2[256][4],U3[256][4],U4[256][4]; - - -inline void Xor128(byte *dest,const byte *arg1,const byte *arg2) -{ -#if defined(PRESENT_INT32) && defined(ALLOW_NOT_ALIGNED_INT) - ((uint32*)dest)[0]=((uint32*)arg1)[0]^((uint32*)arg2)[0]; - ((uint32*)dest)[1]=((uint32*)arg1)[1]^((uint32*)arg2)[1]; - ((uint32*)dest)[2]=((uint32*)arg1)[2]^((uint32*)arg2)[2]; - ((uint32*)dest)[3]=((uint32*)arg1)[3]^((uint32*)arg2)[3]; -#else - for (int I=0;I<16;I++) - dest[I]=arg1[I]^arg2[I]; -#endif -} - - -inline void Xor128(byte *dest,const byte *arg1,const byte *arg2, - const byte *arg3,const byte *arg4) -{ -#if defined(PRESENT_INT32) && defined(ALLOW_NOT_ALIGNED_INT) - (*(uint32*)dest)=(*(uint32*)arg1)^(*(uint32*)arg2)^(*(uint32*)arg3)^(*(uint32*)arg4); -#else - for (int I=0;I<4;I++) - dest[I]=arg1[I]^arg2[I]^arg3[I]^arg4[I]; -#endif -} - - -inline void Copy128(byte *dest,const byte *src) -{ -#if defined(PRESENT_INT32) && defined(ALLOW_NOT_ALIGNED_INT) - ((uint32*)dest)[0]=((uint32*)src)[0]; - ((uint32*)dest)[1]=((uint32*)src)[1]; - ((uint32*)dest)[2]=((uint32*)src)[2]; - ((uint32*)dest)[3]=((uint32*)src)[3]; -#else - for (int I=0;I<16;I++) - dest[I]=src[I]; -#endif -} - - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// API -////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -Rijndael::Rijndael() -{ - if (S[0]==0) - GenerateTables(); -} - - -void Rijndael::init(Direction dir,const byte * key,byte * initVector) -{ - m_direction = dir; - - byte keyMatrix[_MAX_KEY_COLUMNS][4]; - - for(int i = 0;i < uKeyLenInBytes;i++) - keyMatrix[i >> 2][i & 3] = key[i]; - - for(int i = 0;i < MAX_IV_SIZE;i++) - m_initVector[i] = initVector[i]; - - keySched(keyMatrix); - - if(m_direction == Decrypt) - keyEncToDec(); -} - - - -int Rijndael::blockDecrypt(const byte *input, int inputLen, byte *outBuffer) -{ - if (input == 0 || inputLen <= 0) - return 0; - - byte block[16], iv[4][4]; - memcpy(iv,m_initVector,16); - - int numBlocks=inputLen/16; - for (int i = numBlocks; i > 0; i--) - { - decrypt(input, block); - Xor128(block,block,(byte*)iv); -#if STRICT_ALIGN - memcpy(iv, input, 16); - memcpy(outBuf, block, 16); -#else - Copy128((byte*)iv,input); - Copy128(outBuffer,block); -#endif - input += 16; - outBuffer += 16; - } - - memcpy(m_initVector,iv,16); - - return 16*numBlocks; -} - - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// ALGORITHM -////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - -void Rijndael::keySched(byte key[_MAX_KEY_COLUMNS][4]) -{ - int j,rconpointer = 0; - - // Calculate the necessary round keys - // The number of calculations depends on keyBits and blockBits - int uKeyColumns = m_uRounds - 6; - - byte tempKey[_MAX_KEY_COLUMNS][4]; - - // Copy the input key to the temporary key matrix - - memcpy(tempKey,key,sizeof(tempKey)); - - int r = 0; - int t = 0; - - // copy values into round key array - for(j = 0;(j < uKeyColumns) && (r <= m_uRounds); ) - { - for(;(j < uKeyColumns) && (t < 4); j++, t++) - for (int k=0;k<4;k++) - m_expandedKey[r][t][k]=tempKey[j][k]; - - if(t == 4) - { - r++; - t = 0; - } - } - - while(r <= m_uRounds) - { - tempKey[0][0] ^= S[tempKey[uKeyColumns-1][1]]; - tempKey[0][1] ^= S[tempKey[uKeyColumns-1][2]]; - tempKey[0][2] ^= S[tempKey[uKeyColumns-1][3]]; - tempKey[0][3] ^= S[tempKey[uKeyColumns-1][0]]; - tempKey[0][0] ^= rcon[rconpointer++]; - - if (uKeyColumns != 8) - for(j = 1; j < uKeyColumns; j++) - for (int k=0;k<4;k++) - tempKey[j][k] ^= tempKey[j-1][k]; - else - { - for(j = 1; j < uKeyColumns/2; j++) - for (int k=0;k<4;k++) - tempKey[j][k] ^= tempKey[j-1][k]; - - tempKey[uKeyColumns/2][0] ^= S[tempKey[uKeyColumns/2 - 1][0]]; - tempKey[uKeyColumns/2][1] ^= S[tempKey[uKeyColumns/2 - 1][1]]; - tempKey[uKeyColumns/2][2] ^= S[tempKey[uKeyColumns/2 - 1][2]]; - tempKey[uKeyColumns/2][3] ^= S[tempKey[uKeyColumns/2 - 1][3]]; - for(j = uKeyColumns/2 + 1; j < uKeyColumns; j++) - for (int k=0;k<4;k++) - tempKey[j][k] ^= tempKey[j-1][k]; - } - for(j = 0; (j < uKeyColumns) && (r <= m_uRounds); ) - { - for(; (j < uKeyColumns) && (t < 4); j++, t++) - for (int k=0;k<4;k++) - m_expandedKey[r][t][k] = tempKey[j][k]; - if(t == 4) - { - r++; - t = 0; - } - } - } -} - -void Rijndael::keyEncToDec() -{ - for(int r = 1; r < m_uRounds; r++) - { - byte n_expandedKey[4][4]; - for (int i=0;i<4;i++) - for (int j=0;j<4;j++) - { - byte *w=m_expandedKey[r][j]; - n_expandedKey[j][i]=U1[w[0]][i]^U2[w[1]][i]^U3[w[2]][i]^U4[w[3]][i]; - } - memcpy(m_expandedKey[r],n_expandedKey,sizeof(m_expandedKey[0])); - } -} - - -void Rijndael::decrypt(const byte a[16], byte b[16]) -{ - int r; - byte temp[4][4]; - - Xor128((byte*)temp,(byte*)a,(byte*)m_expandedKey[m_uRounds]); - - Xor128(b, T5[temp[0][0]],T6[temp[3][1]],T7[temp[2][2]],T8[temp[1][3]]); - Xor128(b+4, T5[temp[1][0]],T6[temp[0][1]],T7[temp[3][2]],T8[temp[2][3]]); - Xor128(b+8, T5[temp[2][0]],T6[temp[1][1]],T7[temp[0][2]],T8[temp[3][3]]); - Xor128(b+12,T5[temp[3][0]],T6[temp[2][1]],T7[temp[1][2]],T8[temp[0][3]]); - - for(r = m_uRounds-1; r > 1; r--) - { - Xor128((byte*)temp,(byte*)b,(byte*)m_expandedKey[r]); - Xor128(b, T5[temp[0][0]],T6[temp[3][1]],T7[temp[2][2]],T8[temp[1][3]]); - Xor128(b+4, T5[temp[1][0]],T6[temp[0][1]],T7[temp[3][2]],T8[temp[2][3]]); - Xor128(b+8, T5[temp[2][0]],T6[temp[1][1]],T7[temp[0][2]],T8[temp[3][3]]); - Xor128(b+12,T5[temp[3][0]],T6[temp[2][1]],T7[temp[1][2]],T8[temp[0][3]]); - } - - Xor128((byte*)temp,(byte*)b,(byte*)m_expandedKey[1]); - b[ 0] = S5[temp[0][0]]; - b[ 1] = S5[temp[3][1]]; - b[ 2] = S5[temp[2][2]]; - b[ 3] = S5[temp[1][3]]; - b[ 4] = S5[temp[1][0]]; - b[ 5] = S5[temp[0][1]]; - b[ 6] = S5[temp[3][2]]; - b[ 7] = S5[temp[2][3]]; - b[ 8] = S5[temp[2][0]]; - b[ 9] = S5[temp[1][1]]; - b[10] = S5[temp[0][2]]; - b[11] = S5[temp[3][3]]; - b[12] = S5[temp[3][0]]; - b[13] = S5[temp[2][1]]; - b[14] = S5[temp[1][2]]; - b[15] = S5[temp[0][3]]; - Xor128((byte*)b,(byte*)b,(byte*)m_expandedKey[0]); -} - -#define ff_poly 0x011b -#define ff_hi 0x80 - -#define FFinv(x) ((x) ? pow[255 - log[x]]: 0) - -#define FFmul02(x) (x ? pow[log[x] + 0x19] : 0) -#define FFmul03(x) (x ? pow[log[x] + 0x01] : 0) -#define FFmul09(x) (x ? pow[log[x] + 0xc7] : 0) -#define FFmul0b(x) (x ? pow[log[x] + 0x68] : 0) -#define FFmul0d(x) (x ? pow[log[x] + 0xee] : 0) -#define FFmul0e(x) (x ? pow[log[x] + 0xdf] : 0) -#define fwd_affine(x) \ - (w = (uint)x, w ^= (w<<1)^(w<<2)^(w<<3)^(w<<4), (byte)(0x63^(w^(w>>8)))) - -#define inv_affine(x) \ - (w = (uint)x, w = (w<<1)^(w<<3)^(w<<6), (byte)(0x05^(w^(w>>8)))) - -void Rijndael::GenerateTables() -{ - unsigned char pow[512],log[256]; - int i = 0, w = 1; - do - { - pow[i] = (byte)w; - pow[i + 255] = (byte)w; - log[w] = (byte)i++; - w ^= (w << 1) ^ (w & ff_hi ? ff_poly : 0); - } while (w != 1); - - for (unsigned int i = 0,w = 1; i < sizeof(rcon)/sizeof(rcon[0]); i++) - { - rcon[i] = w; - w = (w << 1) ^ (w & ff_hi ? ff_poly : 0); - } - for(int i = 0; i < 256; ++i) - { - unsigned char b=S[i]=fwd_affine(FFinv((byte)i)); - T1[i][1]=T1[i][2]=T2[i][2]=T2[i][3]=T3[i][0]=T3[i][3]=T4[i][0]=T4[i][1]=b; - T1[i][0]=T2[i][1]=T3[i][2]=T4[i][3]=FFmul02(b); - T1[i][3]=T2[i][0]=T3[i][1]=T4[i][2]=FFmul03(b); - S5[i] = b = FFinv(inv_affine((byte)i)); - U1[b][3]=U2[b][0]=U3[b][1]=U4[b][2]=T5[i][3]=T6[i][0]=T7[i][1]=T8[i][2]=FFmul0b(b); - U1[b][1]=U2[b][2]=U3[b][3]=U4[b][0]=T5[i][1]=T6[i][2]=T7[i][3]=T8[i][0]=FFmul09(b); - U1[b][2]=U2[b][3]=U3[b][0]=U4[b][1]=T5[i][2]=T6[i][3]=T7[i][0]=T8[i][1]=FFmul0d(b); - U1[b][0]=U2[b][1]=U3[b][2]=U4[b][3]=T5[i][0]=T6[i][1]=T7[i][2]=T8[i][3]=FFmul0e(b); - } -} diff --git a/lib/UnrarXLib/rijndael.hpp b/lib/UnrarXLib/rijndael.hpp deleted file mode 100644 index 70c0a6c934..0000000000 --- a/lib/UnrarXLib/rijndael.hpp +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef _RIJNDAEL_H_ -#define _RIJNDAEL_H_ - -/************************************************************************** - * This code is based on Szymon Stefanek AES implementation: * - * http://www.esat.kuleuven.ac.be/~rijmen/rijndael/rijndael-cpplib.tar.gz * - * * - * Dynamic tables generation is based on the Brian Gladman's work: * - * http://fp.gladman.plus.com/cryptography_technology/rijndael * - **************************************************************************/ - -#define _MAX_KEY_COLUMNS (256/32) -#define _MAX_ROUNDS 14 -#define MAX_IV_SIZE 16 - -class Rijndael -{ - public: - enum Direction { Encrypt , Decrypt }; - private: - void keySched(byte key[_MAX_KEY_COLUMNS][4]); - void keyEncToDec(); - void encrypt(const byte a[16], byte b[16]); - void decrypt(const byte a[16], byte b[16]); - void GenerateTables(); - - Direction m_direction; - byte m_initVector[MAX_IV_SIZE]; - byte m_expandedKey[_MAX_ROUNDS+1][4][4]; - public: - Rijndael(); - void init(Direction dir,const byte *key,byte *initVector); - int blockEncrypt(const byte *input, int inputLen, byte *outBuffer); - int blockDecrypt(const byte *input, int inputLen, byte *outBuffer); -}; - -#endif // _RIJNDAEL_H_ diff --git a/lib/UnrarXLib/rs.cpp b/lib/UnrarXLib/rs.cpp deleted file mode 100644 index 9eed7a28f4..0000000000 --- a/lib/UnrarXLib/rs.cpp +++ /dev/null @@ -1,143 +0,0 @@ -#include "rar.hpp" - -#define Clean(D,S) {for (int I=0;I<(S);I++) (D)[I]=0;} - -RSCoder::RSCoder(int ParSize) -{ - RSCoder::ParSize=ParSize; - FirstBlockDone=false; - gfInit(); - pnInit(); -} - - -void RSCoder::gfInit() -{ - for (int I=0,J=1;I<MAXPAR;I++) - { - gfLog[J]=I; - gfExp[I]=J; - if ((J<<=1)&256) - J^=285; - } - for (int I=MAXPAR;I<MAXPOL;I++) - gfExp[I]=gfExp[I-MAXPAR]; -} - - -inline int RSCoder::gfMult(int a,int b) -{ - return(a==0 || b == 0 ? 0:gfExp[gfLog[a]+gfLog[b]]); -} - - -void RSCoder::pnInit() -{ - int p1[MAXPAR+1],p2[MAXPAR+1]; - - Clean(p2,ParSize); - p2[0]=1; - for (int I=1;I<=ParSize;I++) - { - Clean(p1,ParSize); - p1[0]=gfExp[I]; - p1[1]=1; - pnMult(p1,p2,GXPol); - for (int J=0;J<ParSize;J++) - p2[J]=GXPol[J]; - } -} - - -void RSCoder::pnMult(int *p1,int *p2,int *r) -{ - Clean(r,ParSize); - for (int I=0;I<ParSize;I++) - if (p1[I]!=0) - for(int J=0;J<ParSize-I;J++) - r[I+J]^=gfMult(p1[I],p2[J]); -} - - -void RSCoder::Encode(byte *Data,int DataSize,byte *DestData) -{ - int ShiftReg[MAXPAR+1]; - - Clean(ShiftReg,ParSize+1); - for (int I=0;I<DataSize;I++) - { - int D=Data[I]^ShiftReg[ParSize-1]; - for (int J=ParSize-1;J>0;J--) - ShiftReg[J]=ShiftReg[J-1]^gfMult(GXPol[J],D); - ShiftReg[0]=gfMult(GXPol[0],D); - } - for (int I=0;I<ParSize;I++) - DestData[I]=ShiftReg[ParSize-I-1]; -} - - -bool RSCoder::Decode(byte *Data,int DataSize,int *EraLoc,int EraSize) -{ - int SynData[MAXPOL]; - bool AllZeroes=true; - for (int I=0;I<ParSize;I++) - { - int Sum=Data[0],J=1,Exp=gfExp[I+1]; - for (;J+8<=DataSize;J+=8) - { - Sum=Data[J]^gfMult(Exp,Sum); - Sum=Data[J+1]^gfMult(Exp,Sum); - Sum=Data[J+2]^gfMult(Exp,Sum); - Sum=Data[J+3]^gfMult(Exp,Sum); - Sum=Data[J+4]^gfMult(Exp,Sum); - Sum=Data[J+5]^gfMult(Exp,Sum); - Sum=Data[J+6]^gfMult(Exp,Sum); - Sum=Data[J+7]^gfMult(Exp,Sum); - } - for (;J<DataSize;J++) - Sum=Data[J]^gfMult(Exp,Sum); - if ((SynData[I]=Sum)!=0) - AllZeroes=false; - } - if (AllZeroes) - return(true); - - if (!FirstBlockDone) - { - FirstBlockDone=true; - Clean(PolB,ParSize+1); - PolB[0]=1; - for (int EraPos=0;EraPos<EraSize;EraPos++) - for (int I=ParSize,M=gfExp[DataSize-EraLoc[EraPos]-1];I>0;I--) - PolB[I]^=gfMult(M,PolB[I-1]); - - ErrCount=0; - for (int Root=MAXPAR-DataSize;Root<MAXPAR+1;Root++) - { - int Sum=0; - for (int B=0;B<ParSize+1;B++) - Sum^=gfMult(gfExp[(B*Root)%MAXPAR],PolB[B]); - if (Sum==0) - { - Dn[ErrCount]=0; - for (int I=1;I<ParSize+1;I+=2) - Dn[ErrCount]^= gfMult(PolB[I],gfExp[Root*(I-1)%MAXPAR]); - ErrorLocs[ErrCount++]=MAXPAR-Root; - } - } - } - - int PolD[MAXPOL]; - pnMult(PolB,SynData,PolD); - if ((ErrCount<=ParSize) && ErrCount>0) - for (int I=0;I<ErrCount;I++) - { - int Loc=ErrorLocs[I],DLoc=MAXPAR-Loc,N=0; - for (int J=0;J<ParSize;J++) - N^=gfMult(PolD[J],gfExp[DLoc*J%MAXPAR]); - int DataPos=DataSize-Loc-1; - if (DataPos>=0 && DataPos<DataSize) - Data[DataPos]^=gfMult(N,gfExp[MAXPAR-gfLog[Dn[I]]]); - } - return(ErrCount<=ParSize); -} diff --git a/lib/UnrarXLib/rs.hpp b/lib/UnrarXLib/rs.hpp deleted file mode 100644 index 2f099f0060..0000000000 --- a/lib/UnrarXLib/rs.hpp +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef _RAR_RS_ -#define _RAR_RS_ - -#define MAXPAR 255 -#define MAXPOL 512 - -class RSCoder -{ - private: - void gfInit(); - int gfMult(int a,int b); - void pnInit(); - void pnMult(int *p1,int *p2,int *r); - - int gfExp[MAXPOL]; - int gfLog[MAXPAR+1]; - - int GXPol[MAXPOL*2]; - - int ErrorLocs[MAXPAR+1],ErrCount; - int Dn[MAXPAR+1]; - - int ParSize; - int PolB[MAXPOL]; - bool FirstBlockDone; - public: - RSCoder(int ParSize); - void Encode(byte *Data,int DataSize,byte *DestData); - bool Decode(byte *Data,int DataSize,int *EraLoc,int EraSize); -}; - -#endif diff --git a/lib/UnrarXLib/savepos.cpp b/lib/UnrarXLib/savepos.cpp deleted file mode 100644 index e46c4e666c..0000000000 --- a/lib/UnrarXLib/savepos.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "rar.hpp" - -SaveFilePos::SaveFilePos(File &SaveFile) -{ - SaveFilePos::SaveFile=&SaveFile; - SavePos=SaveFile.Tell(); - CloseCount=SaveFile.CloseCount; -} - - -SaveFilePos::~SaveFilePos() -{ - if (CloseCount==SaveFile->CloseCount) - SaveFile->Seek(SavePos,SEEK_SET); -} diff --git a/lib/UnrarXLib/savepos.hpp b/lib/UnrarXLib/savepos.hpp deleted file mode 100644 index 303550a098..0000000000 --- a/lib/UnrarXLib/savepos.hpp +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef _RAR_SAVEPOS_ -#define _RAR_SAVEPOS_ - -class SaveFilePos -{ - private: - File *SaveFile; - Int64 SavePos; - uint CloseCount; - public: - SaveFilePos(File &SaveFile); - ~SaveFilePos(); -}; - -#endif diff --git a/lib/UnrarXLib/scantree.cpp b/lib/UnrarXLib/scantree.cpp deleted file mode 100644 index 797de2d496..0000000000 --- a/lib/UnrarXLib/scantree.cpp +++ /dev/null @@ -1,274 +0,0 @@ -#include "rar.hpp" - -ScanTree::ScanTree(StringList *FileMasks,int Recurse,bool GetLinks,int GetDirs) -{ - ScanTree::FileMasks=FileMasks; - ScanTree::Recurse=Recurse; - ScanTree::GetLinks=GetLinks; - ScanTree::GetDirs=GetDirs; - - SetAllMaskDepth=0; - *CurMask=0; - *CurMaskW=0; - memset(FindStack,0,sizeof(FindStack)); - Depth=0; - Errors=0; - FastFindFile=false; - *ErrArcName=0; - Cmd=NULL; -} - - -ScanTree::~ScanTree() -{ - for (int I=Depth;I>=0;I--) - if (FindStack[I]!=NULL) - delete FindStack[I]; -} - - -int ScanTree::GetNext(FindData *FindData) -{ - if (Depth<0) - return(SCAN_DONE); - - int FindCode; - while (1) - { - if ((*CurMask==0 || (FastFindFile && Depth==0)) && !PrepareMasks()) - return(SCAN_DONE); - FindCode=FindProc(FindData); - if (FindCode==SCAN_ERROR) - { - Errors++; - continue; - } - if (FindCode==SCAN_NEXT) - continue; - if (FindCode==SCAN_SUCCESS && FindData->IsDir && GetDirs==SCAN_SKIPDIRS) - continue; - if (FindCode==SCAN_DONE && PrepareMasks()) - continue; - break; - } - return(FindCode); -} - - -bool ScanTree::PrepareMasks() -{ - if (!FileMasks->GetString(CurMask,CurMaskW,sizeof(CurMask))) - return(false); -#ifdef _WIN_32 - UnixSlashToDos(CurMask); -#endif - char *Name=PointToName(CurMask); - if (*Name==0) - strcat(CurMask,MASKALL); - if (Name[0]=='.' && (Name[1]==0 || (Name[1]=='.' && Name[2]==0))) - { - AddEndSlash(CurMask); - strcat(CurMask,MASKALL); - } - SpecPathLength=Name-CurMask; -// if (SpecPathLength>1) -// SpecPathLength--; - - bool WideName=(*CurMaskW!=0); - - if (WideName) - { - wchar *NameW=PointToName(CurMaskW); - if (*NameW==0) - strcatw(CurMaskW,MASKALLW); - if (NameW[0]=='.' && (NameW[1]==0 || (NameW[1]=='.' && NameW[2]==0))) - { - AddEndSlash(CurMaskW); - strcatw(CurMaskW,MASKALLW); - } - SpecPathLengthW=NameW-CurMaskW; - } - else - { - wchar WideMask[NM]; - CharToWide(CurMask,WideMask); - SpecPathLengthW=PointToName(WideMask)-WideMask; - } - Depth=0; - - strcpy(OrigCurMask,CurMask); - strcpyw(OrigCurMaskW,CurMaskW); - - return(true); -} - - -int ScanTree::FindProc(FindData *FindData) -{ - if (*CurMask==0) - return(SCAN_NEXT); - FastFindFile=false; - if (FindStack[Depth]==NULL) - { - bool Wildcards=IsWildcard(CurMask,CurMaskW); - bool FindCode=!Wildcards && FindFile::FastFind(CurMask,CurMaskW,FindData,GetLinks); - bool IsDir=FindCode && FindData->IsDir; - bool SearchAll=!IsDir && (Depth>0 || Recurse==RECURSE_ALWAYS || (Wildcards && Recurse==RECURSE_WILDCARDS)); - if (Depth==0) - SearchAllInRoot=SearchAll; - if (SearchAll || Wildcards) - { - FindStack[Depth]=new FindFile; - char SearchMask[NM]; - strcpy(SearchMask,CurMask); - if (SearchAll) - strcpy(PointToName(SearchMask),MASKALL); - FindStack[Depth]->SetMask(SearchMask); - if (*CurMaskW) - { - wchar SearchMaskW[NM]; - strcpyw(SearchMaskW,CurMaskW); - if (SearchAll) - strcpyw(PointToName(SearchMaskW),MASKALLW); - FindStack[Depth]->SetMaskW(SearchMaskW); - } - } - else - { - FastFindFile=true; - if (!FindCode) - { - if (Cmd!=NULL && Cmd->ExclCheck(CurMask,true)) - return(SCAN_NEXT); - ErrHandler.OpenErrorMsg(ErrArcName,CurMask); - return(FindData->Error ? SCAN_ERROR:SCAN_NEXT); - } - } - } - - if (!FastFindFile && !FindStack[Depth]->Next(FindData,GetLinks)) - { - bool Error=FindData->Error; - -#ifdef _WIN_32 - if (Error && strstr(CurMask,"System Volume Information\\")!=NULL) - Error=false; -#endif - - if (Cmd!=NULL && Cmd->ExclCheck(CurMask,true)) - Error=false; - -#ifndef SILENT - if (Error) - { - Log(NULL,St(MScanError),CurMask); - } -#endif - - char DirName[NM]; - wchar DirNameW[NM]; - *DirName=0; - *DirNameW=0; - - delete FindStack[Depth]; - FindStack[Depth--]=NULL; - while (Depth>=0 && FindStack[Depth]==NULL) - Depth--; - if (Depth < 0) - { - if (Error) - Errors++; - return(SCAN_DONE); - } - char *Slash=strrchrd(CurMask,CPATHDIVIDER); - if (Slash!=NULL) - { - char Mask[NM]; - strcpy(Mask,Slash); - if (Depth<SetAllMaskDepth) - strcpy(Mask+1,PointToName(OrigCurMask)); - *Slash=0; - strcpy(DirName,CurMask); - char *PrevSlash=strrchrd(CurMask,CPATHDIVIDER); - if (PrevSlash==NULL) - strcpy(CurMask,Mask+1); - else - strcpy(PrevSlash,Mask); - } - - if (*CurMaskW!=0) - { - wchar *Slash=strrchrw(CurMaskW,CPATHDIVIDER); - if (Slash!=NULL) - { - wchar Mask[NM]; - strcpyw(Mask,Slash); - *Slash=0; - strcpyw(DirNameW,CurMaskW); - wchar *PrevSlash=strrchrw(CurMaskW,CPATHDIVIDER); - if (PrevSlash==NULL) - strcpyw(CurMaskW,Mask+1); - else - strcpyw(PrevSlash,Mask); - } -#ifndef _WIN_CE - if (LowAscii(CurMaskW)) - *CurMaskW=0; -#endif - } - if (GetDirs==SCAN_GETDIRSTWICE && - FindFile::FastFind(DirName,DirNameW,FindData,GetLinks) && FindData->IsDir) - return(Error ? SCAN_ERROR:SCAN_SUCCESS); - return(Error ? SCAN_ERROR:SCAN_NEXT); - } - - if (FindData->IsDir) - { - if (!FastFindFile && Depth==0 && !SearchAllInRoot) - return(GetDirs==SCAN_GETCURDIRS ? SCAN_SUCCESS:SCAN_NEXT); - -// if (GetDirs==SCAN_GETCURDIRS && Depth==0 && !SearchAllInRoot) -// return(SCAN_SUCCESS); - - char Mask[NM]; - bool MaskAll=FastFindFile; - - strcpy(Mask,MaskAll ? MASKALL:PointToName(CurMask)); - strcpy(CurMask,FindData->Name); - - if (strlen(CurMask)+strlen(Mask)+1>=NM || Depth>=MAXSCANDEPTH-1) - { -#ifndef SILENT - Log(NULL,"\n%s%c%s",CurMask,CPATHDIVIDER,Mask); - Log(NULL,St(MPathTooLong)); -#endif - return(SCAN_ERROR); - } - - AddEndSlash(CurMask); - strcat(CurMask,Mask); - - if (*CurMaskW && *FindData->NameW==0) - CharToWide(FindData->Name,FindData->NameW); - if (*FindData->NameW!=0) - { - wchar Mask[NM]; - if (FastFindFile) - strcpyw(Mask,MASKALLW); - else - if (*CurMaskW) - strcpyw(Mask,PointToName(CurMaskW)); - else - CharToWide(PointToName(CurMask),Mask); - strcpyw(CurMaskW,FindData->NameW); - AddEndSlash(CurMaskW); - strcatw(CurMaskW,Mask); - } - Depth++; - if (MaskAll) - SetAllMaskDepth=Depth; - } - if (!FastFindFile && !CmpName(CurMask,FindData->Name,MATCH_NAMES)) - return(SCAN_NEXT); - return(SCAN_SUCCESS); -} diff --git a/lib/UnrarXLib/scantree.hpp b/lib/UnrarXLib/scantree.hpp deleted file mode 100644 index 956040cc7e..0000000000 --- a/lib/UnrarXLib/scantree.hpp +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef _RAR_SCANTREE_ -#define _RAR_SCANTREE_ - -enum { RECURSE_NONE=0,RECURSE_ALWAYS,RECURSE_WILDCARDS }; -enum { SCAN_SKIPDIRS=0,SCAN_GETDIRS,SCAN_GETDIRSTWICE,SCAN_GETCURDIRS }; -enum { SCAN_SUCCESS,SCAN_DONE,SCAN_ERROR,SCAN_NEXT }; - -#define MAXSCANDEPTH (NM/2) - -class CommandData; - -class ScanTree -{ - private: - bool PrepareMasks(); - int FindProc(FindData *FindData); - - FindFile *FindStack[MAXSCANDEPTH]; - int Depth; - - int SetAllMaskDepth; - - StringList *FileMasks; - int Recurse; - bool GetLinks; - int GetDirs; - int Errors; - - char CurMask[NM]; - wchar CurMaskW[NM]; - char OrigCurMask[NM]; - wchar OrigCurMaskW[NM]; - bool SearchAllInRoot; - bool FastFindFile; - int SpecPathLength; - int SpecPathLengthW; - - char ErrArcName[NM]; - - CommandData *Cmd; - public: - ScanTree(StringList *FileMasks,int Recurse,bool GetLinks,int GetDirs); - ~ScanTree(); - int GetNext(FindData *FindData); - int GetSpecPathLength() {return(SpecPathLength);}; - int GetSpecPathLengthW() {return(SpecPathLengthW);}; - int GetErrors() {return(Errors);}; - void SetErrArcName(const char *Name) {strcpy(ErrArcName,Name);} - void SetCommandData(CommandData *Cmd) {ScanTree::Cmd=Cmd;} -}; - -#endif diff --git a/lib/UnrarXLib/sha1.cpp b/lib/UnrarXLib/sha1.cpp deleted file mode 100644 index 8c4fd6fb60..0000000000 --- a/lib/UnrarXLib/sha1.cpp +++ /dev/null @@ -1,225 +0,0 @@ -#include "rar.hpp" - -/* -SHA-1 in C -By Steve Reid <steve@edmweb.com> -100% Public Domain - -Test Vectors (from FIPS PUB 180-1) -"abc" - A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D -"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" - 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 -A million repetitions of "a" - 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F -*/ - -#if !defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN) - #if defined(_M_IX86) || defined(_M_I86) || defined(__alpha) - #define LITTLE_ENDIAN - #else - #error "LITTLE_ENDIAN or BIG_ENDIAN must be defined" - #endif -#endif - -/* #define SHA1HANDSOFF * Copies data before messing with it. */ - -#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) - -/* blk0() and blk() perform the initial expand. */ -/* I got the idea of expanding during the round function from SSLeay */ -#ifdef LITTLE_ENDIAN -#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \ - |(rol(block->l[i],8)&0x00FF00FF)) -#else -#define blk0(i) block->l[i] -#endif -#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ - ^block->l[(i+2)&15]^block->l[i&15],1)) - -/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ -#define R0(v,w,x,y,z,i) {z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);} -#define R1(v,w,x,y,z,i) {z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30);} -#define R2(v,w,x,y,z,i) {z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30);} -#define R3(v,w,x,y,z,i) {z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);} -#define R4(v,w,x,y,z,i) {z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);} - - -/* Hash a single 512-bit block. This is the core of the algorithm. */ - -void SHA1Transform(uint32 state[5], unsigned char buffer[64]) -{ - uint32 a, b, c, d, e; - typedef union { - unsigned char c[64]; - uint32 l[16]; -} CHAR64LONG16; -CHAR64LONG16* block; -#ifdef SHA1HANDSOFF -static unsigned char workspace[64]; - block = (CHAR64LONG16*)workspace; - memcpy(block, buffer, 64); -#else - block = (CHAR64LONG16*)buffer; -#endif -#ifdef SFX_MODULE - static int pos[80][5]; - static bool pinit=false; - if (!pinit) - { - for (int I=0,P=0;I<80;I++,P=(P ? P-1:4)) - { - pos[I][0]=P; - pos[I][1]=(P+1)%5; - pos[I][2]=(P+2)%5; - pos[I][3]=(P+3)%5; - pos[I][4]=(P+4)%5; - } - pinit=true; - } - uint32 s[5]; - for (int I=0;I<sizeof(s)/sizeof(s[0]);I++) - s[I]=state[I]; - - for (int I=0;I<16;I++) - R0(s[pos[I][0]],s[pos[I][1]],s[pos[I][2]],s[pos[I][3]],s[pos[I][4]],I); - for (int I=16;I<20;I++) - R1(s[pos[I][0]],s[pos[I][1]],s[pos[I][2]],s[pos[I][3]],s[pos[I][4]],I); - for (int I=20;I<40;I++) - R2(s[pos[I][0]],s[pos[I][1]],s[pos[I][2]],s[pos[I][3]],s[pos[I][4]],I); - for (int I=40;I<60;I++) - R3(s[pos[I][0]],s[pos[I][1]],s[pos[I][2]],s[pos[I][3]],s[pos[I][4]],I); - for (int I=60;I<80;I++) - R4(s[pos[I][0]],s[pos[I][1]],s[pos[I][2]],s[pos[I][3]],s[pos[I][4]],I); - - for (int I=0;I<sizeof(s)/sizeof(s[0]);I++) - state[I]+=s[I]; -#else - /* Copy context->state[] to working vars */ - a = state[0]; - b = state[1]; - c = state[2]; - d = state[3]; - e = state[4]; - /* 4 rounds of 20 operations each. Loop unrolled. */ - R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); - R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); - R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); - R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); - R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); - R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); - R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); - R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); - R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); - R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); - R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); - R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); - R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); - R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); - R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); - R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); - R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); - R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); - R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); - R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); - /* Add the working vars back into context.state[] */ - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - state[4] += e; - - /* Wipe variables */ - a = b = c = d = e = 0; - memset(&a,0,sizeof(a)); -#endif -} - - -/* Initialize new context */ - -void hash_initial(hash_context* context) -{ - /* SHA1 initialization constants */ - context->state[0] = 0x67452301; - context->state[1] = 0xEFCDAB89; - context->state[2] = 0x98BADCFE; - context->state[3] = 0x10325476; - context->state[4] = 0xC3D2E1F0; - context->count[0] = context->count[1] = 0; -} - - -/* Run your data through this. */ -void hash_process( hash_context * context, unsigned char * data, unsigned len ) -{ -unsigned int i, j; -uint blen = ((uint)len)<<3; - - j = (context->count[0] >> 3) & 63; - if ((context->count[0] += blen) < blen ) context->count[1]++; - context->count[1] += (len >> 29); - if ((j + len) > 63) { - memcpy(&context->buffer[j], data, (i = 64-j)); - SHA1Transform(context->state, context->buffer); - for ( ; i + 63 < len; i += 64) { -#ifdef ALLOW_NOT_ALIGNED_INT - SHA1Transform(context->state, &data[i]); -#else - unsigned char buffer[64]; - memcpy(buffer,data+i,sizeof(buffer)); - SHA1Transform(context->state, buffer); - memcpy(data+i,buffer,sizeof(buffer)); -#endif -#ifdef BIG_ENDIAN - unsigned char *d=data+i; - for (int k=0;k<64;k+=4) - { - byte b0=d[k],b1=d[k+1]; - d[k]=d[k+3]; - d[k+1]=d[k+2]; - d[k+2]=b1; - d[k+3]=b0; - } -#endif - } - j = 0; - } - else i = 0; - if (len > i) - memcpy(&context->buffer[j], &data[i], len - i); -} - - -/* Add padding and return the message digest. */ - -void hash_final( hash_context* context, uint32 digest[5] ) -{ -uint i, j; -unsigned char finalcount[8]; - - for (i = 0; i < 8; i++) { - finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)] - >> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */ - } - unsigned char ch='\200'; - hash_process(context, &ch, 1); - while ((context->count[0] & 504) != 448) { - ch=0; - hash_process(context, &ch, 1); - } - hash_process(context, finalcount, 8); /* Should cause a SHA1Transform() */ - for (i = 0; i < 5; i++) { - digest[i] = context->state[i] & 0xffffffff; - } - /* Wipe variables */ - memset(&i,0,sizeof(i)); - memset(&j,0,sizeof(j)); - memset(context->buffer, 0, 64); - memset(context->state, 0, 20); - memset(context->count, 0, 8); - memset(&finalcount, 0, 8); -#ifdef SHA1HANDSOFF /* make SHA1Transform overwrite it's own static vars */ - SHA1Transform(context->state, context->buffer); -#endif -} diff --git a/lib/UnrarXLib/sha1.hpp b/lib/UnrarXLib/sha1.hpp deleted file mode 100644 index 96cef44e00..0000000000 --- a/lib/UnrarXLib/sha1.hpp +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _RAR_SHA1_ -#define _RAR_SHA1_ - -#define HW 5 - -typedef struct { - uint32 state[5]; - uint32 count[2]; - unsigned char buffer[64]; -} hash_context; - -void hash_initial( hash_context * c ); -void hash_process( hash_context * c, unsigned char * data, unsigned len ); -void hash_final( hash_context * c, uint32[HW] ); - -#endif diff --git a/lib/UnrarXLib/smallfn.cpp b/lib/UnrarXLib/smallfn.cpp deleted file mode 100644 index 094691f028..0000000000 --- a/lib/UnrarXLib/smallfn.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "rar.hpp" - -int ToPercent(Int64 N1,Int64 N2) -{ - if (N2==0) - return(0); - if (N2<N1) - return(100); - return(int64to32(N1*100/N2)); -} - - -void RARInitData() -{ - InitCRC(); - ErrHandler.Clean(); -} diff --git a/lib/UnrarXLib/smallfn.hpp b/lib/UnrarXLib/smallfn.hpp deleted file mode 100644 index 096ffef151..0000000000 --- a/lib/UnrarXLib/smallfn.hpp +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _RAR_SMALLFN_ -#define _RAR_SMALLFN_ - -int ToPercent(Int64 N1,Int64 N2); -void RARInitData(); - -#endif diff --git a/lib/UnrarXLib/stdafx.cpp b/lib/UnrarXLib/stdafx.cpp deleted file mode 100644 index 9f4f9bd760..0000000000 --- a/lib/UnrarXLib/stdafx.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// UnrarXLib.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - -// TODO: reference any additional headers you need in STDAFX.H -// and not in this file diff --git a/lib/UnrarXLib/strfn.cpp b/lib/UnrarXLib/strfn.cpp deleted file mode 100644 index db3b17a88b..0000000000 --- a/lib/UnrarXLib/strfn.cpp +++ /dev/null @@ -1,117 +0,0 @@ -#include "rar.hpp" - -const char *NullToEmpty(const char *Str) -{ - return(Str==NULL ? "":Str); -} - - -const wchar *NullToEmpty(const wchar *Str) -{ - return(Str==NULL ? L"":Str); -} - - -char *IntNameToExt(const char *Name) -{ - static char OutName[NM]; - IntToExt(Name,OutName); - return(OutName); -} - - -void ExtToInt(const char *Src,char *Dest) -{ - if (Dest!=Src) - strcpy(Dest,Src); -} - - -void IntToExt(const char *Src,char *Dest) -{ - if (Dest!=Src) - strcpy(Dest,Src); -} - - -char* strlower(char *Str) -{ - for (char *ChPtr=Str;*ChPtr;ChPtr++) - *ChPtr=(char)loctolower(*ChPtr); - return(Str); -} - - -char* strupper(char *Str) -{ - for (char *ChPtr=Str;*ChPtr;ChPtr++) - *ChPtr=(char)loctoupper(*ChPtr); - return(Str); -} - - -int stricomp(const char *Str1,const char *Str2) -{ - char S1[NM*2],S2[NM*2]; - strncpy(S1,Str1,sizeof(S1)); - strncpy(S2,Str2,sizeof(S2)); - return(strcmp(strupper(S1),strupper(S2))); -} - - -int strnicomp(const char *Str1,const char *Str2,int N) -{ - char S1[512],S2[512]; - strncpy(S1,Str1,sizeof(S1)); - strncpy(S2,Str2,sizeof(S2)); - return(strncmp(strupper(S1),strupper(S2),N)); -} - - -char* RemoveEOL(char *Str) -{ - for (int I=strlen(Str)-1;I>=0 && (Str[I]=='\r' || Str[I]=='\n' || Str[I]==' ' || Str[I]=='\t');I--) - Str[I]=0; - return(Str); -} - - -char* RemoveLF(char *Str) -{ - for (int I=strlen(Str)-1;I>=0 && (Str[I]=='\r' || Str[I]=='\n');I--) - Str[I]=0; - return(Str); -} - - -unsigned int loctolower(byte ch) -{ - return(tolower(ch)); -} - - -unsigned int loctoupper(byte ch) -{ - return(toupper(ch)); -} - - - - - -bool LowAscii(const char *Str) -{ - for (int I=0;Str[I]!=0;I++) - if ((byte)Str[I]<32 || (byte)Str[I]>127) - return(false); - return(true); -} - - -bool LowAscii(const wchar *Str) -{ - for (int I=0;Str[I]!=0;I++) - if (Str[I]<32 || Str[I]>127) - return(false); - return(true); -} diff --git a/lib/UnrarXLib/strfn.hpp b/lib/UnrarXLib/strfn.hpp deleted file mode 100644 index 57813e52f9..0000000000 --- a/lib/UnrarXLib/strfn.hpp +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef _RAR_STRFN_ -#define _RAR_STRFN_ - -const char *NullToEmpty(const char *Str); -const wchar *NullToEmpty(const wchar *Str); -char *IntNameToExt(const char *Name); -void ExtToInt(const char *Src,char *Dest); -void IntToExt(const char *Src,char *Dest); -char* strlower(char *Str); -char* strupper(char *Str); -int stricomp(const char *Str1,const char *Str2); -int strnicomp(const char *Str1,const char *Str2,int N); -char* RemoveEOL(char *Str); -char* RemoveLF(char *Str); -unsigned int loctolower(byte ch); -unsigned int loctoupper(byte ch); - - - -bool LowAscii(const char *Str); -bool LowAscii(const wchar *Str); - - -#endif diff --git a/lib/UnrarXLib/strlist.cpp b/lib/UnrarXLib/strlist.cpp deleted file mode 100644 index a16ce90a23..0000000000 --- a/lib/UnrarXLib/strlist.cpp +++ /dev/null @@ -1,191 +0,0 @@ -#include "rar.hpp" - -StringList::StringList() -{ - Reset(); -} - - -StringList::~StringList() -{ -} - - -void StringList::Reset() -{ - Rewind(); - StringData.Reset(); - StringDataW.Reset(); - PosDataW.Reset(); - StringsCount=0; - SavePosNumber=0; -} - - -unsigned int StringList::AddString(const char *Str) -{ - return(AddString(Str,NULL)); -} - - -unsigned int StringList::AddString(const char *Str,const wchar *StrW) -{ - int PrevSize=StringData.Size(); - StringData.Add(strlen(Str)+1); - strcpy(&StringData[PrevSize],Str); - if (StrW!=NULL && *StrW!=0) - { - int PrevPos=PosDataW.Size(); - PosDataW.Add(1); - PosDataW[PrevPos]=PrevSize; - - int PrevSizeW=StringDataW.Size(); - StringDataW.Add(strlenw(StrW)+1); - strcpyw(&StringDataW[PrevSizeW],StrW); - } - StringsCount++; - return(PrevSize); -} - - -bool StringList::GetString(char *Str,int MaxLength) -{ - return(GetString(Str,NULL,MaxLength)); -} - - -bool StringList::GetString(char *Str,wchar *StrW,int MaxLength) -{ - char *StrPtr; - wchar *StrPtrW; - if (Str==NULL || !GetString(&StrPtr,&StrPtrW)) - return(false); - strncpy(Str,StrPtr,MaxLength); - if (StrW!=NULL) - strncpyw(StrW,NullToEmpty(StrPtrW),MaxLength); - return(true); -} - - -#ifndef SFX_MODULE -bool StringList::GetString(char *Str,wchar *StrW,int MaxLength,int StringNum) -{ - SavePosition(); - Rewind(); - bool RetCode=true; - while (StringNum-- >=0) - if (!GetString(Str,StrW,MaxLength)) - { - RetCode=false; - break; - } - RestorePosition(); - return(RetCode); -} -#endif - - -char* StringList::GetString() -{ - char *Str; - GetString(&Str,NULL); - return(Str); -} - - - -bool StringList::GetString(char **Str,wchar **StrW) -{ - if ((int)CurPos>=StringData.Size()) - { - *Str=NULL; - return(false); - } - *Str=&StringData[CurPos]; - if ((int)PosDataItem<PosDataW.Size() && PosDataW[PosDataItem]==(int)CurPos) - { - PosDataItem++; - if (StrW!=NULL) - *StrW=&StringDataW[CurPosW]; - CurPosW+=strlenw(&StringDataW[CurPosW])+1; - } - else - if (StrW!=NULL) - *StrW=NULL; - CurPos+=strlen(*Str)+1; - return(true); -} - - -char* StringList::GetString(unsigned int StringPos) -{ - if ((int)StringPos>=StringData.Size()) - return(NULL); - return(&StringData[StringPos]); -} - - -void StringList::Rewind() -{ - CurPos=0; - CurPosW=0; - PosDataItem=0; -} - - -int StringList::GetBufferSize() -{ - return(StringData.Size()+StringDataW.Size()); -} - - -#ifndef SFX_MODULE -bool StringList::Search(char *Str,wchar *StrW,bool CaseSensitive) -{ - SavePosition(); - Rewind(); - bool Found=false; - char *CurStr; - wchar *CurStrW; - while (GetString(&CurStr,&CurStrW)) - { - if ((CaseSensitive ? strcmp(Str,CurStr):stricomp(Str,CurStr))!=0) - continue; - if (StrW!=NULL && CurStrW!=NULL) - if ((CaseSensitive ? strcmpw(StrW,CurStrW):stricmpw(StrW,CurStrW))!=0) - continue; - Found=true; - break; - } - RestorePosition(); - return(Found); -} -#endif - - -#ifndef SFX_MODULE -void StringList::SavePosition() -{ - if (SavePosNumber<sizeof(SaveCurPos)/sizeof(SaveCurPos[0])) - { - SaveCurPos[SavePosNumber]=CurPos; - SaveCurPosW[SavePosNumber]=CurPosW; - SavePosDataItem[SavePosNumber]=PosDataItem; - SavePosNumber++; - } -} -#endif - - -#ifndef SFX_MODULE -void StringList::RestorePosition() -{ - if (SavePosNumber>0) - { - SavePosNumber--; - CurPos=SaveCurPos[SavePosNumber]; - CurPosW=SaveCurPosW[SavePosNumber]; - PosDataItem=SavePosDataItem[SavePosNumber]; - } -} -#endif diff --git a/lib/UnrarXLib/strlist.hpp b/lib/UnrarXLib/strlist.hpp deleted file mode 100644 index c4d3b017ad..0000000000 --- a/lib/UnrarXLib/strlist.hpp +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef _RAR_STRLIST_ -#define _RAR_STRLIST_ - -class StringList -{ - private: - Array<char> StringData; - unsigned int CurPos; - - Array<wchar> StringDataW; - unsigned int CurPosW; - - Array<int> PosDataW; - uint PosDataItem; - - uint StringsCount; - - uint SaveCurPos[16],SaveCurPosW[16],SavePosDataItem[16],SavePosNumber; - public: - StringList(); - ~StringList(); - void Reset(); - unsigned int AddString(const char *Str); - unsigned int AddString(const char *Str,const wchar *StrW); - bool GetString(char *Str,int MaxLength); - bool GetString(char *Str,wchar *StrW,int MaxLength); - bool GetString(char *Str,wchar *StrW,int MaxLength,int StringNum); - char* GetString(); - bool GetString(char **Str,wchar **StrW); - char* GetString(unsigned int StringPos); - void Rewind(); - unsigned int ItemsCount() {return(StringsCount);}; - int GetBufferSize(); - bool Search(char *Str,wchar *StrW,bool CaseSensitive); - void SavePosition(); - void RestorePosition(); -}; - -#endif diff --git a/lib/UnrarXLib/suballoc.cpp b/lib/UnrarXLib/suballoc.cpp deleted file mode 100644 index 45cebcc478..0000000000 --- a/lib/UnrarXLib/suballoc.cpp +++ /dev/null @@ -1,257 +0,0 @@ -/**************************************************************************** - * This file is part of PPMd project * - * Written and distributed to public domain by Dmitry Shkarin 1997, * - * 1999-2000 * - * Contents: memory allocation routines * - ****************************************************************************/ - -SubAllocator::SubAllocator() -{ - Clean(); -} - - -void SubAllocator::Clean() -{ - SubAllocatorSize=0; -} - - -inline void SubAllocator::InsertNode(void* p,int indx) -{ - ((RAR_NODE*) p)->next=FreeList[indx].next; - FreeList[indx].next=(RAR_NODE*) p; -} - - -inline void* SubAllocator::RemoveNode(int indx) -{ - RAR_NODE* RetVal=FreeList[indx].next; - FreeList[indx].next=RetVal->next; - return RetVal; -} - - -inline uint SubAllocator::U2B(int NU) -{ - return /*8*NU+4*NU*/UNIT_SIZE*NU; -} - - -inline void SubAllocator::SplitBlock(void* pv,int OldIndx,int NewIndx) -{ - int i, UDiff=Indx2Units[OldIndx]-Indx2Units[NewIndx]; - byte* p=((byte*) pv)+U2B(Indx2Units[NewIndx]); - if (Indx2Units[i=Units2Indx[UDiff-1]] != UDiff) - { - InsertNode(p,--i); - p += U2B(i=Indx2Units[i]); - UDiff -= i; - } - InsertNode(p,Units2Indx[UDiff-1]); -} - - - - -void SubAllocator::StopSubAllocator() -{ - if ( SubAllocatorSize ) - { - SubAllocatorSize=0; - rarfree(HeapStart); - } -} - - -bool SubAllocator::StartSubAllocator(int SASize) -{ - uint t=(uint)(SASize) << 20; - if ((uint)SubAllocatorSize == t) - return TRUE; - StopSubAllocator(); - uint AllocSize=t/FIXED_UNIT_SIZE*UNIT_SIZE+UNIT_SIZE; -#ifdef XBOX - if ((HeapStart=(byte *)rarmalloc(AllocSize)) == NULL) - { - ErrHandler.MemoryError(); - return FALSE; - } -#else - // this is uggly, we keep halfing the size till - // we manage to alloc, it's likely that we - // fail to alloc - uint AllocSize2 = AllocSize; - while(AllocSize2 && (HeapStart=(byte *)rarmalloc(AllocSize2)) == NULL) - AllocSize2<<=1; - - if(HeapStart == NULL) - { - ErrHandler.MemoryError(); - return FALSE; - } - -#endif - HeapEnd=HeapStart+AllocSize-UNIT_SIZE; - SubAllocatorSize=t; - return TRUE; -} - - -void SubAllocator::InitSubAllocator() -{ - int i, k; - memset(FreeList,0,sizeof(FreeList)); - pText=HeapStart; - uint Size2=FIXED_UNIT_SIZE*(SubAllocatorSize/8/FIXED_UNIT_SIZE*7); - uint RealSize2=Size2/FIXED_UNIT_SIZE*UNIT_SIZE; - uint Size1=SubAllocatorSize-Size2; - uint RealSize1=Size1/FIXED_UNIT_SIZE*UNIT_SIZE+Size1%FIXED_UNIT_SIZE; - HiUnit=HeapStart+SubAllocatorSize; - LoUnit=UnitsStart=HeapStart+RealSize1; - FakeUnitsStart=HeapStart+Size1; - HiUnit=LoUnit+RealSize2; - for (i=0,k=1;i < N1 ;i++,k += 1) - Indx2Units[i]=k; - for (k++;i < N1+N2 ;i++,k += 2) - Indx2Units[i]=k; - for (k++;i < N1+N2+N3 ;i++,k += 3) - Indx2Units[i]=k; - for (k++;i < N1+N2+N3+N4;i++,k += 4) - Indx2Units[i]=k; - for (GlueCount=k=i=0;k < 128;k++) - { - i += (Indx2Units[i] < k+1); - Units2Indx[k]=i; - } -} - - -inline void SubAllocator::GlueFreeBlocks() -{ - RAR_MEM_BLK s0, * p, * p1; - int i, k, sz; - if (LoUnit != HiUnit) - *LoUnit=0; - for (i=0, s0.next=s0.prev=&s0;i < N_INDEXES;i++) - while ( FreeList[i].next ) - { - p=(RAR_MEM_BLK*)RemoveNode(i); - p->insertAt(&s0); - p->Stamp=0xFFFF; - p->NU=Indx2Units[i]; - } - for (p=s0.next;p != &s0;p=p->next) - while ((p1=p+p->NU)->Stamp == 0xFFFF && int(p->NU)+p1->NU < 0x10000) - { - p1->remove(); - p->NU += p1->NU; - } - while ((p=s0.next) != &s0) - { - for (p->remove(), sz=p->NU;sz > 128;sz -= 128, p += 128) - InsertNode(p,N_INDEXES-1); - if (Indx2Units[i=Units2Indx[sz-1]] != sz) - { - k=sz-Indx2Units[--i]; - InsertNode(p+(sz-k),k-1); - } - InsertNode(p,i); - } -} - -void* SubAllocator::AllocUnitsRare(int indx) -{ - if ( !GlueCount ) - { - GlueCount = 255; - GlueFreeBlocks(); - if ( FreeList[indx].next ) - return RemoveNode(indx); - } - int i=indx; - do - { - if (++i == N_INDEXES) - { - GlueCount--; - i=U2B(Indx2Units[indx]); - int j=12*Indx2Units[indx]; - if (FakeUnitsStart-pText > j) - { - FakeUnitsStart-=j; - UnitsStart -= i; - return(UnitsStart); - } - return(NULL); - } - } while ( !FreeList[i].next ); - void* RetVal=RemoveNode(i); - SplitBlock(RetVal,i,indx); - return RetVal; -} - - -inline void* SubAllocator::AllocUnits(int NU) -{ - int indx=Units2Indx[NU-1]; - if ( FreeList[indx].next ) - return RemoveNode(indx); - void* RetVal=LoUnit; - LoUnit += U2B(Indx2Units[indx]); - if (LoUnit <= HiUnit) - return RetVal; - LoUnit -= U2B(Indx2Units[indx]); - return AllocUnitsRare(indx); -} - - -void* SubAllocator::AllocContext() -{ - if (HiUnit != LoUnit) - return (HiUnit -= UNIT_SIZE); - if ( FreeList->next ) - return RemoveNode(0); - return AllocUnitsRare(0); -} - - -void* SubAllocator::ExpandUnits(void* OldPtr,int OldNU) -{ - int i0=Units2Indx[OldNU-1], i1=Units2Indx[OldNU-1+1]; - if (i0 == i1) - return OldPtr; - void* ptr=AllocUnits(OldNU+1); - if ( ptr ) - { - memcpy(ptr,OldPtr,U2B(OldNU)); - InsertNode(OldPtr,i0); - } - return ptr; -} - - -void* SubAllocator::ShrinkUnits(void* OldPtr,int OldNU,int NewNU) -{ - int i0=Units2Indx[OldNU-1], i1=Units2Indx[NewNU-1]; - if (i0 == i1) - return OldPtr; - if ( FreeList[i1].next ) - { - void* ptr=RemoveNode(i1); - memcpy(ptr,OldPtr,U2B(NewNU)); - InsertNode(OldPtr,i0); - return ptr; - } - else - { - SplitBlock(OldPtr,i0,i1); - return OldPtr; - } -} - - -void SubAllocator::FreeUnits(void* ptr,int OldNU) -{ - InsertNode(ptr,Units2Indx[OldNU-1]); -} diff --git a/lib/UnrarXLib/suballoc.hpp b/lib/UnrarXLib/suballoc.hpp deleted file mode 100644 index c10c7d4a77..0000000000 --- a/lib/UnrarXLib/suballoc.hpp +++ /dev/null @@ -1,86 +0,0 @@ -/**************************************************************************** - * This file is part of PPMd project * - * Written and distributed to public domain by Dmitry Shkarin 1997, * - * 1999-2000 * - * Contents: interface to memory allocation routines * - ****************************************************************************/ -#if !defined(_SUBALLOC_H_) -#define _SUBALLOC_H_ - -const int N1=4, N2=4, N3=4, N4=(128+3-1*N1-2*N2-3*N3)/4; -const int N_INDEXES=N1+N2+N3+N4; - -// FIXME, this is probably broken on OS X. -#if (defined(__GNUC__) || defined(TARGET_POSIX)) && !defined(TARGET_DARWIN) -#define _PACK_ATTR __attribute__ ((__packed__)) -#else -#define _PACK_ATTR -#endif /* defined(__GNUC__) */ - -#ifndef TARGET_POSIX -#pragma pack(1) -#endif -struct RAR_MEM_BLK -{ - ushort Stamp, NU; - RAR_MEM_BLK* next, * prev; - void insertAt(RAR_MEM_BLK* p) - { - next=(prev=p)->next; - p->next=next->prev=this; - } - void remove() - { - prev->next=next; - next->prev=prev; - } -} _PACK_ATTR; - -// FIXME, this is probably broken on OS X. -#ifndef __APPLE__ -#ifdef _AIX -#pragma pack(pop) -#else -#pragma pack() -#endif -#endif - -struct RAR_NODE -{ - RAR_NODE* next; -}; - -class SubAllocator -{ - private: - inline void InsertNode(void* p,int indx); - inline void* RemoveNode(int indx); - inline uint U2B(int NU); - inline void SplitBlock(void* pv,int OldIndx,int NewIndx); - uint GetUsedMemory(); - inline void GlueFreeBlocks(); - void* AllocUnitsRare(int indx); - - long SubAllocatorSize; - byte Indx2Units[N_INDEXES], Units2Indx[128], GlueCount; - byte *HeapStart,*LoUnit, *HiUnit; - struct RAR_NODE FreeList[N_INDEXES]; - public: - SubAllocator(); - ~SubAllocator() {StopSubAllocator();} - void Clean(); - bool StartSubAllocator(int SASize); - void StopSubAllocator(); - void InitSubAllocator(); - inline void* AllocContext(); - inline void* AllocUnits(int NU); - inline void* ExpandUnits(void* ptr,int OldNU); - inline void* ShrinkUnits(void* ptr,int OldNU,int NewNU); - inline void FreeUnits(void* ptr,int OldNU); - long GetAllocatedMemory() {return(SubAllocatorSize);}; - - byte *pText, *UnitsStart,*HeapEnd,*FakeUnitsStart; -}; - - -#endif /* !defined(_SUBALLOC_H_) */ diff --git a/lib/UnrarXLib/system.cpp b/lib/UnrarXLib/system.cpp deleted file mode 100644 index ab2eb73a48..0000000000 --- a/lib/UnrarXLib/system.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#include "rar.hpp" - -#ifndef _WIN_CE -static int SleepTime=0; - -void InitSystemOptions(int SleepTime) -{ - ::SleepTime=SleepTime; -} -#endif - - -#if !defined(SFX_MODULE) && !defined(_WIN_CE) - -#if defined(_WIN_32) && !defined(BELOW_NORMAL_PRIORITY_CLASS) -#define BELOW_NORMAL_PRIORITY_CLASS 0x00004000 -#define ABOVE_NORMAL_PRIORITY_CLASS 0x00008000 -#endif - -void SetPriority(int Priority) -{ -#if defined(_WIN_32) - uint PriorityClass; - int PriorityLevel; - if (Priority<1 || Priority>15) - return; - if (Priority==1) - { - PriorityClass=IDLE_PRIORITY_CLASS; - PriorityLevel=THREAD_PRIORITY_IDLE; - } - else - if (Priority<7) - { - PriorityClass=IDLE_PRIORITY_CLASS; - PriorityLevel=Priority-4; - } - else - if (Priority<11) - { - PriorityClass=NORMAL_PRIORITY_CLASS; - PriorityLevel=Priority-9; - } - else - { - PriorityClass=HIGH_PRIORITY_CLASS; - PriorityLevel=Priority-13; - } - SetPriorityClass(GetCurrentProcess(),PriorityClass); - SetThreadPriority(GetCurrentThread(),PriorityLevel); -#endif -} -#endif - - -void Wait() -{ -} diff --git a/lib/UnrarXLib/system.hpp b/lib/UnrarXLib/system.hpp deleted file mode 100644 index 89582ecef0..0000000000 --- a/lib/UnrarXLib/system.hpp +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _RAR_SYSTEM_ -#define _RAR_SYSTEM_ - -void InitSystemOptions(int SleepTime); -void SetPriority(int Priority); -void Wait(); -bool EmailFile(char *FileName,char *MailTo); -void Shutdown(); - -#endif diff --git a/lib/UnrarXLib/timefn.cpp b/lib/UnrarXLib/timefn.cpp deleted file mode 100644 index 07b745aff2..0000000000 --- a/lib/UnrarXLib/timefn.cpp +++ /dev/null @@ -1,288 +0,0 @@ -#include "rar.hpp" - -RarTime::RarTime() -{ - Reset(); -} - -#ifdef _WIN_32 -RarTime& RarTime::operator =(FILETIME &ft) -{ - FILETIME lft,zft; - FileTimeToLocalFileTime(&ft,&lft); - SYSTEMTIME st; - FileTimeToSystemTime(&lft,&st); - rlt.Year=st.wYear; - rlt.Month=st.wMonth; - rlt.Day=st.wDay; - rlt.Hour=st.wHour; - rlt.Minute=st.wMinute; - rlt.Second=st.wSecond; - rlt.wDay=st.wDayOfWeek; - rlt.yDay=rlt.Day-1; - for (int I=1;I<rlt.Month;I++) - { - static int mdays[12]={31,28,31,30,31,30,31,31,30,31,30,31}; - rlt.yDay+=mdays[I-1]; - } - if (rlt.Month>2 && IsLeapYear(rlt.Year)) - rlt.yDay++; - - st.wMilliseconds=0; - SystemTimeToFileTime(&st,&zft); - rlt.Reminder=lft.dwLowDateTime-zft.dwLowDateTime; - return(*this); -} - - -void RarTime::GetWin32(FILETIME *ft) -{ - SYSTEMTIME st; - st.wYear=rlt.Year; - st.wMonth=rlt.Month; - st.wDay=rlt.Day; - st.wHour=rlt.Hour; - st.wMinute=rlt.Minute; - st.wSecond=rlt.Second; - st.wMilliseconds=0; - FILETIME lft; - SystemTimeToFileTime(&st,&lft); - lft.dwLowDateTime+=rlt.Reminder; - if (lft.dwLowDateTime<rlt.Reminder) - lft.dwHighDateTime++; - LocalFileTimeToFileTime(&lft,ft); -} -#endif - - -#if defined(_UNIX) || defined(_EMX) -RarTime& RarTime::operator =(time_t ut) -{ - struct tm t; - localtime_r(&ut, &t); - - rlt.Year=t.tm_year+1900; - rlt.Month=t.tm_mon+1; - rlt.Day=t.tm_mday; - rlt.Hour=t.tm_hour; - rlt.Minute=t.tm_min; - rlt.Second=t.tm_sec; - rlt.Reminder=0; - rlt.wDay=t.tm_wday; - rlt.yDay=t.tm_yday; - return(*this); -} - - -time_t RarTime::GetUnix() -{ - struct tm t; - - t.tm_sec=rlt.Second; - t.tm_min=rlt.Minute; - t.tm_hour=rlt.Hour; - t.tm_mday=rlt.Day; - t.tm_mon=rlt.Month-1; - t.tm_year=rlt.Year-1900; - t.tm_isdst=-1; - return(mktime(&t)); -} -#endif - - -Int64 RarTime::GetRaw() -{ - if (!IsSet()) - return(0); -#ifdef _WIN_32 - FILETIME ft; - GetWin32(&ft); - return(int32to64(ft.dwHighDateTime,ft.dwLowDateTime)); -#elif defined(_UNIX) || defined(_EMX) - time_t ut=GetUnix(); - return(int32to64(0,ut)*10000000+rlt.Reminder); -#else - return(0); -#endif -} - - -#ifndef SFX_MODULE -void RarTime::SetRaw(Int64 RawTime) -{ -#ifdef _WIN_32 - FILETIME ft; - ft.dwHighDateTime=int64to32(RawTime>>32); - ft.dwLowDateTime=int64to32(RawTime); - *this=ft; -#elif defined(_UNIX) || defined(_EMX) - time_t ut=int64to32(RawTime/10000000); - *this=ut; - rlt.Reminder=int64to32(RawTime%10000000); -#endif -} -#endif - - -bool RarTime::operator == (RarTime &rt) -{ - return(rlt.Year==rt.rlt.Year && rlt.Month==rt.rlt.Month && - rlt.Day==rt.rlt.Day && rlt.Hour==rt.rlt.Hour && - rlt.Minute==rt.rlt.Minute && rlt.Second==rt.rlt.Second && - rlt.Reminder==rt.rlt.Reminder); -} - - -bool RarTime::operator < (RarTime &rt) -{ - return(GetRaw()<rt.GetRaw()); -} - - -bool RarTime::operator <= (RarTime &rt) -{ - return(*this<rt || *this==rt); -} - - -bool RarTime::operator > (RarTime &rt) -{ - return(GetRaw()>rt.GetRaw()); -} - - -bool RarTime::operator >= (RarTime &rt) -{ - return(*this>rt || *this==rt); -} - - -uint RarTime::GetDos() -{ - uint DosTime=(rlt.Second/2)|(rlt.Minute<<5)|(rlt.Hour<<11)| - (rlt.Day<<16)|(rlt.Month<<21)|((rlt.Year-1980)<<25); - return(DosTime); -} - - -void RarTime::SetDos(uint DosTime) -{ - rlt.Second=(DosTime & 0x1f)*2; - rlt.Minute=(DosTime>>5) & 0x3f; - rlt.Hour=(DosTime>>11) & 0x1f; - rlt.Day=(DosTime>>16) & 0x1f; - rlt.Month=(DosTime>>21) & 0x0f; - rlt.Year=(DosTime>>25)+1980; - rlt.Reminder=0; -} - - -#if !defined(GUI) || !defined(SFX_MODULE) -void RarTime::GetText(char *DateStr,bool FullYear) -{ - if (FullYear) - sprintf(DateStr,"%02u-%02u-%u %02u:%02u",rlt.Day,rlt.Month,rlt.Year,rlt.Hour,rlt.Minute); - else - sprintf(DateStr,"%02u-%02u-%02u %02u:%02u",rlt.Day,rlt.Month,rlt.Year%100,rlt.Hour,rlt.Minute); -} -#endif - - -#ifndef SFX_MODULE -void RarTime::SetIsoText(char *TimeText) -{ - int Field[6]; - memset(Field,0,sizeof(Field)); - for (int DigitCount=0;*TimeText!=0;TimeText++) - if (isdigit(*TimeText)) - { - unsigned int FieldPos=DigitCount<4 ? 0:(DigitCount-4)/2+1; - if (FieldPos<sizeof(Field)/sizeof(Field[0])) - Field[FieldPos]=Field[FieldPos]*10+*TimeText-'0'; - DigitCount++; - } - rlt.Second=Field[5]; - rlt.Minute=Field[4]; - rlt.Hour=Field[3]; - rlt.Day=Field[2]==0 ? 1:Field[2]; - rlt.Month=Field[1]==0 ? 1:Field[1]; - rlt.Year=Field[0]; - rlt.Reminder=0; -} -#endif - - -#ifndef SFX_MODULE -void RarTime::SetAgeText(char *TimeText) -{ - uint Seconds=0,Value=0; - for (int I=0;TimeText[I]!=0;I++) - { - int Ch=TimeText[I]; - if (isdigit(Ch)) - Value=Value*10+Ch-'0'; - else - { - switch(toupper(Ch)) - { - case 'D': - Seconds+=Value*24*3600; - break; - case 'H': - Seconds+=Value*3600; - break; - case 'M': - Seconds+=Value*60; - break; - case 'S': - Seconds+=Value; - break; - } - Value=0; - } - } - SetCurrentTime(); - Int64 RawTime=GetRaw(); - SetRaw(RawTime-int32to64(0,Seconds)*10000000); -} -#endif - - -#ifndef SFX_MODULE -void RarTime::SetCurrentTime() -{ -#ifdef _WIN_32 - FILETIME ft; - SYSTEMTIME st; - GetSystemTime(&st); - SystemTimeToFileTime(&st,&ft); - *this=ft; -#else - time_t st; - time(&st); - *this=st; -#endif -} -#endif - - -#if !defined(SFX_MODULE) && !defined(_WIN_CE) -const char *GetMonthName(int Month) -{ -#ifdef SILENT - return(""); -#else - static MSGID MonthID[]={ - MMonthJan,MMonthFeb,MMonthMar,MMonthApr,MMonthMay,MMonthJun, - MMonthJul,MMonthAug,MMonthSep,MMonthOct,MMonthNov,MMonthDec - }; - return(St(MonthID[Month])); -#endif -} -#endif - - -bool IsLeapYear(int Year) -{ - return((Year&3)==0 && (Year%100!=0 || Year%400==0)); -} diff --git a/lib/UnrarXLib/timefn.hpp b/lib/UnrarXLib/timefn.hpp deleted file mode 100644 index 9ab5032f45..0000000000 --- a/lib/UnrarXLib/timefn.hpp +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef _RAR_TIMEFN_ -#define _RAR_TIMEFN_ - -struct RarLocalTime -{ - uint Year; - uint Month; - uint Day; - uint Hour; - uint Minute; - uint Second; - uint Reminder; - uint wDay; - uint yDay; -}; - - -class RarTime -{ - private: - Int64 GetRaw(); - void SetRaw(Int64 RawTime); - - RarLocalTime rlt; - - Int64 Time; - public: - RarTime(); -#ifdef _WIN_32 - RarTime& operator =(FILETIME &ft); - void GetWin32(FILETIME *ft); -#endif -#if defined(_UNIX) || defined(_EMX) - RarTime& operator =(time_t ut); - time_t GetUnix(); -#endif - bool operator == (RarTime &rt); - bool operator < (RarTime &rt); - bool operator <= (RarTime &rt); - bool operator > (RarTime &rt); - bool operator >= (RarTime &rt); - void GetLocal(RarLocalTime *lt) {*lt=rlt;} - void SetLocal(RarLocalTime *lt) {rlt=*lt;} - uint GetDos(); - void SetDos(uint DosTime); - void GetText(char *DateStr,bool FullYear); - void SetIsoText(char *TimeText); - void SetAgeText(char *TimeText); - void SetCurrentTime(); - void Reset() {rlt.Year=0;} - bool IsSet() {return(rlt.Year!=0);} -}; - -const char *GetMonthName(int Month); -bool IsLeapYear(int Year); - -#endif diff --git a/lib/UnrarXLib/ulinks.cpp b/lib/UnrarXLib/ulinks.cpp deleted file mode 100644 index cf317a14dd..0000000000 --- a/lib/UnrarXLib/ulinks.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include "rar.hpp" -#include "Util.h" -#include "utils/URIUtils.h" - - -int ExtractLink(ComprDataIO &DataIO,Archive &Arc,char *DestName,uint &LinkCRC,bool Create) -{ -#if defined(SAVE_LINKS) && defined(_UNIX) - char FileName[NM]; - if (IsLink(Arc.NewLhd.FileAttr)) - { - uint DataSize=Min(Arc.NewLhd.PackSize,sizeof(FileName)-1); - DataIO.UnpRead((byte *)FileName,DataSize); - FileName[DataSize]=0; - if (Create) - { - std::string strPath = URIUtils::GetDirectory(DestName); - CUtil::CreateDirectoryEx(strPath); - if (symlink(FileName,DestName)==-1) - { - if (errno==EEXIST) - Log(Arc.FileName,St(MSymLinkExists),DestName); - else - { - Log(Arc.FileName,St(MErrCreateLnk),DestName); - ErrHandler.SetErrorCode(WARNING); - } - } - } - int NameSize=Min(DataSize,strlen(FileName)); - LinkCRC=CRC(0xffffffff,FileName,NameSize); return(1); - } -#endif - return(0); -} diff --git a/lib/UnrarXLib/ulinks.hpp b/lib/UnrarXLib/ulinks.hpp deleted file mode 100644 index 69b0e9f85b..0000000000 --- a/lib/UnrarXLib/ulinks.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _RAR_ULINKS_ -#define _RAR_ULINKS_ - -void SaveLinkData(ComprDataIO &DataIO,Archive &TempArc,FileHeader &hd, - char *Name); -int ExtractLink(ComprDataIO &DataIO,Archive &Arc,char *DestName, - uint &LinkCRC,bool Create); - -#endif diff --git a/lib/UnrarXLib/unicode.cpp b/lib/UnrarXLib/unicode.cpp deleted file mode 100644 index 234a98ee62..0000000000 --- a/lib/UnrarXLib/unicode.cpp +++ /dev/null @@ -1,487 +0,0 @@ -#include "rar.hpp" - -// yuvalt: wcstombs is not the way to go since it does not convert -// from utf8 to utf16. Luickly, there's a UTF8/UTF16 conversion -// functions in here which are used if _APPLE is defined. -// Therefore, define _APPLE in this case to do proper conversion -#undef MBFUNCTIONS -#undef _WIN_32 -#define _APPLE - -bool WideToChar(const wchar *Src,char *Dest,int DestSize) -{ - bool RetCode=true; -#ifdef _WIN_32 - if (WideCharToMultiByte(CP_ACP,0,Src,-1,Dest,DestSize,NULL,NULL)==0) - RetCode=false; -#else -#ifdef _APPLE - WideToUtf(Src,Dest,DestSize); -#else -#ifdef MBFUNCTIONS - if (wcstombs(Dest,Src,DestSize)==(uint)-1) - RetCode=false; -#else - if (UnicodeEnabled()) - { - for (int I=0;I<DestSize;I++) - { - Dest[I]=(char)Src[I]; - if (Src[I]==0) - break; - } -#endif -#endif -#endif - return(RetCode); -} - - -bool CharToWide(const char *Src,wchar *Dest,int DestSize) -{ - bool RetCode=true; -#ifdef _WIN_32 - if (MultiByteToWideChar(CP_ACP,0,Src,-1,Dest,DestSize)==0) - RetCode=false; -#else -#ifdef _APPLE - UtfToWide(Src,Dest,DestSize); -#else -#ifdef MBFUNCTIONS - mbstowcs(Dest,Src,DestSize); -#else - if (UnicodeEnabled()) - { - for (int I=0;I<DestSize;I++) - { - Dest[I]=(wchar_t)Src[I]; - if (Src[I]==0) - break; - } -#endif -#endif -#endif - return(RetCode); -} - - -byte* WideToRaw(const wchar *Src,byte *Dest,int DestSize) -{ - for (int I=0;I<DestSize;I++,Src++) - { - Dest[I*2]=(byte)*Src; - Dest[I*2+1]=(byte)(*Src>>8); - if (*Src==0) - break; - } - return(Dest); -} - - -wchar* RawToWide(const byte *Src,wchar *Dest,int DestSize) -{ - for (int I=0;I<DestSize;I++) - if ((Dest[I]=Src[I*2]+(Src[I*2+1]<<8))==0) - break; - return(Dest); -} - - -#ifdef _APPLE -void WideToUtf(const wchar *Src,char *Dest,int DestSize) -{ - DestSize--; - while (*Src!=0 && --DestSize>=0) - { - uint c=*(Src++); - if (c<0x80) - *(Dest++)=c; - else - if (c<0x800 && --DestSize>=0) - { - *(Dest++)=(0xc0|(c>>6)); - *(Dest++)=(0x80|(c&0x3f)); - } - else - if (c<0x10000 && (DestSize-=2)>=0) - { - *(Dest++)=(0xe0|(c>>12)); - *(Dest++)=(0x80|((c>>6)&0x3f)); - *(Dest++)=(0x80|(c&0x3f)); - } - } - *Dest=0; -} -#endif - - -#ifdef _APPLE -void UtfToWide(const char *Src,wchar *Dest,int DestSize) -{ - DestSize--; - while (*Src!=0) - { - uint c=(byte)*(Src++),d; - if (c<0x80) - d=c; - else - if ((c>>5)==6) - { - if ((*Src&0xc0)!=0x80) - break; - d=((c&0x1f)<<6)|(*Src&0x3f); - Src++; - } - else - if ((c>>4)==14) - { - if ((Src[0]&0xc0)!=0x80 || (Src[1]&0xc0)!=0x80) - break; - d=((c&0xf)<<12)|((Src[0]&0x3f)<<6)|(Src[1]&0x3f); - Src+=2; - } - else - break; - if (--DestSize<0) - break; - *(Dest++)=d; - } - *Dest=0; -} -#endif - - -bool UnicodeEnabled() -{ -#ifdef UNICODE_SUPPORTED - #ifdef _EMX - return(uni_ready); - #else - return(true); - #endif -#else - return(false); -#endif -} - - -int strlenw(const wchar *str) -{ - int length=0; - while (*(str++)!=0) - length++; - return(length); -} - - -wchar* strcpyw(wchar *dest,const wchar *src) -{ - do { - *(dest++)=*src; - } while (*(src++)!=0); - return(dest); -} - - -wchar* strncpyw(wchar *dest,const wchar *src,int n) -{ - do { - *(dest++)=*src; - } while (*(src++)!=0 && --n > 0); - return(dest); -} - - -wchar* strcatw(wchar *dest,const wchar *src) -{ - return(strcpyw(dest+strlenw(dest),src)); -} - - -#ifndef SFX_MODULE -wchar* strncatw(wchar *dest,const wchar *src,int n) -{ - dest+=strlenw(dest); - while (true) - if (--n<0) - { - *dest=0; - break; - } - else - if ((*(dest++)=*(src++))==0) - break; - return(dest); -} -#endif - - -int strcmpw(const wchar *s1,const wchar *s2) -{ - while (*s1==*s2) - { - if (*s1==0) - return(0); - s1++; - s2++; - } - return(*s1<*s2 ? -1:1); -} - - -int strncmpw(const wchar *s1,const wchar *s2,int n) -{ - while (n-->0) - { - if (*s1<*s2) - return(-1); - if (*s1>*s2) - return(-1); - if (*s1==0) - break; - s1++; - s2++; - } - return(0); -} - - -#ifndef SFX_MODULE -int stricmpw(const wchar *s1,const wchar *s2) -{ - char Ansi1[NM*sizeof(wchar)],Ansi2[NM*sizeof(wchar)]; - WideToChar(s1,Ansi1,sizeof(Ansi1)); - WideToChar(s2,Ansi2,sizeof(Ansi2)); - return(stricomp(Ansi1,Ansi2)); -} -#endif - - -#if !defined(SFX_MODULE) && !defined(_WIN_CE) -inline int strnicmpw_w2c(const wchar *s1,const wchar *s2,int n) -{ - wchar Wide1[NM*2],Wide2[NM*2]; - strncpyw(Wide1,s1,sizeof(Wide1)/sizeof(Wide1[0])-1); - strncpyw(Wide2,s2,sizeof(Wide2)/sizeof(Wide2[0])-1); - Wide1[Min((int)(sizeof(Wide1)/sizeof(Wide1[0])-1),n)]=0; - Wide2[Min((int)(sizeof(Wide2)/sizeof(Wide2[0])-1),n)]=0; - char Ansi1[NM*2],Ansi2[NM*2]; - WideToChar(Wide1,Ansi1,sizeof(Ansi1)); - WideToChar(Wide2,Ansi2,sizeof(Ansi2)); - return(stricomp(Ansi1,Ansi2)); -} -#endif - - -#ifndef SFX_MODULE -int strnicmpw(const wchar *s1,const wchar *s2,int n) -{ - return(strnicmpw_w2c(s1,s2,n)); -} -#endif - - -wchar* strchrw(const wchar *s,int c) -{ - while (*s) - { - if (*s==c) - return((wchar *)s); - s++; - } - return(NULL); -} - - -wchar* strrchrw(const wchar *s,int c) -{ - for (int I=strlenw(s)-1;I>=0;I--) - if (s[I]==c) - return((wchar *)(s+I)); - return(NULL); -} - - -wchar* strpbrkw(const wchar *s1,const wchar *s2) -{ - while (*s1) - { - if (strchrw(s2,*s1)!=NULL) - return((wchar *)s1); - s1++; - } - return(NULL); -} - - -#ifndef SFX_MODULE -wchar* strlowerw(wchar *Str) -{ - for (wchar *ChPtr=Str;*ChPtr;ChPtr++) - if (*ChPtr<128) - *ChPtr=loctolower((char)*ChPtr); - return(Str); -} -#endif - - -#ifndef SFX_MODULE -wchar* strupperw(wchar *Str) -{ - for (wchar *ChPtr=Str;*ChPtr;ChPtr++) - if (*ChPtr<128) - *ChPtr=loctoupper((char)*ChPtr); - return(Str); -} -#endif - - -#ifndef SFX_MODULE -int toupperw(int ch) -{ - return((ch<128) ? loctoupper(ch):ch); -} -#endif - - -int atoiw(const wchar *s) -{ - int n=0; - while (*s>='0' && *s<='9') - { - n=n*10+(*s-'0'); - s++; - } - return(n); -} - - -#ifdef DBCS_SUPPORTED -SupportDBCS gdbcs; - -SupportDBCS::SupportDBCS() -{ - Init(); -} - - -void SupportDBCS::Init() -{ -#if defined(TARGET_POSIX) - DBCSMode = true; - for (int I=0;I<sizeof(IsLeadByte)/sizeof(IsLeadByte[0]);I++) - IsLeadByte[I]=true; -#else - CPINFO CPInfo; - GetCPInfo(CP_ACP,&CPInfo); - DBCSMode=CPInfo.MaxCharSize > 1; - for (int I=0;I<sizeof(IsLeadByte)/sizeof(IsLeadByte[0]);I++) - IsLeadByte[I]=IsDBCSLeadByte(I); -#endif -} - - -char* SupportDBCS::charnext(const char *s) -{ - return (char *)(IsLeadByte[*s] ? s+2:s+1); -} - - -uint SupportDBCS::strlend(const char *s) -{ - uint Length=0; - while (*s!=0) - { - if (IsLeadByte[*s]) - s+=2; - else - s++; - Length++; - } - return(Length); -} - - -char* SupportDBCS::strchrd(const char *s, int c) -{ - while (*s!=0) - if (IsLeadByte[*s]) - s+=2; - else - if (*s==c) - return((char *)s); - else - s++; - return(NULL); -} - - -void SupportDBCS::copychrd(char *dest,const char *src) -{ - dest[0]=src[0]; - if (IsLeadByte[src[0]]) - dest[1]=src[1]; -} - - -char* SupportDBCS::strrchrd(const char *s, int c) -{ - const char *found=NULL; - while (*s!=0) - if (IsLeadByte[*s]) - s+=2; - else - { - if (*s==c) - found=s; - s++; - } - return((char *)found); -} -#endif -#if defined(TARGET_WINDOWS) || defined(TARGET_WIN10) -#include <memory> - -namespace unrarxlib -{ -std::string FromW(const wchar_t* str, size_t length) -{ - int result = WideCharToMultiByte(CP_UTF8, MB_ERR_INVALID_CHARS, str, length, nullptr, 0, nullptr, nullptr); - if (result == 0) - return std::string(); - - auto newStr = std::make_unique<char[]>(result); - result = WideCharToMultiByte(CP_UTF8, MB_ERR_INVALID_CHARS, str, length, newStr.get(), result, nullptr, nullptr); - if (result == 0) - return std::string(); - - return std::string(newStr.get(), result); -} - -std::string FromW(const std::wstring& str) -{ - return FromW(str.c_str(), str.length()); -} - -std::wstring ToW(const char* str, size_t length) -{ - int result = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, str, length, nullptr, 0); - if (result == 0) - return std::wstring(); - - auto newStr = std::make_unique<wchar_t[]>(result); - result = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, str, length, newStr.get(), result); - - if (result == 0) - return std::wstring(); - - return std::wstring(newStr.get(), result); -} - -std::wstring ToW(const std::string& str) -{ - return ToW(str.c_str(), str.length()); -} - -} -#endif diff --git a/lib/UnrarXLib/unicode.hpp b/lib/UnrarXLib/unicode.hpp deleted file mode 100644 index 5b67276824..0000000000 --- a/lib/UnrarXLib/unicode.hpp +++ /dev/null @@ -1,128 +0,0 @@ -#ifndef _RAR_UNICODE_ -#define _RAR_UNICODE_ - -#ifndef _EMX -#define MBFUNCTIONS -#endif - -#if defined(MBFUNCTIONS) || defined(_WIN_32) || defined(_EMX) && !defined(_DJGPP) -#define UNICODE_SUPPORTED -#endif - -#ifdef _WIN_32 -#define DBCS_SUPPORTED -#endif - -#include <string> - -bool WideToChar(const wchar *Src,char *Dest,int DestSize=0x10000000); -bool CharToWide(const char *Src,wchar *Dest,int DestSize=0x10000000); -byte* WideToRaw(const wchar *Src,byte *Dest,int DestSize=0x10000000); -wchar* RawToWide(const byte *Src,wchar *Dest,int DestSize=0x10000000); -void WideToUtf(const wchar *Src,char *Dest,int DestSize); -void UtfToWide(const char *Src,wchar *Dest,int DestSize); -bool UnicodeEnabled(); - -int strlenw(const wchar *str); -wchar* strcpyw(wchar *dest,const wchar *src); -wchar* strncpyw(wchar *dest,const wchar *src,int n); -wchar* strcatw(wchar *dest,const wchar *src); -wchar* strncatw(wchar *dest,const wchar *src,int n); -int strcmpw(const wchar *s1,const wchar *s2); -int strncmpw(const wchar *s1,const wchar *s2,int n); -int stricmpw(const wchar *s1,const wchar *s2); -int strnicmpw(const wchar *s1,const wchar *s2,int n); -wchar *strchrw(const wchar *s,int c); -wchar* strrchrw(const wchar *s,int c); -wchar* strpbrkw(const wchar *s1,const wchar *s2); -wchar* strlowerw(wchar *Str); -wchar* strupperw(wchar *Str); -int toupperw(int ch); -int atoiw(const wchar *s); - -#ifdef DBCS_SUPPORTED -class SupportDBCS -{ - public: - SupportDBCS(); - void Init(); - - char* charnext(const char *s); - uint strlend(const char *s); - char *strchrd(const char *s, int c); - char *strrchrd(const char *s, int c); - void copychrd(char *dest,const char *src); - - bool IsLeadByte[256]; - bool DBCSMode; -}; - -extern SupportDBCS gdbcs; - -inline char* charnext(const char *s) {return (char *)(gdbcs.DBCSMode ? gdbcs.charnext(s):s+1);} -inline uint strlend(const char *s) {return (uint)(gdbcs.DBCSMode ? gdbcs.strlend(s):strlen(s));} -inline char* strchrd(const char *s, int c) {return (char *)(gdbcs.DBCSMode ? gdbcs.strchrd(s,c):strchr(s,c));} -inline char* strrchrd(const char *s, int c) {return (char *)(gdbcs.DBCSMode ? gdbcs.strrchrd(s,c):strrchr(s,c));} -inline void copychrd(char *dest,const char *src) {if (gdbcs.DBCSMode) gdbcs.copychrd(dest,src); else *dest=*src;} -inline bool IsDBCSMode() {return(gdbcs.DBCSMode);} -inline void InitDBCS() {gdbcs.Init();} - -#else -#define charnext(s) ((s)+1) -#define strlend strlen -#define strchrd strchr -#define strrchrd strrchr -#define IsDBCSMode() (true) -inline void copychrd(char *dest,const char *src) {*dest=*src;} -#endif - - - -#if defined(TARGET_WINDOWS) || defined(TARGET_WIN10) -namespace unrarxlib -{ -/** -* Convert UTF-16 to UTF-8 strings -* Windows specific method to avoid initialization issues -* and locking issues that are unique to Windows as API calls -* expect UTF-16 strings -* \param str[in] string to be converted -* \param length[in] length in characters of the string -* \returns utf8 string, empty string on failure -*/ -std::string FromW(const wchar_t* str, size_t length); - -/** -* Convert UTF-16 to UTF-8 strings -* Windows specific method to avoid initialization issues -* and locking issues that are unique to Windows as API calls -* expect UTF-16 strings -* \param str[in] string to be converted -* \returns utf8 string, empty string on failure -*/ -std::string FromW(const std::wstring& str); - -/** -* Convert UTF-8 to UTF-16 strings -* Windows specific method to avoid initialization issues -* and locking issues that are unique to Windows as API calls -* expect UTF-16 strings -* \param str[in] string to be converted -* \param length[in] length in characters of the string -* \returns UTF-16 string, empty string on failure -*/ -std::wstring ToW(const char* str, size_t length); - -/** -* Convert UTF-8 to UTF-16 strings -* Windows specific method to avoid initialization issues -* and locking issues that are unique to Windows as API calls -* expect UTF-16 strings -* \param str[in] string to be converted -* \returns UTF-16 string, empty string on failure -*/ -std::wstring ToW(const std::string& str); -} -#endif - -#endif diff --git a/lib/UnrarXLib/unpack.cpp b/lib/UnrarXLib/unpack.cpp deleted file mode 100644 index bc2f2206e1..0000000000 --- a/lib/UnrarXLib/unpack.cpp +++ /dev/null @@ -1,956 +0,0 @@ -#include "rar.hpp" - -#include "coder.cpp" -#include "suballoc.cpp" -#include "model.cpp" -#ifndef SFX_MODULE -#include "unpack15.cpp" -#include "unpack20.cpp" -#endif - -Unpack::Unpack(ComprDataIO *DataIO) -{ - UnpIO=DataIO; - Window=NULL; - ExternalWindow=false; - Suspended=false; - UnpAllBuf=false; - UnpSomeRead=false; -} - - -Unpack::~Unpack() -{ - if (Window!=NULL && !ExternalWindow) - delete[] Window; - InitFilters(); -} - - -void Unpack::Init(byte *Window) -{ - if (Window==NULL) - { - if (UnpIO->UnpackToMemorySize > -1) - Unpack::Window = new byte[MAXWINMEMSIZE]; - else - Unpack::Window=new byte[MAXWINSIZE]; -#ifndef ALLOW_EXCEPTIONS - if (Unpack::Window==NULL) - ErrHandler.MemoryError(); -#endif - } - else - { - Unpack::Window=Window; - ExternalWindow=true; - } - UnpInitData(false); -} - - -void Unpack::DoUnpack(int Method,bool Solid) -{ - switch(Method) - { -#ifndef SFX_MODULE - case 15: - Unpack15(Solid); - break; - case 20: - case 26: - Unpack20(Solid); - break; -#endif - case 29: - Unpack29(Solid); - break; - } -} - - -inline void Unpack::InsertOldDist(unsigned int Distance) -{ - OldDist[3]=OldDist[2]; - OldDist[2]=OldDist[1]; - OldDist[1]=OldDist[0]; - OldDist[0]=Distance; -} - - -inline void Unpack::InsertLastMatch(unsigned int Length,unsigned int Distance) -{ - LastDist=Distance; - LastLength=Length; -} - - -void Unpack::CopyString(unsigned int Length,unsigned int Distance) -{ - unsigned int DestPtr=UnpPtr-Distance; - if (DestPtr<MAXWINSIZE-260 && UnpPtr<MAXWINSIZE-260) - { - Window[UnpPtr++]=Window[DestPtr++]; - while (--Length>0) - Window[UnpPtr++]=Window[DestPtr++]; - } - else - while (Length--) - { - Window[UnpPtr]=Window[DestPtr++ & MAXWINMASK]; - UnpPtr=(UnpPtr+1) & MAXWINMASK; - } -} - - -int Unpack::DecodeNumber(struct Decode *Dec) -{ - unsigned int Bits; - unsigned int BitField=getbits() & 0xfffe; - if (BitField<Dec->DecodeLen[8]) - if (BitField<Dec->DecodeLen[4]) - if (BitField<Dec->DecodeLen[2]) - if (BitField<Dec->DecodeLen[1]) - Bits=1; - else - Bits=2; - else - if (BitField<Dec->DecodeLen[3]) - Bits=3; - else - Bits=4; - else - if (BitField<Dec->DecodeLen[6]) - if (BitField<Dec->DecodeLen[5]) - Bits=5; - else - Bits=6; - else - if (BitField<Dec->DecodeLen[7]) - Bits=7; - else - Bits=8; - else - if (BitField<Dec->DecodeLen[12]) - if (BitField<Dec->DecodeLen[10]) - if (BitField<Dec->DecodeLen[9]) - Bits=9; - else - Bits=10; - else - if (BitField<Dec->DecodeLen[11]) - Bits=11; - else - Bits=12; - else - if (BitField<Dec->DecodeLen[14]) - if (BitField<Dec->DecodeLen[13]) - Bits=13; - else - Bits=14; - else - Bits=15; - - addbits(Bits); - unsigned int N=Dec->DecodePos[Bits]+((BitField-Dec->DecodeLen[Bits-1])>>(16-Bits)); - if (N>=Dec->MaxNum) - N=0; - return(Dec->DecodeNum[N]); -} - - -void Unpack::Unpack29(bool Solid) -{ - static unsigned char LDecode[]={0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224}; - static unsigned char LBits[]= {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5}; - static int DDecode[DC]; - static byte DBits[DC]; - static unsigned int DBitLengthCounts[]= {4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,14,0,12}; - static unsigned char SDDecode[]={0,4,8,16,32,64,128,192}; - static unsigned char SDBits[]= {2,2,3, 4, 5, 6, 6, 6}; - unsigned int Bits; - - if (DDecode[1]==0) - { - int Dist=0,BitLength=0,Slot=0; - for (unsigned int I=0;I<sizeof(DBitLengthCounts)/sizeof(DBitLengthCounts[0]);I++,BitLength++) - for (unsigned int J=0;J<DBitLengthCounts[I];J++,Slot++,Dist+=(1<<BitLength)) - { - DDecode[Slot]=Dist; - DBits[Slot]=BitLength; - } - } - - FileExtracted=true; - - if (!Suspended) - { - UnpInitData(Solid); - if (!UnpReadBuf()) - return; - if (!TablesRead) - if (!ReadTables()) - return; -// if (!TablesRead && Solid) - // if (!ReadTables()) - // return; - //if ((!Solid || !TablesRead) && !ReadTables()) - // return; - } - - if (PPMError) - return; - - while (true) - { - if (UnpIO->bQuit) - { - FileExtracted=false; - return; - } - - UnpPtr&=MAXWINMASK; - - if (InAddr>ReadBorder) - { - if (!UnpReadBuf()) - break; - } - if (((WrPtr-UnpPtr) & MAXWINMASK)<260 && WrPtr!=UnpPtr) - { - UnpWriteBuf(); - if (WrittenFileSize>DestUnpSize) - return; - if (Suspended) - { - FileExtracted=false; - return; - } - } - if (UnpBlockType==BLOCK_PPM) - { - int Ch=PPM.DecodeChar(); - if (Ch==-1) - { - PPMError=true; - break; - } - if (Ch==PPMEscChar) - { - int NextCh=PPM.DecodeChar(); - if (NextCh==0) - { - if (!ReadTables()) - break; - continue; - } - if (NextCh==2 || NextCh==-1) - break; - if (NextCh==3) - { - if (!ReadVMCodePPM()) - break; - continue; - } - if (NextCh==4) - { - unsigned int Distance=0,Length=0; - bool Failed=false; - for (int I=0;I<4 && !Failed;I++) - { - int Ch=PPM.DecodeChar(); - if (Ch==-1) - Failed=true; - else - if (I==3) - Length=(byte)Ch; - else - Distance=(Distance<<8)+(byte)Ch; - } - if (Failed) - break; - CopyString(Length+32,Distance+2); - continue; - } - if (NextCh==5) - { - int Length=PPM.DecodeChar(); - if (Length==-1) - break; - CopyString(Length+4,1); - continue; - } - } - Window[UnpPtr++]=Ch; - continue; - } - - int Number=DecodeNumber((struct Decode *)&LD); - if (Number<256) - { - Window[UnpPtr++]=(byte)Number; - continue; - } - if (Number>=271) - { - int Length=LDecode[Number-=271]+3; - if ((Bits=LBits[Number])>0) - { - Length+=getbits()>>(16-Bits); - addbits(Bits); - } - - int DistNumber=DecodeNumber((struct Decode *)&DD); - unsigned int Distance=DDecode[DistNumber]+1; - if ((Bits=DBits[DistNumber])>0) - { - if (DistNumber>9) - { - if (Bits>4) - { - Distance+=((getbits()>>(20-Bits))<<4); - addbits(Bits-4); - } - if (LowDistRepCount>0) - { - LowDistRepCount--; - Distance+=PrevLowDist; - } - else - { - int LowDist=DecodeNumber((struct Decode *)&LDD); - if (LowDist==16) - { - LowDistRepCount=LOW_DIST_REP_COUNT-1; - Distance+=PrevLowDist; - } - else - { - Distance+=LowDist; - PrevLowDist=LowDist; - } - } - } - else - { - Distance+=getbits()>>(16-Bits); - addbits(Bits); - } - } - - if (Distance>=0x2000) - { - Length++; - if (Distance>=0x40000L) - Length++; - } - - InsertOldDist(Distance); - InsertLastMatch(Length,Distance); - CopyString(Length,Distance); - continue; - } - if (Number==256) - { - if (!ReadEndOfBlock()) - break; - continue; - } - if (Number==257) - { - if (!ReadVMCode()) - break; - continue; - } - if (Number==258) - { - if (LastLength!=0) - CopyString(LastLength,LastDist); - continue; - } - if (Number<263) - { - int DistNum=Number-259; - unsigned int Distance=OldDist[DistNum]; - for (int I=DistNum;I>0;I--) - OldDist[I]=OldDist[I-1]; - OldDist[0]=Distance; - - int LengthNumber=DecodeNumber((struct Decode *)&RD); - int Length=LDecode[LengthNumber]+2; - if ((Bits=LBits[LengthNumber])>0) - { - Length+=getbits()>>(16-Bits); - addbits(Bits); - } - InsertLastMatch(Length,Distance); - CopyString(Length,Distance); - continue; - } - if (Number<272) - { - unsigned int Distance=SDDecode[Number-=263]+1; - if ((Bits=SDBits[Number])>0) - { - Distance+=getbits()>>(16-Bits); - addbits(Bits); - } - InsertOldDist(Distance); - InsertLastMatch(2,Distance); - CopyString(2,Distance); - continue; - } - } - UnpWriteBuf(); - - if (UnpIO->UnpackToMemorySize > -1) - { - UnpIO->hBufferEmpty->Set(); - while (! UnpIO->hBufferFilled->WaitMSec(1)) - if (UnpIO->hQuit->WaitMSec(1)) - return; - } -} - -bool Unpack::ReadEndOfBlock() -{ - unsigned int BitField=getbits(); - bool NewTable,NewFile=false; - if (BitField & 0x8000) - { - NewTable=true; - addbits(1); - } - else - { - NewFile=true; - NewTable=(BitField & 0x4000); - addbits(2); - } - TablesRead=!NewTable; - return !(NewFile || (NewTable && !ReadTables())); -} - - -bool Unpack::ReadVMCode() -{ - unsigned int FirstByte=getbits()>>8; - addbits(8); - int Length=(FirstByte & 7)+1; - if (Length==7) - { - Length=(getbits()>>8)+7; - addbits(8); - } - else - if (Length==8) - { - Length=getbits(); - addbits(16); - } - Array<byte> VMCode(Length); - for (int I=0;I<Length;I++) - { - if (InAddr>=ReadTop-1 && !UnpReadBuf() && I<Length-1) - return(false); - VMCode[I]=getbits()>>8; - addbits(8); - } - return(AddVMCode(FirstByte,&VMCode[0],Length)); -} - - -bool Unpack::ReadVMCodePPM() -{ - unsigned int FirstByte=PPM.DecodeChar(); - if ((int)FirstByte==-1) - return(false); - int Length=(FirstByte & 7)+1; - if (Length==7) - { - int B1=PPM.DecodeChar(); - if (B1==-1) - return(false); - Length=B1+7; - } - else - if (Length==8) - { - int B1=PPM.DecodeChar(); - if (B1==-1) - return(false); - int B2=PPM.DecodeChar(); - if (B2==-1) - return(false); - Length=B1*256+B2; - } - Array<byte> VMCode(Length); - for (int I=0;I<Length;I++) - { - int Ch=PPM.DecodeChar(); - if (Ch==-1) - return(false); - VMCode[I]=Ch; - } - return(AddVMCode(FirstByte,&VMCode[0],Length)); -} - - -bool Unpack::AddVMCode(unsigned int FirstByte,byte *Code,int CodeSize) -{ - BitInput Inp; - Inp.InitBitInput(); - memcpy(Inp.InBuf,Code,Min(BitInput::MAX_SIZE,CodeSize)); - VM.Init(); - - int FiltPos; - if (FirstByte & 0x80) - { - FiltPos=RarVM::ReadData(Inp); - if (FiltPos==0) - InitFilters(); - else - FiltPos--; - } - else - FiltPos=LastFilter; - if (FiltPos>Filters.Size() || FiltPos>OldFilterLengths.Size()) - return(false); - LastFilter=FiltPos; - bool NewFilter=(FiltPos==Filters.Size()); - - UnpackFilter *Filter; - if (NewFilter) - { - Filters.Add(1); - Filters[Filters.Size()-1]=Filter=new UnpackFilter; - OldFilterLengths.Add(1); - Filter->ExecCount=0; - } - else - { - Filter=Filters[FiltPos]; - Filter->ExecCount++; - } - - UnpackFilter *StackFilter=new UnpackFilter; - - int EmptyCount=0; - for (int I=0;I<PrgStack.Size();I++) - { - PrgStack[I-EmptyCount]=PrgStack[I]; - if (PrgStack[I]==NULL) - EmptyCount++; - if (EmptyCount>0) - PrgStack[I]=NULL; - } - if (EmptyCount==0) - { - PrgStack.Add(1); - EmptyCount=1; - } - int StackPos=PrgStack.Size()-EmptyCount; - PrgStack[StackPos]=StackFilter; - StackFilter->ExecCount=Filter->ExecCount; - - uint BlockStart=RarVM::ReadData(Inp); - if (FirstByte & 0x40) - BlockStart+=258; - StackFilter->BlockStart=(BlockStart+UnpPtr)&MAXWINMASK; - if (FirstByte & 0x20) - StackFilter->BlockLength=RarVM::ReadData(Inp); - else - StackFilter->BlockLength=FiltPos<OldFilterLengths.Size() ? OldFilterLengths[FiltPos]:0; - StackFilter->NextWindow=WrPtr!=UnpPtr && ((WrPtr-UnpPtr)&MAXWINMASK)<=BlockStart; - -// DebugLog("\nNextWindow: UnpPtr=%08x WrPtr=%08x BlockStart=%08x",UnpPtr,WrPtr,BlockStart); - - OldFilterLengths[FiltPos]=StackFilter->BlockLength; - - memset(StackFilter->Prg.InitR,0,sizeof(StackFilter->Prg.InitR)); - StackFilter->Prg.InitR[3]=VM_GLOBALMEMADDR; - StackFilter->Prg.InitR[4]=StackFilter->BlockLength; - StackFilter->Prg.InitR[5]=StackFilter->ExecCount; - if (FirstByte & 0x10) - { - unsigned int InitMask=Inp.fgetbits()>>9; - Inp.faddbits(7); - for (int I=0;I<7;I++) - if (InitMask & (1<<I)) - StackFilter->Prg.InitR[I]=RarVM::ReadData(Inp); - } - if (NewFilter) - { - uint VMCodeSize=RarVM::ReadData(Inp); - if (VMCodeSize>=0x10000 || VMCodeSize==0) - return(false); - Array<byte> VMCode(VMCodeSize); - for (uint I=0;I<VMCodeSize;I++) - { - VMCode[I]=Inp.fgetbits()>>8; - Inp.faddbits(8); - } - VM.Prepare(&VMCode[0],VMCodeSize,&Filter->Prg); - } - StackFilter->Prg.AltCmd=&Filter->Prg.Cmd[0]; - StackFilter->Prg.CmdCount=Filter->Prg.CmdCount; - - int StaticDataSize=Filter->Prg.StaticData.Size(); - if (StaticDataSize>0 && StaticDataSize<VM_GLOBALMEMSIZE) - { - StackFilter->Prg.StaticData.Add(StaticDataSize); - memcpy(&StackFilter->Prg.StaticData[0],&Filter->Prg.StaticData[0],StaticDataSize); - } - - if (StackFilter->Prg.GlobalData.Size()<VM_FIXEDGLOBALSIZE) - { - StackFilter->Prg.GlobalData.Reset(); - StackFilter->Prg.GlobalData.Add(VM_FIXEDGLOBALSIZE); - } - byte *GlobalData=&StackFilter->Prg.GlobalData[0]; - for (int I=0;I<7;I++) - VM.SetValue((uint *)&GlobalData[I*4],StackFilter->Prg.InitR[I]); - VM.SetValue((uint *)&GlobalData[0x1c],StackFilter->BlockLength); - VM.SetValue((uint *)&GlobalData[0x20],0); - VM.SetValue((uint *)&GlobalData[0x2c],StackFilter->ExecCount); - memset(&GlobalData[0x30],0,16); - - if (FirstByte & 8) - { - uint DataSize=RarVM::ReadData(Inp); - if (DataSize>=0x10000) - return(false); - unsigned int CurSize=StackFilter->Prg.GlobalData.Size(); - if (CurSize<DataSize+VM_FIXEDGLOBALSIZE) - StackFilter->Prg.GlobalData.Add(DataSize+VM_FIXEDGLOBALSIZE-CurSize); - byte *GlobalData=&StackFilter->Prg.GlobalData[VM_FIXEDGLOBALSIZE]; - for (uint I=0;I<DataSize;I++) - { - GlobalData[I]=Inp.fgetbits()>>8; - Inp.faddbits(8); - } - } - return(true); -} - - -bool Unpack::UnpReadBuf() -{ - int DataSize=ReadTop-InAddr; - if (DataSize<0) - return(false); - if (InAddr>BitInput::MAX_SIZE/2) - { - if (DataSize>0) - memmove(InBuf,InBuf+InAddr,DataSize); - InAddr=0; - ReadTop=DataSize; - } - else - DataSize=ReadTop; - int ReadCode=UnpIO->UnpRead(InBuf+DataSize,(BitInput::MAX_SIZE-DataSize)&~0xf); - if (ReadCode>0) - ReadTop+=ReadCode; - ReadBorder=ReadTop-30; - return(ReadCode!=-1); -} - - -void Unpack::UnpWriteBuf() -{ - unsigned int WrittenBorder=WrPtr; - unsigned int WriteSize=(UnpPtr-WrittenBorder)&MAXWINMASK; - for (int I=0;I<PrgStack.Size();I++) - { - UnpackFilter *flt=PrgStack[I]; - if (flt==NULL) - continue; - if (flt->NextWindow) - { - flt->NextWindow=false; - continue; - } - unsigned int BlockStart=flt->BlockStart; - unsigned int BlockLength=flt->BlockLength; - if (((BlockStart-WrittenBorder)&MAXWINMASK)<WriteSize) - { - if (WrittenBorder!=BlockStart) - { - UnpWriteArea(WrittenBorder,BlockStart); - WrittenBorder=BlockStart; - WriteSize=(UnpPtr-WrittenBorder)&MAXWINMASK; - } - if (BlockLength<=WriteSize) - { - unsigned int BlockEnd=(BlockStart+BlockLength)&MAXWINMASK; - if (BlockStart<BlockEnd || BlockEnd==0) - VM.SetMemory(0,Window+BlockStart,BlockLength); - else - { - unsigned int FirstPartLength=MAXWINSIZE-BlockStart; - VM.SetMemory(0,Window+BlockStart,FirstPartLength); - VM.SetMemory(FirstPartLength,Window,BlockEnd); - } - VM_PreparedProgram *Prg=&flt->Prg; - ExecuteCode(Prg); - - byte *FilteredData=Prg->FilteredData; - unsigned int FilteredDataSize=Prg->FilteredDataSize; - - delete PrgStack[I]; - PrgStack[I]=NULL; - while (I+1<PrgStack.Size()) - { - UnpackFilter *NextFilter=PrgStack[I+1]; - if (NextFilter==NULL || NextFilter->BlockStart!=BlockStart || - NextFilter->BlockLength!=FilteredDataSize || NextFilter->NextWindow) - break; - VM.SetMemory(0,FilteredData,FilteredDataSize); - VM_PreparedProgram *NextPrg=&PrgStack[I+1]->Prg; - ExecuteCode(NextPrg); - FilteredData=NextPrg->FilteredData; - FilteredDataSize=NextPrg->FilteredDataSize; - I++; - delete PrgStack[I]; - PrgStack[I]=NULL; - } - UnpIO->UnpWrite(FilteredData,FilteredDataSize); - UnpSomeRead=true; - WrittenFileSize+=FilteredDataSize; - WrittenBorder=BlockEnd; - WriteSize=(UnpPtr-WrittenBorder)&MAXWINMASK; - } - else - { - for (int J=I;J<PrgStack.Size();J++) - { - UnpackFilter *flt=PrgStack[J]; - if (flt!=NULL && flt->NextWindow) - flt->NextWindow=false; - } - WrPtr=WrittenBorder; - return; - } - } - } - - UnpWriteArea(WrittenBorder,UnpPtr); - WrPtr=UnpPtr; -} - - -void Unpack::ExecuteCode(VM_PreparedProgram *Prg) -{ - if (Prg->GlobalData.Size()>0) - { - Prg->InitR[6]=int64to32(WrittenFileSize); - VM.SetValue((uint *)&Prg->GlobalData[0x24],int64to32(WrittenFileSize)); - VM.SetValue((uint *)&Prg->GlobalData[0x28],int64to32(WrittenFileSize>>32)); - VM.Execute(Prg); - } -} - - -void Unpack::UnpWriteArea(unsigned int StartPtr,unsigned int EndPtr) -{ - if (EndPtr!=StartPtr) - UnpSomeRead=true; - if (EndPtr<StartPtr) - { - UnpWriteData(&Window[StartPtr],-StartPtr & MAXWINMASK); - UnpWriteData(Window,EndPtr); - UnpAllBuf=true; - } - else - UnpWriteData(&Window[StartPtr],EndPtr-StartPtr); -} - - -void Unpack::UnpWriteData(byte *Data,int Size) -{ - if (WrittenFileSize>=DestUnpSize) - return; - int WriteSize=Size; - Int64 LeftToWrite=DestUnpSize-WrittenFileSize; - if (WriteSize>LeftToWrite) - WriteSize=int64to32(LeftToWrite); - UnpIO->UnpWrite(Data,WriteSize); - WrittenFileSize+=Size; -} - - -bool Unpack::ReadTables() -{ - byte BitLength[BC]; - unsigned char Table[HUFF_TABLE_SIZE]; - if (InAddr>ReadTop-25) - if (!UnpReadBuf()) - return(false); - faddbits((8-InBit)&7); - unsigned int BitField=fgetbits(); - if (BitField & 0x8000) - { - UnpBlockType=BLOCK_PPM; - return(PPM.DecodeInit(this,PPMEscChar)); - } - UnpBlockType=BLOCK_LZ; - - PrevLowDist=0; - LowDistRepCount=0; - - if (!(BitField & 0x4000)) - memset(UnpOldTable,0,sizeof(UnpOldTable)); - faddbits(2); - - for (uint I=0;I<BC;I++) - { - int Length=(byte)(fgetbits() >> 12); - faddbits(4); - if (Length==15) - { - int ZeroCount=(byte)(fgetbits() >> 12); - faddbits(4); - if (ZeroCount==0) - BitLength[I]=15; - else - { - ZeroCount+=2; - while (ZeroCount-- > 0 && I<sizeof(BitLength)/sizeof(BitLength[0])) - BitLength[I++]=0; - I--; - } - } - else - BitLength[I]=Length; - } - MakeDecodeTables(BitLength,(struct Decode *)&BD,BC); - - const int TableSize=HUFF_TABLE_SIZE; - for (int I=0;I<TableSize;) - { - if (InAddr>ReadTop-5) - if (!UnpReadBuf()) - return(false); - int Number=DecodeNumber((struct Decode *)&BD); - if (Number<16) - { - Table[I]=(Number+UnpOldTable[I]) & 0xf; - I++; - } - else - if (Number<18) - { - int N; - if (Number==16) - { - N=(fgetbits() >> 13)+3; - faddbits(3); - } - else - { - N=(fgetbits() >> 9)+11; - faddbits(7); - } - while (N-- > 0 && I<TableSize) - { - Table[I]=Table[I-1]; - I++; - } - } - else - { - int N; - if (Number==18) - { - N=(fgetbits() >> 13)+3; - faddbits(3); - } - else - { - N=(fgetbits() >> 9)+11; - faddbits(7); - } - while (N-- > 0 && I<TableSize) - Table[I++]=0; - } - } - TablesRead=true; - if (InAddr>ReadTop) - return(false); - MakeDecodeTables(&Table[0],(struct Decode *)&LD,NC); - MakeDecodeTables(&Table[NC],(struct Decode *)&DD,DC); - MakeDecodeTables(&Table[NC+DC],(struct Decode *)&LDD,LDC); - MakeDecodeTables(&Table[NC+DC+LDC],(struct Decode *)&RD,RC); - memcpy(UnpOldTable,Table,sizeof(UnpOldTable)); - return(true); -} - - -void Unpack::UnpInitData(int Solid) -{ - if (!Solid) - { - TablesRead=false; - memset(OldDist,0,sizeof(OldDist)); - OldDistPtr=0; - LastDist=LastLength=0; - if (UnpIO->UnpackToMemorySize > -1) - memset(Window,0,MAXWINMEMSIZE); - else - memset(Window,0,MAXWINSIZE); - memset(UnpOldTable,0,sizeof(UnpOldTable)); - UnpPtr=WrPtr=0; - PPMEscChar=2; - - InitFilters(); - } - InitBitInput(); - PPMError=false; - WrittenFileSize=0; - ReadTop=0; - ReadBorder=0; -#ifndef SFX_MODULE - UnpInitData20(Solid); -#endif -} - - -void Unpack::InitFilters() -{ - OldFilterLengths.Reset(); - LastFilter=0; - - for (int I=0;I<Filters.Size();I++) - delete Filters[I]; - Filters.Reset(); - for (int I=0;I<PrgStack.Size();I++) - delete PrgStack[I]; - PrgStack.Reset(); -} - - -void Unpack::MakeDecodeTables(unsigned char *LenTab,struct Decode *Dec,int Size) -{ - int LenCount[16],TmpPos[16],I; - long M,N; - memset(LenCount,0,sizeof(LenCount)); - memset(Dec->DecodeNum,0,Size*sizeof(*Dec->DecodeNum)); - for (I=0;I<Size;I++) - LenCount[LenTab[I] & 0xF]++; - - LenCount[0]=0; - for (TmpPos[0]=Dec->DecodePos[0]=Dec->DecodeLen[0]=0,N=0,I=1;I<16;I++) - { - N=2*(N+LenCount[I]); - M=N<<(15-I); - if (M>0xFFFF) - M=0xFFFF; - Dec->DecodeLen[I]=(unsigned int)M; - TmpPos[I]=Dec->DecodePos[I]=Dec->DecodePos[I-1]+LenCount[I-1]; - } - - for (I=0;I<Size;I++) - if (LenTab[I]!=0) - Dec->DecodeNum[TmpPos[LenTab[I] & 0xF]++]=I; - Dec->MaxNum=Size; -} diff --git a/lib/UnrarXLib/unpack.hpp b/lib/UnrarXLib/unpack.hpp deleted file mode 100644 index 83fb0f0254..0000000000 --- a/lib/UnrarXLib/unpack.hpp +++ /dev/null @@ -1,205 +0,0 @@ -#ifndef _RAR_UNPACK_ -#define _RAR_UNPACK_ - -enum BLOCK_TYPES {BLOCK_LZ,BLOCK_PPM}; - -struct Decode -{ - unsigned int MaxNum; - unsigned int DecodeLen[16]; - unsigned int DecodePos[16]; - unsigned int DecodeNum[2]; -}; - -struct LitDecode -{ - unsigned int MaxNum; - unsigned int DecodeLen[16]; - unsigned int DecodePos[16]; - unsigned int DecodeNum[NC]; -}; - -struct DistDecode -{ - unsigned int MaxNum; - unsigned int DecodeLen[16]; - unsigned int DecodePos[16]; - unsigned int DecodeNum[DC]; -}; - -struct LowDistDecode -{ - unsigned int MaxNum; - unsigned int DecodeLen[16]; - unsigned int DecodePos[16]; - unsigned int DecodeNum[LDC]; -}; - -struct RepDecode -{ - unsigned int MaxNum; - unsigned int DecodeLen[16]; - unsigned int DecodePos[16]; - unsigned int DecodeNum[RC]; -}; - -struct BitDecode -{ - unsigned int MaxNum; - unsigned int DecodeLen[16]; - unsigned int DecodePos[16]; - unsigned int DecodeNum[BC]; -}; - -struct UnpackFilter -{ - unsigned int BlockStart; - unsigned int BlockLength; - unsigned int ExecCount; - bool NextWindow; - VM_PreparedProgram Prg; -}; - -/***************************** Unpack v 2.0 *********************************/ -struct MultDecode -{ - unsigned int MaxNum; - unsigned int DecodeLen[16]; - unsigned int DecodePos[16]; - unsigned int DecodeNum[MC20]; -}; - -struct AudioVariables -{ - int K1,K2,K3,K4,K5; - int D1,D2,D3,D4; - int LastDelta; - unsigned int Dif[11]; - unsigned int ByteCount; - int LastChar; -}; -/***************************** Unpack v 2.0 *********************************/ - - -class Unpack:private BitInput -{ - private: - friend class Pack; - - void Unpack29(bool Solid); - bool UnpReadBuf(); - void UnpWriteBuf(); - void ExecuteCode(VM_PreparedProgram *Prg); - void UnpWriteArea(unsigned int StartPtr,unsigned int EndPtr); - void UnpWriteData(byte *Data,int Size); - bool ReadTables(); - void MakeDecodeTables(unsigned char *LenTab,struct Decode *Dec,int Size); - int DecodeNumber(struct Decode *Dec); - void CopyString(); - inline void InsertOldDist(unsigned int Distance); - inline void InsertLastMatch(unsigned int Length,unsigned int Distance); - void UnpInitData(int Solid); - void CopyString(unsigned int Length,unsigned int Distance); - bool ReadEndOfBlock(); - bool ReadVMCode(); - bool ReadVMCodePPM(); - bool AddVMCode(unsigned int FirstByte,byte *Code,int CodeSize); - void InitFilters(); - - ComprDataIO *UnpIO; - ModelPPM PPM; - int PPMEscChar; - - RarVM VM; - Array<UnpackFilter*> Filters; - Array<UnpackFilter*> PrgStack; - Array<int> OldFilterLengths; - int LastFilter; - - bool TablesRead; - struct LitDecode LD; - struct DistDecode DD; - struct LowDistDecode LDD; - struct RepDecode RD; - struct BitDecode BD; - - unsigned int OldDist[4],OldDistPtr; - unsigned int LastDist,LastLength; - - unsigned int UnpPtr,WrPtr; - - int ReadTop; - int ReadBorder; - - unsigned char UnpOldTable[HUFF_TABLE_SIZE]; - - int UnpBlockType; - - byte *Window; - bool ExternalWindow; - - - Int64 DestUnpSize; - - bool Suspended; - bool UnpAllBuf; - bool UnpSomeRead; - Int64 WrittenFileSize; - bool FileExtracted; - bool PPMError; - - int PrevLowDist,LowDistRepCount; - -/***************************** Unpack v 1.5 *********************************/ - void Unpack15(bool Solid); - void ShortLZ(); - void LongLZ(); - void HuffDecode(); - void GetFlagsBuf(); - void OldUnpInitData(int Solid); - void InitHuff(); - void CorrHuff(unsigned int *CharSet,unsigned int *NumToPlace); - void OldCopyString(unsigned int Distance,unsigned int Length); - unsigned int DecodeNum(int Num,unsigned int StartPos, - unsigned int *DecTab,unsigned int *PosTab); - void OldUnpWriteBuf(); - - unsigned int ChSet[256],ChSetA[256],ChSetB[256],ChSetC[256]; - unsigned int Place[256],PlaceA[256],PlaceB[256],PlaceC[256]; - unsigned int NToPl[256],NToPlB[256],NToPlC[256]; - unsigned int FlagBuf,AvrPlc,AvrPlcB,AvrLn1,AvrLn2,AvrLn3; - int Buf60,NumHuf,StMode,LCount,FlagsCnt; - unsigned int Nhfb,Nlzb,MaxDist3; -/***************************** Unpack v 1.5 *********************************/ - -/***************************** Unpack v 2.0 *********************************/ - void Unpack20(bool Solid); - struct MultDecode MD[4]; - unsigned char UnpOldTable20[MC20*4]; - int UnpAudioBlock,UnpChannels,UnpCurChannel,UnpChannelDelta; - void CopyString20(unsigned int Length,unsigned int Distance); - bool ReadTables20(); - void UnpInitData20(int Solid); - void ReadLastTables(); - byte DecodeAudio(int Delta); - struct AudioVariables AudV[4]; -/***************************** Unpack v 2.0 *********************************/ - - public: - Unpack(ComprDataIO *DataIO); - ~Unpack(); - void Init(byte *Window=NULL); - void DoUnpack(int Method,bool Solid); - bool IsFileExtracted() {return(FileExtracted);} - void SetDestSize(Int64 DestSize) {DestUnpSize=DestSize;FileExtracted=false;} - void SetSuspended(bool Suspended) {Unpack::Suspended=Suspended;} - - unsigned int GetChar() - { - if (InAddr>BitInput::MAX_SIZE-30) - UnpReadBuf(); - return(InBuf[InAddr++]); - } -}; - -#endif diff --git a/lib/UnrarXLib/unpack15.cpp b/lib/UnrarXLib/unpack15.cpp deleted file mode 100644 index 725e2bea75..0000000000 --- a/lib/UnrarXLib/unpack15.cpp +++ /dev/null @@ -1,507 +0,0 @@ -#define STARTL1 2 -static unsigned int DecL1[]={0x8000,0xa000,0xc000,0xd000,0xe000,0xea00, - 0xee00,0xf000,0xf200,0xf200,0xffff}; -static unsigned int PosL1[]={0,0,0,2,3,5,7,11,16,20,24,32,32}; - -#define STARTL2 3 -static unsigned int DecL2[]={0xa000,0xc000,0xd000,0xe000,0xea00,0xee00, - 0xf000,0xf200,0xf240,0xffff}; -static unsigned int PosL2[]={0,0,0,0,5,7,9,13,18,22,26,34,36}; - -#define STARTHF0 4 -static unsigned int DecHf0[]={0x8000,0xc000,0xe000,0xf200,0xf200,0xf200, - 0xf200,0xf200,0xffff}; -static unsigned int PosHf0[]={0,0,0,0,0,8,16,24,33,33,33,33,33}; - - -#define STARTHF1 5 -static unsigned int DecHf1[]={0x2000,0xc000,0xe000,0xf000,0xf200,0xf200, - 0xf7e0,0xffff}; -static unsigned int PosHf1[]={0,0,0,0,0,0,4,44,60,76,80,80,127}; - - -#define STARTHF2 5 -static unsigned int DecHf2[]={0x1000,0x2400,0x8000,0xc000,0xfa00,0xffff, - 0xffff,0xffff}; -static unsigned int PosHf2[]={0,0,0,0,0,0,2,7,53,117,233,0,0}; - - -#define STARTHF3 6 -static unsigned int DecHf3[]={0x800,0x2400,0xee00,0xfe80,0xffff,0xffff, - 0xffff}; -static unsigned int PosHf3[]={0,0,0,0,0,0,0,2,16,218,251,0,0}; - - -#define STARTHF4 8 -static unsigned int DecHf4[]={0xff00,0xffff,0xffff,0xffff,0xffff,0xffff}; -static unsigned int PosHf4[]={0,0,0,0,0,0,0,0,0,255,0,0,0}; - - -void Unpack::Unpack15(bool Solid) -{ - if (Suspended) - UnpPtr=WrPtr; - else - { - UnpInitData(Solid); - OldUnpInitData(Solid); - UnpReadBuf(); - if (!Solid) - { - InitHuff(); - UnpPtr=0; - } - else - UnpPtr=WrPtr; - --DestUnpSize; - } - if (DestUnpSize>=0) - { - GetFlagsBuf(); - FlagsCnt=8; - } - - while (DestUnpSize>=0) - { - if (UnpIO->hQuit->WaitMSec(1)) - return; - - UnpPtr&=MAXWINMASK; - - if (InAddr>ReadTop-30 && !UnpReadBuf()) - break; - if (((WrPtr-UnpPtr) & MAXWINMASK)<270 && WrPtr!=UnpPtr) - { - OldUnpWriteBuf(); - if (Suspended) - return; - } - if (StMode) - { - HuffDecode(); - continue; - } - - if (--FlagsCnt < 0) - { - GetFlagsBuf(); - FlagsCnt=7; - } - - if (FlagBuf & 0x80) - { - FlagBuf<<=1; - if (Nlzb > Nhfb) - LongLZ(); - else - HuffDecode(); - } - else - { - FlagBuf<<=1; - if (--FlagsCnt < 0) - { - GetFlagsBuf(); - FlagsCnt=7; - } - if (FlagBuf & 0x80) - { - FlagBuf<<=1; - if (Nlzb > Nhfb) - HuffDecode(); - else - LongLZ(); - } - else - { - FlagBuf<<=1; - ShortLZ(); - } - } - } - OldUnpWriteBuf(); -} - - -void Unpack::OldUnpWriteBuf() -{ - if (UnpPtr!=WrPtr) - UnpSomeRead=true; - if (UnpPtr<WrPtr) - { - UnpIO->UnpWrite(&Window[WrPtr],-WrPtr & MAXWINMASK); - UnpIO->UnpWrite(Window,UnpPtr); - UnpAllBuf=true; - } - else - UnpIO->UnpWrite(&Window[WrPtr],UnpPtr-WrPtr); - WrPtr=UnpPtr; -} - - -void Unpack::ShortLZ() -{ - static unsigned int ShortLen1[]={1,3,4,4,5,6,7,8,8,4,4,5,6,6,4,0}; - static unsigned int ShortXor1[]={0,0xa0,0xd0,0xe0,0xf0,0xf8,0xfc,0xfe, - 0xff,0xc0,0x80,0x90,0x98,0x9c,0xb0}; - static unsigned int ShortLen2[]={2,3,3,3,4,4,5,6,6,4,4,5,6,6,4,0}; - static unsigned int ShortXor2[]={0,0x40,0x60,0xa0,0xd0,0xe0,0xf0,0xf8, - 0xfc,0xc0,0x80,0x90,0x98,0x9c,0xb0}; - - - unsigned int Length,SaveLength; - unsigned int LastDistance; - unsigned int Distance; - int DistancePlace; - NumHuf=0; - - unsigned int BitField=fgetbits(); - if (LCount==2) - { - faddbits(1); - if (BitField >= 0x8000) - { - OldCopyString((unsigned int)LastDist,LastLength); - return; - } - BitField <<= 1; - LCount=0; - } - - BitField>>=8; - - ShortLen1[1]=ShortLen2[3]=Buf60+3; - - if (AvrLn1<37) - { - for (Length=0;;Length++) - if (((BitField^ShortXor1[Length]) & (~(0xff>>ShortLen1[Length])))==0) - break; - faddbits(ShortLen1[Length]); - } - else - { - for (Length=0;;Length++) - if (((BitField^ShortXor2[Length]) & (~(0xff>>ShortLen2[Length])))==0) - break; - faddbits(ShortLen2[Length]); - } - - if (Length >= 9) - { - if (Length == 9) - { - LCount++; - OldCopyString((unsigned int)LastDist,LastLength); - return; - } - if (Length == 14) - { - LCount=0; - Length=DecodeNum(fgetbits(),STARTL2,DecL2,PosL2)+5; - Distance=(fgetbits()>>1) | 0x8000; - faddbits(15); - LastLength=Length; - LastDist=Distance; - OldCopyString(Distance,Length); - return; - } - - LCount=0; - SaveLength=Length; - Distance=OldDist[(OldDistPtr-(Length-9)) & 3]; - Length=DecodeNum(fgetbits(),STARTL1,DecL1,PosL1)+2; - if (Length==0x101 && SaveLength==10) - { - Buf60 ^= 1; - return; - } - if (Distance > 256) - Length++; - if (Distance >= MaxDist3) - Length++; - - OldDist[OldDistPtr++]=Distance; - OldDistPtr = OldDistPtr & 3; - LastLength=Length; - LastDist=Distance; - OldCopyString(Distance,Length); - return; - } - - LCount=0; - AvrLn1 += Length; - AvrLn1 -= AvrLn1 >> 4; - - DistancePlace=DecodeNum(fgetbits(),STARTHF2,DecHf2,PosHf2) & 0xff; - Distance=ChSetA[DistancePlace]; - if (--DistancePlace != -1) - { - PlaceA[Distance]--; - LastDistance=ChSetA[DistancePlace]; - PlaceA[LastDistance]++; - ChSetA[DistancePlace+1]=LastDistance; - ChSetA[DistancePlace]=Distance; - } - Length+=2; - OldDist[OldDistPtr++] = ++Distance; - OldDistPtr = OldDistPtr & 3; - LastLength=Length; - LastDist=Distance; - OldCopyString(Distance,Length); -} - - -void Unpack::LongLZ() -{ - unsigned int Length; - unsigned int Distance; - unsigned int DistancePlace,NewDistancePlace; - unsigned int OldAvr2,OldAvr3; - - NumHuf=0; - Nlzb+=16; - if (Nlzb > 0xff) - { - Nlzb=0x90; - Nhfb >>= 1; - } - OldAvr2=AvrLn2; - - unsigned int BitField=fgetbits(); - if (AvrLn2 >= 122) - Length=DecodeNum(BitField,STARTL2,DecL2,PosL2); - else - if (AvrLn2 >= 64) - Length=DecodeNum(BitField,STARTL1,DecL1,PosL1); - else - if (BitField < 0x100) - { - Length=BitField; - faddbits(16); - } - else - { - for (Length=0;((BitField<<Length)&0x8000)==0;Length++) - ; - faddbits(Length+1); - } - - AvrLn2 += Length; - AvrLn2 -= AvrLn2 >> 5; - - BitField=fgetbits(); - if (AvrPlcB > 0x28ff) - DistancePlace=DecodeNum(BitField,STARTHF2,DecHf2,PosHf2); - else if (AvrPlcB > 0x6ff) - DistancePlace=DecodeNum(BitField,STARTHF1,DecHf1,PosHf1); - else - DistancePlace=DecodeNum(BitField,STARTHF0,DecHf0,PosHf0); - - AvrPlcB += DistancePlace; - AvrPlcB -= AvrPlcB >> 8; - while (1) - { - Distance = ChSetB[DistancePlace & 0xff]; - NewDistancePlace = NToPlB[Distance++ & 0xff]++; - if (!(Distance & 0xff)) - CorrHuff(ChSetB,NToPlB); - else - break; - } - - ChSetB[DistancePlace]=ChSetB[NewDistancePlace]; - ChSetB[NewDistancePlace]=Distance; - - Distance=((Distance & 0xff00) | (fgetbits() >> 8)) >> 1; - faddbits(7); - - OldAvr3=AvrLn3; - if (Length!=1 && Length!=4) - { - if (Length==0 && Distance <= MaxDist3) - { - AvrLn3++; - AvrLn3 -= AvrLn3 >> 8; - } - else if (AvrLn3 > 0) - AvrLn3--; - } - Length+=3; - if (Distance >= MaxDist3) - Length++; - if (Distance <= 256) - Length+=8; - if (OldAvr3 > 0xb0 || (AvrPlc >= 0x2a00 && OldAvr2 < 0x40)) - MaxDist3=0x7f00; - else - MaxDist3=0x2001; - OldDist[OldDistPtr++]=Distance; - OldDistPtr = OldDistPtr & 3; - LastLength=Length; - LastDist=Distance; - OldCopyString(Distance,Length); -} - - -void Unpack::HuffDecode() -{ - unsigned int CurByte,NewBytePlace; - unsigned int Length; - unsigned int Distance; - int BytePlace; - - unsigned int BitField=fgetbits(); - - if (AvrPlc > 0x75ff) - BytePlace=DecodeNum(BitField,STARTHF4,DecHf4,PosHf4); - else if (AvrPlc > 0x5dff) - BytePlace=DecodeNum(BitField,STARTHF3,DecHf3,PosHf3); - else if (AvrPlc > 0x35ff) - BytePlace=DecodeNum(BitField,STARTHF2,DecHf2,PosHf2); - else if (AvrPlc > 0x0dff) - BytePlace=DecodeNum(BitField,STARTHF1,DecHf1,PosHf1); - else - BytePlace=DecodeNum(BitField,STARTHF0,DecHf0,PosHf0); - BytePlace&=0xff; - if (StMode) - { - if (BytePlace==0 && BitField > 0xfff) - BytePlace=0x100; - if (--BytePlace==-1) - { - BitField=fgetbits(); - faddbits(1); - if (BitField & 0x8000) - { - NumHuf=StMode=0; - return; - } - else - { - Length = (BitField & 0x4000) ? 4 : 3; - faddbits(1); - Distance=DecodeNum(fgetbits(),STARTHF2,DecHf2,PosHf2); - Distance = (Distance << 5) | (fgetbits() >> 11); - faddbits(5); - OldCopyString(Distance,Length); - return; - } - } - } - else - if (NumHuf++ >= 16 && FlagsCnt==0) - StMode=1; - AvrPlc += BytePlace; - AvrPlc -= AvrPlc >> 8; - Nhfb+=16; - if (Nhfb > 0xff) - { - Nhfb=0x90; - Nlzb >>= 1; - } - - Window[UnpPtr++]=(byte)(ChSet[BytePlace]>>8); - --DestUnpSize; - - while (1) - { - CurByte=ChSet[BytePlace]; - NewBytePlace=NToPl[CurByte++ & 0xff]++; - if ((CurByte & 0xff) > 0xa1) - CorrHuff(ChSet,NToPl); - else - break; - } - - ChSet[BytePlace]=ChSet[NewBytePlace]; - ChSet[NewBytePlace]=CurByte; -} - - -void Unpack::GetFlagsBuf() -{ - unsigned int Flags,NewFlagsPlace; - unsigned int FlagsPlace=DecodeNum(fgetbits(),STARTHF2,DecHf2,PosHf2); - - while (1) - { - Flags=ChSetC[FlagsPlace]; - FlagBuf=Flags>>8; - NewFlagsPlace=NToPlC[Flags++ & 0xff]++; - if ((Flags & 0xff) != 0) - break; - CorrHuff(ChSetC,NToPlC); - } - - ChSetC[FlagsPlace]=ChSetC[NewFlagsPlace]; - ChSetC[NewFlagsPlace]=Flags; -} - - -void Unpack::OldUnpInitData(int Solid) -{ - if (!Solid) - { - AvrPlcB=AvrLn1=AvrLn2=AvrLn3=NumHuf=Buf60=0; - AvrPlc=0x3500; - MaxDist3=0x2001; - Nhfb=Nlzb=0x80; - } - FlagsCnt=0; - FlagBuf=0; - StMode=0; - LCount=0; - ReadTop=0; -} - - -void Unpack::InitHuff() -{ - for (unsigned int I=0;I<256;I++) - { - Place[I]=PlaceA[I]=PlaceB[I]=I; - PlaceC[I]=(~I+1) & 0xff; - ChSet[I]=ChSetB[I]=I<<8; - ChSetA[I]=I; - ChSetC[I]=((~I+1) & 0xff)<<8; - } - memset(NToPl,0,sizeof(NToPl)); - memset(NToPlB,0,sizeof(NToPlB)); - memset(NToPlC,0,sizeof(NToPlC)); - CorrHuff(ChSetB,NToPlB); -} - - -void Unpack::CorrHuff(unsigned int *CharSet,unsigned int *NumToPlace) -{ - int I,J; - for (I=7;I>=0;I--) - for (J=0;J<32;J++,CharSet++) - *CharSet=(*CharSet & ~0xff) | I; - memset(NumToPlace,0,sizeof(NToPl)); - for (I=6;I>=0;I--) - NumToPlace[I]=(7-I)*32; -} - - -void Unpack::OldCopyString(unsigned int Distance,unsigned int Length) -{ - DestUnpSize-=Length; - while (Length--) - { - Window[UnpPtr]=Window[(UnpPtr-Distance) & MAXWINMASK]; - UnpPtr=(UnpPtr+1) & MAXWINMASK; - } -} - - -unsigned int Unpack::DecodeNum(int Num,unsigned int StartPos, - unsigned int *DecTab,unsigned int *PosTab) -{ - int I; - for (Num&=0xfff0,I=0;(int)DecTab[I]<=Num;I++) - StartPos++; - faddbits(StartPos); - return(((Num-(I ? DecTab[I-1]:0))>>(16-StartPos))+PosTab[StartPos]); -} diff --git a/lib/UnrarXLib/unpack20.cpp b/lib/UnrarXLib/unpack20.cpp deleted file mode 100644 index 135a86502a..0000000000 --- a/lib/UnrarXLib/unpack20.cpp +++ /dev/null @@ -1,371 +0,0 @@ -#include "rar.hpp" - -void Unpack::CopyString20(unsigned int Length,unsigned int Distance) -{ - LastDist=OldDist[OldDistPtr++ & 3]=Distance; - LastLength=Length; - DestUnpSize-=Length; - - unsigned int DestPtr=UnpPtr-Distance; - if (DestPtr<MAXWINSIZE-300 && UnpPtr<MAXWINSIZE-300) - { - Window[UnpPtr++]=Window[DestPtr++]; - Window[UnpPtr++]=Window[DestPtr++]; - while (Length>2) - { - Length--; - Window[UnpPtr++]=Window[DestPtr++]; - } - } - else - while (Length--) - { - Window[UnpPtr]=Window[DestPtr++ & MAXWINMASK]; - UnpPtr=(UnpPtr+1) & MAXWINMASK; - } -} - - -void Unpack::Unpack20(bool Solid) -{ - static unsigned char LDecode[]={0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224}; - static unsigned char LBits[]= {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5}; - static int DDecode[]={0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096,6144,8192,12288,16384,24576,32768U,49152U,65536,98304,131072,196608,262144,327680,393216,458752,524288,589824,655360,720896,786432,851968,917504,983040}; - static unsigned char DBits[]= {0,0,0,0,1,1,2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}; - static unsigned char SDDecode[]={0,4,8,16,32,64,128,192}; - static unsigned char SDBits[]= {2,2,3, 4, 5, 6, 6, 6}; - unsigned int Bits; - - if (Suspended) - UnpPtr=WrPtr; - else - { - UnpInitData(Solid); - if (!UnpReadBuf()) - return; - if (!Solid) - if (!ReadTables20()) - return; - --DestUnpSize; - } - - while (is64plus(DestUnpSize)) - { - if (UnpIO->bQuit) return; - - UnpPtr&=MAXWINMASK; - - if (InAddr>ReadTop-30) - if (!UnpReadBuf()) - break; - if (((WrPtr-UnpPtr) & MAXWINMASK)<270 && WrPtr!=UnpPtr) - { - OldUnpWriteBuf(); - if (Suspended) - return; - } - if (UnpAudioBlock) - { - int AudioNumber=DecodeNumber((struct Decode *)&MD[UnpCurChannel]); - - if (AudioNumber==256) - { - if (!ReadTables20()) - break; - continue; - } - Window[UnpPtr++]=DecodeAudio(AudioNumber); - if (++UnpCurChannel==UnpChannels) - UnpCurChannel=0; - --DestUnpSize; - continue; - } - - int Number=DecodeNumber((struct Decode *)&LD); - if (Number<256) - { - Window[UnpPtr++]=(byte)Number; - --DestUnpSize; - continue; - } - if (Number>269) - { - int Length=LDecode[Number-=270]+3; - if ((Bits=LBits[Number])>0) - { - Length+=getbits()>>(16-Bits); - addbits(Bits); - } - - int DistNumber=DecodeNumber((struct Decode *)&DD); - unsigned int Distance=DDecode[DistNumber]+1; - if ((Bits=DBits[DistNumber])>0) - { - Distance+=getbits()>>(16-Bits); - addbits(Bits); - } - - if (Distance>=0x2000) - { - Length++; - if (Distance>=0x40000L) - Length++; - } - - CopyString20(Length,Distance); - continue; - } - if (Number==269) - { - if (!ReadTables20()) - break; - continue; - } - if (Number==256) - { - CopyString20(LastLength,LastDist); - continue; - } - if (Number<261) - { - unsigned int Distance=OldDist[(OldDistPtr-(Number-256)) & 3]; - int LengthNumber=DecodeNumber((struct Decode *)&RD); - int Length=LDecode[LengthNumber]+2; - if ((Bits=LBits[LengthNumber])>0) - { - Length+=getbits()>>(16-Bits); - addbits(Bits); - } - if (Distance>=0x101) - { - Length++; - if (Distance>=0x2000) - { - Length++; - if (Distance>=0x40000) - Length++; - } - } - CopyString20(Length,Distance); - continue; - } - if (Number<270) - { - unsigned int Distance=SDDecode[Number-=261]+1; - if ((Bits=SDBits[Number])>0) - { - Distance+=getbits()>>(16-Bits); - addbits(Bits); - } - CopyString20(2,Distance); - continue; - } - } - ReadLastTables(); - OldUnpWriteBuf(); -} - - -bool Unpack::ReadTables20() -{ - byte BitLength[BC20]; - unsigned char Table[MC20*4]; - int TableSize,N,I; - if (InAddr>ReadTop-25) - if (!UnpReadBuf()) - return(false); - unsigned int BitField=getbits(); - UnpAudioBlock=(BitField & 0x8000); - - if (!(BitField & 0x4000)) - memset(UnpOldTable20,0,sizeof(UnpOldTable20)); - addbits(2); - - if (UnpAudioBlock) - { - UnpChannels=((BitField>>12) & 3)+1; - if (UnpCurChannel>=UnpChannels) - UnpCurChannel=0; - addbits(2); - TableSize=MC20*UnpChannels; - } - else - TableSize=NC20+DC20+RC20; - - for (I=0;I<BC20;I++) - { - BitLength[I]=(byte)(getbits() >> 12); - addbits(4); - } - MakeDecodeTables(BitLength,(struct Decode *)&BD,BC20); - I=0; - while (I<TableSize) - { - if (InAddr>ReadTop-5) - if (!UnpReadBuf()) - return(false); - int Number=DecodeNumber((struct Decode *)&BD); - if (Number<16) - { - Table[I]=(Number+UnpOldTable20[I]) & 0xf; - I++; - } - else - if (Number==16) - { - N=(getbits() >> 14)+3; - addbits(2); - while (N-- > 0 && I<TableSize) - { - Table[I]=Table[I-1]; - I++; - } - } - else - { - if (Number==17) - { - N=(getbits() >> 13)+3; - addbits(3); - } - else - { - N=(getbits() >> 9)+11; - addbits(7); - } - while (N-- > 0 && I<TableSize) - Table[I++]=0; - } - } - if (InAddr>ReadTop) - return(true); - if (UnpAudioBlock) - for (I=0;I<UnpChannels;I++) - MakeDecodeTables(&Table[I*MC20],(struct Decode *)&MD[I],MC20); - else - { - MakeDecodeTables(&Table[0],(struct Decode *)&LD,NC20); - MakeDecodeTables(&Table[NC20],(struct Decode *)&DD,DC20); - MakeDecodeTables(&Table[NC20+DC20],(struct Decode *)&RD,RC20); - } - memcpy(UnpOldTable20,Table,sizeof(UnpOldTable20)); - return(true); -} - - -void Unpack::ReadLastTables() -{ - if (ReadTop>=InAddr+5) - { - if (UnpAudioBlock) - { - if (DecodeNumber((struct Decode *)&MD[UnpCurChannel])==256) - ReadTables20(); - } - else if (DecodeNumber((struct Decode *)&LD)==269) - ReadTables20(); - } -} - - -void Unpack::UnpInitData20(int Solid) -{ - if (!Solid) - { - UnpChannelDelta=UnpCurChannel=0; - UnpChannels=1; - memset(AudV,0,sizeof(AudV)); - memset(UnpOldTable20,0,sizeof(UnpOldTable20)); - } -} - - -byte Unpack::DecodeAudio(int Delta) -{ - struct AudioVariables *V=&AudV[UnpCurChannel]; - V->ByteCount++; - V->D4=V->D3; - V->D3=V->D2; - V->D2=V->LastDelta-V->D1; - V->D1=V->LastDelta; - int PCh=8*V->LastChar+V->K1*V->D1+V->K2*V->D2+V->K3*V->D3+V->K4*V->D4+V->K5*UnpChannelDelta; - PCh=(PCh>>3) & 0xFF; - - unsigned int Ch=PCh-Delta; - - int D=((signed char)Delta)<<3; - - V->Dif[0]+=abs(D); - V->Dif[1]+=abs(D-V->D1); - V->Dif[2]+=abs(D+V->D1); - V->Dif[3]+=abs(D-V->D2); - V->Dif[4]+=abs(D+V->D2); - V->Dif[5]+=abs(D-V->D3); - V->Dif[6]+=abs(D+V->D3); - V->Dif[7]+=abs(D-V->D4); - V->Dif[8]+=abs(D+V->D4); - V->Dif[9]+=abs(D-UnpChannelDelta); - V->Dif[10]+=abs(D+UnpChannelDelta); - - UnpChannelDelta=V->LastDelta=(signed char)(Ch-V->LastChar); - V->LastChar=Ch; - - if ((V->ByteCount & 0x1F)==0) - { - unsigned int MinDif=V->Dif[0],NumMinDif=0; - V->Dif[0]=0; - for (unsigned int I=1;I<sizeof(V->Dif)/sizeof(V->Dif[0]);I++) - { - if (V->Dif[I]<MinDif) - { - MinDif=V->Dif[I]; - NumMinDif=I; - } - V->Dif[I]=0; - } - switch(NumMinDif) - { - case 1: - if (V->K1>=-16) - V->K1--; - break; - case 2: - if (V->K1<16) - V->K1++; - break; - case 3: - if (V->K2>=-16) - V->K2--; - break; - case 4: - if (V->K2<16) - V->K2++; - break; - case 5: - if (V->K3>=-16) - V->K3--; - break; - case 6: - if (V->K3<16) - V->K3++; - break; - case 7: - if (V->K4>=-16) - V->K4--; - break; - case 8: - if (V->K4<16) - V->K4++; - break; - case 9: - if (V->K5>=-16) - V->K5--; - break; - case 10: - if (V->K5<16) - V->K5++; - break; - } - } - return((byte)Ch); -} diff --git a/lib/UnrarXLib/unrar.h b/lib/UnrarXLib/unrar.h deleted file mode 100644 index 4ff06abf22..0000000000 --- a/lib/UnrarXLib/unrar.h +++ /dev/null @@ -1,129 +0,0 @@ -#ifndef _UNRAR_DLL_ -#define _UNRAR_DLL_ - -#define ERAR_END_ARCHIVE 10 -#define ERAR_NO_MEMORY 11 -#define ERAR_BAD_DATA 12 -#define ERAR_BAD_ARCHIVE 13 -#define ERAR_UNKNOWN_FORMAT 14 -#define ERAR_EOPEN 15 -#define ERAR_ECREATE 16 -#define ERAR_ECLOSE 17 -#define ERAR_EREAD 18 -#define ERAR_EWRITE 19 -#define ERAR_SMALL_BUF 20 -#define ERAR_UNKNOWN 21 - -#define RAR_OM_LIST 0 -#define RAR_OM_EXTRACT 1 - -#define RAR_SKIP 0 -#define RAR_TEST 1 -#define RAR_EXTRACT 2 - -#define RAR_VOL_ASK 0 -#define RAR_VOL_NOTIFY 1 - -#define RAR_DLL_VERSION 4 - -struct RARHeaderData -{ - char ArcName[260]; - char FileName[260]; - unsigned int Flags; - unsigned int PackSize; - unsigned int UnpSize; - unsigned int HostOS; - unsigned int FileCRC; - unsigned int FileTime; - unsigned int UnpVer; - unsigned int Method; - unsigned int FileAttr; - char *CmtBuf; - unsigned int CmtBufSize; - unsigned int CmtSize; - unsigned int CmtState; -}; - - -struct RARHeaderDataEx -{ - char ArcName[1024]; - wchar_t ArcNameW[1024]; - char FileName[1024]; - wchar_t FileNameW[1024]; - unsigned int Flags; - unsigned int PackSize; - unsigned int PackSizeHigh; - unsigned int UnpSize; - unsigned int UnpSizeHigh; - unsigned int HostOS; - unsigned int FileCRC; - unsigned int FileTime; - unsigned int UnpVer; - unsigned int Method; - unsigned int FileAttr; - char *CmtBuf; - unsigned int CmtBufSize; - unsigned int CmtSize; - unsigned int CmtState; - unsigned int Reserved[1024]; -}; - - -struct RAROpenArchiveData -{ - char *ArcName; - unsigned int OpenMode; - unsigned int OpenResult; - char *CmtBuf; - unsigned int CmtBufSize; - unsigned int CmtSize; - unsigned int CmtState; -}; - -struct RAROpenArchiveDataEx -{ - char *ArcName; - wchar_t *ArcNameW; - unsigned int OpenMode; - unsigned int OpenResult; - char *CmtBuf; - unsigned int CmtBufSize; - unsigned int CmtSize; - unsigned int CmtState; - unsigned int Flags; - unsigned int Reserved[32]; -}; - -enum UNRARCALLBACK_MESSAGES { - UCM_CHANGEVOLUME,UCM_PROCESSDATA,UCM_NEEDPASSWORD -}; - -typedef int (CALLBACK *UNRARCALLBACK)(UINT msg,LONG UserData,LONG P1,LONG P2); - -typedef int (PASCAL *CHANGEVOLPROC)(char *ArcName,int Mode); -typedef int (PASCAL *PROCESSDATAPROC)(unsigned char *Addr,int Size); - -#ifdef __cplusplus -extern "C" { -#endif - -HANDLE PASCAL RAROpenArchive(struct RAROpenArchiveData *ArchiveData); -HANDLE PASCAL RAROpenArchiveEx(struct RAROpenArchiveDataEx *ArchiveData); -int PASCAL RARCloseArchive(HANDLE hArcData); -int PASCAL RARReadHeader(HANDLE hArcData,struct RARHeaderData *HeaderData); -int PASCAL RARReadHeaderEx(HANDLE hArcData,struct RARHeaderDataEx *HeaderData); -int PASCAL RARProcessFile(HANDLE hArcData,int Operation,char *DestPath,char *DestName); -int PASCAL RARProcessFileW(HANDLE hArcData,int Operation,wchar_t *DestPath,wchar_t *DestName); -void PASCAL RARSetCallback(HANDLE hArcData,UNRARCALLBACK Callback,LONG UserData); -void PASCAL RARSetChangeVolProc(HANDLE hArcData,CHANGEVOLPROC ChangeVolProc); -void PASCAL RARSetProcessDataProc(HANDLE hArcData,PROCESSDATAPROC ProcessDataProc); -void PASCAL RARSetPassword(HANDLE hArcData,char *Password); -int PASCAL RARGetDllVersion(); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/UnrarXLib/uowners.cpp b/lib/UnrarXLib/uowners.cpp deleted file mode 100644 index c9060592a3..0000000000 --- a/lib/UnrarXLib/uowners.cpp +++ /dev/null @@ -1,80 +0,0 @@ - - -void ExtractUnixOwner(Archive &Arc,char *FileName) -{ - if (Arc.HeaderCRC!=Arc.UOHead.HeadCRC) - { - Log(Arc.FileName,St(MOwnersBroken),FileName); - ErrHandler.SetErrorCode(CRC_ERROR); - return; - } - - struct passwd *pw; - if ((pw=getpwnam(Arc.UOHead.OwnerName))==NULL) - { - Log(Arc.FileName,St(MErrGetOwnerID),Arc.UOHead.OwnerName); - ErrHandler.SetErrorCode(WARNING); - return; - } - uid_t OwnerID=pw->pw_uid; - - struct group *gr; - if ((gr=getgrnam(Arc.UOHead.GroupName))==NULL) - { - Log(Arc.FileName,St(MErrGetGroupID),Arc.UOHead.GroupName); - ErrHandler.SetErrorCode(CRC_ERROR); - return; - } - uint Attr=GetFileAttr(FileName,NULL); - gid_t GroupID=gr->gr_gid; -#if defined(SAVE_LINKS) && !defined(_APPLE) - if (lchown(FileName,OwnerID,GroupID)!=0) -#else - if (chown(FileName,OwnerID,GroupID)!=0) -#endif - { - Log(Arc.FileName,St(MSetOwnersError),FileName); - ErrHandler.SetErrorCode(CRC_ERROR); - } - SetFileAttr(FileName,NULL,Attr); -} - - -void ExtractUnixOwnerNew(Archive &Arc,char *FileName) -{ - char *OwnerName=(char *)&Arc.SubHead.SubData[0]; - int OwnerSize=strlen(OwnerName)+1; - int GroupSize=Arc.SubHead.SubData.Size()-OwnerSize; - char GroupName[NM]; - strncpy(GroupName,(char *)&Arc.SubHead.SubData[OwnerSize],GroupSize); - GroupName[GroupSize]=0; - - struct passwd *pw; - if ((pw=getpwnam(OwnerName))==NULL) - { - Log(Arc.FileName,St(MErrGetOwnerID),OwnerName); - ErrHandler.SetErrorCode(WARNING); - return; - } - uid_t OwnerID=pw->pw_uid; - - struct group *gr; - if ((gr=getgrnam(GroupName))==NULL) - { - Log(Arc.FileName,St(MErrGetGroupID),GroupName); - ErrHandler.SetErrorCode(CRC_ERROR); - return; - } - uint Attr=GetFileAttr(FileName,NULL); - gid_t GroupID=gr->gr_gid; -#if defined(SAVE_LINKS) && !defined(_APPLE) - if (lchown(FileName,OwnerID,GroupID)!=0) -#else - if (chown(FileName,OwnerID,GroupID)!=0) -#endif - { - Log(Arc.FileName,St(MSetOwnersError),FileName); - ErrHandler.SetErrorCode(CRC_ERROR); - } - SetFileAttr(FileName,NULL,Attr); -} diff --git a/lib/UnrarXLib/version.hpp b/lib/UnrarXLib/version.hpp deleted file mode 100644 index 950dedfdb0..0000000000 --- a/lib/UnrarXLib/version.hpp +++ /dev/null @@ -1,6 +0,0 @@ -#define RARVER_MAJOR 3 -#define RARVER_MINOR 51 -#define RARVER_BETA 0 -#define RARVER_DAY 4 -#define RARVER_MONTH 10 -#define RARVER_YEAR 2005 diff --git a/lib/UnrarXLib/volume.cpp b/lib/UnrarXLib/volume.cpp deleted file mode 100644 index b24e98bd61..0000000000 --- a/lib/UnrarXLib/volume.cpp +++ /dev/null @@ -1,187 +0,0 @@ -#include "rar.hpp" - -bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName,char Command) -{ - RAROptions *Cmd=Arc.GetRAROptions(); - - int HeaderType=Arc.GetHeaderType(); - FileHeader *hd=HeaderType==NEWSUB_HEAD ? &Arc.SubHead:&Arc.NewLhd; - bool SplitHeader=(HeaderType==FILE_HEAD || HeaderType==NEWSUB_HEAD) && - (hd->Flags & LHD_SPLIT_AFTER)!=0; - - if (DataIO!=NULL && SplitHeader && hd->UnpVer>=20 && - hd->FileCRC!=0xffffffff && DataIO->PackedCRC!=~hd->FileCRC) - { - Log(Arc.FileName,St(MDataBadCRC),hd->FileName,Arc.FileName); - } - - Int64 PrevFullUnpSize = hd->FullUnpSize; - Int64 PosBeforeClose=Arc.Tell(); - Arc.Close(); - - char NextName[NM]; - strcpy(NextName,Arc.FileName); - NextVolumeName(NextName,(Arc.NewMhd.Flags & MHD_NEWNUMBERING)==0 || Arc.OldFormat); - -#if !defined(SFX_MODULE) && !defined(RARDLL) - bool RecoveryDone=false; -#endif - bool FailedOpen=false,OldSchemeTested=false; - - while (!Arc.Open(NextName)) - { - if (!OldSchemeTested) - { - char AltNextName[NM]; - strcpy(AltNextName,Arc.FileName); - NextVolumeName(AltNextName,true); - OldSchemeTested=true; - if (Arc.Open(AltNextName)) - { - strcpy(NextName,AltNextName); - break; - } - } -#ifdef RARDLL - if (Cmd->Callback==NULL && Cmd->ChangeVolProc==NULL || - Cmd->Callback!=NULL && Cmd->Callback(UCM_CHANGEVOLUME,Cmd->UserData,(LONG)NextName,RAR_VOL_ASK)==-1) - { - Cmd->DllError=ERAR_EOPEN; - FailedOpen=true; - break; - } - if (Cmd->ChangeVolProc!=NULL) - { -#ifdef _WIN_32 - _EBX=_ESP; -#endif - int RetCode=Cmd->ChangeVolProc(NextName,RAR_VOL_ASK); -#ifdef _WIN_32 - _ESP=_EBX; -#endif - if (RetCode==0) - { - Cmd->DllError=ERAR_EOPEN; - FailedOpen=true; - break; - } - } -#else - -#if !defined(SFX_MODULE) && !defined(_WIN_CE) - if (!RecoveryDone) - { - RecVolumes RecVol; - RecVol.Restore(Cmd,Arc.FileName,Arc.FileNameW,true); - RecoveryDone=true; - continue; - } -#endif - -#ifndef GUI - if (!Cmd->VolumePause && !IsRemovable(NextName)) - { - Log(Arc.FileName,St(MAbsNextVol),NextName); - FailedOpen=true; - break; - } -#endif -#ifndef SILENT - if (Cmd->AllYes || !AskNextVol(NextName)) -#endif - { - FailedOpen=true; - break; - } -#endif - } - if (FailedOpen) - { - Arc.Open(Arc.FileName,Arc.FileNameW); - Arc.Seek(PosBeforeClose,SEEK_SET); - return(false); - } - Arc.CheckArc(true); -#ifdef RARDLL - if (Cmd->Callback!=NULL && - Cmd->Callback(UCM_CHANGEVOLUME,Cmd->UserData,(LONG)NextName,RAR_VOL_NOTIFY)==-1) - return(false); - if (Cmd->ChangeVolProc!=NULL) - { -#ifdef _WIN_32 - _EBX=_ESP; -#endif - int RetCode=Cmd->ChangeVolProc(NextName,RAR_VOL_NOTIFY); -#ifdef _WIN_32 - _ESP=_EBX; -#endif - if (RetCode==0) - return(false); - } -#endif - - if (Command=='T' || Command=='X' || Command=='E') - { - mprintf(St(Command=='T' ? MTestVol:MExtrVol),Arc.FileName); - } - - if (SplitHeader) - Arc.SearchBlock(HeaderType); - else - Arc.ReadHeader(); - - if (Arc.GetHeaderType()==FILE_HEAD) - { - Arc.ConvertAttributes(); - Arc.Seek(Arc.NextBlockPos-Arc.NewLhd.FullPackSize,SEEK_SET); - } -#ifndef GUI - if (ShowFileName) - { - mprintf(St(MExtrPoints),IntNameToExt(Arc.NewLhd.FileName)); - if (!Cmd->DisablePercentage) - { - mprintf(" "); - } - } -#endif - - if (hd->FullUnpSize == 0) - { - // some archives only have correct UnpSize in the first volume - hd->FullUnpSize = PrevFullUnpSize; - } - - if (DataIO!=NULL) - { - if (HeaderType==ENDARC_HEAD) - DataIO->UnpVolume=false; - else - { - DataIO->UnpVolume=(hd->Flags & LHD_SPLIT_AFTER); - DataIO->SetPackedSizeToRead(hd->FullPackSize); - } -#ifdef SFX_MODULE - DataIO->UnpArcSize=Arc.FileLength(); - DataIO->CurUnpRead=0; -#endif - DataIO->PackedCRC=0xffffffff; -// DataIO->SetFiles(&Arc,NULL); - } - return(true); -} - - - - - - -#ifndef SILENT -bool AskNextVol(char *ArcName) -{ - eprintf(St(MAskNextVol),ArcName); - if (Ask(St(MContinueQuit))==2) - return(false); - return(true); -} -#endif diff --git a/lib/UnrarXLib/volume.hpp b/lib/UnrarXLib/volume.hpp deleted file mode 100644 index 6465340596..0000000000 --- a/lib/UnrarXLib/volume.hpp +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _RAR_VOLUME_ -#define _RAR_VOLUME_ - -void SplitArchive(Archive &Arc,FileHeader *fh,Int64 *HeaderPos, - ComprDataIO *DataIO); -bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName, - char Command); -void SetVolWrite(Archive &Dest,Int64 VolSize); -bool AskNextVol(char *ArcName); - -#endif diff --git a/lib/UnrarXLib/win32acl.cpp b/lib/UnrarXLib/win32acl.cpp deleted file mode 100644 index fd645f4cf7..0000000000 --- a/lib/UnrarXLib/win32acl.cpp +++ /dev/null @@ -1,80 +0,0 @@ -static void SetPrivileges(); - -static bool ReadSacl=false; - - - -#ifndef SFX_MODULE -void ExtractACL(Archive &Arc,char *FileName,wchar *FileNameW) -{ - return; -} -#endif - - -void ExtractACLNew(Archive &Arc,char *FileName,wchar *FileNameW) -{ -#if defined(_XBOX) || defined(_LINUX) || defined(TARGET_WINDOWS) || defined(TARGET_WIN10) - return; -#else - if (!WinNT()) - return; - - Array<byte> SubData; - if (!Arc.ReadSubData(&SubData,NULL)) - return; - - SetPrivileges(); - - SECURITY_INFORMATION si=OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION| - DACL_SECURITY_INFORMATION; - if (ReadSacl) - si|=SACL_SECURITY_INFORMATION; - SECURITY_DESCRIPTOR *sd=(SECURITY_DESCRIPTOR *)&SubData[0]; - - int SetCode; - if (FileNameW!=NULL) - SetCode=SetFileSecurityW(FileNameW,si,sd); - else - SetCode=SetFileSecurity(FileName,si,sd); - - if (!SetCode) - { - Log(Arc.FileName,St(MACLSetError),FileName); - ErrHandler.SysErrMsg(); - ErrHandler.SetErrorCode(WARNING); - } -#endif -} - - -void SetPrivileges() -{ -#if defined(_XBOX) || defined(_LINUX) - return; -#else - static bool InitDone=false; - if (InitDone) - return; - InitDone=true; - - HANDLE hToken; - - if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) - return; - - TOKEN_PRIVILEGES tp; - tp.PrivilegeCount = 1; - tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; - - if (LookupPrivilegeValue(NULL,SE_SECURITY_NAME,&tp.Privileges[0].Luid)) - if (AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL) && - GetLastError() == ERROR_SUCCESS) - ReadSacl=true; - - if (LookupPrivilegeValue(NULL,SE_RESTORE_NAME,&tp.Privileges[0].Luid)) - AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL); - - CloseHandle(hToken); -#endif -} diff --git a/lib/UnrarXLib/win32stm.cpp b/lib/UnrarXLib/win32stm.cpp deleted file mode 100644 index 463bd9aa40..0000000000 --- a/lib/UnrarXLib/win32stm.cpp +++ /dev/null @@ -1,137 +0,0 @@ -// THIS FILE IS SLIGHTLY MODIFIED TO WORK WITH XBMC - -#ifndef SFX_MODULE -void ExtractStreams(Archive &Arc,char *FileName,wchar *FileNameW) -{ - if (!WinNT()) - return; - - if (Arc.HeaderCRC!=Arc.StreamHead.HeadCRC) - { -#ifndef SILENT - Log(Arc.FileName,St(MStreamBroken),FileName); -#endif - ErrHandler.SetErrorCode(CRC_ERROR); - return; - } - - if (Arc.StreamHead.Method<0x31 || Arc.StreamHead.Method>0x35 || Arc.StreamHead.UnpVer>PACK_VER) - { -#ifndef SILENT - Log(Arc.FileName,St(MStreamUnknown),FileName); -#endif - ErrHandler.SetErrorCode(WARNING); - return; - } - - char StreamName[NM+2]; - if (FileName[0]!=0 && FileName[1]==0) - { - strcpy(StreamName,".\\"); - strcpy(StreamName+2,FileName); - } - else - strcpy(StreamName,FileName); - if (strlen(StreamName)+strlen((char *)Arc.StreamHead.StreamName)>=sizeof(StreamName)) - { -#ifndef SILENT - Log(Arc.FileName,St(MStreamBroken),FileName); -#endif - ErrHandler.SetErrorCode(CRC_ERROR); - return; - } - - strcat(StreamName,(char *)Arc.StreamHead.StreamName); - - FindData fd; - bool Found=FindFile::FastFind(FileName,FileNameW,&fd); - - if (fd.FileAttr & FILE_ATTRIBUTE_READONLY) - SetFileAttr(FileName,FileNameW,fd.FileAttr & ~FILE_ATTRIBUTE_READONLY); - - File CurFile; - if (CurFile.WCreate(StreamName)) - { - ComprDataIO DataIO; - Unpack Unpack(&DataIO); - Unpack.Init(); - - Array<unsigned char> UnpData(Arc.StreamHead.UnpSize); - DataIO.SetPackedSizeToRead(Arc.StreamHead.DataSize); - DataIO.EnableShowProgress(false); - DataIO.SetFiles(&Arc,&CurFile); - Unpack.SetDestSize(Arc.StreamHead.UnpSize); - Unpack.DoUnpack(Arc.StreamHead.UnpVer,false); - - if (Arc.StreamHead.StreamCRC!=~DataIO.UnpFileCRC) - { -#ifndef SILENT - Log(Arc.FileName,St(MStreamBroken),StreamName); -#endif - ErrHandler.SetErrorCode(CRC_ERROR); - } - else - CurFile.Close(); - } - File HostFile; - if (Found && HostFile.Open(FileName,FileNameW,true,true)) - /*SetFileTime(HostFile.GetHandle(),&fd.ftCreationTime,&fd.ftLastAccessTime, - &fd.ftLastWriteTime);*/ - if (fd.FileAttr & FILE_ATTRIBUTE_READONLY) - SetFileAttr(FileName,FileNameW,fd.FileAttr); -} -#endif - - -void ExtractStreamsNew(Archive &Arc,char *FileName,wchar *FileNameW) -{ - if (!WinNT()) - return; - - wchar NameW[NM]; - if (FileNameW!=NULL && *FileNameW!=0) - strcpyw(NameW,FileNameW); - else - CharToWide(FileName,NameW); - wchar StreamNameW[NM+2]; - if (NameW[0]!=0 && NameW[1]==0) - { - strcpyw(StreamNameW,L".\\"); - strcpyw(StreamNameW+2,NameW); - } - else - strcpyw(StreamNameW,NameW); - - wchar *DestName=StreamNameW+strlenw(StreamNameW); - byte *SrcName=&Arc.SubHead.SubData[0]; - int DestSize=Arc.SubHead.SubData.Size()/2; - - if (strlenw(StreamNameW)+DestSize>=sizeof(StreamNameW)/sizeof(StreamNameW[0])) - { -#if !defined(SILENT) && !defined(SFX_MODULE) - Log(Arc.FileName,St(MStreamBroken),FileName); -#endif - ErrHandler.SetErrorCode(CRC_ERROR); - return; - } - - RawToWide(SrcName,DestName,DestSize); - DestName[DestSize]=0; - - FindData fd; - bool Found=FindFile::FastFind(FileName,FileNameW,&fd); - - if (fd.FileAttr & FILE_ATTRIBUTE_READONLY) - SetFileAttr(FileName,FileNameW,fd.FileAttr & ~FILE_ATTRIBUTE_READONLY); - char StreamName[NM]; - WideToChar(StreamNameW,StreamName); - File CurFile; - if (CurFile.WCreate(StreamName,StreamNameW) && Arc.ReadSubData(NULL,&CurFile)) - CurFile.Close(); - File HostFile; - if (Found && HostFile.Open(FileName,FileNameW,true,true)) -/* SetFileTime(HostFile.GetHandle(),&fd.ftCreationTime,&fd.ftLastAccessTime, - &fd.ftLastWriteTime);*/ - if (fd.FileAttr & FILE_ATTRIBUTE_READONLY) - SetFileAttr(FileName,FileNameW,fd.FileAttr); -} |