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