void ConnectionManager::handleReconnect(Server* server) { if (!Preferences::self()->autoReconnect() || m_overrideAutoReconnect) return; ConnectionSettings settings = server->getConnectionSettings(); uint reconnectCount = Preferences::self()->reconnectCount(); // For server groups, one iteration over their server list shall count as one // connection attempt. if (settings.serverGroup()) reconnectCount = reconnectCount * settings.serverGroup()->serverList().size(); if (reconnectCount == 0 || settings.reconnectCount() < reconnectCount) { if (settings.serverGroup() && settings.serverGroup()->serverList().size() > 1) { Konversation::ServerList serverList = settings.serverGroup()->serverList(); int index = serverList.indexOf(settings.server()); int size = serverList.size(); if (index == size - 1 || index == -1) settings.setServer(serverList[0]); else if (index < size - 1) settings.setServer(serverList[index+1]); server->setConnectionSettings(settings); server->getStatusView()->appendServerMessage(i18n("Info"), i18np( "Trying to connect to %2 (port <numid>%3</numid>) in 1 second.", "Trying to connect to %2 (port <numid>%3</numid>) in %1 seconds.", Preferences::self()->reconnectDelay(), settings.server().host(), QString::number(settings.server().port()))); } else { server->getStatusView()->appendServerMessage(i18n("Info"), i18np( "Trying to reconnect to %2 (port <numid>%3</numid>) in 1 second.", "Trying to reconnect to %2 (port <numid>%3</numid>) in %1 seconds.", Preferences::self()->reconnectDelay(), settings.server().host(), QString::number(settings.server().port()))); } server->getConnectionSettings().incrementReconnectCount(); server->connectToIRCServerIn(Preferences::self()->reconnectDelay()); } else { server->getConnectionSettings().setReconnectCount(0); server->getStatusView()->appendServerMessage(i18n("Error"), i18n("Reconnection attempts exceeded.")); } }
void ConnectionManager::connectTo(Konversation::ConnectionFlag flag, const QList<KUrl>& list) { QMap<QString,Konversation::ChannelList> serverChannels; QMap<QString,ConnectionSettings> serverConnections; QList<KUrl>::ConstIterator it = list.constBegin(); QList<KUrl>::ConstIterator end = list.constEnd(); for (; it != end; ++it) { ConnectionSettings settings; decodeIrcUrl(it->url(), settings); kDebug() << settings.name() << " - " << settings.server().host() << settings.server().port() << settings.server().password() << " - " << (settings.serverGroup()?settings.serverGroup()->name():""); QString sname = (settings.serverGroup() ? settings.serverGroup()->name() : (QString(settings.server().host()) + QString(':') + QString(settings.server().port()))); if (!serverChannels.contains(sname)) serverConnections[sname] = settings; serverChannels[sname] += settings.oneShotChannelList(); } // Perform the connection. QMap<QString,Konversation::ChannelList>::ConstIterator s_i = serverChannels.constBegin(); for (; s_i != serverChannels.constEnd(); ++s_i) { serverConnections[s_i.key()].setOneShotChannelList(s_i.value()); connectTo(flag, serverConnections[s_i.key()]); } }
bool ConnectionManager::reuseExistingConnection(ConnectionSettings& settings, bool interactive) { Server* dupe = 0; ConnectionDupe dupeType; bool doReuse = true; Application* konvApp = static_cast<Application *>(kapp); MainWindow* mainWindow = konvApp->getMainWindow(); QMap<int, Server*>::ConstIterator it; for (it = m_connectionList.constBegin(); it != m_connectionList.constEnd(); ++it) { if (it.value()->getServerGroup() && settings.serverGroup() && it.value()->getServerGroup() == settings.serverGroup()) { dupe = it.value(); dupeType = SameServerGroup; break; } } if (!dupe) { for (it = m_connectionList.constBegin(); it != m_connectionList.constEnd(); ++it) { if (it.value()->getConnectionSettings().server() == settings.server()) { dupe = it.value(); dupeType = SameServer; break; } } } if (dupe && interactive) { int result = KMessageBox::warningContinueCancel( mainWindow, i18n("You are already connected to %1. Do you want to open another connection?", dupe->getDisplayName()), i18n("Already connected to %1", dupe->getDisplayName()), KGuiItem(i18n("Create connection")), KStandardGuiItem::cancel(), QString("ReuseExistingConnection")); if (result == KMessageBox::Continue) doReuse = false; } if (dupe && doReuse) { if (interactive && dupeType == SameServerGroup && !(dupe->getConnectionSettings().server() == settings.server())) { int result = KMessageBox::warningContinueCancel( mainWindow, i18n("You are presently connected to %1 via '%2' (port <numid>%3</numid>). Do you want to switch to '%4' (port <numid>%5</numid>) instead?", dupe->getDisplayName(), dupe->getServerName(), dupe->getPort(), settings.server().host(), settings.server().port()), i18n("Already connected to %1", dupe->getDisplayName()), KGuiItem(i18n("Switch Server")), KStandardGuiItem::cancel(), "ReconnectWithDifferentServer"); if (result == KMessageBox::Continue) { dupe->disconnectServer(); dupe->setConnectionSettings(settings); } } if (!dupe->isConnected()) { if (!settings.oneShotChannelList().isEmpty()) dupe->updateAutoJoin(settings.oneShotChannelList()); if (!dupe->isConnecting()) dupe->reconnectServer(); } else { if (!settings.oneShotChannelList().isEmpty()) { Konversation::ChannelList::ConstIterator it = settings.oneShotChannelList().constBegin(); Konversation::ChannelList::ConstIterator itend = settings.oneShotChannelList().constEnd(); for ( ; it != itend; ++it ) { dupe->sendJoinCommand((*it).name(), (*it).password()); } settings.clearOneShotChannelList(); } } } return (dupe && doReuse); }