#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>
#include <QCoreApplication>
#endif
#include <QThread>
return message;
}
-} // namespace anon
+} // namespace
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();
}
// 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)
LyXComm::LyXComm(string const &, Server *, ClientCallbackfct)
{}
+
void LyXComm::openConnection()
{}
void LyXComm::emergencyCleanup()
{}
+
void LyXComm::read_ready()
{}
#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;
<< '\n' << strerror(errno) << endl;
}
- if (FileName(filename).removeFile() < 0) {
+ if (!FileName(filename).removeFile()) {
lyxerr << "LyXComm: Could not remove pipe " << filename
<< '\n' << strerror(errno) << endl;
}
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");
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);
}
};
-} // namespace anon
+} // namespace
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);
int compare(char const * a, char const * b, unsigned int len)
{
- using namespace std;
return strncmp(a, b, len);
}
<< 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 const fr(lyxaction.lookupFunc(cmd), arg);
+ FuncRequest fr(lyxaction.lookupFunc(cmd), from_ascii(arg));
+ fr.setOrigin(FuncRequest::LYXSERVER);
DispatchResult dr;
theApp()->dispatch(fr, dr);
string const rval = to_utf8(dr.message());