1*f6dc9357SAndroid Build Coastguard Worker // ExtractEngine.cpp
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileDir.h"
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileName.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Thread.h"
8*f6dc9357SAndroid Build Coastguard Worker
9*f6dc9357SAndroid Build Coastguard Worker #include "../../UI/Common/OpenArchive.h"
10*f6dc9357SAndroid Build Coastguard Worker
11*f6dc9357SAndroid Build Coastguard Worker #include "../../UI/FileManager/FormatUtils.h"
12*f6dc9357SAndroid Build Coastguard Worker #include "../../UI/FileManager/LangUtils.h"
13*f6dc9357SAndroid Build Coastguard Worker
14*f6dc9357SAndroid Build Coastguard Worker #include "ExtractCallbackSfx.h"
15*f6dc9357SAndroid Build Coastguard Worker #include "ExtractEngine.h"
16*f6dc9357SAndroid Build Coastguard Worker
17*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
18*f6dc9357SAndroid Build Coastguard Worker using namespace NFile;
19*f6dc9357SAndroid Build Coastguard Worker using namespace NDir;
20*f6dc9357SAndroid Build Coastguard Worker
21*f6dc9357SAndroid Build Coastguard Worker static LPCSTR const kCantFindArchive = "Cannot find archive file";
22*f6dc9357SAndroid Build Coastguard Worker static LPCSTR const kCantOpenArchive = "Cannot open the file as archive";
23*f6dc9357SAndroid Build Coastguard Worker
24*f6dc9357SAndroid Build Coastguard Worker struct CThreadExtracting
25*f6dc9357SAndroid Build Coastguard Worker {
26*f6dc9357SAndroid Build Coastguard Worker CCodecs *Codecs;
27*f6dc9357SAndroid Build Coastguard Worker FString FileName;
28*f6dc9357SAndroid Build Coastguard Worker FString DestFolder;
29*f6dc9357SAndroid Build Coastguard Worker
30*f6dc9357SAndroid Build Coastguard Worker CExtractCallbackImp *ExtractCallbackSpec;
31*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IArchiveExtractCallback> ExtractCallback;
32*f6dc9357SAndroid Build Coastguard Worker
33*f6dc9357SAndroid Build Coastguard Worker CArchiveLink ArchiveLink;
34*f6dc9357SAndroid Build Coastguard Worker HRESULT Result;
35*f6dc9357SAndroid Build Coastguard Worker UString ErrorMessage;
36*f6dc9357SAndroid Build Coastguard Worker
Process2CThreadExtracting37*f6dc9357SAndroid Build Coastguard Worker void Process2()
38*f6dc9357SAndroid Build Coastguard Worker {
39*f6dc9357SAndroid Build Coastguard Worker NFind::CFileInfo fi;
40*f6dc9357SAndroid Build Coastguard Worker if (!fi.Find(FileName))
41*f6dc9357SAndroid Build Coastguard Worker {
42*f6dc9357SAndroid Build Coastguard Worker ErrorMessage = kCantFindArchive;
43*f6dc9357SAndroid Build Coastguard Worker Result = E_FAIL;
44*f6dc9357SAndroid Build Coastguard Worker return;
45*f6dc9357SAndroid Build Coastguard Worker }
46*f6dc9357SAndroid Build Coastguard Worker
47*f6dc9357SAndroid Build Coastguard Worker CObjectVector<COpenType> incl;
48*f6dc9357SAndroid Build Coastguard Worker CIntVector excl;
49*f6dc9357SAndroid Build Coastguard Worker COpenOptions options;
50*f6dc9357SAndroid Build Coastguard Worker options.codecs = Codecs;
51*f6dc9357SAndroid Build Coastguard Worker options.types = &incl;
52*f6dc9357SAndroid Build Coastguard Worker options.excludedFormats = !
53*f6dc9357SAndroid Build Coastguard Worker options.filePath = fs2us(FileName);
54*f6dc9357SAndroid Build Coastguard Worker
55*f6dc9357SAndroid Build Coastguard Worker Result = ArchiveLink.Open2(options, ExtractCallbackSpec);
56*f6dc9357SAndroid Build Coastguard Worker if (Result != S_OK)
57*f6dc9357SAndroid Build Coastguard Worker {
58*f6dc9357SAndroid Build Coastguard Worker ErrorMessage = kCantOpenArchive;
59*f6dc9357SAndroid Build Coastguard Worker return;
60*f6dc9357SAndroid Build Coastguard Worker }
61*f6dc9357SAndroid Build Coastguard Worker
62*f6dc9357SAndroid Build Coastguard Worker FString dirPath = DestFolder;
63*f6dc9357SAndroid Build Coastguard Worker NName::NormalizeDirPathPrefix(dirPath);
64*f6dc9357SAndroid Build Coastguard Worker
65*f6dc9357SAndroid Build Coastguard Worker if (!CreateComplexDir(dirPath))
66*f6dc9357SAndroid Build Coastguard Worker {
67*f6dc9357SAndroid Build Coastguard Worker ErrorMessage = MyFormatNew(IDS_CANNOT_CREATE_FOLDER, fs2us(dirPath));
68*f6dc9357SAndroid Build Coastguard Worker Result = E_FAIL;
69*f6dc9357SAndroid Build Coastguard Worker return;
70*f6dc9357SAndroid Build Coastguard Worker }
71*f6dc9357SAndroid Build Coastguard Worker
72*f6dc9357SAndroid Build Coastguard Worker ExtractCallbackSpec->Init(ArchiveLink.GetArchive(), dirPath, (UString)"Default", fi.MTime, 0);
73*f6dc9357SAndroid Build Coastguard Worker
74*f6dc9357SAndroid Build Coastguard Worker Result = ArchiveLink.GetArchive()->Extract(NULL, (UInt32)(Int32)-1 , BoolToInt(false), ExtractCallback);
75*f6dc9357SAndroid Build Coastguard Worker }
76*f6dc9357SAndroid Build Coastguard Worker
ProcessCThreadExtracting77*f6dc9357SAndroid Build Coastguard Worker void Process()
78*f6dc9357SAndroid Build Coastguard Worker {
79*f6dc9357SAndroid Build Coastguard Worker try
80*f6dc9357SAndroid Build Coastguard Worker {
81*f6dc9357SAndroid Build Coastguard Worker #ifndef _NO_PROGRESS
82*f6dc9357SAndroid Build Coastguard Worker CProgressCloser closer(ExtractCallbackSpec->ProgressDialog);
83*f6dc9357SAndroid Build Coastguard Worker #endif
84*f6dc9357SAndroid Build Coastguard Worker Process2();
85*f6dc9357SAndroid Build Coastguard Worker }
86*f6dc9357SAndroid Build Coastguard Worker catch(...) { Result = E_FAIL; }
87*f6dc9357SAndroid Build Coastguard Worker }
88*f6dc9357SAndroid Build Coastguard Worker
MyThreadFunctionCThreadExtracting89*f6dc9357SAndroid Build Coastguard Worker static THREAD_FUNC_DECL MyThreadFunction(void *param)
90*f6dc9357SAndroid Build Coastguard Worker {
91*f6dc9357SAndroid Build Coastguard Worker ((CThreadExtracting *)param)->Process();
92*f6dc9357SAndroid Build Coastguard Worker return 0;
93*f6dc9357SAndroid Build Coastguard Worker }
94*f6dc9357SAndroid Build Coastguard Worker };
95*f6dc9357SAndroid Build Coastguard Worker
ExtractArchive(CCodecs * codecs,const FString & fileName,const FString & destFolder,bool showProgress,bool & isCorrupt,UString & errorMessage)96*f6dc9357SAndroid Build Coastguard Worker HRESULT ExtractArchive(CCodecs *codecs, const FString &fileName, const FString &destFolder,
97*f6dc9357SAndroid Build Coastguard Worker bool showProgress, bool &isCorrupt, UString &errorMessage)
98*f6dc9357SAndroid Build Coastguard Worker {
99*f6dc9357SAndroid Build Coastguard Worker isCorrupt = false;
100*f6dc9357SAndroid Build Coastguard Worker CThreadExtracting t;
101*f6dc9357SAndroid Build Coastguard Worker
102*f6dc9357SAndroid Build Coastguard Worker t.Codecs = codecs;
103*f6dc9357SAndroid Build Coastguard Worker t.FileName = fileName;
104*f6dc9357SAndroid Build Coastguard Worker t.DestFolder = destFolder;
105*f6dc9357SAndroid Build Coastguard Worker
106*f6dc9357SAndroid Build Coastguard Worker t.ExtractCallbackSpec = new CExtractCallbackImp;
107*f6dc9357SAndroid Build Coastguard Worker t.ExtractCallback = t.ExtractCallbackSpec;
108*f6dc9357SAndroid Build Coastguard Worker
109*f6dc9357SAndroid Build Coastguard Worker #ifndef _NO_PROGRESS
110*f6dc9357SAndroid Build Coastguard Worker
111*f6dc9357SAndroid Build Coastguard Worker if (showProgress)
112*f6dc9357SAndroid Build Coastguard Worker {
113*f6dc9357SAndroid Build Coastguard Worker t.ExtractCallbackSpec->ProgressDialog.IconID = IDI_ICON;
114*f6dc9357SAndroid Build Coastguard Worker NWindows::CThread thread;
115*f6dc9357SAndroid Build Coastguard Worker const WRes wres = thread.Create(CThreadExtracting::MyThreadFunction, &t);
116*f6dc9357SAndroid Build Coastguard Worker if (wres != 0)
117*f6dc9357SAndroid Build Coastguard Worker return HRESULT_FROM_WIN32(wres);
118*f6dc9357SAndroid Build Coastguard Worker
119*f6dc9357SAndroid Build Coastguard Worker UString title;
120*f6dc9357SAndroid Build Coastguard Worker LangString(IDS_PROGRESS_EXTRACTING, title);
121*f6dc9357SAndroid Build Coastguard Worker t.ExtractCallbackSpec->StartProgressDialog(title, thread);
122*f6dc9357SAndroid Build Coastguard Worker }
123*f6dc9357SAndroid Build Coastguard Worker else
124*f6dc9357SAndroid Build Coastguard Worker
125*f6dc9357SAndroid Build Coastguard Worker #endif
126*f6dc9357SAndroid Build Coastguard Worker {
127*f6dc9357SAndroid Build Coastguard Worker t.Process2();
128*f6dc9357SAndroid Build Coastguard Worker }
129*f6dc9357SAndroid Build Coastguard Worker
130*f6dc9357SAndroid Build Coastguard Worker errorMessage = t.ErrorMessage;
131*f6dc9357SAndroid Build Coastguard Worker if (errorMessage.IsEmpty())
132*f6dc9357SAndroid Build Coastguard Worker errorMessage = t.ExtractCallbackSpec->_message;
133*f6dc9357SAndroid Build Coastguard Worker isCorrupt = t.ExtractCallbackSpec->_isCorrupt;
134*f6dc9357SAndroid Build Coastguard Worker return t.Result;
135*f6dc9357SAndroid Build Coastguard Worker }
136