X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FServer.h;h=215b7e930d5854e6c7b08c0d073d6d793e72957f;hb=0e4ca9aa88eb7b9351bb563dcd2df59c15744aa5;hp=a7505448c828ff5c591bbfaa553a7ba04a84a450;hpb=50423d0e7c9a6514946c9cbfc02602bcaee0bedb;p=lyx.git diff --git a/src/Server.h b/src/Server.h index a7505448c8..215b7e930d 100644 --- a/src/Server.h +++ b/src/Server.h @@ -14,7 +14,9 @@ #ifndef SERVER_H #define SERVER_H -#include +#include +#include +#include #ifdef _WIN32 #include @@ -25,11 +27,25 @@ 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(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 p() const { return p_; } +private: + std::shared_ptr 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); @@ -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 & theFilesToLoad(); } // namespace lyx