]> git.lyx.org Git - lyx.git/blobdiff - src/Server.h
Update sk.po
[lyx.git] / src / Server.h
index 337b9110a7013ad556653494e88edf32461d738b..40021daa414c14bf82f15b36bc2ab1c60f48e3e5 100644 (file)
@@ -14,7 +14,9 @@
 #ifndef SERVER_H
 #define SERVER_H
 
-#include <boost/signals/trackable.hpp>
+#include "support/signals.h"
+
+#include <vector>
 
 #ifdef _WIN32
 #include <windows.h>
 
 namespace lyx {
 
-class LyXFunc;
 class Server;
 
 
-/** This class managed the pipes used for communicating with clients.
+/** This class manages the pipes used for communicating with clients.
  Usage: Initialize with pipe-filename-base, client class to receive
  messages, and callback-function that will be called with the messages.
  When you want to send, use "send()".
@@ -37,13 +38,20 @@ class Server;
  a clean string interface.
  */
 #ifndef _WIN32
-class LyXComm : public boost::signals::trackable {
+class LyXComm {
 #else
 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 +66,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,11 +101,11 @@ public:
        void read_ready();
 #else
        void read_ready(DWORD);
-
-       /// The pipe server
-       void pipeServer();
 #endif
 
+       /// Tell whether we asked another instance of LyX to open the files
+       bool deferredLoading() { return deferred_loading_; }
+
 private:
        /// the filename of the in pipe
        std::string const inPipeName() const;
@@ -109,6 +119,9 @@ private:
        /// Close pipes
        void closeConnection();
 
+       /// Load files in another running instance of LyX
+       bool loadFilesInOtherInstance();
+
 #ifndef _WIN32
        /// start a pipe
        int startPipe(std::string const &, bool);
@@ -122,29 +135,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?
@@ -159,19 +187,11 @@ 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_;
+       /// Did we defer loading of files to another instance?
+       bool deferred_loading_;
 
-       /// Pipe server thread handle
-       HANDLE server_thread_;
-#endif
+       /// Track object's liveness
+       support::Trackable tracker_;
 };
 
 
@@ -181,19 +201,18 @@ 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();
        ///
        void notifyClient(std::string const &);
+       ///
+       bool deferredLoadingToOtherInstance() { return pipes_.deferredLoading(); }
 
        /// whilst crashing etc.
        void emergencyCleanup() { pipes_.emergencyCleanup(); }
@@ -202,19 +221,24 @@ 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();
+
+/// Implementation is in LyX.cpp
+extern std::vector<std::string> & theFilesToLoad();
 
 
 } // namespace lyx