/**
* This file is part of TelepathyQt4
*
* @copyright Copyright (C) 2009-2010 Collabora Ltd.
* @copyright Copyright (C) 2009-2010 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 _TelepathyQt4_abstract_client_h_HEADER_GUARD_
#define _TelepathyQt4_abstract_client_h_HEADER_GUARD_
#ifndef IN_TELEPATHY_QT4_HEADER
#error IN_TELEPATHY_QT4_HEADER
#endif
#include
#include
#include
#include
#include
#include
#include
#include
namespace Tp
{
class ClientRegistrar;
class ChannelClassSpecList;
class TELEPATHY_QT4_EXPORT AbstractClient : public RefCounted
{
Q_DISABLE_COPY(AbstractClient)
public:
AbstractClient();
virtual ~AbstractClient();
};
class TELEPATHY_QT4_EXPORT AbstractClientObserver : public virtual AbstractClient
{
Q_DISABLE_COPY(AbstractClientObserver)
public:
class ObserverInfo
{
public:
ObserverInfo(const QVariantMap &info = QVariantMap());
ObserverInfo(const ObserverInfo &other);
~ObserverInfo();
ObserverInfo &operator=(const ObserverInfo &other);
bool isRecovering() const { return qdbus_cast(allInfo().value(QLatin1String("recovering"))); }
QVariantMap allInfo() const;
private:
struct Private;
QSharedDataPointer mPriv;
};
virtual ~AbstractClientObserver();
ChannelClassSpecList observerFilter() const;
bool shouldRecover() const;
virtual void observeChannels(const MethodInvocationContextPtr<> &context,
const AccountPtr &account,
const ConnectionPtr &connection,
const QList &channels,
const ChannelDispatchOperationPtr &dispatchOperation,
const QList &requestsSatisfied,
const ObserverInfo &observerInfo) = 0;
protected:
AbstractClientObserver(const ChannelClassSpecList &channelFilter, bool shouldRecover = false);
private:
struct Private;
friend struct Private;
Private *mPriv;
};
class TELEPATHY_QT4_EXPORT AbstractClientApprover : public virtual AbstractClient
{
Q_DISABLE_COPY(AbstractClientApprover)
public:
virtual ~AbstractClientApprover();
ChannelClassSpecList approverFilter() const;
virtual void addDispatchOperation(const MethodInvocationContextPtr<> &context,
const ChannelDispatchOperationPtr &dispatchOperation) = 0;
protected:
AbstractClientApprover(const ChannelClassSpecList &channelFilter);
private:
struct Private;
friend struct Private;
Private *mPriv;
};
/*
* TODO: use case specific subclasses:
* - StreamTubeHandler(QString(List) protocol(s))
* - handleTube(DBusTubeChannelPtr, userActionTime)
* - DBusTubeHandler(QString(List) serviceName(s))
* - handleTube(DBusTubeChannelPtr, userActionTime)
*/
class TELEPATHY_QT4_EXPORT AbstractClientHandler : public virtual AbstractClient
{
Q_DISABLE_COPY(AbstractClientHandler)
public:
class Capabilities
{
public:
Capabilities(const QStringList &tokens = QStringList());
Capabilities(const Capabilities &other);
~Capabilities();
Capabilities &operator=(const Capabilities &other);
bool hasGTalkP2PNATTraversalToken() const
{
return hasToken(TP_QT4_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
QLatin1String("/gtalk-p2p"));
}
void setGTalkP2PNATTraversalToken()
{
setToken(TP_QT4_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
QLatin1String("/gtalk-p2p"));
}
void unsetGTalkP2PNATTraversalToken()
{
unsetToken(TP_QT4_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
QLatin1String("/gtalk-p2p"));
}
bool hasICEUDPNATTraversalToken() const
{
return hasToken(TP_QT4_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
QLatin1String("/ice-udp"));
}
void setICEUDPNATTraversalToken()
{
setToken(TP_QT4_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
QLatin1String("/ice-udp"));
}
void unsetICEUDPNATTraversalToken()
{
unsetToken(TP_QT4_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
QLatin1String("/ice-udp"));
}
bool hasWLM85NATTraversalToken() const
{
return hasToken(TP_QT4_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
QLatin1String("/wlm-8.5"));
}
void setWLM85NATTraversalToken()
{
setToken(TP_QT4_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
QLatin1String("/wlm-8.5"));
}
void unsetWLM85NATTraversalToken()
{
unsetToken(TP_QT4_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
QLatin1String("/wlm-8.5"));
}
bool hasWLM2009NATTraversalToken() const
{
return hasToken(TP_QT4_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
QLatin1String("/wlm-2009"));
}
void setWLM2009NATTraversalToken()
{
setToken(TP_QT4_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
QLatin1String("/wlm-2009"));
}
void unsetWLM2009NATTraversalToken()
{
unsetToken(TP_QT4_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
QLatin1String("/wlm-2009"));
}
bool hasAudioCodecToken(const QString &mimeSubType) const
{
return hasToken(TP_QT4_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
QLatin1String("/audio/") + mimeSubType.toLower());
}
void setAudioCodecToken(const QString &mimeSubType)
{
setToken(TP_QT4_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
QLatin1String("/audio/") + mimeSubType.toLower());
}
void unsetAudioCodecToken(const QString &mimeSubType)
{
unsetToken(TP_QT4_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
QLatin1String("/audio/") + mimeSubType.toLower());
}
bool hasVideoCodecToken(const QString &mimeSubType) const
{
return hasToken(TP_QT4_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
QLatin1String("/video/") + mimeSubType.toLower());
}
void setVideoCodecToken(const QString &mimeSubType)
{
setToken(TP_QT4_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
QLatin1String("/video/") + mimeSubType.toLower());
}
void unsetVideoCodecToken(const QString &mimeSubType)
{
unsetToken(TP_QT4_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
QLatin1String("/video/") + mimeSubType.toLower());
}
bool hasToken(const QString &token) const;
void setToken(const QString &token);
void unsetToken(const QString &token);
QStringList allTokens() const;
private:
struct Private;
QSharedDataPointer mPriv;
};
class HandlerInfo
{
public:
HandlerInfo(const QVariantMap &info = QVariantMap());
HandlerInfo(const HandlerInfo &other);
~HandlerInfo();
HandlerInfo &operator=(const HandlerInfo &other);
QVariantMap allInfo() const;
private:
struct Private;
QSharedDataPointer mPriv;
};
virtual ~AbstractClientHandler();
// FIXME (API/ABI break) Move isRegistered/setRegistered to AbstractClient
bool isRegistered() const;
ChannelClassSpecList handlerFilter() const;
Capabilities handlerCapabilities() const;
virtual bool bypassApproval() const = 0;
virtual void handleChannels(const MethodInvocationContextPtr<> &context,
const AccountPtr &account,
const ConnectionPtr &connection,
const QList &channels,
const QList &requestsSatisfied,
const QDateTime &userActionTime,
const HandlerInfo &handlerInfo) = 0;
bool wantsRequestNotification() const;
virtual void addRequest(const ChannelRequestPtr &request);
virtual void removeRequest(const ChannelRequestPtr &request,
const QString &errorName, const QString &errorMessage);
protected:
AbstractClientHandler(const ChannelClassSpecList &channelFilter,
const Capabilities &capabilities = Capabilities(),
bool wantsRequestNotification = false);
private:
friend class ClientRegistrar;
void setRegistered(bool registered);
struct Private;
friend struct Private;
Private *mPriv;
};
} // Tp
Q_DECLARE_METATYPE(Tp::AbstractClientObserver::ObserverInfo);
Q_DECLARE_METATYPE(Tp::AbstractClientHandler::Capabilities);
Q_DECLARE_METATYPE(Tp::AbstractClientHandler::HandlerInfo);
#endif