Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Delta Between Two Patch Sets: Shared/PluginSettings.cpp

Issue 9998007: Initial libadblockplus integration (Closed)
Left Patch Set: Created April 1, 2013, 9:55 p.m.
Right Patch Set: Whitelisting management Created April 11, 2013, 9:06 a.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
Left: Side by side diff | Download
Right: Side by side diff | Download
« no previous file with change/comment | « Shared/PluginSettings.h ('k') | Shared/PluginTabBase.cpp » ('j') | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
1 #include "PluginStdAfx.h" 1 #include "PluginStdAfx.h"
2 2
3 #include <Wbemidl.h> 3 #include <Wbemidl.h>
4 #include <time.h> 4 #include <time.h>
5 #include "PluginIniFileW.h" 5 #include "PluginIniFileW.h"
6 #include "PluginIniFile.h" 6 #include "PluginIniFile.h"
7 #include "PluginSettings.h" 7 #include "PluginSettings.h"
8 #include "PluginDictionary.h" 8 #include "PluginDictionary.h"
9 #include "PluginClient.h" 9 #include "PluginClient.h"
10 #include "PluginChecksum.h" 10 #include "PluginChecksum.h"
11 #include "PluginSystem.h" 11 #include "PluginSystem.h"
12 #ifdef SUPPORT_FILTER 12 #ifdef SUPPORT_FILTER
13 #include "PluginFilter.h" 13 #include "PluginFilter.h"
14 #endif 14 #endif
15 #include "PluginMutex.h" 15 #include "PluginMutex.h"
16 #include "PluginHttpRequest.h" 16 #include "PluginHttpRequest.h"
17 #include <memory>
18
17 19
18 // IE functions 20 // IE functions
19 #pragma comment(lib, "iepmapi.lib") 21 #pragma comment(lib, "iepmapi.lib")
20 22
21 #include <knownfolders.h> 23 #include <knownfolders.h>
22 24
23 class TSettings 25 class TSettings
24 { 26 {
25 DWORD processorId; 27 DWORD processorId;
26 28
27 char sPluginId[44]; 29 char sPluginId[44];
28 }; 30 };
31
32 static void SubsCallback(std::vector<AdblockPlus::SubscriptionPtr>& subscription s);
29 33
30 34
31 class CPluginSettingsLock : public CPluginMutex 35 class CPluginSettingsLock : public CPluginMutex
32 { 36 {
33 public: 37 public:
34 CPluginSettingsLock() : CPluginMutex("SettingsFile", PLUGIN_ERROR_MUTEX_SETTIN GS_FILE) {} 38 CPluginSettingsLock() : CPluginMutex("SettingsFile", PLUGIN_ERROR_MUTEX_SETTIN GS_FILE) {}
35 ~CPluginSettingsLock() {} 39 ~CPluginSettingsLock() {}
36 40
37 }; 41 };
38 42
(...skipping 16 matching lines...) Expand all
55 59
56 #endif 60 #endif
57 61
58 WCHAR* CPluginSettings::s_dataPath; 62 WCHAR* CPluginSettings::s_dataPath;
59 WCHAR* CPluginSettings::s_dataPathParent; 63 WCHAR* CPluginSettings::s_dataPathParent;
60 64
61 CPluginSettings* CPluginSettings::s_instance = NULL; 65 CPluginSettings* CPluginSettings::s_instance = NULL;
62 bool CPluginSettings::s_isLightOnly = false; 66 bool CPluginSettings::s_isLightOnly = false;
63 67
64 CComAutoCriticalSection CPluginSettings::s_criticalSectionLocal; 68 CComAutoCriticalSection CPluginSettings::s_criticalSectionLocal;
65 #ifdef SUPPORT_FILTER
66 CComAutoCriticalSection CPluginSettings::s_criticalSectionFilters;
67 #endif
68 #ifdef SUPPORT_WHITELIST 69 #ifdef SUPPORT_WHITELIST
69 CComAutoCriticalSection CPluginSettings::s_criticalSectionDomainHistory; 70 CComAutoCriticalSection CPluginSettings::s_criticalSectionDomainHistory;
70 #endif 71 #endif
71 72
72 73
73 CPluginSettings::CPluginSettings() : 74 CPluginSettings::CPluginSettings() :
74 m_settingsVersion("1"), m_isDirty(false), m_isFirstRun(false), m_isFirstRunUpd ate(false), m_dwMainProcessId(0), m_dwMainThreadId(0), m_dwWorkingThreadId(0), 75 m_settingsVersion("1"), m_isDirty(false), m_isFirstRun(false), m_isFirstRunUpd ate(false), m_dwMainProcessId(0), m_dwMainThreadId(0), m_dwWorkingThreadId(0),
75 m_isDirtyTab(false), m_isPluginEnabledTab(true), m_tabNumber("1") 76 m_isDirtyTab(false), m_isPluginEnabledTab(true), m_tabNumber("1")
76 { 77 {
77 78
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 220
220 CPluginSettings* CPluginSettings::GetInstance() 221 CPluginSettings* CPluginSettings::GetInstance()
221 { 222 {
222 CPluginSettings* instance = NULL; 223 CPluginSettings* instance = NULL;
223 224
224 s_criticalSectionLocal.Lock(); 225 s_criticalSectionLocal.Lock();
225 { 226 {
226 if ((!s_instance) || (s_isLightOnly)) 227 if ((!s_instance) || (s_isLightOnly))
227 { 228 {
228 s_instance = new CPluginSettings(); 229 s_instance = new CPluginSettings();
230 CPluginClient::GetInstance()->GetFilterEngine()->FetchAvailableSubscriptio ns((AdblockPlus::SubscriptionsCallback)&SubsCallback);
229 s_isLightOnly = false; 231 s_isLightOnly = false;
230 } 232 }
231 233
232 instance = s_instance; 234 instance = s_instance;
233 } 235 }
234 s_criticalSectionLocal.Unlock(); 236 s_criticalSectionLocal.Unlock();
235 237
236 return instance; 238 return instance;
237 } 239 }
238 240
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 285
284 CPluginSettingsLock lock; 286 CPluginSettingsLock lock;
285 if (lock.IsLocked()) 287 if (lock.IsLocked())
286 { 288 {
287 isRead = m_settingsFile->Read(); 289 isRead = m_settingsFile->Read();
288 if (isRead) 290 if (isRead)
289 { 291 {
290 if (m_settingsFile->IsValidChecksum()) 292 if (m_settingsFile->IsValidChecksum())
291 { 293 {
292 m_properties = m_settingsFile->GetSectionData("Settings"); 294 m_properties = m_settingsFile->GetSectionData("Settings");
293
294 #ifdef SUPPORT_FILTER
295 // Unpack filter URLs
296 CPluginIniFileW::TSectionData filters = m_settingsFile->GetSectionData ("Filters");
297 int filterCount = 0;
298 bool bContinue = true;
299
300 s_criticalSectionFilters.Lock();
301 {
302 m_filterUrlList.clear();
303
304 do
305 {
306 CString filterCountStr;
307 filterCountStr.Format(L"%d", ++filterCount);
308
309 CPluginIniFileW::TSectionData::iterator filterIt = filters.find(L" filter" + filterCountStr);
310 CPluginIniFileW::TSectionData::iterator versionIt = filters.find(L "filter" + filterCountStr + "v");
311 CPluginIniFileW::TSectionData::iterator fileNameIt = filters.find( L"filter" + filterCountStr + "fileName");
312 CPluginIniFileW::TSectionData::iterator languageIt = filters.find( L"filter" + filterCountStr + "language");
313 CPluginIniFileW::TSectionData::iterator languageTitleIt = filters. find(L"filter" + filterCountStr + "languageTitle");
314 CPluginIniFileW::TSectionData::iterator dltIt = filters.find(L"fil ter" + filterCountStr + "refreshin");
315
316 if (bContinue = (filterIt != filters.end() && versionIt != filters .end()))
317 {
318 m_filterUrlList[filterIt->second] = _wtoi(versionIt->second);
319 }
320
321 if (filterIt != filters.end() && fileNameIt != filters.end())
322 {
323 m_filterFileNameList[filterIt->second] = fileNameIt->second;
324 }
325
326 if (filterIt != filters.end() && languageIt != filters.end())
327 {
328 m_filterLanguagesList[filterIt->second] = languageIt->second;
329 }
330
331 if (filterIt != filters.end() && languageIt != filters.end() && languageTitleIt != filters.end())
332 {
333 m_filterLanguageTitleList[languageIt->second] = languageTitleIt- >second;
334 }
335
336 if (filterIt != filters.end() && dltIt != filters.end())
337 {
338 m_filterDownloadTimesList[filterIt->second] = (time_t)_wtoi(dltI t->second.GetString());
339 }
340
341 } while (bContinue);
342 }
343 s_criticalSectionFilters.Unlock();
344
345 #endif // SUPPORT_FILTER
346 } 295 }
347 else 296 else
348 { 297 {
349 DEBUG_SETTINGS("Settings:Invalid checksum - Deleting file") 298 DEBUG_SETTINGS("Settings:Invalid checksum - Deleting file")
350 299
351 Clear(); 300 Clear();
352 301
353 DEBUG_ERROR_LOG(m_settingsFile->GetLastError(), PLUGIN_ERROR_SETTINGS, PLUGIN_ERROR_SETTINGS_FILE_READ_CHECKSUM, "Settings::Read - Checksum") 302 DEBUG_ERROR_LOG(m_settingsFile->GetLastError(), PLUGIN_ERROR_SETTINGS, PLUGIN_ERROR_SETTINGS_FILE_READ_CHECKSUM, "Settings::Read - Checksum")
354 isRead = false; 303 isRead = false;
355 m_isDirty = true; 304 m_isDirty = true;
356 } 305 }
357 } 306 }
358 else if (m_settingsFile->GetLastError() == ERROR_FILE_NOT_FOUND) 307 else if (m_settingsFile->GetLastError() == ERROR_FILE_NOT_FOUND)
359 { 308 {
360 DEBUG_ERROR_LOG(m_settingsFile->GetLastError(), PLUGIN_ERROR_SETTINGS, P LUGIN_ERROR_SETTINGS_FILE_READ, "Settings::Read") 309 DEBUG_ERROR_LOG(m_settingsFile->GetLastError(), PLUGIN_ERROR_SETTINGS, P LUGIN_ERROR_SETTINGS_FILE_READ, "Settings::Read")
361 m_isDirty = true; 310 m_isDirty = true;
362 } 311 }
363 else 312 else
364 { 313 {
(...skipping 20 matching lines...) Expand all
385 { 334 {
386 // Default settings 335 // Default settings
387 s_criticalSectionLocal.Lock(); 336 s_criticalSectionLocal.Lock();
388 { 337 {
389 m_properties.clear(); 338 m_properties.clear();
390 339
391 m_properties[SETTING_PLUGIN_VERSION] = IEPLUGIN_VERSION; 340 m_properties[SETTING_PLUGIN_VERSION] = IEPLUGIN_VERSION;
392 m_properties[SETTING_LANGUAGE] = "en"; 341 m_properties[SETTING_LANGUAGE] = "en";
393 } 342 }
394 s_criticalSectionLocal.Unlock(); 343 s_criticalSectionLocal.Unlock();
395
396 // Default filters
397 #ifdef SUPPORT_FILTER
398
399 s_criticalSectionFilters.Lock();
400 {
401 m_filterUrlList.clear();
402 }
403 s_criticalSectionFilters.Unlock();
404
405 #endif // SUPPORT_FILTER
406 } 344 }
407 345
408 bool CPluginSettings::MakeRequestForUpdate() 346 bool CPluginSettings::MakeRequestForUpdate()
Felix Dahlke 2013/04/03 05:35:27 Shouldn't this call UpdateSubscription()?
409 { 347 {
410 time_t updateTime = this->GetValue(SETTING_LAST_UPDATE_TIME); 348 time_t updateTime = this->GetValue(SETTING_LAST_UPDATE_TIME);
411 349
412 if (time(NULL) <= updateTime) 350 if (time(NULL) <= updateTime)
413 return false; 351 return false;
414 352
415 CPluginHttpRequest httpRequest(PLUGIN_UPDATE_URL); 353 CPluginHttpRequest httpRequest(PLUGIN_UPDATE_URL);
416 354
417 CPluginSystem* system = CPluginSystem::GetInstance(); 355 CPluginSystem* system = CPluginSystem::GetInstance();
418 356
(...skipping 25 matching lines...) Expand all
444 it = settingsData.find("pluginupdatev"); 382 it = settingsData.find("pluginupdatev");
445 if (it != settingsData.end()) 383 if (it != settingsData.end())
446 { 384 {
447 CString ver(it->second); 385 CString ver(it->second);
448 SetString(SETTING_PLUGIN_UPDATE_VERSION, ver); 386 SetString(SETTING_PLUGIN_UPDATE_VERSION, ver);
449 m_isDirty = true; 387 m_isDirty = true;
450 DEBUG_SETTINGS("Settings::Configuration plugin update version:" + it->seco nd); 388 DEBUG_SETTINGS("Settings::Configuration plugin update version:" + it->seco nd);
451 } 389 }
452 } 390 }
453 391
454 return true;
455 }
456 bool CPluginSettings::CheckFilterAndDownload()
457 {
458 s_criticalSectionLocal.Lock();
459 TFilterUrlList currentFilterUrlList = this->GetFilterUrlList();
460 std::map<CString, CString> fileNamesList = this->GetFilterFileNamesList();
461
462 bool filterAvailable = false;
463 for (TFilterUrlList::iterator it = currentFilterUrlList.begin(); it != current FilterUrlList.end(); ++it)
464 {
465 CString downloadFilterName = it->first;
466
467 std::map<CString, CString>::const_iterator fni = fileNamesList.find(download FilterName);
468 CString filename = "";
469 if (fni != fileNamesList.end())
470 {
471 filename = fni->second;
472 }
473 else
474 {
475 filename = downloadFilterName.Trim().Right(downloadFilterName.GetLength() - downloadFilterName.ReverseFind('/') - 1).Trim();
476 }
477 int version = it->second;
478
479 DEBUG_GENERAL("*** before FilterShouldLoad: " + downloadFilterName);
480
481 if ((this->FilterShouldLoad(downloadFilterName)))
482 {
483 filterAvailable = true;
484 DEBUG_GENERAL("*** before FilterlistExpired: " + downloadFilterName);
485 if (this->FilterlistExpired(downloadFilterName))
486 {
487 DEBUG_GENERAL("*** before DownloadFilterFile: " + downloadFilterName);
488 // CPluginFilter::DownloadFilterFile(downloadFilterName, filename);
Felix Dahlke 2013/04/03 05:35:27 Might as well remove this line, likewise below.
489 this->SetFilterRefreshDate(downloadFilterName, time(NULL) + (5 * 24 * 60 * 60) * ((rand() % 100) / 100 * 0.4 + 0.8));
490 }
491 }
492 else
493 {
494 //Cleanup, since we don't need the filter definition
495 DeleteFile(CPluginSettings::GetDataPath(filename));
496 this->SetFilterRefreshDate(downloadFilterName, 0);
497 }
498 }
499
500 if (!filterAvailable)
501 {
502 //If no filter list found, default to "en"
503
504 this->SetString(SETTING_LANGUAGE, (BSTR)L"en");
505
506 CPluginDictionary* dict = CPluginDictionary::GetInstance();
507 dict->SetLanguage(L"en");
508
509 for (std::map<CString, CString>::iterator it = m_filterLanguagesList.begin() ; it != m_filterLanguagesList.end(); ++it)
510 {
511 if (it->second == L"en")
512 {
513 // CPluginFilter::DownloadFilterFile(it->first, m_filterFileNameList.find (it->first)->second);
514 this->SetFilterRefreshDate(it->first, time(NULL) + (5 * 24 * 60 * 60) * ((rand() % 100) / 100 * 0.4 + 0.8));
515 }
516 }
517 }
518
519 this->Write();
520
521 this->IncrementTabVersion(SETTING_TAB_FILTER_VERSION);
522
523 s_criticalSectionLocal.Unlock();
524 return true; 392 return true;
525 } 393 }
526 394
527 CString CPluginSettings::GetDataPathParent() 395 CString CPluginSettings::GetDataPathParent()
528 { 396 {
529 if (s_dataPathParent == NULL) 397 if (s_dataPathParent == NULL)
530 { 398 {
531 WCHAR* lpData = new WCHAR[MAX_PATH]; 399 WCHAR* lpData = new WCHAR[MAX_PATH];
532 400
533 OSVERSIONINFO osVersionInfo; 401 OSVERSIONINFO osVersionInfo;
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after
865 { 733 {
866 SetString(key, value ? "true":"false"); 734 SetString(key, value ? "true":"false");
867 } 735 }
868 736
869 737
870 bool CPluginSettings::IsPluginEnabled() const 738 bool CPluginSettings::IsPluginEnabled() const
871 { 739 {
872 return m_isPluginEnabledTab; 740 return m_isPluginEnabledTab;
873 } 741 }
874 742
875 743 static void SubsCallback(std::vector<AdblockPlus::SubscriptionPtr>& subscription s)
876 #ifdef SUPPORT_FILTER 744 {
877 745 CPluginSettings::GetInstance()->m_subscriptions = subscriptions;
878 void CPluginSettings::SetFilterUrlList(const TFilterUrlList& filters) 746 return;
879 {
880 DEBUG_SETTINGS(L"Settings::SetFilterUrlList")
881
882 s_criticalSectionFilters.Lock();
883 {
884 if (m_filterUrlList != filters)
885 {
886 m_filterUrlList = filters;
887 m_isDirty = true;
888 }
889 }
890 s_criticalSectionFilters.Unlock();
891 }
892
893 void CPluginSettings::SetFilterFileNamesList(const std::map<CString, CString>& f ilters)
894 {
895 DEBUG_SETTINGS(L"Settings::SetFilterUrlList")
896
897 s_criticalSectionFilters.Lock();
898 {
899 if (m_filterFileNameList != filters)
900 {
901 m_filterFileNameList = filters;
902 m_isDirty = true;
903 }
904 }
905 s_criticalSectionFilters.Unlock();
906 }
907
908 TFilterUrlList CPluginSettings::GetFilterUrlList() const
909 {
910 TFilterUrlList filterUrlList;
911
912 s_criticalSectionFilters.Lock();
913 {
914 filterUrlList = m_filterUrlList;
915 }
916 s_criticalSectionFilters.Unlock();
917
918 return filterUrlList;
919 }
920
921
922 std::map<CString, CString> CPluginSettings::GetFilterFileNamesList() const
923 {
924 std::map<CString, CString> filterFileNamesList;
925
926 s_criticalSectionFilters.Lock();
927 {
928 filterFileNamesList = m_filterFileNameList;
929 }
930 s_criticalSectionFilters.Unlock();
931
932 return filterFileNamesList;
933 } 747 }
934 748
935 749
936 std::map<CString, CString> CPluginSettings::GetFilterLanguageTitleList() const 750 std::map<CString, CString> CPluginSettings::GetFilterLanguageTitleList() const
937 { 751 {
938 std::map<CString, CString> filterList; 752 std::map<CString, CString> filterList;
939 753 for (int i = 0; i < m_subscriptions.size(); i ++)
940 s_criticalSectionFilters.Lock(); 754 {
941 { 755 AdblockPlus::SubscriptionPtr it = m_subscriptions[i];
942 filterList = m_filterLanguageTitleList; 756 std::string title = "";
943 } 757 std::string url = "";
944 s_criticalSectionFilters.Unlock(); 758
945 759 //TODO: Property for language name?
760 title = it.get()->GetProperty("title", title);
761 url = it.get()->GetProperty("url", url);
762
763 filterList.insert(std::make_pair(CString(CA2T(url.c_str(), CP_UTF8)), CStrin g(CA2T(title.c_str(), CP_UTF8))));
764 }
946 return filterList; 765 return filterList;
947 } 766 }
948 767
949
950 bool CPluginSettings::FilterlistExpired(CString filterlist) const
951 {
952 std::map<CString, time_t>::const_iterator it = m_filterDownloadTimesList.find( filterlist);
953 if (it == m_filterDownloadTimesList.end())
954 return false;
955 if (time(NULL) >= it->second)
956 return true;
957 return false;
958 }
959
960 bool CPluginSettings::FilterShouldLoad(CString filterlist) const
961 {
962 std::map<CString, CString>::const_iterator it = m_filterLanguagesList.find(fil terlist);
963 if (it == m_filterLanguagesList.end())
964 return false;
965 CPluginSettings* pluginSettings = CPluginSettings::GetInstance();
966 if (it->second == pluginSettings->GetString(SETTING_LANGUAGE))
967 return true;
968 return false;
969 }
970
971
972 bool CPluginSettings::SetFilterRefreshDate(CString filterlist, time_t refreshtim e)
973 {
974 m_filterDownloadTimesList[filterlist] = refreshtime;
975 m_isDirty = true;
976 return true;
977 }
978 void CPluginSettings::AddFilterUrl(const CString& url, int version)
979 {
980 s_criticalSectionFilters.Lock();
981 {
982 TFilterUrlList::iterator it = m_filterUrlList.find(url);
983 if (it == m_filterUrlList.end() || it->second != version)
984 {
985 m_filterUrlList[url] = version;
986 m_isDirty = true;
987 }
988 }
989 s_criticalSectionFilters.Unlock();
990 }
991
992 void CPluginSettings::AddFilterFileName(const CString& url, const CString& fileN ame)
993 {
994 s_criticalSectionFilters.Lock();
995 {
996 std::map<CString, CString>::iterator it = m_filterFileNameList.find(url);
997 if (it == m_filterFileNameList.end() || it->second != fileName)
998 {
999 m_filterFileNameList[url] = fileName;
1000 m_isDirty = true;
1001 }
1002 }
1003 s_criticalSectionFilters.Unlock();
1004 }
1005 #endif // SUPPORT_FILTER
1006 768
1007 bool CPluginSettings::Write(bool isDebug) 769 bool CPluginSettings::Write(bool isDebug)
1008 { 770 {
1009 bool isWritten = true; 771 bool isWritten = true;
1010 772
1011 if (!m_isDirty) 773 if (!m_isDirty)
1012 { 774 {
1013 return isWritten; 775 return isWritten;
1014 } 776 }
1015 777
(...skipping 13 matching lines...) Expand all
1029 s_criticalSectionLocal.Lock(); 791 s_criticalSectionLocal.Lock();
1030 { 792 {
1031 for (TProperties::iterator it = m_properties.begin(); it != m_properties.e nd(); ++it) 793 for (TProperties::iterator it = m_properties.begin(); it != m_properties.e nd(); ++it)
1032 { 794 {
1033 settings[it->first] = it->second; 795 settings[it->first] = it->second;
1034 } 796 }
1035 } 797 }
1036 s_criticalSectionLocal.Unlock(); 798 s_criticalSectionLocal.Unlock();
1037 799
1038 m_settingsFile->UpdateSection("Settings", settings); 800 m_settingsFile->UpdateSection("Settings", settings);
1039
1040 // Filter URL's
1041 #ifdef SUPPORT_FILTER
1042
1043 int filterCount = 0;
1044 CPluginIniFileW::TSectionData filters;
1045
1046 s_criticalSectionFilters.Lock();
1047 {
1048 for (TFilterUrlList::iterator it = m_filterUrlList.begin(); it != m_filter UrlList.end(); ++it)
1049 {
1050 CString filterCountStr;
1051 filterCountStr.Format(L"%d", ++filterCount);
1052
1053 CString filterVersion;
1054 filterVersion.Format(L"%d", it->second);
1055
1056 filters[L"filter" + filterCountStr] = it->first;
1057 filters[L"filter" + filterCountStr + L"v"] = filterVersion;
1058 if (m_filterFileNameList.size() > 0)
1059 {
1060 std::map<CString, CString>::iterator fni = m_filterFileNameList.find(i t->first);
1061 if (fni != m_filterFileNameList.end())
1062 {
1063 CString fileName = fni->second;
1064 filters[L"filter" + filterCountStr + "fileName"] = fileName;
1065 }
1066 }
1067 if (m_filterLanguagesList.size() > 0)
1068 {
1069 std::map<CString, CString>::iterator fli = m_filterLanguagesList.find( it->first);
1070 if (fli != m_filterLanguagesList.end())
1071 {
1072 CString language = fli->second;
1073 filters[L"filter" + filterCountStr + "language"] = language;
1074
1075 if (m_filterLanguageTitleList.size() > 0)
1076 {
1077 std::map<CString, CString>::iterator fli = m_filterLanguageTitleLi st.find(language);
1078 if (fli != m_filterLanguageTitleList.end())
1079 {
1080 CString language = fli->second;
1081 filters[L"filter" + filterCountStr + "languageTitle"] = language ;
1082 }
1083 }
1084
1085 }
1086 }
1087 if (m_filterDownloadTimesList.size() > 0)
1088 {
1089 std::map<CString, time_t>::iterator fdti = m_filterDownloadTimesList.f ind(it->first);
1090 if (fdti != m_filterDownloadTimesList.end())
1091 {
1092 CString timeString;
1093 timeString.Format(L"%d", (int)fdti->second);
1094 filters[L"filter" + filterCountStr + "refreshin"] = timeString;
1095 }
1096 }
1097
1098 }
1099 }
1100 s_criticalSectionFilters.Unlock();
1101
1102 m_settingsFile->UpdateSection("Filters", filters);
1103
1104 #endif // SUPPORT_FILTER
1105 801
1106 // Write file 802 // Write file
1107 isWritten = m_settingsFile->Write(); 803 isWritten = m_settingsFile->Write();
1108 if (!isWritten) 804 if (!isWritten)
1109 { 805 {
1110 DEBUG_ERROR_LOG(m_settingsFile->GetLastError(), PLUGIN_ERROR_SETTINGS, PLU GIN_ERROR_SETTINGS_FILE_WRITE, "Settings::Write") 806 DEBUG_ERROR_LOG(m_settingsFile->GetLastError(), PLUGIN_ERROR_SETTINGS, PLU GIN_ERROR_SETTINGS_FILE_WRITE, "Settings::Write")
1111 } 807 }
1112 808
1113 m_isDirty = false; 809 m_isDirty = false;
1114 810
1115 IncrementTabVersion(SETTING_TAB_SETTINGS_VERSION); 811 IncrementTabVersion(SETTING_TAB_SETTINGS_VERSION);
1116 } 812 }
1117 else 813 else
1118 { 814 {
1119 isWritten = false; 815 isWritten = false;
1120 } 816 }
1121 817
1122 return isWritten; 818 return isWritten;
1123 } 819 }
1124
1125 #ifdef SUPPORT_WHITELIST
1126
1127 void CPluginSettings::AddDomainToHistory(const CString& domain)
1128 {
1129 if (!CPluginClient::IsValidDomain(domain))
1130 {
1131 return;
1132 }
1133
1134 // Delete domain
1135 s_criticalSectionDomainHistory.Lock();
1136 {
1137 for (TDomainHistory::iterator it = m_domainHistory.begin(); it != m_domainHi story.end(); ++it)
1138 {
1139 if (it->first == domain)
1140 {
1141 m_domainHistory.erase(it);
1142 break;
1143 }
1144 }
1145
1146 // Get whitelist reason
1147 int reason = 0;
1148
1149 s_criticalSectionLocal.Lock();
1150 {
1151 TDomainList::iterator it = m_whitelist.find(domain);
1152 if (it != m_whitelist.end())
1153 {
1154 reason = it->second;
1155 }
1156 else
1157 {
1158 reason = 3;
1159 }
1160 }
1161 s_criticalSectionLocal.Unlock();
1162
1163 // Delete domain, if history is too long
1164 if (m_domainHistory.size() >= DOMAIN_HISTORY_MAX_COUNT)
1165 {
1166 m_domainHistory.erase(m_domainHistory.begin());
1167 }
1168
1169 m_domainHistory.push_back(std::make_pair(domain, reason));
1170 }
1171 s_criticalSectionDomainHistory.Unlock();
1172 }
1173
1174
1175 TDomainHistory CPluginSettings::GetDomainHistory() const
1176 {
1177 TDomainHistory domainHistory;
1178
1179 s_criticalSectionDomainHistory.Lock();
1180 {
1181 domainHistory = m_domainHistory;
1182 }
1183 s_criticalSectionDomainHistory.Unlock();
1184
1185 return domainHistory;
1186 }
1187
1188 #endif // SUPPORT_WHITELIST
1189 820
1190 821
1191 bool CPluginSettings::IsPluginUpdateAvailable() const 822 bool CPluginSettings::IsPluginUpdateAvailable() const
1192 { 823 {
1193 bool isAvailable = Has(SETTING_PLUGIN_UPDATE_VERSION); 824 bool isAvailable = Has(SETTING_PLUGIN_UPDATE_VERSION);
1194 if (isAvailable) 825 if (isAvailable)
1195 { 826 {
1196 CString newVersion = GetString(SETTING_PLUGIN_UPDATE_VERSION); 827 CString newVersion = GetString(SETTING_PLUGIN_UPDATE_VERSION);
1197 CString curVersion = IEPLUGIN_VERSION; 828 CString curVersion = IEPLUGIN_VERSION;
1198 829
(...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after
1867 // ============================================================================ 1498 // ============================================================================
1868 // Whitelist settings 1499 // Whitelist settings
1869 // ============================================================================ 1500 // ============================================================================
1870 1501
1871 #ifdef SUPPORT_WHITELIST 1502 #ifdef SUPPORT_WHITELIST
1872 1503
1873 void CPluginSettings::ClearWhitelist() 1504 void CPluginSettings::ClearWhitelist()
1874 { 1505 {
1875 s_criticalSectionLocal.Lock(); 1506 s_criticalSectionLocal.Lock();
1876 { 1507 {
1877 m_whitelist.clear(); 1508 m_whitelistedDomains.clear();
1878 m_whitelistToGo.clear();
1879 } 1509 }
1880 s_criticalSectionLocal.Unlock(); 1510 s_criticalSectionLocal.Unlock();
1881 } 1511 }
1882 1512
1883 1513
1884 bool CPluginSettings::ReadWhitelist(bool isDebug) 1514 bool CPluginSettings::ReadWhitelist(bool isDebug)
1885 { 1515 {
1886 bool isRead = true; 1516 bool isRead = true;
1887 1517
1888 DEBUG_SETTINGS("SettingsWhitelist::Read") 1518 DEBUG_SETTINGS("SettingsWhitelist::Read")
1889 1519
1890 if (isDebug) 1520 if (isDebug)
1891 { 1521 {
1892 DEBUG_GENERAL("*** Loading whitelist settings:" + m_settingsFileWhitelist- >GetFilePath()); 1522 DEBUG_GENERAL("*** Loading whitelist settings");
1893 } 1523 }
1894 1524
1895 CPluginSettingsWhitelistLock lock; 1525 CPluginSettingsWhitelistLock lock;
1896 if (lock.IsLocked()) 1526 if (lock.IsLocked())
1897 { 1527 {
1898 isRead = m_settingsFileWhitelist->Read(); 1528 ClearWhitelist();
1899 if (isRead) 1529
1900 { 1530 s_criticalSectionLocal.Lock();
1901 if (m_settingsFileWhitelist->IsValidChecksum()) 1531 std::vector<AdblockPlus::FilterPtr> filters = CPluginClient::GetInstance() ->GetFilterEngine()->GetListedFilters();
1532 for (int i = 0; i < filters.size(); i ++)
1533 {
1534 if (filters[i]->GetProperty("type", AdblockPlus::Filter::Type::TYPE_INVA LID) == AdblockPlus::Filter::Type::TYPE_EXCEPTION)
1902 { 1535 {
1903 ClearWhitelist(); 1536 std::string text = filters[i]->GetProperty("text", "");
1904 1537 //@@||example.com^$document
1905 s_criticalSectionLocal.Lock(); 1538 size_t endPos = text.rfind("^$document");
1539 if (endPos != std::string::npos)
1906 { 1540 {
1907 // Unpack white list 1541 size_t startPos = text.find("@@||") + 4;
1908 CPluginIniFileW::TSectionData whitelist = m_settingsFileWhitelist->G etSectionData("Whitelist"); 1542 if (startPos != std::string::npos)
1909 int domainCount = 0;
1910 bool bContinue = true;
1911
1912 do
1913 { 1543 {
1914 CString domainCountStr; 1544 m_whitelistedDomains.push_back(text.substr(startPos, endPos - star tPos));
1915 domainCountStr.Format(L"%d", ++domainCount); 1545 }
1916
1917 CPluginIniFileW::TSectionData::iterator domainIt = whitelist.find( L"domain" + domainCountStr);
1918 CPluginIniFileW::TSectionData::iterator reasonIt = whitelist.find( L"domain" + domainCountStr + L"r");
1919
1920 if (bContinue = (domainIt != whitelist.end() && reasonIt != whitel ist.end()))
1921 {
1922 m_whitelist[domainIt->second] = _wtoi(reasonIt->second);
1923 }
1924
1925 } while (bContinue);
1926
1927 // Unpack white list
1928 whitelist = m_settingsFileWhitelist->GetSectionData("Whitelist togo" );
1929 domainCount = 0;
1930 bContinue = true;
1931
1932 do
1933 {
1934 CString domainCountStr;
1935 domainCountStr.Format(L"%d", ++domainCount);
1936
1937 CPluginIniFileW::TSectionData::iterator domainIt = whitelist.find( L"domain" + domainCountStr);
1938 CPluginIniFileW::TSectionData::iterator reasonIt = whitelist.find( L"domain" + domainCountStr + L"r");
1939
1940 if (bContinue = (domainIt != whitelist.end() && reasonIt != whitel ist.end()))
1941 {
1942 m_whitelistToGo[domainIt->second] = _wtoi(reasonIt->second);
1943 }
1944
1945 } while (bContinue);
1946 } 1546 }
1947 s_criticalSectionLocal.Unlock();
1948 } 1547 }
1949 else 1548 }
1950 { 1549 s_criticalSectionLocal.Unlock();
1951 DEBUG_SETTINGS("SettingsWhitelist:Invalid checksum - Deleting file")
1952
1953 DEBUG_ERROR_LOG(m_settingsFileWhitelist->GetLastError(), PLUGIN_ERRO R_SETTINGS_WHITELIST, PLUGIN_ERROR_SETTINGS_FILE_READ_CHECKSUM, "SettingsWhiteli st::Read - Checksum")
1954 isRead = false;
1955 m_isDirtyWhitelist = true;
1956 }
1957 }
1958 else if (m_settingsFileWhitelist->GetLastError() == ERROR_FILE_NOT_FOUND)
1959 {
1960 m_isDirtyWhitelist = true;
1961 }
1962 else
1963 {
1964 DEBUG_ERROR_LOG(m_settingsFileWhitelist->GetLastError(), PLUGIN_ERROR_SE TTINGS_WHITELIST, PLUGIN_ERROR_SETTINGS_FILE_READ, "SettingsWhitelist::Read")
1965 }
1966 } 1550 }
1967 else 1551 else
1968 { 1552 {
1969 isRead = false; 1553 isRead = false;
1970 } 1554 }
1971 1555
1972 // Write file in case it is dirty
1973 WriteWhitelist(isDebug);
1974
1975 return isRead; 1556 return isRead;
1976 } 1557 }
1977 1558
1978 1559
1979 bool CPluginSettings::WriteWhitelist(bool isDebug) 1560 void CPluginSettings::AddWhiteListedDomain(const CString& domain)
1980 { 1561 {
1981 bool isWritten = true; 1562 DEBUG_SETTINGS("SettingsWhitelist::AddWhiteListedDomain domain:" + domain)
1982 1563
1983 if (!m_isDirtyWhitelist) 1564 bool isNewVersion = false;
1984 { 1565 bool isForcingUpdateOnStart = false;
1985 return isWritten;
1986 }
1987
1988 if (isDebug)
1989 {
1990 DEBUG_GENERAL("*** Writing changed whitelist settings")
1991 }
1992 1566
1993 CPluginSettingsWhitelistLock lock; 1567 CPluginSettingsWhitelistLock lock;
1994 if (lock.IsLocked()) 1568 if (lock.IsLocked())
1995 { 1569 {
1996 m_settingsFileWhitelist->Clear(); 1570 ReadWhitelist(false);
1997 1571
1572 std::string newDomain = CW2A(domain, CP_UTF8);
1573
1574 //Domain already present?
1575 if (std::find(m_whitelistedDomains.begin(), m_whitelistedDomains.end(), newD omain) != m_whitelistedDomains.end())
1576 {
1577 return;
1578 }
1998 s_criticalSectionLocal.Lock(); 1579 s_criticalSectionLocal.Lock();
1999 { 1580 {
2000 // White list 1581 AdblockPlus::FilterPtr whitelistFilter = CPluginClient::GetInstance()->Get FilterEngine()->GetFilter(std::string("@@||").append(CW2A(domain)).append("^$doc ument"));
2001 int whitelistCount = 0; 1582 whitelistFilter->AddToList();
2002 CPluginIniFileW::TSectionData whitelist;
2003
2004 for (TDomainList::iterator it = m_whitelist.begin(); it != m_whitelist.end (); ++it)
2005 {
2006 CString whitelistCountStr;
2007 whitelistCountStr.Format(L"%d", ++whitelistCount);
2008
2009 CString reason;
2010 reason.Format(L"%d", it->second);
2011
2012 whitelist[L"domain" + whitelistCountStr] = it->first;
2013 whitelist[L"domain" + whitelistCountStr + L"r"] = reason;
2014 }
2015
2016 m_settingsFileWhitelist->UpdateSection("Whitelist", whitelist);
2017
2018 // White list (not yet committed)
2019 whitelistCount = 0;
2020 whitelist.clear();
2021
2022 for (TDomainList::iterator it = m_whitelistToGo.begin(); it != m_whitelist ToGo.end(); ++it)
2023 {
2024 CString whitelistCountStr;
2025 whitelistCountStr.Format(L"%d", ++whitelistCount);
2026
2027 CString reason;
2028 reason.Format(L"%d", it->second);
2029
2030 whitelist[L"domain" + whitelistCountStr] = it->first;
2031 whitelist[L"domain" + whitelistCountStr + L"r"] = reason;
2032 }
2033
2034 m_settingsFileWhitelist->UpdateSection("Whitelist togo", whitelist);
2035 } 1583 }
2036 s_criticalSectionLocal.Unlock(); 1584 s_criticalSectionLocal.Unlock();
2037 1585
2038 // Write file
2039 isWritten = m_settingsFileWhitelist->Write();
2040 if (!isWritten)
2041 {
2042 DEBUG_ERROR_LOG(m_settingsFileWhitelist->GetLastError(), PLUGIN_ERROR_SETT INGS_WHITELIST, PLUGIN_ERROR_SETTINGS_FILE_WRITE, "SettingsWhitelist::Write")
2043 }
2044
2045 m_isDirty = false;
2046 }
2047 else
2048 {
2049 isWritten = false;
2050 }
2051
2052 if (isWritten)
2053 {
2054 DEBUG_WHITELIST("Whitelist::Icrement version")
2055
2056 IncrementTabVersion(SETTING_TAB_WHITELIST_VERSION);
2057 }
2058
2059 return isWritten;
2060 }
2061
2062
2063 void CPluginSettings::AddWhiteListedDomain(const CString& domain, int reason, bo ol isToGo)
2064 {
2065 DEBUG_SETTINGS("SettingsWhitelist::AddWhiteListedDomain domain:" + domain)
2066
2067 bool isNewVersion = false;
2068 bool isForcingUpdateOnStart = false;
2069
2070 CPluginSettingsWhitelistLock lock;
2071 if (lock.IsLocked())
2072 {
2073 ReadWhitelist(false);
2074
2075 s_criticalSectionLocal.Lock();
2076 {
2077 bool isToGoMatcingReason = false;
2078 bool isToGoMatcingDomain = false;
2079
2080 TDomainList::iterator itToGo = m_whitelistToGo.find(domain);
2081 TDomainList::iterator it = m_whitelist.find(domain);
2082 if (isToGo)
2083 {
2084 if (itToGo != m_whitelistToGo.end())
2085 {
2086 isToGoMatcingDomain = true;
2087 isToGoMatcingReason = itToGo->second == reason;
2088
2089 if (reason == 3)
2090 {
2091 m_whitelistToGo.erase(itToGo);
2092 m_isDirtyWhitelist = true;
2093 }
2094 else if (!isToGoMatcingReason)
2095 {
2096 itToGo->second = reason;
2097 m_isDirtyWhitelist = true;
2098 }
2099 }
2100 else
2101 {
2102 m_whitelistToGo[domain] = reason;
2103 m_isDirtyWhitelist = true;
2104
2105 // Delete new togo item from saved white list
2106 if (it != m_whitelist.end())
2107 {
2108 m_whitelist.erase(it);
2109 }
2110 }
2111 }
2112 else
2113 {
2114 if (isToGoMatcingDomain)
2115 {
2116 m_whitelistToGo.erase(itToGo);
2117 m_isDirtyWhitelist = true;
2118 }
2119
2120 if (it != m_whitelist.end())
2121 {
2122 if (it->second != reason)
2123 {
2124 it->second = reason;
2125 m_isDirtyWhitelist = true;
2126 }
2127 }
2128 else
2129 {
2130 m_whitelist[domain] = reason;
2131 m_isDirtyWhitelist = true;
2132 }
2133 }
2134
2135 isForcingUpdateOnStart = m_whitelistToGo.size() > 0;
2136 }
2137 s_criticalSectionLocal.Unlock();
2138
2139 WriteWhitelist(false);
2140 } 1586 }
2141 1587
2142 if (isForcingUpdateOnStart) 1588 if (isForcingUpdateOnStart)
2143 { 1589 {
2144 ForceConfigurationUpdateOnStart(); 1590 ForceConfigurationUpdateOnStart();
2145 } 1591 }
2146 } 1592 }
2147 1593
2148 1594
2149 bool CPluginSettings::IsWhiteListedDomain(const CString& domain) const 1595 bool CPluginSettings::IsWhiteListedDomain(const CString& domain) const
2150 { 1596 {
2151 bool bIsWhiteListed; 1597 bool bIsWhiteListed;
2152 1598
2153 s_criticalSectionLocal.Lock(); 1599 s_criticalSectionLocal.Lock();
2154 { 1600 {
2155 bIsWhiteListed = m_whitelist.find(domain) != m_whitelist.end(); 1601 bIsWhiteListed = std::find(m_whitelistedDomains.begin(), m_whitelistedDomain s.end(), std::string(CW2A(domain, CP_UTF8))) != m_whitelistedDomains.end();
2156 if (!bIsWhiteListed)
2157 {
2158 TDomainList::const_iterator it = m_whitelistToGo.find(domain);
2159 bIsWhiteListed = it != m_whitelistToGo.end() && it->second != 3;
2160 }
2161 } 1602 }
2162 s_criticalSectionLocal.Unlock(); 1603 s_criticalSectionLocal.Unlock();
2163 1604
2164 return bIsWhiteListed; 1605 return bIsWhiteListed;
2165 } 1606 }
2166 1607
2167 int CPluginSettings::GetWhiteListedDomainCount() const 1608 int CPluginSettings::GetWhiteListedDomainCount() const
2168 { 1609 {
2169 int count = 0; 1610 int count = 0;
2170 1611
2171 s_criticalSectionLocal.Lock(); 1612 s_criticalSectionLocal.Lock();
2172 { 1613 {
2173 count = (int)m_whitelist.size(); 1614 count = (int)m_whitelistedDomains.size();
2174 } 1615 }
2175 s_criticalSectionLocal.Unlock(); 1616 s_criticalSectionLocal.Unlock();
2176 1617
2177 return count; 1618 return count;
2178 } 1619 }
2179 1620
2180 1621
2181 TDomainList CPluginSettings::GetWhiteListedDomainList(bool isToGo) const 1622 std::vector<std::string> CPluginSettings::GetWhiteListedDomainList(bool isToGo)
2182 { 1623 {
2183 TDomainList domainList; 1624 bool r = ReadWhitelist(false);
2184 1625 return m_whitelistedDomains;
2185 s_criticalSectionLocal.Lock();
2186 {
2187 if (isToGo)
2188 {
2189 domainList = m_whitelistToGo;
2190 }
2191 else
2192 {
2193 domainList = m_whitelist;
2194 }
2195 }
2196 s_criticalSectionLocal.Unlock();
2197
2198 return domainList;
2199 }
2200
2201
2202 void CPluginSettings::ReplaceWhiteListedDomains(const TDomainList& domains)
2203 {
2204 CPluginSettingsWhitelistLock lock;
2205 if (lock.IsLocked())
2206 {
2207 ReadWhitelist(false);
2208
2209 s_criticalSectionLocal.Lock();
2210 {
2211 if (m_whitelist != domains)
2212 {
2213 m_whitelist = domains;
2214 m_isDirtyWhitelist = true;
2215 }
2216
2217 // Delete entries in togo list
2218 bool isDeleted = true;
2219
2220 while (isDeleted)
2221 {
2222 isDeleted = false;
2223
2224 for (TDomainList::iterator it = m_whitelistToGo.begin(); it != m_whiteli stToGo.end(); ++it)
2225 {
2226 if (m_whitelist.find(it->first) != m_whitelist.end() || it->second == 3)
2227 {
2228 m_whitelistToGo.erase(it);
2229
2230 // Force another round...
2231 isDeleted = true;
2232 break;
2233 }
2234 }
2235 }
2236 }
2237 s_criticalSectionLocal.Unlock();
2238
2239 WriteWhitelist(false);
2240 }
2241 }
2242
2243
2244 void CPluginSettings::RemoveWhiteListedDomainsToGo(const TDomainList& domains)
2245 {
2246 CPluginSettingsWhitelistLock lock;
2247 if (lock.IsLocked())
2248 {
2249 ReadWhitelist(false);
2250
2251 s_criticalSectionLocal.Lock();
2252 {
2253 for (TDomainList::const_iterator it = domains.begin(); it != domains.end() ; ++it)
2254 {
2255 for (TDomainList::iterator itToGo = m_whitelistToGo.begin(); itToGo != m _whitelistToGo.end(); ++ itToGo)
2256 {
2257 if (it->first == itToGo->first)
2258 {
2259 m_whitelistToGo.erase(itToGo);
2260 m_isDirtyWhitelist = true;
2261 break;
2262 }
2263 }
2264 }
2265 }
2266 s_criticalSectionLocal.Unlock();
2267
2268 WriteWhitelist(false);
2269 }
2270 } 1626 }
2271 1627
2272 1628
2273 bool CPluginSettings::RefreshWhitelist() 1629 bool CPluginSettings::RefreshWhitelist()
2274 { 1630 {
2275 CPluginSettingsWhitelistLock lock; 1631 CPluginSettingsWhitelistLock lock;
2276 if (lock.IsLocked()) 1632 if (lock.IsLocked())
2277 { 1633 {
2278 ReadWhitelist(true); 1634 ReadWhitelist(true);
2279 } 1635 }
(...skipping 14 matching lines...) Expand all
2294 1650
2295 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); 1651 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
2296 bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO*) &osvi); 1652 bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO*) &osvi);
2297 1653
2298 m_WindowsBuildNumber = osvi.dwBuildNumber; 1654 m_WindowsBuildNumber = osvi.dwBuildNumber;
2299 } 1655 }
2300 1656
2301 return m_WindowsBuildNumber; 1657 return m_WindowsBuildNumber;
2302 } 1658 }
2303 1659
1660 void CPluginSettings::SetSubscription(BSTR url)
1661 {
1662 std::string urlConverted = CT2A(url);
1663 SetSubscription(urlConverted);
1664 }
1665
1666 void CPluginSettings::SetSubscription(std::string url)
1667 {
1668 FilterEngine* filterEngine= CPluginClient::GetInstance()->GetFilterEngine();
1669 AdblockPlus::SubscriptionPtr subscription = filterEngine->GetSubscription(url) ;
1670 subscription->AddToList();
1671 }
1672
1673 CString CPluginSettings::GetSubscription()
1674 {
1675 FilterEngine* filterEngine= CPluginClient::GetInstance()->GetFilterEngine();
1676 std::vector<AdblockPlus::SubscriptionPtr> subscriptions = filterEngine->GetLis tedSubscriptions();
1677 for (int i = 0; i < subscriptions.size(); i ++)
1678 {
1679 if (subscriptions[i]->IsListed())
1680 {
1681 return CString(CA2T(subscriptions[i]->GetProperty("url", std::string()).c_ str()));
1682 }
1683 }
1684 return CString(L"");
1685 }
1686
1687
1688 void CPluginSettings::RefreshFilterlist()
1689 {
1690 FilterEngine* filterEngine= CPluginClient::GetInstance()->GetFilterEngine();
1691 std::vector<AdblockPlus::SubscriptionPtr> subscriptions = filterEngine->GetLis tedSubscriptions();
1692 for (int i = 0; i < subscriptions.size(); i ++)
1693 {
1694 if (subscriptions[i]->IsListed())
1695 {
1696 subscriptions[i]->UpdateFilters();
1697 }
1698 }
1699 }
1700
2304 #endif // SUPPORT_WHITELIST 1701 #endif // SUPPORT_WHITELIST
LEFTRIGHT

Powered by Google App Engine
This is Rietveld