3 #include "dialogs/GUIDialogProgress.h"
5 ComprDataIO::ComprDataIO()
11 void ComprDataIO::Init()
13 UnpackFromMemory=false;
15 UnpackToMemorySize=-1;
22 NextVolumeMissing=false;
30 CurPackRead=CurPackWrite=CurUnpRead=CurUnpWrite=CurUnpStart=0;
31 PackFileCRC=UnpFileCRC=PackedCRC=0xffffffff;
36 ProcessedArcSize=TotalArcSize=0;
38 m_pDlgProgress = NULL;
41 int ComprDataIO::UnpRead(byte *Addr,uint Count)
43 int RetCode=0,TotalRead=0;
48 Archive *SrcArc=(Archive *)SrcFile;
50 uint ReadSize=(Count>UnpPackedSize) ? int64to32(UnpPackedSize):Count;
53 memcpy(Addr,UnpackFromMemoryAddr,UnpackFromMemorySize);
54 RetCode=UnpackFromMemorySize;
55 UnpackFromMemorySize=0;
60 if (!SrcFile->IsOpened())
62 NextVolumeMissing = true;
66 if (hSeek->WaitMSec(1)) // we are seeking
68 if (m_iSeekTo > CurUnpStart+SrcArc->NewLhd.FullPackSize) // need to seek outside this block
70 TotalRead += (int)(SrcArc->NextBlockPos-SrcFile->Tell());
71 CurUnpRead=CurUnpStart+SrcArc->NewLhd.FullPackSize;
78 Int64 iStartOfFile = SrcArc->NextBlockPos-SrcArc->NewLhd.FullPackSize;
79 m_iStartOfBuffer = CurUnpStart;
80 Int64 iSeekTo=m_iSeekTo-CurUnpStart<MAXWINMEMSIZE/2?iStartOfFile:iStartOfFile+m_iSeekTo-CurUnpStart-MAXWINMEMSIZE/2;
81 if (iSeekTo == iStartOfFile) // front
83 if (CurUnpStart+MAXWINMEMSIZE>SrcArc->NewLhd.FullUnpSize)
85 m_iSeekTo=iStartOfFile;
86 UnpPackedSize = SrcArc->NewLhd.FullPackSize;
90 m_iSeekTo=MAXWINMEMSIZE-(m_iSeekTo-CurUnpStart);
91 UnpPackedSize = SrcArc->NewLhd.FullPackSize - (m_iStartOfBuffer - CurUnpStart);
96 m_iStartOfBuffer = m_iSeekTo-MAXWINMEMSIZE/2; // front
97 if (m_iSeekTo+MAXWINMEMSIZE/2>SrcArc->NewLhd.FullUnpSize)
99 iSeekTo = iStartOfFile+SrcArc->NewLhd.FullPackSize-MAXWINMEMSIZE;
100 m_iStartOfBuffer = CurUnpStart+SrcArc->NewLhd.FullPackSize-MAXWINMEMSIZE;
101 m_iSeekTo = MAXWINMEMSIZE-(m_iSeekTo-m_iStartOfBuffer);
102 UnpPackedSize = MAXWINMEMSIZE;
106 m_iSeekTo=MAXWINMEMSIZE/2;
107 UnpPackedSize = SrcArc->NewLhd.FullPackSize - (m_iStartOfBuffer - CurUnpStart);
111 SrcFile->Seek(iSeekTo,SEEK_SET);
113 CurUnpRead = CurUnpStart + iSeekTo - iStartOfFile;
114 CurUnpWrite = SrcFile->Tell() - iStartOfFile + CurUnpStart;
122 ReadSize=(Count>UnpPackedSize) ? int64to32(UnpPackedSize):Count;
123 RetCode=SrcFile->Read(ReadAddr,ReadSize);
124 FileHeader *hd=SubHead!=NULL ? SubHead:&SrcArc->NewLhd;
125 if (hd->Flags & LHD_SPLIT_AFTER)
127 PackedCRC=CRC(PackedCRC,ReadAddr,ReadSize);
135 UnpPackedSize-=RetCode;
136 if (UnpPackedSize == 0 && UnpVolume)
139 if (!MergeArchive(*SrcArc,this,true,CurrentCommand))
142 NextVolumeMissing=true;
145 CurUnpStart = CurUnpRead;
148 CURL url(SrcArc->FileName);
149 m_pDlgProgress->SetLine(0,url.GetWithoutUserDetails()); // update currently extracted rar file
150 m_pDlgProgress->Progress();
156 Archive *SrcArc=(Archive *)SrcFile;
158 ShowUnpRead(SrcArc->CurBlockPos+CurUnpRead,UnpArcSize);
167 Decrypt.Crypt(Addr,RetCode,(Decryption==15) ? NEW_CRYPT : OLD_DECODE);
168 else if (Decryption==20)
169 for (int I=0;I<RetCode;I+=16)
170 Decrypt.DecryptBlock20(&Addr[I]);
174 int CryptSize=(RetCode & 0xf)==0 ? RetCode:((RetCode & ~0xf)+16);
175 Decrypt.DecryptBlock(Addr,CryptSize);
184 void ComprDataIO::UnpWrite(byte *Addr,uint Count)
187 RAROptions *Cmd=((Archive *)SrcFile)->GetRAROptions();
188 if (Cmd->DllOpMode!=RAR_SKIP)
190 if (Cmd->Callback!=NULL &&
191 Cmd->Callback(UCM_PROCESSDATA,Cmd->UserData,(LONG)Addr,Count)==-1)
192 ErrHandler.Exit(USER_BREAK);
193 if (Cmd->ProcessDataProc!=NULL)
198 int RetCode=Cmd->ProcessDataProc(Addr,Count);
203 ErrHandler.Exit(USER_BREAK);
211 while(UnpackToMemorySize < (int)Count)
214 while(! hBufferFilled->WaitMSec(1))
215 if (hQuit->WaitMSec(1))
219 if (! hSeek->WaitMSec(1)) // we are seeking
221 memcpy(UnpackToMemoryAddr,Addr,Count);
222 UnpackToMemoryAddr+=Count;
223 UnpackToMemorySize-=Count;
230 DestFile->Write(Addr,Count);
236 if (((Archive *)SrcFile)->OldFormat)
237 UnpFileCRC=OldCRC((ushort)UnpFileCRC,Addr,Count);
240 UnpFileCRC=CRC(UnpFileCRC,Addr,Count);
246 m_pDlgProgress->ShowProgressBar(true);
247 m_pDlgProgress->SetPercentage(int(float(CurUnpWrite)/float(((Archive*)SrcFile)->NewLhd.FullUnpSize)*100));
248 m_pDlgProgress->Progress();
249 if (m_pDlgProgress->IsCanceled())
259 void ComprDataIO::ShowUnpRead(Int64 ArcPos,Int64 ArcSize)
261 if (ShowProgress && SrcFile!=NULL)
263 Archive *SrcArc=(Archive *)SrcFile;
264 RAROptions *Cmd=SrcArc->GetRAROptions();
266 ArcSize=TotalArcSize;
267 ArcPos+=ProcessedArcSize;
270 int CurPercent=ToPercent(ArcPos,ArcSize);
271 if (!Cmd->DisablePercentage && CurPercent!=LastPercent)
273 mprintf("\b\b\b\b%3d%%",CurPercent);
274 LastPercent=CurPercent;
281 void ComprDataIO::ShowUnpWrite()
292 void ComprDataIO::SetFiles(File *SrcFile,File *DestFile)
295 ComprDataIO::SrcFile=SrcFile;
297 ComprDataIO::DestFile=DestFile;
302 void ComprDataIO::GetUnpackedData(byte **Data,uint *Size)
309 void ComprDataIO::SetEncryption(int Method,char *Password,byte *Salt,bool Encrypt)
313 Encryption=*Password ? Method:0;
315 Crypt.SetCryptKeys(Password,Salt,Encrypt);
320 Decryption=*Password ? Method:0;
322 Decrypt.SetCryptKeys(Password,Salt,Encrypt,Method<29);
329 void ComprDataIO::SetAV15Encryption()
332 Decrypt.SetAV15Encryption();
338 void ComprDataIO::SetCmt13Encryption()
341 Decrypt.SetCmt13Encryption();
348 void ComprDataIO::SetUnpackToMemory(byte *Addr,uint Size)
351 UnpackToMemoryAddr=Addr;
352 UnpackToMemorySize=Size;