From 18e1340de9a3846563dde3644e3231d0dc32c088 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Tue, 4 Jun 2013 21:26:01 +0200 Subject: [PATCH] Do not delete connection if PeerInfo disappers during connect --- src/libtomahawk/network/ConnectionManager.cpp | 3 +++ src/libtomahawk/network/ControlConnection.cpp | 13 ++++++++++++- src/libtomahawk/network/ControlConnection.h | 2 ++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/libtomahawk/network/ConnectionManager.cpp b/src/libtomahawk/network/ConnectionManager.cpp index adfcaf1ad..14a329d02 100644 --- a/src/libtomahawk/network/ConnectionManager.cpp +++ b/src/libtomahawk/network/ConnectionManager.cpp @@ -116,6 +116,7 @@ ConnectionManager::connectToPeer( const Tomahawk::peerinfo_ptr &peerInfo, bool l m["nodeid"] = Database::instance()->impl()->dbid(); m_controlConnection = QPointer( new ControlConnection( Servent::instance() ) ); + m_controlConnection->setShutdownOnEmptyPeerInfos( false ); m_controlConnection->addPeerInfo( peerInfo ); m_controlConnection->setFirstMessage( m ); @@ -238,6 +239,8 @@ ConnectionManager::handoverSocket( QTcpSocketExtra* sock ) m_controlConnection->setPeerPort( sock->peerPort() ); m_controlConnection->start( sock ); + // ControlConntection is now connected, now it can be destroyed if the PeerInfos disappear + m_controlConnection->setShutdownOnEmptyPeerInfos( true ); m_currentPeerInfo.clear(); m_mutex.unlock(); } diff --git a/src/libtomahawk/network/ControlConnection.cpp b/src/libtomahawk/network/ControlConnection.cpp index 10596fbe4..311051780 100644 --- a/src/libtomahawk/network/ControlConnection.cpp +++ b/src/libtomahawk/network/ControlConnection.cpp @@ -39,6 +39,7 @@ ControlConnection::ControlConnection( Servent* parent ) , m_dbsyncconn( 0 ) , m_registered( false ) , m_pingtimer( 0 ) + , m_shutdownOnEmptyPeerInfos( true ) { qDebug() << "CTOR controlconnection"; setId("ControlConnection()"); @@ -305,7 +306,17 @@ ControlConnection::removePeerInfo( const peerinfo_ptr& peerInfo ) m_peerInfos.remove( peerInfo ); - if ( m_peerInfos.isEmpty() ) + if ( m_peerInfos.isEmpty() && m_shutdownOnEmptyPeerInfos ) + { + shutdown( true ); + } +} + +void +ControlConnection::setShutdownOnEmptyPeerInfos( bool shutdownOnEmptyPeerInfos ) +{ + m_shutdownOnEmptyPeerInfos = shutdownOnEmptyPeerInfos; + if ( m_peerInfos.isEmpty() && m_shutdownOnEmptyPeerInfos ) { shutdown( true ); } diff --git a/src/libtomahawk/network/ControlConnection.h b/src/libtomahawk/network/ControlConnection.h index 470f92cc2..a8bde2d15 100644 --- a/src/libtomahawk/network/ControlConnection.h +++ b/src/libtomahawk/network/ControlConnection.h @@ -50,6 +50,7 @@ public: void addPeerInfo( const Tomahawk::peerinfo_ptr& peerInfo ); void removePeerInfo( const Tomahawk::peerinfo_ptr& peerInfo ); + void setShutdownOnEmptyPeerInfos( bool shutdownOnEmptyPeerInfos ); const QSet< Tomahawk::peerinfo_ptr > peerInfos() const; protected: @@ -71,6 +72,7 @@ private: QString m_dbconnkey; bool m_registered; + bool m_shutdownOnEmptyPeerInfos; QTimer* m_pingtimer; QTime m_pingtimer_mark;