X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FServerSocket.cpp;h=fd903ce18fa4f69898da1516ae4d2acb5b2b2602;hb=72c304a6297311086d8fe1a17622f7b79623d3bd;hp=6d3368a517b1c44a2811f94812fa81fb04d8a8b2;hpb=377cdd5f6cc2dd67fabd0b03703d20722a9ed0ea;p=lyx.git diff --git a/src/ServerSocket.cpp b/src/ServerSocket.cpp index 6d3368a517..fd903ce18f 100644 --- a/src/ServerSocket.cpp +++ b/src/ServerSocket.cpp @@ -26,21 +26,26 @@ #include "support/debug.h" #include "support/environment.h" #include "support/FileName.h" +#include "support/lassert.h" #include "support/socktools.h" -#include +#include #include +#include #include #if defined (_WIN32) # include #endif +#ifdef HAVE_UNISTD_H +# include +#endif + using namespace std; using namespace lyx::support; -using boost::shared_ptr; namespace lyx { @@ -60,15 +65,15 @@ ServerSocket::ServerSocket(FileName const & addr) // Needed by xdvi setEnv("XEDITOR", "lyxclient -g %f %l"); // Needed by lyxclient - setEnv("LYXSOCKET", address_.absFilename()); + setEnv("LYXSOCKET", address_.absFileName()); theApp()->registerSocketCallback( fd_, - boost::bind(&ServerSocket::serverCallback, this) + bind(&ServerSocket::serverCallback, this) ); LYXERR(Debug::LYXSERVER, "lyx: New server socket " - << fd_ << ' ' << address_.absFilename()); + << fd_ << ' ' << address_.absFileName()); } @@ -90,7 +95,7 @@ ServerSocket::~ServerSocket() string const ServerSocket::address() const { - return address_.absFilename(); + return address_.absFileName(); } @@ -98,6 +103,11 @@ string const ServerSocket::address() const // is OK and if the number of clients does not exceed MAX_CLIENTS void ServerSocket::serverCallback() { + if (clients.size() >= MAX_CLIENTS) { + writeln("BYE:Too many clients connected"); + return; + } + int const client_fd = socktools::accept(fd_); if (fd_ == -1) { @@ -105,17 +115,11 @@ void ServerSocket::serverCallback() return; } - if (clients.size() >= MAX_CLIENTS) { - writeln("BYE:Too many clients connected"); - return; - } - // Register the new client. - clients[client_fd] = - shared_ptr(new LyXDataSocket(client_fd)); + clients[client_fd] = make_shared(client_fd); theApp()->registerSocketCallback( client_fd, - boost::bind(&ServerSocket::dataCallback, + bind(&ServerSocket::dataCallback, this, client_fd) ); } @@ -125,14 +129,16 @@ void ServerSocket::serverCallback() // if the connection has been closed void ServerSocket::dataCallback(int fd) { - shared_ptr client = clients[fd]; - + map >::const_iterator it = clients.find(fd); + if (it == clients.end()) + return; + shared_ptr client = it->second; string line; - size_t pos; bool saidbye = false; while (!saidbye && client->readln(line)) { // The protocol must be programmed here // Split the key and the data + size_t pos; if ((pos = line.find(':')) == string::npos) { client->writeln("ERROR:" + line + ":malformed message"); continue; @@ -141,8 +147,10 @@ void ServerSocket::dataCallback(int fd) string const key = line.substr(0, pos); if (key == "LYXCMD") { string const cmd = line.substr(pos + 1); + FuncRequest fr(lyxaction.lookupFunc(cmd)); + fr.setOrigin(FuncRequest::LYXSERVER); DispatchResult dr; - theApp()->dispatch(lyxaction.lookupFunc(cmd), dr); + theApp()->dispatch(fr, dr); string const rval = to_utf8(dr.message()); if (dr.error()) client->writeln("ERROR:" + cmd + ':' + rval); @@ -189,7 +197,7 @@ void ServerSocket::writeln(string const & line) // void ServerSocket::dump() const // { // lyxerr << "ServerSocket debug dump.\n" -// << "fd = " << fd_ << ", address = " << address_.absFilename() << ".\n" +// << "fd = " << fd_ << ", address = " << address_.absFileName() << ".\n" // << "Clients: " << clients.size() << ".\n"; // map >::const_iterator client = clients.begin(); // map >::const_iterator end = clients.end();