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, int serverGroupId) { ConnectionSettings settings; Konversation::ServerGroupSettingsPtr serverGroup; serverGroup = Preferences::serverGroupById(serverGroupId); if (serverGroup) { settings.setServerGroup(serverGroup); if (serverGroup->serverList().size() > 0) settings.setServer(serverGroup->serverList()[0]); } connectTo(flag, settings); }
void ServerListDialog::slotOk() { QPtrList<QListViewItem> selected = m_serverList->selectedItems(); ServerListItem * item = static_cast<ServerListItem*>(selected.first()); while (item) { if (item->isServer()) { ConnectionSettings settings; settings.setServerGroup(Preferences::serverGroupById(item->serverGroupId())); settings.setServer(item->server()); emit connectTo(Konversation::PromptToReuseConnection, settings); } else emit connectTo(Konversation::PromptToReuseConnection, item->serverGroupId()); item = static_cast<ServerListItem*>(selected.next()); } }
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); }
void ConnectionManager::decodeAddress(const QString& address, ConnectionSettings& settings, bool checkIfServerGroup) { QString host; QString port = "6667"; // Full-length IPv6 address with port // Example: RFC 2732 notation: [2001:0DB8:0000:0000:0000:0000:1428:57ab]:6666 // Example: Non-RFC 2732 notation: 2001:0DB8:0000:0000:0000:0000:1428:57ab:6666 if (address.count(':')==8) { host = address.section(':',0,-2).remove('[').remove(']'); port = address.section(':',-1); } // Full-length IPv6 address without port or not-full-length IPv6 address with port // Example: Without port, RFC 2732 notation: [2001:0DB8:0000:0000:0000:0000:1428:57ab] // Example: Without port, Non-RFC 2732 notation: 2001:0DB8:0000:0000:0000:0000:1428:57ab // Example: With port, RFC 2732 notation: [2001:0DB8::1428:57ab]:6666 else if (address.count(':')>=4) { // Last segment does not end with ], but the next to last does; // Assume not-full-length IPv6 address with port // Example: [2001:0DB8::1428:57ab]:6666 if (address.section(':',0,-2).endsWith(']') && !address.section(':',-1).endsWith(']')) { host = address.section(':',0,-2).remove('[').remove(']'); port = address.section(':',-1); } else { QString addressCopy = address; host = addressCopy.remove('[').remove(']'); } } // IPv4 address or ordinary hostname with port // Example: IPv4 address with port: 123.123.123.123:6666 // Example: Hostname with port: irc.bla.org:6666 else if (address.count(':')==1) { host = address.section(':',0,-2); port = address.section(':',-1); } else host = address; // Try to assign server group. if (checkIfServerGroup && Preferences::isServerGroup(host)) { // If host is found to be the name of a server group. int serverGroupId = Preferences::serverGroupIdsByName(host).first(); Konversation::ServerGroupSettingsPtr serverGroup; serverGroup = Preferences::serverGroupById(serverGroupId); settings.setServerGroup(serverGroup); if (serverGroup->serverList().size() > 0) settings.setServer(serverGroup->serverList()[0]); } else { QList<Konversation::ServerGroupSettingsPtr> groups = Preferences::serverGroupsByServer(host); if (!groups.isEmpty()) { // If the host is found to be part of a server group's server list. Konversation::ServerGroupSettingsPtr serverGroup = groups.first(); settings.setServerGroup(serverGroup); } Konversation::ServerSettings server; server.setHost(host); server.setPort(port.toInt()); settings.setServer(server); } }
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); } }