1*f6dc9357SAndroid Build Coastguard Worker // FileFolderPluginOpen.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 "resource.h"
6*f6dc9357SAndroid Build Coastguard Worker
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileName.h"
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Thread.h"
9*f6dc9357SAndroid Build Coastguard Worker
10*f6dc9357SAndroid Build Coastguard Worker #include "../Agent/Agent.h"
11*f6dc9357SAndroid Build Coastguard Worker #include "../GUI/ExtractRes.h"
12*f6dc9357SAndroid Build Coastguard Worker
13*f6dc9357SAndroid Build Coastguard Worker #include "FileFolderPluginOpen.h"
14*f6dc9357SAndroid Build Coastguard Worker #include "FormatUtils.h"
15*f6dc9357SAndroid Build Coastguard Worker #include "LangUtils.h"
16*f6dc9357SAndroid Build Coastguard Worker #include "OpenCallback.h"
17*f6dc9357SAndroid Build Coastguard Worker #include "PluginLoader.h"
18*f6dc9357SAndroid Build Coastguard Worker #include "PropertyName.h"
19*f6dc9357SAndroid Build Coastguard Worker #include "RegistryPlugins.h"
20*f6dc9357SAndroid Build Coastguard Worker
21*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
22*f6dc9357SAndroid Build Coastguard Worker
23*f6dc9357SAndroid Build Coastguard Worker struct CThreadArchiveOpen
24*f6dc9357SAndroid Build Coastguard Worker {
25*f6dc9357SAndroid Build Coastguard Worker UString Path;
26*f6dc9357SAndroid Build Coastguard Worker UString ArcFormat;
27*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IInStream> InStream;
28*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderManager> FolderManager;
29*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IProgress> OpenCallbackProgress;
30*f6dc9357SAndroid Build Coastguard Worker
31*f6dc9357SAndroid Build Coastguard Worker COpenArchiveCallback *OpenCallbackSpec;
32*f6dc9357SAndroid Build Coastguard Worker /*
33*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IUnknown>
34*f6dc9357SAndroid Build Coastguard Worker // CMyComPtr<IProgress>
35*f6dc9357SAndroid Build Coastguard Worker // CMyComPtr<IArchiveOpenCallback>
36*f6dc9357SAndroid Build Coastguard Worker OpenCallbackSpec_Ref;
37*f6dc9357SAndroid Build Coastguard Worker */
38*f6dc9357SAndroid Build Coastguard Worker
39*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderFolder> Folder;
40*f6dc9357SAndroid Build Coastguard Worker HRESULT Result;
41*f6dc9357SAndroid Build Coastguard Worker
ProcessCThreadArchiveOpen42*f6dc9357SAndroid Build Coastguard Worker void Process()
43*f6dc9357SAndroid Build Coastguard Worker {
44*f6dc9357SAndroid Build Coastguard Worker try
45*f6dc9357SAndroid Build Coastguard Worker {
46*f6dc9357SAndroid Build Coastguard Worker CProgressCloser closer(OpenCallbackSpec->ProgressDialog);
47*f6dc9357SAndroid Build Coastguard Worker Result = FolderManager->OpenFolderFile(InStream, Path, ArcFormat, &Folder, OpenCallbackProgress);
48*f6dc9357SAndroid Build Coastguard Worker }
49*f6dc9357SAndroid Build Coastguard Worker catch(...) { Result = E_FAIL; }
50*f6dc9357SAndroid Build Coastguard Worker }
51*f6dc9357SAndroid Build Coastguard Worker
MyThreadFunctionCThreadArchiveOpen52*f6dc9357SAndroid Build Coastguard Worker static THREAD_FUNC_DECL MyThreadFunction(void *param)
53*f6dc9357SAndroid Build Coastguard Worker {
54*f6dc9357SAndroid Build Coastguard Worker ((CThreadArchiveOpen *)param)->Process();
55*f6dc9357SAndroid Build Coastguard Worker return 0;
56*f6dc9357SAndroid Build Coastguard Worker }
57*f6dc9357SAndroid Build Coastguard Worker };
58*f6dc9357SAndroid Build Coastguard Worker
59*f6dc9357SAndroid Build Coastguard Worker /*
60*f6dc9357SAndroid Build Coastguard Worker static int FindPlugin(const CObjectVector<CPluginInfo> &plugins, const UString &pluginName)
61*f6dc9357SAndroid Build Coastguard Worker {
62*f6dc9357SAndroid Build Coastguard Worker for (int i = 0; i < plugins.Size(); i++)
63*f6dc9357SAndroid Build Coastguard Worker if (plugins[i].Name.CompareNoCase(pluginName) == 0)
64*f6dc9357SAndroid Build Coastguard Worker return i;
65*f6dc9357SAndroid Build Coastguard Worker return -1;
66*f6dc9357SAndroid Build Coastguard Worker }
67*f6dc9357SAndroid Build Coastguard Worker */
68*f6dc9357SAndroid Build Coastguard Worker
SplitNameToPureNameAndExtension(const FString & fullName,FString & pureName,FString & extensionDelimiter,FString & extension)69*f6dc9357SAndroid Build Coastguard Worker static void SplitNameToPureNameAndExtension(const FString &fullName,
70*f6dc9357SAndroid Build Coastguard Worker FString &pureName, FString &extensionDelimiter, FString &extension)
71*f6dc9357SAndroid Build Coastguard Worker {
72*f6dc9357SAndroid Build Coastguard Worker const int index = fullName.ReverseFind_Dot();
73*f6dc9357SAndroid Build Coastguard Worker if (index < 0)
74*f6dc9357SAndroid Build Coastguard Worker {
75*f6dc9357SAndroid Build Coastguard Worker pureName = fullName;
76*f6dc9357SAndroid Build Coastguard Worker extensionDelimiter.Empty();
77*f6dc9357SAndroid Build Coastguard Worker extension.Empty();
78*f6dc9357SAndroid Build Coastguard Worker }
79*f6dc9357SAndroid Build Coastguard Worker else
80*f6dc9357SAndroid Build Coastguard Worker {
81*f6dc9357SAndroid Build Coastguard Worker pureName.SetFrom(fullName, (unsigned)index);
82*f6dc9357SAndroid Build Coastguard Worker extensionDelimiter = '.';
83*f6dc9357SAndroid Build Coastguard Worker extension = fullName.Ptr((unsigned)index + 1);
84*f6dc9357SAndroid Build Coastguard Worker }
85*f6dc9357SAndroid Build Coastguard Worker }
86*f6dc9357SAndroid Build Coastguard Worker
87*f6dc9357SAndroid Build Coastguard Worker
88*f6dc9357SAndroid Build Coastguard Worker struct CArcLevelInfo
89*f6dc9357SAndroid Build Coastguard Worker {
90*f6dc9357SAndroid Build Coastguard Worker UString Error;
91*f6dc9357SAndroid Build Coastguard Worker UString Path;
92*f6dc9357SAndroid Build Coastguard Worker UString Type;
93*f6dc9357SAndroid Build Coastguard Worker UString ErrorType;
94*f6dc9357SAndroid Build Coastguard Worker UString ErrorFlags;
95*f6dc9357SAndroid Build Coastguard Worker };
96*f6dc9357SAndroid Build Coastguard Worker
97*f6dc9357SAndroid Build Coastguard Worker
98*f6dc9357SAndroid Build Coastguard Worker struct CArcLevelsInfo
99*f6dc9357SAndroid Build Coastguard Worker {
100*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CArcLevelInfo> Levels; // LastLevel Is NON-OPEN
101*f6dc9357SAndroid Build Coastguard Worker };
102*f6dc9357SAndroid Build Coastguard Worker
103*f6dc9357SAndroid Build Coastguard Worker
104*f6dc9357SAndroid Build Coastguard Worker UString GetOpenArcErrorMessage(UInt32 errorFlags);
105*f6dc9357SAndroid Build Coastguard Worker
106*f6dc9357SAndroid Build Coastguard Worker
GetFolderLevels(CMyComPtr<IFolderFolder> & folder,CArcLevelsInfo & levels)107*f6dc9357SAndroid Build Coastguard Worker static void GetFolderLevels(CMyComPtr<IFolderFolder> &folder, CArcLevelsInfo &levels)
108*f6dc9357SAndroid Build Coastguard Worker {
109*f6dc9357SAndroid Build Coastguard Worker levels.Levels.Clear();
110*f6dc9357SAndroid Build Coastguard Worker
111*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IGetFolderArcProps> getFolderArcProps;
112*f6dc9357SAndroid Build Coastguard Worker folder.QueryInterface(IID_IGetFolderArcProps, &getFolderArcProps);
113*f6dc9357SAndroid Build Coastguard Worker
114*f6dc9357SAndroid Build Coastguard Worker if (!getFolderArcProps)
115*f6dc9357SAndroid Build Coastguard Worker return;
116*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderArcProps> arcProps;
117*f6dc9357SAndroid Build Coastguard Worker getFolderArcProps->GetFolderArcProps(&arcProps);
118*f6dc9357SAndroid Build Coastguard Worker if (!arcProps)
119*f6dc9357SAndroid Build Coastguard Worker return;
120*f6dc9357SAndroid Build Coastguard Worker
121*f6dc9357SAndroid Build Coastguard Worker UInt32 numLevels;
122*f6dc9357SAndroid Build Coastguard Worker if (arcProps->GetArcNumLevels(&numLevels) != S_OK)
123*f6dc9357SAndroid Build Coastguard Worker numLevels = 0;
124*f6dc9357SAndroid Build Coastguard Worker
125*f6dc9357SAndroid Build Coastguard Worker for (UInt32 level = 0; level <= numLevels; level++)
126*f6dc9357SAndroid Build Coastguard Worker {
127*f6dc9357SAndroid Build Coastguard Worker const PROPID propIDs[] = { kpidError, kpidPath, kpidType, kpidErrorType };
128*f6dc9357SAndroid Build Coastguard Worker
129*f6dc9357SAndroid Build Coastguard Worker CArcLevelInfo lev;
130*f6dc9357SAndroid Build Coastguard Worker
131*f6dc9357SAndroid Build Coastguard Worker for (Int32 i = 0; i < 4; i++)
132*f6dc9357SAndroid Build Coastguard Worker {
133*f6dc9357SAndroid Build Coastguard Worker CMyComBSTR name;
134*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
135*f6dc9357SAndroid Build Coastguard Worker if (arcProps->GetArcProp(level, propIDs[i], &prop) != S_OK)
136*f6dc9357SAndroid Build Coastguard Worker continue;
137*f6dc9357SAndroid Build Coastguard Worker if (prop.vt != VT_EMPTY)
138*f6dc9357SAndroid Build Coastguard Worker {
139*f6dc9357SAndroid Build Coastguard Worker UString *s = NULL;
140*f6dc9357SAndroid Build Coastguard Worker switch (propIDs[i])
141*f6dc9357SAndroid Build Coastguard Worker {
142*f6dc9357SAndroid Build Coastguard Worker case kpidError: s = &lev.Error; break;
143*f6dc9357SAndroid Build Coastguard Worker case kpidPath: s = &lev.Path; break;
144*f6dc9357SAndroid Build Coastguard Worker case kpidType: s = &lev.Type; break;
145*f6dc9357SAndroid Build Coastguard Worker case kpidErrorType: s = &lev.ErrorType; break;
146*f6dc9357SAndroid Build Coastguard Worker }
147*f6dc9357SAndroid Build Coastguard Worker *s = (prop.vt == VT_BSTR) ? prop.bstrVal : L"?";
148*f6dc9357SAndroid Build Coastguard Worker }
149*f6dc9357SAndroid Build Coastguard Worker }
150*f6dc9357SAndroid Build Coastguard Worker
151*f6dc9357SAndroid Build Coastguard Worker {
152*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
153*f6dc9357SAndroid Build Coastguard Worker if (arcProps->GetArcProp(level, kpidErrorFlags, &prop) == S_OK)
154*f6dc9357SAndroid Build Coastguard Worker {
155*f6dc9357SAndroid Build Coastguard Worker UInt32 flags = GetOpenArcErrorFlags(prop);
156*f6dc9357SAndroid Build Coastguard Worker if (flags != 0)
157*f6dc9357SAndroid Build Coastguard Worker lev.ErrorFlags = GetOpenArcErrorMessage(flags);
158*f6dc9357SAndroid Build Coastguard Worker }
159*f6dc9357SAndroid Build Coastguard Worker }
160*f6dc9357SAndroid Build Coastguard Worker
161*f6dc9357SAndroid Build Coastguard Worker levels.Levels.Add(lev);
162*f6dc9357SAndroid Build Coastguard Worker }
163*f6dc9357SAndroid Build Coastguard Worker }
164*f6dc9357SAndroid Build Coastguard Worker
GetBracedType(const wchar_t * type)165*f6dc9357SAndroid Build Coastguard Worker static UString GetBracedType(const wchar_t *type)
166*f6dc9357SAndroid Build Coastguard Worker {
167*f6dc9357SAndroid Build Coastguard Worker UString s ('[');
168*f6dc9357SAndroid Build Coastguard Worker s += type;
169*f6dc9357SAndroid Build Coastguard Worker s.Add_Char(']');
170*f6dc9357SAndroid Build Coastguard Worker return s;
171*f6dc9357SAndroid Build Coastguard Worker }
172*f6dc9357SAndroid Build Coastguard Worker
GetFolderError(CMyComPtr<IFolderFolder> & folder,UString & open_Errors,UString & nonOpen_Errors)173*f6dc9357SAndroid Build Coastguard Worker static void GetFolderError(CMyComPtr<IFolderFolder> &folder, UString &open_Errors, UString &nonOpen_Errors)
174*f6dc9357SAndroid Build Coastguard Worker {
175*f6dc9357SAndroid Build Coastguard Worker CArcLevelsInfo levs;
176*f6dc9357SAndroid Build Coastguard Worker GetFolderLevels(folder, levs);
177*f6dc9357SAndroid Build Coastguard Worker open_Errors.Empty();
178*f6dc9357SAndroid Build Coastguard Worker nonOpen_Errors.Empty();
179*f6dc9357SAndroid Build Coastguard Worker
180*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, levs.Levels)
181*f6dc9357SAndroid Build Coastguard Worker {
182*f6dc9357SAndroid Build Coastguard Worker bool isNonOpenLevel = (i == 0);
183*f6dc9357SAndroid Build Coastguard Worker const CArcLevelInfo &lev = levs.Levels[levs.Levels.Size() - 1 - i];
184*f6dc9357SAndroid Build Coastguard Worker
185*f6dc9357SAndroid Build Coastguard Worker UString m;
186*f6dc9357SAndroid Build Coastguard Worker
187*f6dc9357SAndroid Build Coastguard Worker if (!lev.ErrorType.IsEmpty())
188*f6dc9357SAndroid Build Coastguard Worker {
189*f6dc9357SAndroid Build Coastguard Worker m = MyFormatNew(IDS_CANT_OPEN_AS_TYPE, GetBracedType(lev.ErrorType));
190*f6dc9357SAndroid Build Coastguard Worker if (!isNonOpenLevel)
191*f6dc9357SAndroid Build Coastguard Worker {
192*f6dc9357SAndroid Build Coastguard Worker m.Add_LF();
193*f6dc9357SAndroid Build Coastguard Worker m += MyFormatNew(IDS_IS_OPEN_AS_TYPE, GetBracedType(lev.Type));
194*f6dc9357SAndroid Build Coastguard Worker }
195*f6dc9357SAndroid Build Coastguard Worker }
196*f6dc9357SAndroid Build Coastguard Worker
197*f6dc9357SAndroid Build Coastguard Worker if (!lev.Error.IsEmpty())
198*f6dc9357SAndroid Build Coastguard Worker {
199*f6dc9357SAndroid Build Coastguard Worker if (!m.IsEmpty())
200*f6dc9357SAndroid Build Coastguard Worker m.Add_LF();
201*f6dc9357SAndroid Build Coastguard Worker m += GetBracedType(lev.Type);
202*f6dc9357SAndroid Build Coastguard Worker m += " : ";
203*f6dc9357SAndroid Build Coastguard Worker m += GetNameOfProperty(kpidError, L"Error");
204*f6dc9357SAndroid Build Coastguard Worker m += " : ";
205*f6dc9357SAndroid Build Coastguard Worker m += lev.Error;
206*f6dc9357SAndroid Build Coastguard Worker }
207*f6dc9357SAndroid Build Coastguard Worker
208*f6dc9357SAndroid Build Coastguard Worker if (!lev.ErrorFlags.IsEmpty())
209*f6dc9357SAndroid Build Coastguard Worker {
210*f6dc9357SAndroid Build Coastguard Worker if (!m.IsEmpty())
211*f6dc9357SAndroid Build Coastguard Worker m.Add_LF();
212*f6dc9357SAndroid Build Coastguard Worker m += GetNameOfProperty(kpidErrorFlags, L"Errors");
213*f6dc9357SAndroid Build Coastguard Worker m += ": ";
214*f6dc9357SAndroid Build Coastguard Worker m += lev.ErrorFlags;
215*f6dc9357SAndroid Build Coastguard Worker }
216*f6dc9357SAndroid Build Coastguard Worker
217*f6dc9357SAndroid Build Coastguard Worker if (!m.IsEmpty())
218*f6dc9357SAndroid Build Coastguard Worker {
219*f6dc9357SAndroid Build Coastguard Worker if (isNonOpenLevel)
220*f6dc9357SAndroid Build Coastguard Worker {
221*f6dc9357SAndroid Build Coastguard Worker UString &s = nonOpen_Errors;
222*f6dc9357SAndroid Build Coastguard Worker s += lev.Path;
223*f6dc9357SAndroid Build Coastguard Worker s.Add_LF();
224*f6dc9357SAndroid Build Coastguard Worker s += m;
225*f6dc9357SAndroid Build Coastguard Worker }
226*f6dc9357SAndroid Build Coastguard Worker else
227*f6dc9357SAndroid Build Coastguard Worker {
228*f6dc9357SAndroid Build Coastguard Worker UString &s = open_Errors;
229*f6dc9357SAndroid Build Coastguard Worker if (!s.IsEmpty())
230*f6dc9357SAndroid Build Coastguard Worker s += "--------------------\n";
231*f6dc9357SAndroid Build Coastguard Worker s += lev.Path;
232*f6dc9357SAndroid Build Coastguard Worker s.Add_LF();
233*f6dc9357SAndroid Build Coastguard Worker s += m;
234*f6dc9357SAndroid Build Coastguard Worker }
235*f6dc9357SAndroid Build Coastguard Worker }
236*f6dc9357SAndroid Build Coastguard Worker }
237*f6dc9357SAndroid Build Coastguard Worker }
238*f6dc9357SAndroid Build Coastguard Worker
239*f6dc9357SAndroid Build Coastguard Worker #ifdef _MSC_VER
240*f6dc9357SAndroid Build Coastguard Worker #pragma warning(error : 4702) // unreachable code
241*f6dc9357SAndroid Build Coastguard Worker #endif
242*f6dc9357SAndroid Build Coastguard Worker
OpenFileFolderPlugin(IInStream * inStream,const FString & path,const UString & arcFormat,HWND parentWindow)243*f6dc9357SAndroid Build Coastguard Worker HRESULT CFfpOpen::OpenFileFolderPlugin(IInStream *inStream,
244*f6dc9357SAndroid Build Coastguard Worker const FString &path, const UString &arcFormat, HWND parentWindow)
245*f6dc9357SAndroid Build Coastguard Worker {
246*f6dc9357SAndroid Build Coastguard Worker /*
247*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CPluginInfo> plugins;
248*f6dc9357SAndroid Build Coastguard Worker ReadFileFolderPluginInfoList(plugins);
249*f6dc9357SAndroid Build Coastguard Worker */
250*f6dc9357SAndroid Build Coastguard Worker
251*f6dc9357SAndroid Build Coastguard Worker FString extension, name, pureName, dot;
252*f6dc9357SAndroid Build Coastguard Worker
253*f6dc9357SAndroid Build Coastguard Worker const int slashPos = path.ReverseFind_PathSepar();
254*f6dc9357SAndroid Build Coastguard Worker FString dirPrefix;
255*f6dc9357SAndroid Build Coastguard Worker FString fileName;
256*f6dc9357SAndroid Build Coastguard Worker if (slashPos >= 0)
257*f6dc9357SAndroid Build Coastguard Worker {
258*f6dc9357SAndroid Build Coastguard Worker dirPrefix.SetFrom(path, (unsigned)(slashPos + 1));
259*f6dc9357SAndroid Build Coastguard Worker fileName = path.Ptr((unsigned)(slashPos + 1));
260*f6dc9357SAndroid Build Coastguard Worker }
261*f6dc9357SAndroid Build Coastguard Worker else
262*f6dc9357SAndroid Build Coastguard Worker fileName = path;
263*f6dc9357SAndroid Build Coastguard Worker
264*f6dc9357SAndroid Build Coastguard Worker SplitNameToPureNameAndExtension(fileName, pureName, dot, extension);
265*f6dc9357SAndroid Build Coastguard Worker
266*f6dc9357SAndroid Build Coastguard Worker /*
267*f6dc9357SAndroid Build Coastguard Worker if (!extension.IsEmpty())
268*f6dc9357SAndroid Build Coastguard Worker {
269*f6dc9357SAndroid Build Coastguard Worker CExtInfo extInfo;
270*f6dc9357SAndroid Build Coastguard Worker if (ReadInternalAssociation(extension, extInfo))
271*f6dc9357SAndroid Build Coastguard Worker {
272*f6dc9357SAndroid Build Coastguard Worker for (int i = extInfo.Plugins.Size() - 1; i >= 0; i--)
273*f6dc9357SAndroid Build Coastguard Worker {
274*f6dc9357SAndroid Build Coastguard Worker int pluginIndex = FindPlugin(plugins, extInfo.Plugins[i]);
275*f6dc9357SAndroid Build Coastguard Worker if (pluginIndex >= 0)
276*f6dc9357SAndroid Build Coastguard Worker {
277*f6dc9357SAndroid Build Coastguard Worker const CPluginInfo plugin = plugins[pluginIndex];
278*f6dc9357SAndroid Build Coastguard Worker plugins.Delete(pluginIndex);
279*f6dc9357SAndroid Build Coastguard Worker plugins.Insert(0, plugin);
280*f6dc9357SAndroid Build Coastguard Worker }
281*f6dc9357SAndroid Build Coastguard Worker }
282*f6dc9357SAndroid Build Coastguard Worker }
283*f6dc9357SAndroid Build Coastguard Worker }
284*f6dc9357SAndroid Build Coastguard Worker */
285*f6dc9357SAndroid Build Coastguard Worker
286*f6dc9357SAndroid Build Coastguard Worker ErrorMessage.Empty();
287*f6dc9357SAndroid Build Coastguard Worker
288*f6dc9357SAndroid Build Coastguard Worker // FOR_VECTOR (i, plugins)
289*f6dc9357SAndroid Build Coastguard Worker // {
290*f6dc9357SAndroid Build Coastguard Worker /*
291*f6dc9357SAndroid Build Coastguard Worker const CPluginInfo &plugin = plugins[i];
292*f6dc9357SAndroid Build Coastguard Worker if (!plugin.ClassID_Defined && !plugin.FilePath.IsEmpty())
293*f6dc9357SAndroid Build Coastguard Worker continue;
294*f6dc9357SAndroid Build Coastguard Worker */
295*f6dc9357SAndroid Build Coastguard Worker CPluginLibrary library;
296*f6dc9357SAndroid Build Coastguard Worker
297*f6dc9357SAndroid Build Coastguard Worker CThreadArchiveOpen t;
298*f6dc9357SAndroid Build Coastguard Worker
299*f6dc9357SAndroid Build Coastguard Worker // if (plugin.FilePath.IsEmpty())
300*f6dc9357SAndroid Build Coastguard Worker t.FolderManager = new CArchiveFolderManager;
301*f6dc9357SAndroid Build Coastguard Worker /*
302*f6dc9357SAndroid Build Coastguard Worker else if (library.LoadAndCreateManager(plugin.FilePath, plugin.ClassID, &t.FolderManager) != S_OK)
303*f6dc9357SAndroid Build Coastguard Worker continue;
304*f6dc9357SAndroid Build Coastguard Worker */
305*f6dc9357SAndroid Build Coastguard Worker
306*f6dc9357SAndroid Build Coastguard Worker COpenArchiveCallback OpenCallbackSpec_loc;
307*f6dc9357SAndroid Build Coastguard Worker t.OpenCallbackSpec = &OpenCallbackSpec_loc;
308*f6dc9357SAndroid Build Coastguard Worker /*
309*f6dc9357SAndroid Build Coastguard Worker t.OpenCallbackSpec = new COpenArchiveCallback;
310*f6dc9357SAndroid Build Coastguard Worker t.OpenCallbackSpec_Ref = t.OpenCallbackSpec;
311*f6dc9357SAndroid Build Coastguard Worker */
312*f6dc9357SAndroid Build Coastguard Worker t.OpenCallbackSpec->PasswordIsDefined = Encrypted;
313*f6dc9357SAndroid Build Coastguard Worker t.OpenCallbackSpec->Password = Password;
314*f6dc9357SAndroid Build Coastguard Worker t.OpenCallbackSpec->ParentWindow = parentWindow;
315*f6dc9357SAndroid Build Coastguard Worker
316*f6dc9357SAndroid Build Coastguard Worker /* COpenCallbackImp object will exist after Open stage for multivolume archives */
317*f6dc9357SAndroid Build Coastguard Worker COpenCallbackImp *openCallbackSpec = new COpenCallbackImp;
318*f6dc9357SAndroid Build Coastguard Worker t.OpenCallbackProgress = openCallbackSpec;
319*f6dc9357SAndroid Build Coastguard Worker // openCallbackSpec->Callback_Ref = t.OpenCallbackSpec;
320*f6dc9357SAndroid Build Coastguard Worker // we set pointer without reference counter:
321*f6dc9357SAndroid Build Coastguard Worker openCallbackSpec->Callback =
322*f6dc9357SAndroid Build Coastguard Worker // openCallbackSpec->ReOpenCallback =
323*f6dc9357SAndroid Build Coastguard Worker t.OpenCallbackSpec;
324*f6dc9357SAndroid Build Coastguard Worker
325*f6dc9357SAndroid Build Coastguard Worker if (inStream)
326*f6dc9357SAndroid Build Coastguard Worker openCallbackSpec->SetSubArchiveName(fs2us(fileName));
327*f6dc9357SAndroid Build Coastguard Worker else
328*f6dc9357SAndroid Build Coastguard Worker {
329*f6dc9357SAndroid Build Coastguard Worker RINOK(openCallbackSpec->Init2(dirPrefix, fileName))
330*f6dc9357SAndroid Build Coastguard Worker }
331*f6dc9357SAndroid Build Coastguard Worker
332*f6dc9357SAndroid Build Coastguard Worker t.InStream = inStream;
333*f6dc9357SAndroid Build Coastguard Worker t.Path = fs2us(path);
334*f6dc9357SAndroid Build Coastguard Worker t.ArcFormat = arcFormat;
335*f6dc9357SAndroid Build Coastguard Worker
336*f6dc9357SAndroid Build Coastguard Worker const UString progressTitle = LangString(IDS_OPENNING);
337*f6dc9357SAndroid Build Coastguard Worker {
338*f6dc9357SAndroid Build Coastguard Worker CProgressDialog &pd = t.OpenCallbackSpec->ProgressDialog;
339*f6dc9357SAndroid Build Coastguard Worker pd.MainWindow = parentWindow;
340*f6dc9357SAndroid Build Coastguard Worker pd.MainTitle = "7-Zip"; // LangString(IDS_APP_TITLE);
341*f6dc9357SAndroid Build Coastguard Worker pd.MainAddTitle = progressTitle + L' ';
342*f6dc9357SAndroid Build Coastguard Worker pd.WaitMode = true;
343*f6dc9357SAndroid Build Coastguard Worker }
344*f6dc9357SAndroid Build Coastguard Worker
345*f6dc9357SAndroid Build Coastguard Worker {
346*f6dc9357SAndroid Build Coastguard Worker NWindows::CThread thread;
347*f6dc9357SAndroid Build Coastguard Worker const WRes wres = thread.Create(CThreadArchiveOpen::MyThreadFunction, &t);
348*f6dc9357SAndroid Build Coastguard Worker if (wres != 0)
349*f6dc9357SAndroid Build Coastguard Worker return HRESULT_FROM_WIN32(wres);
350*f6dc9357SAndroid Build Coastguard Worker t.OpenCallbackSpec->StartProgressDialog(progressTitle, thread);
351*f6dc9357SAndroid Build Coastguard Worker }
352*f6dc9357SAndroid Build Coastguard Worker
353*f6dc9357SAndroid Build Coastguard Worker /*
354*f6dc9357SAndroid Build Coastguard Worker if archive is multivolume:
355*f6dc9357SAndroid Build Coastguard Worker COpenCallbackImp object will exist after Open stage.
356*f6dc9357SAndroid Build Coastguard Worker COpenCallbackImp object will be deleted when last reference
357*f6dc9357SAndroid Build Coastguard Worker from each volume object (CInFileStreamVol) will be closed (when archive will be closed).
358*f6dc9357SAndroid Build Coastguard Worker */
359*f6dc9357SAndroid Build Coastguard Worker t.OpenCallbackProgress.Release();
360*f6dc9357SAndroid Build Coastguard Worker
361*f6dc9357SAndroid Build Coastguard Worker if (t.Result != S_FALSE && t.Result != S_OK)
362*f6dc9357SAndroid Build Coastguard Worker return t.Result;
363*f6dc9357SAndroid Build Coastguard Worker
364*f6dc9357SAndroid Build Coastguard Worker if (t.Folder)
365*f6dc9357SAndroid Build Coastguard Worker {
366*f6dc9357SAndroid Build Coastguard Worker UString open_Errors, nonOpen_Errors;
367*f6dc9357SAndroid Build Coastguard Worker GetFolderError(t.Folder, open_Errors, nonOpen_Errors);
368*f6dc9357SAndroid Build Coastguard Worker if (!nonOpen_Errors.IsEmpty())
369*f6dc9357SAndroid Build Coastguard Worker {
370*f6dc9357SAndroid Build Coastguard Worker ErrorMessage = nonOpen_Errors;
371*f6dc9357SAndroid Build Coastguard Worker // if (t.Result != S_OK) return t.Result;
372*f6dc9357SAndroid Build Coastguard Worker /* if there are good open leves, and non0open level,
373*f6dc9357SAndroid Build Coastguard Worker we could force error as critical error and return error here
374*f6dc9357SAndroid Build Coastguard Worker but it's better to allow to open such rachives */
375*f6dc9357SAndroid Build Coastguard Worker // return S_FALSE;
376*f6dc9357SAndroid Build Coastguard Worker }
377*f6dc9357SAndroid Build Coastguard Worker }
378*f6dc9357SAndroid Build Coastguard Worker
379*f6dc9357SAndroid Build Coastguard Worker // if (openCallbackSpec->PasswordWasAsked)
380*f6dc9357SAndroid Build Coastguard Worker {
381*f6dc9357SAndroid Build Coastguard Worker Encrypted = t.OpenCallbackSpec->PasswordIsDefined;
382*f6dc9357SAndroid Build Coastguard Worker Password = t.OpenCallbackSpec->Password;
383*f6dc9357SAndroid Build Coastguard Worker }
384*f6dc9357SAndroid Build Coastguard Worker
385*f6dc9357SAndroid Build Coastguard Worker if (t.Result == S_OK)
386*f6dc9357SAndroid Build Coastguard Worker {
387*f6dc9357SAndroid Build Coastguard Worker Library.Attach(library.Detach());
388*f6dc9357SAndroid Build Coastguard Worker // Folder.Attach(t.Folder.Detach());
389*f6dc9357SAndroid Build Coastguard Worker Folder = t.Folder;
390*f6dc9357SAndroid Build Coastguard Worker }
391*f6dc9357SAndroid Build Coastguard Worker
392*f6dc9357SAndroid Build Coastguard Worker return t.Result;
393*f6dc9357SAndroid Build Coastguard Worker // }
394*f6dc9357SAndroid Build Coastguard Worker }
395