X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FServer.h;h=967263a7e0d0dfccfc0fe19e9c5b97df672ede99;hb=f345feecede25b164502abdacf893a36de9ef4ae;hp=337b9110a7013ad556653494e88edf32461d738b;hpb=40620bd83fe0df597c54f584e15bb1a7a6bfdea4;p=lyx.git diff --git a/src/Server.h b/src/Server.h index 337b9110a7..967263a7e0 100644 --- a/src/Server.h +++ b/src/Server.h @@ -25,7 +25,6 @@ namespace lyx { -class LyXFunc; class Server; @@ -42,8 +41,15 @@ class LyXComm : public boost::signals::trackable { class LyXComm : public QObject { Q_OBJECT - /// Max number of (read) pipe instances - enum { MAX_PIPES = 10 }; + friend DWORD WINAPI pipeServerWrapper(void *); + +public: + /// Max number of clients + enum { MAX_CLIENTS = 10 }; + +private: + /// Max number of pipe instances + enum { MAX_PIPES = 2 * MAX_CLIENTS }; /// I/O buffer size enum { PIPE_BUFSIZE = 512 }; @@ -58,10 +64,12 @@ class LyXComm : public QObject { WRITING_STATE }; + /// Pipe instances typedef struct { OVERLAPPED overlap; HANDLE handle; - char pipebuf[PIPE_BUFSIZE]; + std::string iobuf; + char readbuf[PIPE_BUFSIZE]; DWORD nbytes; PipeState state; bool pending_io; @@ -91,9 +99,6 @@ public: void read_ready(); #else void read_ready(DWORD); - - /// The pipe server - void pipeServer(); #endif private: @@ -122,29 +127,44 @@ private: /// This is -1 if not open int outfd_; #else + /// The pipe server returns false when exiting due to an error + bool pipeServer(); + /// Start an overlapped connection - void startPipe(DWORD); + bool startPipe(DWORD); /// Reset an overlapped connection - void resetPipe(DWORD, bool close_handle = false); + bool resetPipe(DWORD, bool close_handle = false); /// Close event and pipe handles - void closeHandles(DWORD); + void closeHandles(); + + /// Catch pipe ready-to-be-read notification + bool event(QEvent *); + + /// Check whether the pipe server must be stopped + bool checkStopServer(DWORD timeout = 0); /// The filename of a (in or out) pipe instance std::string const pipeName(DWORD) const; /// Pipe instances - PipeInst pipe_[MAX_PIPES + 1]; + PipeInst pipe_[MAX_PIPES]; /// Pipe server control events - HANDLE event_[MAX_PIPES + 2]; - - /// Request buffers - std::string readbuf_[MAX_PIPES]; + HANDLE event_[MAX_PIPES + 1]; /// Reply buffer - std::string writebuf_; + std::string outbuf_; + + /// Synchronize access to outbuf_ + HANDLE outbuf_mutex_; + + /// Windows event for stopping the pipe server + HANDLE stopserver_; + + /// Pipe server thread handle + HANDLE server_thread_; #endif /// Are we up and running? @@ -158,20 +178,6 @@ private: /// The client callback function ClientCallbackfct clientcb_; - -#ifdef _WIN32 - /// Catch pipe ready-to-be-read notification - bool event(QEvent *); - - /// Check whether the pipe server must be stopped - BOOL checkStopServer(); - - /// Windows event for stopping the pipe server - HANDLE stopserver_; - - /// Pipe server thread handle - HANDLE server_thread_; -#endif }; @@ -181,15 +187,12 @@ public: // FIXME IN 0.13 // Hack! This should be changed in 0.13 - // The lyx server should not take an argument "LyXFunc" but this is - // how it will be done for 0.12. In 0.13 we must write a non-gui - // bufferview. // IMO lyxserver is atypical, and for the moment the only one, non-gui // bufferview. We just have to find a way to handle situations like if // lyxserver is using a buffer that is being edited with a bufferview. // With a common buffer list this is not a problem, maybe. (Alejandro) /// - Server(LyXFunc * f, std::string const & pip); + Server(std::string const & pip); /// ~Server(); /// @@ -202,19 +205,21 @@ public: private: /// Names and number of current clients +#ifndef _WIN32 enum { MAX_CLIENTS = 10 }; +#else + enum { MAX_CLIENTS = LyXComm::MAX_CLIENTS }; +#endif /// std::string clients_[MAX_CLIENTS]; /// int numclients_; /// - LyXFunc * func_; - /// LyXComm pipes_; }; /// Implementation is in LyX.cpp -extern Server & theServer(); +Server & theServer(); } // namespace lyx