Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Delta Between Two Patch Sets: AdblockPlusEngine/main.cpp

Issue 10580043: Run a single FilterEngine instance in a separate process (Closed)
Left Patch Set: Addressed all issues Created May 23, 2013, 12:29 p.m.
Right Patch Set: Addressed review issues Created May 23, 2013, 7:10 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
Left: Side by side diff | Download
Right: Side by side diff | Download
« no previous file with change/comment | « AdblockPlusEngine/AdblockPlusEngine.vcxproj.filters ('k') | Shared/AdblockPlusClient.h » ('j') | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
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
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
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
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 }
LEFTRIGHT

Powered by Google App Engine
This is Rietveld