//============================================================================= // // File : OptionsWidget_connection.cpp // Creation date : Sat Nov 24 04:25:16 2001 GMT by Szymon Stefanek // // This file is part of the KVIrc IRC client distribution // Copyright (C) 2001 Szymon Stefanek (pragma at kvirc dot net) // copyright (C) 2008 Elvio Basello (hellvis69 at netsons dot org) // // This program is FREE software. You can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the HOPE that it will be USEFUL, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, write to the Free Software Foundation, // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // //============================================================================= #include "OptionsWidget_connection.h" #include "kvi_settings.h" #include "KviLocale.h" #include "KviOptions.h" #include "KviIconManager.h" #include OptionsWidget_connection::OptionsWidget_connection(QWidget * parent) : KviOptionsWidget(parent) { setObjectName("connection_options_widget"); createLayout(); KviBoolSelector * b1; KviBoolSelector * b; KviTalGroupBox * gbox = addGroupBox(0, 0, 0, 0, Qt::Horizontal, __tr2qs_ctx("On Disconnect", "options")); b1 = addBoolSelector(gbox, __tr2qs_ctx("Keep channels open", "options"), KviOption_boolKeepChannelsOpenOnDisconnect, true); mergeTip(b1, __tr2qs_ctx("This option will cause KVIrc to keep channels open after disconnect.", "options")); b1 = addBoolSelector(gbox, __tr2qs_ctx("Keep queries open", "options"), KviOption_boolKeepQueriesOpenOnDisconnect, true); mergeTip(b1, __tr2qs_ctx("This option will cause KVIrc to keep queries open after disconnect.", "options")); gbox = addGroupBox(0, 1, 0, 1, Qt::Horizontal, __tr2qs_ctx("On Unexpected Disconnect", "options")); b1 = addBoolSelector(gbox, __tr2qs_ctx("Keep channels open", "options"), KviOption_boolKeepChannelsOpenOnUnexpectedDisconnect, true); mergeTip(b1, __tr2qs_ctx("This option will cause KVIrc to keep channels open after an unexpected disconnect.", "options")); b1 = addBoolSelector(gbox, __tr2qs_ctx("Keep queries open", "options"), KviOption_boolKeepQueriesOpenOnUnexpectedDisconnect, true); mergeTip(b1, __tr2qs_ctx("This option will cause KVIrc to keep queries open after an unexpected disconnect.", "options")); b1 = addBoolSelector(gbox, __tr2qs_ctx("Rejoin channels after reconnect", "options"), KviOption_boolRejoinChannelsAfterReconnect, true); mergeTip(b1, __tr2qs_ctx("This option will cause KVIrc to rejoin channels after a successful reconnect attempt.", "options")); b1 = addBoolSelector(gbox, __tr2qs_ctx("Reopen queries after reconnect", "options"), KviOption_boolReopenQueriesAfterReconnect, true); mergeTip(b1, __tr2qs_ctx("This option will cause KVIrc to reopen query windows after a successful reconnect attempt.", "options")); b = addBoolSelector(gbox, __tr2qs_ctx("Automatically reconnect", "options"), KviOption_boolAutoReconnectOnUnexpectedDisconnect); mergeTip(b, __tr2qs_ctx("This option will enable auto-reconnecting after an unexpected disconnect. " "An unexpected disconnect is the termination of a fully connected IRC session " "that was not requested by the user by the means of the QUIT message." "

Warning: If you use /RAW to send a QUIT message to the server, " "this option will not behave correctly, since does not detect the outgoing " "QUIT message and will attempt to reconnect after the server has closed the connection. " "For this reason, always use the /QUIT command to close your connections. " "This option may also behave incorrectly with bouncers that support " "detaching, in this case a solution could be to prepare an alias that sends the " "bouncer \"detach\" command immediately before the \"quit\" command.
" "alias(bncdetach){ raw bouncer detach; quit; }

", "options")); KviUIntSelector * u = addUIntSelector(gbox, __tr2qs_ctx("Maximum attempts (0 = unlimited):", "options"), KviOption_uintMaxAutoReconnectAttempts, 0, 100, 5, KVI_OPTION_BOOL(KviOption_boolAutoReconnectOnUnexpectedDisconnect)); connect(b, SIGNAL(toggled(bool)), u, SLOT(setEnabled(bool))); u = addUIntSelector(gbox, __tr2qs_ctx("Delay between attempts:", "options"), KviOption_uintAutoReconnectDelay, 0, 86400, 5, KVI_OPTION_BOOL(KviOption_boolAutoReconnectOnUnexpectedDisconnect)); u->setSuffix(__tr2qs_ctx(" sec", "options")); connect(b, SIGNAL(toggled(bool)), u, SLOT(setEnabled(bool))); mergeTip(u, __tr2qs_ctx("Minimum value: 0 sec
Maximum value: 86400 sec", "options")); addRowSpacer(0, 3, 4, 3); } OptionsWidget_connection::~OptionsWidget_connection() = default; OptionsWidget_connectionSsl::OptionsWidget_connectionSsl(QWidget * parent) : KviOptionsWidget(parent) { setObjectName("ssl_options_widget"); createLayout(); #ifdef COMPILE_SSL_SUPPORT KviBoolSelector * b; KviFileSelector * f; KviPasswordSelector * p; KviTalGroupBox * gbox = addGroupBox(0, 0, 0, 0, Qt::Horizontal, __tr2qs_ctx("Certificate", "options")); b = addBoolSelector(gbox, __tr2qs_ctx("Use SSL certificate (PEM format only)", "options"), &(KVI_OPTION_BOOL(KviOption_boolUseSSLCertificate)), true); f = addFileSelector(gbox, __tr2qs_ctx("Certificate location:", "options"), &(KVI_OPTION_STRING(KviOption_stringSSLCertificatePath)), KVI_OPTION_BOOL(KviOption_boolUseSSLCertificate)); connect(b, SIGNAL(toggled(bool)), f, SLOT(setEnabled(bool))); p = new KviPasswordSelector(gbox, __tr2qs_ctx("Certificate password:", "options"), &(KVI_OPTION_STRING(KviOption_stringSSLCertificatePass)), KVI_OPTION_BOOL(KviOption_boolUseSSLCertificate)); connect(b, SIGNAL(toggled(bool)), p, SLOT(setEnabled(bool))); gbox = addGroupBox(0, 1, 0, 1, Qt::Horizontal, __tr2qs_ctx("Private Key", "options")); b = addBoolSelector(gbox, __tr2qs_ctx("Use SSL private key", "options"), &(KVI_OPTION_BOOL(KviOption_boolUseSSLPrivateKey)), true); f = addFileSelector(gbox, __tr2qs_ctx("Private key location:", "options"), &(KVI_OPTION_STRING(KviOption_stringSSLPrivateKeyPath)), KVI_OPTION_BOOL(KviOption_boolUseSSLPrivateKey)); connect(b, SIGNAL(toggled(bool)), f, SLOT(setEnabled(bool))); p = addPasswordSelector(gbox, __tr2qs_ctx("Private key password:", "options"), &(KVI_OPTION_STRING(KviOption_stringSSLPrivateKeyPass)), KVI_OPTION_BOOL(KviOption_boolUseSSLPrivateKey)); connect(b, SIGNAL(toggled(bool)), p, SLOT(setEnabled(bool))); addRowSpacer(0, 3, 0, 3); #else addLabel(0, 0, 0, 0, __tr2qs_ctx("This executable has no SSL support.", "options")); #endif } OptionsWidget_connectionSsl::~OptionsWidget_connectionSsl() = default; OptionsWidget_connectionSocket::OptionsWidget_connectionSocket(QWidget * parent) : KviOptionsWidget(parent) { setObjectName("transport_options_widget"); createLayout(); KviUIntSelector * u; KviTalGroupBox * g; KviBoolSelector * b; KviStringSelector * s; g = addGroupBox(0, 0, 0, 0, Qt::Horizontal, __tr2qs_ctx("Timeout Values", "options")); u = addUIntSelector(g, __tr2qs_ctx("Connect timeout:", "options"), KviOption_uintIrcSocketTimeout, 5, 6000, 60); u->setSuffix(__tr2qs_ctx(" sec", "options")); u = addUIntSelector(g, __tr2qs_ctx("Outgoing data queue flush timeout:", "options"), KviOption_uintSocketQueueFlushTimeout, 100, 2000, 500); u->setSuffix(__tr2qs_ctx(" msec", "options")); b = addBoolSelector(0, 1, 0, 1, __tr2qs_ctx("Limit outgoing traffic per connection", "options"), KviOption_boolLimitOutgoingTraffic); u = addUIntSelector(0, 2, 0, 2, __tr2qs_ctx("Limit to 1 message every:", "options"), KviOption_uintOutgoingTrafficLimitUSeconds, 10000, 2000000, 10000001, KVI_OPTION_BOOL(KviOption_boolLimitOutgoingTraffic)); u->setSuffix(__tr2qs_ctx(" usec", "options")); mergeTip(u, __tr2qs_ctx("Minimum value: 10000 usec
Maximum value: 10000000 usec", "options")); connect(b, SIGNAL(toggled(bool)), u, SLOT(setEnabled(bool))); g = addGroupBox(0, 3, 0, 3, Qt::Horizontal, __tr2qs_ctx("Network Interfaces", "options")); b = addBoolSelector(g, __tr2qs_ctx("Bind IPv4 connections to:", "options"), KviOption_boolBindIrcIPv4ConnectionsToSpecifiedAddress); s = addStringSelector(g, "", KviOption_stringIPv4ConnectionBindAddress, KVI_OPTION_BOOL(KviOption_boolBindIrcIPv4ConnectionsToSpecifiedAddress)); connect(b, SIGNAL(toggled(bool)), s, SLOT(setEnabled(bool))); #ifdef COMPILE_IPV6_SUPPORT b = addBoolSelector(g, __tr2qs_ctx("Bind IPv6 connections to:", "options"), KviOption_boolBindIrcIPv6ConnectionsToSpecifiedAddress); s = addStringSelector(g, "", KviOption_stringIPv6ConnectionBindAddress, KVI_OPTION_BOOL(KviOption_boolBindIrcIPv6ConnectionsToSpecifiedAddress)); connect(b, SIGNAL(toggled(bool)), s, SLOT(setEnabled(bool))); #endif //!COMPILE_IPV6_SUPPORT b = addBoolSelector(0, 4, 0, 4, __tr2qs_ctx("Pick random IP address for round-robin servers", "options"), KviOption_boolPickRandomIpAddressForRoundRobinServers); mergeTip(b, __tr2qs_ctx("This option will cause the KVIrc networking stack to pick up " "a random entry when multiple IP address are retrieved for a server " "DNS lookup. This is harmless and can fix some problems with caching " "DNS servers that do not properly rotate the records as the authoritative " "ones would do. On the other hand, you might want to disable it if " "you want to rely on the DNS server to provide the best choice.", "options")); b = addBoolSelector(0, 5, 0, 5, __tr2qs_ctx("Drop connection on SASL authentication failure", "options"), KviOption_boolDropConnectionOnSaslFailure); mergeTip(b, __tr2qs_ctx("This option will close the socket if no SASL authentication or any SASL fallback had succeeded.", "options")); addRowSpacer(0, 6, 0, 6); } OptionsWidget_connectionSocket::~OptionsWidget_connectionSocket() = default; OptionsWidget_identService::OptionsWidget_identService(QWidget * parent) : KviOptionsWidget(parent) { setObjectName("ident_options_widget"); createLayout(); #if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW) m_pEnableIdent = addBoolSelector(0, 0, 0, 0, __tr2qs_ctx("Enable Ident service", "options"), KviOption_boolUseIdentService); #else m_pEnableIdent = addBoolSelector(0, 0, 0, 0, __tr2qs_ctx("Enable Ident service (bad practice on UNIX!)", "options"), KviOption_boolUseIdentService); #endif connect(m_pEnableIdent, SIGNAL(toggled(bool)), this, SLOT(enableIpv4InIpv6(bool))); KviTalGroupBox * gbox = addGroupBox(0, 1, 0, 1, Qt::Horizontal, __tr2qs_ctx("Output Verbosity", "options"), KVI_OPTION_BOOL(KviOption_boolUseIdentService)); connect(m_pEnableIdent, SIGNAL(toggled(bool)), gbox, SLOT(setEnabled(bool))); addLabel(gbox, __tr2qs_ctx("Output Ident service messages to:", "options")); m_pActiveRadio = new QRadioButton(__tr2qs_ctx("Active window", "options"), gbox); m_pConsoleRadio = new QRadioButton(__tr2qs_ctx("Console", "options"), gbox); m_pQuietRadio = new QRadioButton(__tr2qs_ctx("Do not show any Ident service messages", "options"), gbox); switch(KVI_OPTION_UINT(KviOption_uintIdentdOutputMode)) { case KviIdentdOutputMode::Quiet: m_pQuietRadio->setChecked(true); break; case KviIdentdOutputMode::ToConsole: m_pConsoleRadio->setChecked(true); break; case KviIdentdOutputMode::ToActiveWindow: m_pActiveRadio->setChecked(true); break; } KviBoolSelector * b; KviStringSelector * s; KviUIntSelector * u; gbox = addGroupBox(0, 2, 0, 2, Qt::Horizontal, __tr2qs_ctx("Configuration", "options"), KVI_OPTION_BOOL(KviOption_boolUseIdentService)); b = addBoolSelector(gbox, __tr2qs_ctx("Enable Ident service only while connecting to server", "options"), KviOption_boolUseIdentServiceOnlyOnConnect); connect(m_pEnableIdent, SIGNAL(toggled(bool)), b, SLOT(setEnabled(bool))); s = addStringSelector(gbox, __tr2qs_ctx("Ident username:", "options"), KviOption_stringIdentdUser, KVI_OPTION_BOOL(KviOption_boolUseIdentService)); connect(m_pEnableIdent, SIGNAL(toggled(bool)), s, SLOT(setEnabled(bool))); u = addUIntSelector(gbox, __tr2qs_ctx("Service port:", "options"), KviOption_uintIdentdPort, 0, 65535, 113, KVI_OPTION_BOOL(KviOption_boolUseIdentService)); connect(m_pEnableIdent, SIGNAL(toggled(bool)), u, SLOT(setEnabled(bool))); connect(m_pEnableIdent, SIGNAL(toggled(bool)), gbox, SLOT(setEnabled(bool))); gbox = addGroupBox(0, 3, 0, 3, Qt::Horizontal, __tr2qs_ctx("IPv6 Settings", "options"), KVI_OPTION_BOOL(KviOption_boolUseIdentService)); m_pEnableIpv6 = addBoolSelector(gbox, __tr2qs_ctx("Enable service for IPv6", "options"), KviOption_boolIdentdEnableIPv6, KVI_OPTION_BOOL(KviOption_boolUseIdentService)); #ifdef COMPILE_IPV6_SUPPORT connect(m_pEnableIdent, SIGNAL(toggled(bool)), m_pEnableIpv6, SLOT(setEnabled(bool))); connect(m_pEnableIpv6, SIGNAL(toggled(bool)), this, SLOT(enableIpv4InIpv6(bool))); #else m_pEnableIpv6->setEnabled(false); #endif m_pIpv4InIpv6 = addBoolSelector(gbox, __tr2qs_ctx("IP stack treats IPv4 as part of IPv6 namespace", "options"), KviOption_boolIdentdIPv6ContainsIPv4, KVI_OPTION_BOOL(KviOption_boolUseIdentService) && KVI_OPTION_BOOL(KviOption_boolIdentdEnableIPv6)); connect(m_pEnableIdent, SIGNAL(toggled(bool)), gbox, SLOT(setEnabled(bool))); addLabel(0, 4, 0, 4, #if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW) __tr2qs_ctx("

Warning:
" "This is a non RFC 1413 compliant Ident daemon that implements " "only a limited subset of the Identification Protocol specifications. If it is possible, install a " "real Ident daemon.

", "options") #else __tr2qs_ctx("

Warning:
" "This is a non RFC 1413 compliant Ident daemon that implements " "only a limited subset of the Identification Protocol specifications.
" "On UNIX, you may also need root privileges to bind to the auth port (113).
" "It is highly recommended that a real system-wide Ident daemon be used instead, " "or none at all if Ident is not required.

", "options") #endif ); addRowSpacer(0, 5, 0, 5); } OptionsWidget_identService::~OptionsWidget_identService() = default; void OptionsWidget_identService::commit() { KviOptionsWidget::commit(); if(m_pConsoleRadio->isChecked()) KVI_OPTION_UINT(KviOption_uintIdentdOutputMode) = KviIdentdOutputMode::ToConsole; if(m_pActiveRadio->isChecked()) KVI_OPTION_UINT(KviOption_uintIdentdOutputMode) = KviIdentdOutputMode::ToActiveWindow; if(m_pQuietRadio->isChecked()) KVI_OPTION_UINT(KviOption_uintIdentdOutputMode) = KviIdentdOutputMode::Quiet; } void OptionsWidget_identService::enableIpv4InIpv6(bool) { #ifdef COMPILE_IPV6_SUPPORT m_pIpv4InIpv6->setEnabled(m_pEnableIdent->isChecked() && m_pEnableIpv6->isChecked()); #endif } OptionsWidget_connectionAdvanced::OptionsWidget_connectionAdvanced(QWidget * parent) : KviOptionsWidget(parent) { setObjectName("connection_advanced_options_widget"); } OptionsWidget_connectionAdvanced::~OptionsWidget_connectionAdvanced() = default;