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

Reply via email to