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 };
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;
void read_ready();
#else
void read_ready(DWORD);
-
- /// The pipe server
- void pipeServer();
#endif
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?
/// 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
};
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];
///