mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-08-06 14:16:32 +02:00
Better PortFwdThread handling...separate out the thread controller from
the actual threaded worker
This commit is contained in:
@@ -29,29 +29,69 @@
|
|||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
PortFwdThread::PortFwdThread( unsigned int port )
|
PortFwdThread::PortFwdThread( unsigned int port )
|
||||||
: QThread()
|
: QThread()
|
||||||
, m_externalPort( 0 )
|
|
||||||
, m_port( port )
|
, m_port( port )
|
||||||
{
|
{
|
||||||
moveToThread( this );
|
|
||||||
start();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PortFwdThread::~PortFwdThread()
|
PortFwdThread::~PortFwdThread()
|
||||||
{
|
{
|
||||||
qDebug() << Q_FUNC_INFO << "waiting for event loop to finish...";
|
|
||||||
quit();
|
|
||||||
wait( 6000 );
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
PortFwdThread::run()
|
||||||
|
{
|
||||||
|
m_worker = QWeakPointer< PortFwdWorker >( new PortFwdWorker( m_port ) );
|
||||||
|
Q_ASSERT( m_worker );
|
||||||
|
connect( m_worker.data(), SIGNAL( externalAddressDetected( QHostAddress, unsigned int ) ), this, SIGNAL( externalAddressDetected( QHostAddress, unsigned int ) ) );
|
||||||
|
QTimer::singleShot( 0, m_worker.data(), SLOT( work() ) );
|
||||||
|
exec();
|
||||||
|
|
||||||
|
if ( m_worker.data()->externalPort() )
|
||||||
|
{
|
||||||
|
qDebug() << "Unregistering port fwd";
|
||||||
|
m_worker.data()->unregister();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( m_worker )
|
||||||
|
delete m_worker.data();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QWeakPointer< PortFwdWorker >
|
||||||
|
PortFwdThread::worker() const
|
||||||
|
{
|
||||||
|
return m_worker;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PortFwdWorker::PortFwdWorker( unsigned int port )
|
||||||
|
: QObject()
|
||||||
|
, m_externalPort( 0 )
|
||||||
|
, m_port( port )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PortFwdWorker::~PortFwdWorker()
|
||||||
|
{
|
||||||
delete m_portfwd;
|
delete m_portfwd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
PortFwdThread::work()
|
PortFwdWorker::unregister()
|
||||||
|
{
|
||||||
|
m_portfwd->remove( m_externalPort );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
PortFwdWorker::work()
|
||||||
{
|
{
|
||||||
qsrand( QTime( 0, 0, 0 ).secsTo( QTime::currentTime() ) );
|
qsrand( QTime( 0, 0, 0 ).secsTo( QTime::currentTime() ) );
|
||||||
m_portfwd = new Portfwd();
|
m_portfwd = new Portfwd();
|
||||||
@@ -103,16 +143,3 @@ PortFwdThread::work()
|
|||||||
emit externalAddressDetected( m_externalAddress, m_externalPort );
|
emit externalAddressDetected( m_externalAddress, m_externalPort );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
PortFwdThread::run()
|
|
||||||
{
|
|
||||||
QTimer::singleShot( 0, this, SLOT( work() ) );
|
|
||||||
exec();
|
|
||||||
|
|
||||||
if ( m_externalPort )
|
|
||||||
{
|
|
||||||
qDebug() << "Unregistering port fwd";
|
|
||||||
m_portfwd->remove( m_externalPort );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@@ -22,9 +22,35 @@
|
|||||||
#include <QThread>
|
#include <QThread>
|
||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
#include <QHostAddress>
|
#include <QHostAddress>
|
||||||
|
#include <QWeakPointer>
|
||||||
|
|
||||||
class Portfwd;
|
class Portfwd;
|
||||||
|
|
||||||
|
class PortFwdWorker : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit PortFwdWorker( unsigned int port );
|
||||||
|
~PortFwdWorker();
|
||||||
|
|
||||||
|
unsigned int externalPort() const { return m_externalPort; }
|
||||||
|
|
||||||
|
void unregister();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void externalAddressDetected( QHostAddress ha, unsigned int port );
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void work();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Portfwd* m_portfwd;
|
||||||
|
QHostAddress m_externalAddress;
|
||||||
|
unsigned int m_externalPort, m_port;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
class PortFwdThread : public QThread
|
class PortFwdThread : public QThread
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@@ -33,18 +59,17 @@ public:
|
|||||||
explicit PortFwdThread( unsigned int port );
|
explicit PortFwdThread( unsigned int port );
|
||||||
~PortFwdThread();
|
~PortFwdThread();
|
||||||
|
|
||||||
|
QWeakPointer< PortFwdWorker > worker() const;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void externalAddressDetected( QHostAddress ha, unsigned int port );
|
void externalAddressDetected( QHostAddress ha, unsigned int port );
|
||||||
|
|
||||||
private slots:
|
protected:
|
||||||
void work();
|
|
||||||
|
|
||||||
private:
|
|
||||||
void run();
|
void run();
|
||||||
|
|
||||||
Portfwd* m_portfwd;
|
private:
|
||||||
QHostAddress m_externalAddress;
|
QWeakPointer< PortFwdWorker > m_worker;
|
||||||
unsigned int m_externalPort, m_port;
|
unsigned int m_port;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // PORTFWDTHREAD_H
|
#endif // PORTFWDTHREAD_H
|
||||||
|
@@ -60,7 +60,6 @@ Servent::Servent( QObject* parent )
|
|||||||
, m_port( 0 )
|
, m_port( 0 )
|
||||||
, m_externalPort( 0 )
|
, m_externalPort( 0 )
|
||||||
, m_ready( false )
|
, m_ready( false )
|
||||||
, m_portfwd( 0 )
|
|
||||||
{
|
{
|
||||||
s_instance = this;
|
s_instance = this;
|
||||||
|
|
||||||
@@ -89,7 +88,13 @@ Servent::Servent( QObject* parent )
|
|||||||
|
|
||||||
Servent::~Servent()
|
Servent::~Servent()
|
||||||
{
|
{
|
||||||
delete m_portfwd;
|
|
||||||
|
if ( m_portfwd )
|
||||||
|
{
|
||||||
|
m_portfwd.data()->quit();
|
||||||
|
m_portfwd.data()->wait( 60000 );
|
||||||
|
delete m_portfwd.data();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -144,9 +149,11 @@ Servent::startListening( QHostAddress ha, bool upnp, int port )
|
|||||||
}
|
}
|
||||||
// TODO check if we have a public/internet IP on this machine directly
|
// TODO check if we have a public/internet IP on this machine directly
|
||||||
tLog() << "External address mode set to upnp...";
|
tLog() << "External address mode set to upnp...";
|
||||||
m_portfwd = new PortFwdThread( m_port );
|
m_portfwd = QWeakPointer< PortFwdThread >( new PortFwdThread( m_port ) );
|
||||||
connect( m_portfwd, SIGNAL( externalAddressDetected( QHostAddress, unsigned int ) ),
|
Q_ASSERT( m_portfwd );
|
||||||
|
connect( m_portfwd.data(), SIGNAL( externalAddressDetected( QHostAddress, unsigned int ) ),
|
||||||
SLOT( setExternalAddress( QHostAddress, unsigned int ) ) );
|
SLOT( setExternalAddress( QHostAddress, unsigned int ) ) );
|
||||||
|
m_portfwd.data()->start();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -226,6 +233,7 @@ Servent::setExternalAddress( QHostAddress ha, unsigned int port )
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tLog() << "UPnP setup successful";
|
||||||
m_ready = true;
|
m_ready = true;
|
||||||
emit ready();
|
emit ready();
|
||||||
}
|
}
|
||||||
|
@@ -174,7 +174,7 @@ private:
|
|||||||
|
|
||||||
QMap< QString,boost::function< QSharedPointer< QIODevice >(Tomahawk::result_ptr) > > m_iofactories;
|
QMap< QString,boost::function< QSharedPointer< QIODevice >(Tomahawk::result_ptr) > > m_iofactories;
|
||||||
|
|
||||||
PortFwdThread* m_portfwd;
|
QWeakPointer< PortFwdThread > m_portfwd;
|
||||||
static Servent* s_instance;
|
static Servent* s_instance;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user