diff options
167 files changed, 307 insertions, 21958 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 6ff1be99ae..24ff1865e3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,7 +41,6 @@ set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} -x assembler-with-cpp") option(VERBOSE "Enable verbose output?" OFF) option(ENABLE_DVDCSS "Enable libdvdcss support?" ON) option(ENABLE_UPNP "Enable UPnP support?" ON) -option(ENABLE_NONFREE "Enable non-free components?" ON) option(ENABLE_AIRTUNES "Enable AirTunes support?" ON) option(ENABLE_OPTICAL "Enable optical support?" ON) option(ENABLE_PYTHON "Enable python support?" ON) @@ -194,10 +193,6 @@ if(ENABLE_UPNP) list(APPEND DEP_DEFINES "-DUSE_UPNP=1") endif() -if(ENABLE_NONFREE) - list(APPEND DEP_DEFINES "-DHAVE_XBMC_NONFREE=1") -endif() - if(ENABLE_OPTICAL) list(APPEND DEP_DEFINES -DHAS_DVD_DRIVE) endif() diff --git a/cmake/treedata/optional/common/nonfree.txt b/cmake/treedata/optional/common/nonfree.txt deleted file mode 100644 index 470ed59752..0000000000 --- a/cmake/treedata/optional/common/nonfree.txt +++ /dev/null @@ -1 +0,0 @@ -lib/UnrarXLib unrarxlib # NONFREE 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); -} diff --git a/project/Win32BuildSetup/genNsisInstaller.nsi b/project/Win32BuildSetup/genNsisInstaller.nsi index f7c0a3764c..d1c92bc54b 100644 --- a/project/Win32BuildSetup/genNsisInstaller.nsi +++ b/project/Win32BuildSetup/genNsisInstaller.nsi @@ -361,8 +361,16 @@ Function .onInit ${OrIf} $1 == "" MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND "Unable to run the Windows program wmic.exe to verify that Windows Update KB$HotFixID is installed.$\nWmic is not installed correctly.$\nPlease fix this issue and try again to install Kodi." Quit - ${EndIf} - nsExec::ExecToStack 'cmd /Q /C "%SYSTEMROOT%\System32\wbem\wmic.exe qfe get hotfixid | findstr "^KB$HotFixID[^0-9]""' + ${EndIf} + nsExec::ExecToStack 'cmd /Q /C "%SYSTEMROOT%\System32\findstr.exe /?"' + Pop $0 ; return value (it always 0 even if an error occured) + Pop $1 ; command output + ${If} $0 != 0 + ${OrIf} $1 == "" + MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND "Unable to run the Windows program findstr.exe to verify that Windows Update KB$HotFixID is installed.$\nFindstr is not installed correctly.$\nPlease fix this issue and try again to install Kodi." + Quit + ${EndIf} + nsExec::ExecToStack 'cmd /Q /C "%SYSTEMROOT%\System32\wbem\wmic.exe qfe get hotfixid | %SYSTEMROOT%\System32\findstr.exe "^KB$HotFixID[^0-9]""' Pop $0 ; return value (it always 0 even if an error occured) Pop $1 ; command output ${If} $0 != 0 diff --git a/tools/depends/target/samba-gplv3/Makefile b/tools/depends/target/samba-gplv3/Makefile index 4af2c12e1b..b943518381 100644 --- a/tools/depends/target/samba-gplv3/Makefile +++ b/tools/depends/target/samba-gplv3/Makefile @@ -1,5 +1,5 @@ include ../../Makefile.include -DEPS= ../../Makefile.include Makefile configureEndian.patch samba_android.patch samba_off64_t.patch no_fork_and_exec.patch +DEPS= ../../Makefile.include Makefile configureEndian.patch perlArrayDefinedDeprecated.patch samba_android.patch samba_off64_t.patch no_fork_and_exec.patch # lib name, version LIBNAME=samba @@ -50,6 +50,7 @@ $(PLATFORM): $(TARBALLS_LOCATION)/$(ARCHIVE) $(DEPS) rm -rf $(PLATFORM); mkdir -p $(PLATFORM) cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) cd $(PLATFORM); patch -p0 -i ../configureEndian.patch + cd $(PLATFORM); patch -p1 -i ../perlArrayDefinedDeprecated.patch cd $(PLATFORM)/source3; ./autogen.sh ifeq ($(OS),android) cd $(PLATFORM); patch -p0 < ../samba_android.patch diff --git a/tools/depends/target/samba-gplv3/perlArrayDefinedDeprecated.patch b/tools/depends/target/samba-gplv3/perlArrayDefinedDeprecated.patch new file mode 100644 index 0000000000..cbff5249e2 --- /dev/null +++ b/tools/depends/target/samba-gplv3/perlArrayDefinedDeprecated.patch @@ -0,0 +1,22 @@ +--- a/pidl/lib/Parse/Pidl/ODL.pm ++++ b/pidl/lib/Parse/Pidl/ODL.pm +@@ -70,7 +70,7 @@ + next; + } + my $podl = Parse::Pidl::IDL::parse_file($idl_path, $opt_incdirs); +- if (defined(@$podl)) { ++ if (@$podl) { + require Parse::Pidl::Typelist; + my $basename = basename($idl_path, ".idl"); + +--- a/pidl/pidl ++++ b/pidl/pidl +@@ -604,7 +604,7 @@ + require Parse::Pidl::IDL; + + $pidl = Parse::Pidl::IDL::parse_file($idl_file, \@opt_incdirs); +- defined @$pidl || die "Failed to parse $idl_file"; ++ @$pidl || die "Failed to parse $idl_file"; + } + + require Parse::Pidl::Typelist; diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp index 9edc4d89ce..e8ca0593be 100644 --- a/xbmc/Application.cpp +++ b/xbmc/Application.cpp @@ -79,9 +79,6 @@ #include "GUILargeTextureManager.h" #include "TextureCache.h" #include "playlists/SmartPlayList.h" -#ifdef HAS_FILESYSTEM_RAR -#include "filesystem/RarManager.h" -#endif #include "playlists/PlayList.h" #include "profiles/ProfilesManager.h" #include "windowing/WindowingFactory.h" @@ -2901,11 +2898,6 @@ void CApplication::Stop(int exitCode) } #endif - CLog::Log(LOGNOTICE, "clean cached files!"); -#ifdef HAS_FILESYSTEM_RAR - g_RarManager.ClearCache(true); -#endif - #ifdef HAS_FILESYSTEM_SFTP CSFTPSessionManager::DisconnectAllSessions(); #endif diff --git a/xbmc/PlayListPlayer.cpp b/xbmc/PlayListPlayer.cpp index 137f4802e4..b2352895ab 100644 --- a/xbmc/PlayListPlayer.cpp +++ b/xbmc/PlayListPlayer.cpp @@ -256,6 +256,24 @@ bool CPlayListPlayer::PlaySongId(int songId) return Play(); } +bool CPlayListPlayer::Play(const CFileItemPtr &pItem, std::string player) +{ + int playlist; + if (pItem->IsAudio()) + playlist = PLAYLIST_MUSIC; + else if (pItem->IsVideo()) + playlist = PLAYLIST_VIDEO; + else + return false; + + ClearPlaylist(playlist); + Reset(); + SetCurrentPlaylist(playlist); + Add(playlist, pItem); + + return Play(0, player); +} + bool CPlayListPlayer::Play(int iSong, std::string player, bool bAutoPlay /* = false */, bool bPlayPrevious /* = false */) { if (m_iCurrentPlayList == PLAYLIST_NONE) @@ -855,10 +873,14 @@ void PLAYLIST::CPlayListPlayer::OnApplicationMessage(KODI::MESSAGING::ThreadMess ClearPlaylist(playlist); SetCurrentPlaylist(playlist); - //For single item lists try PlayMedia. This covers some more cases where a playlist is not appropriate - //It will fall through to PlayFile if (list->Size() == 1 && !(*list)[0]->IsPlayList()) - g_application.PlayMedia(*((*list)[0]), pMsg->strParam, playlist); + { + CFileItemPtr item = (*list)[0]; + if (item->IsAudio() || item->IsVideo()) + Play(item, pMsg->strParam); + else + g_application.PlayMedia(*item, pMsg->strParam, playlist); + } else { // Handle "shuffled" option if present diff --git a/xbmc/PlayListPlayer.h b/xbmc/PlayListPlayer.h index 6f2654cdfa..d2e5048dc8 100644 --- a/xbmc/PlayListPlayer.h +++ b/xbmc/PlayListPlayer.h @@ -72,6 +72,11 @@ public: bool PlaySongId(int songId); bool Play(); + /*! \brief Creates a new playlist for an item and starts playing it + \param pItem The item to play. + */ + bool Play(const CFileItemPtr &pItem, std::string player); + /*! \brief Start playing a particular entry in the current playlist \param index the index of the item to play. This value is modified to ensure it lies within the current playlist. \param replace whether this item should replace the currently playing item. See CApplication::PlayFile (defaults to false). diff --git a/xbmc/SystemGlobals.cpp b/xbmc/SystemGlobals.cpp index 9050b41680..219d7d0778 100644 --- a/xbmc/SystemGlobals.cpp +++ b/xbmc/SystemGlobals.cpp @@ -33,13 +33,10 @@ #include "interfaces/python/XBPython.h" #endif -// Guarantee that CSpecialProtocol is initialized before and uninitialized after RarManager +// Guarantee that CSpecialProtocol is initialized before and uninitialized after ZipManager #include "filesystem/SpecialProtocol.h" std::map<std::string, std::string> CSpecialProtocol::m_pathMap; -#if defined(HAS_FILESYSTEM_RAR) -#include "filesystem/RarManager.h" -#endif #include "filesystem/ZipManager.h" #ifdef TARGET_RASPBERRY_PI diff --git a/xbmc/Util.cpp b/xbmc/Util.cpp index badf9a55e2..a06b8567b7 100644 --- a/xbmc/Util.cpp +++ b/xbmc/Util.cpp @@ -55,9 +55,6 @@ #include "filesystem/MultiPathDirectory.h" #include "filesystem/SpecialProtocol.h" #include "filesystem/RSSDirectory.h" -#ifdef HAS_FILESYSTEM_RAR -#include "filesystem/RarManager.h" -#endif #ifdef HAS_UPNP #include "filesystem/UPnPDirectory.h" #endif @@ -1921,7 +1918,7 @@ int CUtil::ScanArchiveForAssociatedItems(const std::string& strArchivePath, const std::vector<std::string>& item_exts, std::vector<std::string>& associatedFiles) { - CLog::LogFunction(LOGDEBUG, __FUNCTION__, "Scanning archive %s", strArchivePath.c_str()); + CLog::LogFunction(LOGDEBUG, __FUNCTION__, "Scanning archive %s", CURL::GetRedacted(strArchivePath).c_str()); int nItemsAdded = 0; CFileItemList ItemList; @@ -1933,35 +1930,18 @@ int CUtil::ScanArchiveForAssociatedItems(const std::string& strArchivePath, if (!CDirectory::GetDirectory(zipURL, ItemList, "", DIR_FLAG_NO_FILE_DIRS)) return false; } - else + else if (URIUtils::HasExtension(strArchivePath, ".rar")) { -#ifdef HAS_FILESYSTEM_RAR - // get _ALL_files in the rar, even those located in subdirectories because we set the bMask to false. - // so now we dont have to find any subdirs anymore, all files in the rar is checked. - if (!g_RarManager.GetFilesInRar(ItemList, strArchivePath, false, "")) + CURL pathToUrl(strArchivePath); + CURL rarURL = URIUtils::CreateArchivePath("rar", pathToUrl, ""); + if (!CDirectory::GetDirectory(rarURL, ItemList, "", DIR_FLAG_NO_FILE_DIRS)) return false; -#else - return false; -#endif } for (int it = 0; it < ItemList.Size(); ++it) { std::string strPathInRar = ItemList[it]->GetPath(); std::string strExt = URIUtils::GetExtension(strPathInRar); - // checking for embedded archives - if (URIUtils::IsArchive(strPathInRar)) - { - std::string archInArch(strPathInRar); - if (strExt == ".rar") - { - CURL pathToUrl(strArchivePath); - archInArch = URIUtils::CreateArchivePath("rar", pathToUrl, strPathInRar).Get(); - } - - ScanArchiveForAssociatedItems(archInArch, videoNameNoExt, item_exts, associatedFiles); - continue; - } // check that the found filename matches the movie filename int fnl = videoNameNoExt.size(); if (fnl && !StringUtils::StartsWithNoCase(URIUtils::GetFileName(strPathInRar), videoNameNoExt)) @@ -1971,15 +1951,8 @@ int CUtil::ScanArchiveForAssociatedItems(const std::string& strArchivePath, { if (StringUtils::EqualsNoCase(strExt, ext)) { - CURL pathToURL(strArchivePath); - std::string strSourceUrl; - if (URIUtils::HasExtension(strArchivePath, ".rar")) - strSourceUrl = URIUtils::CreateArchivePath("rar", pathToURL, strPathInRar).Get(); - else - strSourceUrl = strPathInRar; - - CLog::Log(LOGINFO, "%s: found associated file %s\n", __FUNCTION__, strSourceUrl.c_str()); - associatedFiles.push_back(strSourceUrl); + CLog::Log(LOGINFO, "%s: found associated file %s\n", __FUNCTION__, CURL::GetRedacted(strPathInRar).c_str()); + associatedFiles.push_back(strPathInRar); nItemsAdded++; break; } diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_vfs_types.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_vfs_types.h index bd191be44f..58495cad6d 100644 --- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_vfs_types.h +++ b/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_vfs_types.h @@ -20,6 +20,14 @@ #ifdef TARGET_WINDOWS #include <windows.h> +#ifdef BUILD_KODI_ADDON +#if defined(CreateDirectory) +#undef CreateDirectory +#endif +#if defined(RemoveDirectory) +#undef RemoveDirectory +#endif +#endif // BUILD_KODI_ADDON #else #ifndef __cdecl #define __cdecl diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp index ae62ee890d..c8429bb536 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp +++ b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp @@ -209,7 +209,7 @@ int CAESinkAUDIOTRACK::AudioTrackWrite(char* audioData, int offsetInBytes, int s if (m_floatbuf.size() != (sizeInBytes - offsetInBytes) / sizeof(float)) m_floatbuf.resize((sizeInBytes - offsetInBytes) / sizeof(float)); memcpy(m_floatbuf.data(), audioData + offsetInBytes, sizeInBytes - offsetInBytes); - written = m_at_jni->write(m_floatbuf, 0, (sizeInBytes - offsetInBytes) / sizeof(float), CJNIAudioTrack::WRITE_NON_BLOCKING); + written = m_at_jni->write(m_floatbuf, 0, (sizeInBytes - offsetInBytes) / sizeof(float), CJNIAudioTrack::WRITE_BLOCKING); written *= sizeof(float); } else if (m_jniAudioFormat == CJNIAudioFormat::ENCODING_IEC61937) @@ -218,7 +218,7 @@ int CAESinkAUDIOTRACK::AudioTrackWrite(char* audioData, int offsetInBytes, int s m_shortbuf.resize((sizeInBytes - offsetInBytes) / sizeof(int16_t)); memcpy(m_shortbuf.data(), audioData + offsetInBytes, sizeInBytes - offsetInBytes); if (CJNIBase::GetSDKVersion() >= 23) - written = m_at_jni->write(m_shortbuf, 0, (sizeInBytes - offsetInBytes) / sizeof(int16_t), CJNIAudioTrack::WRITE_NON_BLOCKING); + written = m_at_jni->write(m_shortbuf, 0, (sizeInBytes - offsetInBytes) / sizeof(int16_t), CJNIAudioTrack::WRITE_BLOCKING); else written = m_at_jni->write(m_shortbuf, 0, (sizeInBytes - offsetInBytes) / sizeof(int16_t)); written *= sizeof(uint16_t); @@ -229,7 +229,7 @@ int CAESinkAUDIOTRACK::AudioTrackWrite(char* audioData, int offsetInBytes, int s m_charbuf.resize(sizeInBytes - offsetInBytes); memcpy(m_charbuf.data(), audioData + offsetInBytes, sizeInBytes - offsetInBytes); if (CJNIBase::GetSDKVersion() >= 23) - written = m_at_jni->write(m_charbuf, 0, sizeInBytes - offsetInBytes, CJNIAudioTrack::WRITE_NON_BLOCKING); + written = m_at_jni->write(m_charbuf, 0, sizeInBytes - offsetInBytes, CJNIAudioTrack::WRITE_BLOCKING); else written = m_at_jni->write(m_charbuf, 0, sizeInBytes - offsetInBytes); } diff --git a/xbmc/filesystem/CMakeLists.txt b/xbmc/filesystem/CMakeLists.txt index b4947a6fbd..fbade5f9b4 100644 --- a/xbmc/filesystem/CMakeLists.txt +++ b/xbmc/filesystem/CMakeLists.txt @@ -45,9 +45,6 @@ set(SOURCES AddonsDirectory.cpp PlaylistFileDirectory.cpp PluginDirectory.cpp PVRDirectory.cpp - RarDirectory.cpp - RarFile.cpp - RarManager.cpp ResourceDirectory.cpp ResourceFile.cpp RSSDirectory.cpp @@ -125,9 +122,6 @@ set(HEADERS AddonsDirectory.h PlaylistFileDirectory.h PluginDirectory.h RSSDirectory.h - RarDirectory.h - RarFile.h - RarManager.h ResourceDirectory.h ResourceFile.h SFTPDirectory.h diff --git a/xbmc/filesystem/DirectoryFactory.cpp b/xbmc/filesystem/DirectoryFactory.cpp index c63fa24575..4c306638e3 100644 --- a/xbmc/filesystem/DirectoryFactory.cpp +++ b/xbmc/filesystem/DirectoryFactory.cpp @@ -73,9 +73,6 @@ #endif #include "XbtDirectory.h" #include "ZipDirectory.h" -#ifdef HAS_FILESYSTEM_RAR -#include "RarDirectory.h" -#endif #include "FileItem.h" #include "URL.h" #include "RSSDirectory.h" @@ -141,14 +138,6 @@ IDirectory* CDirectoryFactory::Create(const CURL& url) if (url.IsProtocol("apk")) return new CAPKDirectory(); #endif if (url.IsProtocol("zip")) return new CZipDirectory(); - if (url.IsProtocol("rar")) - { -#ifdef HAS_FILESYSTEM_RAR - return new CRarDirectory(); -#else - CLog::Log(LOGWARNING, "%s - Compiled without non-free, rar support is disabled", __FUNCTION__); -#endif - } if (url.IsProtocol("xbt")) return new CXbtDirectory(); if (url.IsProtocol("multipath")) return new CMultiPathDirectory(); if (url.IsProtocol("stack")) return new CStackDirectory(); diff --git a/xbmc/filesystem/FileDirectoryFactory.cpp b/xbmc/filesystem/FileDirectoryFactory.cpp index edd50b7d25..58c978ef53 100644 --- a/xbmc/filesystem/FileDirectoryFactory.cpp +++ b/xbmc/filesystem/FileDirectoryFactory.cpp @@ -26,9 +26,6 @@ #include "UDFDirectory.h" #include "RSSDirectory.h" #endif -#ifdef HAS_FILESYSTEM_RAR -#include "RarDirectory.h" -#endif #if defined(TARGET_ANDROID) #include "APKDirectory.h" #endif @@ -169,59 +166,6 @@ IFileDirectory* CFileDirectoryFactory::Create(const CURL& url, CFileItem* pItem, } return NULL; } - if (url.IsFileType("rar") || url.IsFileType("001")) - { - std::vector<std::string> tokens; - const std::string strPath = url.Get(); - StringUtils::Tokenize(strPath,tokens,"."); - if (tokens.size() > 2) - { - if (url.IsFileType("001")) - { - if (StringUtils::EqualsNoCase(tokens[tokens.size()-2], "ts")) // .ts.001 - treat as a movie file to scratch some users itch - return NULL; - } - std::string token = tokens[tokens.size()-2]; - if (StringUtils::StartsWith(token, "part")) // only list '.part01.rar' - { - // need this crap to avoid making mistakes - yeyh for the new rar naming scheme :/ - struct __stat64 stat; - int digits = token.size()-4; - std::string strFormat = StringUtils::Format("part%%0%ii", digits); - std::string strNumber = StringUtils::Format(strFormat.c_str(), 1); - std::string strPath2 = strPath; - StringUtils::Replace(strPath2,token,strNumber); - if (atoi(token.substr(4).c_str()) > 1 && CFile::Stat(strPath2,&stat) == 0) - { - pItem->m_bIsFolder = true; - return NULL; - } - } - } - - CURL rarURL = URIUtils::CreateArchivePath("rar", url); - - CFileItemList items; - CDirectory::GetDirectory(rarURL, items, strMask); - if (items.Size() == 0) // no files - hide this - pItem->m_bIsFolder = true; - else if (items.Size() == 1 && items[0]->m_idepth == 0x30 && !items[0]->m_bIsFolder) - { - // one STORED file - collapse it down - *pItem = *items[0]; - } - else - { -#ifdef HAS_FILESYSTEM_RAR - // compressed or more than one file -> create a rar dir - pItem->SetURL(rarURL); - return new CRarDirectory; -#else - return NULL; -#endif - } - return NULL; - } if (url.IsFileType("xbt")) { CURL xbtUrl = URIUtils::CreateArchivePath("xbt", url); diff --git a/xbmc/filesystem/FileFactory.cpp b/xbmc/filesystem/FileFactory.cpp index 4182ae1c28..fcf59b2e7c 100644 --- a/xbmc/filesystem/FileFactory.cpp +++ b/xbmc/filesystem/FileFactory.cpp @@ -47,9 +47,6 @@ #endif #include "XbtFile.h" #include "ZipFile.h" -#ifdef HAS_FILESYSTEM_RAR -#include "RarFile.h" -#endif #ifdef HAS_FILESYSTEM_SFTP #include "SFTPFile.h" #endif @@ -124,14 +121,6 @@ IFile* CFileFactory::CreateLoader(const CURL& url) if (url.IsProtocol("apk")) return new CAPKFile(); #endif if (url.IsProtocol("zip")) return new CZipFile(); - else if (url.IsProtocol("rar")) - { -#ifdef HAS_FILESYSTEM_RAR - return new CRarFile(); -#else - CLog::Log(LOGWARNING, "%s - Compiled without non-free, rar support is disabled", __FUNCTION__); -#endif - } else if (url.IsProtocol("xbt")) return new CXbtFile(); else if (url.IsProtocol("musicdb")) return new CMusicDatabaseFile(); else if (url.IsProtocol("videodb")) return new CVideoDatabaseFile(); diff --git a/xbmc/filesystem/RarDirectory.cpp b/xbmc/filesystem/RarDirectory.cpp deleted file mode 100644 index fe1e613e10..0000000000 --- a/xbmc/filesystem/RarDirectory.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (C) 2005-2013 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * <http://www.gnu.org/licenses/>. - * - */ - -#include "RarDirectory.h" -#include "RarManager.h" -#include "utils/log.h" -#include "utils/URIUtils.h" -#include "URL.h" -#include "FileItem.h" - -namespace XFILE -{ - CRarDirectory::CRarDirectory() - { - } - - CRarDirectory::~CRarDirectory() - { - } - - bool CRarDirectory::GetDirectory(const CURL& urlOrig, CFileItemList& items) - { - CURL url(urlOrig); - - /* if this isn't a proper archive path, assume it's the path to a archive file */ - if (!urlOrig.IsProtocol("rar")) - url = URIUtils::CreateArchivePath("rar", urlOrig); - - std::string strArchive = url.GetHostName(); - std::string strOptions = url.GetOptions(); - std::string strPathInArchive = url.GetFileName(); - url.SetOptions(""); - - std::string strSlashPath = url.Get(); - - // the RAR code depends on things having a "\" at the end of the path - URIUtils::AddSlashAtEnd(strSlashPath); - - if (g_RarManager.GetFilesInRar(items,strArchive,true,strPathInArchive)) - { - // fill in paths - for( int iEntry=0;iEntry<items.Size();++iEntry) - { - if (items[iEntry]->IsParentFolder()) - continue; - items[iEntry]->SetPath(URIUtils::AddFileToFolder(strSlashPath, items[iEntry]->GetPath() + strOptions)); - items[iEntry]->m_iDriveType = 0; - //CLog::Log(LOGDEBUG, "RarXFILE::GetDirectory() retrieved file: %s", items[iEntry]->m_strPath.c_str()); - } - return( true); - } - else - { - CLog::Log(LOGWARNING,"%s: rar lib returned no files in archive %s, likely corrupt",__FUNCTION__,strArchive.c_str()); - return( false ); - } - } - - bool CRarDirectory::Exists(const CURL& url) - { - CFileItemList items; - if (GetDirectory(url,items)) - return true; - - return false; - } - - bool CRarDirectory::ContainsFiles(const CURL& url) - { - CFileItemList items; - const std::string pathToUrl(url.Get()); - if (g_RarManager.GetFilesInRar(items, pathToUrl)) - { - if (items.Size() > 1) - return true; - - return false; - } - - return false; - } -} - diff --git a/xbmc/filesystem/RarDirectory.h b/xbmc/filesystem/RarDirectory.h deleted file mode 100644 index a77f2e13e5..0000000000 --- a/xbmc/filesystem/RarDirectory.h +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2013 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * <http://www.gnu.org/licenses/>. - * - */ - - -#include "IFileDirectory.h" - -namespace XFILE -{ - class CRarDirectory : public IFileDirectory - { - public: - CRarDirectory(); - ~CRarDirectory(); - virtual bool GetDirectory(const CURL& url, CFileItemList& items); - virtual bool ContainsFiles(const CURL& url); - virtual bool Exists(const CURL& url); - virtual DIR_CACHE_TYPE GetCacheType(const CURL& url) const { return DIR_CACHE_ALWAYS; }; - }; -} diff --git a/xbmc/filesystem/RarFile.cpp b/xbmc/filesystem/RarFile.cpp deleted file mode 100644 index 6016bc203a..0000000000 --- a/xbmc/filesystem/RarFile.cpp +++ /dev/null @@ -1,758 +0,0 @@ -/* - * Copyright (C) 2005-2013 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * <http://www.gnu.org/licenses/>. - * - */ - -#include "system.h" -#include "RarFile.h" -#include <algorithm> -#include <sys/stat.h> -#include "Util.h" -#include "utils/CharsetConverter.h" -#include "utils/URIUtils.h" -#include "URL.h" -#include "Directory.h" -#include "RarManager.h" -#include "settings/AdvancedSettings.h" -#include "FileItem.h" -#include "utils/log.h" -#include "UnrarXLib/rar.hpp" -#include "utils/StringUtils.h" - -#ifndef TARGET_POSIX -#include <process.h> -#endif - -#ifdef TARGET_POSIX -#include "linux/XTimeUtils.h" -#endif - -using namespace XFILE; - -#define SEEKTIMOUT 30000 - -#ifdef HAS_FILESYSTEM_RAR -CRarFileExtractThread::CRarFileExtractThread() - : CThread("RarFileExtract") - , hRunning(true) - , hQuit(true) - , m_iSize(0) -{ - m_pArc = NULL; - m_pCmd = NULL; - m_pExtract = NULL; - StopThread(); - Create(); -} - -CRarFileExtractThread::~CRarFileExtractThread() -{ - hQuit.Set(); - AbortableWait(hRestart); - StopThread(); -} - -void CRarFileExtractThread::Start(Archive* pArc, CommandData* pCmd, CmdExtract* pExtract, int iSize) -{ - m_pArc = pArc; - m_pCmd = pCmd; - m_pExtract = pExtract; - m_iSize = iSize; - - m_pExtract->GetDataIO().hBufferFilled = new CEvent; - m_pExtract->GetDataIO().hBufferEmpty = new CEvent; - m_pExtract->GetDataIO().hSeek = new CEvent(true); - m_pExtract->GetDataIO().hSeekDone = new CEvent; - m_pExtract->GetDataIO().hQuit = new CEvent(true); - - hRunning.Set(); - hRestart.Set(); -} - -void CRarFileExtractThread::OnStartup() -{ -} - -void CRarFileExtractThread::OnExit() -{ -} - -void CRarFileExtractThread::Process() -{ - while (AbortableWait(hQuit,1) != WAIT_SIGNALED) - { - if (AbortableWait(hRestart,1) == WAIT_SIGNALED) - { - bool Repeat = false; - try - { - m_pExtract->ExtractCurrentFile(m_pCmd,*m_pArc,m_iSize,Repeat); - } - catch (int rarErrCode) - { - CLog::Log(LOGERROR,"filerar CFileRarExtractThread::Process failed. CmdExtract::ExtractCurrentFile threw a UnrarXLib error code of %d",rarErrCode); - } - catch (...) - { - CLog::Log(LOGERROR,"filerar CFileRarExtractThread::Process failed. CmdExtract::ExtractCurrentFile threw an Unknown exception"); - } - - hRunning.Reset(); - } - } - hRestart.Set(); -} -#endif - -CRarFile::CRarFile() -{ - m_strCacheDir.clear(); - m_strRarPath.clear(); - m_strPassword.clear(); - m_strPathInRar.clear(); - m_bFileOptions = 0; -#ifdef HAS_FILESYSTEM_RAR - m_pArc = NULL; - m_pCmd = NULL; - m_pExtract = NULL; - m_pExtractThread = NULL; -#endif - m_szBuffer = NULL; - m_szStartOfBuffer = NULL; - m_iDataInBuffer = 0; - m_bUseFile = false; - m_bOpen = false; - m_bSeekable = true; - m_iFilePosition = 0; - m_iFileSize = 0; - m_iBufferStart = 0; -} - -CRarFile::~CRarFile() -{ -#ifdef HAS_FILESYSTEM_RAR - if (!m_bOpen) - return; - - if (m_bUseFile) - { - m_File.Close(); - g_RarManager.ClearCachedFile(m_strRarPath,m_strPathInRar); - } - else - { - CleanUp(); - if (m_pExtractThread) - { - delete m_pExtractThread; - m_pExtractThread = NULL; - } - } -#endif -} - -bool CRarFile::Open(const CURL& url) -{ - InitFromUrl(url); - CFileItemList items; - g_RarManager.GetFilesInRar(items,m_strRarPath,false); - int i; - for (i=0;i<items.Size();++i) - { - if (items[i]->GetLabel() == m_strPathInRar) - break; - } - - if (i<items.Size()) - { - if (items[i]->m_idepth == 0x30) // stored - { - if (!OpenInArchive()) - return false; - - m_iFileSize = items[i]->m_dwSize; - m_bOpen = true; - - // perform 'noidx' check - CFileInfo* pFile = g_RarManager.GetFileInRar(m_strRarPath,m_strPathInRar); - if (pFile) - { - if (pFile->m_iIsSeekable == -1) - { - if (Seek(-1,SEEK_END) == -1) - { - m_bSeekable = false; - pFile->m_iIsSeekable = 0; - } - } - else - m_bSeekable = (pFile->m_iIsSeekable == 1); - } - return true; - } - else - { - CFileInfo* info = g_RarManager.GetFileInRar(m_strRarPath,m_strPathInRar); - if ((!info || !CFile::Exists(info->m_strCachedPath)) && m_bFileOptions & EXFILE_NOCACHE) - return false; - m_bUseFile = true; - std::string strPathInCache; - - if (!g_RarManager.CacheRarredFile(strPathInCache, m_strRarPath, m_strPathInRar, - EXFILE_AUTODELETE | m_bFileOptions, m_strCacheDir, - items[i]->m_dwSize)) - { - CLog::Log(LOGERROR,"filerar::open failed to cache file %s",m_strPathInRar.c_str()); - return false; - } - - if (!m_File.Open( strPathInCache )) - { - CLog::Log(LOGERROR,"filerar::open failed to open file in cache: %s",strPathInCache.c_str()); - return false; - } - - m_bOpen = true; - return true; - } - } - return false; -} - -bool CRarFile::Exists(const CURL& url) -{ - InitFromUrl(url); - - // First step: - // Make sure that the archive exists in the filesystem. - if (!CFile::Exists(m_strRarPath, false)) - return false; - - // Second step: - // Make sure that the requested file exists in the archive. - bool bResult; - - if (!g_RarManager.IsFileInRar(bResult, m_strRarPath, m_strPathInRar)) - return false; - - return bResult; -} - -int CRarFile::Stat(const CURL& url, struct __stat64* buffer) -{ - memset(buffer, 0, sizeof(struct __stat64)); - if (Open(url)) - { - buffer->st_size = GetLength(); - buffer->st_mode = _S_IFREG; - Close(); - errno = 0; - return 0; - } - - if (CDirectory::Exists(url.Get())) - { - buffer->st_mode = _S_IFDIR; - return 0; - } - - errno = ENOENT; - return -1; -} - -bool CRarFile::OpenForWrite(const CURL&, bool) -{ - return false; -} - -ssize_t CRarFile::Read(void *lpBuf, size_t uiBufSize) -{ -#ifdef HAS_FILESYSTEM_RAR - if (!m_bOpen) - return -1; - - if (uiBufSize > SSIZE_MAX) - uiBufSize = SSIZE_MAX; - - if (m_bUseFile) - return m_File.Read(lpBuf,uiBufSize); - - if (m_iFilePosition >= GetLength()) // we are done - return 0; - - if( !m_pExtract->GetDataIO().hBufferEmpty->WaitMSec(5000) ) - { - CLog::Log(LOGERROR, "%s - Timeout waiting for buffer to empty", __FUNCTION__); - return -1; - } - - - uint8_t* pBuf = (uint8_t*)lpBuf; - int64_t uicBufSize = uiBufSize; - if (m_iDataInBuffer > 0) - { - int64_t iCopy = std::min(static_cast<int64_t>(uiBufSize), m_iDataInBuffer); - memcpy(lpBuf,m_szStartOfBuffer,size_t(iCopy)); - m_szStartOfBuffer += iCopy; - m_iDataInBuffer -= int(iCopy); - pBuf += iCopy; - uicBufSize -= iCopy; - m_iFilePosition += iCopy; - } - - while ((uicBufSize > 0) && m_iFilePosition < GetLength() ) - { - if (m_iDataInBuffer <= 0) - { - m_pExtract->GetDataIO().SetUnpackToMemory(m_szBuffer,MAXWINMEMSIZE); - m_szStartOfBuffer = m_szBuffer; - m_iBufferStart = m_iFilePosition; - } - - m_pExtract->GetDataIO().hBufferFilled->Set(); - m_pExtract->GetDataIO().hBufferEmpty->Wait(); - - if (m_pExtract->GetDataIO().NextVolumeMissing) - break; - - m_iDataInBuffer = MAXWINMEMSIZE-m_pExtract->GetDataIO().UnpackToMemorySize; - - if (m_iDataInBuffer < 0 || - m_iDataInBuffer > MAXWINMEMSIZE - (m_szStartOfBuffer - m_szBuffer)) - { - // invalid data returned by UnrarXLib, prevent a crash - CLog::Log(LOGERROR, "CRarFile::Read - Data buffer in inconsistent state"); - m_iDataInBuffer = 0; - } - - if (m_iDataInBuffer == 0) - break; - - if (m_iDataInBuffer > uicBufSize) - { - memcpy(pBuf,m_szStartOfBuffer,int(uicBufSize)); - m_szStartOfBuffer += uicBufSize; - pBuf += int(uicBufSize); - m_iFilePosition += uicBufSize; - m_iDataInBuffer -= int(uicBufSize); - uicBufSize = 0; - } - else - { - memcpy(pBuf,m_szStartOfBuffer,size_t(m_iDataInBuffer)); - m_iFilePosition += m_iDataInBuffer; - m_szStartOfBuffer += m_iDataInBuffer; - uicBufSize -= m_iDataInBuffer; - pBuf += m_iDataInBuffer; - m_iDataInBuffer = 0; - } - } - - m_pExtract->GetDataIO().hBufferEmpty->Set(); - - return (ssize_t)(uiBufSize-uicBufSize); -#else - return 0; -#endif -} - -void CRarFile::Close() -{ -#ifdef HAS_FILESYSTEM_RAR - if (!m_bOpen) - return; - - if (m_bUseFile) - { - m_File.Close(); - g_RarManager.ClearCachedFile(m_strRarPath,m_strPathInRar); - m_bOpen = false; - } - else - { - CleanUp(); - if (m_pExtractThread) - { - delete m_pExtractThread; - m_pExtractThread = NULL; - } - m_bOpen = false; - } -#endif -} - -int64_t CRarFile::Seek(int64_t iFilePosition, int iWhence) -{ -#ifdef HAS_FILESYSTEM_RAR - if (!m_bOpen) - return -1; - - if (!m_bSeekable) - return -1; - - if (m_bUseFile) - return m_File.Seek(iFilePosition,iWhence); - - if( !m_pExtract->GetDataIO().hBufferEmpty->WaitMSec(SEEKTIMOUT) ) - { - CLog::Log(LOGERROR, "%s - Timeout waiting for buffer to empty", __FUNCTION__); - return -1; - } - - m_pExtract->GetDataIO().hBufferEmpty->Set(); - - switch (iWhence) - { - case SEEK_CUR: - if (iFilePosition == 0) - return m_iFilePosition; // happens sometimes - - iFilePosition += m_iFilePosition; - break; - case SEEK_END: - if (iFilePosition == 0) // do not seek to end - { - m_iFilePosition = this->GetLength(); - m_iDataInBuffer = 0; - m_iBufferStart = this->GetLength(); - - return this->GetLength(); - } - - iFilePosition += GetLength(); - case SEEK_SET: - break; - default: - return -1; - } - - if (iFilePosition > this->GetLength()) - return -1; - - if (iFilePosition == m_iFilePosition) // happens a lot - return m_iFilePosition; - - if ((iFilePosition >= m_iBufferStart) && (iFilePosition < m_iBufferStart+MAXWINMEMSIZE) - && (m_iDataInBuffer > 0)) // we are within current buffer - { - m_iDataInBuffer = MAXWINMEMSIZE-(iFilePosition-m_iBufferStart); - m_szStartOfBuffer = m_szBuffer+MAXWINMEMSIZE-m_iDataInBuffer; - m_iFilePosition = iFilePosition; - - return m_iFilePosition; - } - - if (iFilePosition < m_iBufferStart ) - { - CleanUp(); - if (!OpenInArchive()) - return -1; - - if( !m_pExtract->GetDataIO().hBufferEmpty->WaitMSec(SEEKTIMOUT) ) - { - CLog::Log(LOGERROR, "%s - Timeout waiting for buffer to empty", __FUNCTION__); - return -1; - } - m_pExtract->GetDataIO().hBufferEmpty->Set(); - m_pExtract->GetDataIO().m_iSeekTo = iFilePosition; - } - else - m_pExtract->GetDataIO().m_iSeekTo = iFilePosition; - - m_pExtract->GetDataIO().SetUnpackToMemory(m_szBuffer,MAXWINMEMSIZE); - m_pExtract->GetDataIO().hSeek->Set(); - m_pExtract->GetDataIO().hBufferFilled->Set(); - if( !m_pExtract->GetDataIO().hSeekDone->WaitMSec(SEEKTIMOUT)) - { - CLog::Log(LOGERROR, "%s - Timeout waiting for seek to finish", __FUNCTION__); - return -1; - } - - if (m_pExtract->GetDataIO().NextVolumeMissing) - { - m_iFilePosition = m_iFileSize; - return -1; - } - - if( !m_pExtract->GetDataIO().hBufferEmpty->WaitMSec(SEEKTIMOUT) ) - { - CLog::Log(LOGERROR, "%s - Timeout waiting for buffer to empty", __FUNCTION__); - return -1; - } - m_iDataInBuffer = m_pExtract->GetDataIO().m_iSeekTo; // keep data - m_iBufferStart = m_pExtract->GetDataIO().m_iStartOfBuffer; - - if (m_iDataInBuffer < 0 || m_iDataInBuffer > MAXWINMEMSIZE) - { - // invalid data returned by UnrarXLib, prevent a crash - CLog::Log(LOGERROR, "CRarFile::Seek - Data buffer in inconsistent state"); - m_iDataInBuffer = 0; - return -1; - } - - m_szStartOfBuffer = m_szBuffer+MAXWINMEMSIZE-m_iDataInBuffer; - m_iFilePosition = iFilePosition; - - return m_iFilePosition; -#else - return -1; -#endif -} - -int64_t CRarFile::GetLength() -{ - if (!m_bOpen) - return 0; - - if (m_bUseFile) - return m_File.GetLength(); - - return m_iFileSize; -} - -int64_t CRarFile::GetPosition() -{ - if (!m_bOpen) - return -1; - - if (m_bUseFile) - return m_File.GetPosition(); - - return m_iFilePosition; -} - -ssize_t CRarFile::Write(const void* lpBuf, size_t uiBufSize) -{ - return -1; -} - -void CRarFile::Flush() -{ - if (m_bUseFile) - m_File.Flush(); -} - -void CRarFile::InitFromUrl(const CURL& url) -{ - m_strCacheDir = g_advancedSettings.m_cachePath;//url.GetDomain(); - URIUtils::AddSlashAtEnd(m_strCacheDir); - m_strRarPath = url.GetHostName(); - m_strPassword = url.GetUserName(); - m_strPathInRar = url.GetFileName(); - - std::vector<std::string> options; - if (!url.GetOptions().empty()) - StringUtils::Tokenize(url.GetOptions().substr(1), options, "&"); - - m_bFileOptions = 0; - - for(std::vector<std::string>::iterator it = options.begin();it != options.end(); ++it) - { - size_t iEqual = (*it).find('='); - if(iEqual != std::string::npos) - { - std::string strOption = StringUtils::Left((*it), iEqual); - std::string strValue = StringUtils::Mid((*it), iEqual+1); - - if( strOption == "flags" ) - m_bFileOptions = atoi(strValue.c_str()); - else if( strOption == "cache" ) - m_strCacheDir = strValue; - } - } - -} - -void CRarFile::CleanUp() -{ -#ifdef HAS_FILESYSTEM_RAR - try - { - if (m_pExtractThread) - { - if (m_pExtractThread->hRunning.WaitMSec(1)) - { - m_pExtract->GetDataIO().hQuit->Set(); - while (m_pExtractThread->hRunning.WaitMSec(1)) - Sleep(1); - } - delete m_pExtract->GetDataIO().hBufferFilled; - delete m_pExtract->GetDataIO().hBufferEmpty; - delete m_pExtract->GetDataIO().hSeek; - delete m_pExtract->GetDataIO().hSeekDone; - delete m_pExtract->GetDataIO().hQuit; - } - if (m_pExtract) - { - delete m_pExtract; - m_pExtract = NULL; - } - if (m_pArc) - { - delete m_pArc; - m_pArc = NULL; - } - if (m_pCmd) - { - delete m_pCmd; - m_pCmd = NULL; - } - if (m_szBuffer) - { - delete[] m_szBuffer; - m_szBuffer = NULL; - m_szStartOfBuffer = NULL; - } - } - catch (int rarErrCode) - { - CLog::Log(LOGERROR,"filerar failed in UnrarXLib while deleting CFileRar with an UnrarXLib error code of %d",rarErrCode); - } - catch (...) - { - CLog::Log(LOGERROR,"filerar failed in UnrarXLib while deleting CFileRar with an Unknown exception"); - } -#endif -} - -bool CRarFile::OpenInArchive() -{ -#ifdef HAS_FILESYSTEM_RAR - try - { - int iHeaderSize; - - InitCRC(); - - m_pCmd = new CommandData; - if (!m_pCmd) - { - CleanUp(); - return false; - } - - // Set the arguments for the extract command - strcpy(m_pCmd->Command, "X"); - - m_pCmd->AddArcName(const_cast<char*>(m_strRarPath.c_str()),NULL); - - strncpy(m_pCmd->ExtrPath, m_strCacheDir.c_str(), sizeof (m_pCmd->ExtrPath) - 2); - m_pCmd->ExtrPath[sizeof (m_pCmd->ExtrPath) - 2] = 0; - AddEndSlash(m_pCmd->ExtrPath); - - // Set password for encrypted archives - if (m_strPassword.length() > MAXPASSWORD - 1) - CLog::Log(LOGWARNING,"OpenInArchive: Supplied password is too long %d", (int) m_strPassword.length()); - strncpy(m_pCmd->Password, m_strPassword.c_str(), sizeof (m_pCmd->Password) - 1); - m_pCmd->Password[sizeof (m_pCmd->Password) - 1] = 0; - - m_pCmd->ParseDone(); - - // Open the archive - m_pArc = new Archive(m_pCmd); - if (!m_pArc) - { - CleanUp(); - return false; - } - if (!m_pArc->WOpen(m_strRarPath.c_str(),NULL)) - { - CleanUp(); - return false; - } - if (!(m_pArc->IsOpened() && m_pArc->IsArchive(true))) - { - CleanUp(); - return false; - } - - m_pExtract = new CmdExtract; - if (!m_pExtract) - { - CleanUp(); - return false; - } - m_pExtract->GetDataIO().SetUnpackToMemory(m_szBuffer,0); - m_pExtract->GetDataIO().SetCurrentCommand(*(m_pCmd->Command)); - struct FindData FD; - if (FindFile::FastFind(m_strRarPath.c_str(),NULL,&FD)) - m_pExtract->GetDataIO().TotalArcSize+=FD.Size; - m_pExtract->ExtractArchiveInit(m_pCmd,*m_pArc); - - while (true) - { - if ((iHeaderSize = m_pArc->ReadHeader()) <= 0) - { - CleanUp(); - return false; - } - - if (m_pArc->GetHeaderType() == FILE_HEAD) - { - std::string strFileName; - - if (wcslen(m_pArc->NewLhd.FileNameW) > 0) - { - g_charsetConverter.wToUTF8(m_pArc->NewLhd.FileNameW, strFileName); - } - else - { - g_charsetConverter.unknownToUTF8(m_pArc->NewLhd.FileName, strFileName); - } - - /* replace back slashes into forward slashes */ - /* this could get us into troubles, file could two different files, one with / and one with \ */ - StringUtils::Replace(strFileName, '\\', '/'); - - if (strFileName == m_strPathInRar) - { - break; - } - } - - m_pArc->SeekToNext(); - } - - m_szBuffer = new uint8_t[MAXWINMEMSIZE]; - m_szStartOfBuffer = m_szBuffer; - m_pExtract->GetDataIO().SetUnpackToMemory(m_szBuffer,0); - m_iDataInBuffer = -1; - m_iFilePosition = 0; - m_iBufferStart = 0; - - delete m_pExtractThread; - m_pExtractThread = new CRarFileExtractThread(); - m_pExtractThread->Start(m_pArc,m_pCmd,m_pExtract,iHeaderSize); - - return true; - } - catch (int rarErrCode) - { - CLog::Log(LOGERROR,"filerar failed in UnrarXLib while CFileRar::OpenInArchive with an UnrarXLib error code of %d",rarErrCode); - return false; - } - catch (...) - { - CLog::Log(LOGERROR,"filerar failed in UnrarXLib while CFileRar::OpenInArchive with an Unknown exception"); - return false; - } -#else - return false; -#endif -} - diff --git a/xbmc/filesystem/RarFile.h b/xbmc/filesystem/RarFile.h deleted file mode 100644 index 58b6576500..0000000000 --- a/xbmc/filesystem/RarFile.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (C) 2005-2013 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * <http://www.gnu.org/licenses/>. - * - */ - -// FileRar.h: interface for the CRarFile class. - -#pragma once -#ifndef FILERAR_H_ -#define FILERAR_H_ - -#include "File.h" -#include "IFile.h" -#include "threads/Thread.h" -#include "threads/Event.h" - -class CmdExtract; -class CommandData; -class Archive; - -namespace XFILE -{ -#ifdef HAS_FILESYSTEM_RAR - class CRarFileExtractThread : public CThread - { - public: - CRarFileExtractThread(); - ~CRarFileExtractThread(); - - void Start(Archive* pArc, CommandData* pCmd, CmdExtract* pExtract, int iSize); - - virtual void OnStartup(); - virtual void OnExit(); - virtual void Process(); - - CEvent hRunning; - CEvent hRestart; - CEvent hQuit; - - protected: - Archive* m_pArc; - CommandData* m_pCmd; - CmdExtract* m_pExtract; - int m_iSize; - }; -#endif - - class CRarFile : public IFile - { - public: - CRarFile(); - CRarFile(bool bSeekable); // used for caching files - virtual ~CRarFile(); - virtual int64_t GetPosition(); - virtual int64_t GetLength(); - virtual bool Open(const CURL& url); - virtual bool Exists(const CURL& url); - virtual int Stat(const CURL& url, struct __stat64* buffer); - virtual ssize_t Read(void* lpBuf, size_t uiBufSize); - virtual ssize_t Write(const void* lpBuf, size_t uiBufSize); - virtual int64_t Seek(int64_t iFilePosition, int iWhence=SEEK_SET); - virtual void Close(); - virtual void Flush(); - - virtual bool OpenForWrite(const CURL& url, bool); - unsigned int Write(void *lpBuf, int64_t uiBufSize); - - protected: - std::string m_strCacheDir; - std::string m_strRarPath; - std::string m_strPassword; - std::string m_strPathInRar; - BYTE m_bFileOptions; - void Init(); - void InitFromUrl(const CURL& url); - bool OpenInArchive(); - void CleanUp(); - - int64_t m_iFilePosition; - int64_t m_iFileSize; - // rar stuff - bool m_bUseFile; - bool m_bOpen; - bool m_bSeekable; - CFile m_File; // for packed source -#ifdef HAS_FILESYSTEM_RAR - Archive* m_pArc; - CommandData* m_pCmd; - CmdExtract* m_pExtract; - CRarFileExtractThread* m_pExtractThread; -#endif - uint8_t* m_szBuffer; - uint8_t* m_szStartOfBuffer; - int64_t m_iDataInBuffer; - int64_t m_iBufferStart; - }; - -} - -#endif // FILERAR_H_ - diff --git a/xbmc/filesystem/RarManager.cpp b/xbmc/filesystem/RarManager.cpp deleted file mode 100644 index 9b6a79e1db..0000000000 --- a/xbmc/filesystem/RarManager.cpp +++ /dev/null @@ -1,531 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Kodi; see the file COPYING. If not, see - * <http://www.gnu.org/licenses/>. - * - */ - -#include "system.h" -#include "Application.h" -#include "RarManager.h" -#include "Util.h" -#include "utils/CharsetConverter.h" -#include "utils/URIUtils.h" -#include "threads/SingleLock.h" -#include "Directory.h" -#include "SpecialProtocol.h" -#include "settings/AdvancedSettings.h" -#include "FileItem.h" -#include "utils/log.h" -#include "filesystem/File.h" -#include "URL.h" - -#include "dialogs/GUIDialogYesNo.h" -#include "dialogs/GUIDialogProgress.h" -#include "guilib/GUIWindowManager.h" -#include "utils/StringUtils.h" -#include "utils/Variant.h" - -#include <set> - -#ifdef TARGET_POSIX -#include "linux/XFileUtils.h" -#endif - -#define EXTRACTION_WARN_SIZE 50*1024*1024 - -using namespace XFILE; - -CFileInfo::CFileInfo() - : m_bAutoDel{true} - , m_iUsed{0} - , m_iOffset{0} - , m_iIsSeekable{-1} -{ -} - -///////////////////////////////////////////////// -CRarManager::CRarManager() -{ -} - -CRarManager::~CRarManager() -{ - ClearCache(true); -} - -class progress_info -{ -public: - progress_info(const std::string &file) : heading(file), shown(false), showTime(200) // 200ms to show... - { - } - ~progress_info() - { - if (shown && g_application.IsCurrentThread()) - { - // close progress dialog - CGUIDialogProgress* dlg = g_windowManager.GetWindow<CGUIDialogProgress>(); - if (dlg) - dlg->Close(); - } - } - /*! \brief Progress callback from rar manager. - \return true to continue processing, false to cancel. - */ - bool progress(int progress, const char *text) - { - bool cont(true); - if ((shown || showTime.IsTimePast()) && g_application.IsCurrentThread()) - { - // grab the busy and show it - CGUIDialogProgress* dlg = g_windowManager.GetWindow<CGUIDialogProgress>(); - if (dlg) - { - if (!shown) - { - dlg->SetHeading(CVariant{heading}); - dlg->Open(); - } - if (progress >= 0) - { - dlg->ShowProgressBar(true); - dlg->SetPercentage(progress); - } - if (text) - dlg->SetLine(1, CVariant{text}); - cont = !dlg->IsCanceled(); - shown = true; - // tell render loop to spin - dlg->Progress(); - } - } - return cont; - }; -private: - std::string heading; - bool shown; - XbmcThreads::EndTime showTime; -}; - -/*! \brief Rar progress callback. - \return false to halt progress, true to continue - */ -bool ProgressCallback(void *context, int progress, const char *text) -{ - progress_info* info = (progress_info*)context; - if (info) - return info->progress(progress, text); - return true; -} - -bool CRarManager::CacheRarredFile(std::string& strPathInCache, const std::string& strRarPath, const std::string& strPathInRar, BYTE bOptions, const std::string& strDir, const int64_t iSize) -{ -#ifdef HAS_FILESYSTEM_RAR - CSingleLock lock(m_CritSection); - - //If file is listed in the cache, then use listed copy or cleanup before overwriting. - bool bOverwrite = (bOptions & EXFILE_OVERWRITE) != 0; - std::map<std::string, std::pair<ArchiveList_struct*, std::vector<CFileInfo> > >::iterator j = m_ExFiles.find( strRarPath ); - CFileInfo* pFile=NULL; - if( j != m_ExFiles.end() ) - { - pFile = GetFileInRar(strRarPath,strPathInRar); - if (pFile) - { - if (pFile->m_bIsCanceled()) - return false; - - if( CFile::Exists( pFile->m_strCachedPath) ) - { - if( !bOverwrite ) - { - strPathInCache = pFile->m_strCachedPath; - pFile->m_iUsed++; - return true; - } - - CFile::Delete(pFile->m_strCachedPath); - pFile->m_iUsed++; - } - } - } - - int iRes = 0; - if (iSize > EXTRACTION_WARN_SIZE) - { - CGUIDialogYesNo* pDialog = g_windowManager.GetWindow<CGUIDialogYesNo>(); - if (pDialog) - { - pDialog->SetHeading(CVariant{120}); - pDialog->SetLine(0, CVariant{645}); - pDialog->SetLine(1, CVariant{URIUtils::GetFileName(strPathInRar)}); - pDialog->SetLine(2, CVariant{""}); - pDialog->Open(); - - if (!pDialog->IsConfirmed()) - iRes = 2; // pretend to be canceled - } - } - if (CheckFreeSpace(strDir) < iSize && iRes != 2) - { - ClearCache(); - if (CheckFreeSpace(strDir) < iSize) - { - CFileItemList items; - CDirectory::GetDirectory(g_advancedSettings.m_cachePath,items); - items.Sort(SortBySize, SortOrderDescending); - while (items.Size() && CheckFreeSpace(strDir) < iSize) - { - if (!items[0]->m_bIsFolder) - if (!CFile::Delete(items[0]->GetPath())) - break; - - items.Remove(0); - } - if (!items.Size()) - return false; - } - } - - std::string strPath = strPathInRar; -#ifndef TARGET_POSIX - StringUtils::Replace(strPath, '/', '\\'); -#endif - //g_charsetConverter.unknownToUTF8(strPath); - std::string strCachedPath = URIUtils::AddFileToFolder( - CSpecialProtocol::TranslatePath(strDir), "rarfolder%04d", - URIUtils::GetFileName(strPathInRar)); - strCachedPath = CUtil::GetNextPathname(strCachedPath, 9999); - if (strCachedPath.empty()) - { - CLog::Log(LOGWARNING, "Could not cache file %s", (strRarPath + strPathInRar).c_str()); - return false; - } - strCachedPath = CUtil::MakeLegalPath(strCachedPath); - int64_t iOffset = -1; - if (iRes != 2) - { - if (pFile) - { - if (pFile->m_iOffset != -1) - iOffset = pFile->m_iOffset; - } - - - if (iOffset == -1 && j != m_ExFiles.end()) // grab from list - { - for( ArchiveList_struct* pIterator = j->second.first; pIterator; pIterator = pIterator->next) - { - std::string strName; - - /* convert to utf8 */ - if( pIterator->item.NameW && wcslen(pIterator->item.NameW) > 0) - g_charsetConverter.wToUTF8(pIterator->item.NameW, strName); - else - g_charsetConverter.unknownToUTF8(pIterator->item.Name, strName); - if (strName == strPath) - { - iOffset = pIterator->item.iOffset; - break; - } - } - } - bool bShowProgress=false; - if (iSize > 1024*1024 || iSize == -2) // 1MB - bShowProgress=true; - - std::string strDir2 = URIUtils::GetDirectory(strCachedPath); - URIUtils::RemoveSlashAtEnd(strDir2); - if (!CDirectory::Exists(strDir2)) - CDirectory::Create(strDir2); - progress_info info(CURL(strPath).GetWithoutUserDetails()); - iRes = urarlib_get(const_cast<char*>(strRarPath.c_str()), const_cast<char*>(strDir2.c_str()), - const_cast<char*>(strPath.c_str()),NULL,&iOffset,bShowProgress ? ProgressCallback : NULL, &info); - } - if (iRes == 0) - { - CLog::Log(LOGERROR,"failed to extract file: %s",strPathInRar.c_str()); - return false; - } - - if(!pFile) - { - CFileInfo fileInfo; - fileInfo.m_strPathInRar = strPathInRar; - if (j == m_ExFiles.end()) - { - ArchiveList_struct* pArchiveList; - if(ListArchive(strRarPath,pArchiveList)) - { - m_ExFiles.insert(std::make_pair(strRarPath, std::make_pair(pArchiveList, std::vector<CFileInfo>()))); - j = m_ExFiles.find(strRarPath); - } - else - return false; - } - j->second.second.push_back(fileInfo); - pFile = &(j->second.second[j->second.second.size()-1]); - pFile->m_iUsed = 1; - } - pFile->m_strCachedPath = strCachedPath; - pFile->m_bAutoDel = (bOptions & EXFILE_AUTODELETE) != 0; - pFile->m_iOffset = iOffset; - strPathInCache = pFile->m_strCachedPath; - - if (iRes == 2) //canceled - { - pFile->watch.StartZero(); - CFile::Delete(pFile->m_strCachedPath); - return false; - } -#endif - return true; -} - -// NB: The rar manager expects paths in rars to be terminated with a "\". -bool CRarManager::GetFilesInRar(CFileItemList& vecpItems, const std::string& strRarPath, - bool bMask, const std::string& strPathInRar) -{ -#ifdef HAS_FILESYSTEM_RAR - CSingleLock lock(m_CritSection); - - ArchiveList_struct* pFileList = NULL; - std::map<std::string, std::pair<ArchiveList_struct*, std::vector<CFileInfo> > >::iterator it = m_ExFiles.find(strRarPath); - if (it == m_ExFiles.end()) - { - if( urarlib_list((char*) strRarPath.c_str(), &pFileList, NULL) ) - m_ExFiles.insert(std::make_pair(strRarPath, std::make_pair(pFileList, std::vector<CFileInfo>()))); - else - { - if( pFileList ) urarlib_freelist(pFileList); - return false; - } - } - else - pFileList = it->second.first; - - CFileItemPtr pFileItem; - std::vector<std::string> vec; - std::set<std::string> dirSet; - StringUtils::Tokenize(strPathInRar,vec,"/"); - unsigned int iDepth = vec.size(); - - ArchiveList_struct* pIterator; - std::string strCompare = strPathInRar; - if (!URIUtils::HasSlashAtEnd(strCompare) && !strCompare.empty()) - strCompare += '/'; - for( pIterator = pFileList; pIterator ; pIterator = pIterator->next ) - { - std::string strName; - - /* convert to utf8 */ - if( pIterator->item.NameW && wcslen(pIterator->item.NameW) > 0) - g_charsetConverter.wToUTF8(pIterator->item.NameW, strName); - else - g_charsetConverter.unknownToUTF8(pIterator->item.Name, strName); - - /* replace back slashes into forward slashes */ - /* this could get us into troubles, file could two different files, one with / and one with \ */ - StringUtils::Replace(strName, '\\', '/'); - - if (bMask) - { - if (!strstr(strName.c_str(),strCompare.c_str())) - continue; - - vec.clear(); - StringUtils::Tokenize(strName,vec,"/"); - if (vec.size() < iDepth) - continue; - } - - unsigned int iMask = (pIterator->item.HostOS==3 ? 0x0040000:16); // win32 or unix attribs? - if (((pIterator->item.FileAttr & iMask) == iMask) || (vec.size() > iDepth+1 && bMask)) // we have a directory - { - if (!bMask) continue; - if (vec.size() == iDepth) - continue; // remove root of listing - - if (dirSet.find(vec[iDepth]) == dirSet.end()) - { - dirSet.insert(vec[iDepth]); - pFileItem.reset(new CFileItem(vec[iDepth])); - pFileItem->SetPath(vec[iDepth] + '/'); - pFileItem->m_bIsFolder = true; - pFileItem->m_idepth = pIterator->item.Method; - pFileItem->m_iDriveType = pIterator->item.HostOS; - //pFileItem->m_lEndOffset = long(pIterator->item.iOffset); - } - } - else - { - if (vec.size() == iDepth+1 || !bMask) - { - if (vec.empty()) - pFileItem.reset(new CFileItem(strName)); - else - pFileItem.reset(new CFileItem(vec[iDepth])); - pFileItem->SetPath(strName.c_str()+strPathInRar.size()); - pFileItem->m_dwSize = pIterator->item.UnpSize; - pFileItem->m_idepth = pIterator->item.Method; - pFileItem->m_iDriveType = pIterator->item.HostOS; - //pFileItem->m_lEndOffset = long(pIterator->item.iOffset); - } - } - if (pFileItem) - vecpItems.Add(pFileItem); - - pFileItem.reset(); - } - return vecpItems.Size() > 0; -#else - return false; -#endif -} - -bool CRarManager::ListArchive(const std::string& strRarPath, ArchiveList_struct* &pArchiveList) -{ -#ifdef HAS_FILESYSTEM_RAR - return urarlib_list((char*) strRarPath.c_str(), &pArchiveList, NULL) == 1; -#else - return false; -#endif -} - -CFileInfo* CRarManager::GetFileInRar(const std::string& strRarPath, const std::string& strPathInRar) -{ -#ifdef HAS_FILESYSTEM_RAR - std::map<std::string, std::pair<ArchiveList_struct*, std::vector<CFileInfo> > >::iterator j = m_ExFiles.find(strRarPath); - if (j == m_ExFiles.end()) - return NULL; - - for (std::vector<CFileInfo>::iterator it2=j->second.second.begin(); it2 != j->second.second.end(); ++it2) - if (it2->m_strPathInRar == strPathInRar) - return &(*it2); -#endif - return NULL; -} - -bool CRarManager::GetPathInCache(std::string& strPathInCache, const std::string& strRarPath, const std::string& strPathInRar) -{ -#ifdef HAS_FILESYSTEM_RAR - std::map<std::string, std::pair<ArchiveList_struct*, std::vector<CFileInfo> > >::iterator j = m_ExFiles.find(strRarPath); - if (j == m_ExFiles.end()) - return false; - - for (std::vector<CFileInfo>::iterator it2=j->second.second.begin(); it2 != j->second.second.end(); ++it2) - if (it2->m_strPathInRar == strPathInRar) - return CFile::Exists(it2->m_strCachedPath); -#endif - return false; -} - -bool CRarManager::IsFileInRar(bool& bResult, const std::string& strRarPath, const std::string& strPathInRar) -{ -#ifdef HAS_FILESYSTEM_RAR - bResult = false; - CFileItemList ItemList; - - if (!GetFilesInRar(ItemList,strRarPath,false)) - return false; - - int it; - for (it=0;it<ItemList.Size();++it) - { - if (strPathInRar.compare(ItemList[it]->GetPath()) == 0) - break; - } - if (it != ItemList.Size()) - bResult = true; - - return true; -#else - return false; -#endif -} - -void CRarManager::ClearCache(bool force) -{ -#ifdef HAS_FILESYSTEM_RAR - CSingleLock lock(m_CritSection); - std::map<std::string, std::pair<ArchiveList_struct*, std::vector<CFileInfo> > >::iterator j; - for (j = m_ExFiles.begin() ; j != m_ExFiles.end() ; ++j) - { - - for (std::vector<CFileInfo>::iterator it2 = j->second.second.begin(); it2 != j->second.second.end(); ++it2) - { - CFileInfo* pFile = &(*it2); - if (pFile->m_bAutoDel && (pFile->m_iUsed < 1 || force)) - CFile::Delete( pFile->m_strCachedPath ); - } - urarlib_freelist(j->second.first); - } - - m_ExFiles.clear(); -#endif -} - -void CRarManager::ClearCachedFile(const std::string& strRarPath, const std::string& strPathInRar) -{ -#ifdef HAS_FILESYSTEM_RAR - CSingleLock lock(m_CritSection); - - std::map<std::string, std::pair<ArchiveList_struct*, std::vector<CFileInfo> > >::iterator j = m_ExFiles.find(strRarPath); - if (j == m_ExFiles.end()) - { - return; // no such subpath - } - - for (std::vector<CFileInfo>::iterator it = j->second.second.begin(); it != j->second.second.end(); ++it) - { - if (it->m_strPathInRar == strPathInRar) - if (it->m_iUsed > 0) - { - it->m_iUsed--; - break; - } - } -#endif -} - -void CRarManager::ExtractArchive(const std::string& strArchive, const std::string& strPath) -{ -#ifdef HAS_FILESYSTEM_RAR - std::string strPath2(strPath); - URIUtils::RemoveSlashAtEnd(strPath2); - if (!urarlib_get(const_cast<char*>(strArchive.c_str()), const_cast<char*>(strPath2.c_str()),NULL)) - { - CLog::Log(LOGERROR,"rarmanager::extractarchive error while extracting %s", strArchive.c_str()); - return; - } -#endif -} - -int64_t CRarManager::CheckFreeSpace(const std::string& strDrive) -{ - ULARGE_INTEGER lTotalFreeBytes; -#ifdef TARGET_WINDOWS - std::wstring path; - g_charsetConverter.utf8ToW(CSpecialProtocol::TranslatePath(strDrive), path); -#else - auto path = CSpecialProtocol::TranslatePath(strDrive); -#endif - if (GetDiskFreeSpaceEx(path.c_str(), NULL, NULL, &lTotalFreeBytes)) - return lTotalFreeBytes.QuadPart; - - return 0; -} diff --git a/xbmc/filesystem/RarManager.h b/xbmc/filesystem/RarManager.h deleted file mode 100644 index c7f557d520..0000000000 --- a/xbmc/filesystem/RarManager.h +++ /dev/null @@ -1,92 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2013 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * <http://www.gnu.org/licenses/>. - * - */ - -#include <map> -#include <string> -#include <utility> -#include <vector> - -#include "threads/CriticalSection.h" -#include "UnrarXLib/UnrarX.hpp" -#include "utils/Stopwatch.h" -#include "utils/GlobalsHandling.h" - -class CFileItemList; - -#define EXFILE_OVERWRITE 1 -#define EXFILE_AUTODELETE 2 -#define EXFILE_UNIXPATH 4 -#define EXFILE_NOCACHE 8 -#define RAR_DEFAULT_CACHE "special://temp/" -#define RAR_DEFAULT_PASSWORD "" - -class CFileInfo{ -public: - CFileInfo(); - ~CFileInfo() = default; - std::string m_strCachedPath; - std::string m_strPathInRar; - bool m_bAutoDel; - int m_iUsed; - int64_t m_iOffset; - - bool m_bIsCanceled() - { - if (watch.IsRunning()) - if (watch.GetElapsedSeconds() < 3) - return true; - - watch.Stop(); - return false; - } - CStopWatch watch; - int m_iIsSeekable; -}; - -class CRarManager -{ -public: - CRarManager(); - ~CRarManager(); - bool CacheRarredFile(std::string& strPathInCache, const std::string& strRarPath, - const std::string& strPathInRar, uint8_t bOptions = EXFILE_AUTODELETE, - const std::string& strDir =RAR_DEFAULT_CACHE, const int64_t iSize=-1); - bool GetPathInCache(std::string& strPathInCache, const std::string& strRarPath, - const std::string& strPathInRar = ""); - bool GetFilesInRar(CFileItemList& vecpItems, const std::string& strRarPath, - bool bMask=true, const std::string& strPathInRar=""); - CFileInfo* GetFileInRar(const std::string& strRarPath, const std::string& strPathInRar); - bool IsFileInRar(bool& bResult, const std::string& strRarPath, const std::string& strPathInRar); - void ClearCache(bool force=false); - void ClearCachedFile(const std::string& strRarPath, const std::string& strPathInRar); - void ExtractArchive(const std::string& strArchive, const std::string& strPath); -protected: - - bool ListArchive(const std::string& strRarPath, ArchiveList_struct* &pArchiveList); - std::map<std::string, std::pair<ArchiveList_struct*,std::vector<CFileInfo> > > m_ExFiles; - CCriticalSection m_CritSection; - - int64_t CheckFreeSpace(const std::string& strDrive); -}; - -XBMC_GLOBAL_REF(CRarManager, g_RarManager); -#define g_RarManager XBMC_GLOBAL_USE(CRarManager) - diff --git a/xbmc/filesystem/test/CMakeLists.txt b/xbmc/filesystem/test/CMakeLists.txt index 5d77633658..6946a6e56a 100644 --- a/xbmc/filesystem/test/CMakeLists.txt +++ b/xbmc/filesystem/test/CMakeLists.txt @@ -1,7 +1,6 @@ set(SOURCES TestDirectory.cpp TestFile.cpp TestFileFactory.cpp - TestRarFile.cpp TestZipFile.cpp) core_add_test_library(filesystem_test) diff --git a/xbmc/filesystem/test/TestRarFile.cpp b/xbmc/filesystem/test/TestRarFile.cpp deleted file mode 100644 index 0d33a2530a..0000000000 --- a/xbmc/filesystem/test/TestRarFile.cpp +++ /dev/null @@ -1,651 +0,0 @@ -/* - * Copyright (C) 2005-2013 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * <http://www.gnu.org/licenses/>. - * - */ - -#include "system.h" -#ifdef HAS_FILESYSTEM_RAR -#include "filesystem/Directory.h" -#include "filesystem/File.h" -#include "filesystem/RarManager.h" -#include "URL.h" -#include "utils/URIUtils.h" -#include "FileItem.h" -#include "test/TestUtils.h" -#include "utils/StringUtils.h" - -#include <errno.h> - -#include "gtest/gtest.h" - -#ifndef S_IFLNK -#define S_IFLNK 0120000 -#endif - -TEST(TestRarFile, Read) -{ - XFILE::CFile file; - char buf[20]; - memset(&buf, 0, sizeof(buf)); - std::string reffile, strpathinrar; - CFileItemList itemlist; - - reffile = XBMC_REF_FILE_PATH("xbmc/filesystem/test/reffile.txt.rar"); - CURL rarUrl = URIUtils::CreateArchivePath("rar", CURL(reffile), ""); - ASSERT_TRUE(XFILE::CDirectory::GetDirectory(rarUrl, itemlist, "", - XFILE::DIR_FLAG_NO_FILE_DIRS)); - strpathinrar = itemlist[0]->GetPath(); - ASSERT_TRUE(file.Open(strpathinrar)); - EXPECT_EQ(0, file.GetPosition()); - EXPECT_EQ(1616, file.GetLength()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(20, file.GetPosition()); - EXPECT_TRUE(!memcmp("About\n-----\nXBMC is ", buf, sizeof(buf) - 1)); - EXPECT_TRUE(file.ReadString(buf, sizeof(buf))); - EXPECT_EQ(39, file.GetPosition()); - EXPECT_STREQ("an award-winning fr", buf); - EXPECT_EQ(100, file.Seek(100)); - EXPECT_EQ(100, file.GetPosition()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(120, file.GetPosition()); - EXPECT_TRUE(!memcmp("ent hub for digital ", buf, sizeof(buf) - 1)); - EXPECT_EQ(220, file.Seek(100, SEEK_CUR)); - EXPECT_EQ(220, file.GetPosition()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(240, file.GetPosition()); - EXPECT_TRUE(!memcmp("rs, XBMC is a non-pr", buf, sizeof(buf) - 1)); - EXPECT_EQ(1596, file.Seek(-(int64_t)sizeof(buf), SEEK_END)); - EXPECT_EQ(1596, file.GetPosition()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(1616, file.GetPosition()); - EXPECT_TRUE(!memcmp("multimedia jukebox.\n", buf, sizeof(buf) - 1)); - EXPECT_EQ(1716, file.Seek(100, SEEK_CUR)); - EXPECT_EQ(1716, file.GetPosition()); - EXPECT_EQ(0, file.Seek(0, SEEK_SET)); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(20, file.GetPosition()); - EXPECT_TRUE(!memcmp("About\n-----\nXBMC is ", buf, sizeof(buf) - 1)); - EXPECT_EQ(0, file.Seek(0, SEEK_SET)); - EXPECT_EQ(-1, file.Seek(-100, SEEK_SET)); - // Manual clear to avoid shutdown race - g_RarManager.ClearCache(); - file.Close(); -} - -TEST(TestRarFile, Exists) -{ - std::string reffile, strpathinrar; - CFileItemList itemlist; - - reffile = XBMC_REF_FILE_PATH("xbmc/filesystem/test/reffile.txt.rar"); - CURL rarUrl = URIUtils::CreateArchivePath("rar", CURL(reffile), ""); - ASSERT_TRUE(XFILE::CDirectory::GetDirectory(rarUrl, itemlist, "", - XFILE::DIR_FLAG_NO_FILE_DIRS)); - strpathinrar = itemlist[0]->GetPath(); - - EXPECT_TRUE(XFILE::CFile::Exists(strpathinrar)); - - // Manual clear to avoid shutdown race - g_RarManager.ClearCache(); -} - -TEST(TestRarFile, Stat) -{ - struct __stat64 buffer; - std::string reffile, strpathinrar; - CFileItemList itemlist; - - reffile = XBMC_REF_FILE_PATH("xbmc/filesystem/test/reffile.txt.rar"); - CURL rarUrl = URIUtils::CreateArchivePath("rar", CURL(reffile), ""); - ASSERT_TRUE(XFILE::CDirectory::GetDirectory(rarUrl, itemlist, "", - XFILE::DIR_FLAG_NO_FILE_DIRS)); - strpathinrar = itemlist[0]->GetPath(); - - EXPECT_EQ(0, XFILE::CFile::Stat(strpathinrar, &buffer)); - EXPECT_TRUE(buffer.st_mode | _S_IFREG); - - // Manual clear to avoid shutdown race - g_RarManager.ClearCache(); -} - -/* Test case to test for graceful handling of corrupted input. - * NOTE: The test case is considered a "success" as long as the corrupted - * file was successfully generated and the test case runs without a segfault. - */ -TEST(TestRarFile, CorruptedFile) -{ - XFILE::CFile *file; - char buf[16]; - memset(&buf, 0, sizeof(buf)); - std::string reffilepath, strpathinrar, str; - CFileItemList itemlist; - unsigned int size, i; - int64_t count = 0; - - reffilepath = XBMC_REF_FILE_PATH("xbmc/filesystem/test/reffile.txt.rar"); - ASSERT_TRUE((file = XBMC_CREATECORRUPTEDFILE(reffilepath, ".rar")) != NULL); - std::cout << "Reference file generated at '" << XBMC_TEMPFILEPATH(file) << "'" << std::endl; - - CURL rarUrl = URIUtils::CreateArchivePath("rar", CURL(XBMC_TEMPFILEPATH(file)), ""); - if (!XFILE::CDirectory::GetDirectory(rarUrl, itemlist, "", - XFILE::DIR_FLAG_NO_FILE_DIRS)) - { - XBMC_DELETETEMPFILE(file); - SUCCEED(); - return; - } - if (itemlist.IsEmpty()) - { - XBMC_DELETETEMPFILE(file); - SUCCEED(); - return; - } - strpathinrar = itemlist[0]->GetPath(); - - if (!file->Open(strpathinrar)) - { - XBMC_DELETETEMPFILE(file); - SUCCEED(); - return; - } - std::cout << "file->GetLength(): " << - testing::PrintToString(file->GetLength()) << std::endl; - std::cout << "file->Seek(file->GetLength() / 2, SEEK_CUR) return value: " << - testing::PrintToString(file->Seek(file->GetLength() / 2, SEEK_CUR)) << std::endl; - std::cout << "file->Seek(0, SEEK_END) return value: " << - testing::PrintToString(file->Seek(0, SEEK_END)) << std::endl; - std::cout << "file->Seek(0, SEEK_SET) return value: " << - testing::PrintToString(file->Seek(0, SEEK_SET)) << std::endl; - std::cout << "File contents:" << std::endl; - while ((size = file->Read(buf, sizeof(buf))) > 0) - { - str = StringUtils::Format(" %08llX", count); - std::cout << str << " "; - count += size; - for (i = 0; i < size; i++) - { - str = StringUtils::Format("%02X ", buf[i]); - std::cout << str; - } - while (i++ < sizeof(buf)) - std::cout << " "; - std::cout << " ["; - for (i = 0; i < size; i++) - { - if (buf[i] >= ' ' && buf[i] <= '~') - std::cout << buf[i]; - else - std::cout << "."; - } - std::cout << "]" << std::endl; - } - file->Close(); - XBMC_DELETETEMPFILE(file); - - // Manual clear to avoid shutdown race - g_RarManager.ClearCache(); -} - -TEST(TestRarFile, StoredRAR) -{ - XFILE::CFile file; - char buf[20]; - memset(&buf, 0, sizeof(buf)); - std::string reffile, strpathinrar; - CFileItemList itemlist, itemlistemptydir; - struct __stat64 stat_buffer; - - reffile = XBMC_REF_FILE_PATH("xbmc/filesystem/test/refRARstored.rar"); - CURL rarUrl = URIUtils::CreateArchivePath("rar", CURL(reffile), ""); - ASSERT_TRUE(XFILE::CDirectory::GetDirectory(rarUrl, itemlist)); - itemlist.Sort(SortByPath, SortOrderAscending); - - /* /reffile.txt */ - /* - * NOTE: Use of Seek gives inconsistent behavior from when seeking through - * an uncompressed RAR archive. See TestRarFile.Read test case. - */ - strpathinrar = itemlist[1]->GetPath(); - ASSERT_TRUE(StringUtils::EndsWith(strpathinrar, "/reffile.txt")); - EXPECT_EQ(0, XFILE::CFile::Stat(strpathinrar, &stat_buffer)); - EXPECT_TRUE((stat_buffer.st_mode & S_IFMT) | S_IFREG); - - ASSERT_TRUE(file.Open(strpathinrar)); - EXPECT_EQ(0, file.GetPosition()); - EXPECT_EQ(1616, file.GetLength()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(20, file.GetPosition()); - EXPECT_TRUE(!memcmp("About\n-----\nXBMC is ", buf, sizeof(buf) - 1)); - EXPECT_TRUE(file.ReadString(buf, sizeof(buf))); - EXPECT_EQ(39, file.GetPosition()); - EXPECT_STREQ("an award-winning fr", buf); - EXPECT_EQ(100, file.Seek(100)); - EXPECT_EQ(100, file.GetPosition()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(120, file.GetPosition()); - EXPECT_TRUE(!memcmp("ent hub for digital ", buf, sizeof(buf) - 1)); - EXPECT_EQ(220, file.Seek(100, SEEK_CUR)); - EXPECT_EQ(220, file.GetPosition()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(240, file.GetPosition()); - EXPECT_TRUE(!memcmp("rs, XBMC is a non-pr", buf, sizeof(buf) - 1)); - EXPECT_EQ(1596, file.Seek(-(int64_t)sizeof(buf), SEEK_END)); - EXPECT_EQ(1596, file.GetPosition()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(1616, file.GetPosition()); - EXPECT_TRUE(!memcmp("multimedia jukebox.\n", buf, sizeof(buf) - 1)); - EXPECT_EQ(-1, file.Seek(100, SEEK_CUR)); - EXPECT_EQ(1616, file.GetPosition()); - EXPECT_EQ(0, file.Seek(0, SEEK_SET)); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(20, file.GetPosition()); - EXPECT_TRUE(!memcmp("About\n-----\nXBMC is ", buf, sizeof(buf) - 1)); - EXPECT_EQ(0, file.Seek(0, SEEK_SET)); - EXPECT_EQ(-100, file.Seek(-100, SEEK_SET)); - file.Close(); - - /* /testsymlink -> testdir/reffile.txt */ - strpathinrar = itemlist[2]->GetPath(); - ASSERT_TRUE(StringUtils::EndsWith(strpathinrar, "/testsymlink")); - EXPECT_EQ(0, XFILE::CFile::Stat(strpathinrar, &stat_buffer)); - EXPECT_TRUE((stat_buffer.st_mode & S_IFMT) | S_IFLNK); - - /* - * FIXME: Reading symlinks in RARs is currently broken. It takes a long time - * to read them and they produce erroneous results. The expected result is - * the target paths of the symlinks. - */ - ASSERT_TRUE(file.Open(strpathinrar)); - EXPECT_EQ(19, file.GetLength()); - file.Close(); - - /* /testsymlinksubdir -> testdir/testsubdir/reffile.txt */ - strpathinrar = itemlist[3]->GetPath(); - ASSERT_TRUE(StringUtils::EndsWith(strpathinrar, "/testsymlinksubdir")); - EXPECT_EQ(0, XFILE::CFile::Stat(strpathinrar, &stat_buffer)); - EXPECT_TRUE((stat_buffer.st_mode & S_IFMT) | S_IFLNK); - - ASSERT_TRUE(file.Open(strpathinrar)); - EXPECT_EQ(30, file.GetLength()); - file.Close(); - - /* /testdir/ */ - strpathinrar = itemlist[0]->GetPath(); - ASSERT_TRUE(StringUtils::EndsWith(strpathinrar, "/testdir/")); - EXPECT_EQ(0, XFILE::CFile::Stat(strpathinrar, &stat_buffer)); - EXPECT_TRUE((stat_buffer.st_mode & S_IFMT) | S_IFDIR); - - itemlist.Clear(); - ASSERT_TRUE(XFILE::CDirectory::GetDirectory(strpathinrar, itemlist)); - itemlist.Sort(SortByPath, SortOrderAscending); - - /* /testdir/reffile.txt */ - strpathinrar = itemlist[1]->GetPath(); - ASSERT_TRUE(StringUtils::EndsWith(strpathinrar, "/testdir/reffile.txt")); - EXPECT_EQ(0, XFILE::CFile::Stat(strpathinrar, &stat_buffer)); - EXPECT_TRUE((stat_buffer.st_mode & S_IFMT) | S_IFREG); - - ASSERT_TRUE(file.Open(strpathinrar)); - EXPECT_EQ(0, file.GetPosition()); - EXPECT_EQ(1616, file.GetLength()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(20, file.GetPosition()); - EXPECT_TRUE(!memcmp("About\n-----\nXBMC is ", buf, sizeof(buf) - 1)); - EXPECT_TRUE(file.ReadString(buf, sizeof(buf))); - EXPECT_EQ(39, file.GetPosition()); - EXPECT_STREQ("an award-winning fr", buf); - EXPECT_EQ(100, file.Seek(100)); - EXPECT_EQ(100, file.GetPosition()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(120, file.GetPosition()); - EXPECT_TRUE(!memcmp("ent hub for digital ", buf, sizeof(buf) - 1)); - EXPECT_EQ(220, file.Seek(100, SEEK_CUR)); - EXPECT_EQ(220, file.GetPosition()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(240, file.GetPosition()); - EXPECT_TRUE(!memcmp("rs, XBMC is a non-pr", buf, sizeof(buf) - 1)); - EXPECT_EQ(1596, file.Seek(-(int64_t)sizeof(buf), SEEK_END)); - EXPECT_EQ(1596, file.GetPosition()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(1616, file.GetPosition()); - EXPECT_TRUE(!memcmp("multimedia jukebox.\n", buf, sizeof(buf) - 1)); - EXPECT_EQ(-1, file.Seek(100, SEEK_CUR)); - EXPECT_EQ(1616, file.GetPosition()); - EXPECT_EQ(0, file.Seek(0, SEEK_SET)); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(20, file.GetPosition()); - EXPECT_TRUE(!memcmp("About\n-----\nXBMC is ", buf, sizeof(buf) - 1)); - EXPECT_EQ(0, file.Seek(0, SEEK_SET)); - EXPECT_EQ(-100, file.Seek(-100, SEEK_SET)); - file.Close(); - - /* /testdir/testemptysubdir */ - strpathinrar = itemlist[2]->GetPath(); - ASSERT_TRUE(StringUtils::EndsWith(strpathinrar, "/testdir/testemptysubdir")); - //! @todo Should this set the itemlist to an empty list instead? - EXPECT_FALSE(XFILE::CDirectory::GetDirectory(strpathinrar, itemlistemptydir)); - EXPECT_EQ(0, XFILE::CFile::Stat(strpathinrar, &stat_buffer)); - EXPECT_TRUE((stat_buffer.st_mode & S_IFMT) | S_IFDIR); - - //! @todo FIXME: This directory appears a second time as a file - strpathinrar = itemlist[3]->GetPath(); - ASSERT_TRUE(StringUtils::EndsWith(strpathinrar, "/testdir/testsubdir")); - - /* /testdir/testsymlink -> testsubdir/reffile.txt */ - strpathinrar = itemlist[4]->GetPath(); - ASSERT_TRUE(StringUtils::EndsWith(strpathinrar, "/testdir/testsymlink")); - EXPECT_EQ(0, XFILE::CFile::Stat(strpathinrar, &stat_buffer)); - EXPECT_TRUE((stat_buffer.st_mode & S_IFMT) | S_IFLNK); - - ASSERT_TRUE(file.Open(strpathinrar)); - EXPECT_EQ(22, file.GetLength()); - file.Close(); - - /* /testdir/testsubdir/ */ - strpathinrar = itemlist[0]->GetPath(); - ASSERT_TRUE(StringUtils::EndsWith(strpathinrar, "/testdir/testsubdir/")); - EXPECT_EQ(0, XFILE::CFile::Stat(strpathinrar, &stat_buffer)); - EXPECT_TRUE((stat_buffer.st_mode & S_IFMT) | S_IFDIR); - - itemlist.Clear(); - ASSERT_TRUE(XFILE::CDirectory::GetDirectory(strpathinrar, itemlist)); - itemlist.Sort(SortByPath, SortOrderAscending); - - /* /testdir/testsubdir/reffile.txt */ - strpathinrar = itemlist[0]->GetPath(); - ASSERT_TRUE(StringUtils::EndsWith(strpathinrar, - "/testdir/testsubdir/reffile.txt")); - EXPECT_EQ(0, XFILE::CFile::Stat(strpathinrar, &stat_buffer)); - EXPECT_TRUE((stat_buffer.st_mode & S_IFMT) | S_IFREG); - - ASSERT_TRUE(file.Open(strpathinrar)); - EXPECT_EQ(0, file.GetPosition()); - EXPECT_EQ(1616, file.GetLength()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(20, file.GetPosition()); - EXPECT_TRUE(!memcmp("About\n-----\nXBMC is ", buf, sizeof(buf) - 1)); - EXPECT_TRUE(file.ReadString(buf, sizeof(buf))); - EXPECT_EQ(39, file.GetPosition()); - EXPECT_STREQ("an award-winning fr", buf); - EXPECT_EQ(100, file.Seek(100)); - EXPECT_EQ(100, file.GetPosition()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(120, file.GetPosition()); - EXPECT_TRUE(!memcmp("ent hub for digital ", buf, sizeof(buf) - 1)); - EXPECT_EQ(220, file.Seek(100, SEEK_CUR)); - EXPECT_EQ(220, file.GetPosition()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(240, file.GetPosition()); - EXPECT_TRUE(!memcmp("rs, XBMC is a non-pr", buf, sizeof(buf) - 1)); - EXPECT_EQ(1596, file.Seek(-(int64_t)sizeof(buf), SEEK_END)); - EXPECT_EQ(1596, file.GetPosition()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(1616, file.GetPosition()); - EXPECT_TRUE(!memcmp("multimedia jukebox.\n", buf, sizeof(buf) - 1)); - EXPECT_EQ(-1, file.Seek(100, SEEK_CUR)); - EXPECT_EQ(1616, file.GetPosition()); - EXPECT_EQ(0, file.Seek(0, SEEK_SET)); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(20, file.GetPosition()); - EXPECT_TRUE(!memcmp("About\n-----\nXBMC is ", buf, sizeof(buf) - 1)); - EXPECT_EQ(0, file.Seek(0, SEEK_SET)); - EXPECT_EQ(-100, file.Seek(-100, SEEK_SET)); - file.Close(); -} - -TEST(TestRarFile, NormalRAR) -{ - XFILE::CFile file; - char buf[20]; - memset(&buf, 0, sizeof(buf)); - std::string reffile, strpathinrar; - CFileItemList itemlist, itemlistemptydir; - struct __stat64 stat_buffer; - - reffile = XBMC_REF_FILE_PATH("xbmc/filesystem/test/refRARnormal.rar"); - CURL rarUrl = URIUtils::CreateArchivePath("rar", CURL(reffile), ""); - ASSERT_TRUE(XFILE::CDirectory::GetDirectory(rarUrl, itemlist)); - itemlist.Sort(SortByPath, SortOrderAscending); - - /* /reffile.txt */ - strpathinrar = itemlist[1]->GetPath(); - ASSERT_TRUE(StringUtils::EndsWith(strpathinrar, "/reffile.txt")); - EXPECT_EQ(0, XFILE::CFile::Stat(strpathinrar, &stat_buffer)); - EXPECT_TRUE((stat_buffer.st_mode & S_IFMT) | S_IFREG); - - ASSERT_TRUE(file.Open(strpathinrar)); - EXPECT_EQ(0, file.GetPosition()); - EXPECT_EQ(1616, file.GetLength()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(20, file.GetPosition()); - EXPECT_TRUE(!memcmp("About\n-----\nXBMC is ", buf, sizeof(buf) - 1)); - EXPECT_TRUE(file.ReadString(buf, sizeof(buf))); - EXPECT_EQ(39, file.GetPosition()); - EXPECT_STREQ("an award-winning fr", buf); - EXPECT_EQ(100, file.Seek(100)); - EXPECT_EQ(100, file.GetPosition()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(120, file.GetPosition()); - EXPECT_TRUE(!memcmp("ent hub for digital ", buf, sizeof(buf) - 1)); - EXPECT_EQ(220, file.Seek(100, SEEK_CUR)); - EXPECT_EQ(220, file.GetPosition()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(240, file.GetPosition()); - EXPECT_TRUE(!memcmp("rs, XBMC is a non-pr", buf, sizeof(buf) - 1)); - EXPECT_EQ(1596, file.Seek(-(int64_t)sizeof(buf), SEEK_END)); - EXPECT_EQ(1596, file.GetPosition()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(1616, file.GetPosition()); - EXPECT_TRUE(!memcmp("multimedia jukebox.\n", buf, sizeof(buf) - 1)); - EXPECT_EQ(1716, file.Seek(100, SEEK_CUR)); - EXPECT_EQ(1716, file.GetPosition()); - EXPECT_EQ(0, file.Seek(0, SEEK_SET)); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(20, file.GetPosition()); - EXPECT_TRUE(!memcmp("About\n-----\nXBMC is ", buf, sizeof(buf) - 1)); - EXPECT_EQ(0, file.Seek(0, SEEK_SET)); - EXPECT_EQ(-1, file.Seek(-100, SEEK_SET)); - file.Close(); - - /* /testsymlink -> testdir/reffile.txt */ - strpathinrar = itemlist[2]->GetPath(); - ASSERT_TRUE(StringUtils::EndsWith(strpathinrar, "/testsymlink")); - EXPECT_EQ(0, XFILE::CFile::Stat(strpathinrar, &stat_buffer)); - EXPECT_TRUE((stat_buffer.st_mode & S_IFMT) | S_IFLNK); - - /* - * FIXME: Reading symlinks in RARs is currently broken. It takes a long time - * to read them and they produce erroneous results. The expected result is - * the target paths of the symlinks. - */ - ASSERT_TRUE(file.Open(strpathinrar)); - EXPECT_EQ(19, file.GetLength()); - file.Close(); - - /* /testsymlinksubdir -> testdir/testsubdir/reffile.txt */ - strpathinrar = itemlist[3]->GetPath(); - ASSERT_TRUE(StringUtils::EndsWith(strpathinrar, "/testsymlinksubdir")); - EXPECT_EQ(0, XFILE::CFile::Stat(strpathinrar, &stat_buffer)); - EXPECT_TRUE((stat_buffer.st_mode & S_IFMT) | S_IFLNK); - - ASSERT_TRUE(file.Open(strpathinrar)); - EXPECT_EQ(30, file.GetLength()); - file.Close(); - - /* /testdir/ */ - strpathinrar = itemlist[0]->GetPath(); - ASSERT_TRUE(StringUtils::EndsWith(strpathinrar, "/testdir/")); - EXPECT_EQ(0, XFILE::CFile::Stat(strpathinrar, &stat_buffer)); - EXPECT_TRUE((stat_buffer.st_mode & S_IFMT) | S_IFDIR); - - itemlist.Clear(); - ASSERT_TRUE(XFILE::CDirectory::GetDirectory(strpathinrar, itemlist)); - itemlist.Sort(SortByPath, SortOrderAscending); - - /* /testdir/reffile.txt */ - strpathinrar = itemlist[1]->GetPath(); - ASSERT_TRUE(StringUtils::EndsWith(strpathinrar, "/testdir/reffile.txt")); - EXPECT_EQ(0, XFILE::CFile::Stat(strpathinrar, &stat_buffer)); - EXPECT_TRUE((stat_buffer.st_mode & S_IFMT) | S_IFREG); - - ASSERT_TRUE(file.Open(strpathinrar)); - EXPECT_EQ(0, file.GetPosition()); - EXPECT_EQ(1616, file.GetLength()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(20, file.GetPosition()); - EXPECT_TRUE(!memcmp("About\n-----\nXBMC is ", buf, sizeof(buf) - 1)); - EXPECT_TRUE(file.ReadString(buf, sizeof(buf))); - EXPECT_EQ(39, file.GetPosition()); - EXPECT_STREQ("an award-winning fr", buf); - EXPECT_EQ(100, file.Seek(100)); - EXPECT_EQ(100, file.GetPosition()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(120, file.GetPosition()); - EXPECT_TRUE(!memcmp("ent hub for digital ", buf, sizeof(buf) - 1)); - EXPECT_EQ(220, file.Seek(100, SEEK_CUR)); - EXPECT_EQ(220, file.GetPosition()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(240, file.GetPosition()); - EXPECT_TRUE(!memcmp("rs, XBMC is a non-pr", buf, sizeof(buf) - 1)); - EXPECT_EQ(1596, file.Seek(-(int64_t)sizeof(buf), SEEK_END)); - EXPECT_EQ(1596, file.GetPosition()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(1616, file.GetPosition()); - EXPECT_TRUE(!memcmp("multimedia jukebox.\n", buf, sizeof(buf) - 1)); - EXPECT_EQ(1716, file.Seek(100, SEEK_CUR)); - EXPECT_EQ(1716, file.GetPosition()); - EXPECT_EQ(0, file.Seek(0, SEEK_SET)); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(20, file.GetPosition()); - EXPECT_TRUE(!memcmp("About\n-----\nXBMC is ", buf, sizeof(buf) - 1)); - EXPECT_EQ(0, file.Seek(0, SEEK_SET)); - EXPECT_EQ(-1, file.Seek(-100, SEEK_SET)); - file.Close(); - - /* /testdir/testemptysubdir */ - strpathinrar = itemlist[2]->GetPath(); - ASSERT_TRUE(StringUtils::EndsWith(strpathinrar, "/testdir/testemptysubdir")); - /* @todo Should this set the itemlist to an empty list instead? */ - EXPECT_FALSE(XFILE::CDirectory::GetDirectory(strpathinrar, itemlistemptydir)); - EXPECT_EQ(0, XFILE::CFile::Stat(strpathinrar, &stat_buffer)); - EXPECT_TRUE((stat_buffer.st_mode & S_IFMT) | S_IFDIR); - - /* FIXME: This directory appears a second time as a file */ - strpathinrar = itemlist[3]->GetPath(); - ASSERT_TRUE(StringUtils::EndsWith(strpathinrar, "/testdir/testsubdir")); - - /* /testdir/testsymlink -> testsubdir/reffile.txt */ - strpathinrar = itemlist[4]->GetPath(); - ASSERT_TRUE(StringUtils::EndsWith(strpathinrar, "/testdir/testsymlink")); - EXPECT_EQ(0, XFILE::CFile::Stat(strpathinrar, &stat_buffer)); - EXPECT_TRUE((stat_buffer.st_mode & S_IFMT) | S_IFLNK); - - ASSERT_TRUE(file.Open(strpathinrar)); - EXPECT_EQ(22, file.GetLength()); - file.Close(); - - /* /testdir/testsubdir/ */ - strpathinrar = itemlist[0]->GetPath(); - ASSERT_TRUE(StringUtils::EndsWith(strpathinrar, "/testdir/testsubdir/")); - EXPECT_EQ(0, XFILE::CFile::Stat(strpathinrar, &stat_buffer)); - EXPECT_TRUE((stat_buffer.st_mode & S_IFMT) | S_IFDIR); - - itemlist.Clear(); - ASSERT_TRUE(XFILE::CDirectory::GetDirectory(strpathinrar, itemlist)); - itemlist.Sort(SortByPath, SortOrderAscending); - - /* /testdir/testsubdir/reffile.txt */ - strpathinrar = itemlist[0]->GetPath(); - ASSERT_TRUE(StringUtils::EndsWith(strpathinrar, - "/testdir/testsubdir/reffile.txt")); - EXPECT_EQ(0, XFILE::CFile::Stat(strpathinrar, &stat_buffer)); - EXPECT_TRUE((stat_buffer.st_mode & S_IFMT) | S_IFREG); - - ASSERT_TRUE(file.Open(strpathinrar)); - EXPECT_EQ(0, file.GetPosition()); - EXPECT_EQ(1616, file.GetLength()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(20, file.GetPosition()); - EXPECT_TRUE(!memcmp("About\n-----\nXBMC is ", buf, sizeof(buf) - 1)); - EXPECT_TRUE(file.ReadString(buf, sizeof(buf))); - EXPECT_EQ(39, file.GetPosition()); - EXPECT_STREQ("an award-winning fr", buf); - EXPECT_EQ(100, file.Seek(100)); - EXPECT_EQ(100, file.GetPosition()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(120, file.GetPosition()); - EXPECT_TRUE(!memcmp("ent hub for digital ", buf, sizeof(buf) - 1)); - EXPECT_EQ(220, file.Seek(100, SEEK_CUR)); - EXPECT_EQ(220, file.GetPosition()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(240, file.GetPosition()); - EXPECT_TRUE(!memcmp("rs, XBMC is a non-pr", buf, sizeof(buf) - 1)); - EXPECT_EQ(1596, file.Seek(-(int64_t)sizeof(buf), SEEK_END)); - EXPECT_EQ(1596, file.GetPosition()); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(1616, file.GetPosition()); - EXPECT_TRUE(!memcmp("multimedia jukebox.\n", buf, sizeof(buf) - 1)); - EXPECT_EQ(1716, file.Seek(100, SEEK_CUR)); - EXPECT_EQ(1716, file.GetPosition()); - EXPECT_EQ(0, file.Seek(0, SEEK_SET)); - EXPECT_EQ(sizeof(buf), file.Read(buf, sizeof(buf))); - file.Flush(); - EXPECT_EQ(20, file.GetPosition()); - EXPECT_TRUE(!memcmp("About\n-----\nXBMC is ", buf, sizeof(buf) - 1)); - EXPECT_EQ(0, file.Seek(0, SEEK_SET)); - EXPECT_EQ(-1, file.Seek(-100, SEEK_SET)); - file.Close(); - - // Manual clear to avoid shutdown race - g_RarManager.ClearCache(); -} -#endif /*HAS_FILESYSTEM_RAR*/ diff --git a/xbmc/interfaces/builtins/ApplicationBuiltins.cpp b/xbmc/interfaces/builtins/ApplicationBuiltins.cpp index 2ea99d19fc..1e05ad04ed 100644 --- a/xbmc/interfaces/builtins/ApplicationBuiltins.cpp +++ b/xbmc/interfaces/builtins/ApplicationBuiltins.cpp @@ -22,9 +22,6 @@ #include "Application.h" #include "ServiceBroker.h" -#ifdef HAS_FILESYSTEM_RAR -#include "filesystem/RarManager.h" -#endif #include "filesystem/ZipManager.h" #include "messaging/ApplicationMessenger.h" #include "input/Key.h" @@ -61,10 +58,6 @@ static int Extract(const std::vector<std::string>& params) if (URIUtils::IsZIP(params[0])) g_ZipManager.ExtractArchive(params[0],strDestDirect); -#ifdef HAS_FILESYSTEM_RAR - else if (URIUtils::IsRAR(params[0])) - g_RarManager.ExtractArchive(params[0],strDestDirect); -#endif else CLog::Log(LOGERROR, "Extract, No archive given"); diff --git a/xbmc/interfaces/builtins/PlayerBuiltins.cpp b/xbmc/interfaces/builtins/PlayerBuiltins.cpp index 9464dea60b..8c482e7ed7 100644 --- a/xbmc/interfaces/builtins/PlayerBuiltins.cpp +++ b/xbmc/interfaces/builtins/PlayerBuiltins.cpp @@ -470,28 +470,10 @@ static int PlayMedia(const std::vector<std::string>& params) g_playlistPlayer.SetCurrentPlaylist(playlist); g_playlistPlayer.Play(playOffset, ""); } + else if (item.IsAudio() || item.IsVideo()) + g_playlistPlayer.Play(std::make_shared<CFileItem>(item), ""); else - { - int playlist = PLAYLIST_NONE; - - if (item.IsAudio()) - playlist = PLAYLIST_MUSIC; - else if (item.IsVideo()) - playlist = PLAYLIST_VIDEO; - - if (playlist != PLAYLIST_NONE) - { - g_playlistPlayer.ClearPlaylist(playlist); - g_playlistPlayer.SetCurrentPlaylist(playlist); - } - - // play media - if (!g_application.PlayMedia(item, "", playlist)) - { - CLog::Log(LOGERROR, "PlayMedia could not play media: %s", params[0].c_str()); - return false; - } - } + g_application.PlayMedia(item, "", PLAYLIST_NONE); return 0; } diff --git a/xbmc/music/windows/GUIWindowMusicBase.cpp b/xbmc/music/windows/GUIWindowMusicBase.cpp index 7ae846cf4f..318ce89243 100644 --- a/xbmc/music/windows/GUIWindowMusicBase.cpp +++ b/xbmc/music/windows/GUIWindowMusicBase.cpp @@ -1102,11 +1102,7 @@ bool CGUIWindowMusicBase::OnPlayMedia(int iItem, const std::string &player) OnQueueItem(iItem); return true; } - g_playlistPlayer.Reset(); - g_playlistPlayer.ClearPlaylist(PLAYLIST_MUSIC); - g_playlistPlayer.Add(PLAYLIST_MUSIC, pItem); - g_playlistPlayer.SetCurrentPlaylist(PLAYLIST_MUSIC); - g_playlistPlayer.Play(); + g_playlistPlayer.Play(pItem, player); return true; } return CGUIMediaWindow::OnPlayMedia(iItem, player); diff --git a/xbmc/playlists/SmartPlayList.cpp b/xbmc/playlists/SmartPlayList.cpp index 0c098d5345..5033834891 100644 --- a/xbmc/playlists/SmartPlayList.cpp +++ b/xbmc/playlists/SmartPlayList.cpp @@ -72,6 +72,7 @@ static const translateField fields[] = { { "label", FieldMusicLabel, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21899 }, { "title", FieldTitle, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 556 }, { "sorttitle", FieldSortTitle, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 171 }, + { "originaltitle", FieldOriginalTitle, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 20376 }, { "year", FieldYear, CDatabaseQueryRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, true, 562 }, { "time", FieldTime, CDatabaseQueryRule::SECONDS_FIELD, StringValidation::IsTime, false, 180 }, { "playcount", FieldPlaycount, CDatabaseQueryRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 567 }, @@ -289,6 +290,7 @@ std::vector<Field> CSmartPlaylistRule::GetFields(const std::string &type) fields.push_back(FieldArtist); fields.push_back(FieldAlbumArtist); fields.push_back(FieldTitle); + fields.push_back(FieldOriginalTitle); fields.push_back(FieldYear); fields.push_back(FieldTime); fields.push_back(FieldTrackNumber); @@ -354,6 +356,7 @@ std::vector<Field> CSmartPlaylistRule::GetFields(const std::string &type) else if (type == "tvshows") { fields.push_back(FieldTitle); + fields.push_back(FieldOriginalTitle); fields.push_back(FieldPlot); fields.push_back(FieldTvShowStatus); fields.push_back(FieldVotes); @@ -378,6 +381,7 @@ std::vector<Field> CSmartPlaylistRule::GetFields(const std::string &type) { fields.push_back(FieldTitle); fields.push_back(FieldTvShowTitle); + fields.push_back(FieldOriginalTitle); fields.push_back(FieldPlot); fields.push_back(FieldVotes); fields.push_back(FieldRating); @@ -405,6 +409,7 @@ std::vector<Field> CSmartPlaylistRule::GetFields(const std::string &type) else if (type == "movies") { fields.push_back(FieldTitle); + fields.push_back(FieldOriginalTitle); fields.push_back(FieldPlot); fields.push_back(FieldPlotOutline); fields.push_back(FieldTagline); @@ -467,7 +472,7 @@ std::vector<Field> CSmartPlaylistRule::GetFields(const std::string &type) } fields.push_back(FieldPlaylist); fields.push_back(FieldVirtualFolder); - + return fields; } @@ -599,7 +604,7 @@ std::vector<SortBy> CSmartPlaylistRule::GetOrders(const std::string &type) orders.push_back(SortByDateAdded); } orders.push_back(SortByRandom); - + return orders; } @@ -952,7 +957,7 @@ std::string CSmartPlaylistRule::GetField(int field, const std::string &type) con std::string CSmartPlaylistRuleCombination::GetWhereClause(const CDatabase &db, const std::string& strType, std::set<std::string> &referencedPlaylists) const { std::string rule; - + // translate the combinations into SQL for (CDatabaseQueryRuleCombinations::const_iterator it = m_combinations.begin(); it != m_combinations.end(); ++it) { diff --git a/xbmc/pvr/PVRActionListener.cpp b/xbmc/pvr/PVRActionListener.cpp index 9efa5d6eb9..4a52ee239f 100644 --- a/xbmc/pvr/PVRActionListener.cpp +++ b/xbmc/pvr/PVRActionListener.cpp @@ -47,6 +47,7 @@ CPVRActionListener::CPVRActionListener() CSettings::SETTING_PVRMANAGER_CHANNELSCAN, CSettings::SETTING_PVRMENU_SEARCHICONS, CSettings::SETTING_PVRCLIENT_MENUHOOK, + CSettings::SETTING_EPG_DAYSTODISPLAY }); } @@ -119,8 +120,8 @@ bool CPVRActionListener::OnAction(const CAction &action) int iRemote = bIsJumpSMS ? action.GetID() - (ACTION_JUMP_SMS2 - REMOTE_2) : action.GetID(); CServiceBroker::GetPVRManager().GUIActions()->GetChannelNumberInputHandler().AppendChannelNumberDigit(iRemote - REMOTE_0); + return true; } - return true; } break; } @@ -146,6 +147,10 @@ void CPVRActionListener::OnSettingChanged(const CSetting *setting) dynamic_cast<CSettingBool*>(const_cast<CSetting*>(setting))->SetValue(false); } } + else if (settingId == CSettings::SETTING_EPG_DAYSTODISPLAY) + { + CServiceBroker::GetPVRManager().Clients()->SetEPGTimeFrame(static_cast<const CSettingInt*>(setting)->GetValue()); + } } void CPVRActionListener::OnSettingAction(const CSetting *setting) diff --git a/xbmc/pvr/PVRGUIActions.cpp b/xbmc/pvr/PVRGUIActions.cpp index d5df12d89f..26d44b0753 100644 --- a/xbmc/pvr/PVRGUIActions.cpp +++ b/xbmc/pvr/PVRGUIActions.cpp @@ -128,7 +128,15 @@ namespace PVR }; CPVRGUIActions::CPVRGUIActions() - : m_bChannelScanRunning(false) + : m_bChannelScanRunning(false), + m_settings({ + CSettings::SETTING_PVRRECORD_INSTANTRECORDTIME, + CSettings::SETTING_PVRRECORD_INSTANTRECORDACTION, + CSettings::SETTING_PVRPLAYBACK_SWITCHTOFULLSCREEN, + CSettings::SETTING_PVRPLAYBACK_STARTLAST, + CSettings::SETTING_PVRPARENTAL_PIN, + CSettings::SETTING_PVRPARENTAL_ENABLED + }) { } @@ -336,7 +344,7 @@ namespace PVR class InstantRecordingActionSelector { public: - InstantRecordingActionSelector(); + InstantRecordingActionSelector(int iInstantRecordTime); virtual ~InstantRecordingActionSelector() {} void AddAction(PVRRECORD_INSTANTRECORDACTION eAction, const std::string &title); @@ -344,12 +352,14 @@ namespace PVR PVRRECORD_INSTANTRECORDACTION Select(); private: + int m_iInstantRecordTime; CGUIDialogSelect *m_pDlgSelect; // not owner! std::map<PVRRECORD_INSTANTRECORDACTION, int> m_actions; }; - InstantRecordingActionSelector::InstantRecordingActionSelector() - : m_pDlgSelect(g_windowManager.GetWindow<CGUIDialogSelect>()) + InstantRecordingActionSelector::InstantRecordingActionSelector(int iInstantRecordTime) + : m_iInstantRecordTime(iInstantRecordTime), + m_pDlgSelect(g_windowManager.GetWindow<CGUIDialogSelect>()) { if (m_pDlgSelect) { @@ -369,8 +379,7 @@ namespace PVR switch (eAction) { case RECORD_INSTANTRECORDTIME: - m_pDlgSelect->Add(StringUtils::Format(g_localizeStrings.Get(19090).c_str(), - CServiceBroker::GetSettings().GetInt(CSettings::SETTING_PVRRECORD_INSTANTRECORDTIME))); // Record next <default duration> minutes + m_pDlgSelect->Add(StringUtils::Format(g_localizeStrings.Get(19090).c_str(), m_iInstantRecordTime)); // Record next <default duration> minutes break; case RECORD_30_MINUTES: m_pDlgSelect->Add(StringUtils::Format(g_localizeStrings.Get(19090).c_str(), 30)); // Record next 30 minutes @@ -444,9 +453,9 @@ namespace PVR if (bOnOff && !channel->IsRecording()) { CEpgInfoTagPtr epgTag; - int iDuration = CServiceBroker::GetSettings().GetInt(CSettings::SETTING_PVRRECORD_INSTANTRECORDTIME); + int iDuration = m_settings.GetIntValue(CSettings::SETTING_PVRRECORD_INSTANTRECORDTIME); - int iAction = CServiceBroker::GetSettings().GetInt(CSettings::SETTING_PVRRECORD_INSTANTRECORDACTION); + int iAction = m_settings.GetIntValue(CSettings::SETTING_PVRRECORD_INSTANTRECORDACTION); switch (iAction) { case RECORD_CURRENT_SHOW: @@ -460,7 +469,8 @@ namespace PVR case ASK: { PVRRECORD_INSTANTRECORDACTION ePreselect = RECORD_INSTANTRECORDTIME; - InstantRecordingActionSelector selector; + const int iDurationDefault = m_settings.GetIntValue(CSettings::SETTING_PVRRECORD_INSTANTRECORDTIME); + InstantRecordingActionSelector selector(iDurationDefault); CEpgInfoTagPtr epgTagNext; // fixed length recordings @@ -468,7 +478,6 @@ namespace PVR selector.AddAction(RECORD_60_MINUTES, ""); selector.AddAction(RECORD_120_MINUTES, ""); - const int iDurationDefault = CServiceBroker::GetSettings().GetInt(CSettings::SETTING_PVRRECORD_INSTANTRECORDTIME); if (iDurationDefault != 30 && iDurationDefault != 60 && iDurationDefault != 120) selector.AddAction(RECORD_INSTANTRECORDTIME, ""); @@ -528,7 +537,7 @@ namespace PVR break; default: - CLog::Log(LOGERROR, "PVRManager - %s - unknown instant record action selection (%d), defaulting to fixed length recording.", __FUNCTION__, eSelected); + CLog::Log(LOGERROR, "PVRGUIActions - %s - unknown instant record action selection (%d), defaulting to fixed length recording.", __FUNCTION__, eSelected); epgTag.reset(); break; } @@ -536,7 +545,7 @@ namespace PVR } default: - CLog::Log(LOGERROR, "PVRManager - %s - unknown instant record action setting value (%d), defaulting to fixed length recording.", __FUNCTION__, iAction); + CLog::Log(LOGERROR, "PVRGUIActions - %s - unknown instant record action setting value (%d), defaulting to fixed length recording.", __FUNCTION__, iAction); break; } @@ -1001,7 +1010,7 @@ namespace PVR bool CPVRGUIActions::SwitchToChannel(const CFileItemPtr &item, bool bCheckResume) const { - return SwitchToChannel(item, bCheckResume, CServiceBroker::GetSettings().GetBool(CSettings::SETTING_PVRPLAYBACK_SWITCHTOFULLSCREEN)); + return SwitchToChannel(item, bCheckResume, m_settings.GetBoolValue(CSettings::SETTING_PVRPLAYBACK_SWITCHTOFULLSCREEN)); } bool CPVRGUIActions::SwitchToChannel(const CFileItemPtr &item, bool bCheckResume, bool bFullscreen) const @@ -1141,7 +1150,7 @@ namespace PVR channel->SetWasPlayingOnLastQuit(false, bWasPlaying); } - int iPlayMode = CServiceBroker::GetSettings().GetInt(CSettings::SETTING_PVRPLAYBACK_STARTLAST); + int iPlayMode = m_settings.GetIntValue(CSettings::SETTING_PVRPLAYBACK_STARTLAST); if (iPlayMode == CONTINUE_LAST_CHANNEL_OFF) return false; @@ -1515,9 +1524,9 @@ namespace PVR bool CPVRGUIActions::CheckParentalPIN() const { - std::string pinCode = CServiceBroker::GetSettings().GetString(CSettings::SETTING_PVRPARENTAL_PIN); + std::string pinCode = m_settings.GetStringValue(CSettings::SETTING_PVRPARENTAL_PIN); - if (!CServiceBroker::GetSettings().GetBool(CSettings::SETTING_PVRPARENTAL_ENABLED) || pinCode.empty()) + if (!m_settings.GetBoolValue(CSettings::SETTING_PVRPARENTAL_ENABLED) || pinCode.empty()) return true; // Locked channel. Enter PIN: diff --git a/xbmc/pvr/PVRGUIActions.h b/xbmc/pvr/PVRGUIActions.h index dd56cbbbb2..9d4e984530 100644 --- a/xbmc/pvr/PVRGUIActions.h +++ b/xbmc/pvr/PVRGUIActions.h @@ -19,6 +19,7 @@ * */ +#include "pvr/PVRSettings.h" #include "pvr/PVRTypes.h" #include "pvr/PVRChannelNumberInputHandler.h" @@ -415,6 +416,7 @@ namespace PVR private: CPVRChannelSwitchingInputHandler m_channelNumberInputHandler; bool m_bChannelScanRunning; + CPVRSettings m_settings; }; diff --git a/xbmc/pvr/PVRManager.cpp b/xbmc/pvr/PVRManager.cpp index 445cd295a9..d9ce3a35bf 100644 --- a/xbmc/pvr/PVRManager.cpp +++ b/xbmc/pvr/PVRManager.cpp @@ -49,8 +49,6 @@ #include "pvr/recordings/PVRRecordingsPath.h" #include "pvr/timers/PVRTimers.h" #include "pvr/windows/GUIWindowPVRBase.h" -#include "settings/lib/Setting.h" -#include "settings/MediaSettings.h" #include "settings/Settings.h" #include "threads/SingleLock.h" #include "threads/SystemClock.h" @@ -161,15 +159,22 @@ CPVRManager::CPVRManager(void) : m_progressHandle(nullptr), m_managerState(ManagerStateStopped), m_isChannelPreview(false), - m_bSettingPowerManagementEnabled(CServiceBroker::GetSettings().GetBool(CSettings::SETTING_PVRPOWERMANAGEMENT_ENABLED)), - m_strSettingWakeupCommand(CServiceBroker::GetSettings().GetString(CSettings::SETTING_PVRPOWERMANAGEMENT_SETWAKEUPCMD)) + m_settings({ + CSettings::SETTING_PVRPOWERMANAGEMENT_ENABLED, + CSettings::SETTING_PVRPOWERMANAGEMENT_SETWAKEUPCMD, + CSettings::SETTING_PVRPARENTAL_ENABLED, + CSettings::SETTING_PVRPARENTAL_DURATION, + CSettings::SETTING_EPG_HIDENOINFOAVAILABLE, + CSettings::SETTING_PVRPLAYBACK_CHANNELENTRYTIMEOUT, + CSettings::SETTING_PVRPOWERMANAGEMENT_DAILYWAKEUPTIME, + CSettings::SETTING_PVRPOWERMANAGEMENT_BACKENDIDLETIME + }) { CAnnouncementManager::GetInstance().AddAnnouncer(this); } CPVRManager::~CPVRManager(void) { - CServiceBroker::GetSettings().UnregisterCallback(this); CAnnouncementManager::GetInstance().RemoveAnnouncer(this); CLog::Log(LOGDEBUG,"PVRManager - destroyed"); } @@ -228,28 +233,6 @@ CPVRClientsPtr CPVRManager::Clients(void) const return m_addons; } -void CPVRManager::OnSettingChanged(const CSetting *setting) -{ - if (setting == nullptr) - return; - - const std::string &settingId = setting->GetId(); - if (settingId == CSettings::SETTING_EPG_DAYSTODISPLAY) - { - m_addons->SetEPGTimeFrame(static_cast<const CSettingInt*>(setting)->GetValue()); - } - else if (settingId == CSettings::SETTING_PVRPOWERMANAGEMENT_ENABLED) - { - CSingleLock lock(m_critSection); - m_bSettingPowerManagementEnabled = static_cast<const CSettingBool*>(setting)->GetValue(); - } - else if (settingId == CSettings::SETTING_PVRPOWERMANAGEMENT_SETWAKEUPCMD) - { - CSingleLock lock(m_critSection); - m_strSettingWakeupCommand = static_cast<const CSettingString*>(setting)->GetValue(); - } -} - CPVRGUIActionsPtr CPVRManager::GUIActions(void) const { // note: m_guiActions is const (only set/reset in ctor/dtor). no need for a lock here. @@ -291,12 +274,6 @@ void CPVRManager::ResetProperties(void) void CPVRManager::Init() { - std::set<std::string> settingSet; - settingSet.insert(CSettings::SETTING_EPG_DAYSTODISPLAY); - settingSet.insert(CSettings::SETTING_PVRPOWERMANAGEMENT_ENABLED); - settingSet.insert(CSettings::SETTING_PVRPOWERMANAGEMENT_SETWAKEUPCMD); - CServiceBroker::GetSettings().RegisterCallback(this, settingSet); - // Note: we're holding the progress bar dialog instance pointer in a member because it is needed by pvr core // components. The latter might run in a different thread than the gui and g_windowManager.GetWindow() // locks the global graphics mutex, which easily can lead to deadlocks. @@ -526,19 +503,11 @@ void CPVRManager::Process(void) bool CPVRManager::SetWakeupCommand(void) { - bool bSettingPowerManagementEnabled; - std::string strSettingWakeupCommand; - - { - CSingleLock lock(m_critSection); - bSettingPowerManagementEnabled = m_bSettingPowerManagementEnabled; - strSettingWakeupCommand = m_strSettingWakeupCommand; - } - - if (!bSettingPowerManagementEnabled) + if (!m_settings.GetBoolValue(CSettings::SETTING_PVRPOWERMANAGEMENT_ENABLED)) return false; - if (!strSettingWakeupCommand.empty() && m_timers) + const std::string strWakeupCommand(m_settings.GetStringValue(CSettings::SETTING_PVRPOWERMANAGEMENT_SETWAKEUPCMD)); + if (!strWakeupCommand.empty() && m_timers) { time_t iWakeupTime; const CDateTime nextEvent = m_timers->GetNextEventTime(); @@ -546,7 +515,7 @@ bool CPVRManager::SetWakeupCommand(void) { nextEvent.GetAsTime(iWakeupTime); - std::string strExecCommand = StringUtils::Format("%s %ld", strSettingWakeupCommand.c_str(), iWakeupTime); + std::string strExecCommand = StringUtils::Format("%s %ld", strWakeupCommand.c_str(), iWakeupTime); const int iReturn = system(strExecCommand.c_str()); if (iReturn != 0) @@ -797,11 +766,11 @@ bool CPVRManager::IsParentalLocked(const CPVRChannelPtr &channel) if (// different channel (!currentChannel || channel != currentChannel) && // parental control enabled - CServiceBroker::GetSettings().GetBool(CSettings::SETTING_PVRPARENTAL_ENABLED) && + m_settings.GetBoolValue(CSettings::SETTING_PVRPARENTAL_ENABLED) && // channel is locked channel && channel->IsLocked()) { - float parentalDurationMs = CServiceBroker::GetSettings().GetInt(CSettings::SETTING_PVRPARENTAL_DURATION) * 1000.0f; + float parentalDurationMs = m_settings.GetIntValue(CSettings::SETTING_PVRPARENTAL_DURATION) * 1000.0f; bReturn = m_parentalTimer && (!m_parentalTimer->IsRunning() || m_parentalTimer->GetElapsedMilliseconds() > parentalDurationMs); @@ -953,11 +922,11 @@ bool CPVRManager::UpdateItem(CFileItem& item) CMusicInfoTag* musictag = item.GetMusicInfoTag(); if (musictag) { - musictag->SetTitle(epgTagNow ? - epgTagNow->Title() : - CServiceBroker::GetSettings().GetBool(CSettings::SETTING_EPG_HIDENOINFOAVAILABLE) ? - "" : - g_localizeStrings.Get(19055)); // no information available + musictag->SetTitle(epgTagNow + ? epgTagNow->Title() + : m_settings.GetBoolValue(CSettings::SETTING_EPG_HIDENOINFOAVAILABLE) + ? "" + : g_localizeStrings.Get(19055)); // no information available if (epgTagNow) musictag->SetGenre(epgTagNow->Genre()); musictag->SetDuration(epgTagNow ? epgTagNow->GetDuration() : 3600); @@ -974,11 +943,11 @@ bool CPVRManager::UpdateItem(CFileItem& item) CVideoInfoTag *videotag = item.GetVideoInfoTag(); if (videotag) { - videotag->m_strTitle = epgTagNow ? - epgTagNow->Title() : - CServiceBroker::GetSettings().GetBool(CSettings::SETTING_EPG_HIDENOINFOAVAILABLE) ? - "" : - g_localizeStrings.Get(19055); // no information available + videotag->m_strTitle = epgTagNow + ? epgTagNow->Title() + : m_settings.GetBoolValue(CSettings::SETTING_EPG_HIDENOINFOAVAILABLE) + ? "" + : g_localizeStrings.Get(19055); // no information available if (epgTagNow) videotag->m_genre = epgTagNow->Genre(); videotag->m_strPath = channelTag->Path(); @@ -1017,8 +986,7 @@ bool CPVRManager::PerformChannelSwitch(const CPVRChannelPtr &channel, bool bPrev if (bPreview) { - if (!g_infoManager.GetShowInfo() && - CServiceBroker::GetSettings().GetInt(CSettings::SETTING_PVRPLAYBACK_CHANNELENTRYTIMEOUT) == 0) + if (!g_infoManager.GetShowInfo() && m_settings.GetIntValue(CSettings::SETTING_PVRPLAYBACK_CHANNELENTRYTIMEOUT) == 0) { // no need to do anything return true; @@ -1195,7 +1163,7 @@ bool CPVRManager::CanSystemPowerdown(bool bAskUser /*= true*/) const const CDateTime now(CDateTime::GetUTCDateTime()); CDateTime dailywakeuptime; - dailywakeuptime.SetFromDBTime(CServiceBroker::GetSettings().GetString(CSettings::SETTING_PVRPOWERMANAGEMENT_DAILYWAKEUPTIME)); + dailywakeuptime.SetFromDBTime(m_settings.GetStringValue(CSettings::SETTING_PVRPOWERMANAGEMENT_DAILYWAKEUPTIME)); dailywakeuptime = dailywakeuptime.GetAsUTCDateTime(); const CDateTimeSpan diff(dailywakeuptime - now); @@ -1284,8 +1252,7 @@ bool CPVRManager::IsNextEventWithinBackendIdleTime(void) const { // timers going off soon? const CDateTime now(CDateTime::GetUTCDateTime()); - const CDateTimeSpan idle( - 0, 0, CServiceBroker::GetSettings().GetInt(CSettings::SETTING_PVRPOWERMANAGEMENT_BACKENDIDLETIME), 0); + const CDateTimeSpan idle(0, 0, m_settings.GetIntValue(CSettings::SETTING_PVRPOWERMANAGEMENT_BACKENDIDLETIME), 0); const CDateTime next(m_timers->GetNextEventTime()); const CDateTimeSpan delta(next - now); diff --git a/xbmc/pvr/PVRManager.h b/xbmc/pvr/PVRManager.h index a581d0fa89..7fdc24e633 100644 --- a/xbmc/pvr/PVRManager.h +++ b/xbmc/pvr/PVRManager.h @@ -30,6 +30,7 @@ #include "pvr/PVRActionListener.h" #include "pvr/PVREvent.h" +#include "pvr/PVRSettings.h" #include "pvr/PVRTypes.h" #include "pvr/recordings/PVRRecording.h" @@ -89,7 +90,7 @@ namespace PVR bool m_bStopped; }; - class CPVRManager : private CThread, public Observable, public ANNOUNCEMENT::IAnnouncer, public ISettingCallback + class CPVRManager : private CThread, public Observable, public ANNOUNCEMENT::IAnnouncer { friend class CPVRClients; @@ -120,9 +121,6 @@ namespace PVR virtual void Announce(ANNOUNCEMENT::AnnouncementFlag flag, const char *sender, const char *message, const CVariant &data) override; - // ISettingCallback implementation - void OnSettingChanged(const CSetting *setting) override; - /*! * @brief Get the channel groups container. * @return The groups container. @@ -652,9 +650,7 @@ namespace PVR std::atomic_bool m_isChannelPreview; CEventSource<PVREvent> m_events; - // settings cache - bool m_bSettingPowerManagementEnabled; // SETTING_PVRPOWERMANAGEMENT_ENABLED - std::string m_strSettingWakeupCommand; // SETTING_PVRPOWERMANAGEMENT_SETWAKEUPCMD CPVRActionListener m_actionListener; + CPVRSettings m_settings; }; } diff --git a/xbmc/pvr/PVRSettings.cpp b/xbmc/pvr/PVRSettings.cpp index f84cfcf079..e249d4bd36 100644 --- a/xbmc/pvr/PVRSettings.cpp +++ b/xbmc/pvr/PVRSettings.cpp @@ -20,11 +20,96 @@ #include "PVRSettings.h" +#include "ServiceBroker.h" #include "guilib/LocalizeStrings.h" +#include "settings/lib/SettingsManager.h" +#include "settings/Settings.h" +#include "utils/log.h" #include "utils/StringUtils.h" using namespace PVR; +CPVRSettings::CPVRSettings(const std::set<std::string> &settingNames) +{ + Init(settingNames); + CServiceBroker::GetSettings().RegisterCallback(this, settingNames); +} + +CPVRSettings::~CPVRSettings() +{ + CServiceBroker::GetSettings().UnregisterCallback(this); +} + +void CPVRSettings::Init(const std::set<std::string> &settingNames) +{ + for (auto settingName : settingNames) + { + CSetting* setting = CServiceBroker::GetSettings().GetSetting(settingName); + if (!setting) + { + CLog::Log(LOGERROR, "CPVRSettings - %s - Unknown setting '%s'", __FUNCTION__, settingName.c_str()); + continue; + } + + CSingleLock lock(m_critSection); + m_settings.insert(std::make_pair(settingName, SettingPtr(setting->Clone(settingName)))); + } +} + +void CPVRSettings::OnSettingChanged(const CSetting *setting) +{ + if (setting == nullptr) + return; + + CSingleLock lock(m_critSection); + m_settings[setting->GetId()] = SettingPtr(setting->Clone(setting->GetId())); +} + +bool CPVRSettings::GetBoolValue(const std::string &settingName) const +{ + CSingleLock lock(m_critSection); + auto settingIt = m_settings.find(settingName); + if (settingIt != m_settings.end() && (*settingIt).second->GetType() == SettingTypeBool) + { + const CSettingBool* setting = dynamic_cast<const CSettingBool*>((*settingIt).second.get()); + if (setting) + return setting->GetValue(); + } + + CLog::Log(LOGERROR, "CPVRSettings - %s - setting '%s' not found or wrong type given", __FUNCTION__, settingName.c_str()); + return false; +} + +int CPVRSettings::GetIntValue(const std::string &settingName) const +{ + CSingleLock lock(m_critSection); + auto settingIt = m_settings.find(settingName); + if (settingIt != m_settings.end() && (*settingIt).second->GetType() == SettingTypeInteger) + { + const CSettingInt* setting = dynamic_cast<const CSettingInt*>((*settingIt).second.get()); + if (setting) + return setting->GetValue(); + } + + CLog::Log(LOGERROR, "CPVRSettings - %s - setting '%s' not found or wrong type given", __FUNCTION__, settingName.c_str()); + return -1; +} + +std::string CPVRSettings::GetStringValue(const std::string &settingName) const +{ + CSingleLock lock(m_critSection); + auto settingIt = m_settings.find(settingName); + if (settingIt != m_settings.end() && (*settingIt).second->GetType() == SettingTypeString) + { + const CSettingString* setting = dynamic_cast<const CSettingString*>((*settingIt).second.get()); + if (setting) + return setting->GetValue(); + } + + CLog::Log(LOGERROR, "CPVRSettings - %s - setting '%s' not found or wrong type given", __FUNCTION__, settingName.c_str()); + return ""; +} + void CPVRSettings::MarginTimeFiller( const CSetting * /*setting*/, std::vector< std::pair<std::string, int> > &list, int ¤t, void * /*data*/) { diff --git a/xbmc/pvr/PVRSettings.h b/xbmc/pvr/PVRSettings.h index 9460db1a39..2410fff95f 100644 --- a/xbmc/pvr/PVRSettings.h +++ b/xbmc/pvr/PVRSettings.h @@ -19,24 +19,39 @@ * */ +#include <map> #include <string> #include <utility> -#include <vector> -class CSetting; +#include "settings/lib/ISettingCallback.h" +#include "settings/lib/Setting.h" namespace PVR { - class CPVRSettings + class CPVRSettings : private ISettingCallback { public: + CPVRSettings(const std::set<std::string> & settingNames); + virtual ~CPVRSettings(); + + // ISettingCallback implementation + void OnSettingChanged(const CSetting *setting) override; + + bool GetBoolValue(const std::string &settingName) const; + int GetIntValue(const std::string &settingName) const; + std::string GetStringValue(const std::string &settingName) const; + // settings value filler for start/end recording margin time for PVR timers. static void MarginTimeFiller( const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data); private: - CPVRSettings() = delete; CPVRSettings(const CPVRSettings&) = delete; CPVRSettings& operator=(CPVRSettings const&) = delete; + + void Init(const std::set<std::string> &settingNames); + + CCriticalSection m_critSection; + std::map<std::string, SettingPtr> m_settings; }; } diff --git a/xbmc/pvr/timers/PVRTimers.cpp b/xbmc/pvr/timers/PVRTimers.cpp index a61826c674..8160b64970 100644 --- a/xbmc/pvr/timers/PVRTimers.cpp +++ b/xbmc/pvr/timers/PVRTimers.cpp @@ -86,7 +86,15 @@ void CPVRTimersContainer::InsertTimer(const CPVRTimerInfoTagPtr &newTimer) } CPVRTimers::CPVRTimers(void) -: m_bIsUpdating(false) +: m_bIsUpdating(false), + m_settings({ + CSettings::SETTING_PVRPOWERMANAGEMENT_DAILYWAKEUP, + CSettings::SETTING_PVRPOWERMANAGEMENT_PREWAKEUP, + CSettings::SETTING_PVRPOWERMANAGEMENT_BACKENDIDLETIME, + CSettings::SETTING_PVRPOWERMANAGEMENT_DAILYWAKEUPTIME, + CSettings::SETTING_PVRRECORD_TIMERNOTIFICATIONS, + CSettings::SETTING_PVRTIMERS_HIDEDISABLEDTIMERS + }) { } @@ -353,7 +361,7 @@ bool CPVRTimers::UpdateEntries(const CPVRTimersContainer &timers, const std::vec std::string strIcon; CServiceBroker::GetPVRManager().Clients()->GetClientAddonIcon(entry.first, strIcon); - job->AddEvent(CServiceBroker::GetSettings().GetBool(CSettings::SETTING_PVRRECORD_TIMERNOTIFICATIONS), + job->AddEvent(m_settings.GetBoolValue(CSettings::SETTING_PVRRECORD_TIMERNOTIFICATIONS), false, // info, no error strName, entry.second, @@ -557,7 +565,7 @@ bool CPVRTimers::GetRootDirectory(const CPVRTimersPath &path, CFileItemList &ite bool bRadio = path.IsRadio(); bool bRules = path.IsRules(); - bool bHideDisabled = CServiceBroker::GetSettings().GetBool(CSettings::SETTING_PVRTIMERS_HIDEDISABLEDTIMERS); + bool bHideDisabled = m_settings.GetBoolValue(CSettings::SETTING_PVRTIMERS_HIDEDISABLEDTIMERS); CSingleLock lock(m_critSection); for (const auto &tagsEntry : m_tags) @@ -585,7 +593,7 @@ bool CPVRTimers::GetSubDirectory(const CPVRTimersPath &path, CFileItemList &item unsigned int iParentId = path.GetParentId(); int iClientId = path.GetClientId(); - bool bHideDisabled = CServiceBroker::GetSettings().GetBool(CSettings::SETTING_PVRTIMERS_HIDEDISABLEDTIMERS); + bool bHideDisabled = m_settings.GetBoolValue(CSettings::SETTING_PVRTIMERS_HIDEDISABLEDTIMERS); CFileItemPtr item; @@ -866,10 +874,10 @@ void CPVRTimers::Notify(const Observable &obs, const ObservableMessage msg) CDateTime CPVRTimers::GetNextEventTime(void) const { - const bool dailywakup = CServiceBroker::GetSettings().GetBool(CSettings::SETTING_PVRPOWERMANAGEMENT_DAILYWAKEUP); + const bool dailywakup = m_settings.GetBoolValue(CSettings::SETTING_PVRPOWERMANAGEMENT_DAILYWAKEUP); const CDateTime now = CDateTime::GetUTCDateTime(); - const CDateTimeSpan prewakeup(0, 0, CServiceBroker::GetSettings().GetInt(CSettings::SETTING_PVRPOWERMANAGEMENT_PREWAKEUP), 0); - const CDateTimeSpan idle(0, 0, CServiceBroker::GetSettings().GetInt(CSettings::SETTING_PVRPOWERMANAGEMENT_BACKENDIDLETIME), 0); + const CDateTimeSpan prewakeup(0, 0, m_settings.GetIntValue(CSettings::SETTING_PVRPOWERMANAGEMENT_PREWAKEUP), 0); + const CDateTimeSpan idle(0, 0, m_settings.GetIntValue(CSettings::SETTING_PVRPOWERMANAGEMENT_BACKENDIDLETIME), 0); CDateTime wakeuptime; @@ -888,7 +896,7 @@ CDateTime CPVRTimers::GetNextEventTime(void) const if (dailywakup) { CDateTime dailywakeuptime; - dailywakeuptime.SetFromDBTime(CServiceBroker::GetSettings().GetString(CSettings::SETTING_PVRPOWERMANAGEMENT_DAILYWAKEUPTIME)); + dailywakeuptime.SetFromDBTime(m_settings.GetStringValue(CSettings::SETTING_PVRPOWERMANAGEMENT_DAILYWAKEUPTIME)); dailywakeuptime = dailywakeuptime.GetAsUTCDateTime(); dailywakeuptime.SetDateTime( diff --git a/xbmc/pvr/timers/PVRTimers.h b/xbmc/pvr/timers/PVRTimers.h index 5fe1469114..82fdf31720 100644 --- a/xbmc/pvr/timers/PVRTimers.h +++ b/xbmc/pvr/timers/PVRTimers.h @@ -24,6 +24,7 @@ #include <vector> #include "addons/kodi-addon-dev-kit/include/kodi/xbmc_pvr_types.h" +#include "pvr/PVRSettings.h" #include "PVRTimerInfoTag.h" #include "utils/Observer.h" #include "XBDateTime.h" @@ -303,6 +304,7 @@ namespace PVR int AmountActiveRecordings(const TimerKind &eKind) const; bool m_bIsUpdating; + CPVRSettings m_settings; }; class CPVRTimersPath diff --git a/xbmc/pvr/windows/GUIWindowPVRRecordings.cpp b/xbmc/pvr/windows/GUIWindowPVRRecordings.cpp index b55cc15734..3d003cd0d2 100644 --- a/xbmc/pvr/windows/GUIWindowPVRRecordings.cpp +++ b/xbmc/pvr/windows/GUIWindowPVRRecordings.cpp @@ -41,7 +41,11 @@ using namespace PVR; CGUIWindowPVRRecordings::CGUIWindowPVRRecordings(bool bRadio) : CGUIWindowPVRBase(bRadio, bRadio ? WINDOW_RADIO_RECORDINGS : WINDOW_TV_RECORDINGS, "MyPVRRecordings.xml") , - m_bShowDeletedRecordings(false) + m_bShowDeletedRecordings(false), + m_settings({ + CSettings::SETTING_PVRRECORD_GROUPRECORDINGS, + CSettings::SETTING_MYVIDEOS_SELECTACTION + }) { g_infoManager.RegisterObserver(this); } @@ -169,7 +173,7 @@ void CGUIWindowPVRRecordings::UpdateButtons(void) SET_CONTROL_LABEL(CONTROL_BTNSHOWMODE, g_localizeStrings.Get(iStringId)); - bool bGroupRecordings = CServiceBroker::GetSettings().GetBool(CSettings::SETTING_PVRRECORD_GROUPRECORDINGS); + bool bGroupRecordings = m_settings.GetBoolValue(CSettings::SETTING_PVRRECORD_GROUPRECORDINGS); SET_CONTROL_SELECTED(GetID(), CONTROL_BTNGROUPITEMS, bGroupRecordings); CGUIRadioButtonControl *btnShowDeleted = (CGUIRadioButtonControl*) GetControl(CONTROL_BTNSHOWDELETED); @@ -227,7 +231,7 @@ bool CGUIWindowPVRRecordings::OnMessage(CGUIMessage &message) } else { - switch (CServiceBroker::GetSettings().GetInt(CSettings::SETTING_MYVIDEOS_SELECTACTION)) + switch (m_settings.GetIntValue(CSettings::SETTING_MYVIDEOS_SELECTACTION)) { case SELECT_ACTION_CHOOSE: OnPopupMenu(iItem); diff --git a/xbmc/pvr/windows/GUIWindowPVRRecordings.h b/xbmc/pvr/windows/GUIWindowPVRRecordings.h index 442e98413a..523355e60a 100644 --- a/xbmc/pvr/windows/GUIWindowPVRRecordings.h +++ b/xbmc/pvr/windows/GUIWindowPVRRecordings.h @@ -22,6 +22,8 @@ #include "video/VideoThumbLoader.h" #include "video/VideoDatabase.h" +#include "pvr/PVRSettings.h" + #include "GUIWindowPVRBase.h" namespace PVR @@ -51,5 +53,6 @@ namespace PVR CVideoThumbLoader m_thumbLoader; CVideoDatabase m_database; bool m_bShowDeletedRecordings; + CPVRSettings m_settings; }; } diff --git a/xbmc/system.h b/xbmc/system.h index 278413d4bd..6360ee2706 100644 --- a/xbmc/system.h +++ b/xbmc/system.h @@ -78,14 +78,6 @@ #endif #endif -/********************** - * Non-free Components - **********************/ - -#if defined(HAVE_XBMC_NONFREE) - #define HAS_FILESYSTEM_RAR -#endif - /***************** * Win32 Specific *****************/ diff --git a/xbmc/utils/DatabaseUtils.cpp b/xbmc/utils/DatabaseUtils.cpp index 0acd220bb9..328036a7e3 100644 --- a/xbmc/utils/DatabaseUtils.cpp +++ b/xbmc/utils/DatabaseUtils.cpp @@ -163,6 +163,7 @@ std::string DatabaseUtils::GetField(Field field, const MediaType &mediaType, Dat else if (field == FieldWriter) result = StringUtils::Format("movie_view.c%02d", VIDEODB_ID_CREDITS); else if (field == FieldYear) return "movie_view.premiered"; else if (field == FieldSortTitle) result = StringUtils::Format("movie_view.c%02d", VIDEODB_ID_SORTTITLE); + else if (field == FieldOriginalTitle) result = StringUtils::Format("movie_view.c%02d", VIDEODB_ID_ORIGINALTITLE); else if (field == FieldTime) result = StringUtils::Format("movie_view.c%02d", VIDEODB_ID_RUNTIME); else if (field == FieldMPAA) result = StringUtils::Format("movie_view.c%02d", VIDEODB_ID_MPAA); else if (field == FieldTop250) result = StringUtils::Format("movie_view.c%02d", VIDEODB_ID_TOP250); @@ -203,6 +204,7 @@ std::string DatabaseUtils::GetField(Field field, const MediaType &mediaType, Dat else if (field == FieldMPAA) result = StringUtils::Format("tvshow_view.c%02d", VIDEODB_ID_TV_MPAA); else if (field == FieldStudio) result = StringUtils::Format("tvshow_view.c%02d", VIDEODB_ID_TV_STUDIOS); else if (field == FieldSortTitle) result = StringUtils::Format("tvshow_view.c%02d", VIDEODB_ID_TV_SORTTITLE); + else if (field == FieldOriginalTitle) result = StringUtils::Format("tvshow_view.c%02d", VIDEODB_ID_TV_ORIGINALTITLE); else if (field == FieldPath) return "tvshow_view.strPath"; else if (field == FieldDateAdded) return "tvshow_view.dateAdded"; else if (field == FieldLastPlayed) return "tvshow_view.lastPlayed"; @@ -571,6 +573,7 @@ int DatabaseUtils::GetField(Field field, const MediaType &mediaType, bool asInde if (field == FieldId) return 0; else if (field == FieldTitle) index = VIDEODB_ID_TITLE; else if (field == FieldSortTitle) index = VIDEODB_ID_SORTTITLE; + else if (field == FieldOriginalTitle) index = VIDEODB_ID_ORIGINALTITLE; else if (field == FieldPlot) index = VIDEODB_ID_PLOT; else if (field == FieldPlotOutline) index = VIDEODB_ID_PLOTOUTLINE; else if (field == FieldTagline) index = VIDEODB_ID_TAGLINE; @@ -609,6 +612,7 @@ int DatabaseUtils::GetField(Field field, const MediaType &mediaType, bool asInde if (field == FieldId) return 0; else if (field == FieldTitle) index = VIDEODB_ID_TV_TITLE; else if (field == FieldSortTitle) index = VIDEODB_ID_TV_SORTTITLE; + else if (field == FieldOriginalTitle) index = VIDEODB_ID_TV_ORIGINALTITLE; else if (field == FieldPlot) index = VIDEODB_ID_TV_PLOT; else if (field == FieldTvShowStatus) index = VIDEODB_ID_TV_STATUS; else if (field == FieldVotes) return VIDEODB_DETAILS_TVSHOW_VOTES; diff --git a/xbmc/utils/DatabaseUtils.h b/xbmc/utils/DatabaseUtils.h index a3f967aab5..b5548551e5 100644 --- a/xbmc/utils/DatabaseUtils.h +++ b/xbmc/utils/DatabaseUtils.h @@ -74,6 +74,7 @@ typedef enum { FieldAlbumArtist, FieldTitle, FieldSortTitle, + FieldOriginalTitle, FieldYear, FieldTime, FieldTrackNumber, @@ -160,7 +161,7 @@ public: static int GetField(Field field, const MediaType &mediaType); static int GetFieldIndex(Field field, const MediaType &mediaType); static bool GetSelectFields(const Fields &fields, const MediaType &mediaType, FieldList &selectFields); - + static bool GetFieldValue(const dbiplus::field_value &fieldValue, CVariant &variantValue); static bool GetDatabaseResults(const MediaType &mediaType, const FieldList &fields, const std::unique_ptr<dbiplus::Dataset> &dataset, DatabaseResults &results); diff --git a/xbmc/utils/URIUtils.cpp b/xbmc/utils/URIUtils.cpp index f13a71b2af..f209b46dd9 100644 --- a/xbmc/utils/URIUtils.cpp +++ b/xbmc/utils/URIUtils.cpp @@ -1261,7 +1261,7 @@ CURL URIUtils::CreateArchivePath(const std::string& type, /* NOTE: on posix systems, the replacement of \ with / is incorrect. Ideally this would not be done. We need to check that the ZipManager - and RarManager code (and elsewhere) doesn't pass in non-posix paths. + code (and elsewhere) doesn't pass in non-posix paths. */ std::string strBuffer(pathInArchive); StringUtils::Replace(strBuffer, '\\', '/'); diff --git a/xbmc/video/ContextMenus.cpp b/xbmc/video/ContextMenus.cpp index d0fcfb0e9c..e161dbf729 100644 --- a/xbmc/video/ContextMenus.cpp +++ b/xbmc/video/ContextMenus.cpp @@ -21,7 +21,6 @@ #include "ContextMenus.h" #include "Application.h" #include "Autorun.h" -#include "playlists/PlayList.h" #include "Util.h" #include "video/dialogs/GUIDialogVideoInfo.h" #include "video/windows/GUIWindowVideoBase.h" @@ -121,16 +120,7 @@ static void SetPathAndPlay(CFileItem& item) } item.SetProperty("check_resume", false); - CFileItemPtr movieItem((std::make_shared<CFileItem>(item))); - - g_playlistPlayer.Reset(); - g_playlistPlayer.SetCurrentPlaylist(PLAYLIST_VIDEO); - PLAYLIST::CPlayList& playlist = g_playlistPlayer.GetPlaylist(PLAYLIST_VIDEO); - playlist.Clear(); - playlist.Add(movieItem); - - // play movie... - g_playlistPlayer.Play(0, ""); + g_playlistPlayer.Play(std::make_shared<CFileItem>(item), ""); } bool CResume::Execute(const CFileItemPtr& itemIn) const diff --git a/xbmc/video/windows/GUIWindowVideoBase.cpp b/xbmc/video/windows/GUIWindowVideoBase.cpp index 7700c60da4..79c7297ed8 100644 --- a/xbmc/video/windows/GUIWindowVideoBase.cpp +++ b/xbmc/video/windows/GUIWindowVideoBase.cpp @@ -1179,19 +1179,10 @@ bool CGUIWindowVideoBase::OnPlayAndQueueMedia(const CFileItemPtr &item, std::str void CGUIWindowVideoBase::PlayMovie(const CFileItem *item, const std::string &player) { - CFileItemPtr movieItem(new CFileItem(*item)); - - g_playlistPlayer.Reset(); - g_playlistPlayer.SetCurrentPlaylist(PLAYLIST_VIDEO); - CPlayList& playlist = g_playlistPlayer.GetPlaylist(PLAYLIST_VIDEO); - playlist.Clear(); - playlist.Add(movieItem); - if(m_thumbLoader.IsLoading()) m_thumbLoader.StopAsync(); - // play movie... - g_playlistPlayer.Play(0, player); + g_playlistPlayer.Play(std::make_shared<CFileItem>(*item), player); if(!g_application.m_pPlayer->IsPlayingVideo()) m_thumbLoader.Load(*m_vecItems); diff --git a/xbmc/windows/GUIWindowFileManager.cpp b/xbmc/windows/GUIWindowFileManager.cpp index e7e3e88587..a9f0d824e7 100644 --- a/xbmc/windows/GUIWindowFileManager.cpp +++ b/xbmc/windows/GUIWindowFileManager.cpp @@ -622,7 +622,12 @@ void CGUIWindowFileManager::OnStart(CFileItem *pItem, const std::string &player) g_application.ProcessAndStartPlaylist(strPlayList, *pPlayList, PLAYLIST_MUSIC); return; } - if (pItem->IsAudio() || pItem->IsVideo() || pItem->IsGame()) + if (pItem->IsAudio() || pItem->IsVideo()) + { + g_playlistPlayer.Play(std::make_shared<CFileItem>(*pItem), player); + return; + } + if (pItem->IsGame()) { g_application.PlayFile(*pItem, player); return ; |