X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FServer.cpp;h=566f8f334400b6594cf587f71f5de43016ff7326;hb=7950ace3d96543e3099aa3bde823f970a1ce6a86;hp=76ee88060bd980af2e92234ab1ebffbddb9c5f15;hpb=22ffc93467db93262e564ceb740061ba2d744a2a;p=lyx.git diff --git a/src/Server.cpp b/src/Server.cpp index 76ee88060b..566f8f3344 100644 --- a/src/Server.cpp +++ b/src/Server.cpp @@ -55,10 +55,12 @@ #include "support/lassert.h" #include "support/lstrings.h" #include "support/os.h" +#include "support/signals.h" -#include "support/bind.h" +#include #ifdef _WIN32 +#include #include #endif #include @@ -115,7 +117,7 @@ string errormsg(DWORD const error) return message; } -} // namespace anon +} // namespace DWORD WINAPI pipeServerWrapper(void * arg) @@ -135,14 +137,14 @@ DWORD WINAPI pipeServerWrapper(void * arg) LyXComm::LyXComm(string const & pip, Server * cli, ClientCallbackfct ccb) - : pipename_(pip), client_(cli), clientcb_(ccb), stopserver_(0) + : stopserver_(0), + ready_(false), pipename_(pip), client_(cli), clientcb_(ccb), + deferred_loading_(false) { for (int i = 0; i < MAX_PIPES; ++i) { event_[i] = 0; pipe_[i].handle = INVALID_HANDLE_VALUE; } - ready_ = false; - deferred_loading_ = false; openConnection(); } @@ -208,7 +210,7 @@ bool LyXComm::pipeServer() // Determine which pipe instance completed the operation. i = wait - WAIT_OBJECT_0; - LASSERT(i >= 0 && i <= MAX_PIPES, /**/); + LASSERT(i <= MAX_PIPES, /**/); // Check whether we were waked up for stopping the pipe server. if (i == MAX_PIPES) @@ -354,7 +356,7 @@ bool LyXComm::pipeServer() error = GetLastError(); - if (success && error == ERROR_IO_PENDING) { + if (success && (error == ERROR_IO_PENDING || error == NO_ERROR)) { // The write operation is still pending. // We get here when a reader is started // well before a reply is ready, so delay @@ -694,6 +696,7 @@ string const LyXComm::pipeName(DWORD index) const LyXComm::LyXComm(string const &, Server *, ClientCallbackfct) {} + void LyXComm::openConnection() {} @@ -715,6 +718,7 @@ void LyXComm::endPipe(int & fd, string const & filename, bool write) void LyXComm::emergencyCleanup() {} + void LyXComm::read_ready() {} @@ -725,12 +729,11 @@ void LyXComm::send(string const & msg) #else // defined (HAVE_MKFIFO) - LyXComm::LyXComm(string const & pip, Server * cli, ClientCallbackfct ccb) - : pipename_(pip), client_(cli), clientcb_(ccb) + : infd_(-1), outfd_(-1), + ready_(false), pipename_(pip), client_(cli), clientcb_(ccb), + deferred_loading_(false) { - ready_ = false; - deferred_loading_ = false; openConnection(); } @@ -855,8 +858,12 @@ int LyXComm::startPipe(string const & file, bool write) } if (!write) { - theApp()->registerSocketCallback(fd, - bind(&LyXComm::read_ready, this)); + // Make sure not to call read_ready after destruction. + weak_ptr tracker = tracker_.p(); + theApp()->registerSocketCallback(fd, [=](){ + if (!tracker.expired()) + read_ready(); + }); } return fd; @@ -876,7 +883,7 @@ void LyXComm::endPipe(int & fd, string const & filename, bool write) << '\n' << strerror(errno) << endl; } - if (FileName(filename).removeFile() < 0) { + if (!FileName(filename).removeFile()) { lyxerr << "LyXComm: Could not remove pipe " << filename << '\n' << strerror(errno) << endl; } @@ -914,7 +921,6 @@ void LyXComm::read_ready() int status; // the single = is intended here. while ((status = ::read(infd_, charbuf, charbuf_size - 1))) { - if (status > 0) { charbuf[status] = '\0'; // turn it into a c string read_buffer_ += rtrim(charbuf, "\r"); @@ -965,7 +971,8 @@ void LyXComm::send(string const & msg) LYXERR(Debug::LYXSERVER, "LyXComm: Sending '" << msg << '\''); - if (pipename_.empty()) return; + if (pipename_.empty()) + return; if (!ready_) { LYXERR0("LyXComm: Pipes are closed. Could not send " << msg); @@ -990,7 +997,7 @@ struct Sleep : QThread } }; -} // namespace anon +} // namespace bool LyXComm::loadFilesInOtherInstance() @@ -1014,7 +1021,8 @@ bool LyXComm::loadFilesInOtherInstance() break; string const cmd = "LYXCMD:pipe:file-open:" + fname.absFileName() + '\n'; - ::write(pipefd, cmd.c_str(), cmd.length()); + if (::write(pipefd, cmd.c_str(), cmd.length()) < 0) + LYXERR0("Cannot write to pipe!"); ::close(pipefd); ++loaded_files; it = theFilesToLoad().erase(it); @@ -1066,7 +1074,6 @@ Server::~Server() int compare(char const * a, char const * b, unsigned int len) { - using namespace std; return strncmp(a, b, len); } @@ -1155,7 +1162,7 @@ void Server::callback(string const & msg) << client << " said goodbye"); } else { LYXERR(Debug::LYXSERVER, - "Server: ignoring bye messge from unregistered client" << client); + "Server: ignoring bye message from unregistered client" << client); } } else { LYXERR0("Server: Undefined server command " << cmd << '.'); @@ -1171,7 +1178,8 @@ void Server::callback(string const & msg) // connect to the lyxfunc in the single GuiView we // support currently. (Lgb) - FuncRequest const fr(lyxaction.lookupFunc(cmd), arg); + FuncRequest fr(lyxaction.lookupFunc(cmd), from_utf8(arg)); + fr.setOrigin(FuncRequest::LYXSERVER); DispatchResult dr; theApp()->dispatch(fr, dr); string const rval = to_utf8(dr.message());