1 // FileFolderPluginOpen.cpp
\r
5 #include "resource.h"
\r
7 #include "Windows/Thread.h"
\r
9 #include "../Agent/Agent.h"
\r
11 #include "LangUtils.h"
\r
12 #include "OpenCallback.h"
\r
13 #include "PluginLoader.h"
\r
14 #include "RegistryAssociations.h"
\r
15 #include "RegistryPlugins.h"
\r
17 using namespace NWindows;
\r
18 using namespace NRegistryAssociations;
\r
20 struct CThreadArchiveOpen
\r
24 CMyComPtr<IInStream> InStream;
\r
25 CMyComPtr<IFolderManager> FolderManager;
\r
26 CMyComPtr<IProgress> OpenCallback;
\r
27 COpenArchiveCallback *OpenCallbackSpec;
\r
29 CMyComPtr<IFolderFolder> Folder;
\r
36 CProgressCloser closer(OpenCallbackSpec->ProgressDialog);
\r
37 Result = FolderManager->OpenFolderFile(InStream, Path, ArcFormat, &Folder, OpenCallback);
\r
39 catch(...) { Result = E_FAIL; }
\r
42 static THREAD_FUNC_DECL MyThreadFunction(void *param)
\r
44 ((CThreadArchiveOpen *)param)->Process();
\r
50 static int FindPlugin(const CObjectVector<CPluginInfo> &plugins, const UString &pluginName)
\r
52 for (int i = 0; i < plugins.Size(); i++)
\r
53 if (plugins[i].Name.CompareNoCase(pluginName) == 0)
\r
59 HRESULT OpenFileFolderPlugin(
\r
60 IInStream *inStream,
\r
61 const UString &path,
\r
62 const UString &arcFormat,
\r
64 IFolderFolder **resultFolder,
\r
66 bool &encrypted, UString &password)
\r
68 CObjectVector<CPluginInfo> plugins;
\r
69 ReadFileFolderPluginInfoList(plugins);
\r
71 UString extension, name, pureName, dot;
\r
73 int slashPos = path.ReverseFind(WCHAR_PATH_SEPARATOR);
\r
78 dirPrefix = path.Left(slashPos + 1);
\r
79 fileName = path.Mid(slashPos + 1);
\r
84 NFile::NName::SplitNameToPureNameAndExtension(fileName, pureName, dot, extension);
\r
87 if (!extension.IsEmpty())
\r
90 if (ReadInternalAssociation(extension, extInfo))
\r
92 for (int i = extInfo.Plugins.Size() - 1; i >= 0; i--)
\r
94 int pluginIndex = FindPlugin(plugins, extInfo.Plugins[i]);
\r
95 if (pluginIndex >= 0)
\r
97 const CPluginInfo plugin = plugins[pluginIndex];
\r
98 plugins.Delete(pluginIndex);
\r
99 plugins.Insert(0, plugin);
\r
106 for (int i = 0; i < plugins.Size(); i++)
\r
108 const CPluginInfo &plugin = plugins[i];
\r
109 if (!plugin.ClassIDDefined)
\r
111 CPluginLibrary library;
\r
113 CThreadArchiveOpen t;
\r
115 if (plugin.FilePath.IsEmpty())
\r
116 t.FolderManager = new CArchiveFolderManager;
\r
117 else if (library.LoadAndCreateManager(plugin.FilePath, plugin.ClassID, &t.FolderManager) != S_OK)
\r
120 t.OpenCallbackSpec = new COpenArchiveCallback;
\r
121 t.OpenCallback = t.OpenCallbackSpec;
\r
122 t.OpenCallbackSpec->PasswordIsDefined = encrypted;
\r
123 t.OpenCallbackSpec->Password = password;
\r
124 t.OpenCallbackSpec->ParentWindow = parentWindow;
\r
127 t.OpenCallbackSpec->SetSubArchiveName(fileName);
\r
129 t.OpenCallbackSpec->LoadFileInfo(dirPrefix, fileName);
\r
131 t.InStream = inStream;
\r
133 t.ArcFormat = arcFormat;
\r
135 UString progressTitle = LangString(IDS_OPENNING, 0x03020283);
\r
136 t.OpenCallbackSpec->ProgressDialog.MainWindow = parentWindow;
\r
137 t.OpenCallbackSpec->ProgressDialog.MainTitle = LangString(IDS_APP_TITLE, 0x03000000);
\r
138 t.OpenCallbackSpec->ProgressDialog.MainAddTitle = progressTitle + UString(L" ");
\r
139 t.OpenCallbackSpec->ProgressDialog.WaitMode = true;
\r
142 NWindows::CThread thread;
\r
143 RINOK(thread.Create(CThreadArchiveOpen::MyThreadFunction, &t));
\r
144 t.OpenCallbackSpec->StartProgressDialog(progressTitle, thread);
\r
147 if (t.Result == E_ABORT)
\r
150 if (t.Result == S_OK)
\r
152 // if (openCallbackSpec->PasswordWasAsked)
\r
154 encrypted = t.OpenCallbackSpec->PasswordIsDefined;
\r
155 password = t.OpenCallbackSpec->Password;
\r
157 *module = library.Detach();
\r
158 *resultFolder = t.Folder.Detach();
\r
162 if (t.Result != S_FALSE)
\r