-void Client::coreSocketConnected() {
- connect(this, SIGNAL(recvPartialItem(uint, uint)), this, SIGNAL(coreConnectionProgress(uint, uint)));
- emit coreConnectionMsg(tr("Synchronizing to core..."));
- QVariantMap clientInit;
- clientInit["GuiProtocol"] = GUI_PROTOCOL;
- clientInit["User"] = coreConnectionInfo["User"].toString();
- clientInit["Password"] = coreConnectionInfo["Password"].toString();
- SignalProxy::writeDataToDevice(socket, clientInit);
-}
-
-void Client::coreSocketDisconnected() {
- instance()->connectedToCore = false;
- emit disconnected();
- emit coreConnectionStateChanged(false);
- socket->deleteLater();
- blockSize = 0;
-
- /* Clear internal data. Hopefully nothing relies on it at this point. */
- _networkModel->clear();
-
- QHash<BufferId, Buffer *>::iterator bufferIter = _buffers.begin();
- while(bufferIter != _buffers.end()) {
- Buffer *buffer = bufferIter.value();
- disconnect(buffer, SIGNAL(destroyed()), this, 0);
- bufferIter = _buffers.erase(bufferIter);
- buffer->deleteLater();
- }
- Q_ASSERT(_buffers.isEmpty());
-
-
- QHash<NetworkId, NetworkInfo*>::iterator netIter = _networkInfo.begin();
- while(netIter != _networkInfo.end()) {
- NetworkInfo *net = netIter.value();
- disconnect(net, SIGNAL(destroyed()), this, 0);
- netIter = _networkInfo.erase(netIter);
- net->deleteLater();
- }
- Q_ASSERT(_networkInfo.isEmpty());
-
- QHash<IdentityId, Identity*>::iterator idIter = _identities.begin();
- while(idIter != _identities.end()) {
- Identity *id = idIter.value();
- emit identityRemoved(id->id());
- idIter = _identities.erase(idIter);
- id->deleteLater();
- }
- Q_ASSERT(_identities.isEmpty());
-
- coreConnectionInfo.clear();
- sessionData.clear();
- layoutQueue.clear();
- layoutTimer->stop();
-}
-
-void Client::recvCoreState(const QVariant &state) {
- disconnect(this, SIGNAL(recvPartialItem(uint, uint)), this, SIGNAL(coreConnectionProgress(uint, uint)));
- disconnect(socket, 0, this, 0); // rest of communication happens through SignalProxy
- signalProxy()->addPeer(socket);
- syncToCore(state);
-}
-
-// TODO: auth errors
-void Client::syncToCore(const QVariant &coreState) {
- if(!coreState.toMap().contains("SessionState")) {
- emit coreConnectionError(tr("Invalid data received from core!"));
- disconnectFromCore();
- return;
- }
-
- QVariantMap sessionState = coreState.toMap()["SessionState"].toMap();
-
- // store sessionData
- QVariantMap sessData = sessionState["SessionData"].toMap();
- foreach(QString key, sessData.keys())
- recvSessionData(key, sessData[key]);
-
- // create identities
- foreach(QVariant vid, sessionState["Identities"].toList()) {
- coreIdentityCreated(vid.value<Identity>());
- //Identity *id = new Identity(vid.value<Identity>(), this);
- //_identities[id->id()] = id;
- //signalProxy()->synchronize(id);
- //qDebug() << "received identity" << id->identityName();
- }
-
- // store Buffer details
- QVariantList coreBuffers = sessionState["Buffers"].toList();
- /* make lookups by id faster */
- foreach(QVariant vid, coreBuffers) {
- buffer(vid.value<BufferInfo>()); // create all buffers, so we see them in the network views
- }
-
- // create networkInfo objects
- QVariantList networkids = sessionState["Networks"].toList();
- foreach(QVariant networkid, networkids) {
- networkConnected(networkid.toUInt());
- }
-
- instance()->connectedToCore = true;
- updateCoreConnectionProgress();
-
-}
-
-void Client::updateCoreConnectionProgress() {
- // we'll do this in three steps:
- // 1.) networks
- // 2.) channels
- // 3.) ircusers
-
- int numNets = networkInfos().count();
- int numNetsWaiting = 0;
-
- int numIrcUsers = 0;
- int numIrcUsersWaiting = 0;
-
- int numChannels = 0;
- int numChannelsWaiting = 0;
-
- foreach(NetworkInfo *net, networkInfos()) {
- if(! net->initialized())
- numNetsWaiting++;
-
- numIrcUsers += net->ircUsers().count();
- foreach(IrcUser *user, net->ircUsers()) {
- if(! user->initialized())
- numIrcUsersWaiting++;