X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Flyxserver.C;h=82ec2164a8d2c696a0159afded7a25db6d721bdd;hb=4590c8cfab02a3bc56813cfb1f2e80bd1119af9e;hp=903e5a1ae06c95645fae673f6fabed538ba00122;hpb=0eccdd1c3613e5170deb77b22174dd0afde833e9;p=lyx.git diff --git a/src/lyxserver.C b/src/lyxserver.C index 903e5a1ae0..82ec2164a8 100644 --- a/src/lyxserver.C +++ b/src/lyxserver.C @@ -1,13 +1,13 @@ // -*- C++ -*- /* This file is part of - * ====================================================== + * ====================================================== * * LyX, The Document Processor * * Copyright 1995 Matthias Ettrich - * Copyright 1995-1998 The LyX Team. + * Copyright 1995-2001 The LyX Team. * - * ======================================================*/ + * ====================================================== */ /** Docu : To use the lyxserver define the name of the pipe in your @@ -37,8 +37,7 @@ #include -#include -#include +//#include #include #include #include @@ -51,10 +50,12 @@ #endif #include "lyxserver.h" -#include "lyxfunc.h" #include "lyx_main.h" -#include "error.h" +#include "debug.h" +#include "LyXAction.h" +#include "lyxfunc.h" #include "support/lstrings.h" +#include "support/lyxlib.h" #ifdef __EMX__ #include @@ -66,11 +67,13 @@ #include "os2_errortable.h" #endif +using std::endl; + // provide an empty mkfifo() if we do not have one. This disables the // lyxserver. #ifndef HAVE_MKFIFO -int mkfifo( char *__path, mode_t __mode ) { - return 0; +int mkfifo(char const * __path, mode_t __mode) { + return 0; } #endif @@ -79,15 +82,19 @@ int mkfifo( char *__path, mode_t __mode ) { extern LyXAction lyxaction; +// C wrapper +extern "C" void C_LyXComm_callback(int fd, void *v); + + // LyXComm class // Open pipes void LyXComm::openConnection() { - lyxerr.debug("LyXComm: Opening connection", Error::LYXSERVER); + lyxerr[Debug::LYXSERVER] << "LyXComm: Opening connection" << endl; // If we are up, that's an error if (ready) { - lyxerr.print("LyXComm: Already connected"); + lyxerr << "LyXComm: Already connected" << endl; return; } // We assume that we don't make it @@ -109,34 +116,34 @@ void LyXComm::openConnection() { NP_NOWAIT|0x01, 0600, 0600, 0); if (rc == ERROR_PIPE_BUSY) { #else - if (access(tmp.c_str(), F_OK) == 0) { + if (::access(tmp.c_str(), F_OK) == 0) { #endif - lyxerr.print("LyXComm: Pipe " + tmp + " already exists."); - lyxerr.print("If no other LyX program is active, please delete" - " the pipe by hand and try again."); - pipename = string(); + lyxerr << "LyXComm: Pipe " << tmp << " already exists.\n" + << "If no other LyX program is active, please delete" + " the pipe by hand and try again." << endl; + pipename.erase(); return; } #ifndef __EMX__ - if (mkfifo(tmp.c_str(), 0600) < 0) { - lyxerr.print("LyXComm: Could not create pipe " + tmp); - lyxerr.print(strerror(errno)); + if (::mkfifo(tmp.c_str(), 0600) < 0) { + lyxerr << "LyXComm: Could not create pipe " << tmp << '\n' + << strerror(errno) << endl; return; }; - infd = open(tmp.c_str(), O_RDONLY|O_NONBLOCK); + infd = ::open(tmp.c_str(), O_RDONLY|O_NONBLOCK); #else if (rc != NO_ERROR) { errnum = TranslateOS2Error(rc); - lyxerr.print("LyXComm: Could not create pipe " + tmp); - lyxerr.print(strerror(errnum)); + lyxerr <<"LyXComm: Could not create pipe " << tmp + << strerror(errnum) << endl; return; }; // Listen to it. rc = DosConnectNPipe(fd); if (rc != NO_ERROR && rc != ERROR_PIPE_NOT_CONNECTED) { errnum = TranslateOS2Error(rc); - lyxerr.print("LyXComm: Could not create pipe " + tmp); - lyxerr.print(strerror(errnum)); + lyxerr <<"LyXComm: Could not create pipe " << tmp + << strerror(errnum) << endl; return; }; // Imported handles can be used both with OS/2 APIs and emx @@ -144,74 +151,76 @@ void LyXComm::openConnection() { infd = _imphandle(fd); #endif if (infd < 0) { - lyxerr.print("LyXComm: Could not open pipe " + tmp); - lyxerr.print(strerror(errno)); + lyxerr << "LyXComm: Could not open pipe " << tmp << '\n' + << strerror(errno) << endl; return; } - fl_add_io_callback(infd, FL_READ, callback, (void*)this); + fl_add_io_callback(infd, FL_READ, C_LyXComm_callback, this); // --- prepare output pipe --------------------------------------- tmp = pipename + ".out"; #ifndef __EMX__ - if (access(tmp.c_str(), F_OK) == 0) { + if (::access(tmp.c_str(), F_OK) == 0) { #else rc = DosCreateNPipe(tmp.c_str(), &fd, NP_ACCESS_DUPLEX, NP_NOWAIT|0x01, 0600, 0600, 0); if (rc == ERROR_PIPE_BUSY) { #endif - lyxerr.print("LyXComm: Pipe " + tmp + " already exists."); - lyxerr.print("If no other LyX program is active, please delete" - " the pipe by hand and try again."); - pipename = string(); + lyxerr << "LyXComm: Pipe " << tmp << " already exists.\n" + << "If no other LyX program is active, please delete" + " the pipe by hand and try again." << endl; + pipename.erase(); return; } #ifndef __EMX__ - if (mkfifo(tmp.c_str(), 0600) < 0) { - lyxerr.print("LyXComm: Could not create pipe " + tmp); - lyxerr.print(strerror(errno)); + if (::mkfifo(tmp.c_str(), 0600) < 0) { + lyxerr << "LyXComm: Could not create pipe " << tmp << '\n' + << strerror(errno) << endl; return; }; - if (access(tmp.c_str(), F_OK) != 0) { - lyxerr.print("LyXComm: Pipe " + tmp + " does not exist"); + if (::access(tmp.c_str(), F_OK) != 0) { + lyxerr << "LyXComm: Pipe " << tmp + << " does not exist" << endl; return; } - outfd = open(tmp.c_str(), O_RDWR); + outfd = ::open(tmp.c_str(), O_RDWR); #else if (rc != NO_ERROR) { errnum = TranslateOS2Error(rc); - lyxerr.print("LyXComm: Could not create pipe " + tmp); - lyxerr.print(strerror(errnum)); + lyxerr << "LyXComm: Could not create pipe " << tmp << '\n' + << strerror(errnum) << endl; return; } rc = DosConnectNPipe(fd); if (rc == ERROR_BAD_PIPE) { - lyxerr.print("LyXComm: Pipe " + tmp + " does not exist"); + lyxerr << "LyXComm: Pipe " << tmp + << " does not exist" << endl; return; } if (rc != NO_ERROR && rc != ERROR_PIPE_NOT_CONNECTED) { errnum = TranslateOS2Error(rc); - lyxerr.print("LyXComm: Could not create pipe " + tmp); - lyxerr.print(strerror(errnum)); + lyxerr << "LyXComm: Could not create pipe " << tmp << '\n' + << strerror(errnum) << endl; return; } outfd = _imphandle(fd); #endif if (outfd < 0) { - lyxerr.print("LyXComm: Could not open pipe " + tmp); - lyxerr.print(strerror(errno)); + lyxerr << "LyXComm: Could not open pipe " << tmp << '\n' + << strerror(errno) << endl; return; } if (fcntl(outfd, F_SETFL, O_NONBLOCK) < 0) { - lyxerr.print("LyXComm: Could not set flags on pipe " + tmp); - lyxerr.print(strerror(errno)); + lyxerr << "LyXComm: Could not set flags on pipe " << tmp + << '\n' << strerror(errno) << endl; return; }; // We made it! ready = true; - lyxerr.debug("LyXComm: Connection established", Error::LYXSERVER); + lyxerr[Debug::LYXSERVER] << "LyXComm: Connection established" << endl; } /// Close pipes @@ -220,60 +229,60 @@ void LyXComm::closeConnection() { APIRET rc; int errnum; #endif - lyxerr.debug("LyXComm: Closing connection", Error::LYXSERVER); + lyxerr[Debug::LYXSERVER] << "LyXComm: Closing connection" << endl; if (pipename.empty()) { return; } if (!ready) { - lyxerr.print("LyXComm: Already disconnected"); + lyxerr << "LyXComm: Already disconnected" << endl; return; } - if(infd > -1) { - fl_remove_io_callback(infd, FL_READ, callback); + if (infd > -1) { + fl_remove_io_callback(infd, FL_READ, C_LyXComm_callback); string tmp = pipename + ".in"; #ifdef __EMX__ // Notify the operating system. rc = DosDisConnectNPipe(infd); if (rc != NO_ERROR) { errnum = TranslateOS2Error(rc); - lyxerr.print("LyXComm: Could not disconnect pipe " + tmp); - lyxerr.print(strerror(errnum)); + lyxerr << "LyXComm: Could not disconnect pipe " << tmp + << '\n' << strerror(errnum) << endl; return; } #endif if (close(infd) < 0) { - lyxerr.print("LyXComm: Could not close pipe " + tmp); - lyxerr.print(strerror(errno)); + lyxerr << "LyXComm: Could not close pipe " << tmp + << '\n' << strerror(errno) << endl; } #ifndef __EMX__ // OS/2 named pipes will be automatically removed. - if (unlink(tmp.c_str()) < 0){ - lyxerr.print("LyXComm: Could not remove pipe " + tmp); - lyxerr.print(strerror(errno)); + if (lyx::unlink(tmp) < 0){ + lyxerr << "LyXComm: Could not remove pipe " << tmp + << '\n' << strerror(errno) << endl; }; #endif } - if(outfd > -1) { + if (outfd > -1) { string tmp = pipename + ".out"; #ifdef __EMX__ rc = DosDisConnectNPipe(outfd); if (rc != NO_ERROR) { errnum = TranslateOS2Error(rc); - lyxerr.print("LyXComm: Could not disconnect pipe " + tmp); - lyxerr.print(strerror(errnum)); + lyxerr << "LyXComm: Could not disconnect pipe " << tmp + << '\n' << strerror(errnum) << endl; return; } #endif - if (close(outfd) < 0) { - lyxerr.print("LyXComm: Could not close pipe " + tmp); - lyxerr.print(strerror(errno)); + if (::close(outfd) < 0) { + lyxerr << "LyXComm: Could not close pipe " << tmp + << '\n' << strerror(errno) << endl; } #ifndef __EMX__ - if (unlink(tmp.c_str()) < 0){ - lyxerr.print("LyXComm: Could not remove pipe " + tmp); - lyxerr.print(strerror(errno)); + if (lyx::unlink(tmp) < 0){ + lyxerr << "LyXComm: Could not remove pipe " << tmp + << '\n' << strerror(errno) << endl; }; #endif } @@ -283,10 +292,10 @@ void LyXComm::closeConnection() { // Receives messages and sends then to client void LyXComm::callback(int fd, void *v) { - LyXComm * c = (LyXComm *) v; + LyXComm * c = static_cast(v); - if (lyxerr.debugging(Error::LYXSERVER)) { - lyxerr.print(string("LyXComm: Receiving from fd ") + tostr(fd)); + if (lyxerr.debugging(Debug::LYXSERVER)) { + lyxerr << "LyXComm: Receiving from fd " << fd << endl; } const int CMDBUFLEN = 100; @@ -298,11 +307,11 @@ void LyXComm::callback(int fd, void *v) errno = 0; int status; // the single = is intended here. - while((status = read(fd,charbuf,CMDBUFLEN-1))) + while((status = read(fd, charbuf, CMDBUFLEN-1))) {// break and return in loop - if(status > 0) // got something + if (status > 0) // got something { - charbuf[status]='\0'; // turn it into a c string + charbuf[status]= '\0'; // turn it into a c string lsbuf += strip(charbuf, '\r'); // commit any commands read while(lsbuf.find('\n') != string::npos) // while still @@ -311,30 +320,30 @@ void LyXComm::callback(int fd, void *v) { // split() grabs the entire string if // the delim /wasn't/ found. ?:-P - lsbuf=split(lsbuf, cmd,'\n'); - lyxerr.debug(string("LyXComm: status:") - + tostr(status) + ", lsbuf:" + lsbuf - + ", cmd:" + cmd, - Error::LYXSERVER); - if(!cmd.empty()) + lsbuf= split(lsbuf, cmd,'\n'); + lyxerr[Debug::LYXSERVER] + << "LyXComm: status:" << status + << ", lsbuf:" << lsbuf + << ", cmd:" << cmd << endl; + if (!cmd.empty()) c->clientcb(c->client, cmd); //\n or not \n? } } - if(errno == EAGAIN) + if (errno == EAGAIN) { // EAGAIN is not really an error , it means we're // only reading too fast for the writing process on // the other end of the pipe. errno = 0; return; // up to libforms select-loop (*crunch*) } - if(errno != 0 ) + if (errno != 0 ) { - lyxerr.print(string("LyXComm: ") + strerror(errno)); - if(!lsbuf.empty()) + lyxerr << "LyXComm: " << strerror(errno) << endl; + if (!lsbuf.empty()) { - lyxerr.print("LyxComm: truncated command: " - + lsbuf); + lyxerr << "LyxComm: truncated command: " + << lsbuf << endl; lsbuf.erase(); } break; // reset connection @@ -342,27 +351,35 @@ void LyXComm::callback(int fd, void *v) } c->closeConnection(); c->openConnection(); - errno=0; + errno= 0; } + +extern "C" void C_LyXComm_callback(int fd, void *v) +{ + LyXComm::callback(fd, v); +} + void LyXComm::send(string const & msg) { if (msg.empty()) { - lyxerr.print("LyXComm: Request to send empty string. Ignoring."); + lyxerr << "LyXComm: Request to send empty string. Ignoring." + << endl; return; } - if (lyxerr.debugging(Error::LYXSERVER)) { - lyxerr.print("LyXComm: Sending '" + msg + '\''); + if (lyxerr.debugging(Debug::LYXSERVER)) { + lyxerr << "LyXComm: Sending '" << msg << '\'' << endl; } if (pipename.empty()) return; if (!ready) { - lyxerr.print("LyXComm: Pipes are closed. Could not send "+ msg); - } else if (write(outfd, msg.c_str(), msg.length()) < 0) { - lyxerr.print("LyXComm: Error sending message: " + msg); - lyxerr.print(strerror(errno)); - lyxerr.print("LyXComm: Resetting connection"); + lyxerr << "LyXComm: Pipes are closed. Could not send " + << msg << endl; + } else if (::write(outfd, msg.c_str(), msg.length()) < 0) { + lyxerr << "LyXComm: Error sending message: " << msg + << '\n' << strerror(errno) + << "\nLyXComm: Resetting connection" << endl; closeConnection(); openConnection(); } @@ -372,8 +389,8 @@ void LyXComm::send(string const & msg) { rc = DosResetBuffer(outfd); // To avoid synchronization problems. if (rc != NO_ERROR) { errnum = TranslateOS2Error(rc); - lyxerr.print("LyXComm: Message could not be flushed: " +msg); - lyxerr.print(strerror(errnum)); + lyxerr << "LyXComm: Message could not be flushed: " << msg + << '\n' << strerror(errnum) << endl; } #endif } @@ -387,7 +404,7 @@ LyXServer::~LyXServer() // modified june 1999 by stefano@zool.su.se to send as many bye // messages as there are clients, each with client's name. string message; - for (int i=0; inumclients==MAX_CLIENTS){ //paranoid check - lyxerr.debug("LyXServer: too many clients...", Error::LYXSERVER); + if (serv->numclients == MAX_CLIENTS){ //paranoid check + lyxerr[Debug::LYXSERVER] + << "LyXServer: too many clients..." + << endl; return; } - int i=0; //find place in clients[] + int i= 0; //find place in clients[] while (!serv->clients[i].empty() && inumclients) - i++; + ++i; serv->clients[i] = client; serv->numclients++; buf = "LYXSRV:" + client + ":hello\n"; - lyxerr.debug("LyXServer: Greeting " + client, Error::LYXSERVER); + lyxerr[Debug::LYXSERVER] + << "LyXServer: Greeting " + << client << endl; serv->pipes.send(buf); } else if (cmd == "bye") { - // If clients==0 maybe we should reset the pipes + // If clients == 0 maybe we should reset the pipes // to prevent fake callbacks - int i; //look if client is registered - for (i=0; inumclients; i++) { + int i = 0; //look if client is registered + for (; i < serv->numclients; ++i) { if (serv->clients[i] == client) break; } - if (inumclients) { + if (i < serv->numclients) { serv->numclients--; serv->clients[i].erase(); - lyxerr.debug("LyXServer: Client " + client + " said goodbye", - Error::LYXSERVER); + lyxerr[Debug::LYXSERVER] + << "LyXServer: Client " + << client << " said goodbye" + << endl; } else { - lyxerr.debug("LyXServer: ignoring bye messge from unregistered client" + - client + "\n", Error::LYXSERVER); + lyxerr[Debug::LYXSERVER] + << "LyXServer: ignoring bye messge from unregistered client" + << client << endl; } } else { - lyxerr.print("LyXServer: Undefined server command " + cmd + "."); + lyxerr <<"LyXServer: Undefined server command " + << cmd << "." << endl; } return; } @@ -494,12 +524,12 @@ void LyXServer::callback(LyXServer * serv, string const & msg) // connect to the lyxfunc in the single LyXView we // support currently. (Lgb) - int action = lyxaction.LookupFunc(cmd.c_str()); + int action = lyxaction.LookupFunc(cmd); //int action = -1; string rval, buf; - if (action>=0) { - rval = serv->func->Dispatch(action, arg.c_str()); + if (action>= 0) { + rval = serv->func->Dispatch(action, arg); } else { rval = "Unknown command"; }