Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/kornelski/7z.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '7zip/Compress/Rar29/Original/rdwrfn.cpp')
-rwxr-xr-x7zip/Compress/Rar29/Original/rdwrfn.cpp306
1 files changed, 306 insertions, 0 deletions
diff --git a/7zip/Compress/Rar29/Original/rdwrfn.cpp b/7zip/Compress/Rar29/Original/rdwrfn.cpp
new file mode 100755
index 00000000..7340ea67
--- /dev/null
+++ b/7zip/Compress/Rar29/Original/rdwrfn.cpp
@@ -0,0 +1,306 @@
+#include "rar.hpp"
+
+// Igor Pavlov
+#include "../../../Common/StreamUtils.h"
+
+ComprDataIO::ComprDataIO()
+{
+ Init();
+}
+
+
+void ComprDataIO::Init()
+{
+ UnpackFromMemory=false;
+ UnpackToMemory=false;
+ UnpPackedSize=0;
+ ShowProgress=true;
+ TestMode=false;
+ SkipUnpCRC=false;
+ PackVolume=false;
+ UnpVolume=false;
+ NextVolumeMissing=false;
+ SrcFile=NULL;
+ DestFile=NULL;
+ UnpWrSize=0;
+ Command=NULL;
+ Encryption=0;
+ Decryption=0;
+ TotalPackRead=0;
+ CurPackRead=CurPackWrite=CurUnpRead=CurUnpWrite=0;
+ PackFileCRC=UnpFileCRC=PackedCRC=0xffffffff;
+ LastPercent=-1;
+ // Igor Pavlov
+ /*
+ SubHead=NULL;
+ SubHeadPos=NULL;
+ */
+ CurrentCommand=0;
+ ProcessedArcSize=TotalArcSize=0;
+}
+
+
+
+
+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
+ {
+ // Igor Pavlov
+ if (!SrcFile)
+ // if (!SrcFile->IsOpened())
+ return(-1);
+
+ // Igor Pavlov
+ UInt32 processedSize;
+ HRESULT result = ReadStream(SrcFile, ReadAddr, ReadSize, &processedSize);
+ RetCode = processedSize;
+
+ // Igor Pavlov
+ /*
+ 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);
+ }
+ }
+ else
+ break;
+ }
+ // Igor Pavlov
+ /*
+ 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 (uint 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)
+ {
+ if (Count <= UnpackToMemorySize)
+ {
+ memcpy(UnpackToMemoryAddr,Addr,Count);
+ UnpackToMemoryAddr+=Count;
+ UnpackToMemorySize-=Count;
+ }
+ }
+ else
+ if (!TestMode)
+ {
+ // Igor Pavlov
+ // DestFile->Write(Addr,Count);
+ WriteStream(DestFile, Addr,Count, 0);
+ }
+ CurUnpWrite+=Count;
+ // Igor Pavlov
+ /*
+ if (!SkipUnpCRC)
+#ifndef SFX_MODULE
+ if (((Archive *)SrcFile)->OldFormat)
+ UnpFileCRC=OldCRC((ushort)UnpFileCRC,Addr,Count);
+ else
+#endif
+ UnpFileCRC=CRC(UnpFileCRC,Addr,Count);
+ */
+ ShowUnpWrite();
+ Wait();
+}
+
+
+
+
+
+
+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()
+{
+ // Igor Pavlov
+ if (Progress)
+ {
+ UInt64 unPackSize = CurUnpWrite;
+ HRESULT result = Progress->SetRatioInfo(NULL, &unPackSize);
+ if (result != S_OK)
+ throw CExitCode(result);
+ }
+}
+
+
+
+
+
+
+
+// Igor Pavlov
+/*
+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;
+}
+
+// Igor Pavlov
+/*
+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;
+}
+
+// Igor Pavlov
+void ComprDataIO::SetFiles(ISequentialInStream *srcFile,
+ ISequentialOutStream *destFile, ICompressProgressInfo *progress)
+{
+ SrcFile = srcFile;
+ DestFile = destFile;
+ Progress = progress;
+ LastPercent = -1;
+}
+