xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/FileManager/FileFolderPluginOpen.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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