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 |