Index: src/plugin/AdblockPlusClient.cpp |
=================================================================== |
--- a/src/plugin/AdblockPlusClient.cpp |
+++ b/src/plugin/AdblockPlusClient.cpp |
@@ -12,103 +12,11 @@ |
#include "AdblockPlusClient.h" |
+#include "../shared/AutoHandle.h" |
+#include "../shared/Communication.h" |
+ |
namespace |
{ |
- // TODO: GetUserName, pipeName, bufferSize, AutoHandle, ReadMessage, WriteMessage, MarshalStrings and UnmarshalStrings are |
- // duplicated in AdblockPlusEngine. We should find a way to reuse them. |
- |
- std::wstring GetUserName() |
- { |
- const DWORD maxLength = UNLEN + 1; |
- std::auto_ptr<wchar_t> buffer(new wchar_t[maxLength]); |
- DWORD length = maxLength; |
- if (!::GetUserName(buffer.get(), &length)) |
- { |
- std::stringstream stream; |
- stream << "Failed to get the current user's name (Error code: " << GetLastError() << ")"; |
- throw std::runtime_error("Failed to get the current user's name"); |
- } |
- return std::wstring(buffer.get(), length); |
- } |
- |
- const std::wstring pipeName = L"\\\\.\\pipe\\adblockplusengine_" + GetUserName(); |
- const int bufferSize = 1024; |
- |
- class AutoHandle |
- { |
- public: |
- AutoHandle() |
- { |
- } |
- |
- AutoHandle(HANDLE handle) : handle(handle) |
- { |
- } |
- |
- ~AutoHandle() |
- { |
- CloseHandle(handle); |
- } |
- |
- HANDLE get() |
- { |
- return handle; |
- } |
- |
- private: |
- HANDLE handle; |
- |
- AutoHandle(const AutoHandle& autoHandle); |
- AutoHandle& operator=(const AutoHandle& autoHandle); |
- }; |
- |
- std::string MarshalStrings(const std::vector<std::string>& strings) |
- { |
- // TODO: This is some pretty hacky marshalling, replace it with something more robust |
- std::string marshalledStrings; |
- for (std::vector<std::string>::const_iterator it = strings.begin(); it != strings.end(); it++) |
- marshalledStrings += *it + ';'; |
- return marshalledStrings; |
- } |
- |
- std::vector<std::string> UnmarshalStrings(const std::string& message) |
- { |
- std::stringstream stream(message); |
- std::vector<std::string> strings; |
- std::string string; |
- while (std::getline(stream, string, ';')) |
- strings.push_back(string); |
- return strings; |
- } |
- |
- std::string ReadMessage(HANDLE pipe) |
- { |
- std::stringstream stream; |
- std::auto_ptr<char> buffer(new char[bufferSize]); |
- bool doneReading = false; |
- while (!doneReading) |
- { |
- DWORD bytesRead; |
- if (ReadFile(pipe, buffer.get(), bufferSize * sizeof(char), &bytesRead, 0)) |
- doneReading = true; |
- else if (GetLastError() != ERROR_MORE_DATA) |
- { |
- std::stringstream stream; |
- stream << "Error reading from pipe: " << GetLastError(); |
- throw std::runtime_error(stream.str()); |
- } |
- stream << std::string(buffer.get(), bytesRead); |
- } |
- return stream.str(); |
- } |
- |
- void WriteMessage(HANDLE pipe, const std::string& message) |
- { |
- DWORD bytesWritten; |
- if (!WriteFile(pipe, message.c_str(), message.length(), &bytesWritten, 0)) |
- throw std::runtime_error("Failed to write to pipe"); |
- } |
- |
HANDLE OpenPipe(const std::wstring& name) |
{ |
if (WaitNamedPipe(name.c_str(), 5000)) |
@@ -142,13 +50,13 @@ |
{ |
try |
{ |
- HANDLE pipe = OpenPipe(pipeName); |
+ HANDLE pipe = OpenPipe(Communication::pipeName); |
if (pipe == INVALID_HANDLE_VALUE) |
{ |
SpawnAdblockPlusEngine(); |
int timeout = 10000; |
- while ((pipe = OpenPipe(pipeName)) == INVALID_HANDLE_VALUE) |
+ while ((pipe = OpenPipe(Communication::pipeName)) == INVALID_HANDLE_VALUE) |
{ |
const int step = 10; |
Sleep(step); |
@@ -305,8 +213,8 @@ |
std::string CallAdblockPlusEngineProcedure(const std::vector<std::string>& args) |
{ |
AutoHandle pipe(OpenAdblockPlusEnginePipe()); |
- WriteMessage(pipe.get(), MarshalStrings(args)); |
- return ReadMessage(pipe.get()); |
+ Communication::WriteMessage(pipe.get(), Communication::MarshalStrings(args)); |
+ return Communication::ReadMessage(pipe.get()); |
} |
bool CAdblockPlusClient::Matches(const std::string& url, const std::string& contentType, const std::string& domain) |
@@ -338,7 +246,7 @@ |
try |
{ |
std::string response = CallAdblockPlusEngineProcedure(args); |
- return UnmarshalStrings(response); |
+ return Communication::UnmarshalStrings(response); |
} |
catch (const std::exception& e) |
{ |