X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxserver.h;h=18623578d81294a1bb72d0cfbdfcf0cadff38dc4;hb=e7f4618bcce770369cf46335c2c7f0164b4b8857;hp=8bfda020b1f3000b564ed1765456942a09e80b59;hpb=0eccdd1c3613e5170deb77b22174dd0afde833e9;p=lyx.git diff --git a/src/lyxserver.h b/src/lyxserver.h index 8bfda020b1..18623578d8 100644 --- a/src/lyxserver.h +++ b/src/lyxserver.h @@ -1,22 +1,23 @@ // -*- C++ -*- -/* This file is part of -* ====================================================== -* -* LyX, The Document Processor -* -* Copyright (C) 1995 Matthias Ettrich -* Copyright (C) 1995-1998 The LyX Team. -* -*======================================================*/ - -#ifndef _LYXSERVER_H_ -#define _LYXSERVER_H_ - -#ifdef __GNUG__ -#pragma interface -#endif - -#include "LString.h" +/** + * \file lyxserver.h + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author Lars Gullik Bjønnes + * \author Jean-Marc Lasgouttes + * + * Full author contact details are available in file CREDITS. + */ + +#ifndef LYXSERVER_H +#define LYXSERVER_H + +#include + + +namespace lyx { + class LyXFunc; class LyXServer; @@ -29,19 +30,17 @@ class LyXServer; This class encapsulates all the dirty communication and thus provides a clean string interface. */ -class LyXComm -{ +class LyXComm : public boost::signals::trackable { public: /** When we receive a message, we send it to a client. This is one of the small things that would have been a lot cleaner with a Signal/Slot thing. */ - typedef void (*ClientCallbackfct)(LyXServer *, string const &); + typedef void (*ClientCallbackfct)(LyXServer *, std::string const &); /// Construct with pipe-basename and callback to receive messages - LyXComm(string const &pip, LyXServer * cli, ClientCallbackfct ccb = 0) - :pipename(pip), client(cli), clientcb(ccb) - { + LyXComm(std::string const & pip, LyXServer * cli, ClientCallbackfct ccb = 0) + : pipename(pip), client(cli), clientcb(ccb) { ready = false; openConnection(); } @@ -51,17 +50,33 @@ public: closeConnection(); } + /// clean up in emergency + void emergencyCleanup(); + /// Send message - void send(string const &); + void send(std::string const &); + + /// asynch ready-to-be-read notification + void read_ready(); + private: + /// the filename of the in pipe + std::string const inPipeName() const; + + /// the filename of the out pipe + std::string const outPipeName() const; + /// Open pipes void openConnection(); - + /// Close pipes void closeConnection(); - /// We receive messages via XForms through this callback - static void callback(int fd, void *v); + /// start a pipe + int startPipe(std::string const &, bool); + + /// finish a pipe + void endPipe(int &, std::string const &, bool); /// This is -1 if not open int infd; @@ -73,7 +88,7 @@ private: bool ready; /// Base of pipename including path - string pipename; + std::string pipename; /// The client LyXServer * client; @@ -84,39 +99,56 @@ private: /* --- prototypes -------------------------------------------------------- */ -class LyXServer -{ +/// +class LyXServer { 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 + // 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) - LyXServer(LyXFunc *f, string const &pip) - : numclients(0), func(f), pipes(pip, (this), callback) - { } - /// + // 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) + /// + LyXServer(LyXFunc * f, std::string const & pip) + : numclients(0), func(f), pipes(pip, (this), callback) {} + /// ~LyXServer(); /// - void notifyClient(string const &); + void notifyClient(std::string const &); + + /// whilst crashing etc. + void emergencyCleanup() { + pipes.emergencyCleanup(); + } + private: /// - static void callback(LyXServer *, string const & msg); + static void callback(LyXServer *, std::string const & msg); /// Names and number of current clients - enum { MAX_CLIENTS = 10 }; - string clients[MAX_CLIENTS]; + enum { + /// + MAX_CLIENTS = 10 + }; + /// + std::string clients[MAX_CLIENTS]; + /// int numclients; /// - LyXFunc *func; + LyXFunc * func; /// LyXComm pipes; }; +/// Implementation is in lyx_main.C +extern LyXServer & theLyXServer(); + + +} // namespace lyx + #endif /* _LYXSERVER_H_ */ /* === End of File: lyxserver.h ========================================== */