 Issue 10580043:
  Run a single FilterEngine instance in a separate process  (Closed)
    
  
    Issue 10580043:
  Run a single FilterEngine instance in a separate process  (Closed) 
  | Left: | ||
| Right: | 
| LEFT | RIGHT | 
|---|---|
| 1 #include <AdblockPlus.h> | 1 #include <AdblockPlus.h> | 
| 2 #include <iostream> | 2 #include <iostream> | 
| 3 #include <Lmcons.h> | |
| 3 #include <ShlObj.h> | 4 #include <ShlObj.h> | 
| 4 #include <sstream> | 5 #include <sstream> | 
| 5 #include <vector> | 6 #include <vector> | 
| 6 #include <Windows.h> | 7 #include <Windows.h> | 
| 7 #include <Sddl.h> | 8 #include <Sddl.h> | 
| 8 | 9 | 
| 9 namespace | 10 namespace | 
| 10 { | 11 { | 
| 11 const std::wstring pipeName = L"\\\\.\\pipe\\adblockplusengine"; | 12 std::wstring GetUserName() | 
| 
Wladimir Palant
2013/05/23 14:25:01
I realized that the pipe name should be user-speci
 
Felix Dahlke
2013/05/23 19:10:44
Oh, you're right. Appended the user name. Consider
 
Wladimir Palant
2013/05/23 20:10:15
Not sure whether the user name can be changed but
 | |
| 13 { | |
| 14 const DWORD maxLength = UNLEN + 1; | |
| 15 std::auto_ptr<wchar_t> buffer(new wchar_t[maxLength]); | |
| 16 DWORD length = maxLength; | |
| 17 if (!::GetUserName(buffer.get(), &length)) | |
| 18 { | |
| 19 std::stringstream stream; | |
| 20 stream << "Failed to get the current user's name (Error code: " << GetLast Error() << ")"; | |
| 21 throw std::runtime_error("Failed to get the current user's name"); | |
| 22 } | |
| 23 return std::wstring(buffer.get(), length); | |
| 24 } | |
| 25 | |
| 26 const std::wstring pipeName = L"\\\\.\\pipe\\adblockplusengine_" + GetUserName (); | |
| 12 const int bufferSize = 1024; | 27 const int bufferSize = 1024; | 
| 13 std::auto_ptr<AdblockPlus::FilterEngine> filterEngine; | 28 std::auto_ptr<AdblockPlus::FilterEngine> filterEngine; | 
| 14 | 29 | 
| 15 class AutoHandle | 30 class AutoHandle | 
| 16 { | 31 { | 
| 17 public: | 32 public: | 
| 18 AutoHandle() | 33 AutoHandle() | 
| 19 { | 34 { | 
| 20 } | 35 } | 
| 21 | 36 | 
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 70 std::vector<std::string> UnmarshalStrings(const std::string& message) | 85 std::vector<std::string> UnmarshalStrings(const std::string& message) | 
| 71 { | 86 { | 
| 72 std::stringstream stream(message); | 87 std::stringstream stream(message); | 
| 73 std::vector<std::string> strings; | 88 std::vector<std::string> strings; | 
| 74 std::string string; | 89 std::string string; | 
| 75 while (std::getline(stream, string, ';')) | 90 while (std::getline(stream, string, ';')) | 
| 76 strings.push_back(string); | 91 strings.push_back(string); | 
| 77 return strings; | 92 return strings; | 
| 78 } | 93 } | 
| 79 | 94 | 
| 80 std::string ToString(std::wstring value) | 95 std::string ToUtf8String(std::wstring str) | 
| 81 { | 96 { | 
| 82 int size = WideCharToMultiByte(CP_UTF8, 0, value.c_str(), value.length(), 0, 0, 0, 0); | 97 size_t length = str.size(); | 
| 
Wladimir Palant
2013/05/23 14:25:01
Error case (size is 0 for a value with non-zero le
 
Felix Dahlke
2013/05/23 19:10:44
It is, it returns an empty string. I thought it wa
 
Wladimir Palant
2013/05/23 20:10:15
We should actually crash early here. While I canno
 | |
| 83 std::auto_ptr<char> converted(new char[size]); | 98 if (length == 0) | 
| 84 WideCharToMultiByte(CP_UTF8, 0, value.c_str(), value.length(), converted.get (), size, 0, 0); | 99 return std::string(); | 
| 85 std::string string(converted.get(), size); | 100 | 
| 86 return string; | 101 DWORD utf8StringLength = WideCharToMultiByte(CP_UTF8, 0, str.c_str(), length , 0, 0, 0, 0); | 
| 102 if (utf8StringLength == 0) | |
| 103 throw std::runtime_error("Failed to determine the required buffer size"); | |
| 104 | |
| 105 std::string utf8String(utf8StringLength, '\0'); | |
| 106 WideCharToMultiByte(CP_UTF8, 0, str.c_str(), length, &utf8String[0], utf8Str ingLength, 0, 0); | |
| 107 return utf8String; | |
| 87 } | 108 } | 
| 88 | 109 | 
| 89 std::string ReadMessage(HANDLE pipe) | 110 std::string ReadMessage(HANDLE pipe) | 
| 90 { | 111 { | 
| 91 std::stringstream stream; | 112 std::stringstream stream; | 
| 92 std::auto_ptr<char> buffer(new char[bufferSize]); | 113 std::auto_ptr<char> buffer(new char[bufferSize]); | 
| 93 bool doneReading = false; | 114 bool doneReading = false; | 
| 94 while (!doneReading) | 115 while (!doneReading) | 
| 95 { | 116 { | 
| 96 DWORD bytesRead; | 117 DWORD bytesRead; | 
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 168 appDataPath.assign(pathBuffer); | 189 appDataPath.assign(pathBuffer); | 
| 169 CoTaskMemFree(pathBuffer); | 190 CoTaskMemFree(pathBuffer); | 
| 170 } | 191 } | 
| 171 else | 192 else | 
| 172 { | 193 { | 
| 173 std::auto_ptr<wchar_t> pathBuffer(new wchar_t[MAX_PATH]); | 194 std::auto_ptr<wchar_t> pathBuffer(new wchar_t[MAX_PATH]); | 
| 174 if (!SHGetSpecialFolderPath(0, pathBuffer.get(), CSIDL_LOCAL_APPDATA, true)) | 195 if (!SHGetSpecialFolderPath(0, pathBuffer.get(), CSIDL_LOCAL_APPDATA, true)) | 
| 175 throw std::runtime_error("Unable to find app data directory"); | 196 throw std::runtime_error("Unable to find app data directory"); | 
| 176 appDataPath.assign(pathBuffer.get()); | 197 appDataPath.assign(pathBuffer.get()); | 
| 177 } | 198 } | 
| 178 return std::wstring(appDataPath) + L"\\AdblockPlus"; | 199 return appDataPath + L"\\AdblockPlus"; | 
| 
Wladimir Palant
2013/05/23 14:25:01
appDataPath already is a wstring, no need to const
 
Felix Dahlke
2013/05/23 19:10:44
Done.
 | |
| 179 } | 200 } | 
| 180 | 201 | 
| 181 std::auto_ptr<AdblockPlus::FilterEngine> CreateFilterEngine() | 202 std::auto_ptr<AdblockPlus::FilterEngine> CreateFilterEngine() | 
| 182 { | 203 { | 
| 183 // TODO: Pass appInfo in, which should be sent by the client | 204 // TODO: Pass appInfo in, which should be sent by the client | 
| 184 AdblockPlus::JsEnginePtr jsEngine = AdblockPlus::JsEngine::New(); | 205 AdblockPlus::JsEnginePtr jsEngine = AdblockPlus::JsEngine::New(); | 
| 185 std::string dataPath = ToString(GetAppDataPath()); | 206 std::string dataPath = ToUtf8String(GetAppDataPath()); | 
| 186 dynamic_cast<AdblockPlus::DefaultFileSystem*>(jsEngine->GetFileSystem().get()) ->SetBasePath(dataPath); | 207 dynamic_cast<AdblockPlus::DefaultFileSystem*>(jsEngine->GetFileSystem().get()) ->SetBasePath(dataPath); | 
| 187 std::auto_ptr<AdblockPlus::FilterEngine> filterEngine(new AdblockPlus::FilterE ngine(jsEngine)); | 208 std::auto_ptr<AdblockPlus::FilterEngine> filterEngine(new AdblockPlus::FilterE ngine(jsEngine)); | 
| 188 std::vector<AdblockPlus::SubscriptionPtr> subscriptions = filterEngine->FetchA vailableSubscriptions(); | 209 std::vector<AdblockPlus::SubscriptionPtr> subscriptions = filterEngine->FetchA vailableSubscriptions(); | 
| 189 // TODO: Select a subscription based on the language, not just the first one. | 210 // TODO: Select a subscription based on the language, not just the first one. | 
| 190 // This should ideally be done in libadblockplus. | 211 // This should ideally be done in libadblockplus. | 
| 191 AdblockPlus::SubscriptionPtr subscription = subscriptions[0]; | 212 AdblockPlus::SubscriptionPtr subscription = subscriptions[0]; | 
| 192 subscription->AddToList(); | 213 subscription->AddToList(); | 
| 193 return filterEngine; | 214 return filterEngine; | 
| 194 } | 215 } | 
| 195 | 216 | 
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 238 AutoHandle thread(CreateThread(0, 0, ClientThread, static_cast<LPVOID>(pipe) , 0, 0)); | 259 AutoHandle thread(CreateThread(0, 0, ClientThread, static_cast<LPVOID>(pipe) , 0, 0)); | 
| 239 if (!thread.get()) | 260 if (!thread.get()) | 
| 240 { | 261 { | 
| 241 LogLastError("CreateThread failed"); | 262 LogLastError("CreateThread failed"); | 
| 242 return 1; | 263 return 1; | 
| 243 } | 264 } | 
| 244 } | 265 } | 
| 245 | 266 | 
| 246 return 0; | 267 return 0; | 
| 247 } | 268 } | 
| LEFT | RIGHT |