]> git.lyx.org Git - lyx.git/blobdiff - src/lyxserver.h
another safety belt
[lyx.git] / src / lyxserver.h
index 8bfda020b1f3000b564ed1765456942a09e80b59..3a3c180776645a62becc439539e62da77a7c8afd 100644 (file)
@@ -1,22 +1,25 @@
 // -*- C++ -*-
 /* This file is part of
 * ======================================================
-* 
+*
 *           LyX, The Document Processor
-*        
-*           Copyright (C) 1995 Matthias Ettrich
-*           Copyright (C) 1995-1998 The LyX Team.
 *
-*======================================================*/
+*           Copyright 1995 Matthias Ettrich
+*           Copyright 1995-2001 The LyX Team.
+*
+* ====================================================== */
 
-#ifndef _LYXSERVER_H_
-#define _LYXSERVER_H_
+#ifndef LYXSERVER_H
+#define LYXSERVER_H
 
 #ifdef __GNUG__
 #pragma interface
 #endif
 
 #include "LString.h"
+
+#include <boost/signals/trackable.hpp>
 class LyXFunc;
 class LyXServer;
 
@@ -29,8 +32,7 @@ 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
@@ -39,9 +41,8 @@ public:
        typedef void (*ClientCallbackfct)(LyXServer *, 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(string const & pip, LyXServer * cli, ClientCallbackfct ccb = 0)
+               : pipename(pip), client(cli), clientcb(ccb) {
                ready = false;
                openConnection();
        }
@@ -51,17 +52,37 @@ public:
                closeConnection();
        }
 
+       /// clean up in emergency
+       void emergencyCleanup();
+
        /// Send message
        void send(string const &);
+
+       /// asynch ready-to-be-read notification
+       void read_ready();
+
 private:
+       /// the filename of the in pipe
+       string const inPipeName() {
+               return pipename + ".in";
+       }
+
+       /// the filename of the out pipe
+       string const outPipeName() {
+               return pipename + ".out";
+       }
+
        /// 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(string const &, bool);
+
+       /// finish a pipe
+       void endPipe(int &, string const &, bool);
 
        /// This is -1 if not open
        int infd;
@@ -84,35 +105,46 @@ 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, string const & pip)
+               : numclients(0), func(f), pipes(pip, (this), callback) {}
+       ///
        ~LyXServer();
        ///
        void notifyClient(string const &);
+
+       /// whilst crashing etc.
+       void emergencyCleanup() {
+               pipes.emergencyCleanup();
+       }
+
 private:
        ///
        static void callback(LyXServer *, string const & msg);
        /// Names and number of current clients
-       enum { MAX_CLIENTS = 10 };
+       enum {
+               ///
+               MAX_CLIENTS = 10
+       };
+       ///
        string clients[MAX_CLIENTS];
+       ///
        int numclients;
        ///
-       LyXFunc *func;
+       LyXFunc * func;
        ///
        LyXComm pipes;
 };