Index: src/engine/main.cpp |
=================================================================== |
--- a/src/engine/main.cpp |
+++ b/src/engine/main.cpp |
@@ -35,41 +35,117 @@ namespace |
if (utf8StringLength == 0) |
throw std::runtime_error("Failed to determine the required buffer size"); |
std::string utf8String(utf8StringLength, '\0'); |
WideCharToMultiByte(CP_UTF8, 0, str.c_str(), length, &utf8String[0], utf8StringLength, 0, 0); |
return utf8String; |
} |
+ void WriteStrings(Communication::OutputBuffer& response, |
+ const std::vector<std::string> strings) |
Felix Dahlke
2013/06/04 11:53:17
Shouldn't the strings be passed by reference? This
|
+ { |
+ int32_t count = strings.size(); |
+ response << count; |
+ for (int32_t i = 0; i < count; i++) |
+ response << strings[i]; |
+ } |
+ |
+ void WriteSubscriptions(Communication::OutputBuffer& response, |
+ const std::vector<AdblockPlus::SubscriptionPtr> subscriptions) |
Felix Dahlke
2013/06/04 11:53:17
Same as above, probably better to pass by referenc
|
+ { |
+ int32_t count = subscriptions.size(); |
+ response << count; |
+ for (int32_t i = 0; i < count; i++) |
+ { |
+ AdblockPlus::SubscriptionPtr subscription = subscriptions[i]; |
+ response << subscription->GetProperty("url")->AsString() |
+ << subscription->GetProperty("title")->AsString() |
+ << subscription->GetProperty("specialization")->AsString() |
+ << subscription->IsListed(); |
+ } |
+ } |
+ |
Communication::OutputBuffer HandleRequest(Communication::InputBuffer& request) |
{ |
Communication::OutputBuffer response; |
std::string procedureName; |
request >> procedureName; |
if (procedureName == "Matches") |
{ |
std::string url; |
std::string type; |
std::string documentUrl; |
request >> url >> type >> documentUrl; |
response << filterEngine->Matches(url, type, documentUrl); |
} |
- if (procedureName == "GetElementHidingSelectors") |
+ else if (procedureName == "GetElementHidingSelectors") |
{ |
std::string domain; |
request >> domain; |
+ WriteStrings(response, filterEngine->GetElementHidingSelectors(domain)); |
+ } |
+ else if (procedureName == "FetchAvailableSubscriptions") |
+ { |
+ WriteSubscriptions(response, filterEngine->FetchAvailableSubscriptions()); |
+ } |
+ else if (procedureName == "GetListedSubscriptions") |
+ { |
+ WriteSubscriptions(response, filterEngine->GetListedSubscriptions()); |
+ } |
+ else if (procedureName == "SetSubscription") |
+ { |
+ std::string url; |
+ request >> url; |
- std::vector<std::string> selectors = filterEngine->GetElementHidingSelectors(domain); |
+ std::vector<AdblockPlus::SubscriptionPtr> subscriptions = filterEngine->GetListedSubscriptions(); |
+ for (size_t i = 0, count = subscriptions.size(); i < count; i++) |
+ subscriptions[i]->RemoveFromList(); |
- int32_t length = selectors.size(); |
- response << length; |
- for (int32_t i = 0; i < length; i++) |
- response << selectors[i]; |
+ filterEngine->GetSubscription(url)->AddToList(); |
+ } |
+ else if (procedureName == "UpdateAllSubscriptions") |
+ { |
+ std::vector<AdblockPlus::SubscriptionPtr> subscriptions = filterEngine->GetListedSubscriptions(); |
+ for (size_t i = 0, count = subscriptions.size(); i < count; i++) |
+ subscriptions[i]->UpdateFilters(); |
+ } |
+ else if (procedureName == "GetExceptionDomains") |
+ { |
+ std::vector<AdblockPlus::FilterPtr> filters = filterEngine->GetListedFilters(); |
+ std::vector<std::string> domains; |
+ for (size_t i = 0, count = filters.size(); i < count; i++) |
+ { |
+ AdblockPlus::FilterPtr filter = filters[i]; |
+ if (filter->GetType() == AdblockPlus::Filter::TYPE_EXCEPTION) |
+ { |
+ std::string text = filter->GetProperty("text")->AsString(); |
+ |
+ //@@||example.com^$document |
+ const char prefix[] = "@@||"; |
+ const char suffix[] = "^$document"; |
+ const int prefixLen = strlen(prefix); |
+ const int suffixLen = strlen(suffix); |
+ if (!text.compare(0, prefixLen, prefix) && |
+ !text.compare(text.size() - suffixLen, suffixLen, suffix)) |
+ { |
+ domains.push_back(text.substr(prefixLen, text.size() - prefixLen - suffixLen)); |
+ } |
+ } |
+ } |
+ |
+ WriteStrings(response, domains); |
+ } |
+ else if (procedureName == "AddFilter") |
+ { |
+ std::string text; |
+ request >> text; |
+ |
+ filterEngine->GetFilter(text)->AddToList(); |
} |
return response; |
} |
DWORD WINAPI ClientThread(LPVOID param) |
{ |
std::auto_ptr<Communication::Pipe> pipe(static_cast<Communication::Pipe*>(param)); |