X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fclientsyncer.cpp;h=2b532705e439ca5a2f1f46e7045fdfd44e6e1e0d;hp=601bff0368eb534f5ec1f03c2f33bc017b11d637;hb=e5f3a784b8c6e6b4fe9b299c3a3553f31fba5601;hpb=8010224cf5bfe5685dc2cf535e8dc1ec19c4c364 diff --git a/src/client/clientsyncer.cpp b/src/client/clientsyncer.cpp index 601bff03..2b532705 100644 --- a/src/client/clientsyncer.cpp +++ b/src/client/clientsyncer.cpp @@ -20,26 +20,29 @@ #include "clientsyncer.h" +#ifndef QT_NO_NETWORKPROXY +# include +#endif + #include "client.h" -#include "global.h" #include "identity.h" #include "ircuser.h" #include "ircchannel.h" #include "network.h" +#include "networkmodel.h" +#include "quassel.h" #include "signalproxy.h" - -ClientSyncer::ClientSyncer(QObject *parent) : QObject(parent) { +ClientSyncer::ClientSyncer(QObject *parent) + : QObject(parent) +{ socket = 0; blockSize = 0; connect(Client::signalProxy(), SIGNAL(disconnected()), this, SLOT(coreSocketDisconnected())); - } ClientSyncer::~ClientSyncer() { - - } void ClientSyncer::coreHasData() { @@ -72,23 +75,12 @@ void ClientSyncer::coreHasData() { emit loginSuccess(); } else if(msg["MsgType"] == "SessionInit") { sessionStateReceived(msg["SessionState"].toMap()); + break; // this is definitively the last message we process here! } else { emit connectionError(tr("Invalid data received from core!
Disconnecting.")); disconnectFromCore(); return; } - /* - if (!msg["StartWizard"].toBool()) { - recvCoreState(msg["Reply"]); - } else { - qWarning("Core not configured!"); - qDebug() << "Available storage providers: " << msg["StorageProviders"].toStringList(); - emit showConfigWizard(msg); - } - blockSize = 0; - return; - } - */ } if(blockSize > 0) { emit recvPartialItem(socket->bytesAvailable(), blockSize); @@ -96,6 +88,7 @@ void ClientSyncer::coreHasData() { } void ClientSyncer::coreSocketError(QAbstractSocket::SocketError) { + qDebug() << "coreSocketError" << socket << socket->errorString(); emit connectionError(socket->errorString()); socket->deleteLater(); } @@ -129,7 +122,23 @@ void ClientSyncer::connectToCore(const QVariantMap &conn) { //clientMode = RemoteCore; //emit coreConnectionMsg(tr("Connecting...")); Q_ASSERT(!socket); + +#ifdef HAVE_SSL + QSslSocket *sock = new QSslSocket(Client::instance()); +#else + if(conn["useSsl"].toBool()) { + emit connectionError(tr("This client is built without SSL Support!
Disable the usage of SSL in the account settings.")); + emit encrypted(false); + return; + } QTcpSocket *sock = new QTcpSocket(Client::instance()); +#endif +#ifndef QT_NO_NETWORKPROXY + if(conn.contains("useProxy") && conn["useProxy"].toBool()) { + QNetworkProxy proxy((QNetworkProxy::ProxyType)conn["proxyType"].toInt(), conn["proxyHost"].toString(), conn["proxyPort"].toUInt(), conn["proxyUser"].toString(), conn["proxyPassword"].toString()); + sock->setProxy(proxy); + } +#endif socket = sock; connect(sock, SIGNAL(readyRead()), this, SLOT(coreHasData())); connect(sock, SIGNAL(connected()), this, SLOT(coreSocketConnected())); @@ -147,10 +156,16 @@ void ClientSyncer::coreSocketConnected() { //emit coreConnectionMsg(tr("Synchronizing to core...")); QVariantMap clientInit; clientInit["MsgType"] = "ClientInit"; - clientInit["ClientVersion"] = Global::quasselVersion; - clientInit["ClientDate"] = Global::quasselDate; - clientInit["ClientBuild"] = Global::quasselBuild; // this is a minimum, since we probably won't update for every commit - clientInit["UseSsl"] = false; // FIXME implement SSL + clientInit["ClientVersion"] = Quassel::buildInfo().fancyVersionString; + clientInit["ClientDate"] = Quassel::buildInfo().buildDate; + clientInit["ProtocolVersion"] = Quassel::buildInfo().protocolVersion; + clientInit["UseSsl"] = coreConnectionInfo["useSsl"]; +#ifndef QT_NO_COMPRESS + clientInit["UseCompression"] = true; +#else + clientInit["UseCompression"] = false; +#endif + SignalProxy::writeDataToDevice(socket, clientInit); } @@ -162,21 +177,45 @@ void ClientSyncer::coreSocketDisconnected() { coreConnectionInfo.clear(); netsToSync.clear(); - channelsToSync.clear(); - usersToSync.clear(); blockSize = 0; //restartPhaseNull(); } void ClientSyncer::clientInitAck(const QVariantMap &msg) { // Core has accepted our version info and sent its own. Let's see if we accept it as well... - if(msg["CoreBuild"].toUInt() < Global::coreBuildNeeded) { + uint ver = msg["ProtocolVersion"].toUInt(); + if(ver < Quassel::buildInfo().clientNeedsProtocol) { emit connectionError(tr("The Quassel Core you are trying to connect to is too old!
" - "Need at least a Core Version %1 (Build >= %2) to connect.").arg(Global::quasselVersion).arg(Global::coreBuildNeeded)); + "Need at least core/client protocol v%1 to connect.").arg(Quassel::buildInfo().clientNeedsProtocol)); disconnectFromCore(); return; } emit connectionMsg(msg["CoreInfo"].toString()); + +#ifdef HAVE_SSL + if(coreConnectionInfo["useSsl"].toBool()) { + if(msg["SupportSsl"].toBool()) { + QSslSocket *sslSocket = qobject_cast(socket); + Q_ASSERT(sslSocket); + connect(sslSocket, SIGNAL(sslErrors(const QList &)), this, SLOT(sslErrors(const QList &))); + sslSocket->startClientEncryption(); + emit encrypted(true); + Client::instance()->setSecuredConnection(); + } else { + emit connectionError(tr("The Quassel Core you are trying to connect to does not support SSL!
If you want to connect anyways, disable the usage of SSL in the account settings.")); + emit encrypted(false); + disconnectFromCore(); + return; + } + } +#endif + +#ifndef QT_NO_COMPRESS + if(msg["SupportsCompression"].toBool()) { + socket->setProperty("UseCompression", true); + } +#endif + if(!msg["Configured"].toBool()) { // start wizard emit startCoreSetup(msg["StorageBackends"].toList()); @@ -220,17 +259,17 @@ void ClientSyncer::syncToCore(const QVariantMap &sessionState) { // create buffers // FIXME: get rid of this crap QVariantList bufferinfos = sessionState["BufferInfos"].toList(); - foreach(QVariant vinfo, bufferinfos) Client::buffer(vinfo.value()); // create Buffers and BufferItems + NetworkModel *networkModel = Client::networkModel(); + Q_ASSERT(networkModel); + foreach(QVariant vinfo, bufferinfos) + networkModel->bufferUpdated(vinfo.value()); // create BufferItems QVariantList networkids = sessionState["NetworkIds"].toList(); - // prepare sync progress thingys... FIXME: Care about removal of networks + // prepare sync progress thingys... + // FIXME: Care about removal of networks numNetsToSync = networkids.count(); - numChannelsToSync = 0; //sessionState["IrcChannelCount"].toUInt(); - numUsersToSync = 0; // sessionState["IrcUserCount"].toUInt(); qDebug() << numUsersToSync; emit networksProgress(0, numNetsToSync); - emit channelsProgress(0, numChannelsToSync); - emit ircUsersProgress(0, numUsersToSync); // create network objects foreach(QVariant networkid, networkids) { @@ -238,12 +277,6 @@ void ClientSyncer::syncToCore(const QVariantMap &sessionState) { Network *net = new Network(netid, Client::instance()); netsToSync.insert(net); connect(net, SIGNAL(initDone()), this, SLOT(networkInitDone())); - connect(net, SIGNAL(ircUserInitDone(IrcUser *)), this, SLOT(ircUserInitDone(IrcUser *))); - connect(net, SIGNAL(ircUserAdded(IrcUser *)), this, SLOT(ircUserAdded(IrcUser *))); - connect(net, SIGNAL(ircUserRemoved(QObject *)), this, SLOT(ircUserRemoved(QObject *))); - connect(net, SIGNAL(ircChannelInitDone(IrcChannel *)), this, SLOT(ircChannelInitDone(IrcChannel *))); - connect(net, SIGNAL(ircChannelAdded(IrcChannel *)), this, SLOT(ircChannelAdded(IrcChannel *))); - connect(net, SIGNAL(ircChannelRemoved(QObject *)), this, SLOT(ircChannelRemoved(QObject *))); Client::addNetwork(net); } checkSyncState(); @@ -255,83 +288,21 @@ void ClientSyncer::networkInitDone() { checkSyncState(); } -void ClientSyncer::ircChannelInitDone(IrcChannel *chan) { - channelsToSync.remove(chan); - emit channelsProgress(numChannelsToSync - channelsToSync.count(), numChannelsToSync); - checkSyncState(); -} - -void ClientSyncer::ircChannelAdded(IrcChannel *chan) { - if(!chan->isInitialized()) { - channelsToSync.insert(chan); - numChannelsToSync++; - emit channelsProgress(numChannelsToSync - channelsToSync.count(), numChannelsToSync); - checkSyncState(); - } -} - -void ClientSyncer::ircChannelRemoved(QObject *chan) { - if(channelsToSync.contains(chan)) { - numChannelsToSync--; - channelsToSync.remove(chan); - emit channelsProgress(numChannelsToSync - channelsToSync.count(), numChannelsToSync); - checkSyncState(); - } -} - -void ClientSyncer::ircUserInitDone(IrcUser *user) { - usersToSync.remove(user); - emit ircUsersProgress(numUsersToSync - usersToSync.count(), numUsersToSync); - checkSyncState(); -} - -void ClientSyncer::ircUserAdded(IrcUser *user) { - if(!user->isInitialized()) { - usersToSync.insert(user); - numUsersToSync++; - emit ircUsersProgress(numUsersToSync - usersToSync.count(), numUsersToSync); - checkSyncState(); - } -} - -void ClientSyncer::ircUserRemoved(QObject *user) { - if(usersToSync.contains(user)) { - numUsersToSync--; - usersToSync.remove(user); - emit ircUsersProgress(numUsersToSync - usersToSync.count(), numUsersToSync); - checkSyncState(); - } -} - void ClientSyncer::checkSyncState() { - if(usersToSync.count() + channelsToSync.count() + netsToSync.count() == 0) { - // done syncing! - /* - qDebug() << "done"; - foreach(Network *net, _networks.values()) { - //disconnect(net, 0, this, SLOT(networkInitDone())); - //disconnect(net, 0, this, SLOT(ircUserInitDone(IrcUser *))); - //disconnect(net, 0, this, SLOT(ircUserAdded(IrcUser *))); - //disconnect(net, 0, this, SLOT(ircUserRemoved(QObject *))); - //disconnect(net, 0, this, SLOT(ircChannelInitDone(IrcChannel *))); - //disconnect(net, 0, this, SLOT(ircChannelAdded(IrcChannel *))); - //disconnect(net, 0, this, SLOT(ircChannelRemoved(QObject *))); - qDebug() << "disconnecting"; - disconnect(net, SIGNAL(initDone()), this, SLOT(networkInitDone())); - disconnect(net, SIGNAL(ircUserInitDone(IrcUser *)), this, SLOT(ircUserInitDone(IrcUser *))); - disconnect(net, SIGNAL(ircUserAdded(IrcUser *)), this, SLOT(ircUserAdded(IrcUser *))); - disconnect(net, SIGNAL(ircUserRemoved(QObject *)), this, SLOT(ircUserRemoved(QObject *))); - disconnect(net, SIGNAL(ircChannelInitDone(IrcChannel *)), this, SLOT(ircChannelInitDone(IrcChannel *))); - disconnect(net, SIGNAL(ircChannelAdded(IrcChannel *)), this, SLOT(ircChannelAdded(IrcChannel *))); - disconnect(net, SIGNAL(ircChannelRemoved(QObject *)), this, SLOT(ircChannelRemoved(QObject *))); - } - */ - + if(netsToSync.isEmpty()) { Client::instance()->setSyncedToCore(); emit syncFinished(); - //emit connected(); - //emit connectionStateChanged(true); - } } +#ifdef HAVE_SSL +void ClientSyncer::sslErrors(const QList &errors) { + qDebug() << "SSL Errors:"; + foreach(QSslError err, errors) + qDebug() << " " << err; + + QSslSocket *socket = qobject_cast(sender()); + if(socket) + socket->ignoreSslErrors(); +} +#endif