From 37af27ec620ecad1c7c94820bc0964917a6075a9 Mon Sep 17 00:00:00 2001 From: sdottaka Date: Sun, 21 Jun 2015 20:10:56 +0900 Subject: [PATCH] Make each plugins disableable --HG-- branch : stable --- Src/ConfigLog.cpp | 2 ++ Src/FileTransform.cpp | 2 ++ Src/MergeEditView.cpp | 8 +++---- Src/OptionsDef.h | 1 + Src/OptionsInit.cpp | 1 + Src/Plugins.cpp | 44 ++++++++++++++++++++++++++++++----- Src/Plugins.h | 4 +++- Src/PluginsListDlg.cpp | 18 +++++++------- Src/SelectUnpackerDlg.cpp | 21 ++++++++++++----- Testing/GoogleTest/UnitTests/misc.cpp | 10 ++++++++ 10 files changed, 85 insertions(+), 26 deletions(-) diff --git a/Src/ConfigLog.cpp b/Src/ConfigLog.cpp index 2db8d0b2a..c189d9d9f 100644 --- a/Src/ConfigLog.cpp +++ b/Src/ConfigLog.cpp @@ -75,6 +75,8 @@ void CConfigLog::WritePluginsInLogFile(LPCWSTR transformationEvent) { const PluginInfoPtr& plugin = piPluginArray->at(iPlugin); m_pfile->WriteString(_T("\r\n ")); + if (plugin->m_disabled) + m_pfile->WriteString(_T("!")); m_pfile->WriteString(plugin->m_name); m_pfile->WriteString(_T(" [")); m_pfile->WriteString(plugin->m_filepath); diff --git a/Src/FileTransform.cpp b/Src/FileTransform.cpp index defd3e47f..63af2c67b 100644 --- a/Src/FileTransform.cpp +++ b/Src/FileTransform.cpp @@ -452,6 +452,8 @@ void GetFreeFunctionsInScripts(std::vector& sNamesArray, const wchar_t * for (iScript = 0 ; iScript < piScriptArray->size() ; iScript++) { const PluginInfoPtr & plugin = piScriptArray->at(iScript); + if (plugin->m_disabled) + continue; LPDISPATCH piScript = plugin->m_lpDispatch; std::vector scriptNamesArray; std::vector scriptIdsArray; diff --git a/Src/MergeEditView.cpp b/Src/MergeEditView.cpp index 2af84899f..5f1b677de 100644 --- a/Src/MergeEditView.cpp +++ b/Src/MergeEditView.cpp @@ -2577,7 +2577,7 @@ HMENU CMergeEditView::createPrediffersSubmenu(HMENU hMenu) for (iScript = 0 ; iScript < piScriptArray->size() ; iScript++, ID ++) { const PluginInfoPtr & plugin = piScriptArray->at(iScript); - if (!plugin->TestAgainstRegList(pd->m_strBothFilenames)) + if (plugin->m_disabled || !plugin->TestAgainstRegList(pd->m_strBothFilenames)) continue; DoAppendMenu(hMenu, MF_STRING, ID, plugin->m_name.c_str()); @@ -2585,7 +2585,7 @@ HMENU CMergeEditView::createPrediffersSubmenu(HMENU hMenu) for (iScript = 0 ; iScript < piScriptArray2->size() ; iScript++, ID ++) { const PluginInfoPtr & plugin = piScriptArray2->at(iScript); - if (!plugin->TestAgainstRegList(pd->m_strBothFilenames)) + if (plugin->m_disabled || !plugin->TestAgainstRegList(pd->m_strBothFilenames)) continue; DoAppendMenu(hMenu, MF_STRING, ID, plugin->m_name.c_str()); @@ -2600,7 +2600,7 @@ HMENU CMergeEditView::createPrediffersSubmenu(HMENU hMenu) for (iScript = 0 ; iScript < piScriptArray->size() ; iScript++, ID ++) { const PluginInfoPtr & plugin = piScriptArray->at(iScript); - if (plugin->TestAgainstRegList(pd->m_strBothFilenames) != false) + if (plugin->m_disabled || plugin->TestAgainstRegList(pd->m_strBothFilenames) != false) continue; DoAppendMenu(hMenu, MF_STRING, ID, plugin->m_name.c_str()); @@ -2608,7 +2608,7 @@ HMENU CMergeEditView::createPrediffersSubmenu(HMENU hMenu) for (iScript = 0 ; iScript < piScriptArray2->size() ; iScript++, ID ++) { const PluginInfoPtr & plugin = piScriptArray2->at(iScript); - if (plugin->TestAgainstRegList(pd->m_strBothFilenames) != false) + if (plugin->m_disabled || plugin->TestAgainstRegList(pd->m_strBothFilenames) != false) continue; DoAppendMenu(hMenu, MF_STRING, ID, plugin->m_name.c_str()); diff --git a/Src/OptionsDef.h b/Src/OptionsDef.h index 33b04cbd5..68b63fa6d 100644 --- a/Src/OptionsDef.h +++ b/Src/OptionsDef.h @@ -188,6 +188,7 @@ extern const String OPT_ARCHIVE_PROBETYPE OP("Merge7z/ProbeSignature"); // Plugins extern const String OPT_PLUGINS_ENABLED OP("Settings/PluginsEnabled"); +extern const String OPT_PLUGINS_DISABLED_LIST OP("Settings/PluginsDisabledList"); // Startup options extern const String OPT_SHOW_SELECT_FILES_AT_STARTUP OP("Settings/ShowFileDialog"); diff --git a/Src/OptionsInit.cpp b/Src/OptionsInit.cpp index 36a6aaf31..e10111b26 100644 --- a/Src/OptionsInit.cpp +++ b/Src/OptionsInit.cpp @@ -162,6 +162,7 @@ void CMergeApp::OptionsInit() m_pOptions->InitOption(OPT_ARCHIVE_PROBETYPE, false); m_pOptions->InitOption(OPT_PLUGINS_ENABLED, true); + m_pOptions->InitOption(OPT_PLUGINS_DISABLED_LIST, _T("")); m_pOptions->InitOption(OPT_TABBAR_AUTO_MAXWIDTH, true); diff --git a/Src/Plugins.cpp b/Src/Plugins.cpp index 0b5129e05..bd6b11e9c 100644 --- a/Src/Plugins.cpp +++ b/Src/Plugins.cpp @@ -28,9 +28,12 @@ #define POCO_NO_UNWINDOWS 1 #include #include +#include #include #include #include +#include +#include #include #include #include @@ -46,6 +49,8 @@ #include "Environment.h" #include "FileFilter.h" #include "coretools.h" +#include "OptionsMgr.h" +#include "OptionsDef.h" using std::vector; using Poco::RegularExpression; @@ -648,14 +653,25 @@ static void RemoveScriptletCandidate(const String &scriptletFilepath) } } +static std::unordered_set GetDisabledPluginList() +{ + std::unordered_set list; + std::basic_stringstream ss(GetOptionsMgr()->GetString(OPT_PLUGINS_DISABLED_LIST)); + String name; + while (std::getline(ss, name, _T('|'))) + list.insert(name); + return list; +} + /** * @brief Get available scriptlets for an event * * @return Returns an array of valid LPDISPATCH */ -static PluginArray * GetAvailableScripts( const wchar_t *transformationEvent, bool getScriptletsToo ) +static PluginArray * GetAvailableScripts( const wchar_t *transformationEvent) { vector& scriptlets = LoadTheScriptletList(); + std::unordered_set disabled_plugin_list = GetDisabledPluginList(); PluginArray * pPlugins = new PluginArray; @@ -671,6 +687,7 @@ static PluginArray * GetAvailableScripts( const wchar_t *transformationEvent, bo if (rtn == 1) { // Plugin has this event + plugin->m_disabled = (disabled_plugin_list.find(plugin->m_name) != disabled_plugin_list.end()); pPlugins->push_back(plugin); } else if (rtn < 0) @@ -740,7 +757,7 @@ PluginArray * CScriptsOfThread::GetAvailableScripts(const wchar_t *transformatio if (wcscmp(transformationEvent, TransformationCategories[i]) == 0) { if (m_aPluginsByEvent[i] == NULL) - m_aPluginsByEvent[i].reset(::GetAvailableScripts(transformationEvent, bInMainThread())); + m_aPluginsByEvent[i].reset(::GetAvailableScripts(transformationEvent)); return m_aPluginsByEvent[i].get(); } // return a pointer to an empty list @@ -748,7 +765,22 @@ PluginArray * CScriptsOfThread::GetAvailableScripts(const wchar_t *transformatio return &noPlugin; } - +void CScriptsOfThread::SaveSettings() +{ + std::vector list; + for (int i = 0; i < nTransformationEvents; i++) + { + if (m_aPluginsByEvent[i] == NULL) + m_aPluginsByEvent[i].reset(::GetAvailableScripts(TransformationCategories[i])); + for (int j = 0; j < m_aPluginsByEvent[i]->size(); ++j) + { + const PluginInfoPtr & plugin = m_aPluginsByEvent[i]->at(j); + if (plugin->m_disabled) + list.push_back(String(plugin->m_name)); + } + } + GetOptionsMgr()->SaveOption(OPT_PLUGINS_DISABLED_LIST, string_join(list.begin(), list.end(), _T("|"))); +} void CScriptsOfThread::FreeAllScripts() { @@ -780,7 +812,7 @@ PluginInfo *CScriptsOfThread::GetAutomaticPluginByFilter(const wchar_t *transfor for (int step = 0 ; step < piFileScriptArray->size() ; step ++) { const PluginInfoPtr & plugin = piFileScriptArray->at(step); - if (plugin->m_bAutomatic == false) + if (plugin->m_bAutomatic == false || plugin->m_disabled) continue; if (plugin->TestAgainstRegList(filteredText) == false) continue; @@ -793,10 +825,10 @@ PluginInfo * CScriptsOfThread::GetPluginByName(const wchar_t *transformationEven { int i; for (i = 0 ; i < nTransformationEvents ; i ++) - if (wcscmp(transformationEvent, TransformationCategories[i]) == 0) + if (!transformationEvent || wcscmp(transformationEvent, TransformationCategories[i]) == 0) { if (m_aPluginsByEvent[i] == NULL) - m_aPluginsByEvent[i].reset(::GetAvailableScripts(transformationEvent, bInMainThread())); + m_aPluginsByEvent[i].reset(::GetAvailableScripts(TransformationCategories[i])); for (int j = 0 ; j < m_aPluginsByEvent[i]->size() ; j++) if (m_aPluginsByEvent[i]->at(j)->m_name == name) diff --git a/Src/Plugins.h b/Src/Plugins.h index 5ab7bb210..612e56901 100644 --- a/Src/Plugins.h +++ b/Src/Plugins.h @@ -50,7 +50,7 @@ class PluginInfo { public: PluginInfo() - : m_lpDispatch(NULL), m_filters(NULL), m_bAutomatic(FALSE), m_nFreeFunctions(0) + : m_lpDispatch(NULL), m_filters(NULL), m_bAutomatic(FALSE), m_nFreeFunctions(0), m_disabled(false) { } @@ -78,6 +78,7 @@ public: String m_filtersText; String m_description; bool m_bAutomatic; + bool m_disabled; std::vector m_filters; /// only for plugins with free function names (EDITOR_SCRIPT) int m_nFreeFunctions; @@ -108,6 +109,7 @@ public: PluginInfo * GetAutomaticPluginByFilter(const wchar_t *transformationEvent, const String& filteredText); PluginInfo * GetPluginByName(const wchar_t *transformationEvent, const String& name); PluginInfo * GetPluginInfo(LPDISPATCH piScript); + void SaveSettings(); void FreeAllScripts(); void FreeScriptsForEvent(const wchar_t *transformationEvent); diff --git a/Src/PluginsListDlg.cpp b/Src/PluginsListDlg.cpp index 81400390b..c06783687 100644 --- a/Src/PluginsListDlg.cpp +++ b/Src/PluginsListDlg.cpp @@ -71,10 +71,10 @@ void PluginsListDlg::InitList() { // Show selection across entire row. // Also enable infotips. - m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP); + m_list.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP); String title = LoadResString(IDS_PLUGINSLIST_NAME); - m_list.InsertColumn(0, title.c_str(), LVCFMT_LEFT, 150); + m_list.InsertColumn(0, title.c_str(), LVCFMT_LEFT, 200); title = LoadResString(IDS_PLUGINSLIST_TYPE); m_list.InsertColumn(1, title.c_str(), LVCFMT_LEFT, 100); title = LoadResString(IDS_PLUGINSLIST_DESC); @@ -113,6 +113,7 @@ void PluginsListDlg::AddPluginsToList(LPCWSTR pluginEvent, LPCTSTR pluginType) int ind = m_list.InsertItem(m_list.GetItemCount(), plugin->m_name.c_str()); m_list.SetItemText(ind, 1, pluginType); m_list.SetItemText(ind, 2, plugin->m_description.c_str()); + m_list.SetCheck(ind, !plugin->m_disabled); } } @@ -122,15 +123,14 @@ void PluginsListDlg::AddPluginsToList(LPCWSTR pluginEvent, LPCTSTR pluginType) void PluginsListDlg::OnBnClickedOk() { CButton *btn = (CButton *)GetDlgItem(IDC_PLUGINS_ENABLE); - int check = btn->GetCheck(); - if (check == BST_CHECKED) - { - GetOptionsMgr()->SaveOption(OPT_PLUGINS_ENABLED, true); - } - else + GetOptionsMgr()->SaveOption(OPT_PLUGINS_ENABLED, (btn->GetCheck() == BST_CHECKED)); + + for (int i = 0; i < m_list.GetItemCount(); ++i) { - GetOptionsMgr()->SaveOption(OPT_PLUGINS_ENABLED, false); + PluginInfo * plugin = CAllThreadsScripts::GetActiveSet()->GetPluginByName(NULL, String(m_list.GetItemText(i, 0))); + plugin->m_disabled = !m_list.GetCheck(i); } + CAllThreadsScripts::GetActiveSet()->SaveSettings(); OnOK(); } diff --git a/Src/SelectUnpackerDlg.cpp b/Src/SelectUnpackerDlg.cpp index b95821d35..e3d27dbe3 100644 --- a/Src/SelectUnpackerDlg.cpp +++ b/Src/SelectUnpackerDlg.cpp @@ -78,22 +78,31 @@ void CSelectUnpackerDlg::Initialize() { // during the dialog, we use a pointer to the scriptsOfThreads array const PluginInfoPtr& plugin = piFileScriptArray->at(i); - m_UnpackerPlugins.Add(plugin.get()); - m_bWithFileFlags.push_back(true); + if (!plugin->m_disabled) + { + m_UnpackerPlugins.Add(plugin.get()); + m_bWithFileFlags.push_back(true); + } } for (i = 0 ; i < piBufferScriptArray->size() ; i++) { // during the dialog, we use a pointer to the scriptsOfThreads array const PluginInfoPtr& plugin = piBufferScriptArray->at(i); - m_UnpackerPlugins.Add(plugin.get()); - m_bWithFileFlags.push_back(false); + if (!plugin->m_disabled) + { + m_UnpackerPlugins.Add(plugin.get()); + m_bWithFileFlags.push_back(false); + } } for (i = 0 ; i < piFileFolderScriptArray->size() ; i++) { // during the dialog, we use a pointer to the scriptsOfThreads array const PluginInfoPtr& plugin = piFileFolderScriptArray->at(i); - m_UnpackerPlugins.Add(plugin.get()); - m_bWithFileFlags.push_back(true); + if (!plugin->m_disabled) + { + m_UnpackerPlugins.Add(plugin.get()); + m_bWithFileFlags.push_back(true); + } } } diff --git a/Testing/GoogleTest/UnitTests/misc.cpp b/Testing/GoogleTest/UnitTests/misc.cpp index 7589039d8..bef922670 100644 --- a/Testing/GoogleTest/UnitTests/misc.cpp +++ b/Testing/GoogleTest/UnitTests/misc.cpp @@ -1,5 +1,7 @@ #include "MergeApp.h" #include "unicoder.h" +#include "RegOptionsMgr.h" +#include "OptionsDef.h" void LogErrorStringUTF8(const std::string& sz) { @@ -27,3 +29,11 @@ String tr(const std::string& str) { return ucr::toTString(str); } + +CRegOptionsMgr m_option; + +COptionsMgr * GetOptionsMgr() +{ + m_option.InitOption(OPT_PLUGINS_DISABLED_LIST, _T("")); + return &m_option; +} -- 2.11.0