* Full author contact details are available in file CREDITS.
*/
+#include <config.h>
+
#include "lyxsocket.h"
#include "debug.h"
#include "LyXAction.h"
#include "lyxfunc.h"
-#include "frontends/lyx_gui.h"
+#include "frontends/Application.h"
#include "support/environment.h"
#include "support/lyxlib.h"
#include <cerrno>
+#if defined (_WIN32)
+# include <io.h>
+#endif
+
using boost::shared_ptr;
using std::auto_ptr;
using std::string;
+namespace lyx {
+
// Address is the unix address for the socket.
// MAX_CLIENTS is the maximum number of clients
// that can connect at the same time.
LyXServerSocket::LyXServerSocket(LyXFunc * f, string const & addr)
: func(f),
- fd_(lyx::support::socktools::listen(addr, 3)),
+ fd_(support::socktools::listen(addr, 3)),
address_(addr)
{
if (fd_ == -1) {
// These env vars are used by DVI inverse search
// Needed by xdvi
- lyx::support::setEnv("XEDITOR", "lyxclient -g %f %l");
+ support::setEnv("XEDITOR", "lyxclient -g %f %l");
// Needed by lyxclient
- lyx::support::setEnv("LYXSOCKET", address_);
+ support::setEnv("LYXSOCKET", address_);
- lyx_gui::register_socket_callback(
+ theApp->registerSocketCallback(
fd_,
boost::bind(&LyXServerSocket::serverCallback, this)
);
// Close the socket and remove the address of the filesystem.
LyXServerSocket::~LyXServerSocket()
{
- lyx_gui::unregister_socket_callback(fd_);
- ::close(fd_);
- lyx::support::unlink(address_);
+ if (fd_ != -1) {
+ theApp->unregisterSocketCallback(fd_);
+ if (::close(fd_) != 0)
+ lyxerr << "lyx: Server socket " << fd_
+ << " IO error on closing: " << strerror(errno);
+ }
+ support::unlink(address_);
lyxerr[Debug::LYXSERVER] << "lyx: Server socket quitting" << endl;
}
// is OK and if the number of clients does not exceed MAX_CLIENTS
void LyXServerSocket::serverCallback()
{
- int const client_fd = lyx::support::socktools::accept(fd_);
+ int const client_fd = support::socktools::accept(fd_);
if (fd_ == -1) {
lyxerr[Debug::LYXSERVER] << "lyx: Failed to accept new client"
// Register the new client.
clients[client_fd] =
shared_ptr<LyXDataSocket>(new LyXDataSocket(client_fd));
- lyx_gui::register_socket_callback(
+ theApp->registerSocketCallback(
client_fd,
boost::bind(&LyXServerSocket::dataCallback,
this, client_fd)
if (key == "LYXCMD") {
string const cmd = line.substr(pos + 1);
func->dispatch(lyxaction.lookupFunc(cmd));
- string const rval = func->getMessage();
+ string const rval = to_utf8(func->getMessage());
if (func->errorStat()) {
client->writeln("ERROR:" + cmd + ':' + rval);
} else {
string const linen(line + '\n');
int const size = linen.size();
int const written = ::write(fd_, linen.c_str(), size);
- if (written < size) { // Allways mean end of connection.
+ if (written < size) { // Always mean end of connection.
if ((written == -1) && (errno == EPIPE)) {
// The program will also receive a SIGPIPE
// that must be caught
LyXDataSocket::~LyXDataSocket()
{
- ::close(fd_);
+ if (::close(fd_) != 0)
+ lyxerr << "lyx: Data socket " << fd_
+ << " IO error on closing: " << strerror(errno);
- lyx_gui::unregister_socket_callback(fd_);
+ theApp->unregisterSocketCallback(fd_);
lyxerr[Debug::LYXSERVER] << "lyx: Data socket " << fd_ << " quitting."
<< endl;
}
bool LyXDataSocket::readln(string & line)
{
int const charbuf_size = 100;
- char charbuf[charbuf_size]; // buffer for the ::read() system call
+ char charbuf[charbuf_size]; // buffer for the ::read() system call
int count;
// read and store characters in buffer
string const linen(line + '\n');
int const size = linen.size();
int const written = ::write(fd_, linen.c_str(), size);
- if (written < size) { // Allways mean end of connection.
+ if (written < size) { // Always mean end of connection.
if ((written == -1) && (errno == EPIPE)) {
// The program will also receive a SIGPIPE
// that must be catched
connected_ = false;
}
}
+
+
+} // namespace lyx