1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-03-20 15:59:42 +01:00

Add Boost_INCLUDE_DIR and make less usage of boost in headers

* Make Servent member more private
This commit is contained in:
Uwe L. Korn 2013-06-07 12:36:26 +02:00
parent e193524cd3
commit b6e0f77911
16 changed files with 256 additions and 138 deletions

View File

@ -1,4 +1,7 @@
include_directories(${ECHONEST_INCLUDE_DIR})
include_directories(
${ECHONEST_INCLUDE_DIR}
${Boost_INCLUDE_DIR}
)
list(APPEND simple_plugins
Echonest

View File

@ -391,6 +391,7 @@ include_directories(
${ECHONEST_INCLUDE_DIR}
${CLUCENE_INCLUDE_DIRS}
${PHONON_INCLUDES}
${Boost_INCLUDE_DIR}
${LIBPORTFWD_INCLUDE_DIR}
${QuaZip_INCLUDE_DIR}

View File

@ -22,12 +22,13 @@
#include <QObject>
#include <QPointer>
#include "boost/function.hpp"
#include "boost/bind.hpp"
#include <boost/function.hpp>
#include "DllMacro.h"
/*
#include <boost/bind.hpp>
I want to do:
QTimer::singleShot(1000, this, SLOT(doSomething(x)));
instead, I'm doing:

View File

@ -30,7 +30,7 @@
#include "utils/ResultUrlChecker.h"
#include "utils/Logger.h"
#include "boost/bind.hpp"
#include <boost/bind.hpp>
#define DEFAULT_CONCURRENT_QUERIES 4
#define MAX_CONCURRENT_QUERIES 16

View File

@ -33,7 +33,6 @@
#include "PlaylistInterface.h"
#include "playlist/PlaylistUpdaterInterface.h"
#include "Query.h"
#include "utils/Closure.h"
#include "DllMacro.h"
@ -44,6 +43,11 @@ class DatabaseCommand_SetPlaylistRevision;
class DatabaseCommand_CreatePlaylist;
class PlaylistModel;
namespace _detail
{
class Closure;
}
namespace Tomahawk
{

View File

@ -26,8 +26,6 @@
#include <QPair>
#include <QPersistentModelIndex>
#include <boost/function.hpp>
//template <typename T> class QSharedPointer;
#include <QNetworkReply>
@ -100,7 +98,6 @@ namespace Tomahawk
};
class ExternalResolver;
typedef boost::function<Tomahawk::ExternalResolver*( QString, QStringList )> ResolverFactoryFunc;
namespace PlaylistModes {
enum RepeatMode { NoRepeat, RepeatOne, RepeatAll };

View File

@ -29,6 +29,7 @@
#include "sip/SipStatusMessage.h"
#include "jobview/JobStatusView.h"
#include "jobview/JobStatusModel.h"
#include "utils/Closure.h"
#include <QtCore/QLibrary>
#include <QtCore/QDir>

View File

@ -3,6 +3,8 @@
#include <phonon/AudioOutput>
#include <phonon/BackendCapabilities>
#include <stdint.h>
#include <QObject>
#include <QTimer>
#include <QQueue>
@ -46,7 +48,7 @@ private:
QQueue< AudioState > stateQueue;
QTimer stateQueueTimer;
uint_fast8_t underrunCount;
quint8 underrunCount;
bool underrunNotified;
QTemporaryFile* coverTempFile;

View File

@ -25,6 +25,7 @@
#include "playlist/PlaylistUpdaterInterface.h"
#include "utils/ImageRegistry.h"
#include "accounts/AccountManager.h"
#include "utils/Closure.h"
#include <QMetaObject>
#include <QGenericArgument>

View File

@ -20,6 +20,7 @@
#include "Connection.h"
#include "QTcpSocketExtra.h"
#include "network/Servent.h"
#include "utils/Logger.h"
#include "Source.h"

View File

@ -18,6 +18,7 @@
#include "ConnectionManager.h"
#include "ControlConnection.h"
#include "QTcpSocketExtra.h"
#include "Servent.h"
#include "database/Database.h"

View File

@ -19,13 +19,14 @@
* along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.
*/
#include "Servent.h"
#include "Servent_p.h"
#include "Result.h"
#include "Source.h"
#include "BufferIoDevice.h"
#include "Connection.h"
#include "ControlConnection.h"
#include "QTcpSocketExtra.h"
#include "database/Database.h"
#include "database/DatabaseImpl.h"
#include "network/ConnectionManager.h"
@ -74,14 +75,12 @@ Servent::instance()
Servent::Servent( QObject* parent )
: QTcpServer( parent )
, m_port( 0 )
, m_externalPort( 0 )
, m_ready( false )
: QTcpServer( parent ),
d_ptr( new ServentPrivate( this ) )
{
s_instance = this;
m_noAuth = qApp->arguments().contains( "--noauth" );
d_func()->noAuth = qApp->arguments().contains( "--noauth" );
setProxy( QNetworkProxy::NoProxy );
@ -108,14 +107,14 @@ Servent::~Servent()
{
tDebug() << Q_FUNC_INFO;
foreach ( ControlConnection* cc, m_controlconnections )
foreach ( ControlConnection* cc, d_func()->controlconnections )
delete cc;
if ( m_portfwd )
if ( d_func()->portfwd )
{
m_portfwd.data()->quit();
m_portfwd.data()->wait( 60000 );
delete m_portfwd.data();
d_func()->portfwd.data()->quit();
d_func()->portfwd.data()->wait( 60000 );
delete d_func()->portfwd.data();
}
}
@ -123,25 +122,25 @@ Servent::~Servent()
bool
Servent::startListening( QHostAddress ha, bool upnp, int port )
{
m_externalAddresses = QList<QHostAddress>();
m_port = port;
d_func()->externalAddresses = QList<QHostAddress>();
d_func()->port = port;
int defPort = TomahawkSettings::instance()->defaultPort();
// Listen on both the selected port and, if not the same, the default port -- the latter sometimes necessary for zeroconf
// TODO: only listen on both when zeroconf sip is enabled
// TODO: use a real zeroconf system instead of a simple UDP broadcast?
if ( !listen( ha, m_port ) )
if ( !listen( ha, d_func()->port ) )
{
if ( m_port != defPort )
if ( d_func()->port != defPort )
{
if ( !listen( ha, defPort ) )
{
tLog() << Q_FUNC_INFO << "Failed to listen on both port" << m_port << "and port" << defPort;
tLog() << Q_FUNC_INFO << "Failed to listen on both port" << d_func()->port << "and port" << defPort;
tLog() << Q_FUNC_INFO << "Error string is:" << errorString();
return false;
}
else
m_port = defPort;
d_func()->port = defPort;
}
}
@ -159,34 +158,34 @@ Servent::startListening( QHostAddress ha, bool upnp, int port )
if ( addr.isInSubnet( QHostAddress::parseSubnet( "fe80::/10" ) ) )
continue; // Skip link local addresses
tLog( LOGVERBOSE ) << Q_FUNC_INFO << "Listening to " << addr.toString();
m_externalAddresses.append( addr );
d_func()->externalAddresses.append( addr );
}
}
else if ( ( ha.toString() != "127.0.0.1" ) && ( ha.toString() != "::1" ) && ( ha.toString() != "::7F00:1" ) )
{
// We listen only to one specific Address, only announce this.
m_externalAddresses.append( ha );
d_func()->externalAddresses.append( ha );
}
// If we only accept connections via localhost, we'll announce nothing.
TomahawkSettings::ExternalAddressMode mode = TomahawkSettings::instance()->externalAddressMode();
tLog( LOGVERBOSE ) << Q_FUNC_INFO << "Servent listening on port" << m_port << "- servent thread:" << thread()
tLog( LOGVERBOSE ) << Q_FUNC_INFO << "Servent listening on port" << d_func()->port << "- servent thread:" << thread()
<< "- address mode:" << (int)( mode );
switch ( mode )
{
case TomahawkSettings::Static:
m_externalHostname = TomahawkSettings::instance()->externalHostname();
m_externalPort = TomahawkSettings::instance()->externalPort();
m_ready = true;
d_func()->externalHostname = TomahawkSettings::instance()->externalHostname();
d_func()->externalPort = TomahawkSettings::instance()->externalPort();
d_func()->ready = true;
// All setup is made, were done.
emit ready();
break;
case TomahawkSettings::Lan:
// Nothing has to be done here.
m_ready = true;
d_func()->ready = true;
emit ready();
break;
@ -195,15 +194,15 @@ Servent::startListening( QHostAddress ha, bool upnp, int port )
{
// upnp could be turned of on the cli with --noupnp
tLog( LOGVERBOSE ) << Q_FUNC_INFO << "External address mode set to upnp...";
m_portfwd = QPointer< PortFwdThread >( new PortFwdThread( m_port ) );
Q_ASSERT( m_portfwd );
connect( m_portfwd.data(), SIGNAL( externalAddressDetected( QHostAddress, unsigned int ) ),
d_func()->portfwd = QPointer< PortFwdThread >( new PortFwdThread( d_func()->port ) );
Q_ASSERT( d_func()->portfwd );
connect( d_func()->portfwd.data(), SIGNAL( externalAddressDetected( QHostAddress, unsigned int ) ),
SLOT( setExternalAddress( QHostAddress, unsigned int ) ) );
m_portfwd.data()->start();
d_func()->portfwd.data()->start();
}
else
{
m_ready = true;
d_func()->ready = true;
emit ready();
}
break;
@ -218,16 +217,16 @@ Servent::setExternalAddress( QHostAddress ha, unsigned int port )
{
if ( isValidExternalIP( ha ) )
{
m_externalHostname = ha.toString();
m_externalPort = port;
d_func()->externalHostname = ha.toString();
d_func()->externalPort = port;
}
if ( m_externalPort == 0 || !isValidExternalIP( ha ) )
if ( d_func()->externalPort == 0 || !isValidExternalIP( ha ) )
tLog() << Q_FUNC_INFO << "UPnP failed, no further external address could be acquired!";
else
tLog( LOGVERBOSE ) << Q_FUNC_INFO << "UPnP setup successful";
m_ready = true;
d_func()->ready = true;
emit ready();
}
@ -309,13 +308,13 @@ Servent::isValidExternalIP( const QHostAddress& addr )
void
Servent::registerOffer( const QString& key, Connection* conn )
{
m_offers[key] = QPointer<Connection>(conn);
d_func()->offers[key] = QPointer<Connection>(conn);
}
void
Servent::registerLazyOffer(const QString &key, const peerinfo_ptr &peerInfo, const QString &nodeid, const int timeout )
{
m_lazyoffers[key] = QPair< peerinfo_ptr, QString >( peerInfo, nodeid );
d_func()->lazyoffers[key] = QPair< peerinfo_ptr, QString >( peerInfo, nodeid );
QTimer* timer = new QTimer( this );
timer->setInterval( timeout );
timer->setSingleShot( true );
@ -326,7 +325,7 @@ Servent::registerLazyOffer(const QString &key, const peerinfo_ptr &peerInfo, con
void
Servent::deleteLazyOffer( const QString& key )
{
m_lazyoffers.remove( key );
d_func()->lazyoffers.remove( key );
// Cleanup.
QTimer* timer = (QTimer*)sender();
@ -341,8 +340,8 @@ Servent::registerControlConnection( ControlConnection* conn )
{
Q_ASSERT( conn );
tLog( LOGVERBOSE ) << Q_FUNC_INFO << conn->name();
m_controlconnections << conn;
m_connectedNodes << conn->id();
d_func()->controlconnections << conn;
d_func()->connectedNodes << conn->id();
}
@ -352,15 +351,15 @@ Servent::unregisterControlConnection( ControlConnection* conn )
Q_ASSERT( conn );
tLog( LOGVERBOSE ) << Q_FUNC_INFO << conn->name();
m_connectedNodes.removeAll( conn->id() );
m_controlconnections.removeAll( conn );
d_func()->connectedNodes.removeAll( conn->id() );
d_func()->controlconnections.removeAll( conn );
}
ControlConnection*
Servent::lookupControlConnection( const SipInfo& sipInfo )
{
foreach ( ControlConnection* c, m_controlconnections )
foreach ( ControlConnection* c, d_func()->controlconnections )
{
tLog() << sipInfo.port() << c->peerPort() << sipInfo.host() << c->peerIpAddress().toString();
if ( sipInfo.port() == c->peerPort() && sipInfo.host() == c->peerIpAddress().toString() )
@ -373,7 +372,7 @@ Servent::lookupControlConnection( const SipInfo& sipInfo )
ControlConnection*
Servent::lookupControlConnection( const QString& nodeid )
{
foreach ( ControlConnection* c, m_controlconnections )
foreach ( ControlConnection* c, d_func()->controlconnections )
{
if ( c->id() == nodeid )
return c;
@ -386,21 +385,21 @@ QList<SipInfo>
Servent::getLocalSipInfos( const QString& nodeid, const QString& key )
{
QList<SipInfo> sipInfos = QList<SipInfo>();
foreach ( QHostAddress ha, m_externalAddresses )
foreach ( QHostAddress ha, d_func()->externalAddresses )
{
SipInfo info = SipInfo();
info.setHost( ha.toString() );
info.setPort( m_port );
info.setPort( d_func()->port );
info.setKey( key );
info.setVisible( true );
info.setNodeId( nodeid );
sipInfos.append( info );
}
if ( m_externalHostname.length() > 0)
if ( d_func()->externalHostname.length() > 0)
{
SipInfo info = SipInfo();
info.setHost( m_externalHostname );
info.setPort( m_externalPort );
info.setHost( d_func()->externalHostname );
info.setPort( d_func()->externalPort );
info.setKey( key );
info.setVisible( true );
info.setNodeId( nodeid );
@ -585,7 +584,7 @@ Servent::readyRead()
ControlConnection* cc = 0;
bool ok;
QString key, conntype, nodeid, controlid;
QVariantMap m = parser.parse( sock.data()->_msg->payload(), &ok ).toMap();
QVariantMap m = d_func()->parser.parse( sock.data()->_msg->payload(), &ok ).toMap();
if ( !ok )
{
tDebug() << "Invalid JSON on new connection, aborting";
@ -601,13 +600,13 @@ Servent::readyRead()
if ( !nodeid.isEmpty() ) // only control connections send nodeid
{
bool dupe = false;
if ( m_connectedNodes.contains( nodeid ) )
if ( d_func()->connectedNodes.contains( nodeid ) )
{
tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "Connected nodes contains it.";
dupe = true;
}
foreach ( ControlConnection* con, m_controlconnections )
foreach ( ControlConnection* con, d_func()->controlconnections )
{
Q_ASSERT( con );
@ -620,7 +619,7 @@ Servent::readyRead()
}
// for zeroconf there might be no offer, that case is handled later
ControlConnection* ccMatch = qobject_cast< ControlConnection* >( m_offers.value( key ).data() );
ControlConnection* ccMatch = qobject_cast< ControlConnection* >( d_func()->offers.value( key ).data() );
if ( dupe && ccMatch )
{
tLog() << "Duplicate control connection detected, dropping:" << nodeid << conntype;
@ -631,7 +630,7 @@ Servent::readyRead()
peerInfoDebug( currentPeerInfo );
}
foreach ( ControlConnection* keepConnection, m_controlconnections )
foreach ( ControlConnection* keepConnection, d_func()->controlconnections )
{
Q_ASSERT( keepConnection );
@ -654,7 +653,7 @@ Servent::readyRead()
}
}
foreach ( ControlConnection* con, m_controlconnections )
foreach ( ControlConnection* con, d_func()->controlconnections )
{
Q_ASSERT( con );
@ -810,7 +809,7 @@ Servent::initiateConnection( const SipInfo& sipInfo, Connection* conn )
Q_ASSERT( conn );
// Check that we are not connecting to ourselves
foreach( QHostAddress ha, m_externalAddresses )
foreach( QHostAddress ha, d_func()->externalAddresses )
{
if ( sipInfo.host() == ha.toString() )
{
@ -818,7 +817,7 @@ Servent::initiateConnection( const SipInfo& sipInfo, Connection* conn )
return;
}
}
if ( sipInfo.host() == m_externalHostname )
if ( sipInfo.host() == d_func()->externalHostname )
{
tLog( LOGVERBOSE ) << Q_FUNC_INFO << "Tomahawk won't try to connect to" << sipInfo.host() << ":" << sipInfo.port() << ": same IP as ourselves.";
return;
@ -901,6 +900,36 @@ Servent::reverseOfferRequest( ControlConnection* orig_conn, const QString& their
createParallelConnection( orig_conn, new_conn, theirkey );
}
bool
Servent::visibleExternally() const
{
return (!d_func()->externalHostname.isNull()) || (d_func()->externalAddresses.length() > 0);
}
int
Servent::port() const
{
return d_func()->port;
}
QList<QHostAddress>
Servent::addresses() const
{
return d_func()->externalAddresses;
}
QString
Servent::additionalAddress() const
{
return d_func()->externalHostname;
}
int
Servent::additionalPort() const
{
return d_func()->externalPort;
}
// return the appropriate connection for a given offer key, or NULL if invalid
Connection*
Servent::claimOffer( ControlConnection* cc, const QString &nodeid, const QString &key, const QHostAddress peer )
@ -909,10 +938,10 @@ Servent::claimOffer( ControlConnection* cc, const QString &nodeid, const QString
if ( key.startsWith( "FILE_REQUEST_KEY:" ) )
{
// check if the source IP matches an existing, authenticated connection
if ( !m_noAuth && peer != QHostAddress::Any && !isIPWhitelisted( peer ) )
if ( !d_func()->noAuth && peer != QHostAddress::Any && !isIPWhitelisted( peer ) )
{
bool authed = false;
foreach ( ControlConnection* cc, m_controlconnections )
foreach ( ControlConnection* cc, d_func()->controlconnections )
{
tDebug() << Q_FUNC_INFO << "Probing:" << cc->name();
if ( cc->socket() && cc->socket()->peerAddress() == peer )
@ -962,22 +991,22 @@ Servent::claimOffer( ControlConnection* cc, const QString &nodeid, const QString
}
}
if ( m_lazyoffers.contains( key ) )
if ( d_func()->lazyoffers.contains( key ) )
{
ControlConnection* conn = new ControlConnection( this );
conn->setName( m_lazyoffers.value( key ).first->contactId() );
conn->addPeerInfo( m_lazyoffers.value( key ).first );
conn->setId( m_lazyoffers.value( key ).second );
conn->setName( d_func()->lazyoffers.value( key ).first->contactId() );
conn->addPeerInfo( d_func()->lazyoffers.value( key ).first );
conn->setId( d_func()->lazyoffers.value( key ).second );
// Register as non-lazy offer
m_lazyoffers.remove( key );
d_func()->lazyoffers.remove( key );
registerOffer( key, conn );
return conn;
}
else if ( m_offers.contains( key ) )
else if ( d_func()->offers.contains( key ) )
{
QPointer<Connection> conn = m_offers.value( key );
QPointer<Connection> conn = d_func()->offers.value( key );
if ( conn.isNull() )
{
// This can happen if it's a streamconnection, but the audioengine has
@ -997,7 +1026,7 @@ Servent::claimOffer( ControlConnection* cc, const QString &nodeid, const QString
if ( conn.data()->onceOnly() )
{
m_offers.remove( key );
d_func()->offers.remove( key );
return conn.data();
}
else
@ -1005,7 +1034,7 @@ Servent::claimOffer( ControlConnection* cc, const QString &nodeid, const QString
return conn.data()->clone();
}
}
else if ( m_noAuth )
else if ( d_func()->noAuth )
{
Connection* conn;
conn = new ControlConnection( this );
@ -1049,11 +1078,11 @@ Servent::remoteIODeviceFactory( const Tomahawk::result_ptr& result,
void
Servent::registerStreamConnection( StreamConnection* sc )
{
Q_ASSERT( !m_scsessions.contains( sc ) );
tDebug( LOGVERBOSE ) << "Registering Stream" << m_scsessions.length() + 1;
Q_ASSERT( !d_func()->scsessions.contains( sc ) );
tDebug( LOGVERBOSE ) << "Registering Stream" << d_func()->scsessions.length() + 1;
QMutexLocker lock( &m_ftsession_mut );
m_scsessions.append( sc );
QMutexLocker lock( &d_func()->ftsession_mut );
d_func()->scsessions.append( sc );
printCurrentTransfers();
emit streamStarted( sc );
@ -1066,8 +1095,8 @@ Servent::onStreamFinished( StreamConnection* sc )
Q_ASSERT( sc );
tDebug( LOGVERBOSE ) << "Stream Finished, unregistering" << sc->id();
QMutexLocker lock( &m_ftsession_mut );
m_scsessions.removeAll( sc );
QMutexLocker lock( &d_func()->ftsession_mut );
d_func()->scsessions.removeAll( sc );
printCurrentTransfers();
emit streamFinished( sc );
@ -1080,7 +1109,7 @@ Servent::printCurrentTransfers()
{
int k = 1;
// qDebug() << "~~~ Active file transfer connections:" << m_scsessions.length();
foreach ( StreamConnection* i, m_scsessions )
foreach ( StreamConnection* i, d_func()->scsessions )
{
qDebug() << k << ") " << i->id();
}
@ -1118,7 +1147,7 @@ Servent::isIPWhitelisted( QHostAddress ip )
bool
Servent::connectedToSession( const QString& session )
{
foreach ( ControlConnection* cc, m_controlconnections )
foreach ( ControlConnection* cc, d_func()->controlconnections )
{
Q_ASSERT( cc );
@ -1129,6 +1158,18 @@ Servent::connectedToSession( const QString& session )
return false;
}
unsigned int
Servent::numConnectedPeers() const
{
return d_func()->controlconnections.length();
}
QList<StreamConnection *>
Servent::streams() const
{
return d_func()->scsessions;
}
void
Servent::triggerDBSync()
@ -1152,7 +1193,7 @@ void
Servent::registerIODeviceFactory( const QString &proto,
IODeviceFactoryFunc fac )
{
m_iofactories.insert( proto, fac );
d_func()->iofactories.insert( proto, fac );
}
@ -1170,14 +1211,14 @@ Servent::getIODeviceForUrl( const Tomahawk::result_ptr& result,
}
const QString proto = rx.cap( 1 );
if ( !m_iofactories.contains( proto ) )
if ( !d_func()->iofactories.contains( proto ) )
{
callback( sp );
return;
}
//JSResolverHelper::customIODeviceFactory is async!
m_iofactories.value( proto )( result, callback );
d_func()->iofactories.value( proto )( result, callback );
}
@ -1207,3 +1248,9 @@ Servent::httpIODeviceFactory( const Tomahawk::result_ptr& result,
QSharedPointer< QIODevice > sp = QSharedPointer< QIODevice >( reply, &QObject::deleteLater );
callback( sp );
}
bool
Servent::isReady() const
{
return d_func()->ready;
}

View File

@ -32,18 +32,10 @@
#include <QtCore/QTimer>
#include <QtCore/QPointer>
#include <QtNetwork/QTcpServer>
#include <QtNetwork/QTcpSocket>
#include <QtNetwork/QHostInfo>
#include <qjson/parser.h>
#include <qjson/serializer.h>
#include <qjson/qobjecthelper.h>
#include "Typedefs.h"
#include "Msg.h"
#include "network/QTcpSocketExtra.h"
#include <boost/function.hpp>
#include "DllMacro.h"
@ -52,14 +44,22 @@ class Connector;
class ControlConnection;
class StreamConnection;
class ProxyConnection;
class QTcpSocketExtra;
class RemoteCollectionConnection;
class PortFwdThread;
class PeerInfo;
class SipInfo;
namespace boost
{
template <class T> class function;
} // boost
typedef boost::function< void( const Tomahawk::result_ptr&,
boost::function< void( QSharedPointer< QIODevice >& ) > )> IODeviceFactoryFunc;
class ServentPrivate;
class DLLEXPORT Servent : public QTcpServer
{
Q_OBJECT
@ -96,34 +96,34 @@ public:
void initiateConnection( const SipInfo& sipInfo, Connection* conn );
void reverseOfferRequest( ControlConnection* orig_conn, const QString &theirdbid, const QString& key, const QString& theirkey );
bool visibleExternally() const { return (!m_externalHostname.isNull()) || (m_externalAddresses.length() > 0); }
bool visibleExternally() const;
/**
* The port this Peer listens directly (per default)
*/
int port() const { return m_port; }
int port() const;
/**
* The IP addresses this Peer listens directly (per default)
*/
QList< QHostAddress > addresses() const { return m_externalAddresses; }
QList< QHostAddress > addresses() const;
/**
* An additional address this peer listens to, e.g. via UPnP.
*/
QString additionalAddress() const { return m_externalHostname; }
QString additionalAddress() const;
/**
* An additional port this peer listens to, e.g. via UPnP (only in combination with additionalAddress.
*/
int additionalPort() const { return m_externalPort; }
int additionalPort() const;
static bool isIPWhitelisted( QHostAddress ip );
bool connectedToSession( const QString& session );
unsigned int numConnectedPeers() const { return m_controlconnections.length(); }
unsigned int numConnectedPeers() const;
QList< StreamConnection* > streams() const { return m_scsessions; }
QList< StreamConnection* > streams() const;
void getIODeviceForUrl( const Tomahawk::result_ptr& result, boost::function< void ( QSharedPointer< QIODevice >& ) > callback );
void registerIODeviceFactory( const QString &proto, IODeviceFactoryFunc fac );
@ -131,7 +131,7 @@ public:
void localFileIODeviceFactory( const Tomahawk::result_ptr& result, boost::function< void ( QSharedPointer< QIODevice >& ) > callback );
void httpIODeviceFactory( const Tomahawk::result_ptr& result, boost::function< void ( QSharedPointer< QIODevice >& ) > callback );
bool isReady() const { return m_ready; }
bool isReady() const;
QList<SipInfo> getLocalSipInfos(const QString& nodeid, const QString &key);
signals:
@ -162,46 +162,13 @@ private slots:
Connection* claimOffer( ControlConnection* cc, const QString &nodeid, const QString &key, const QHostAddress peer = QHostAddress::Any );
private:
Q_DECLARE_PRIVATE( Servent )
ServentPrivate* d_ptr;
void handoverSocket( Connection* conn, QTcpSocketExtra* sock );
void cleanupSocket( QTcpSocketExtra* sock );
void printCurrentTransfers();
QJson::Parser parser;
QList< ControlConnection* > m_controlconnections; // canonical list of authed peers
QMap< QString, QPointer< Connection > > m_offers;
QMap< QString, QPair< Tomahawk::peerinfo_ptr, QString > > m_lazyoffers;
QStringList m_connectedNodes;
/**
* The external port used by all address except those obtained via UPnP or the static configuration option
*/
int m_port;
/**
* Either the static set or the UPnP set external port
*/
int m_externalPort;
/**
* All available external IPs
*/
QList<QHostAddress> m_externalAddresses;
/**
* Either the static set or the UPnP set external host
*/
QString m_externalHostname;
bool m_ready;
bool m_noAuth;
// currently active file transfers:
QList< StreamConnection* > m_scsessions;
QMutex m_ftsession_mut;
QMap< QString, IODeviceFactoryFunc > m_iofactories;
QPointer< PortFwdThread > m_portfwd;
static Servent* s_instance;
};

View File

@ -0,0 +1,90 @@
/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===
*
* Copyright 2010-2011, Christian Muehlhaeuser <muesli@tomahawk-player.org>
* Copyright 2010-2012, Jeff Mitchell <jeff@tomahawk-player.org>
* Copyright 2013, Teo Mrnjavac <teo@kde.org>
* Copyright 2013, Uwe L. Korn <uwelk@xhochy.com>
*
* Tomahawk is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Tomahawk is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef SERVENT_P_H
#define SERVENT_P_H
#include "Servent.h"
#include <qjson/parser.h>
#include <qjson/serializer.h>
#include <qjson/qobjecthelper.h>
#include <boost/function.hpp>
class ServentPrivate : public QObject
{
Q_OBJECT
public:
ServentPrivate( Servent* q )
: q_ptr ( q )
, port( 0 )
, externalPort( 0 )
, ready( false )
{
}
Servent* q_ptr;
Q_DECLARE_PUBLIC ( Servent )
private:
QMap< QString, IODeviceFactoryFunc > iofactories;
QMap< QString, QPointer< Connection > > offers;
QMap< QString, QPair< Tomahawk::peerinfo_ptr, QString > > lazyoffers;
QStringList connectedNodes;
QJson::Parser parser;
/**
* canonical list of authed peers
*/
QList< ControlConnection* > controlconnections;
/**
* The external port used by all address except those obtained via UPnP or the static configuration option
*/
int port;
/**
* Either the static set or the UPnP set external port
*/
int externalPort;
/**
* All available external IPs
*/
QList<QHostAddress> externalAddresses;
/**
* Either the static set or the UPnP set external host
*/
QString externalHostname;
bool ready;
bool noAuth;
// currently active file transfers:
QList< StreamConnection* > scsessions;
QMutex ftsession_mut;
QPointer< PortFwdThread > portfwd;
};
#endif // SERVENT_P_H

View File

@ -30,6 +30,7 @@
#include "utils/Logger.h"
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <QFile>

View File

@ -109,6 +109,7 @@ INCLUDE_DIRECTORIES(
${LIBATTICA_INCLUDE_DIR}
${ECHONEST_INCLUDE_DIR}
${LIBLASTFM_INCLUDE_DIRS}
${Boost_INCLUDE_DIR}
)
IF( QXTWEB_FOUND )