New revised API attached
Changes:
- Updated to spec 0.17.23
- Removed BaseHandlerClient::addRequest/removeFailedRequest
- Added BaseHandlerClient::requestAdded/requestRemoved signals
- Added ChannelDispatchOperation::reject()
- Removed ChannelRequest::proceed
- Some other small changes
I will start implementing this, if anyone has any objection please let
me know.
BR
Andrunko
typedef SharedPtr<ChannelDispatchOperation> ChannelDispatchOperationPtr;
typedef SharedPtr<ChannelRequest> ChannelRequestPtr;
class ChannelDispatchOperation : public StatefulDBusProxy,
private OptionalInterfaceFactory<ChannelDispatchOperation>,
public ReadyObject,
public RefCounted
{
Q_OBJECT
public:
static ChannelDispatchOperationPtr create(const QString &objectPath,
const QVariantMap &immutableProperties);
~ChannelDispatchOperation();
AccountPtr account() const;
ConnectionPtr connection() const;
QList<ChannelPtr> channels() const;
QStringList possibleHandlers() const;
PendingOperation *handleWith(const QString &handler);
PendingOperation *claim();
// claim/close
PendingOperation *reject();
Q_SIGNALS:
void channelLost(const QString &channelObjectPath, const QString &errorName,
const QString &errorMessage);
// TODO should we have finished, or use invalidated?
};
// TODO should it be a DBusProxy?
class ChannelRequest : public StatefulDBusProxy,
private OptionalInterfaceFactory<ChannelDispatchOperation>,
public ReadyObject,
public RefCounted
{
Q_OBJECT
public:
static ChannelRequestPtr create(const QString &objectPath,
const QVariantMap &immutableProperties);
~ChannelRequest();
AccountPtr account() const;
QDateTime userActionTime() const;
QVariantMap requests() const;
PendingOperation *cancel();
Q_SIGNALS:
void failed(const QString &errorName, const QString &errorMessage);
void succeeded();
};
class BaseClient : public QObject
{
Q_OBJECT
public:
BaseClient(const QVariantMap &filters, QObject *parent = 0);
~BaseClient();
QVariantMap filters() const;
};
class BaseObserverClient : public BaseClient
{
public:
BaseObserver(const QVariantMap &filters, QObject *parent = 0);
virtual ~BaseObserver();
// The observer MUST call operation->setFinished when a handler for
// the channel is ready to run
virtual void observeChannels(PendingOperation *operation,
const AccountPtr &account,
const ConnectionPtr &connection,
const QList<ChannelPtr> &channels,
const QList<ChannelRequestPtr> &requestsSatisfied,
const ChannelDispatchOperationPtr &dispatchOperation,
const QVariantMap &observerInfo) = 0;
};
class BaseApproverClient : public BaseClient
{
public:
BaseApprover(const QVariantMap &filters, QObject *parent = 0);
virtual ~BaseApprover();
// call operation->setFinished/WithError when done with this method
virtual void addDispatchOperation(PendingOperation *operation,
const ChannelDispatchOperationPtr &dispatchOperation) = 0;
};
class BaseHandlerClient : public BaseClient
{
public:
BaseHandler(const QVariantMap &filters, QObject *parent = 0);
virtual ~BaseHandler();
// addRequest/removeFailedRequest will only be called if true, default =
// true
void listenRequests(bool listen);
// call operation->setFinished/WithError when done with these methods
virtual void handleChannels(PendingOperation *operation,
const AccountPtr &account,
const ConnectionPtr &connection,
const QList<ChannelPtr> &channels,
const QList<ChannelRequestPtr> &requestsSatisfied,
const QDateTime &userActionTime,
const QVariantMap &handlerInfo) = 0;
Q_SIGNALS:
void requestAdded(const QString &requestObjectPath,
const QVariantMap &requestProperties);
void requestRemoved(const QString &requestObjectPath,
const QString &error, const QString &message);
};
class ClientRegister : public QObject
{
public:
// clientName is the name to be used
ClientRegister(const QString &clientName, bool unique = false,
QObject *parent = 0);
~ClientRegister();
QString clientName() const;
bool addClient(BaseClient *client);
bool removeClient(BaseClient *client);
// register all clients added using addClient
bool registerClients();
// register a given client, mostly useful when the client is unregistered
// and needs to be registered again
bool registerClient(BaseClient *client);
// unregister all clients
void unregisterClients();
// unregister a given client if the client is registered
bool unregisterClient(BaseClient *client);
};
void MyHandler : public BaseHandlerClient
{
public:
MyHandler(const QVariantMap &filters, QObject *parent = 0);
~MyHandler();
void handleChannels(PendingOperation *operation,
const AccountPtr &account,
const ConnectionPtr &connection,
const QList<ChannelPtr> &channels,
const QStringList &requestsSatisfiedObjectPaths,
const QDateTime &userActionTime,
const QVariantMap &handlerInfo)
{
foreach (const ChannelPtr &channel, channels) {
MyHandlerUI *handlerUI = lookupHandlerUIByChannel(channel);
if (!handlerUI) {
// create handler UI to handle channel
...
}
handlerUI->show();
}
operation->setFinished();
}
};
ClientRegister *r = new ClientRegister("myclient");
QVariantMap map;
map.insert("org.freedesktop.Telepathy.Channel.ChannelType",
"org.freedesktop.Telepathy.Channel.Type.Text");
map.insert("org.freedesktop.Telepathy.Channel.TargetHandleType",
Tp::HandleTypeContelepathyct);
MyHandler *h = new MyHandler(filters, r);
r->addClient(h);
r->registerClients();
_______________________________________________
telepathy mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/telepathy