X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcore.cpp;h=4d555cfc4720b59808e2357afc11d22a104ca99c;hp=4a5a64ee05c75af6958c8a6160aa4d8f63bc1fd2;hb=41dd93ccb2696dced0e27e213ee7a3a75c9044a8;hpb=8f50c6cce47eaae781de54eabb0dbff3cfc8b451 diff --git a/src/core/core.cpp b/src/core/core.cpp index 4a5a64ee..4d555cfc 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -26,6 +26,7 @@ #include "core.h" #include "coresession.h" #include "coresettings.h" +#include "quassel.h" #include "signalproxy.h" #include "sqlitestorage.h" #include "network.h" @@ -49,7 +50,7 @@ void Core::destroy() { } Core::Core() : storage(0) { - _startTime = QDateTime::currentDateTime(); // for uptime :) + _startTime = QDateTime::currentDateTime().toUTC(); // for uptime :) // Register storage backends here! registerStorageBackend(new SqliteStorage(this)); @@ -85,8 +86,9 @@ void Core::init() { } } - connect(&server, SIGNAL(newConnection()), this, SLOT(incomingConnection())); - if(!startListening(cs.port())) exit(1); // TODO make this less brutal + connect(&_server, SIGNAL(newConnection()), this, SLOT(incomingConnection())); + connect(&_v6server, SIGNAL(newConnection()), this, SLOT(incomingConnection())); + if(!startListening()) exit(1); // TODO make this less brutal } Core::~Core() { @@ -340,44 +342,48 @@ QHash Core::bufferLastSeenMsgIds(UserId user) { /*** Network Management ***/ -bool Core::startListening(uint port) { +bool Core::startListening() { bool success = false; + uint port = Quassel::optionValue("port").toUInt(); - // 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(_server.listen(QHostAddress::Any, port)) { + quInfo() << "Listening for GUI clients on IPv6 port" << _server.serverPort() << "using protocol version" << Global::protocolVersion; + success = true; + } + if(_v6server.listen(QHostAddress::AnyIPv6, port)) { + quInfo() << "Listening for GUI clients on IPv4 port" << _v6server.serverPort() << "using protocol version" << Global::protocolVersion; + success = true; } 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; + quError() << qPrintable(QString("Could not open GUI client port %1: %2").arg(port).arg(_server.errorString())); } - + return success; } void Core::stopListening() { - server.close(); + _server.close(); + _v6server.close(); quInfo() << "No longer listening for GUI clients."; } void Core::incomingConnection() { - while(server.hasPendingConnections()) { - QTcpSocket *socket = server.nextPendingConnection(); + QTcpServer *server = qobject_cast(sender()); + Q_ASSERT(server); + 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(); + if(!configured) { + _server.close(); + _v6server.close(); quDebug() << "Closing server for basic setup."; } } @@ -424,7 +430,7 @@ void Core::processClientMessage(QTcpSocket *socket, const QVariantMap &msg) { reply["CoreBuild"] = 860; // FIXME legacy reply["ProtocolVersion"] = Global::protocolVersion; // TODO: Make the core info configurable - int uptime = startTime().secsTo(QDateTime::currentDateTime()); + int uptime = startTime().secsTo(QDateTime::currentDateTime().toUTC()); int updays = uptime / 86400; uptime %= 86400; int uphours = uptime / 3600; uptime %= 3600; int upmins = uptime / 60; @@ -434,7 +440,7 @@ void Core::processClientMessage(QTcpSocket *socket, const QVariantMap &msg) { .arg(updays).arg(uphours,2,10,QChar('0')).arg(upmins,2,10,QChar('0')).arg(startTime().toString(Qt::TextDate)); #ifdef HAVE_SSL - SslServer *sslServer = qobject_cast(&server); + SslServer *sslServer = qobject_cast(&_server); QSslSocket *sslSocket = qobject_cast(socket); bool supportSsl = (bool)sslServer && (bool)sslSocket && sslServer->certIsValid(); #else @@ -487,7 +493,7 @@ void Core::processClientMessage(QTcpSocket *socket, const QVariantMap &msg) { quDebug() << "Using compression for Client:" << qPrintable(socket->peerAddress().toString()); } #endif - + } else { // for the rest, we need an initialized connection if(!clientInfo.contains(socket)) { @@ -542,7 +548,7 @@ void Core::clientDisconnected() { // DO NOT CALL ANY METHODS ON socket!! socket = static_cast(sender()); - + QHash::iterator blockSizeIter = blocksizes.begin(); while(blockSizeIter != blocksizes.end()) { if(blockSizeIter.key() == socket) {