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" | 15 #include "../shared/AutoHandle.h" |
16 #include "../shared/Communication.h" | 16 #include "../shared/Communication.h" |
17 | 17 |
18 namespace | 18 namespace |
19 { | 19 { |
20 HANDLE OpenPipe(const std::wstring& name) | |
21 { | |
22 if (WaitNamedPipe(name.c_str(), 5000)) | |
23 return CreateFile(name.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_E
XISTING, 0, 0); | |
24 return INVALID_HANDLE_VALUE; | |
25 } | |
26 | |
27 void SpawnAdblockPlusEngine() | 20 void SpawnAdblockPlusEngine() |
28 { | 21 { |
29 std::wstring engineExecutablePath = DllDir() + L"AdblockPlusEngine.exe"; | 22 std::wstring engineExecutablePath = DllDir() + L"AdblockPlusEngine.exe"; |
30 STARTUPINFO startupInfo = {}; | 23 STARTUPINFO startupInfo = {}; |
31 PROCESS_INFORMATION processInformation = {}; | 24 PROCESS_INFORMATION processInformation = {}; |
32 | 25 |
33 HANDLE token; | 26 HANDLE token; |
34 OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE | TOKEN_ADJUST_DEFAULT
| TOKEN_QUERY | TOKEN_ASSIGN_PRIMARY, &token); | 27 OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE | TOKEN_ADJUST_DEFAULT
| TOKEN_QUERY | TOKEN_ASSIGN_PRIMARY, &token); |
35 HANDLE newToken; | 28 HANDLE newToken; |
36 DuplicateTokenEx(token, 0, 0, SecurityImpersonation, TokenPrimary, &newToken
); | 29 DuplicateTokenEx(token, 0, 0, SecurityImpersonation, TokenPrimary, &newToken
); |
37 | 30 |
38 if (!CreateProcessAsUser(newToken, 0, const_cast<wchar_t*>(engineExecutableP
ath.c_str()), 0, 0, 0, 0, 0, 0, | 31 if (!CreateProcessAsUser(newToken, 0, const_cast<wchar_t*>(engineExecutableP
ath.c_str()), 0, 0, 0, 0, 0, 0, |
39 &startupInfo, &processInformation)) | 32 &startupInfo, &processInformation)) |
40 { | 33 { |
41 DWORD error = GetLastError(); | 34 DWORD error = GetLastError(); |
42 throw std::runtime_error("Failed to start Adblock Plus Engine"); | 35 throw std::runtime_error("Failed to start Adblock Plus Engine"); |
43 } | 36 } |
44 | 37 |
45 CloseHandle(processInformation.hProcess); | 38 CloseHandle(processInformation.hProcess); |
46 CloseHandle(processInformation.hThread); | 39 CloseHandle(processInformation.hThread); |
47 } | 40 } |
48 | 41 |
49 HANDLE OpenAdblockPlusEnginePipe() | 42 std::auto_ptr<Communication::Pipe> OpenAdblockPlusEnginePipe() |
50 { | 43 { |
| 44 std::auto_ptr<Communication::Pipe> result; |
51 try | 45 try |
52 { | 46 { |
53 HANDLE pipe = OpenPipe(Communication::pipeName); | 47 try |
54 if (pipe == INVALID_HANDLE_VALUE) | 48 { |
| 49 result.reset(new Communication::Pipe(Communication::pipeName, |
| 50 Communication::Pipe::MODE_CONNECT)); |
| 51 } |
| 52 catch (Communication::PipeConnectionError e) |
55 { | 53 { |
56 SpawnAdblockPlusEngine(); | 54 SpawnAdblockPlusEngine(); |
57 | 55 |
58 int timeout = 10000; | 56 int timeout = 10000; |
59 while ((pipe = OpenPipe(Communication::pipeName)) == INVALID_HANDLE_VALU
E) | 57 const int step = 10; |
| 58 while (!result.get()) |
60 { | 59 { |
61 const int step = 10; | 60 try |
62 Sleep(step); | 61 { |
63 timeout -= step; | 62 result.reset(new Communication::Pipe(Communication::pipeName, |
64 if (timeout <= 0) | 63 Communication::Pipe::MODE_CONNECT)); |
65 throw std::runtime_error("Unable to open Adblock Plus Engine pipe"); | 64 } |
| 65 catch (Communication::PipeConnectionError e) |
| 66 { |
| 67 Sleep(step); |
| 68 timeout -= step; |
| 69 if (timeout <= 0) |
| 70 throw std::runtime_error("Unable to open Adblock Plus Engine pipe"
); |
| 71 } |
66 } | 72 } |
67 } | 73 } |
68 | |
69 DWORD mode = PIPE_READMODE_MESSAGE; | |
70 if (!SetNamedPipeHandleState(pipe, &mode, 0, 0)) | |
71 throw std::runtime_error("SetNamedPipeHandleState failed"); | |
72 | |
73 return pipe; | |
74 } | 74 } |
75 catch(std::exception e) | 75 catch(std::exception e) |
76 { | 76 { |
77 DEBUG_GENERAL(e.what()); | 77 DEBUG_GENERAL(e.what()); |
78 return INVALID_HANDLE_VALUE; | |
79 } | 78 } |
| 79 return result; |
80 } | 80 } |
81 } | 81 } |
82 | 82 |
83 CAdblockPlusClient* CAdblockPlusClient::s_instance = NULL; | 83 CAdblockPlusClient* CAdblockPlusClient::s_instance = NULL; |
84 | 84 |
85 CAdblockPlusClient::CAdblockPlusClient() : CPluginClientBase() | 85 CAdblockPlusClient::CAdblockPlusClient() : CPluginClientBase() |
86 { | 86 { |
87 m_filter = std::auto_ptr<CPluginFilter>(new CPluginFilter()); | 87 m_filter = std::auto_ptr<CPluginFilter>(new CPluginFilter()); |
88 } | 88 } |
89 | 89 |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 if (status != 0) | 205 if (status != 0) |
206 { | 206 { |
207 return 0; | 207 return 0; |
208 } | 208 } |
209 RegCloseKey(hKey); | 209 RegCloseKey(hKey); |
210 return (int)(version[0] - 48); | 210 return (int)(version[0] - 48); |
211 } | 211 } |
212 | 212 |
213 Communication::InputBuffer CallAdblockPlusEngineProcedure(Communication::OutputB
uffer& message) | 213 Communication::InputBuffer CallAdblockPlusEngineProcedure(Communication::OutputB
uffer& message) |
214 { | 214 { |
215 AutoHandle pipe(OpenAdblockPlusEnginePipe()); | 215 std::auto_ptr<Communication::Pipe> pipe = OpenAdblockPlusEnginePipe(); |
216 Communication::WriteMessage(pipe.get(), message); | 216 pipe->WriteMessage(message); |
217 return Communication::ReadMessage(pipe.get()); | 217 return pipe->ReadMessage(); |
218 } | 218 } |
219 | 219 |
220 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) |
221 { | 221 { |
222 Communication::OutputBuffer request; | 222 Communication::OutputBuffer request; |
223 request << std::string("Matches") << url << contentType << domain; | 223 request << std::string("Matches") << url << contentType << domain; |
224 | 224 |
225 try | 225 try |
226 { | 226 { |
227 Communication::InputBuffer response = CallAdblockPlusEngineProcedure(request
); | 227 Communication::InputBuffer response = CallAdblockPlusEngineProcedure(request
); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 { | 286 { |
287 //TODO: implement this | 287 //TODO: implement this |
288 return std::vector<AdblockPlus::SubscriptionPtr>(); | 288 return std::vector<AdblockPlus::SubscriptionPtr>(); |
289 } | 289 } |
290 | 290 |
291 AdblockPlus::SubscriptionPtr CAdblockPlusClient::GetSubscription(std::string url
) | 291 AdblockPlus::SubscriptionPtr CAdblockPlusClient::GetSubscription(std::string url
) |
292 { | 292 { |
293 //TODO: imlement this | 293 //TODO: imlement this |
294 return AdblockPlus::SubscriptionPtr(); | 294 return AdblockPlus::SubscriptionPtr(); |
295 } | 295 } |
OLD | NEW |