Another try replacing operationHandle with PendingOperation, to be consistent with the rest of the library.

BR
Andrunko
typedef SharedPtr<ChannelDispatchOperation> ChannelDispatchOperationPtr;
typedef SharedPtr<ChannelRequest> ChannelRequestPtr;

class ChannelDispatchOperation : public StatefulDBusProxy,
                                 private OptionalInterfaceFactory<ChannelDispatchOperation>,
                                 public ReadyObject,
                                 public SharedData
{
    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();

Q_SIGNALS:
    void channelLost(const QString &channelObjectPath, const QString &errorName,
            const QString &errorMessage);

    // TODO should we have finished, or use invalidated?
};

class ChannelRequest : public StatefulDBusProxy,
                       private OptionalInterfaceFactory<ChannelDispatchOperation>,
                       public ReadyObject,
                       public SharedData
{
    Q_OBJECT

public:
    static ChannelRequestPtr create(const QString &objectPath,
            const QVariantMap &immutableProperties);

    ~ChannelRequest();

    AccountPtr account() const;

    QDateTime userActionTime() const;

    QVariantMap requests() const;

    PendingOperation *proceed();
    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();

    // call operation->setFinished/WithError when done with this method
    virtual void observeChannels(PendingOperation *operation,
            const AccountPtr &account,
            const ConnectionPtr &connection,
            const QList<ChannelPtr> &channels,
            const ChannelDispatchOperationPtr &dispatchOperation) = 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) = 0;
    virtual void addRequest(PendingOperation *operation,
            const ChannelRequestPtr &request);
    virtual void removeFailedRequest(PendingOperation *operation,
            const ChannelRequestPtr &request,
            const QString &error, const QString &message) = 0;
};

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 addObserverClient(ObserverClient *client);
    bool addApproverClient(ApproverClient *client);
    bool addHandlerClient(HandlerClient *client);

    bool registerClients();
    // 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)
    {
        foreach (const ChannelPtr &channel, channels) {
            MyHandlerUI *handlerUI = lookupHandlerUIByChannel(channel);
            if (!handlerUI) {
                // create handler UI to handle channel
                ...
            }
            handlerUI->show();
        }
        operation->setFinished();
    }

    virtual void addRequest(PendingOperation *operation,
            const QString &requestObjectPath,
            const QVariantMap &requestProperties)
    {
        ...
        operation->setFinished();
    }

    virtual void removeFailedRequest(PendingOperation *operation,
            const QString &requestObjectPath,
            const QString &error, const QString &message)
    {
        ...
        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",
           Telepathy::HandleTypeContact);
MyHandler *h = new MyHandler(filters, r);
r->addHandlerClient(h);
r->registerClients();
_______________________________________________
telepathy mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/telepathy

Reply via email to