X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=core%2Fcoreproxy.cpp;h=5ae8d96137ae1f7f3736ef6d1868c690f72431ae;hp=ab0038429558609bb7d45be122a3c6345f19469b;hb=2c9184c37fc54adb7670ea261a8e34c99a82a285;hpb=31d998779868a1b572972168b2e813893d70ab90 diff --git a/core/coreproxy.cpp b/core/coreproxy.cpp index ab003842..5ae8d961 100644 --- a/core/coreproxy.cpp +++ b/core/coreproxy.cpp @@ -18,16 +18,133 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#include "coreproxy.h" #include +#include "coreproxy.h" +#include "global.h" +#include "util.h" +#include "core.h" + CoreProxy::CoreProxy() { if(coreProxy) qFatal("Trying to instantiate more than one CoreProxy object!"); + coreProxy = this; + core = new Core(); + + connect(global, SIGNAL(dataPutLocally(QString)), this, SLOT(updateGlobalData(QString))); + connect(&server, SIGNAL(newConnection()), this, SLOT(incomingConnection())); + if(!server.listen(QHostAddress::Any, 4242)) { + qFatal(QString(QString("Could not open GUI client port %1: %2").arg(4242).arg(server.errorString())).toAscii()); + } + qDebug() << "Listening for GUI clients on port" << server.serverPort() << "."; +} + +void CoreProxy::incomingConnection() { + QTcpSocket *socket = server.nextPendingConnection(); + connect(socket, SIGNAL(disconnected()), this, SLOT(clientDisconnected())); + connect(socket, SIGNAL(readyRead()), this, SLOT(clientHasData())); + clients.append(socket); + blockSizes.insert(socket, (quint32)0); + qDebug() << "Client connected from " << socket->peerAddress().toString(); +} + +void CoreProxy::clientHasData() { + QTcpSocket *socket = dynamic_cast(sender()); + Q_ASSERT(socket && blockSizes.contains(socket)); + quint32 bsize = blockSizes.value(socket); + QVariant item; + while(readDataFromDevice(socket, bsize, item)) { + QList sigdata = item.toList(); + Q_ASSERT(sigdata.size() == 4); + switch((GUISignal)sigdata[0].toInt()) { + case GS_CLIENT_INIT: processClientInit(socket, sigdata[1]); break; + case GS_UPDATE_GLOBAL_DATA: processClientUpdate(socket, sigdata[1].toString(), sigdata[2]); break; + //case GS_CLIENT_READY: processClientReady(sigdata[1], sigdata[2], sigdata[3]); break; + default: recv((GUISignal)sigdata[0].toInt(), sigdata[1], sigdata[2], sigdata[3]); break; + } + blockSizes[socket] = bsize = 0; + } + blockSizes[socket] = bsize; +} + +void CoreProxy::clientDisconnected() { + QTcpSocket *socket = dynamic_cast(sender()); + blockSizes.remove(socket); + clients.removeAll(socket); + qDebug() << "Client disconnected."; +} + +void CoreProxy::processClientInit(QTcpSocket *socket, const QVariant &v) { + VarMap msg = v.toMap(); + if(msg["GUIProtocol"].toUInt() != GUI_PROTOCOL) { + qDebug() << "Client version mismatch. Disconnecting."; + socket->close(); + return; + } + VarMap reply; + VarMap coreData; + QStringList dataKeys = global->getKeys(); + QString key; + foreach(key, dataKeys) { + coreData[key] = global->getData(key); + } + reply["CoreData"] = coreData; + /* + VarMap bl; + QHash > log = core->getBackLog(); + foreach(QString net, log.keys()) { + QByteArray buf; + QDataStream out(&buf, QIODevice::WriteOnly); out.setVersion(QDataStream::Qt_4_2); + foreach(Message msg, log[net]) { out << msg; } + bl[net] = buf; + } + reply["CoreBackLog"] = bl; + */ + QList bufs; + foreach(BufferId id, core->getBuffers()) { bufs.append(QVariant::fromValue(id)); } + reply["CoreBuffers"] = bufs; + QList sigdata; + sigdata.append(CS_CORE_STATE); sigdata.append(QVariant(reply)); sigdata.append(QVariant()); sigdata.append(QVariant()); + writeDataToDevice(socket, QVariant(sigdata)); + emit requestServerStates(); +} + +void CoreProxy::processClientUpdate(QTcpSocket *socket, QString key, QVariant data) { + global->updateData(key, data); + QList sigdata; + sigdata.append(CS_UPDATE_GLOBAL_DATA); sigdata.append(key); sigdata.append(data); sigdata.append(QVariant()); + QTcpSocket *s; + foreach(s, clients) { + if(s != socket) writeDataToDevice(s, QVariant(sigdata)); + } +} + +void CoreProxy::updateGlobalData(QString key) { + QVariant data = global->getData(key); + emit csUpdateGlobalData(key, data); +} +void CoreProxy::send(CoreSignal sig, QVariant arg1, QVariant arg2, QVariant arg3) { + sendToGUI(sig, arg1, arg2, arg3); + QList sigdata; + sigdata.append(sig); sigdata.append(arg1); sigdata.append(arg2); sigdata.append(arg3); + //qDebug() << "Sending signal: " << sigdata; + QTcpSocket *socket; + foreach(socket, clients) { + writeDataToDevice(socket, QVariant(sigdata)); + } } -void CoreProxy::csCoreMessage(QString s) { - send(CS_CORE_MESSAGE, s); +void CoreProxy::recv(GUISignal sig, QVariant arg1, QVariant arg2, QVariant arg3) { + //qDebug() << "[CORE] Received signal" << sig << ":" << arg1<(), arg2.toString()); break; + case GS_REQUEST_CONNECT: emit gsRequestConnect(arg1.toStringList()); break; + case GS_IMPORT_BACKLOG: emit gsImportBacklog(); break; + case GS_REQUEST_BACKLOG: emit gsRequestBacklog(arg1.value(), arg2, arg3); break; + //default: qWarning() << "Unknown signal in CoreProxy::recv: " << sig; + default: emit gsGeneric(sig, arg1, arg2, arg3); + } } CoreProxy *coreProxy;