| Index: src/plugin/PluginSettings.cpp | 
| =================================================================== | 
| --- a/src/plugin/PluginSettings.cpp | 
| +++ b/src/plugin/PluginSettings.cpp | 
| @@ -15,260 +15,248 @@ | 
| * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | 
| */ | 
| -#include "PluginStdAfx.h" | 
| - | 
| -#include "PluginSettings.h" | 
| -#include "AdblockPlusClient.h" | 
| -#include "PluginSystem.h" | 
| -#include "PluginMutex.h" | 
| -#include "../shared/Utils.h" | 
| - | 
| -namespace | 
| -{ | 
| - std::wstring CreateDomainWhitelistingFilter(const CString& domain) | 
| - { | 
| - return L"@@||" + ToWstring(domain) + L"^$document"; | 
| - } | 
| -} | 
| - | 
| -class CPluginSettingsWhitelistLock : public CPluginMutex | 
| -{ | 
| -public: | 
| - CPluginSettingsWhitelistLock() : CPluginMutex(L"SettingsFileWhitelist", PLUGIN_ERROR_MUTEX_SETTINGS_FILE_WHITELIST) {} | 
| - ~CPluginSettingsWhitelistLock() {} | 
| -}; | 
| - | 
| -CPluginSettings* CPluginSettings::s_instance = NULL; | 
| -CComAutoCriticalSection CPluginSettings::s_criticalSectionLocal; | 
| - | 
| -CPluginSettings::CPluginSettings() : m_dwWorkingThreadId(0) | 
| -{ | 
| - s_instance = NULL; | 
| - m_WindowsBuildNumber = 0; | 
| - ClearWhitelist(); | 
| -} | 
| - | 
| -CPluginSettings::~CPluginSettings() | 
| -{ | 
| - s_instance = NULL; | 
| -} | 
| - | 
| -CPluginSettings* CPluginSettings::GetInstance() | 
| -{ | 
| - CPluginSettings* instance = NULL; | 
| - | 
| - s_criticalSectionLocal.Lock(); | 
| - { | 
| - if (!s_instance) | 
| - { | 
| - s_instance = new CPluginSettings(); | 
| - } | 
| - | 
| - instance = s_instance; | 
| - } | 
| - s_criticalSectionLocal.Unlock(); | 
| - | 
| - return instance; | 
| -} | 
| - | 
| - | 
| -bool CPluginSettings::HasInstance() | 
| -{ | 
| - bool hasInstance = true; | 
| - | 
| - s_criticalSectionLocal.Lock(); | 
| - { | 
| - hasInstance = s_instance != NULL; | 
| - } | 
| - s_criticalSectionLocal.Unlock(); | 
| - | 
| - return hasInstance; | 
| -} | 
| - | 
| -std::wstring GetDataPath(const std::wstring& filename) | 
| -{ | 
| - return GetAppDataPath() + L"\\" + filename; | 
| -} | 
| - | 
| -bool CPluginSettings::IsPluginEnabled() const | 
| -{ | 
| - return GetPluginEnabled(); | 
| -} | 
| - | 
| -std::map<CString, CString> CPluginSettings::GetFilterLanguageTitleList() const | 
| -{ | 
| - std::vector<SubscriptionDescription> subscriptions = CPluginClient::GetInstance()->FetchAvailableSubscriptions(); | 
| - | 
| - std::map<CString, CString> filterList; | 
| - for (size_t i = 0; i < subscriptions.size(); i ++) | 
| - { | 
| - SubscriptionDescription it = subscriptions[i]; | 
| - filterList.insert(std::make_pair(CString(it.url.c_str()), CString(it.title.c_str()))); | 
| - } | 
| - return filterList; | 
| -} | 
| - | 
| -bool CPluginSettings::IsWorkingThread(DWORD dwThreadId) const | 
| -{ | 
| - if (dwThreadId == 0) | 
| - { | 
| - dwThreadId = ::GetCurrentThreadId(); | 
| - } | 
| - return m_dwWorkingThreadId == dwThreadId; | 
| -} | 
| - | 
| -void CPluginSettings::SetWorkingThreadId() | 
| -{ | 
| - m_dwWorkingThreadId = ::GetCurrentThreadId(); | 
| -} | 
| - | 
| -void CPluginSettings::SetWorkingThreadId(DWORD id) | 
| -{ | 
| - m_dwWorkingThreadId = id; | 
| -} | 
| - | 
| -void CPluginSettings::TogglePluginEnabled() | 
| -{ | 
| - CPluginClient::GetInstance()->TogglePluginEnabled(); | 
| -} | 
| -bool CPluginSettings::GetPluginEnabled() const | 
| -{ | 
| - return CPluginClient::GetInstance()->GetPref(L"enabled", true); | 
| -} | 
| - | 
| - | 
| -void CPluginSettings::AddError(const CString& error, const CString& errorCode) | 
| -{ | 
| - DEBUG_SETTINGS(L"SettingsTab::AddError error:" + error + " code:" + errorCode) | 
| -} | 
| - | 
| - | 
| -// ============================================================================ | 
| -// Whitelist settings | 
| -// ============================================================================ | 
| - | 
| -void CPluginSettings::ClearWhitelist() | 
| -{ | 
| - s_criticalSectionLocal.Lock(); | 
| - { | 
| - m_whitelistedDomains.clear(); | 
| - } | 
| - s_criticalSectionLocal.Unlock(); | 
| -} | 
| - | 
| -bool CPluginSettings::ReadWhitelist(bool isDebug) | 
| -{ | 
| - bool isRead = true; | 
| - | 
| - DEBUG_SETTINGS("SettingsWhitelist::Read") | 
| - | 
| - if (isDebug) | 
| - { | 
| - DEBUG_GENERAL("*** Loading whitelist settings"); | 
| - } | 
| - | 
| - CPluginSettingsWhitelistLock lock; | 
| - if (lock.IsLocked()) | 
| - { | 
| - ClearWhitelist(); | 
| - | 
| - s_criticalSectionLocal.Lock(); | 
| - m_whitelistedDomains = CPluginClient::GetInstance()->GetExceptionDomains(); | 
| - s_criticalSectionLocal.Unlock(); | 
| - } | 
| - else | 
| - { | 
| - isRead = false; | 
| - } | 
| - | 
| - return isRead; | 
| -} | 
| - | 
| -void CPluginSettings::AddWhiteListedDomain(const CString& domain) | 
| -{ | 
| - DEBUG_SETTINGS("SettingsWhitelist::AddWhiteListedDomain domain:" + domain) | 
| - CPluginClient::GetInstance()->AddFilter(CreateDomainWhitelistingFilter(domain)); | 
| -} | 
| - | 
| -void CPluginSettings::RemoveWhiteListedDomain(const CString& domain) | 
| -{ | 
| - DEBUG_SETTINGS("SettingsWhitelist::RemoveWhiteListedDomain domain:" + domain) | 
| - CPluginClient::GetInstance()->RemoveFilter(CreateDomainWhitelistingFilter(domain)); | 
| -} | 
| - | 
| -int CPluginSettings::GetWhiteListedDomainCount() const | 
| -{ | 
| - int count = 0; | 
| - | 
| - s_criticalSectionLocal.Lock(); | 
| - { | 
| - count = (int)m_whitelistedDomains.size(); | 
| - } | 
| - s_criticalSectionLocal.Unlock(); | 
| - | 
| - return count; | 
| -} | 
| - | 
| -std::vector<std::wstring> CPluginSettings::GetWhiteListedDomainList() | 
| -{ | 
| - bool r = ReadWhitelist(false); | 
| - return m_whitelistedDomains; | 
| -} | 
| - | 
| - | 
| -bool CPluginSettings::RefreshWhitelist() | 
| -{ | 
| - CPluginSettingsWhitelistLock lock; | 
| - if (lock.IsLocked()) | 
| - { | 
| - ReadWhitelist(true); | 
| - } | 
| - | 
| - return true; | 
| -} | 
| - | 
| -DWORD CPluginSettings::GetWindowsBuildNumber() | 
| -{ | 
| - if (m_WindowsBuildNumber == 0) | 
| - { | 
| - OSVERSIONINFOEX osvi = {}; | 
| - osvi.dwOSVersionInfoSize = sizeof(osvi); | 
| - if (GetVersionExW(reinterpret_cast<OSVERSIONINFO*>(&osvi)) != 0) | 
| - { | 
| - m_WindowsBuildNumber = osvi.dwBuildNumber; | 
| - } | 
| - } | 
| - | 
| - return m_WindowsBuildNumber; | 
| -} | 
| - | 
| -void CPluginSettings::SetSubscription(const std::wstring& url) | 
| -{ | 
| - CPluginClient::GetInstance()->SetSubscription(url); | 
| - RefreshWhitelist(); | 
| -} | 
| - | 
| -CString CPluginSettings::GetSubscription() | 
| -{ | 
| - std::vector<SubscriptionDescription> subscriptions = CPluginClient::GetInstance()->GetListedSubscriptions(); | 
| - std::wstring aaUrl = CPluginClient::GetInstance()->GetPref(L"subscriptions_exceptionsurl", L""); | 
| - | 
| - for (std::vector<SubscriptionDescription>::iterator subscription = subscriptions.begin(); subscription != subscriptions.end(); subscription++) | 
| - { | 
| - if (subscription->url != aaUrl) | 
| - { | 
| - return CString(subscription->url.c_str()); | 
| - } | 
| - } | 
| - return CString(L""); | 
| -} | 
| - | 
| -CString CPluginSettings::GetAppLocale() | 
| -{ | 
| - return ToCString(GetBrowserLanguage()); | 
| -} | 
| - | 
| -CString CPluginSettings::GetDocumentationLink() | 
| -{ | 
| - return CString(CPluginClient::GetInstance()->GetDocumentationLink().c_str()); | 
| -} | 
| +#include "PluginStdAfx.h" | 
| + | 
| +#include "PluginSettings.h" | 
| +#include "AdblockPlusClient.h" | 
| +#include "PluginSystem.h" | 
| +#include "PluginMutex.h" | 
| +#include "../shared/Utils.h" | 
| + | 
| +namespace | 
| +{ | 
| + std::wstring CreateDomainWhitelistingFilter(const std::wstring& domain) | 
| + { | 
| + return L"@@||" + domain + L"^$document"; | 
| + } | 
| +} | 
| + | 
| +class CPluginSettingsWhitelistLock : public CPluginMutex | 
| +{ | 
| +public: | 
| + CPluginSettingsWhitelistLock() : CPluginMutex(L"SettingsFileWhitelist", PLUGIN_ERROR_MUTEX_SETTINGS_FILE_WHITELIST) {} | 
| + ~CPluginSettingsWhitelistLock() {} | 
| +}; | 
| + | 
| +CPluginSettings* CPluginSettings::s_instance = NULL; | 
| +CComAutoCriticalSection CPluginSettings::s_criticalSectionLocal; | 
| + | 
| +CPluginSettings::CPluginSettings() : m_dwWorkingThreadId(0) | 
| +{ | 
| + s_instance = NULL; | 
| + m_WindowsBuildNumber = 0; | 
| + ClearWhitelist(); | 
| +} | 
| + | 
| +CPluginSettings::~CPluginSettings() | 
| +{ | 
| + s_instance = NULL; | 
| +} | 
| + | 
| +CPluginSettings* CPluginSettings::GetInstance() | 
| +{ | 
| + CPluginSettings* instance = NULL; | 
| + | 
| + s_criticalSectionLocal.Lock(); | 
| + { | 
| + if (!s_instance) | 
| + { | 
| + s_instance = new CPluginSettings(); | 
| + } | 
| + | 
| + instance = s_instance; | 
| + } | 
| + s_criticalSectionLocal.Unlock(); | 
| + | 
| + return instance; | 
| +} | 
| + | 
| + | 
| +bool CPluginSettings::HasInstance() | 
| +{ | 
| + bool hasInstance = true; | 
| + | 
| + s_criticalSectionLocal.Lock(); | 
| + { | 
| + hasInstance = s_instance != NULL; | 
| + } | 
| + s_criticalSectionLocal.Unlock(); | 
| + | 
| + return hasInstance; | 
| +} | 
| + | 
| +std::wstring GetDataPath(const std::wstring& filename) | 
| +{ | 
| + return GetAppDataPath() + L"\\" + filename; | 
| +} | 
| + | 
| +bool CPluginSettings::IsPluginEnabled() const | 
| +{ | 
| + return GetPluginEnabled(); | 
| +} | 
| + | 
| +std::map<std::wstring, std::wstring> CPluginSettings::GetFilterLanguageTitleList() const | 
| +{ | 
| + auto subscriptions = CPluginClient::GetInstance()->FetchAvailableSubscriptions(); | 
| + | 
| + std::map<std::wstring, std::wstring> filterList; | 
| + for (size_t i = 0; i < subscriptions.size(); i ++) | 
| + { | 
| + auto it = subscriptions[i]; | 
| + filterList.insert(std::make_pair(it.url, it.title)); | 
| + } | 
| + return filterList; | 
| +} | 
| + | 
| +bool CPluginSettings::IsWorkingThread(DWORD dwThreadId) const | 
| +{ | 
| + if (dwThreadId == 0) | 
| + { | 
| + dwThreadId = ::GetCurrentThreadId(); | 
| + } | 
| + return m_dwWorkingThreadId == dwThreadId; | 
| +} | 
| + | 
| +void CPluginSettings::SetWorkingThreadId() | 
| +{ | 
| + m_dwWorkingThreadId = ::GetCurrentThreadId(); | 
| +} | 
| + | 
| +void CPluginSettings::SetWorkingThreadId(DWORD id) | 
| +{ | 
| + m_dwWorkingThreadId = id; | 
| +} | 
| + | 
| +void CPluginSettings::TogglePluginEnabled() | 
| +{ | 
| + CPluginClient::GetInstance()->TogglePluginEnabled(); | 
| +} | 
| +bool CPluginSettings::GetPluginEnabled() const | 
| +{ | 
| + return CPluginClient::GetInstance()->GetPref(L"enabled", true); | 
| +} | 
| + | 
| +void CPluginSettings::AddError(const CString& error, const CString& errorCode) | 
| +{ | 
| + DEBUG_SETTINGS(L"SettingsTab::AddError error:" + error + " code:" + errorCode) | 
| +} | 
| + | 
| +// ============================================================================ | 
| +// Whitelist settings | 
| +// ============================================================================ | 
| + | 
| +void CPluginSettings::ClearWhitelist() | 
| +{ | 
| + s_criticalSectionLocal.Lock(); | 
| + { | 
| + m_whitelistedDomains.clear(); | 
| + } | 
| + s_criticalSectionLocal.Unlock(); | 
| +} | 
| + | 
| +bool CPluginSettings::ReadWhitelist(bool isDebug) | 
| +{ | 
| + bool isRead = true; | 
| + | 
| + DEBUG_SETTINGS("SettingsWhitelist::Read") | 
| + | 
| + if (isDebug) | 
| + { | 
| + DEBUG_GENERAL("*** Loading whitelist settings"); | 
| + } | 
| + | 
| + CPluginSettingsWhitelistLock lock; | 
| + if (lock.IsLocked()) | 
| + { | 
| + ClearWhitelist(); | 
| + | 
| + s_criticalSectionLocal.Lock(); | 
| + m_whitelistedDomains = CPluginClient::GetInstance()->GetExceptionDomains(); | 
| + s_criticalSectionLocal.Unlock(); | 
| + } | 
| + else | 
| + { | 
| + isRead = false; | 
| + } | 
| + | 
| + return isRead; | 
| +} | 
| + | 
| +void CPluginSettings::AddWhiteListedDomain(const std::wstring& domain) | 
| +{ | 
| + DEBUG_SETTINGS("SettingsWhitelist::AddWhiteListedDomain domain:" + domain) | 
| + CPluginClient::GetInstance()->AddFilter(CreateDomainWhitelistingFilter(domain)); | 
| +} | 
| + | 
| +void CPluginSettings::RemoveWhiteListedDomain(const std::wstring& domain) | 
| +{ | 
| + DEBUG_SETTINGS("SettingsWhitelist::RemoveWhiteListedDomain domain:" + domain) | 
| + CPluginClient::GetInstance()->RemoveFilter(CreateDomainWhitelistingFilter(domain)); | 
| +} | 
| + | 
| +int CPluginSettings::GetWhiteListedDomainCount() const | 
| +{ | 
| + int count = 0; | 
| + | 
| + s_criticalSectionLocal.Lock(); | 
| + { | 
| + count = (int)m_whitelistedDomains.size(); | 
| + } | 
| + s_criticalSectionLocal.Unlock(); | 
| + | 
| + return count; | 
| +} | 
| + | 
| +std::vector<std::wstring> CPluginSettings::GetWhiteListedDomainList() | 
| +{ | 
| + bool r = ReadWhitelist(false); | 
| + return m_whitelistedDomains; | 
| +} | 
| + | 
| + | 
| +bool CPluginSettings::RefreshWhitelist() | 
| +{ | 
| + CPluginSettingsWhitelistLock lock; | 
| + if (lock.IsLocked()) | 
| + { | 
| + ReadWhitelist(true); | 
| + } | 
| + | 
| + return true; | 
| +} | 
| + | 
| +DWORD CPluginSettings::GetWindowsBuildNumber() | 
| +{ | 
| + if (m_WindowsBuildNumber == 0) | 
| + { | 
| + OSVERSIONINFOEX osvi = {}; | 
| + osvi.dwOSVersionInfoSize = sizeof(osvi); | 
| + if (GetVersionExW(reinterpret_cast<OSVERSIONINFO*>(&osvi)) != 0) | 
| + { | 
| + m_WindowsBuildNumber = osvi.dwBuildNumber; | 
| + } | 
| + } | 
| + | 
| + return m_WindowsBuildNumber; | 
| +} | 
| + | 
| +void CPluginSettings::SetSubscription(const std::wstring& url) | 
| +{ | 
| + CPluginClient::GetInstance()->SetSubscription(url); | 
| + RefreshWhitelist(); | 
| +} | 
| + | 
| +std::wstring CPluginSettings::GetSubscription() | 
| +{ | 
| + auto subscriptions = CPluginClient::GetInstance()->GetListedSubscriptions(); | 
| + std::wstring aaUrl = CPluginClient::GetInstance()->GetPref(L"subscriptions_exceptionsurl", L""); | 
| + | 
| + for (auto subscription = subscriptions.begin(); subscription != subscriptions.end(); subscription++) | 
| + { | 
| + if (subscription->url != aaUrl) | 
| + { | 
| + return subscription->url; | 
| + } | 
| + } | 
| + return std::wstring(); | 
| +} |