- }
-}
-
-void NetworksSettingsPage::clientIdentityUpdated() {
- const Identity *identity = qobject_cast<const Identity *>(sender());
- if(!identity) {
- qWarning() << "NetworksSettingsPage: Invalid identity to update!";
- return;
- }
- int row = ui.identityList->findData(identity->id().toInt());
- if(row < 0) {
- qWarning() << "NetworksSettingsPage: Invalid identity to update!";
- return;
- }
- if(ui.identityList->itemText(row) != identity->identityName()) {
- ui.identityList->setItemText(row, identity->identityName());
- }
-}
-
-void NetworksSettingsPage::clientIdentityRemoved(IdentityId id) {
- ui.identityList->removeItem(ui.identityList->findData(id.toInt()));
- foreach(NetworkInfo info, networkInfos.values()) {
- if(info.identity == id) info.identity = 1; // set to default
- }
- widgetHasChanged();
-}
-
-
-void NetworksSettingsPage::clientNetworkAdded(NetworkId id) {
- insertNetwork(id);
- connect(Client::network(id), SIGNAL(updatedRemotely()), this, SLOT(clientNetworkUpdated()));
-}
-
-void NetworksSettingsPage::clientNetworkUpdated() {
- const Network *net = qobject_cast<const Network *>(sender());
- if(!net) {
- qWarning() << "Update request for unknown network received!";
- return;
- }
- QListWidgetItem *item = networkItem(net->networkId());
- if(!item) return;
- item->setText(net->networkName());
- if(net->isConnected()) {
- item->setIcon(connectedIcon);
- } else {
- item->setIcon(disconnectedIcon);
- }
-}
-
-
-void NetworksSettingsPage::insertNetwork(NetworkId id) {
- NetworkInfo info = Client::network(id)->networkInfo();
- networkInfos[id] = info;
- QListWidgetItem *item = new QListWidgetItem(disconnectedIcon, info.networkName);
- item->setData(Qt::UserRole, QVariant::fromValue<NetworkId>(id));
- ui.networkList->addItem(item);
- if(Client::network(id)->isConnected()) {
- item->setIcon(connectedIcon);
- } else {
- item->setIcon(disconnectedIcon);
- }
- widgetHasChanged();
-}
-
-void NetworksSettingsPage::displayNetwork(NetworkId id, bool dontsave) {
- NetworkInfo info = networkInfos[id];
- ui.serverList->clear();
- foreach(QVariantMap v, info.serverList) {
- ui.serverList->addItem(QString("%1:%2").arg(v["Address"].toString()).arg(v["Port"].toUInt()));
- }
+}
+
+
+void NetworksSettingsPage::clientIdentityUpdated()
+{
+ const Identity *identity = qobject_cast<const Identity *>(sender());
+ if (!identity) {
+ qWarning() << "NetworksSettingsPage: Invalid identity to update!";
+ return;
+ }
+ int row = ui.identityList->findData(identity->id().toInt());
+ if (row < 0) {
+ qWarning() << "NetworksSettingsPage: Invalid identity to update!";
+ return;
+ }
+ if (ui.identityList->itemText(row) != identity->identityName()) {
+ ui.identityList->setItemText(row, identity->identityName());
+ }
+}
+
+
+void NetworksSettingsPage::clientIdentityRemoved(IdentityId id)
+{
+ IdentityId defaultId = defaultIdentity();
+ if (currentId != 0) saveToNetworkInfo(networkInfos[currentId]);
+ foreach(NetworkInfo info, networkInfos.values()) {
+ if (info.identity == id) {
+ if (info.networkId == currentId)
+ ui.identityList->setCurrentIndex(0);
+ info.identity = defaultId;
+ networkInfos[info.networkId] = info;
+ if (info.networkId > 0) Client::updateNetwork(info);
+ }
+ }
+ ui.identityList->removeItem(ui.identityList->findData(id.toInt()));
+ widgetHasChanged();
+}
+
+
+QListWidgetItem *NetworksSettingsPage::networkItem(NetworkId id) const
+{
+ for (int i = 0; i < ui.networkList->count(); i++) {
+ QListWidgetItem *item = ui.networkList->item(i);
+ if (item->data(Qt::UserRole).value<NetworkId>() == id) return item;
+ }
+ return 0;
+}
+
+
+void NetworksSettingsPage::clientNetworkAdded(NetworkId id)
+{
+ insertNetwork(id);
+ //connect(Client::network(id), SIGNAL(updatedRemotely()), this, SLOT(clientNetworkUpdated()));
+ connect(Client::network(id), SIGNAL(configChanged()), this, SLOT(clientNetworkUpdated()));
+
+ connect(Client::network(id), SIGNAL(connectionStateSet(Network::ConnectionState)), this, SLOT(networkConnectionStateChanged(Network::ConnectionState)));
+ connect(Client::network(id), SIGNAL(connectionError(const QString &)), this, SLOT(networkConnectionError(const QString &)));
+
+ // Handle capability changes in case a server dis/connects with the settings window open.
+ connect(Client::network(id), SIGNAL(capAdded(const QString &)), this, SLOT(clientNetworkCapsUpdated()));
+ connect(Client::network(id), SIGNAL(capRemoved(const QString &)), this, SLOT(clientNetworkCapsUpdated()));
+}
+
+
+void NetworksSettingsPage::clientNetworkUpdated()
+{
+ const Network *net = qobject_cast<const Network *>(sender());
+ if (!net) {
+ qWarning() << "Update request for unknown network received!";
+ return;
+ }
+ networkInfos[net->networkId()] = net->networkInfo();
+ setItemState(net->networkId());
+ if (net->networkId() == currentId) displayNetwork(net->networkId());
+ setWidgetStates();
+ widgetHasChanged();
+}
+
+
+void NetworksSettingsPage::clientNetworkRemoved(NetworkId id)
+{
+ if (!networkInfos.contains(id)) return;
+ if (id == currentId) displayNetwork(0);
+ NetworkInfo info = networkInfos.take(id);
+ QList<QListWidgetItem *> items = ui.networkList->findItems(info.networkName, Qt::MatchExactly);
+ foreach(QListWidgetItem *item, items) {
+ if (item->data(Qt::UserRole).value<NetworkId>() == id)
+ delete ui.networkList->takeItem(ui.networkList->row(item));
+ }
+ setWidgetStates();
+ widgetHasChanged();
+}
+
+
+void NetworksSettingsPage::networkConnectionStateChanged(Network::ConnectionState state)
+{
+ Q_UNUSED(state);
+ const Network *net = qobject_cast<const Network *>(sender());
+ if (!net) return;
+ /*
+ if(net->networkId() == currentId) {
+ ui.connectNow->setEnabled(state == Network::Initialized || state == Network::Disconnected);
+ }
+ */
+ setItemState(net->networkId());
+ if (net->networkId() == currentId) {
+ // Network is currently shown. Update the capability-dependent UI in case capabilities have
+ // changed.
+ setNetworkCapStates(currentId);
+ }
+ setWidgetStates();
+}
+
+
+void NetworksSettingsPage::networkConnectionError(const QString &)
+{
+}
+
+
+QListWidgetItem *NetworksSettingsPage::insertNetwork(NetworkId id)
+{
+ NetworkInfo info = Client::network(id)->networkInfo();
+ networkInfos[id] = info;
+ return insertNetwork(info);
+}
+
+
+QListWidgetItem *NetworksSettingsPage::insertNetwork(const NetworkInfo &info)
+{
+ QListWidgetItem *item = 0;
+ QList<QListWidgetItem *> items = ui.networkList->findItems(info.networkName, Qt::MatchExactly);
+ if (!items.count()) item = new QListWidgetItem(disconnectedIcon, info.networkName, ui.networkList);
+ else {
+ // we overwrite an existing net if it a) has the same name and b) has a negative ID meaning we created it locally before
+ // -> then we can be sure that this is the core-side replacement for the net we created
+ foreach(QListWidgetItem *i, items) {
+ NetworkId id = i->data(Qt::UserRole).value<NetworkId>();
+ if (id < 0) { item = i; break; }
+ }
+ if (!item) item = new QListWidgetItem(disconnectedIcon, info.networkName, ui.networkList);
+ }
+ item->setData(Qt::UserRole, QVariant::fromValue<NetworkId>(info.networkId));
+ setItemState(info.networkId, item);
+ widgetHasChanged();
+ return item;
+}
+
+
+// Called when selecting 'Configure' from the buffer list
+void NetworksSettingsPage::bufferList_Open(NetworkId netId)
+{
+ QListWidgetItem *item = networkItem(netId);
+ ui.networkList->setCurrentItem(item, QItemSelectionModel::SelectCurrent);
+}
+
+
+void NetworksSettingsPage::displayNetwork(NetworkId id)
+{
+ _ignoreWidgetChanges = true;
+ if (id != 0) {
+ NetworkInfo info = networkInfos[id];
+
+#ifdef HAVE_SSL
+ // this is only needed when the core supports SASL EXTERNAL
+ if (Client::isCoreFeatureEnabled(Quassel::Feature::SaslExternal)) {
+ if (_cid) {
+ disconnect(_cid, SIGNAL(sslSettingsUpdated()), this, SLOT(sslUpdated()));
+ delete _cid;
+ }
+ _cid = new CertIdentity(*Client::identity(info.identity), this);
+ _cid->enableEditSsl(true);
+ connect(_cid, SIGNAL(sslSettingsUpdated()), this, SLOT(sslUpdated()));
+ }
+#endif
+
+ ui.identityList->setCurrentIndex(ui.identityList->findData(info.identity.toInt()));
+ ui.serverList->clear();
+ foreach(Network::Server server, info.serverList) {
+ QListWidgetItem *item = new QListWidgetItem(QString("%1:%2").arg(server.host).arg(server.port));
+ if (server.useSsl)
+ item->setIcon(icon::get("document-encrypt"));
+ ui.serverList->addItem(item);
+ }
+ //setItemState(id);
+ //ui.randomServer->setChecked(info.useRandomServer);
+ // Update the capability-dependent UI in case capabilities have changed.
+ setNetworkCapStates(id);
+ ui.performEdit->setPlainText(info.perform.join("\n"));
+ ui.autoIdentify->setChecked(info.useAutoIdentify);
+ ui.autoIdentifyService->setText(info.autoIdentifyService);
+ ui.autoIdentifyPassword->setText(info.autoIdentifyPassword);
+ ui.sasl->setChecked(info.useSasl);
+ ui.saslAccount->setText(info.saslAccount);
+ ui.saslPassword->setText(info.saslPassword);
+ if (info.codecForEncoding.isEmpty()) {
+ ui.sendEncoding->setCurrentIndex(ui.sendEncoding->findText(Network::defaultCodecForEncoding()));
+ ui.recvEncoding->setCurrentIndex(ui.recvEncoding->findText(Network::defaultCodecForDecoding()));
+ ui.serverEncoding->setCurrentIndex(ui.serverEncoding->findText(Network::defaultCodecForServer()));
+ ui.useCustomEncodings->setChecked(false);
+ }
+ else {
+ ui.sendEncoding->setCurrentIndex(ui.sendEncoding->findText(info.codecForEncoding));
+ ui.recvEncoding->setCurrentIndex(ui.recvEncoding->findText(info.codecForDecoding));
+ ui.serverEncoding->setCurrentIndex(ui.serverEncoding->findText(info.codecForServer));
+ ui.useCustomEncodings->setChecked(true);
+ }
+ ui.autoReconnect->setChecked(info.useAutoReconnect);
+ ui.reconnectInterval->setValue(info.autoReconnectInterval);
+ ui.reconnectRetries->setValue(info.autoReconnectRetries);
+ ui.unlimitedRetries->setChecked(info.unlimitedReconnectRetries);
+ ui.rejoinOnReconnect->setChecked(info.rejoinChannels);
+ // Custom rate limiting
+ ui.unlimitedMessageRate->setChecked(info.unlimitedMessageRate);
+ // Set 'ui.useCustomMessageRate' after 'ui.unlimitedMessageRate' so if the latter is
+ // disabled, 'ui.messageRateDelayFrame' will remain disabled.
+ ui.useCustomMessageRate->setChecked(info.useCustomMessageRate);
+ ui.messageRateBurstSize->setValue(info.messageRateBurstSize);
+ // Convert milliseconds (integer) into seconds (double)
+ ui.messageRateDelay->setValue(info.messageRateDelay / 1000.0f);
+ }
+ else {
+ // just clear widgets
+#ifdef HAVE_SSL
+ if (_cid) {
+ disconnect(_cid, SIGNAL(sslSettingsUpdated()), this, SLOT(sslUpdated()));
+ delete _cid;
+ }
+#endif
+ ui.identityList->setCurrentIndex(-1);
+ ui.serverList->clear();
+ ui.performEdit->clear();
+ ui.autoIdentifyService->clear();
+ ui.autoIdentifyPassword->clear();
+ ui.saslAccount->clear();
+ ui.saslPassword->clear();
+ setWidgetStates();
+ }
+ _ignoreWidgetChanges = false;
+ currentId = id;
+}
+
+
+void NetworksSettingsPage::saveToNetworkInfo(NetworkInfo &info)
+{
+ info.identity = ui.identityList->itemData(ui.identityList->currentIndex()).toInt();
+ //info.useRandomServer = ui.randomServer->isChecked();
+ info.perform = ui.performEdit->toPlainText().split("\n");
+ info.useAutoIdentify = ui.autoIdentify->isChecked();
+ info.autoIdentifyService = ui.autoIdentifyService->text();
+ info.autoIdentifyPassword = ui.autoIdentifyPassword->text();
+ info.useSasl = ui.sasl->isChecked();
+ info.saslAccount = ui.saslAccount->text();
+ info.saslPassword = ui.saslPassword->text();
+ if (!ui.useCustomEncodings->isChecked()) {
+ info.codecForEncoding.clear();
+ info.codecForDecoding.clear();
+ info.codecForServer.clear();
+ }
+ else {
+ info.codecForEncoding = ui.sendEncoding->currentText().toLatin1();
+ info.codecForDecoding = ui.recvEncoding->currentText().toLatin1();
+ info.codecForServer = ui.serverEncoding->currentText().toLatin1();
+ }
+ info.useAutoReconnect = ui.autoReconnect->isChecked();
+ info.autoReconnectInterval = ui.reconnectInterval->value();
+ info.autoReconnectRetries = ui.reconnectRetries->value();
+ info.unlimitedReconnectRetries = ui.unlimitedRetries->isChecked();
+ info.rejoinChannels = ui.rejoinOnReconnect->isChecked();
+ // Custom rate limiting
+ info.useCustomMessageRate = ui.useCustomMessageRate->isChecked();
+ info.messageRateBurstSize = ui.messageRateBurstSize->value();
+ // Convert seconds (double) into milliseconds (integer)
+ info.messageRateDelay = static_cast<quint32>((ui.messageRateDelay->value() * 1000));
+ info.unlimitedMessageRate = ui.unlimitedMessageRate->isChecked();
+}