diff --git a/src/libtomahawk/TomahawkSettings.cpp b/src/libtomahawk/TomahawkSettings.cpp index e7f14bae2..6e1aacf87 100644 --- a/src/libtomahawk/TomahawkSettings.cpp +++ b/src/libtomahawk/TomahawkSettings.cpp @@ -782,6 +782,20 @@ TomahawkSettings::setSongChangeNotificationEnabled(bool enable) } +bool +TomahawkSettings::autoDetectExternalIp() const +{ + return value( "network/auto-detect-external-ip" ).toBool(); +} + + +void +TomahawkSettings::setAutoDetectExternalIp( bool autoDetect ) +{ + setValue( "network/auto-detect-external-ip", autoDetect ); +} + + unsigned int TomahawkSettings::volume() const { diff --git a/src/libtomahawk/TomahawkSettings.h b/src/libtomahawk/TomahawkSettings.h index 82251fcd9..1eebb9987 100644 --- a/src/libtomahawk/TomahawkSettings.h +++ b/src/libtomahawk/TomahawkSettings.h @@ -147,6 +147,9 @@ public: bool songChangeNotificationEnabled() const; /// true by default void setSongChangeNotificationEnabled( bool enable ); + bool autoDetectExternalIp() const; + void setAutoDetectExternalIp( bool autoDetect ); + QString externalHostname() const; void setExternalHostname( const QString& externalHostname ); diff --git a/src/libtomahawk/network/Servent.cpp b/src/libtomahawk/network/Servent.cpp index 8a7d1b6e2..95aed6beb 100644 --- a/src/libtomahawk/network/Servent.cpp +++ b/src/libtomahawk/network/Servent.cpp @@ -127,6 +127,8 @@ Servent::~Servent() bool Servent::startListening( QHostAddress ha, bool upnp, int port ) { + Q_D( Servent ); + d_func()->externalAddresses = QList(); d_func()->port = port; int defPort = TomahawkSettings::instance()->defaultPort(); @@ -181,11 +183,20 @@ Servent::startListening( QHostAddress ha, bool upnp, int port ) switch ( mode ) { case TomahawkSettings::Static: - d_func()->externalHostname = TomahawkSettings::instance()->externalHostname(); - d_func()->externalPort = TomahawkSettings::instance()->externalPort(); - d_func()->ready = true; - // All setup is made, were done. - emit ready(); + d->externalPort = TomahawkSettings::instance()->externalPort(); + if ( TomahawkSettings::instance()->autoDetectExternalIp() ) + { + QNetworkReply* reply = TomahawkUtils::nam()->get( QNetworkRequest( QUrl( "http://toma.hk/?stat=1" ) ) ); + connect( reply, SIGNAL( finished() ), SLOT( ipDetected() ) ); + // Not emitting ready here as we are not done. + } + else + { + d->externalHostname = TomahawkSettings::instance()->externalHostname(); + d->ready = true; + // All setup is made, were done. + emit ready(); + } break; case TomahawkSettings::Lan: @@ -950,6 +961,39 @@ Servent::checkACLResult( const QString& nodeid, const QString& username, Tomahaw d_func()->queuedForACLResult[username].remove( nodeid ); } +void +Servent::ipDetected() +{ + Q_D( Servent ); + QNetworkReply* reply = qobject_cast( sender() ); + + if ( reply->error() == QNetworkReply::NoError ) + { + QJson::Parser p; + bool ok; + const QVariantMap res = p.parse( reply, &ok ).toMap(); + if ( !ok ) + { + tLog() << Q_FUNC_INFO << "Failed parsing ip-autodetection response"; + d->externalPort = -1; + } + else + { + QString externalIP = res.value( "ip" ).toString(); + tLog( LOGVERBOSE ) << Q_FUNC_INFO << "Found external IP:" << externalIP; + d->externalHostname = externalIP; + } + } + else + { + d->externalPort = -1; + tLog() << Q_FUNC_INFO << "ip-autodetection returned an error:" << reply->errorString(); + } + + d->ready = true; + emit ready(); +} + void Servent::reverseOfferRequest( ControlConnection* orig_conn, const QString& theirdbid, const QString& key, const QString& theirkey ) diff --git a/src/libtomahawk/network/Servent.h b/src/libtomahawk/network/Servent.h index 379eedc5c..0b879fafe 100644 --- a/src/libtomahawk/network/Servent.h +++ b/src/libtomahawk/network/Servent.h @@ -162,6 +162,7 @@ private slots: void readyRead(); void socketError( QAbstractSocket::SocketError e ); void checkACLResult( const QString &nodeid, const QString &username, Tomahawk::ACLStatus::Type peerStatus ); + void ipDetected(); Connection* claimOffer( ControlConnection* cc, const QString &nodeid, const QString &key, const QHostAddress peer = QHostAddress::Any ); diff --git a/src/tomahawk/SettingsDialog.cpp b/src/tomahawk/SettingsDialog.cpp index 31029d123..afb793632 100644 --- a/src/tomahawk/SettingsDialog.cpp +++ b/src/tomahawk/SettingsDialog.cpp @@ -108,7 +108,7 @@ SettingsDialog::SettingsDialog(QObject *parent ) m_advancedWidgetUi->upnpRadioButton->setChecked( true ); m_advancedWidgetUi->staticHostNamePortLabel->setEnabled( m_advancedWidgetUi->staticIpRadioButton->isChecked() ); - m_advancedWidgetUi->staticHostName->setEnabled( m_advancedWidgetUi->staticIpRadioButton->isChecked() ); + m_advancedWidgetUi->staticHostName->setEnabled( m_advancedWidgetUi->staticIpRadioButton->isChecked() && !s->autoDetectExternalIp() ); m_advancedWidgetUi->staticPort->setEnabled( m_advancedWidgetUi->staticIpRadioButton->isChecked() ); m_advancedWidgetUi->staticHostNameLabel->setEnabled( m_advancedWidgetUi->staticIpRadioButton->isChecked() ); m_advancedWidgetUi->staticPortLabel->setEnabled( m_advancedWidgetUi->staticIpRadioButton->isChecked() ); @@ -173,6 +173,7 @@ SettingsDialog::SettingsDialog(QObject *parent ) m_advancedWidgetUi->staticHostName->setText( s->externalHostname() ); m_advancedWidgetUi->staticPort->setValue( s->externalPort() ); m_advancedWidgetUi->proxyButton->setVisible( true ); + m_advancedWidgetUi->autoDetectIpCheckBox->setChecked( s->autoDetectExternalIp() ); m_collectionWidgetUi->checkBoxWatchForChanges->setChecked( s->watchForChanges() ); m_collectionWidgetUi->scannerTimeSpinBox->setValue( s->scannerTime() ); @@ -248,6 +249,7 @@ SettingsDialog::SettingsDialog(QObject *parent ) connect( m_advancedWidgetUi->lanOnlyRadioButton, SIGNAL( toggled(bool) ), SLOT( toggleRemoteMode() ) ); connect( m_advancedWidgetUi->staticIpRadioButton, SIGNAL( toggled(bool) ), SLOT( toggleRemoteMode() ) ); connect( m_advancedWidgetUi->upnpRadioButton, SIGNAL( toggled(bool) ), SLOT( toggleRemoteMode() ) ); + connect( m_advancedWidgetUi->autoDetectIpCheckBox, SIGNAL( toggled( bool ) ), SLOT( toggleAutoDetectIp( bool ) ) ); connect( m_advancedWidgetUi->enableProxyCheckBox, SIGNAL( toggled(bool) ), SLOT( toggleProxyEnabled() ) ); connect( m_advancedWidgetUi->enableProxyCheckBox, SIGNAL( toggled(bool) ), SLOT( requiresRestart() ) ); @@ -268,6 +270,7 @@ SettingsDialog::saveSettings() s->setSongChangeNotificationEnabled( m_advancedWidgetUi->checkBoxSongChangeNotifications->checkState() == Qt::Checked ); s->setProxyType( m_advancedWidgetUi->enableProxyCheckBox->isChecked() ? QNetworkProxy::Socks5Proxy : QNetworkProxy::NoProxy ); s->setExternalAddressMode( m_advancedWidgetUi->upnpRadioButton->isChecked() ? TomahawkSettings::Upnp : ( m_advancedWidgetUi->lanOnlyRadioButton->isChecked() ? TomahawkSettings::Lan : TomahawkSettings::Static ) ); + s->setAutoDetectExternalIp( m_advancedWidgetUi->autoDetectIpCheckBox->isChecked() ); s->setExternalHostname( m_advancedWidgetUi->staticHostName->text() ); s->setExternalPort( m_advancedWidgetUi->staticPort->value() ); @@ -385,6 +388,13 @@ SettingsDialog::toggleProxyEnabled() } +void +SettingsDialog::toggleAutoDetectIp( bool checked ) +{ + m_advancedWidgetUi->staticHostName->setEnabled( !checked ); +} + + void SettingsDialog::updateScanOptionsView() { diff --git a/src/tomahawk/SettingsDialog.h b/src/tomahawk/SettingsDialog.h index 8826af8e4..dfa6c8602 100644 --- a/src/tomahawk/SettingsDialog.h +++ b/src/tomahawk/SettingsDialog.h @@ -39,16 +39,16 @@ class QToolbarTabDialog; namespace Ui { - class ProxyDialog; +class ProxyDialog; } namespace Tomahawk { - namespace Accounts - { - class AccountModel; - class Account; - class AccountFactory; +namespace Accounts +{ +class AccountModel; +class Account; +class AccountFactory; class Account; class AccountModelFilterProxy; } @@ -60,7 +60,7 @@ Q_OBJECT public: explicit ProxyDialog( QWidget* parent = 0 ); - ~ProxyDialog() {}; + ~ProxyDialog() {} void saveSettings(); @@ -85,6 +85,7 @@ private slots: void toggleRemoteMode(); void toggleProxyEnabled(); + void toggleAutoDetectIp( bool checked ); void showProxySettings(); void accountsFilterChanged( int ); diff --git a/src/tomahawk/Settings_Advanced.ui b/src/tomahawk/Settings_Advanced.ui index 5b50eda48..51996a1f9 100644 --- a/src/tomahawk/Settings_Advanced.ui +++ b/src/tomahawk/Settings_Advanced.ui @@ -6,7 +6,7 @@ 0 0 - 469 + 473 475 @@ -109,6 +109,33 @@ + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 40 + 20 + + + + + + + + Automatically detect external IP address + + + + +