// -*- 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
+/**
+ * \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 "LString.h"
+
+#include <boost/signals/trackable.hpp>
+
class LyXFunc;
class LyXServer;
messages, and callback-function that will be called with the messages.
When you want to send, use "send()".
This class encapsulates all the dirty communication and thus provides
- a clean LString interface.
+ 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 *, LString const &);
+ typedef void (*ClientCallbackfct)(LyXServer *, string const &);
/// Construct with pipe-basename and callback to receive messages
- LyXComm(LString 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();
}
closeConnection();
}
+ /// clean up in emergency
+ void emergencyCleanup();
+
/// Send message
- void send(LString const &);
+ 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;
bool ready;
/// Base of pipename including path
- LString pipename;
+ string pipename;
/// The client
LyXServer * client;
/* --- 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, LString 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(LString const &);
+ void notifyClient(string const &);
+
+ /// whilst crashing etc.
+ void emergencyCleanup() {
+ pipes.emergencyCleanup();
+ }
+
private:
///
- static void callback(LyXServer *, LString const & msg);
+ static void callback(LyXServer *, string const & msg);
/// Names and number of current clients
- enum { MAX_CLIENTS = 10 };
- LString clients[MAX_CLIENTS];
+ enum {
+ ///
+ MAX_CLIENTS = 10
+ };
+ ///
+ string clients[MAX_CLIENTS];
+ ///
int numclients;
///
- LyXFunc *func;
+ LyXFunc * func;
///
LyXComm pipes;
};