static UString GetIconPath(const UString &filePath, const CLSID &clsID, const UString &extension, Int32 &iconIndex) { CPluginLibrary library; CMyComPtr<IFolderManager> folderManager; CMyComPtr<IFolderFolder> folder; if (filePath.IsEmpty()) folderManager = new CArchiveFolderManager; else if (library.LoadAndCreateManager(filePath, clsID, &folderManager) != S_OK) return UString(); CMyComBSTR extBSTR; if (folderManager->GetExtensions(&extBSTR) != S_OK) return UString(); const UString ext2 = (const wchar_t *)extBSTR; UStringVector exts; SplitString(ext2, exts); for (int i = 0; i < exts.Size(); i++) { const UString &plugExt = exts[i]; if (extension.CompareNoCase((const wchar_t *)plugExt) == 0) { CMyComBSTR iconPathTemp; if (folderManager->GetIconPath(plugExt, &iconPathTemp, &iconIndex) != S_OK) break; if (iconPathTemp != 0) return (const wchar_t *)iconPathTemp; } } return UString(); }
void CExtDatabase::Read() { CObjectVector<CExtInfo> extItems; ReadInternalAssociations(extItems); ReadFileFolderPluginInfoList(Plugins); for (int i = 0; i < extItems.Size(); i++) { const CExtInfo &extInfo = extItems[i]; CExtInfoBig extInfoBig; extInfoBig.Ext = extInfo.Ext; extInfoBig.Associated = false; for (int p = 0; p < extInfo.Plugins.Size(); p++) { int pluginIndex = FindPlugin(extInfo.Plugins[p]); if (pluginIndex >= 0) extInfoBig.PluginsPairs.Add(CPluginEnabledPair(pluginIndex, true)); } ExtBigItems.Add(extInfoBig); } for (int pluginIndex = 0; pluginIndex < Plugins.Size(); pluginIndex++) { const CPluginInfo &pluginInfo = Plugins[pluginIndex]; CPluginLibrary pluginLibrary; CMyComPtr<IFolderManager> folderManager; if (pluginInfo.FilePath.IsEmpty()) folderManager = new CArchiveFolderManager; else if (pluginLibrary.LoadAndCreateManager(pluginInfo.FilePath, pluginInfo.ClassID, &folderManager) != S_OK) continue; CMyComBSTR extBSTR; if (folderManager->GetExtensions(&extBSTR) != S_OK) return; const UString ext2 = (const wchar_t *)extBSTR; UStringVector exts; SplitString(ext2, exts); for (int i = 0; i < exts.Size(); i++) { const UString &ext = exts[i]; int index = FindExtInfoBig(ext); if (index < 0) { CExtInfoBig extInfo; extInfo.PluginsPairs.Add(CPluginEnabledPair(pluginIndex, false)); extInfo.Associated = false; extInfo.Ext = ext; ExtBigItems.Add(extInfo); } else { CExtInfoBig &extInfo = ExtBigItems[index]; int pluginIndexIndex = extInfo.FindPlugin(pluginIndex); if (pluginIndexIndex < 0) extInfo.PluginsPairs.Add(CPluginEnabledPair(pluginIndex, false)); } } } }
HRESULT OpenFileFolderPlugin( const UString &path, HMODULE *module, IFolderFolder **resultFolder, HWND parentWindow, bool &encrypted, UString &password) { CObjectVector<CPluginInfo> plugins; ReadFileFolderPluginInfoList(plugins); UString extension; UString name, pureName, dot; if(!NFile::NDirectory::GetOnlyName(path, name)) return E_FAIL; NFile::NName::SplitNameToPureNameAndExtension(name, pureName, dot, extension); int slashPos = path.ReverseFind(WCHAR_PATH_SEPARATOR); UString dirPrefix; UString fileName; if (slashPos >= 0) { dirPrefix = path.Left(slashPos + 1); fileName = path.Mid(slashPos + 1); } else fileName = path; if (!extension.IsEmpty()) { CExtInfo extInfo; if (ReadInternalAssociation(extension, extInfo)) { for (int i = extInfo.Plugins.Size() - 1; i >= 0; i--) { int pluginIndex = FindPlugin(plugins, extInfo.Plugins[i]); if (pluginIndex >= 0) { const CPluginInfo plugin = plugins[pluginIndex]; plugins.Delete(pluginIndex); plugins.Insert(0, plugin); } } } } for (int i = 0; i < plugins.Size(); i++) { const CPluginInfo &plugin = plugins[i]; if (!plugin.ClassIDDefined) continue; CPluginLibrary library; CThreadArchiveOpen t; if (plugin.FilePath.IsEmpty()) t.FolderManager = new CArchiveFolderManager; else if (library.LoadAndCreateManager(plugin.FilePath, plugin.ClassID, &t.FolderManager) != S_OK) continue; t.OpenCallbackSpec = new COpenArchiveCallback; t.OpenCallback = t.OpenCallbackSpec; t.OpenCallbackSpec->PasswordIsDefined = encrypted; t.OpenCallbackSpec->Password = password; t.OpenCallbackSpec->ParentWindow = parentWindow; t.OpenCallbackSpec->LoadFileInfo(dirPrefix, fileName); t.Path = path; UString progressTitle = LangString(IDS_OPENNING, 0x03020283); t.OpenCallbackSpec->ProgressDialog.MainWindow = parentWindow; t.OpenCallbackSpec->ProgressDialog.MainTitle = LangString(IDS_APP_TITLE, 0x03000000); t.OpenCallbackSpec->ProgressDialog.MainAddTitle = progressTitle + UString(L" "); NWindows::CThread thread; if (thread.Create(CThreadArchiveOpen::MyThreadFunction, &t) != S_OK) throw 271824; t.OpenCallbackSpec->StartProgressDialog(progressTitle); if (t.Result == E_ABORT) return t.Result; if (t.Result == S_OK) { // if (openCallbackSpec->PasswordWasAsked) { encrypted = t.OpenCallbackSpec->PasswordIsDefined; password = t.OpenCallbackSpec->Password; } *module = library.Detach(); *resultFolder = t.Folder.Detach(); return S_OK; } if (t.Result != S_FALSE) return t.Result; } return S_FALSE; }
HRESULT OpenFileFolderPlugin( const UString &path, HMODULE *module, IFolderFolder **resultFolder, HWND parentWindow, bool &encrypted, UString &password) { encrypted = false; #ifdef _WIN32 CObjectVector<CPluginInfo> plugins; ReadFileFolderPluginInfoList(plugins); #endif UString extension; UString name, pureName, dot; if(!NFile::NDirectory::GetOnlyName(path, name)) return E_FAIL; NFile::NName::SplitNameToPureNameAndExtension(name, pureName, dot, extension); int slashPos = path.ReverseFind(WCHAR_PATH_SEPARATOR); UString dirPrefix; UString fileName; if (slashPos >= 0) { dirPrefix = path.Left(slashPos + 1); fileName = path.Mid(slashPos + 1); } else fileName = path; #ifdef _WIN32 if (!extension.IsEmpty()) { CExtInfo extInfo; if (ReadInternalAssociation(extension, extInfo)) { for (int i = extInfo.Plugins.Size() - 1; i >= 0; i--) { int pluginIndex = FindPlugin(plugins, extInfo.Plugins[i]); if (pluginIndex >= 0) { const CPluginInfo plugin = plugins[pluginIndex]; plugins.Delete(pluginIndex); plugins.Insert(0, plugin); } } } } for (int i = 0; i < plugins.Size(); i++) { const CPluginInfo &plugin = plugins[i]; if (!plugin.ClassIDDefined) continue; #endif // #ifdef _WIN32 CPluginLibrary library; CMyComPtr<IFolderManager> folderManager; CMyComPtr<IFolderFolder> folder; #ifdef _WIN32 if (plugin.FilePath.IsEmpty()) folderManager = new CArchiveFolderManager; else if (library.LoadAndCreateManager(plugin.FilePath, plugin.ClassID, &folderManager) != S_OK) continue; #else folderManager = new CArchiveFolderManager; #endif // #ifdef _WIN32 COpenArchiveCallback *openCallbackSpec = new COpenArchiveCallback; CMyComPtr<IProgress> openCallback = openCallbackSpec; openCallbackSpec->PasswordIsDefined = false; openCallbackSpec->ParentWindow = parentWindow; openCallbackSpec->LoadFileInfo(dirPrefix, fileName); HRESULT result = folderManager->OpenFolderFile(path, &folder, openCallback); if (openCallbackSpec->PasswordWasAsked) encrypted = true; if (result == S_OK) { *module = library.Detach(); *resultFolder = folder.Detach(); return S_OK; } #ifdef _WIN32 continue; /* if (result != S_FALSE) return result; */ } #endif return S_FALSE; }
HRESULT OpenFileFolderPlugin( IInStream *inStream, const FString &path, const UString &arcFormat, HMODULE *module, IFolderFolder **resultFolder, HWND parentWindow, bool &encrypted, UString &password) { #ifdef _WIN32 CObjectVector<CPluginInfo> plugins; ReadFileFolderPluginInfoList(plugins); #endif FString extension, name, pureName, dot; int slashPos = path.ReverseFind(FCHAR_PATH_SEPARATOR); FString dirPrefix; FString fileName; if (slashPos >= 0) { dirPrefix.SetFrom(path, slashPos + 1); fileName = path.Ptr(slashPos + 1); } else fileName = path; SplitNameToPureNameAndExtension(fileName, pureName, dot, extension); /* if (!extension.IsEmpty()) { CExtInfo extInfo; if (ReadInternalAssociation(extension, extInfo)) { for (int i = extInfo.Plugins.Size() - 1; i >= 0; i--) { int pluginIndex = FindPlugin(plugins, extInfo.Plugins[i]); if (pluginIndex >= 0) { const CPluginInfo plugin = plugins[pluginIndex]; plugins.Delete(pluginIndex); plugins.Insert(0, plugin); } } } } */ #ifdef _WIN32 FOR_VECTOR (i, plugins) { const CPluginInfo &plugin = plugins[i]; if (!plugin.ClassIDDefined) continue; #endif CPluginLibrary library; CThreadArchiveOpen t; #ifdef _WIN32 if (plugin.FilePath.IsEmpty()) t.FolderManager = new CArchiveFolderManager; else if (library.LoadAndCreateManager(plugin.FilePath, plugin.ClassID, &t.FolderManager) != S_OK) continue; #else t.FolderManager = new CArchiveFolderManager; #endif t.OpenCallbackSpec = new COpenArchiveCallback; t.OpenCallback = t.OpenCallbackSpec; t.OpenCallbackSpec->PasswordIsDefined = encrypted; t.OpenCallbackSpec->Password = password; t.OpenCallbackSpec->ParentWindow = parentWindow; if (inStream) t.OpenCallbackSpec->SetSubArchiveName(fs2us(fileName)); else t.OpenCallbackSpec->LoadFileInfo(dirPrefix, fileName); t.InStream = inStream; t.Path = fs2us(path); t.ArcFormat = arcFormat; UString progressTitle = LangString(IDS_OPENNING); t.OpenCallbackSpec->ProgressDialog.MainWindow = parentWindow; t.OpenCallbackSpec->ProgressDialog.MainTitle = L"7-Zip"; // LangString(IDS_APP_TITLE); t.OpenCallbackSpec->ProgressDialog.MainAddTitle = progressTitle + L' '; // FIXME t.OpenCallbackSpec->ProgressDialog.WaitMode = true; { NWindows::CThread thread; RINOK(thread.Create(CThreadArchiveOpen::MyThreadFunction, &t)); t.OpenCallbackSpec->StartProgressDialog(progressTitle, thread); } if (t.Result == E_ABORT) return t.Result; encrypted = t.OpenCallbackSpec->PasswordIsDefined; if (t.Result == S_OK) { // if (openCallbackSpec->PasswordWasAsked) { password = t.OpenCallbackSpec->Password; } *module = library.Detach(); *resultFolder = t.Folder.Detach(); return S_OK; } if (t.Result != S_FALSE) return t.Result; #ifdef _WIN32 } #endif return S_FALSE; }