+/*** Network Handling ***/
+
+void CoreSession::createNetwork(const NetworkInfo &info_) {
+ NetworkInfo info = info_;
+ int id;
+
+ if(!info.networkId.isValid())
+ Core::createNetwork(user(), info);
+
+ Q_ASSERT(info.networkId.isValid());
+
+ id = info.networkId.toInt();
+ Q_ASSERT(!_networks.contains(id));
+
+ Network *net = new Network(id, this);
+ connect(net, SIGNAL(connectRequested(NetworkId)), this, SLOT(connectToNetwork(NetworkId)));
+ connect(net, SIGNAL(disconnectRequested(NetworkId)), this, SLOT(disconnectFromNetwork(NetworkId)));
+ net->setNetworkInfo(info);
+ net->setProxy(signalProxy());
+ _networks[id] = net;
+ signalProxy()->synchronize(net);
+ emit networkCreated(id);
+}
+
+void CoreSession::updateNetwork(const NetworkInfo &info) {
+ if(!_networks.contains(info.networkId)) {
+ qWarning() << "Update request for unknown network received!";
+ return;
+ }
+ _networks[info.networkId]->setNetworkInfo(info);
+ Core::updateNetwork(user(), info);
+}
+
+void CoreSession::removeNetwork(NetworkId id) {
+ // Make sure the network is disconnected!
+ NetworkConnection *conn = _connections.value(id, 0);
+ if(conn) {
+ if(conn->connectionState() != Network::Disconnected) {
+ connect(conn, SIGNAL(disconnected(NetworkId)), this, SLOT(destroyNetwork(NetworkId)));
+ conn->disconnectFromIrc();
+ } else {
+ _connections.take(id)->deleteLater(); // TODO make this saner
+ destroyNetwork(id);
+ }
+ } else {
+ destroyNetwork(id);
+ }
+}
+
+void CoreSession::destroyNetwork(NetworkId id) {
+ Q_ASSERT(!_connections.contains(id));
+ Network *net = _networks.take(id);
+ if(net && Core::removeNetwork(user(), id)) {
+ emit networkRemoved(id);
+ net->deleteLater();
+ }
+}
+
+void CoreSession::removeBufferRequested(BufferId bufferId) {
+ BufferInfo bufferInfo = Core::getBufferInfo(user(), bufferId);
+ if(!bufferInfo.isValid()) {
+ qWarning() << "CoreSession::removeBufferRequested(): invalid BufferId:" << bufferId << "for User:" << user();
+ return;
+ }
+
+ if(bufferInfo.type() == BufferInfo::StatusBuffer) {
+ qWarning() << "CoreSession::removeBufferRequested(): Status Buffers cannot be removed!";
+ return;
+ }
+
+ if(bufferInfo.type() == BufferInfo::ChannelBuffer) {
+ Network *net = network(bufferInfo.networkId());
+ Q_ASSERT(net);
+ IrcChannel *chan = net->ircChannel(bufferInfo.bufferName());
+ if(chan) {
+ qWarning() << "CoreSession::removeBufferRequested(): Unable to remove Buffer for joined Channel:" << bufferInfo.bufferName();
+ return;
+ }
+ }
+ if(Core::removeBuffer(user(), bufferId))
+ emit bufferRemoved(bufferId);
+}
+
+void CoreSession::renameBuffer(const NetworkId &networkId, const QString &newName, const QString &oldName) {
+ BufferId bufferId = Core::renameBuffer(user(), networkId, newName, oldName);
+ if(bufferId.isValid()) {
+ emit bufferRenamed(bufferId, newName);
+ }
+}