-bool Core::startListening(uint port) {
- bool success = false;
-
- // let's see if ipv6 is available
- success = server.listen(QHostAddress::AnyIPv6, port);
-
- if(!success && server.serverError() == QAbstractSocket::UnsupportedSocketOperationError) {
- // fall back to v4
- success = server.listen(QHostAddress::Any, port);
- }
-
- if(!success) {
- quError() << qPrintable(QString("Could not open GUI client port %1: %2").arg(port).arg(server.errorString()));
- } else {
- quInfo() << "Listening for GUI clients on port " << server.serverPort() << " using protocol version " << Global::protocolVersion;
- }
-
- return success;
-}
-
-void Core::stopListening() {
- server.close();
- quInfo() << "No longer listening for GUI clients.";
-}
-
-void Core::incomingConnection() {
- while(server.hasPendingConnections()) {
- QTcpSocket *socket = server.nextPendingConnection();
- connect(socket, SIGNAL(disconnected()), this, SLOT(clientDisconnected()));
- connect(socket, SIGNAL(readyRead()), this, SLOT(clientHasData()));
- connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketError(QAbstractSocket::SocketError)));
-
- QVariantMap clientInfo;
- blocksizes.insert(socket, (quint32)0);
- quInfo() << qPrintable(tr("Client connected from ")) << qPrintable(socket->peerAddress().toString());
-
- if (!configured) {
- server.close();
- quDebug() << "Closing server for basic setup.";
- }
- }
-}
-
-void Core::clientHasData() {
- QTcpSocket *socket = dynamic_cast<QTcpSocket*>(sender());
- Q_ASSERT(socket && blocksizes.contains(socket));
- QVariant item;
- while(SignalProxy::readDataFromDevice(socket, blocksizes[socket], item)) {
- QVariantMap msg = item.toMap();
- processClientMessage(socket, msg);
- if(!blocksizes.contains(socket)) break; // this socket is no longer ours to handle!
- }
-}
-
-void Core::processClientMessage(QTcpSocket *socket, const QVariantMap &msg) {
- if(!msg.contains("MsgType")) {
- // Client is way too old, does not even use the current init format
- quWarning() << qPrintable(tr("Antique client trying to connect... refusing."));
- socket->close();
- return;
- }
- // OK, so we have at least an init message format we can understand
- if(msg["MsgType"] == "ClientInit") {
- QVariantMap reply;
-
- // Just version information -- check it!
- uint ver = 0;
- if(!msg.contains("ProtocolVersion") && msg["ClientBuild"].toUInt() >= 732) ver = 1; // FIXME legacy
- if(msg.contains("ProtocolVersion")) ver = msg["ProtocolVersion"].toUInt();
- if(ver < Global::coreNeedsProtocol) {
- reply["MsgType"] = "ClientInitReject";
- reply["Error"] = tr("<b>Your Quassel Client is too old!</b><br>"
- "This core needs at least client/core protocol version %1.<br>"
- "Please consider upgrading your client.").arg(Global::coreNeedsProtocol);
- SignalProxy::writeDataToDevice(socket, reply);
- quWarning() << qPrintable(tr("Client")) << qPrintable(socket->peerAddress().toString()) << qPrintable(tr("too old, rejecting."));
- socket->close(); return;
- }
-
- reply["CoreVersion"] = Global::quasselVersion;
- reply["CoreDate"] = Global::quasselBuildDate;
- reply["CoreBuild"] = 860; // FIXME legacy
- reply["ProtocolVersion"] = Global::protocolVersion;
- // TODO: Make the core info configurable
- int uptime = startTime().secsTo(QDateTime::currentDateTime());
- int updays = uptime / 86400; uptime %= 86400;
- int uphours = uptime / 3600; uptime %= 3600;
- int upmins = uptime / 60;
- reply["CoreInfo"] = tr("<b>Quassel Core Version %1</b><br>"
- "Built: %2<br>"
- "Up %3d%4h%5m (since %6)").arg(Global::quasselVersion).arg(Global::quasselBuildDate)
- .arg(updays).arg(uphours,2,10,QChar('0')).arg(upmins,2,10,QChar('0')).arg(startTime().toString(Qt::TextDate));
-
-#ifndef QT_NO_OPENSSL
- SslServer *sslServer = qobject_cast<SslServer *>(&server);
- QSslSocket *sslSocket = qobject_cast<QSslSocket *>(socket);
- bool supportSsl = (bool)sslServer && (bool)sslSocket && sslServer->certIsValid();
-#else
- bool supportSsl = false;
-#endif