diff --git a/src/accounts/xmpp/sip/xmppsip.cpp b/src/accounts/xmpp/sip/xmppsip.cpp index d89111ccb..9a1f4f58e 100644 --- a/src/accounts/xmpp/sip/xmppsip.cpp +++ b/src/accounts/xmpp/sip/xmppsip.cpp @@ -60,11 +60,11 @@ using namespace Accounts; XmppSipPlugin::XmppSipPlugin( Account *account ) : SipPlugin( account ) + , m_state( Account::Disconnected ) #ifndef ENABLE_HEADLESS , m_menu( 0 ) , m_xmlConsole( 0 ) #endif - , m_state( Account::Disconnected ) { qDebug() << Q_FUNC_INFO; @@ -79,6 +79,7 @@ XmppSipPlugin::XmppSipPlugin( Account *account ) // general client setup m_client = new Jreen::Client( jid, m_currentPassword ); + m_client->setProxyFactory( TomahawkUtils::proxyFactory( true ) ); setupClientHelper(); m_client->registerPayload( new TomahawkXmppMessageFactory ); diff --git a/src/libtomahawk/utils/tomahawkutils.cpp b/src/libtomahawk/utils/tomahawkutils.cpp index 640b075a5..237b64c5c 100644 --- a/src/libtomahawk/utils/tomahawkutils.cpp +++ b/src/libtomahawk/utils/tomahawkutils.cpp @@ -302,10 +302,11 @@ extensionToMimetype( const QString& extension ) return s_ext2mime.value( extension, "unknown" ); } +static QMutex s_noProxyHostsMutex; +static QStringList s_noProxyHosts; NetworkProxyFactory::NetworkProxyFactory( const NetworkProxyFactory& other ) { - m_noProxyHosts = QStringList( other.m_noProxyHosts ); m_proxy = QNetworkProxy( other.m_proxy ); } @@ -313,13 +314,17 @@ NetworkProxyFactory::NetworkProxyFactory( const NetworkProxyFactory& other ) QList< QNetworkProxy > NetworkProxyFactory::queryProxy( const QNetworkProxyQuery& query ) { + tDebug() << Q_FUNC_INFO << "query hostname is " << query.peerHostName(); QList< QNetworkProxy > proxies; QString hostname = query.peerHostName(); - if ( m_proxy.hostName().isEmpty() || hostname.isEmpty() || m_noProxyHosts.contains( hostname ) || TomahawkSettings::instance()->proxyType() == QNetworkProxy::NoProxy ) + s_noProxyHostsMutex.lock(); + if ( s_noProxyHosts.contains( hostname ) ) + proxies << QNetworkProxy::NoProxy << systemProxyForQuery( query ); + else if ( m_proxy.hostName().isEmpty() || hostname.isEmpty() || TomahawkSettings::instance()->proxyType() == QNetworkProxy::NoProxy ) proxies << systemProxyForQuery( query ); else proxies << m_proxy << systemProxyForQuery( query ); - + s_noProxyHostsMutex.unlock(); return proxies; } @@ -336,7 +341,9 @@ NetworkProxyFactory::setNoProxyHosts( const QStringList& hosts ) //TODO: wildcard support } tDebug() << Q_FUNC_INFO << "New no-proxy hosts:" << newList; - m_noProxyHosts = newList; + s_noProxyHostsMutex.lock(); + s_noProxyHosts = newList; + s_noProxyHostsMutex.unlock(); } @@ -358,7 +365,6 @@ NetworkProxyFactory::operator=( const NetworkProxyFactory& rhs ) if ( this != &rhs ) { m_proxy = QNetworkProxy( rhs.m_proxy ); - m_noProxyHosts = QStringList( rhs.m_noProxyHosts ); } return *this; @@ -368,7 +374,7 @@ NetworkProxyFactory::operator=( const NetworkProxyFactory& rhs ) bool NetworkProxyFactory::operator==( const NetworkProxyFactory& other ) const { tDebug() << Q_FUNC_INFO; - if ( m_noProxyHosts != other.m_noProxyHosts || m_proxy != other.m_proxy ) + if ( m_proxy != other.m_proxy ) return false; return true; @@ -379,25 +385,29 @@ static QMap< QThread*, NetworkProxyFactory* > s_threadProxyFactoryHash; static QMutex s_namAccessMutex; NetworkProxyFactory* -proxyFactory( bool noMutexLocker ) +proxyFactory( bool makeClone, bool noMutexLocker ) { // Don't lock if being called from nam() tDebug() << Q_FUNC_INFO; QMutex otherMutex; QMutexLocker locker( noMutexLocker ? &otherMutex : &s_namAccessMutex ); - if ( s_threadProxyFactoryHash.contains( QThread::currentThread() ) ) - return s_threadProxyFactoryHash[ QThread::currentThread() ]; + if ( !makeClone ) + { + if ( s_threadProxyFactoryHash.contains( QThread::currentThread() ) ) + return s_threadProxyFactoryHash[ QThread::currentThread() ]; - if ( !s_threadProxyFactoryHash.contains( TOMAHAWK_APPLICATION::instance()->thread() ) ) - return 0; + if ( !s_threadProxyFactoryHash.contains( TOMAHAWK_APPLICATION::instance()->thread() ) ) + return 0; + } // create a new proxy factory for this thread TomahawkUtils::NetworkProxyFactory *mainProxyFactory = s_threadProxyFactoryHash[ TOMAHAWK_APPLICATION::instance()->thread() ]; TomahawkUtils::NetworkProxyFactory *newProxyFactory = new TomahawkUtils::NetworkProxyFactory(); *newProxyFactory = *mainProxyFactory; - s_threadProxyFactoryHash[ QThread::currentThread() ] = newProxyFactory; + if ( !makeClone ) + s_threadProxyFactoryHash[ QThread::currentThread() ] = newProxyFactory; return newProxyFactory; } @@ -456,7 +466,7 @@ nam() newNam->setConfiguration( QNetworkConfiguration( mainNam->configuration() ) ); newNam->setNetworkAccessible( mainNam->networkAccessible() ); - newNam->setProxyFactory( proxyFactory( true ) ); + newNam->setProxyFactory( proxyFactory( false, true ) ); s_threadNamHash[ QThread::currentThread() ] = newNam; @@ -486,9 +496,15 @@ setNam( QNetworkAccessManager* nam, bool noMutexLocker ) QNetworkProxy proxy( s->proxyType(), s->proxyHost(), s->proxyPort(), s->proxyUsername(), s->proxyPassword() ); proxyFactory->setProxy( proxy ); //FIXME: Jreen is broke without this - QNetworkProxy::setApplicationProxy( proxy ); - if ( !s->proxyNoProxyHosts().isEmpty() ) + //QNetworkProxy::setApplicationProxy( proxy ); + s_noProxyHostsMutex.lock(); + if ( !s->proxyNoProxyHosts().isEmpty() && s_noProxyHosts.isEmpty() ) + { + s_noProxyHostsMutex.unlock(); proxyFactory->setNoProxyHosts( s->proxyNoProxyHosts().split( ',', QString::SkipEmptyParts ) ); + } + else + s_noProxyHostsMutex.unlock(); } nam->setProxyFactory( proxyFactory ); diff --git a/src/libtomahawk/utils/tomahawkutils.h b/src/libtomahawk/utils/tomahawkutils.h index 8b3252a98..c5eb57ad4 100644 --- a/src/libtomahawk/utils/tomahawkutils.h +++ b/src/libtomahawk/utils/tomahawkutils.h @@ -93,7 +93,7 @@ namespace TomahawkUtils DLLEXPORT QString extensionToMimetype( const QString& extension ); DLLEXPORT bool newerVersion( const QString& oldVersion, const QString& newVersion ); - DLLEXPORT NetworkProxyFactory* proxyFactory( bool noMutexLocker = false ); + DLLEXPORT NetworkProxyFactory* proxyFactory( bool makeClone = false, bool noMutexLocker = false ); DLLEXPORT void setProxyFactory( TomahawkUtils::NetworkProxyFactory* factory, bool noMutexLocker = false ); DLLEXPORT QNetworkAccessManager* nam(); DLLEXPORT void setNam( QNetworkAccessManager* nam, bool noMutexLocker = false ); diff --git a/src/proxydialog.ui b/src/proxydialog.ui index 4b30ca1ca..321fcb09c 100644 --- a/src/proxydialog.ui +++ b/src/proxydialog.ui @@ -139,7 +139,8 @@ - No Proxy Hosts: + No Proxy Hosts: +(Overrides system proxy) diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp index 62e03e36f..db18dc98e 100644 --- a/src/settingsdialog.cpp +++ b/src/settingsdialog.cpp @@ -20,13 +20,13 @@ #include "settingsdialog.h" #include "config.h" -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include "AtticaManager.h" #include "tomahawkapp.h" @@ -457,7 +457,6 @@ ProxyDialog::ProxyDialog( QWidget *parent ) ui->userLineEdit->setEnabled( false ); ui->passwordLineEdit->setEnabled( false ); ui->checkBoxUseProxyForDns->setEnabled( false ); - ui->noHostLineEdit->setEnabled( false ); } connect( ui->typeBox, SIGNAL( currentIndexChanged( int ) ), SLOT( proxyTypeChangedSlot( int ) ) ); @@ -474,7 +473,6 @@ ProxyDialog::proxyTypeChangedSlot( int index ) ui->userLineEdit->setEnabled( false ); ui->passwordLineEdit->setEnabled( false ); ui->checkBoxUseProxyForDns->setEnabled( false ); - ui->noHostLineEdit->setEnabled( false ); } else { @@ -483,7 +481,6 @@ ProxyDialog::proxyTypeChangedSlot( int index ) ui->userLineEdit->setEnabled( true ); ui->passwordLineEdit->setEnabled( true ); ui->checkBoxUseProxyForDns->setEnabled( true ); - ui->noHostLineEdit->setEnabled( true ); } } @@ -521,8 +518,8 @@ ProxyDialog::saveSettings() proxyFactory->setProxy( QNetworkProxy( type, s->proxyHost(), s->proxyPort(), s->proxyUsername(), s->proxyPassword() ) ); if ( !ui->noHostLineEdit->text().isEmpty() ) { - tDebug() << Q_FUNC_INFO << "hosts line edit is " << ui->noHostLineEdit->text(); - tDebug() << Q_FUNC_INFO << "split hosts line edit is " << ui->noHostLineEdit->text().split( ' ', QString::SkipEmptyParts ); + tDebug() << Q_FUNC_INFO << "noproxy line edit is " << ui->noHostLineEdit->text(); + tDebug() << Q_FUNC_INFO << "split noproxy line edit is " << ui->noHostLineEdit->text().split( ' ', QString::SkipEmptyParts ); proxyFactory->setNoProxyHosts( ui->noHostLineEdit->text().split( ' ', QString::SkipEmptyParts ) ); } } diff --git a/src/settingsdialog.h b/src/settingsdialog.h index cb02666bd..8199a786b 100644 --- a/src/settingsdialog.h +++ b/src/settingsdialog.h @@ -20,8 +20,8 @@ #ifndef SETTINGSDIALOG_H #define SETTINGSDIALOG_H -#include -#include +#include +#include #include "config.h" diff --git a/src/tomahawkapp.cpp b/src/tomahawkapp.cpp index 669a3383d..1b3f9fe78 100644 --- a/src/tomahawkapp.cpp +++ b/src/tomahawkapp.cpp @@ -28,7 +28,6 @@ #include #include #include -#include #include "artist.h" #include "album.h"