1*f6dc9357SAndroid Build Coastguard Worker // ExtractEngine.h
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Synchronization.h"
7*f6dc9357SAndroid Build Coastguard Worker #endif
8*f6dc9357SAndroid Build Coastguard Worker
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
10*f6dc9357SAndroid Build Coastguard Worker
11*f6dc9357SAndroid Build Coastguard Worker #include "ExtractEngine.h"
12*f6dc9357SAndroid Build Coastguard Worker #include "FarUtils.h"
13*f6dc9357SAndroid Build Coastguard Worker #include "Messages.h"
14*f6dc9357SAndroid Build Coastguard Worker #include "OverwriteDialogFar.h"
15*f6dc9357SAndroid Build Coastguard Worker
16*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
17*f6dc9357SAndroid Build Coastguard Worker using namespace NFar;
18*f6dc9357SAndroid Build Coastguard Worker
19*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST
20*f6dc9357SAndroid Build Coastguard Worker static NSynchronization::CCriticalSection g_CriticalSection;
21*f6dc9357SAndroid Build Coastguard Worker #define MT_LOCK NSynchronization::CCriticalSectionLock lock(g_CriticalSection);
22*f6dc9357SAndroid Build Coastguard Worker #else
23*f6dc9357SAndroid Build Coastguard Worker #define MT_LOCK
24*f6dc9357SAndroid Build Coastguard Worker #endif
25*f6dc9357SAndroid Build Coastguard Worker
26*f6dc9357SAndroid Build Coastguard Worker
CheckBreak2()27*f6dc9357SAndroid Build Coastguard Worker static HRESULT CheckBreak2()
28*f6dc9357SAndroid Build Coastguard Worker {
29*f6dc9357SAndroid Build Coastguard Worker return WasEscPressed() ? E_ABORT : S_OK;
30*f6dc9357SAndroid Build Coastguard Worker }
31*f6dc9357SAndroid Build Coastguard Worker
32*f6dc9357SAndroid Build Coastguard Worker extern void PrintMessage(const char *message);
33*f6dc9357SAndroid Build Coastguard Worker
Init(UINT codePage,CProgressBox * progressBox,bool passwordIsDefined,const UString & password)34*f6dc9357SAndroid Build Coastguard Worker void CExtractCallbackImp::Init(
35*f6dc9357SAndroid Build Coastguard Worker UINT codePage,
36*f6dc9357SAndroid Build Coastguard Worker CProgressBox *progressBox,
37*f6dc9357SAndroid Build Coastguard Worker bool passwordIsDefined,
38*f6dc9357SAndroid Build Coastguard Worker const UString &password)
39*f6dc9357SAndroid Build Coastguard Worker {
40*f6dc9357SAndroid Build Coastguard Worker m_PasswordIsDefined = passwordIsDefined;
41*f6dc9357SAndroid Build Coastguard Worker m_Password = password;
42*f6dc9357SAndroid Build Coastguard Worker m_CodePage = codePage;
43*f6dc9357SAndroid Build Coastguard Worker _percent = progressBox;
44*f6dc9357SAndroid Build Coastguard Worker }
45*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CExtractCallbackImp::SetTotal (UInt64 size))46*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackImp::SetTotal(UInt64 size))
47*f6dc9357SAndroid Build Coastguard Worker {
48*f6dc9357SAndroid Build Coastguard Worker MT_LOCK
49*f6dc9357SAndroid Build Coastguard Worker
50*f6dc9357SAndroid Build Coastguard Worker if (_percent)
51*f6dc9357SAndroid Build Coastguard Worker {
52*f6dc9357SAndroid Build Coastguard Worker _percent->Total = size;
53*f6dc9357SAndroid Build Coastguard Worker _percent->Print();
54*f6dc9357SAndroid Build Coastguard Worker }
55*f6dc9357SAndroid Build Coastguard Worker return CheckBreak2();
56*f6dc9357SAndroid Build Coastguard Worker }
57*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CExtractCallbackImp::SetCompleted (const UInt64 * completeValue))58*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackImp::SetCompleted(const UInt64 *completeValue))
59*f6dc9357SAndroid Build Coastguard Worker {
60*f6dc9357SAndroid Build Coastguard Worker MT_LOCK
61*f6dc9357SAndroid Build Coastguard Worker
62*f6dc9357SAndroid Build Coastguard Worker if (_percent)
63*f6dc9357SAndroid Build Coastguard Worker {
64*f6dc9357SAndroid Build Coastguard Worker if (completeValue)
65*f6dc9357SAndroid Build Coastguard Worker _percent->Completed = *completeValue;
66*f6dc9357SAndroid Build Coastguard Worker _percent->Print();
67*f6dc9357SAndroid Build Coastguard Worker }
68*f6dc9357SAndroid Build Coastguard Worker return CheckBreak2();
69*f6dc9357SAndroid Build Coastguard Worker }
70*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CExtractCallbackImp::AskOverwrite (const wchar_t * existName,const FILETIME * existTime,const UInt64 * existSize,const wchar_t * newName,const FILETIME * newTime,const UInt64 * newSize,Int32 * answer))71*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackImp::AskOverwrite(
72*f6dc9357SAndroid Build Coastguard Worker const wchar_t *existName, const FILETIME *existTime, const UInt64 *existSize,
73*f6dc9357SAndroid Build Coastguard Worker const wchar_t *newName, const FILETIME *newTime, const UInt64 *newSize,
74*f6dc9357SAndroid Build Coastguard Worker Int32 *answer))
75*f6dc9357SAndroid Build Coastguard Worker {
76*f6dc9357SAndroid Build Coastguard Worker MT_LOCK
77*f6dc9357SAndroid Build Coastguard Worker
78*f6dc9357SAndroid Build Coastguard Worker NOverwriteDialog::CFileInfo oldFileInfo, newFileInfo;
79*f6dc9357SAndroid Build Coastguard Worker oldFileInfo.TimeIsDefined = (existTime != NULL);
80*f6dc9357SAndroid Build Coastguard Worker if (oldFileInfo.TimeIsDefined)
81*f6dc9357SAndroid Build Coastguard Worker oldFileInfo.Time = *existTime;
82*f6dc9357SAndroid Build Coastguard Worker oldFileInfo.SizeIsDefined = (existSize != NULL);
83*f6dc9357SAndroid Build Coastguard Worker if (oldFileInfo.SizeIsDefined)
84*f6dc9357SAndroid Build Coastguard Worker oldFileInfo.Size = *existSize;
85*f6dc9357SAndroid Build Coastguard Worker oldFileInfo.Name = existName;
86*f6dc9357SAndroid Build Coastguard Worker
87*f6dc9357SAndroid Build Coastguard Worker newFileInfo.TimeIsDefined = (newTime != NULL);
88*f6dc9357SAndroid Build Coastguard Worker if (newFileInfo.TimeIsDefined)
89*f6dc9357SAndroid Build Coastguard Worker newFileInfo.Time = *newTime;
90*f6dc9357SAndroid Build Coastguard Worker newFileInfo.SizeIsDefined = (newSize != NULL);
91*f6dc9357SAndroid Build Coastguard Worker if (newFileInfo.SizeIsDefined)
92*f6dc9357SAndroid Build Coastguard Worker newFileInfo.Size = *newSize;
93*f6dc9357SAndroid Build Coastguard Worker newFileInfo.Name = newName;
94*f6dc9357SAndroid Build Coastguard Worker
95*f6dc9357SAndroid Build Coastguard Worker NOverwriteDialog::NResult::EEnum result =
96*f6dc9357SAndroid Build Coastguard Worker NOverwriteDialog::Execute(oldFileInfo, newFileInfo);
97*f6dc9357SAndroid Build Coastguard Worker
98*f6dc9357SAndroid Build Coastguard Worker switch ((int)result)
99*f6dc9357SAndroid Build Coastguard Worker {
100*f6dc9357SAndroid Build Coastguard Worker case NOverwriteDialog::NResult::kCancel:
101*f6dc9357SAndroid Build Coastguard Worker // *answer = NOverwriteAnswer::kCancel;
102*f6dc9357SAndroid Build Coastguard Worker // break;
103*f6dc9357SAndroid Build Coastguard Worker return E_ABORT;
104*f6dc9357SAndroid Build Coastguard Worker case NOverwriteDialog::NResult::kNo:
105*f6dc9357SAndroid Build Coastguard Worker *answer = NOverwriteAnswer::kNo;
106*f6dc9357SAndroid Build Coastguard Worker break;
107*f6dc9357SAndroid Build Coastguard Worker case NOverwriteDialog::NResult::kNoToAll:
108*f6dc9357SAndroid Build Coastguard Worker *answer = NOverwriteAnswer::kNoToAll;
109*f6dc9357SAndroid Build Coastguard Worker break;
110*f6dc9357SAndroid Build Coastguard Worker case NOverwriteDialog::NResult::kYesToAll:
111*f6dc9357SAndroid Build Coastguard Worker *answer = NOverwriteAnswer::kYesToAll;
112*f6dc9357SAndroid Build Coastguard Worker break;
113*f6dc9357SAndroid Build Coastguard Worker case NOverwriteDialog::NResult::kYes:
114*f6dc9357SAndroid Build Coastguard Worker *answer = NOverwriteAnswer::kYes;
115*f6dc9357SAndroid Build Coastguard Worker break;
116*f6dc9357SAndroid Build Coastguard Worker case NOverwriteDialog::NResult::kAutoRename:
117*f6dc9357SAndroid Build Coastguard Worker *answer = NOverwriteAnswer::kAutoRename;
118*f6dc9357SAndroid Build Coastguard Worker break;
119*f6dc9357SAndroid Build Coastguard Worker default:
120*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
121*f6dc9357SAndroid Build Coastguard Worker }
122*f6dc9357SAndroid Build Coastguard Worker
123*f6dc9357SAndroid Build Coastguard Worker return CheckBreak2();
124*f6dc9357SAndroid Build Coastguard Worker }
125*f6dc9357SAndroid Build Coastguard Worker
126*f6dc9357SAndroid Build Coastguard Worker static const char * const kTestString = "Testing";
127*f6dc9357SAndroid Build Coastguard Worker static const char * const kExtractString = "Extracting";
128*f6dc9357SAndroid Build Coastguard Worker static const char * const kSkipString = "Skipping";
129*f6dc9357SAndroid Build Coastguard Worker static const char * const kReadString = "Reading";
130*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CExtractCallbackImp::PrepareOperation (const wchar_t * name,Int32,Int32 askExtractMode,const UInt64 *))131*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackImp::PrepareOperation(const wchar_t *name, Int32 /* isFolder */, Int32 askExtractMode, const UInt64 * /* position */))
132*f6dc9357SAndroid Build Coastguard Worker {
133*f6dc9357SAndroid Build Coastguard Worker MT_LOCK
134*f6dc9357SAndroid Build Coastguard Worker
135*f6dc9357SAndroid Build Coastguard Worker m_CurrentFilePath = name;
136*f6dc9357SAndroid Build Coastguard Worker const char *s;
137*f6dc9357SAndroid Build Coastguard Worker
138*f6dc9357SAndroid Build Coastguard Worker switch (askExtractMode)
139*f6dc9357SAndroid Build Coastguard Worker {
140*f6dc9357SAndroid Build Coastguard Worker case NArchive::NExtract::NAskMode::kExtract: s = kExtractString; break;
141*f6dc9357SAndroid Build Coastguard Worker case NArchive::NExtract::NAskMode::kTest: s = kTestString; break;
142*f6dc9357SAndroid Build Coastguard Worker case NArchive::NExtract::NAskMode::kSkip: s = kSkipString; break;
143*f6dc9357SAndroid Build Coastguard Worker case NArchive::NExtract::NAskMode::kReadExternal: s = kReadString; break;
144*f6dc9357SAndroid Build Coastguard Worker default: s = "???"; // return E_FAIL;
145*f6dc9357SAndroid Build Coastguard Worker }
146*f6dc9357SAndroid Build Coastguard Worker
147*f6dc9357SAndroid Build Coastguard Worker if (_percent)
148*f6dc9357SAndroid Build Coastguard Worker {
149*f6dc9357SAndroid Build Coastguard Worker _percent->Command = s;
150*f6dc9357SAndroid Build Coastguard Worker _percent->FileName = name;
151*f6dc9357SAndroid Build Coastguard Worker _percent->Print();
152*f6dc9357SAndroid Build Coastguard Worker }
153*f6dc9357SAndroid Build Coastguard Worker
154*f6dc9357SAndroid Build Coastguard Worker return CheckBreak2();
155*f6dc9357SAndroid Build Coastguard Worker }
156*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CExtractCallbackImp::MessageError (const wchar_t * message))157*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackImp::MessageError(const wchar_t *message))
158*f6dc9357SAndroid Build Coastguard Worker {
159*f6dc9357SAndroid Build Coastguard Worker MT_LOCK
160*f6dc9357SAndroid Build Coastguard Worker
161*f6dc9357SAndroid Build Coastguard Worker AString s (UnicodeStringToMultiByte(message, CP_OEMCP));
162*f6dc9357SAndroid Build Coastguard Worker if (g_StartupInfo.ShowErrorMessage((const char *)s) == -1)
163*f6dc9357SAndroid Build Coastguard Worker return E_ABORT;
164*f6dc9357SAndroid Build Coastguard Worker
165*f6dc9357SAndroid Build Coastguard Worker return CheckBreak2();
166*f6dc9357SAndroid Build Coastguard Worker }
167*f6dc9357SAndroid Build Coastguard Worker
168*f6dc9357SAndroid Build Coastguard Worker void SetExtractErrorMessage(Int32 opRes, Int32 encrypted, AString &s);
SetExtractErrorMessage(Int32 opRes,Int32 encrypted,AString & s)169*f6dc9357SAndroid Build Coastguard Worker void SetExtractErrorMessage(Int32 opRes, Int32 encrypted, AString &s)
170*f6dc9357SAndroid Build Coastguard Worker {
171*f6dc9357SAndroid Build Coastguard Worker s.Empty();
172*f6dc9357SAndroid Build Coastguard Worker
173*f6dc9357SAndroid Build Coastguard Worker switch (opRes)
174*f6dc9357SAndroid Build Coastguard Worker {
175*f6dc9357SAndroid Build Coastguard Worker case NArchive::NExtract::NOperationResult::kOK:
176*f6dc9357SAndroid Build Coastguard Worker return;
177*f6dc9357SAndroid Build Coastguard Worker default:
178*f6dc9357SAndroid Build Coastguard Worker {
179*f6dc9357SAndroid Build Coastguard Worker UINT messageID = 0;
180*f6dc9357SAndroid Build Coastguard Worker switch (opRes)
181*f6dc9357SAndroid Build Coastguard Worker {
182*f6dc9357SAndroid Build Coastguard Worker case NArchive::NExtract::NOperationResult::kUnsupportedMethod:
183*f6dc9357SAndroid Build Coastguard Worker messageID = NMessageID::kExtractUnsupportedMethod;
184*f6dc9357SAndroid Build Coastguard Worker break;
185*f6dc9357SAndroid Build Coastguard Worker case NArchive::NExtract::NOperationResult::kCRCError:
186*f6dc9357SAndroid Build Coastguard Worker messageID = encrypted ?
187*f6dc9357SAndroid Build Coastguard Worker NMessageID::kExtractCRCFailedEncrypted :
188*f6dc9357SAndroid Build Coastguard Worker NMessageID::kExtractCRCFailed;
189*f6dc9357SAndroid Build Coastguard Worker break;
190*f6dc9357SAndroid Build Coastguard Worker case NArchive::NExtract::NOperationResult::kDataError:
191*f6dc9357SAndroid Build Coastguard Worker messageID = encrypted ?
192*f6dc9357SAndroid Build Coastguard Worker NMessageID::kExtractDataErrorEncrypted :
193*f6dc9357SAndroid Build Coastguard Worker NMessageID::kExtractDataError;
194*f6dc9357SAndroid Build Coastguard Worker break;
195*f6dc9357SAndroid Build Coastguard Worker }
196*f6dc9357SAndroid Build Coastguard Worker if (messageID != 0)
197*f6dc9357SAndroid Build Coastguard Worker {
198*f6dc9357SAndroid Build Coastguard Worker s = g_StartupInfo.GetMsgString((int)messageID);
199*f6dc9357SAndroid Build Coastguard Worker s.Replace((AString)" '%s'", AString());
200*f6dc9357SAndroid Build Coastguard Worker }
201*f6dc9357SAndroid Build Coastguard Worker else if (opRes == NArchive::NExtract::NOperationResult::kUnavailable)
202*f6dc9357SAndroid Build Coastguard Worker s = "Unavailable data";
203*f6dc9357SAndroid Build Coastguard Worker else if (opRes == NArchive::NExtract::NOperationResult::kUnexpectedEnd)
204*f6dc9357SAndroid Build Coastguard Worker s = "Unexpected end of data";
205*f6dc9357SAndroid Build Coastguard Worker else if (opRes == NArchive::NExtract::NOperationResult::kDataAfterEnd)
206*f6dc9357SAndroid Build Coastguard Worker s = "There are some data after the end of the payload data";
207*f6dc9357SAndroid Build Coastguard Worker else if (opRes == NArchive::NExtract::NOperationResult::kIsNotArc)
208*f6dc9357SAndroid Build Coastguard Worker s = "Is not archive";
209*f6dc9357SAndroid Build Coastguard Worker else if (opRes == NArchive::NExtract::NOperationResult::kHeadersError)
210*f6dc9357SAndroid Build Coastguard Worker s = "kHeaders Error";
211*f6dc9357SAndroid Build Coastguard Worker else if (opRes == NArchive::NExtract::NOperationResult::kWrongPassword)
212*f6dc9357SAndroid Build Coastguard Worker s = "Wrong Password";
213*f6dc9357SAndroid Build Coastguard Worker else
214*f6dc9357SAndroid Build Coastguard Worker {
215*f6dc9357SAndroid Build Coastguard Worker s = "Error #";
216*f6dc9357SAndroid Build Coastguard Worker s.Add_UInt32((UInt32)opRes);
217*f6dc9357SAndroid Build Coastguard Worker }
218*f6dc9357SAndroid Build Coastguard Worker }
219*f6dc9357SAndroid Build Coastguard Worker }
220*f6dc9357SAndroid Build Coastguard Worker }
221*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CExtractCallbackImp::SetOperationResult (Int32 opRes,Int32 encrypted))222*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackImp::SetOperationResult(Int32 opRes, Int32 encrypted))
223*f6dc9357SAndroid Build Coastguard Worker {
224*f6dc9357SAndroid Build Coastguard Worker MT_LOCK
225*f6dc9357SAndroid Build Coastguard Worker
226*f6dc9357SAndroid Build Coastguard Worker if (opRes == NArchive::NExtract::NOperationResult::kOK)
227*f6dc9357SAndroid Build Coastguard Worker {
228*f6dc9357SAndroid Build Coastguard Worker if (_percent)
229*f6dc9357SAndroid Build Coastguard Worker {
230*f6dc9357SAndroid Build Coastguard Worker _percent->Command.Empty();
231*f6dc9357SAndroid Build Coastguard Worker _percent->FileName.Empty();
232*f6dc9357SAndroid Build Coastguard Worker _percent->Files++;
233*f6dc9357SAndroid Build Coastguard Worker }
234*f6dc9357SAndroid Build Coastguard Worker }
235*f6dc9357SAndroid Build Coastguard Worker else
236*f6dc9357SAndroid Build Coastguard Worker {
237*f6dc9357SAndroid Build Coastguard Worker AString s;
238*f6dc9357SAndroid Build Coastguard Worker SetExtractErrorMessage(opRes, encrypted, s);
239*f6dc9357SAndroid Build Coastguard Worker if (PrintErrorMessage(s, m_CurrentFilePath) == -1)
240*f6dc9357SAndroid Build Coastguard Worker return E_ABORT;
241*f6dc9357SAndroid Build Coastguard Worker }
242*f6dc9357SAndroid Build Coastguard Worker
243*f6dc9357SAndroid Build Coastguard Worker return CheckBreak2();
244*f6dc9357SAndroid Build Coastguard Worker }
245*f6dc9357SAndroid Build Coastguard Worker
246*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CExtractCallbackImp::ReportExtractResult (Int32 opRes,Int32 encrypted,const wchar_t * name))247*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackImp::ReportExtractResult(Int32 opRes, Int32 encrypted, const wchar_t *name))
248*f6dc9357SAndroid Build Coastguard Worker {
249*f6dc9357SAndroid Build Coastguard Worker MT_LOCK
250*f6dc9357SAndroid Build Coastguard Worker
251*f6dc9357SAndroid Build Coastguard Worker if (opRes != NArchive::NExtract::NOperationResult::kOK)
252*f6dc9357SAndroid Build Coastguard Worker {
253*f6dc9357SAndroid Build Coastguard Worker AString s;
254*f6dc9357SAndroid Build Coastguard Worker SetExtractErrorMessage(opRes, encrypted, s);
255*f6dc9357SAndroid Build Coastguard Worker if (PrintErrorMessage(s, name) == -1)
256*f6dc9357SAndroid Build Coastguard Worker return E_ABORT;
257*f6dc9357SAndroid Build Coastguard Worker }
258*f6dc9357SAndroid Build Coastguard Worker
259*f6dc9357SAndroid Build Coastguard Worker return CheckBreak2();
260*f6dc9357SAndroid Build Coastguard Worker }
261*f6dc9357SAndroid Build Coastguard Worker
262*f6dc9357SAndroid Build Coastguard Worker extern HRESULT GetPassword(UString &password);
263*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CExtractCallbackImp::CryptoGetTextPassword (BSTR * password))264*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackImp::CryptoGetTextPassword(BSTR *password))
265*f6dc9357SAndroid Build Coastguard Worker {
266*f6dc9357SAndroid Build Coastguard Worker MT_LOCK
267*f6dc9357SAndroid Build Coastguard Worker
268*f6dc9357SAndroid Build Coastguard Worker if (!m_PasswordIsDefined)
269*f6dc9357SAndroid Build Coastguard Worker {
270*f6dc9357SAndroid Build Coastguard Worker RINOK(GetPassword(m_Password))
271*f6dc9357SAndroid Build Coastguard Worker m_PasswordIsDefined = true;
272*f6dc9357SAndroid Build Coastguard Worker }
273*f6dc9357SAndroid Build Coastguard Worker return StringToBstr(m_Password, password);
274*f6dc9357SAndroid Build Coastguard Worker }
275