]> git.lyx.org Git - lyx.git/blobdiff - src/Server.cpp
Amend 9f04eeae032d
[lyx.git] / src / Server.cpp
index 1a66682bc40f9e95db5cfc851fd38bb78457b299..d4a2120b6ea5e3c0550b5348a59766971259898a 100644 (file)
@@ -55,8 +55,9 @@
 #include "support/lassert.h"
 #include "support/lstrings.h"
 #include "support/os.h"
+#include "support/signals.h"
 
-#include "support/bind.h"
+#include <iostream>
 
 #ifdef _WIN32
 #include <io.h>
@@ -116,7 +117,7 @@ string errormsg(DWORD const error)
        return message;
 }
 
-} // namespace anon
+} // namespace
 
 
 DWORD WINAPI pipeServerWrapper(void * arg)
@@ -136,14 +137,14 @@ DWORD WINAPI pipeServerWrapper(void * arg)
 
 
 LyXComm::LyXComm(string const & pip, Server * cli, ClientCallbackfct ccb)
-       : stopserver_(0), pipename_(pip), client_(cli), clientcb_(ccb)
+       : 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();
 }
 
@@ -198,8 +199,8 @@ bool LyXComm::pipeServer()
        LYXERR(Debug::LYXSERVER, "LyXComm: Connection established");
        ready_ = true;
        outbuf_.erase();
-       DWORD status;
-       bool success;
+       DWORD status = 0;
+       bool success = false;
 
        while (!checkStopServer()) {
                // Indefinitely wait for the completion of an overlapped
@@ -355,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
@@ -729,10 +730,10 @@ 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();
 }
 
@@ -857,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<void> tracker = tracker_.p();
+               theApp()->registerSocketCallback(fd, [=](){
+                               if (!tracker.expired())
+                                       read_ready();
+                       });
        }
 
        return fd;
@@ -992,7 +997,7 @@ struct Sleep : QThread
        }
 };
 
-} // namespace anon
+} // namespace
 
 
 bool LyXComm::loadFilesInOtherInstance()
@@ -1157,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 << '.');
@@ -1173,7 +1178,7 @@ void Server::callback(string const & msg)
                        // connect to the lyxfunc in the single GuiView we
                        // support currently. (Lgb)
 
-                       FuncRequest fr(lyxaction.lookupFunc(cmd), arg);
+                       FuncRequest fr(lyxaction.lookupFunc(cmd), from_utf8(arg));
                        fr.setOrigin(FuncRequest::LYXSERVER);
                        DispatchResult dr;
                        theApp()->dispatch(fr, dr);