diff --git a/src/libtomahawk/infosystem/infoplugins/generic/lastfmplugin.cpp b/src/libtomahawk/infosystem/infoplugins/generic/lastfmplugin.cpp index 660b5dd10..ff4a64996 100644 --- a/src/libtomahawk/infosystem/infoplugins/generic/lastfmplugin.cpp +++ b/src/libtomahawk/infosystem/infoplugins/generic/lastfmplugin.cpp @@ -64,6 +64,7 @@ LastFmPlugin::LastFmPlugin() lastfm::ws::ApiKey = "7194b85b6d1f424fe1668173a78c0c4a"; lastfm::ws::SharedSecret = "ba80f1df6d27ae63e9cb1d33ccf2052f"; lastfm::ws::Username = TomahawkSettings::instance()->lastFmUsername(); + lastfm::setNetworkAccessManager( TomahawkUtils::nam() ); m_pw = TomahawkSettings::instance()->lastFmPassword(); diff --git a/src/libtomahawk/utils/tomahawkutils.cpp b/src/libtomahawk/utils/tomahawkutils.cpp index b3cd146c4..3f0f55d14 100644 --- a/src/libtomahawk/utils/tomahawkutils.cpp +++ b/src/libtomahawk/utils/tomahawkutils.cpp @@ -583,9 +583,6 @@ setProxyFactory( NetworkProxyFactory* factory, bool noMutexLocker ) if ( QThread::currentThread() == TOMAHAWK_APPLICATION::instance()->thread() ) { - // If setting new values on the main thread, clear the other entries - // so that on next access new ones will be created with new proper values - NetworkProxyFactory::setApplicationProxyFactory( factory ); foreach( QThread* thread, s_threadProxyFactoryHash.keys() ) { if ( thread != QThread::currentThread() ) @@ -608,17 +605,19 @@ nam() return s_threadNamHash[ QThread::currentThread() ]; if ( !s_threadNamHash.contains( TOMAHAWK_APPLICATION::instance()->thread() ) ) - return 0; + { + if ( QThread::currentThread() == TOMAHAWK_APPLICATION::instance()->thread() ) + { + setNam( new QNetworkAccessManager(), true ); + return s_threadNamHash[ QThread::currentThread() ]; + } + else + return 0; + } // Create a nam for this thread based on the main thread's settings but with its own proxyfactory QNetworkAccessManager *mainNam = s_threadNamHash[ TOMAHAWK_APPLICATION::instance()->thread() ]; - QNetworkAccessManager* newNam; -#ifdef LIBLASTFM_FOUND - newNam = lastfm::nam(); - lastfm::setNetworkAccessManager( newNam ); -#else - newNam = new QNetworkAccessManager(); -#endif + QNetworkAccessManager* newNam = new QNetworkAccessManager(); newNam->setConfiguration( QNetworkConfiguration( mainNam->configuration() ) ); newNam->setNetworkAccessible( mainNam->networkAccessible() ); @@ -631,10 +630,12 @@ nam() void -setNam( QNetworkAccessManager* nam ) +setNam( QNetworkAccessManager* nam, bool noMutexLocker ) { Q_ASSERT( nam ); - QMutexLocker locker( &s_namAccessMutex ); + // Don't lock if being called from nam()() + QMutex otherMutex; + QMutexLocker locker( noMutexLocker ? &otherMutex : &s_namAccessMutex ); if ( !s_threadNamHash.contains( TOMAHAWK_APPLICATION::instance()->thread() ) && QThread::currentThread() == TOMAHAWK_APPLICATION::instance()->thread() ) { @@ -644,10 +645,8 @@ setNam( QNetworkAccessManager* nam ) if ( s->proxyType() != QNetworkProxy::NoProxy && !s->proxyHost().isEmpty() ) { tDebug( LOGEXTRA ) << "Setting proxy to saved values"; - QNetworkProxy proxy( static_cast( s->proxyType() ), s->proxyHost(), s->proxyPort(), s->proxyUsername(), s->proxyPassword() ); + QNetworkProxy proxy( s->proxyType(), s->proxyHost(), s->proxyPort(), s->proxyUsername(), s->proxyPassword() ); proxyFactory->setProxy( proxy ); - //TODO: On Windows and Mac because liblastfm sets an application level proxy it may override our factory, so may need to explicitly do - //a QNetworkProxy::setApplicationProxy with our own proxy (but then also overriding our own factory :-( ) } if ( !s->proxyNoProxyHosts().isEmpty() ) proxyFactory->setNoProxyHosts( s->proxyNoProxyHosts().split( ',', QString::SkipEmptyParts ) ); @@ -655,7 +654,6 @@ setNam( QNetworkAccessManager* nam ) nam->setProxyFactory( proxyFactory ); s_threadNamHash[ QThread::currentThread() ] = nam; s_threadProxyFactoryHash[ QThread::currentThread() ] = proxyFactory; - NetworkProxyFactory::setApplicationProxyFactory( proxyFactory ); return; } diff --git a/src/libtomahawk/utils/tomahawkutils.h b/src/libtomahawk/utils/tomahawkutils.h index 07869c610..65e9ea4ce 100644 --- a/src/libtomahawk/utils/tomahawkutils.h +++ b/src/libtomahawk/utils/tomahawkutils.h @@ -97,7 +97,7 @@ namespace TomahawkUtils DLLEXPORT QNetworkAccessManager* nam(); DLLEXPORT void setProxyFactory( TomahawkUtils::NetworkProxyFactory* factory, bool noMutexLocker = false ); - DLLEXPORT void setNam( QNetworkAccessManager* nam ); + DLLEXPORT void setNam( QNetworkAccessManager* nam, bool noMutexLocker = false ); DLLEXPORT QWidget* tomahawkWindow(); /// Platform-specific bringing tomahawk mainwindow to front, b/c qt's activate() and such don't seem to work well enough for us diff --git a/src/tomahawkapp.cpp b/src/tomahawkapp.cpp index 860a1c560..588854d80 100644 --- a/src/tomahawkapp.cpp +++ b/src/tomahawkapp.cpp @@ -160,13 +160,8 @@ TomahawkApp::init() new ActionCollection( this ); tDebug( LOGINFO ) << "Setting NAM."; -#ifndef LIBLASTFM_FOUND - TomahawkUtils::setNam( new QNetworkAccessManager() ); -#else - TomahawkUtils::setNam( lastfm::nam() ); - //Ensure that liblastfm2 won't delete the nam out from under us, even though they created it - lastfm::setNetworkAccessManager( TomahawkUtils::nam() ); -#endif + // Cause the creation of the nam, but don't need to address it directly, so prevent warning + Q_UNUSED( TomahawkUtils::nam() ); m_audioEngine = QWeakPointer( new AudioEngine ); m_scanManager = QWeakPointer( new ScanManager( this ) );