#include <PServer.h>
Inherits Pipe.
Inherited by MousePipe, and ScreenPipe.
Public Methods | |
HANDLE | getConnectedEventHandle () |
DWORD | getAttemptConnectResult () const |
bool | isConnected () |
Returns true if the server is connected to a client. More... | |
virtual bool | serve () |
virtual void | disconnect () |
Disconnects the pipe from the client. More... | |
PServer (const TString &, const bool, const DWORD=0) | |
virtual | ~PServer () |
Static Private Methods | |
DWORD WINAPI | waitForClient (LPVOID) |
Private Attributes | |
HANDLE | hConnectThread |
Handle to the connection thread. Exit code determines connection attept success. | |
DWORD | in |
The inbound buffer size. | |
DWORD | out |
The outbound buffer size. | |
volatile bool | connected |
Boolean indicating last known connection state. |
Definition at line 22 of file PServer.h.
|
Constructor
Definition at line 22 of file PServer.cpp. References connected, hConnectThread, in, and out.
|
|
Object Destructor Definition at line 40 of file PServer.cpp. References disconnect(), and hConnectThread.
00041 { 00042 disconnect(); 00043 if(hConnectThread != NULL) 00044 CloseHandle(hConnectThread); 00045 } |
|
Disconnects the server end of a pipe and resets the clients stay connected event. If the pipe is still waiting for a client the thread is terminated. Reimplemented from Pipe. Reimplemented in MousePipe. Definition at line 57 of file PServer.cpp. References Pipe::clientStayConnected, connected, getAttemptConnectResult(), hConnectThread, Pipe::hPipe, PS_CANCELLED, and PS_WAITING. Referenced by MousePipe::disconnect(), isConnected(), ScreenPipe::readError(), and ~PServer().
00058 { 00059 if( getAttemptConnectResult() == PS_WAITING ) { 00061 TerminateThread(hConnectThread, PS_CANCELLED); 00062 connected = false; 00063 } 00064 00065 connected = false; 00066 DisconnectNamedPipe(hPipe); 00067 CloseHandle(hPipe); 00068 00069 ResetEvent(clientStayConnected); 00070 } |
|
Returns the result of a connection attept Definition at line 170 of file PServer.cpp. References hConnectThread. Referenced by disconnect().
00171 { 00172 DWORD exitCode; 00173 GetExitCodeThread(hConnectThread, &exitCode); 00174 00175 return exitCode; 00176 } |
|
Produces a handle to an Event Obect that becomes sigalled when a client connects Definition at line 148 of file PServer.cpp. References hConnectThread. Referenced by Connect().
00149 { 00150 HANDLE rtrn; 00151 00152 // The thread handle can be used as an event object. 00153 // becomes signalled when the thread stops running 00154 00155 DuplicateHandle( 00156 GetCurrentProcess(), 00157 hConnectThread, // handle to duplicate 00158 GetCurrentProcess(), 00159 &rtrn, // duplicate handle 00160 SYNCHRONIZE, // handle can only be used to wait on 00161 false, // non inheritable 00162 0); // no extra options 00163 00164 return rtrn; 00165 } |
|
The makes sure the client is not wanting to disconnect, disconnecting as necessary. This should be called each time before a pipe operation is conducted. Definition at line 185 of file PServer.cpp. References Pipe::clientStayConnected, connected, and disconnect(). Referenced by Cls_OnLButtonDown(), Cls_OnLButtonUp(), MousePipe::queueMessage(), and serve().
00186 { 00187 if( WaitForSingleObject(clientStayConnected, 0) == WAIT_OBJECT_0 ){ 00188 this->disconnect(); 00189 } 00190 00191 return connected; 00192 } |
|
Serves a Pipe and starts a thread to wait for a client
Reimplemented in MousePipe. Definition at line 77 of file PServer.cpp. References hConnectThread, Pipe::hPipe, in, isConnected(), Pipe::isOutbound, out, Pipe::pipeName, Pipe::serverStayConnected, and waitForClient(). Referenced by Connect(), and MousePipe::serve().
00078 { 00079 if( PServer::isConnected() ){ 00080 return true; 00081 } 00082 00083 if( WaitForSingleObject(serverStayConnected, 0) == WAIT_OBJECT_0 ){ 00084 return false; // Client yet to process disconnect request 00085 } 00086 00087 hPipe = CreateNamedPipe( 00088 pipeName, // pipe name 00089 isOutbound ? PIPE_ACCESS_OUTBOUND : PIPE_ACCESS_INBOUND, // pipe open mode 00090 0, // Byte mode, blocking operations 00091 1, // Maximum pipe Instances 00092 out, // output buffer size 00093 in, // input buffer size 00094 NMPWAIT_WAIT_FOREVER, // default time-out interval 00095 NULL); // Default Security, non inheritable 00096 00097 if( GetLastError() == ERROR_ALREADY_EXISTS ) { 00098 CloseHandle(hPipe); // Close duplicated handle 00099 hPipe = INVALID_HANDLE_VALUE; 00100 } 00101 if ( hPipe == INVALID_HANDLE_VALUE ) { 00102 return false; 00103 } 00104 00105 if(hConnectThread != NULL) 00106 CloseHandle(hConnectThread); 00107 00108 hConnectThread = chBEGINTHREADEX( 00109 NULL, // Default Security, non inheritable 00110 0, // use default stack size 00111 &waitForClient, // thread function 00112 this, // thread argument 00113 0, // use default creation flags 00114 NULL); // don't need thread identifier 00115 00116 if(hConnectThread == NULL){ 00117 CloseHandle(hPipe); 00118 return false; 00119 } 00120 00121 return true; 00122 } |
|
Thread function which is blocked until client connects Definition at line 127 of file PServer.cpp. References connected, Pipe::hPipe, PS_CONNECTED, and PS_FAILED. Referenced by serve().
00128 { 00129 PServer* server = (PServer*) param; 00130 00131 // Wait for the client to connect; if it succeeds, 00132 // the function returns a nonzero value. If the function returns 00133 // zero, GetLastError returns ERROR_PIPE_CONNECTED. 00134 server->connected = ConnectNamedPipe(server->hPipe, NULL) ? 00135 true : (GetLastError() == ERROR_PIPE_CONNECTED); 00136 00137 if( server->connected ){ 00138 return PS_CONNECTED; 00139 } else { 00140 return PS_FAILED; 00141 } 00142 00143 } |