OSDN Git Service

Make each plugins disableable
authorsdottaka <sdottaka@users.sourceforge.net>
Sun, 21 Jun 2015 11:10:56 +0000 (20:10 +0900)
committersdottaka <sdottaka@users.sourceforge.net>
Sun, 21 Jun 2015 11:10:56 +0000 (20:10 +0900)
--HG--
branch : stable

Src/ConfigLog.cpp
Src/FileTransform.cpp
Src/MergeEditView.cpp
Src/OptionsDef.h
Src/OptionsInit.cpp
Src/Plugins.cpp
Src/Plugins.h
Src/PluginsListDlg.cpp
Src/SelectUnpackerDlg.cpp
Testing/GoogleTest/UnitTests/misc.cpp

index 2db8d0b..c189d9d 100644 (file)
@@ -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);
index defd3e4..63af2c6 100644 (file)
@@ -452,6 +452,8 @@ void GetFreeFunctionsInScripts(std::vector<String>& 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<String> scriptNamesArray;
                std::vector<int> scriptIdsArray;
index 2af8489..5f1b677 100644 (file)
@@ -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());
index 33b04cb..68b63fa 100644 (file)
@@ -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");
index 36a6aaf..e10111b 100644 (file)
@@ -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);
 
index 0b5129e..bd6b11e 100644 (file)
 #define POCO_NO_UNWINDOWS 1
 #include <vector>
 #include <list>
+#include <unordered_set>
 #include <algorithm>
 #include <cstdarg>
 #include <cassert>
+#include <iostream>
+#include <sstream>
 #include <Poco/Mutex.h>
 #include <Poco/ScopedLock.h>
 #include <Poco/RegularExpression.h>
@@ -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<String> GetDisabledPluginList()
+{
+       std::unordered_set<String> list;
+       std::basic_stringstream<TCHAR> 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<String>& scriptlets = LoadTheScriptletList();
+       std::unordered_set<String> 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<String> 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)
index 5ab7bb2..612e569 100644 (file)
@@ -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<FileFilterElementPtr> 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);
index 8140039..c067836 100644 (file)
@@ -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();
 }
 
index b95821d..e3d27db 100644 (file)
@@ -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);
+               }
        }
 }
 
index 7589039..bef9226 100644 (file)
@@ -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;
+}