1 /////////////////////////////////////////////////////////////////////////////
2 // WinMerge: an interactive diff/merge utility
3 // Copyright (C) 1997-2000 Thingamahoochie Software
5 // SPDX-License-Identifier: GPL-2.0-or-later
6 /////////////////////////////////////////////////////////////////////////////
8 * @file SelectUnpackerDlg.cpp
10 * @brief Unpacker plugin selection dialog implementation.
14 #include "SelectUnpackerDlg.h"
16 #include "FileTransform.h"
17 #include "OptionsMgr.h"
18 #include "OptionsDef.h"
26 /////////////////////////////////////////////////////////////////////////////
27 // CSelectUnpackerDlg dialog
29 void CSelectUnpackerDlg::Initialize()
31 //{{AFX_DATA_INIT(CSelectUnpackerDlg)
32 m_bNoExtensionCheck = false;
33 m_strDescription = _T("");
34 m_strExtensions = _T("");
37 // texts for the default unpackers
38 noPlugin.reset(new PluginInfo);
39 noPlugin->m_lpDispatch = nullptr;
40 noPlugin->m_name = _("<None>");
41 automaticPlugin.reset(new PluginInfo);
42 automaticPlugin->m_lpDispatch = nullptr;
43 automaticPlugin->m_name = _("<Automatic>");
44 automaticPlugin->m_description = _("The adapted unpacker is applied to both files (one file only needs the extension).");
46 m_pPlugin = noPlugin.get();
48 PluginArray * piFileScriptArray =
49 CAllThreadsScripts::GetActiveSet()->GetAvailableScripts(L"FILE_PACK_UNPACK");
50 PluginArray * piBufferScriptArray =
51 CAllThreadsScripts::GetActiveSet()->GetAvailableScripts(L"BUFFER_PACK_UNPACK");
52 PluginArray * piFileFolderScriptArray =
53 CAllThreadsScripts::GetActiveSet()->GetAvailableScripts(L"FILE_FOLDER_PACK_UNPACK");
55 // add the default unpackers to the unpackers list
56 m_UnpackerPlugins.Add(noPlugin.get());
57 m_UnpackerPlugins.Add(automaticPlugin.get());
58 // add the real unpackers to the unpackers list
60 for (i = 0 ; i < piFileScriptArray->size() ; i++)
62 // during the dialog, we use a pointer to the scriptsOfThreads array
63 const PluginInfoPtr& plugin = piFileScriptArray->at(i);
64 if (!plugin->m_disabled)
66 m_UnpackerPlugins.Add(plugin.get());
69 for (i = 0 ; i < piBufferScriptArray->size() ; i++)
71 // during the dialog, we use a pointer to the scriptsOfThreads array
72 const PluginInfoPtr& plugin = piBufferScriptArray->at(i);
73 if (!plugin->m_disabled)
75 m_UnpackerPlugins.Add(plugin.get());
78 for (i = 0 ; i < piFileFolderScriptArray->size() ; i++)
80 // during the dialog, we use a pointer to the scriptsOfThreads array
81 const PluginInfoPtr& plugin = piFileFolderScriptArray->at(i);
82 if (!plugin->m_disabled)
84 m_UnpackerPlugins.Add(plugin.get());
90 CSelectUnpackerDlg::CSelectUnpackerDlg(const String& filename, CWnd* pParent /*= nullptr*/)
91 : CTrDialog(CSelectUnpackerDlg::IDD, pParent), m_filteredFilenames(filename)
96 CSelectUnpackerDlg::CSelectUnpackerDlg(const String& filename1, const String& filename2, CWnd* pParent /*= nullptr*/)
97 : CTrDialog(CSelectUnpackerDlg::IDD, pParent), m_filteredFilenames(filename1 + _T("|") + filename2)
103 CSelectUnpackerDlg::~CSelectUnpackerDlg()
108 void CSelectUnpackerDlg::SetInitialInfoHandler(PackingInfo * infoHandler)
111 m_pPlugin = noPlugin.get();
113 if (infoHandler != nullptr && infoHandler->m_PluginOrPredifferMode != PLUGIN_MODE::PLUGIN_MANUAL)
114 // automatic unpacker
115 m_pPlugin = automaticPlugin.get();
116 else if (infoHandler)
118 // find the initial unpacker
120 for (i = 0 ; i < m_UnpackerPlugins.GetSize() ; i++)
122 PluginInfo * pPlugin = static_cast<PluginInfo*> (m_UnpackerPlugins.GetAt(i));
123 if (pPlugin->m_name == infoHandler->m_PluginName)
129 const PackingInfo CSelectUnpackerDlg::GetInfoHandler()
131 if (m_pPlugin == noPlugin.get())
132 return PackingInfo(PLUGIN_MODE::PLUGIN_MANUAL);
133 else if (m_pPlugin == automaticPlugin.get())
134 return PackingInfo(PLUGIN_MODE::PLUGIN_AUTO);
137 // build a real plugin unpacker
138 PackingInfo infoHandler;
139 infoHandler.m_PluginOrPredifferMode = PLUGIN_MODE::PLUGIN_MANUAL;
140 infoHandler.m_PluginName = m_strPluginName;
142 for (i = 0 ; i < m_UnpackerPlugins.GetSize() ; i++)
144 PluginInfo * pPlugin = static_cast<PluginInfo*> (m_UnpackerPlugins.GetAt(i));
145 if (m_pPlugin == pPlugin)
154 void CSelectUnpackerDlg::DoDataExchange(CDataExchange* pDX)
156 CTrDialog::DoDataExchange(pDX);
157 //{{AFX_DATA_MAP(CSelectUnpackerDlg)
158 DDX_Control(pDX, IDC_UNPACKER_NAME, m_cboUnpackerName);
159 DDX_Check(pDX, IDC_UNPACKER_ALLOW_ALL, m_bNoExtensionCheck);
160 DDX_Text(pDX, IDC_UNPACKER_DESCRIPTION, m_strDescription);
161 DDX_Text(pDX, IDC_UNPACKER_SUPPORTED_EXTENSIONS, m_strExtensions);
166 BEGIN_MESSAGE_MAP(CSelectUnpackerDlg, CTrDialog)
167 //{{AFX_MSG_MAP(CSelectUnpackerDlg)
168 ON_BN_CLICKED(IDC_UNPACKER_ALLOW_ALL, OnUnpackerAllowAll)
169 ON_CBN_SELCHANGE(IDC_UNPACKER_NAME, OnSelchangeUnpackerName)
170 ON_CBN_SELENDOK(IDC_UNPACKER_NAME, OnSelchangeUnpackerName)
174 /////////////////////////////////////////////////////////////////////////////
175 // CSelectUnpackerDlg message handlers
177 void CSelectUnpackerDlg::OnOK()
179 GetOptionsMgr()->SaveOption(OPT_PLUGINS_UNPACK_DONT_CHECK_EXTENSION, m_bNoExtensionCheck);
184 BOOL CSelectUnpackerDlg::OnInitDialog()
186 CTrDialog::OnInitDialog();
188 m_bNoExtensionCheck = GetOptionsMgr()->GetBool(OPT_PLUGINS_UNPACK_DONT_CHECK_EXTENSION);
192 return TRUE; // return TRUE unless you set the focus to a control
193 // EXCEPTION: OCX Property Pages should return FALSE
196 void CSelectUnpackerDlg::prepareListbox()
200 for (i = 0 ; i < m_UnpackerPlugins.GetSize() ; i++)
202 PluginInfo * pPlugin = static_cast<PluginInfo*> (m_UnpackerPlugins.GetAt(i));
203 if (pPlugin == noPlugin.get() || pPlugin == automaticPlugin.get()
204 || m_bNoExtensionCheck
205 || pPlugin->TestAgainstRegList(m_filteredFilenames))
207 m_cboUnpackerName.AddString(pPlugin->m_name.c_str());
208 if (pPlugin == m_pPlugin)
209 sel = m_cboUnpackerName.GetCount()-1;
214 m_cboUnpackerName.SelectString(-1, noPlugin->m_name.c_str());
216 m_cboUnpackerName.SetCurSel(sel);
218 OnSelchangeUnpackerName();
221 void CSelectUnpackerDlg::OnUnpackerAllowAll()
225 m_cboUnpackerName.ResetContent();
232 void CSelectUnpackerDlg::OnSelchangeUnpackerName()
234 int i = m_cboUnpackerName.GetCurSel();
237 m_pPlugin = noPlugin.get();
241 // initialize with the default unpacker
242 m_pPlugin = static_cast<PluginInfo*> (m_UnpackerPlugins.GetAt(0));
243 PluginInfo * pPlugin;
244 CString cstrPluginName;
245 m_cboUnpackerName.GetWindowText(cstrPluginName);
246 m_strPluginName = cstrPluginName;
247 for (int j = 0 ; j < m_UnpackerPlugins.GetSize() ; j++)
249 pPlugin = static_cast<PluginInfo*> (m_UnpackerPlugins.GetAt(j));
250 if (m_strPluginName == pPlugin->m_name)
258 m_strPluginName = m_pPlugin->m_name;
259 m_strDescription = m_pPlugin->m_description;
260 m_strExtensions = m_pPlugin->m_filtersText;