| 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 |