struct CCL::ISignalHandler

Overview

Handler for signal protocol between ISubject and IObserver. More…

#include <isignalhandler.h>

struct ISignalHandler: public CCL::IUnknown
{
    // methods

    virtual tresult CCL_API advise (ISubject* subject, IObserver* observer) = 0;
    virtual tresult CCL_API unadvise (ISubject* subject, IObserver* observer) = 0;
    virtual tresult CCL_API performSignal (ISubject* subject, MessageRef msg) = 0;
    virtual tresult CCL_API queueSignal (ISubject* subject, IMessage* msg) = 0;
    virtual tresult CCL_API queueChanged (ISubject* subject) = 0;
    virtual tresult CCL_API cancelSignals (ISubject* subject) = 0;

    virtual tresult CCL_API postMessage (
        IObserver* observer,
        IMessage* msg,
        int delay = 0
    ) = 0;

    virtual tresult CCL_API postMessageBlocking (IObserver* observer, IMessage* msg) = 0;
    virtual tresult CCL_API cancelMessages (IObserver* observer) = 0;
    virtual tresult CCL_API flush (IObserver* observer = nullptr) = 0;
    virtual tbool CCL_API hasObservers (ISubject* subject) = 0;
    virtual tbool CCL_API messagesPending (IObserver* observer) = 0;
};

Inherited Members

public:
    // methods

    virtual tresult CCL_API queryInterface (UIDRef iid, void** ptr) = 0;
    virtual unsigned int CCL_API retain () = 0;
    virtual unsigned int CCL_API release () = 0;

Detailed Documentation

Handler for signal protocol between ISubject and IObserver.

Threading Policy: Everything except queueSignal() and postMessage() must be called from main thread only, otherwise the methods will fail with kResultWrongThread!

Methods

virtual tresult CCL_API advise (ISubject* subject, IObserver* observer) = 0

Establish connection between subject and observer.

virtual tresult CCL_API unadvise (ISubject* subject, IObserver* observer) = 0

Break connection between subject and observer.

virtual tresult CCL_API performSignal (ISubject* subject, MessageRef msg) = 0

This will call IObserver::notify() on all dependent observers of given subject.

virtual tresult CCL_API queueSignal (ISubject* subject, IMessage* msg) = 0

Queue signal message of given subject.

It is performed next time flush() is called. If equal messages are queued for a subject, the signal is performed only once.

virtual tresult CCL_API queueChanged (ISubject* subject) = 0

Optimized version of queueSignal() for kChanged message without arguments.

virtual tresult CCL_API cancelSignals (ISubject* subject) = 0

Discard any queued signal messages of given subject.

virtual tresult CCL_API postMessage (
    IObserver* observer,
    IMessage* msg,
    int delay = 0
) = 0

Post message directly to given observer with delay given in milliseconds.

Delayed messages are delivered only once.

virtual tresult CCL_API postMessageBlocking (IObserver* observer, IMessage* msg) = 0

Similar to postMessage(), but calling thread blocks until message is delivered or canceled.

virtual tresult CCL_API cancelMessages (IObserver* observer) = 0

Discard any messages posted to given observer which have not been delivered yet.

virtual tresult CCL_API flush (IObserver* observer = nullptr) = 0

Flush queued signals.

virtual tbool CCL_API hasObservers (ISubject* subject) = 0

Return true, if it still has observers.

virtual tbool CCL_API messagesPending (IObserver* observer) = 0

Return true, if there are undelivered messages for the observer.