#include "support/FileName.h"
#include "support/socktools.h"
-#include <boost/bind.hpp>
+#include "support/bind.h"
#include <cerrno>
#include <ostream>
using namespace std;
using namespace lyx::support;
-using boost::shared_ptr;
namespace lyx {
theApp()->registerSocketCallback(
fd_,
- boost::bind(&ServerSocket::serverCallback, this)
+ bind(&ServerSocket::serverCallback, this)
);
LYXERR(Debug::LYXSERVER, "lyx: New server socket "
// is OK and if the number of clients does not exceed MAX_CLIENTS
void ServerSocket::serverCallback()
{
+ if (clients.size() >= MAX_CLIENTS) {
+ writeln("BYE:Too many clients connected");
+ return;
+ }
+
int const client_fd = socktools::accept(fd_);
if (fd_ == -1) {
return;
}
- if (clients.size() >= MAX_CLIENTS) {
- writeln("BYE:Too many clients connected");
- return;
- }
-
// Register the new client.
clients[client_fd] =
shared_ptr<LyXDataSocket>(new LyXDataSocket(client_fd));
theApp()->registerSocketCallback(
client_fd,
- boost::bind(&ServerSocket::dataCallback,
+ bind(&ServerSocket::dataCallback,
this, client_fd)
);
}
// if the connection has been closed
void ServerSocket::dataCallback(int fd)
{
- shared_ptr<LyXDataSocket> client = clients[fd];
-
+ map<int, shared_ptr<LyXDataSocket> >::const_iterator it = clients.find(fd);
+ if (it == clients.end())
+ return;
+ shared_ptr<LyXDataSocket> client = it->second;
string line;
- size_t pos;
bool saidbye = false;
while (!saidbye && client->readln(line)) {
// The protocol must be programmed here
// Split the key and the data
+ size_t pos;
if ((pos = line.find(':')) == string::npos) {
client->writeln("ERROR:" + line + ":malformed message");
continue;
string const key = line.substr(0, pos);
if (key == "LYXCMD") {
string const cmd = line.substr(pos + 1);
+ FuncRequest fr(lyxaction.lookupFunc(cmd));
+ fr.setOrigin(FuncRequest::LYXSERVER);
DispatchResult dr;
- theApp()->dispatch(lyxaction.lookupFunc(cmd), dr);
+ theApp()->dispatch(fr, dr);
string const rval = to_utf8(dr.message());
if (dr.error())
client->writeln("ERROR:" + cmd + ':' + rval);