/**
* This file is part of TelepathyQt
*
* @copyright Copyright (C) 2011 Collabora Ltd.
* @copyright Copyright (C) 2011 Nokia Corporation
* @license LGPL 2.1
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _TelepathyQt_stream_tube_client_h_HEADER_GUARD_
#define _TelepathyQt_stream_tube_client_h_HEADER_GUARD_
#include
#include
#include
#include
#include
#include
class QHostAddress;
namespace Tp
{
class PendingStreamTubeConnection;
class TP_QT_EXPORT StreamTubeClient : public QObject, public RefCounted
{
Q_OBJECT
Q_DISABLE_COPY(StreamTubeClient)
class TubeWrapper;
public:
class TcpSourceAddressGenerator
{
public:
virtual QPair
nextSourceAddress(const AccountPtr &account, const IncomingStreamTubeChannelPtr &tube) = 0;
protected:
virtual ~TcpSourceAddressGenerator() {}
};
class Tube : public QPair
{
public:
Tube();
Tube(const AccountPtr &account, const IncomingStreamTubeChannelPtr &channel);
Tube(const Tube &other);
~Tube();
bool isValid() const { return mPriv.constData() != 0; }
Tube &operator=(const Tube &other);
const AccountPtr &account() const
{
return first;
}
const IncomingStreamTubeChannelPtr &channel() const
{
return second;
}
private:
struct Private;
friend struct Private;
QSharedDataPointer mPriv;
};
static StreamTubeClientPtr create(
const QStringList &p2pServices,
const QStringList &roomServices = QStringList(),
const QString &clientName = QString(),
bool monitorConnections = false,
bool bypassApproval = false,
const AccountFactoryConstPtr &accountFactory =
AccountFactory::create(QDBusConnection::sessionBus()),
const ConnectionFactoryConstPtr &connectionFactory =
ConnectionFactory::create(QDBusConnection::sessionBus()),
const ChannelFactoryConstPtr &channelFactory =
ChannelFactory::create(QDBusConnection::sessionBus()),
const ContactFactoryConstPtr &contactFactory =
ContactFactory::create());
static StreamTubeClientPtr create(
const QDBusConnection &bus,
const AccountFactoryConstPtr &accountFactory,
const ConnectionFactoryConstPtr &connectionFactory,
const ChannelFactoryConstPtr &channelFactory,
const ContactFactoryConstPtr &contactFactory,
const QStringList &p2pServices,
const QStringList &roomServices = QStringList(),
const QString &clientName = QString(),
bool monitorConnections = false,
bool bypassApproval = false);
static StreamTubeClientPtr create(
const AccountManagerPtr &accountManager,
const QStringList &p2pServices,
const QStringList &roomServices = QStringList(),
const QString &clientName = QString(),
bool monitorConnections = false,
bool bypassApproval = false);
static StreamTubeClientPtr create(
const ClientRegistrarPtr ®istrar,
const QStringList &p2pServices,
const QStringList &roomServices = QStringList(),
const QString &clientName = QString(),
bool monitorConnections = false,
bool bypassApproval = false);
virtual ~StreamTubeClient();
ClientRegistrarPtr registrar() const;
QString clientName() const;
bool isRegistered() const;
bool monitorsConnections() const;
bool acceptsAsTcp() const;
TcpSourceAddressGenerator *tcpGenerator() const;
bool acceptsAsUnix() const;
void setToAcceptAsTcp(TcpSourceAddressGenerator *generator = 0);
void setToAcceptAsUnix(bool requireCredentials = false);
QList tubes() const;
QHash > connections() const;
Q_SIGNALS:
void tubeOffered(
const Tp::AccountPtr &account,
const Tp::IncomingStreamTubeChannelPtr &tube);
void tubeClosed(
const Tp::AccountPtr &account,
const Tp::IncomingStreamTubeChannelPtr &tube,
const QString &error,
const QString &message);
void tubeAcceptedAsTcp(
const QHostAddress &listenAddress,
quint16 listenPort,
const QHostAddress &sourceAddress,
quint16 sourcePort,
const Tp::AccountPtr &account,
const Tp::IncomingStreamTubeChannelPtr &tube);
void tubeAcceptedAsUnix(
const QString &listenAddress,
bool requiresCredentials,
uchar credentialByte,
const Tp::AccountPtr &account,
const Tp::IncomingStreamTubeChannelPtr &tube);
void newConnection(
const Tp::AccountPtr &account,
const Tp::IncomingStreamTubeChannelPtr &tube,
uint connectionId);
void connectionClosed(
const Tp::AccountPtr &account,
const Tp::IncomingStreamTubeChannelPtr &tube,
uint connectionId,
const QString &error,
const QString &message);
private Q_SLOTS:
TP_QT_NO_EXPORT void onInvokedForTube(
const Tp::AccountPtr &account,
const Tp::StreamTubeChannelPtr &tube,
const QDateTime &userActionTime,
const Tp::ChannelRequestHints &requestHints);
TP_QT_NO_EXPORT void onAcceptFinished(TubeWrapper *, Tp::PendingStreamTubeConnection *);
TP_QT_NO_EXPORT void onTubeInvalidated(Tp::DBusProxy *, const QString &, const QString &);
TP_QT_NO_EXPORT void onNewConnection(
TubeWrapper *wrapper,
uint conn);
TP_QT_NO_EXPORT void onConnectionClosed(
TubeWrapper *wrapper,
uint conn,
const QString &error,
const QString &message);
private:
TP_QT_NO_EXPORT StreamTubeClient(
const ClientRegistrarPtr ®istrar,
const QStringList &p2pServices,
const QStringList &roomServices,
const QString &clientName,
bool monitorConnections,
bool bypassApproval);
struct Private;
Private *mPriv;
};
} // Tp
#endif