1 #include "rar.hpp"
2
ComprDataIO()3 ComprDataIO::ComprDataIO()
4 {
5 Init();
6 }
7
8
Init()9 void ComprDataIO::Init()
10 {
11 UnpackFromMemory=false;
12 UnpackToMemory=false;
13 UnpPackedSize=0;
14 ShowProgress=true;
15 TestMode=false;
16 SkipUnpCRC=false;
17 PackVolume=false;
18 UnpVolume=false;
19 NextVolumeMissing=false;
20 SrcFile=NULL;
21 DestFile=NULL;
22 UnpWrSize=0;
23 Command=NULL;
24 Encryption=0;
25 Decryption=0;
26 TotalPackRead=0;
27 CurPackRead=CurPackWrite=CurUnpRead=CurUnpWrite=0;
28 PackFileCRC=UnpFileCRC=PackedCRC=0xffffffff;
29 LastPercent=-1;
30 SubHead=NULL;
31 SubHeadPos=NULL;
32 CurrentCommand=0;
33 ProcessedArcSize=TotalArcSize=0;
34 }
35
36
37
38
UnpRead(byte * Addr,uint Count)39 int ComprDataIO::UnpRead(byte *Addr,uint Count)
40 {
41 int RetCode=0,TotalRead=0;
42 byte *ReadAddr;
43 ReadAddr=Addr;
44 while (Count > 0)
45 {
46 Archive *SrcArc=(Archive *)SrcFile;
47
48 uint ReadSize=(Count>UnpPackedSize) ? int64to32(UnpPackedSize):Count;
49 if (UnpackFromMemory)
50 {
51 memcpy(Addr,UnpackFromMemoryAddr,UnpackFromMemorySize);
52 RetCode=UnpackFromMemorySize;
53 UnpackFromMemorySize=0;
54 }
55 else
56 {
57 if (!SrcFile->IsOpened())
58 return(-1);
59 RetCode=SrcFile->Read(ReadAddr,ReadSize);
60 FileHeader *hd=SubHead!=NULL ? SubHead:&SrcArc->NewLhd;
61 if (hd->Flags & LHD_SPLIT_AFTER)
62 PackedCRC=CRC(PackedCRC,ReadAddr,ReadSize);
63 }
64 CurUnpRead+=RetCode;
65 ReadAddr+=RetCode;
66 TotalRead+=RetCode;
67 Count-=RetCode;
68 UnpPackedSize-=RetCode;
69 if (UnpPackedSize == 0 && UnpVolume)
70 {
71 #ifndef NOVOLUME
72 if (!MergeArchive(*SrcArc,this,true,CurrentCommand))
73 #endif
74 {
75 NextVolumeMissing=true;
76 return(-1);
77 }
78 }
79 else
80 break;
81 }
82 Archive *SrcArc=(Archive *)SrcFile;
83 if (SrcArc!=NULL)
84 ShowUnpRead(SrcArc->CurBlockPos+CurUnpRead,UnpArcSize);
85 if (RetCode!=-1)
86 {
87 RetCode=TotalRead;
88 #ifndef NOCRYPT
89 if (Decryption)
90 #ifndef SFX_MODULE
91 if (Decryption<20)
92 Decrypt.Crypt(Addr,RetCode,(Decryption==15) ? NEW_CRYPT : OLD_DECODE);
93 else
94 if (Decryption==20)
95 for (uint I=0;I<RetCode;I+=16)
96 Decrypt.DecryptBlock20(&Addr[I]);
97 else
98 #endif
99 {
100 int CryptSize=(RetCode & 0xf)==0 ? RetCode:((RetCode & ~0xf)+16);
101 Decrypt.DecryptBlock(Addr,CryptSize);
102 }
103 #endif
104 }
105 Wait();
106 return(RetCode);
107 }
108
109
UnpWrite(byte * Addr,uint Count)110 void ComprDataIO::UnpWrite(byte *Addr,uint Count)
111 {
112 #ifdef RARDLL
113 RAROptions *Cmd=((Archive *)SrcFile)->GetRAROptions();
114 if (Cmd->DllOpMode!=RAR_SKIP)
115 {
116 if (Cmd->Callback!=NULL &&
117 Cmd->Callback(UCM_PROCESSDATA,Cmd->UserData,(LONG)Addr,Count)==-1)
118 ErrHandler.Exit(USER_BREAK);
119 if (Cmd->ProcessDataProc!=NULL)
120 {
121 //#ifdef _WIN_32
122 // _EBX=_ESP;
123 //#endif
124 int RetCode=Cmd->ProcessDataProc(Addr,Count);
125 //#ifdef _WIN_32
126 // _ESP=_EBX;
127 //#endif
128 if (RetCode==0)
129 ErrHandler.Exit(USER_BREAK);
130 }
131 }
132 #endif
133 UnpWrAddr=Addr;
134 UnpWrSize=Count;
135 if (UnpackToMemory)
136 {
137 if (Count <= UnpackToMemorySize)
138 {
139 memcpy(UnpackToMemoryAddr,Addr,Count);
140 UnpackToMemoryAddr+=Count;
141 UnpackToMemorySize-=Count;
142 }
143 }
144 else
145 if (!TestMode)
146 DestFile->Write(Addr,Count);
147 CurUnpWrite+=Count;
148 if (!SkipUnpCRC)
149 #ifndef SFX_MODULE
150 if (((Archive *)SrcFile)->OldFormat)
151 UnpFileCRC=OldCRC((ushort)UnpFileCRC,Addr,Count);
152 else
153 #endif
154 UnpFileCRC=CRC(UnpFileCRC,Addr,Count);
155 ShowUnpWrite();
156 Wait();
157 }
158
159
160
161
162
163
ShowUnpRead(Int64 ArcPos,Int64 ArcSize)164 void ComprDataIO::ShowUnpRead(Int64 ArcPos,Int64 ArcSize)
165 {
166 if (ShowProgress && SrcFile!=NULL)
167 {
168 Archive *SrcArc=(Archive *)SrcFile;
169 RAROptions *Cmd=SrcArc->GetRAROptions();
170 if (TotalArcSize!=0)
171 ArcSize=TotalArcSize;
172 ArcPos+=ProcessedArcSize;
173 if (!SrcArc->Volume)
174 {
175 int CurPercent=ToPercent(ArcPos,ArcSize);
176 if (!Cmd->DisablePercentage && CurPercent!=LastPercent)
177 {
178 mprintf("\b\b\b\b%3d%%",CurPercent);
179 LastPercent=CurPercent;
180 }
181 }
182 }
183 }
184
185
ShowUnpWrite()186 void ComprDataIO::ShowUnpWrite()
187 {
188 }
189
190
191
192
193
194
195
196
SetFiles(File * SrcFile,File * DestFile)197 void ComprDataIO::SetFiles(File *SrcFile,File *DestFile)
198 {
199 if (SrcFile!=NULL)
200 ComprDataIO::SrcFile=SrcFile;
201 if (DestFile!=NULL)
202 ComprDataIO::DestFile=DestFile;
203 LastPercent=-1;
204 }
205
206
GetUnpackedData(byte ** Data,uint * Size)207 void ComprDataIO::GetUnpackedData(byte **Data,uint *Size)
208 {
209 *Data=UnpWrAddr;
210 *Size=UnpWrSize;
211 }
212
213
SetEncryption(int Method,char * Password,byte * Salt,bool Encrypt)214 void ComprDataIO::SetEncryption(int Method,char *Password,byte *Salt,bool Encrypt)
215 {
216 if (Encrypt)
217 {
218 Encryption=*Password ? Method:0;
219 #ifndef NOCRYPT
220 Crypt.SetCryptKeys(Password,Salt,Encrypt);
221 #endif
222 }
223 else
224 {
225 Decryption=*Password ? Method:0;
226 #ifndef NOCRYPT
227 Decrypt.SetCryptKeys(Password,Salt,Encrypt,Method<29);
228 #endif
229 }
230 }
231
232
233 #ifndef SFX_MODULE
SetAV15Encryption()234 void ComprDataIO::SetAV15Encryption()
235 {
236 Decryption=15;
237 Decrypt.SetAV15Encryption();
238 }
239 #endif
240
241
242 #ifndef SFX_MODULE
SetCmt13Encryption()243 void ComprDataIO::SetCmt13Encryption()
244 {
245 Decryption=13;
246 Decrypt.SetCmt13Encryption();
247 }
248 #endif
249
250
251
252
SetUnpackToMemory(byte * Addr,uint Size)253 void ComprDataIO::SetUnpackToMemory(byte *Addr,uint Size)
254 {
255 UnpackToMemory=true;
256 UnpackToMemoryAddr=Addr;
257 UnpackToMemorySize=Size;
258 }
259
260
261