2 * @file LineFiltersList.cpp
4 * @brief Implementation for LineFiltersList class.
8 #include "LineFiltersList.h"
11 #include "OptionsMgr.h"
12 #include "UnicodeString.h"
16 /** @brief Registry key for saving linefilters. */
17 static const tchar_t LineFiltersRegPath[] = _T("LineFilters");
20 * @brief Default constructor.
22 LineFiltersList::LineFiltersList()
23 : m_pOptionsMgr(nullptr)
28 * @brief Destructor, empties the list.
30 LineFiltersList::~LineFiltersList() = default;
33 * @brief Add new filter to the list.
34 * @param [in] filter Filter string to add.
35 * @param [in] enabled Is filter enabled?
37 void LineFiltersList::AddFilter(const String& filter, bool enabled)
39 auto item = std::make_shared<LineFilterItem>(LineFilterItem());
40 item->enabled = enabled;
41 item->filterStr = filter;
42 m_items.push_back(item);
46 * @brief Returns the filter list as one filter string.
47 * This function returns the list of filters as one string that can be
48 * given to regular expression engine as filter. Filter strings in
49 * the list are separated by "|".
50 * @return Filter string.
52 String LineFiltersList::GetAsString() const
55 vector<LineFilterItemPtr>::const_iterator iter = m_items.begin();
57 while (iter != m_items.end())
59 if ((*iter)->enabled && !(*iter)->filterStr.empty())
63 filter += (*iter)->filterStr;
71 * @brief Return filter from given index.
72 * @param [in] ind Index of filter.
73 * @return Filter item from the index. If the index is beyond table limit,
74 * return the last item in the list.
76 const LineFilterItem & LineFiltersList::GetAt(size_t ind) const
78 if (ind < m_items.size())
81 return *m_items.back();
85 * @brief Clone filter list from another list.
86 * This function clones filter list from another list. Current items in the
87 * list are removed and new items added from the given list.
88 * @param [in] list List to clone.
90 void LineFiltersList::CloneFrom(const LineFiltersList *list)
93 size_t count = list->GetCount();
95 for (size_t i = 0; i < count; i++)
97 const LineFilterItem &item = list->GetAt(i);
98 AddFilter(item.filterStr, item.enabled);
103 * @brief Compare filter lists.
104 * @param [in] list List to compare.
105 * @return true if lists are identical, false otherwise.
107 bool LineFiltersList::Compare(const LineFiltersList *list) const
109 if (list->GetCount() != GetCount())
112 for (size_t i = 0; i < GetCount(); i++)
114 const LineFilterItem &item1 = list->GetAt(i);
115 const LineFilterItem &item2 = GetAt(i);
117 if (item1.enabled != item2.enabled)
120 if (item1.filterStr != item2.filterStr)
127 * @brief Read filter list from the options system.
128 * @param [in] pOptionsMgr Pointer to options system.
130 void LineFiltersList::Initialize(COptionsMgr *pOptionsMgr)
132 assert(pOptionsMgr != nullptr);
133 String valuename(LineFiltersRegPath);
135 m_pOptionsMgr = pOptionsMgr;
139 valuename += _T("/Values");
140 m_pOptionsMgr->InitOption(valuename, 0);
141 size_t count = m_pOptionsMgr->GetInt(valuename);
143 for (unsigned i = 0; i < count; i++)
145 String name = strutils::format(_T("%s/Filter%02u"), LineFiltersRegPath, i);
146 m_pOptionsMgr->InitOption(name, _T(""));
147 String filter = m_pOptionsMgr->GetString(name);
149 name = strutils::format(_T("%s/Enabled%02u"), LineFiltersRegPath, i);
150 m_pOptionsMgr->InitOption(name, (int)true);
151 int enabled = m_pOptionsMgr->GetInt(name);
152 bool bEnabled = enabled ? true : false;
154 AddFilter(filter, bEnabled);
159 * @brief Save linefilters to options system.
161 void LineFiltersList::SaveFilters()
163 assert(m_pOptionsMgr != nullptr);
164 String valuename(LineFiltersRegPath);
166 size_t count = m_items.size();
167 valuename += _T("/Values");
168 m_pOptionsMgr->SaveOption(valuename, static_cast<int>(count));
170 for (size_t i = 0; i < count; i++)
172 const LineFilterItemPtr& item = m_items[i];
174 String name = strutils::format(_T("%s/Filter%02u"), LineFiltersRegPath, i);
175 m_pOptionsMgr->InitOption(name, _T(""));
176 m_pOptionsMgr->SaveOption(name, item->filterStr);
178 name = strutils::format(_T("%s/Enabled%02u"), LineFiltersRegPath, i);
179 m_pOptionsMgr->InitOption(name, 0);
180 m_pOptionsMgr->SaveOption(name, (int)item->enabled);
183 // Remove options we don't need anymore
184 // We could have earlier 10 pcs but now we only need 5
185 String filter = strutils::format(_T("%s/Filter%02u"), LineFiltersRegPath, count);
186 int retval1 = m_pOptionsMgr->RemoveOption(filter);
188 filter = strutils::format(_T("%s/Enabled%02u"), LineFiltersRegPath, count);
189 int retval2 = m_pOptionsMgr->RemoveOption(filter);
191 while (retval1 == COption::OPT_OK || retval2 == COption::OPT_OK)
194 filter = strutils::format(_T("%s/Filter%02u"), LineFiltersRegPath, count);
195 retval1 = m_pOptionsMgr->RemoveOption(filter);
196 filter = strutils::format(_T("%s/Enabled%02u"), LineFiltersRegPath, count);
197 retval2 = m_pOptionsMgr->RemoveOption(filter);