#include "support/lassert.h"
#include "support/lstrings.h"
#include "support/os.h"
-
-#include "support/bind.h"
+#include "support/signals.h"
#include <iostream>
return message;
}
-} // namespace anon
+} // namespace
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();
}
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
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
#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();
}
}
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;
}
};
-} // namespace anon
+} // namespace
bool LyXComm::loadFilesInOtherInstance()
{
int pipefd;
- int loaded_files = 0;
FileName const pipe(inPipeName());
+
+ if (theFilesToLoad().empty()) {
+ LYXERR0("LyX is already running in another instance\n"
+ "and 'use single instance' is active.");
+ // Wait a while for the other instance to reset the connection
+ Sleep::millisec(200);
+ pipefd = ::open(pipe.toFilesystemEncoding().c_str(), O_WRONLY);
+ if (pipefd >= 0) {
+ string const cmd = "LYXCMD:pipe:window-raise\n";
+ if (::write(pipefd, cmd.c_str(), cmd.length()) < 0)
+ LYXERR0("Cannot communicate with running instance!");
+ ::close(pipefd);
+ }
+ return true;
+ }
+
+ int loaded_files = 0;
vector<string>::iterator it = theFilesToLoad().begin();
while (it != theFilesToLoad().end()) {
FileName fname = fileSearch(string(), os::internal_path(*it),
<< 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 << '.');
// connect to the lyxfunc in the single GuiView we
// support currently. (Lgb)
- FuncRequest fr(lyxaction.lookupFunc(cmd), from_ascii(arg));
+ FuncRequest fr(lyxaction.lookupFunc(cmd), from_utf8(arg));
fr.setOrigin(FuncRequest::LYXSERVER);
DispatchResult dr;
theApp()->dispatch(fr, dr);