]> git.lyx.org Git - lyx.git/blobdiff - src/Server.h
Rename LATEX debug level to OUTFILE and use it for DocBook, HTML, and XML messages.
[lyx.git] / src / Server.h
index df0902a38fe7f5e5ffbd2ddc7d0e98112fd9520d..215b7e930d5854e6c7b08c0d073d6d793e72957f 100644 (file)
@@ -14,7 +14,9 @@
 #ifndef SERVER_H
 #define SERVER_H
 
-#include <boost/signals/trackable.hpp>
+#include <memory>
+#include <string>
+#include <vector>
 
 #ifdef _WIN32
 #include <windows.h>
 
 namespace lyx {
 
-class LyXFunc;
 class Server;
 
 
-/** This class managed the pipes used for communicating with clients.
+/// A small utility to track the lifetime of an object.
+class Trackable {
+public:
+       Trackable() : p_(std::make_shared<int>(0)) {}
+       Trackable(Trackable const &) : Trackable() {}
+       Trackable(Trackable &&) : Trackable() {}
+       Trackable & operator=(Trackable const &) { return *this; }
+       Trackable & operator=(Trackable &&) { return *this; }
+       // This weak pointer lets you know if the parent object has been destroyed
+       std::weak_ptr<void> p() const { return p_; }
+private:
+       std::shared_ptr<void> const p_;
+};
+
+
+/** 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,7 +53,7 @@ class Server;
  a clean string interface.
  */
 #ifndef _WIN32
-class LyXComm : public boost::signals::trackable {
+class LyXComm {
 #else
 class LyXComm : public QObject {
        Q_OBJECT
@@ -102,6 +118,9 @@ public:
        void read_ready(DWORD);
 #endif
 
+       /// Tell whether we asked another instance of LyX to open the files
+       bool deferredLoading() const { return deferred_loading_; }
+
 private:
        /// the filename of the in pipe
        std::string const inPipeName() const;
@@ -115,6 +134,9 @@ private:
        /// Close pipes
        void closeConnection();
 
+       /// Load files in another running instance of LyX
+       bool loadFilesInOtherInstance() const;
+
 #ifndef _WIN32
        /// start a pipe
        int startPipe(std::string const &, bool);
@@ -144,7 +166,7 @@ private:
        bool event(QEvent *);
 
        /// Check whether the pipe server must be stopped
-       bool checkStopServer();
+       bool checkStopServer(DWORD timeout = 0);
 
        /// The filename of a (in or out) pipe instance
        std::string const pipeName(DWORD) const;
@@ -179,6 +201,12 @@ private:
 
        /// The client callback function
        ClientCallbackfct clientcb_;
+
+       /// Did we defer loading of files to another instance?
+       bool deferred_loading_;
+
+       /// Track object's liveness
+       Trackable tracker_;
 };
 
 
@@ -188,19 +216,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 & pipes);
        ///
        ~Server();
        ///
        void notifyClient(std::string const &);
+       ///
+       bool deferredLoadingToOtherInstance() const { return pipes_.deferredLoading(); }
 
        /// whilst crashing etc.
        void emergencyCleanup() { pipes_.emergencyCleanup(); }
@@ -219,13 +246,14 @@ private:
        ///
        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