2 * @file LineFiltersList.cpp
4 * @brief Implementation for LineFiltersList class.
8 #include "LineFiltersList.h"
9 #include "FilterList.h"
12 #include "OptionsMgr.h"
13 #include "UnicodeString.h"
17 /** @brief Registry key for saving linefilters. */
18 static const tchar_t LineFiltersRegPath[] = _T("LineFilters");
21 * @brief Default constructor.
23 LineFiltersList::LineFiltersList()
24 : m_pOptionsMgr(nullptr)
29 * @brief Destructor, empties the list.
31 LineFiltersList::~LineFiltersList() = default;
34 * @brief Add new filter to the list.
35 * @param [in] filter Filter string to add.
36 * @param [in] enabled Is filter enabled?
38 void LineFiltersList::AddFilter(const String& filter, bool enabled)
40 auto item = std::make_shared<LineFilterItem>(LineFilterItem());
41 item->enabled = enabled;
42 item->filterStr = filter;
43 m_items.push_back(item);
47 * @brief Return filter from given index.
48 * @param [in] ind Index of filter.
49 * @return Filter item from the index. If the index is beyond table limit,
50 * return the last item in the list.
52 const LineFilterItem & LineFiltersList::GetAt(size_t ind) const
54 if (ind < m_items.size())
57 return *m_items.back();
61 * @brief Clone filter list from another list.
62 * This function clones filter list from another list. Current items in the
63 * list are removed and new items added from the given list.
64 * @param [in] list List to clone.
66 void LineFiltersList::CloneFrom(const LineFiltersList *list)
69 size_t count = list->GetCount();
71 for (size_t i = 0; i < count; i++)
73 const LineFilterItem &item = list->GetAt(i);
74 AddFilter(item.filterStr, item.enabled);
79 * @brief Compare filter lists.
80 * @param [in] list List to compare.
81 * @return true if lists are identical, false otherwise.
83 bool LineFiltersList::Compare(const LineFiltersList *list) const
85 if (list->GetCount() != GetCount())
88 for (size_t i = 0; i < GetCount(); i++)
90 const LineFilterItem &item1 = list->GetAt(i);
91 const LineFilterItem &item2 = GetAt(i);
93 if (item1.enabled != item2.enabled)
96 if (item1.filterStr != item2.filterStr)
103 * @brief Read filter list from the options system.
104 * @param [in] pOptionsMgr Pointer to options system.
106 void LineFiltersList::Initialize(COptionsMgr *pOptionsMgr)
108 assert(pOptionsMgr != nullptr);
109 String valuename(LineFiltersRegPath);
111 m_pOptionsMgr = pOptionsMgr;
115 valuename += _T("/Values");
116 m_pOptionsMgr->InitOption(valuename, 0);
117 size_t count = m_pOptionsMgr->GetInt(valuename);
119 for (unsigned i = 0; i < count; i++)
121 String name = strutils::format(_T("%s/Filter%02u"), LineFiltersRegPath, i);
122 m_pOptionsMgr->InitOption(name, _T(""));
123 String filter = m_pOptionsMgr->GetString(name);
125 name = strutils::format(_T("%s/Enabled%02u"), LineFiltersRegPath, i);
126 m_pOptionsMgr->InitOption(name, (int)true);
127 int enabled = m_pOptionsMgr->GetInt(name);
128 bool bEnabled = enabled ? true : false;
130 AddFilter(filter, bEnabled);
135 * @brief Save linefilters to options system.
137 void LineFiltersList::SaveFilters()
139 assert(m_pOptionsMgr != nullptr);
140 String valuename(LineFiltersRegPath);
142 size_t count = m_items.size();
143 valuename += _T("/Values");
144 m_pOptionsMgr->SaveOption(valuename, static_cast<int>(count));
146 for (size_t i = 0; i < count; i++)
148 const LineFilterItemPtr& item = m_items[i];
150 String name = strutils::format(_T("%s/Filter%02u"), LineFiltersRegPath, i);
151 m_pOptionsMgr->InitOption(name, _T(""));
152 m_pOptionsMgr->SaveOption(name, item->filterStr);
154 name = strutils::format(_T("%s/Enabled%02u"), LineFiltersRegPath, i);
155 m_pOptionsMgr->InitOption(name, 0);
156 m_pOptionsMgr->SaveOption(name, (int)item->enabled);
159 // Remove options we don't need anymore
160 // We could have earlier 10 pcs but now we only need 5
161 String filter = strutils::format(_T("%s/Filter%02u"), LineFiltersRegPath, count);
162 int retval1 = m_pOptionsMgr->RemoveOption(filter);
164 filter = strutils::format(_T("%s/Enabled%02u"), LineFiltersRegPath, count);
165 int retval2 = m_pOptionsMgr->RemoveOption(filter);
167 while (retval1 == COption::OPT_OK || retval2 == COption::OPT_OK)
170 filter = strutils::format(_T("%s/Filter%02u"), LineFiltersRegPath, count);
171 retval1 = m_pOptionsMgr->RemoveOption(filter);
172 filter = strutils::format(_T("%s/Enabled%02u"), LineFiltersRegPath, count);
173 retval2 = m_pOptionsMgr->RemoveOption(filter);
177 std::shared_ptr<FilterList> LineFiltersList::MakeFilterList(bool throwIfInvalid)
180 std::shared_ptr<FilterList> plist(new FilterList);
181 for (auto& item : m_items)
183 if (item->enabled && !item->filterStr.empty())
187 plist->AddRegExp(ucr::toUTF8(item->filterStr), false, throwIfInvalid);
189 catch (const std::runtime_error& e)
194 const String msg = strutils::format(_T("#%d: %S"), i + 1, e.what());
195 throw std::runtime_error(ucr::toUTF8(msg).c_str());