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()]); } }
void ConnectionManager::connectTo(Konversation::ConnectionFlag flag, const QString& target, const QString& port, const QString& password, const QString& nick, const QString& channel, bool useSSL) { ConnectionSettings settings; if (target.startsWith(QLatin1String("irc://")) || target.startsWith(QLatin1String("ircs://"))) decodeIrcUrl(target, settings); else { decodeAddress(target, settings); Konversation::ServerSettings server = settings.server(); if (!port.isEmpty()) server.setPort(port.toInt()); if (!password.isEmpty()) server.setPassword(password); if (useSSL) server.setSSLEnabled(true); settings.setServer(server); if (!nick.isEmpty()) settings.setInitialNick(nick); if (!channel.isEmpty()) { Konversation::ChannelSettings channelSettings(channel); Konversation::ChannelList cl; cl << channelSettings; settings.setOneShotChannelList(cl); } } connectTo(flag, settings); }
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); }
void ConnectionManager::decodeIrcUrl(const QString& url, ConnectionSettings& settings) { if (!url.startsWith(QLatin1String("irc://")) && !url.startsWith(QLatin1String("ircs://"))) return; QString mangledUrl = url; mangledUrl.remove(QRegExp("^ircs?:/+")); if (mangledUrl.isEmpty()) return; // Parsing address and channel. QStringList mangledUrlSegments; mangledUrlSegments = mangledUrl.split('/', QString::KeepEmptyParts); // Check for ",isserver". if (mangledUrlSegments[0].contains(',')) { QStringList addressSegments; bool checkIfServerGroup = true; addressSegments = mangledUrlSegments[0].split(',', QString::KeepEmptyParts); if (addressSegments.filter("isserver").size() > 0) checkIfServerGroup = false; decodeAddress(addressSegments[0], settings, checkIfServerGroup); } else decodeAddress(mangledUrlSegments[0], settings); QString channel; Konversation::ChannelSettings channelSettings; // Grabbing channel from in front of potential ?key=value parameters. if (mangledUrlSegments.size() > 1) channel = mangledUrlSegments[1].section('?', 0, 0); if (!channel.isEmpty()) { // Add default prefix to channel if necessary. if (!channel.contains(QRegExp("^[#+&]{1}"))) channel = '#' + channel; channelSettings.setName(channel); } // Parsing ?key=value parameters. QString parameterString; if (mangledUrlSegments.size() > 1) parameterString = mangledUrlSegments[1].section('?', 1); if (parameterString.isEmpty() && mangledUrlSegments.size() > 2) parameterString = mangledUrlSegments[2]; if (!parameterString.isEmpty()) { QRegExp parameterCatcher; parameterCatcher.setPattern("pass=([^&]+)"); if (parameterCatcher.indexIn(parameterString) != -1) { Konversation::ServerSettings server = settings.server(); server.setPassword(parameterCatcher.cap(1)); settings.setServer(server); } parameterCatcher.setPattern("key=([^&]+)"); if (parameterCatcher.indexIn(parameterString) != -1) channelSettings.setPassword(parameterCatcher.cap(1)); } // Assigning channel. if (!channelSettings.name().isEmpty()) { Konversation::ChannelList cl; cl << channelSettings; settings.setOneShotChannelList(cl); } // Override SSL setting state with directive from URL. if (url.startsWith(QLatin1String("ircs://"))) { Konversation::ServerSettings server = settings.server(); server.setSSLEnabled(true); settings.setServer(server); } }