| OLD | NEW |
| 1 #include "PluginStdAfx.h" | 1 #include "PluginStdAfx.h" |
| 2 | 2 |
| 3 #include "PluginSettings.h" | 3 #include "PluginSettings.h" |
| 4 #include "PluginSystem.h" | 4 #include "PluginSystem.h" |
| 5 #include "PluginFilter.h" | 5 #include "PluginFilter.h" |
| 6 #include "PluginClientFactory.h" | 6 #include "PluginClientFactory.h" |
| 7 #include "PluginDictionary.h" | 7 #include "PluginDictionary.h" |
| 8 #include "PluginHttpRequest.h" | 8 #include "PluginHttpRequest.h" |
| 9 #include "PluginMutex.h" | 9 #include "PluginMutex.h" |
| 10 #include "PluginClass.h" | 10 #include "PluginClass.h" |
| 11 #include "PluginUtil.h" | 11 #include "PluginUtil.h" |
| 12 | 12 |
| 13 #include "AdblockPlusClient.h" | 13 #include "AdblockPlusClient.h" |
| 14 | 14 |
| 15 #include "../shared/AutoHandle.h" |
| 16 #include "../shared/Communication.h" |
| 17 |
| 15 namespace | 18 namespace |
| 16 { | 19 { |
| 17 // TODO: GetUserName, pipeName, bufferSize, AutoHandle, ReadMessage, WriteMess
age, MarshalStrings and UnmarshalStrings are | |
| 18 // duplicated in AdblockPlusEngine. We should find a way to reuse them. | |
| 19 | |
| 20 std::wstring GetUserName() | |
| 21 { | |
| 22 const DWORD maxLength = UNLEN + 1; | |
| 23 std::auto_ptr<wchar_t> buffer(new wchar_t[maxLength]); | |
| 24 DWORD length = maxLength; | |
| 25 if (!::GetUserName(buffer.get(), &length)) | |
| 26 { | |
| 27 std::stringstream stream; | |
| 28 stream << "Failed to get the current user's name (Error code: " << GetLast
Error() << ")"; | |
| 29 throw std::runtime_error("Failed to get the current user's name"); | |
| 30 } | |
| 31 return std::wstring(buffer.get(), length); | |
| 32 } | |
| 33 | |
| 34 const std::wstring pipeName = L"\\\\.\\pipe\\adblockplusengine_" + GetUserName
(); | |
| 35 const int bufferSize = 1024; | |
| 36 | |
| 37 class AutoHandle | |
| 38 { | |
| 39 public: | |
| 40 AutoHandle() | |
| 41 { | |
| 42 } | |
| 43 | |
| 44 AutoHandle(HANDLE handle) : handle(handle) | |
| 45 { | |
| 46 } | |
| 47 | |
| 48 ~AutoHandle() | |
| 49 { | |
| 50 CloseHandle(handle); | |
| 51 } | |
| 52 | |
| 53 HANDLE get() | |
| 54 { | |
| 55 return handle; | |
| 56 } | |
| 57 | |
| 58 private: | |
| 59 HANDLE handle; | |
| 60 | |
| 61 AutoHandle(const AutoHandle& autoHandle); | |
| 62 AutoHandle& operator=(const AutoHandle& autoHandle); | |
| 63 }; | |
| 64 | |
| 65 std::string MarshalStrings(const std::vector<std::string>& strings) | |
| 66 { | |
| 67 // TODO: This is some pretty hacky marshalling, replace it with something mo
re robust | |
| 68 std::string marshalledStrings; | |
| 69 for (std::vector<std::string>::const_iterator it = strings.begin(); it != st
rings.end(); it++) | |
| 70 marshalledStrings += *it + ';'; | |
| 71 return marshalledStrings; | |
| 72 } | |
| 73 | |
| 74 std::vector<std::string> UnmarshalStrings(const std::string& message) | |
| 75 { | |
| 76 std::stringstream stream(message); | |
| 77 std::vector<std::string> strings; | |
| 78 std::string string; | |
| 79 while (std::getline(stream, string, ';')) | |
| 80 strings.push_back(string); | |
| 81 return strings; | |
| 82 } | |
| 83 | |
| 84 std::string ReadMessage(HANDLE pipe) | |
| 85 { | |
| 86 std::stringstream stream; | |
| 87 std::auto_ptr<char> buffer(new char[bufferSize]); | |
| 88 bool doneReading = false; | |
| 89 while (!doneReading) | |
| 90 { | |
| 91 DWORD bytesRead; | |
| 92 if (ReadFile(pipe, buffer.get(), bufferSize * sizeof(char), &bytesRead, 0)
) | |
| 93 doneReading = true; | |
| 94 else if (GetLastError() != ERROR_MORE_DATA) | |
| 95 { | |
| 96 std::stringstream stream; | |
| 97 stream << "Error reading from pipe: " << GetLastError(); | |
| 98 throw std::runtime_error(stream.str()); | |
| 99 } | |
| 100 stream << std::string(buffer.get(), bytesRead); | |
| 101 } | |
| 102 return stream.str(); | |
| 103 } | |
| 104 | |
| 105 void WriteMessage(HANDLE pipe, const std::string& message) | |
| 106 { | |
| 107 DWORD bytesWritten; | |
| 108 if (!WriteFile(pipe, message.c_str(), message.length(), &bytesWritten, 0)) | |
| 109 throw std::runtime_error("Failed to write to pipe"); | |
| 110 } | |
| 111 | |
| 112 HANDLE OpenPipe(const std::wstring& name) | 20 HANDLE OpenPipe(const std::wstring& name) |
| 113 { | 21 { |
| 114 if (WaitNamedPipe(name.c_str(), 5000)) | 22 if (WaitNamedPipe(name.c_str(), 5000)) |
| 115 return CreateFile(name.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_E
XISTING, 0, 0); | 23 return CreateFile(name.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_E
XISTING, 0, 0); |
| 116 return INVALID_HANDLE_VALUE; | 24 return INVALID_HANDLE_VALUE; |
| 117 } | 25 } |
| 118 | 26 |
| 119 void SpawnAdblockPlusEngine() | 27 void SpawnAdblockPlusEngine() |
| 120 { | 28 { |
| 121 std::wstring engineExecutablePath = DllDir() + L"AdblockPlusEngine.exe"; | 29 std::wstring engineExecutablePath = DllDir() + L"AdblockPlusEngine.exe"; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 135 } | 43 } |
| 136 | 44 |
| 137 CloseHandle(processInformation.hProcess); | 45 CloseHandle(processInformation.hProcess); |
| 138 CloseHandle(processInformation.hThread); | 46 CloseHandle(processInformation.hThread); |
| 139 } | 47 } |
| 140 | 48 |
| 141 HANDLE OpenAdblockPlusEnginePipe() | 49 HANDLE OpenAdblockPlusEnginePipe() |
| 142 { | 50 { |
| 143 try | 51 try |
| 144 { | 52 { |
| 145 HANDLE pipe = OpenPipe(pipeName); | 53 HANDLE pipe = OpenPipe(Communication::pipeName); |
| 146 if (pipe == INVALID_HANDLE_VALUE) | 54 if (pipe == INVALID_HANDLE_VALUE) |
| 147 { | 55 { |
| 148 SpawnAdblockPlusEngine(); | 56 SpawnAdblockPlusEngine(); |
| 149 | 57 |
| 150 int timeout = 10000; | 58 int timeout = 10000; |
| 151 while ((pipe = OpenPipe(pipeName)) == INVALID_HANDLE_VALUE) | 59 while ((pipe = OpenPipe(Communication::pipeName)) == INVALID_HANDLE_VALU
E) |
| 152 { | 60 { |
| 153 const int step = 10; | 61 const int step = 10; |
| 154 Sleep(step); | 62 Sleep(step); |
| 155 timeout -= step; | 63 timeout -= step; |
| 156 if (timeout <= 0) | 64 if (timeout <= 0) |
| 157 throw std::runtime_error("Unable to open Adblock Plus Engine pipe"); | 65 throw std::runtime_error("Unable to open Adblock Plus Engine pipe"); |
| 158 } | 66 } |
| 159 } | 67 } |
| 160 | 68 |
| 161 DWORD mode = PIPE_READMODE_MESSAGE; | 69 DWORD mode = PIPE_READMODE_MESSAGE; |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 298 { | 206 { |
| 299 return 0; | 207 return 0; |
| 300 } | 208 } |
| 301 RegCloseKey(hKey); | 209 RegCloseKey(hKey); |
| 302 return (int)(version[0] - 48); | 210 return (int)(version[0] - 48); |
| 303 } | 211 } |
| 304 | 212 |
| 305 std::string CallAdblockPlusEngineProcedure(const std::vector<std::string>& args) | 213 std::string CallAdblockPlusEngineProcedure(const std::vector<std::string>& args) |
| 306 { | 214 { |
| 307 AutoHandle pipe(OpenAdblockPlusEnginePipe()); | 215 AutoHandle pipe(OpenAdblockPlusEnginePipe()); |
| 308 WriteMessage(pipe.get(), MarshalStrings(args)); | 216 Communication::WriteMessage(pipe.get(), Communication::MarshalStrings(args)); |
| 309 return ReadMessage(pipe.get()); | 217 return Communication::ReadMessage(pipe.get()); |
| 310 } | 218 } |
| 311 | 219 |
| 312 bool CAdblockPlusClient::Matches(const std::string& url, const std::string& cont
entType, const std::string& domain) | 220 bool CAdblockPlusClient::Matches(const std::string& url, const std::string& cont
entType, const std::string& domain) |
| 313 { | 221 { |
| 314 std::vector<std::string> args; | 222 std::vector<std::string> args; |
| 315 args.push_back("Matches"); | 223 args.push_back("Matches"); |
| 316 args.push_back(url); | 224 args.push_back(url); |
| 317 args.push_back(contentType); | 225 args.push_back(contentType); |
| 318 args.push_back(domain); | 226 args.push_back(domain); |
| 319 | 227 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 331 | 239 |
| 332 std::vector<std::string> CAdblockPlusClient::GetElementHidingSelectors(std::stri
ng domain) | 240 std::vector<std::string> CAdblockPlusClient::GetElementHidingSelectors(std::stri
ng domain) |
| 333 { | 241 { |
| 334 std::vector<std::string> args; | 242 std::vector<std::string> args; |
| 335 args.push_back("GetElementHidingSelectors"); | 243 args.push_back("GetElementHidingSelectors"); |
| 336 args.push_back(domain); | 244 args.push_back(domain); |
| 337 | 245 |
| 338 try | 246 try |
| 339 { | 247 { |
| 340 std::string response = CallAdblockPlusEngineProcedure(args); | 248 std::string response = CallAdblockPlusEngineProcedure(args); |
| 341 return UnmarshalStrings(response); | 249 return Communication::UnmarshalStrings(response); |
| 342 } | 250 } |
| 343 catch (const std::exception& e) | 251 catch (const std::exception& e) |
| 344 { | 252 { |
| 345 DEBUG_GENERAL(e.what()); | 253 DEBUG_GENERAL(e.what()); |
| 346 return std::vector<std::string>(); | 254 return std::vector<std::string>(); |
| 347 } | 255 } |
| 348 } | 256 } |
| 349 | 257 |
| 350 std::vector<AdblockPlus::SubscriptionPtr> CAdblockPlusClient::FetchAvailableSubs
criptions() | 258 std::vector<AdblockPlus::SubscriptionPtr> CAdblockPlusClient::FetchAvailableSubs
criptions() |
| 351 { | 259 { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 369 { | 277 { |
| 370 //TODO: implement this | 278 //TODO: implement this |
| 371 return std::vector<AdblockPlus::SubscriptionPtr>(); | 279 return std::vector<AdblockPlus::SubscriptionPtr>(); |
| 372 } | 280 } |
| 373 | 281 |
| 374 AdblockPlus::SubscriptionPtr CAdblockPlusClient::GetSubscription(std::string url
) | 282 AdblockPlus::SubscriptionPtr CAdblockPlusClient::GetSubscription(std::string url
) |
| 375 { | 283 { |
| 376 //TODO: imlement this | 284 //TODO: imlement this |
| 377 return AdblockPlus::SubscriptionPtr(); | 285 return AdblockPlus::SubscriptionPtr(); |
| 378 } | 286 } |
| OLD | NEW |