X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxserver.C;h=395ecb8b793ab91de17f878154453480fe279233;hb=f65b7ff4ab2fe8ad0d9196c231064240e3fde81f;hp=6bfed35380753279c8485c01f01465899171b69e;hpb=35584afc1162dec2cf9fff79305e95cb3b75aefb;p=lyx.git diff --git a/src/lyxserver.C b/src/lyxserver.C index 6bfed35380..395ecb8b79 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-1999 The LyX Team. + * Copyright 1995-2000 The LyX Team. * - * ======================================================*/ + * ====================================================== */ /** Docu : To use the lyxserver define the name of the pipe in your @@ -38,7 +38,6 @@ #include #include -#include #include #include #include @@ -54,7 +53,9 @@ #include "lyxfunc.h" #include "lyx_main.h" #include "debug.h" +#include "LyXAction.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,6 +82,10 @@ 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 @@ -109,21 +116,21 @@ 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 << "LyXComm: Pipe " << tmp << " already exists.\n" << "If no other LyX program is active, please delete" " the pipe by hand and try again." << endl; - pipename = string(); + pipename.erase(); return; } #ifndef __EMX__ - if (mkfifo(tmp.c_str(), 0600) < 0) { + 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); @@ -135,8 +142,8 @@ void LyXComm::openConnection() { rc = DosConnectNPipe(fd); if (rc != NO_ERROR && rc != ERROR_PIPE_NOT_CONNECTED) { errnum = TranslateOS2Error(rc); - lyxerr <<"LyXComm: Could not create pipe " + tmp); - lyxerr < -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. @@ -251,13 +258,13 @@ void LyXComm::closeConnection() { << '\n' << strerror(errno) << endl; } #ifndef __EMX__ // OS/2 named pipes will be automatically removed. - if (unlink(tmp.c_str()) < 0){ + 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); @@ -268,12 +275,12 @@ void LyXComm::closeConnection() { return; } #endif - if (close(outfd) < 0) { + if (::close(outfd) < 0) { lyxerr << "LyXComm: Could not close pipe " << tmp << '\n' << strerror(errno) << endl; } #ifndef __EMX__ - if (unlink(tmp.c_str()) < 0){ + if (lyx::unlink(tmp) < 0){ lyxerr << "LyXComm: Could not remove pipe " << tmp << '\n' << strerror(errno) << endl; }; @@ -285,7 +292,7 @@ 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(Debug::LYXSERVER)) { lyxerr << "LyXComm: Receiving from fd " << fd << endl; @@ -300,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 @@ -313,27 +320,27 @@ void LyXComm::callback(int fd, void *v) { // split() grabs the entire string if // the delim /wasn't/ found. ?:-P - lsbuf=split(lsbuf, cmd,'\n'); + lsbuf= split(lsbuf, cmd,'\n'); lyxerr[Debug::LYXSERVER] << "LyXComm: status:" << status << ", lsbuf:" << lsbuf << ", cmd:" << cmd << endl; - if(!cmd.empty()) + 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 << "LyXComm: " << strerror(errno) << endl; - if(!lsbuf.empty()) + if (!lsbuf.empty()) { lyxerr << "LyxComm: truncated command: " << lsbuf << endl; @@ -344,8 +351,14 @@ 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()) { @@ -363,7 +376,7 @@ void LyXComm::send(string const & msg) { if (!ready) { lyxerr << "LyXComm: Pipes are closed. Could not send " << msg << endl; - } else if (write(outfd, msg.c_str(), msg.length()) < 0) { + } else if (::write(outfd, msg.c_str(), msg.length()) < 0) { lyxerr << "LyXComm: Error sending message: " << msg << '\n' << strerror(errno) << "\nLyXComm: Resetting connection" << endl; @@ -376,8 +389,8 @@ void LyXComm::send(string const & msg) { rc = DosResetBuffer(outfd); // To avoid synchronization problems. if (rc != NO_ERROR) { errnum = TranslateOS2Error(rc); - lyxerr <<"LyXComm: Message could not be flushed: " +msg); - lyxerr <numclients==MAX_CLIENTS){ //paranoid check + 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"; @@ -477,13 +491,13 @@ void LyXServer::callback(LyXServer * serv, string const & msg) << 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] @@ -510,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"; }