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

Side by Side Diff: src/engine/main.cpp

Issue 10786016: Moved all pipe functionality into a self-containing Communication::Pipe class (Closed)
Patch Set: Created May 31, 2013, 11:48 a.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
1 #include "stdafx.h" 1 #include "stdafx.h"
2 2
3 #include "../shared/AutoHandle.h" 3 #include "../shared/AutoHandle.h"
4 #include "../shared/Communication.h" 4 #include "../shared/Communication.h"
5 5
6 namespace 6 namespace
7 { 7 {
8 std::auto_ptr<AdblockPlus::FilterEngine> filterEngine; 8 std::auto_ptr<AdblockPlus::FilterEngine> filterEngine;
9 9
10 void Log(const std::string& message) 10 void Log(const std::string& message)
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 int32_t length = selectors.size(); 64 int32_t length = selectors.size();
65 response << length; 65 response << length;
66 for (int32_t i = 0; i < length; i++) 66 for (int32_t i = 0; i < length; i++)
67 response << selectors[i]; 67 response << selectors[i];
68 } 68 }
69 return response; 69 return response;
70 } 70 }
71 71
72 DWORD WINAPI ClientThread(LPVOID param) 72 DWORD WINAPI ClientThread(LPVOID param)
73 { 73 {
74 HANDLE pipe = static_cast<HANDLE>(param); 74 std::auto_ptr<Communication::Pipe> pipe(static_cast<Communication::Pipe*>(pa ram));
75 75
76 try 76 try
77 { 77 {
78 Communication::InputBuffer message = Communication::ReadMessage(pipe); 78 Communication::InputBuffer message = pipe->ReadMessage();
79 Communication::OutputBuffer response = HandleRequest(message); 79 Communication::OutputBuffer response = HandleRequest(message);
80 Communication::WriteMessage(pipe, response); 80 pipe->WriteMessage(response);
81 } 81 }
82 catch (const std::exception& e) 82 catch (const std::exception& e)
83 { 83 {
84 LogException(e); 84 LogException(e);
85 } 85 }
86 86
87 // TODO: Keep the pipe open until the client disconnects 87 // TODO: Keep the pipe open until the client disconnects
88 FlushFileBuffers(pipe); 88
Felix Dahlke 2013/06/03 12:18:47 Shouldn't we delete pipe here?
Wladimir Palant 2013/06/03 14:00:26 It's an auto_ptr.
Felix Dahlke 2013/06/04 06:39:39 Oops, then let's not delete it :)
89 DisconnectNamedPipe(pipe);
90 CloseHandle(pipe);
91 return 0; 89 return 0;
92 } 90 }
93 91
94 bool IsWindowsVistaOrLater() 92 bool IsWindowsVistaOrLater()
95 { 93 {
96 OSVERSIONINFOEX osvi; 94 OSVERSIONINFOEX osvi;
97 ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); 95 ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
98 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); 96 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
99 GetVersionEx(reinterpret_cast<LPOSVERSIONINFO>(&osvi)); 97 GetVersionEx(reinterpret_cast<LPOSVERSIONINFO>(&osvi));
100 return osvi.dwMajorVersion >= 6; 98 return osvi.dwMajorVersion >= 6;
(...skipping 24 matching lines...) Expand all
125 std::auto_ptr<AdblockPlus::FilterEngine> CreateFilterEngine() 123 std::auto_ptr<AdblockPlus::FilterEngine> CreateFilterEngine()
126 { 124 {
127 // TODO: Pass appInfo in, which should be sent by the client 125 // TODO: Pass appInfo in, which should be sent by the client
128 AdblockPlus::JsEnginePtr jsEngine = AdblockPlus::JsEngine::New(); 126 AdblockPlus::JsEnginePtr jsEngine = AdblockPlus::JsEngine::New();
129 std::string dataPath = ToUtf8String(GetAppDataPath()); 127 std::string dataPath = ToUtf8String(GetAppDataPath());
130 dynamic_cast<AdblockPlus::DefaultFileSystem*>(jsEngine->GetFileSystem().get()) ->SetBasePath(dataPath); 128 dynamic_cast<AdblockPlus::DefaultFileSystem*>(jsEngine->GetFileSystem().get()) ->SetBasePath(dataPath);
131 std::auto_ptr<AdblockPlus::FilterEngine> filterEngine(new AdblockPlus::FilterE ngine(jsEngine)); 129 std::auto_ptr<AdblockPlus::FilterEngine> filterEngine(new AdblockPlus::FilterE ngine(jsEngine));
132 return filterEngine; 130 return filterEngine;
133 } 131 }
134 132
135 HANDLE CreatePipe(const std::wstring& pipeName)
136 {
137 SECURITY_ATTRIBUTES sa;
138 memset(&sa, 0, sizeof(SECURITY_ATTRIBUTES));
139 sa.nLength = sizeof(SECURITY_ATTRIBUTES);
140
141 // Low mandatory label. See http://msdn.microsoft.com/en-us/library/bb625958.a spx
142 LPCWSTR accessControlEntry = L"S:(ML;;NW;;;LW)";
143 PSECURITY_DESCRIPTOR securitydescriptor;
144 ConvertStringSecurityDescriptorToSecurityDescriptor(accessControlEntry, SDDL_R EVISION_1, &securitydescriptor, 0);
145
146 sa.lpSecurityDescriptor = securitydescriptor;
147 sa.bInheritHandle = TRUE;
148
149 HANDLE pipe = CreateNamedPipe(pipeName.c_str(), PIPE_ACCESS_DUPLEX, PIPE_TYPE_ MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
150 PIPE_UNLIMITED_INSTANCES, Communication::bufferS ize, Communication::bufferSize, 0, &sa);
151 LocalFree(securitydescriptor);
152 return pipe;
153 }
154
155 int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) 133 int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
156 { 134 {
157 // TODO: Attempt to create the pipe first, and exit immediately if this 135 // TODO: Attempt to create the pipe first, and exit immediately if this
158 // fails. Since multiple instances of the engine could be running, 136 // fails. Since multiple instances of the engine could be running,
159 // this may need named mutices to avoid race conditions. 137 // this may need named mutices to avoid race conditions.
160 // Note that as soon as the pipe is created first, we can reduce the 138 // Note that as soon as the pipe is created first, we can reduce the
161 // client timeout after CreateProcess(), but should increase the one 139 // client timeout after CreateProcess(), but should increase the one
162 // in WaitNamedPipe(). 140 // in WaitNamedPipe().
163 141
164 filterEngine = CreateFilterEngine(); 142 filterEngine = CreateFilterEngine();
165 143
166 for (;;) 144 for (;;)
167 { 145 {
168 HANDLE pipe = CreatePipe(Communication::pipeName); 146 try
169 if (pipe == INVALID_HANDLE_VALUE)
170 { 147 {
171 LogLastError("CreateNamedPipe failed"); 148 Communication::Pipe* pipe = new Communication::Pipe(Communication::pipeNam e,
172 return 1; 149 Communication::Pipe::MODE_CREATE);
150
151 // TODO: Count established connections, kill the engine when none are left
152 AutoHandle thread(CreateThread(0, 0, ClientThread, static_cast<LPVOID>(pip e), 0, 0));
153 if (!thread.get())
154 {
155 delete pipe;
156 LogLastError("CreateThread failed");
157 return 1;
158 }
173 } 159 }
174 160 catch (std::runtime_error e)
175 if (!ConnectNamedPipe(pipe, 0))
176 { 161 {
177 LogLastError("Client failed to connect"); 162 LogException(e);
178 CloseHandle(pipe);
179 continue;
180 }
181
182 // TODO: Count established connections, kill the engine when none are left
183
184 AutoHandle thread(CreateThread(0, 0, ClientThread, static_cast<LPVOID>(pipe) , 0, 0));
185 if (!thread.get())
186 {
187 LogLastError("CreateThread failed");
188 return 1; 163 return 1;
189 } 164 }
190 } 165 }
191 166
192 return 0; 167 return 0;
193 } 168 }
OLDNEW
« no previous file with comments | « createsolution.bat ('k') | src/engine/stdafx.h » ('j') | src/shared/Communication.h » ('J')

Powered by Google App Engine
This is Rietveld