]> git.lyx.org Git - lyx.git/blobdiff - src/Server.cpp
* Call metrics of the parameters with the correct font in MathMacros, for example
[lyx.git] / src / Server.cpp
index 2ff2fc9434527877e84488a970e43b65ac0b6613..7d4b0c3b001af3dc26c0183bdf779cbb80018d50 100644 (file)
 #include <config.h>
 
 #include "Server.h"
-#include "debug.h"
 #include "FuncRequest.h"
 #include "LyXAction.h"
 #include "LyXFunc.h"
+
 #include "frontends/Application.h"
 
+#include "support/debug.h"
 #include "support/FileName.h"
 #include "support/lstrings.h"
-#include "support/lyxlib.h"
 
 #include <boost/bind.hpp>
 
 #endif
 #include <fcntl.h>
 
+using namespace std;
+using namespace lyx::support;
 
 namespace lyx {
 
-using support::compare;
-using support::FileName;
-using support::rtrim;
-using support::split;
-
-using std::endl;
-using std::string;
-
-
 /////////////////////////////////////////////////////////////////////
 //
 // LyXComm
@@ -79,7 +72,7 @@ using std::string;
 #if !defined (HAVE_MKFIFO)
 // We provide a stub class that disables the lyxserver.
 
-LyXComm::LyXComm(std::string const &, Server *, ClientCallbackfct)
+LyXComm::LyXComm(string const &, Server *, ClientCallbackfct)
 {}
 
 void LyXComm::openConnection()
@@ -114,7 +107,7 @@ void LyXComm::send(string const & msg)
 #else // defined (HAVE_MKFIFO)
 
 
-LyXComm::LyXComm(std::string const & pip, Server * cli, ClientCallbackfct ccb)
+LyXComm::LyXComm(string const & pip, Server * cli, ClientCallbackfct ccb)
        : pipename_(pip), client_(cli), clientcb_(ccb)
 {
        ready_ = false;
@@ -172,7 +165,7 @@ void LyXComm::closeConnection()
        }
 
        if (!ready_) {
-               lyxerr << "LyXComm: Already disconnected" << endl;
+               LYXERR0("LyXComm: Already disconnected");
                return;
        }
 
@@ -259,6 +252,12 @@ void LyXComm::read_ready()
        int const charbuf_size = 100;
        char charbuf[charbuf_size];
 
+       // As O_NONBLOCK is set, until no data is available for reading,
+       // read() doesn't block but returns -1 and set errno to EAGAIN.
+       // After a client that opened the pipe for writing, closes it
+       // (and no other client is using the pipe), read() would always
+       // return 0 and thus the connection has to be reset.
+
        errno = 0;
        int status;
        // the single = is intended here.
@@ -280,24 +279,25 @@ void LyXComm::read_ready()
                                        clientcb_(client_, cmd);
                                        //\n or not \n?
                        }
-               }
-               if (errno == EAGAIN) {
-                       errno = 0;
-                       return;
-               }
-               if (errno != 0) {
-                       lyxerr << "LyXComm: " << strerror(errno) << endl;
+               } else {
+                       if (errno == EAGAIN) {
+                               // Nothing to read, continue
+                               errno = 0;
+                               return;
+                       }
+                       // An error occurred, better bailing out
+                       LYXERR0("LyXComm: " << strerror(errno));
                        if (!read_buffer_.empty()) {
-                               lyxerr << "LyXComm: truncated command: "
-                                      << read_buffer_ << endl;
+                               LYXERR0("LyXComm: truncated command: " << read_buffer_);
                                read_buffer_.erase();
                        }
                        break; // reset connection
                }
        }
 
-       // The connection gets reset in errno != EAGAIN
-       // Why does it need to be reset if errno == 0?
+       // The connection gets reset when read() returns 0 (meaning that the
+       // last client closed the pipe) or an error occurred, in which case
+       // read() returns -1 and errno != EAGAIN.
        closeConnection();
        openConnection();
        errno = 0;
@@ -307,8 +307,7 @@ void LyXComm::read_ready()
 void LyXComm::send(string const & msg)
 {
        if (msg.empty()) {
-               lyxerr << "LyXComm: Request to send empty string. Ignoring."
-                      << endl;
+               LYXERR0("LyXComm: Request to send empty string. Ignoring.");
                return;
        }
 
@@ -317,8 +316,7 @@ void LyXComm::send(string const & msg)
        if (pipename_.empty()) return;
 
        if (!ready_) {
-               lyxerr << "LyXComm: Pipes are closed. Could not send "
-                      << msg << endl;
+               LYXERR0("LyXComm: Pipes are closed. Could not send " << msg);
        } else if (::write(outfd_, msg.c_str(), msg.length()) < 0) {
                lyxerr << "LyXComm: Error sending message: " << msg
                       << '\n' << strerror(errno)
@@ -354,7 +352,7 @@ void ServerCallback(Server * server, string const & msg)
        server->callback(msg);
 }
 
-Server::Server(LyXFunc * f, std::string const & pipes)
+Server::Server(LyXFunc * f, string const & pipes)
        : numclients_(0), func_(f), pipes_(pipes, this, &ServerCallback)
 {}
 
@@ -372,6 +370,13 @@ Server::~Server()
 }
 
 
+int compare(char const * a, char const * b, unsigned int len)
+{
+       using namespace std;
+       return strncmp(a, b, len);
+}
+
+
 // Handle data gotten from communication, called by LyXComm
 void Server::callback(string const & msg)
 {
@@ -459,8 +464,7 @@ void Server::callback(string const & msg)
                                                "Server: ignoring bye messge from unregistered client" << client);
                                }
                        } else {
-                               lyxerr <<"Server: Undefined server command "
-                                      << cmd << '.' << endl;
+                               LYXERR0("Server: Undefined server command " << cmd << '.');
                        }
                        return;
                }
@@ -499,7 +503,7 @@ void Server::callback(string const & msg)
 }
 
 
-// Send a notify messge to a client, called by WorkAreaKeyPress
+// Send a notify message to a client, called by WorkAreaKeyPress
 void Server::notifyClient(string const & s)
 {
        pipes_.send("NOTIFY:" + s + "\n");