Program Listing for File HsmEventDispatcherGLibmm.hpp

Return to documentation for file (include/hsmcpp/HsmEventDispatcherGLibmm.hpp)

// Copyright (C) 2021 Igor Krechetov
// Distributed under MIT license. See file LICENSE for details

#ifndef HSMCPP_HSMEVENTDISPATCHERGLIBMM_HPP
#define HSMCPP_HSMEVENTDISPATCHERGLIBMM_HPP

#include <glibmm.h>

#include <memory>

#include "HsmEventDispatcherBase.hpp"

namespace hsmcpp {

class HsmEventDispatcherGLibmm : public HsmEventDispatcherBase {
public:
    static std::shared_ptr<HsmEventDispatcherGLibmm> create(const size_t eventsCacheSize = DISPATCHER_DEFAULT_EVENTS_CACHESIZE);

    static std::shared_ptr<HsmEventDispatcherGLibmm> create(const Glib::RefPtr<Glib::MainContext>& context,
                                                            const size_t eventsCacheSize = DISPATCHER_DEFAULT_EVENTS_CACHESIZE);

    bool start() override;

    void stop() override;

    void emitEvent(const HandlerID_t handlerID) override;

protected:
    explicit HsmEventDispatcherGLibmm(const size_t eventsCacheSize = DISPATCHER_DEFAULT_EVENTS_CACHESIZE);

    HsmEventDispatcherGLibmm(const Glib::RefPtr<Glib::MainContext>& context,
                             const size_t eventsCacheSize = DISPATCHER_DEFAULT_EVENTS_CACHESIZE);
    virtual ~HsmEventDispatcherGLibmm();

    bool deleteSafe() override;

    void unregisterAllTimerHandlers();

    void startTimerImpl(const TimerID_t timerID, const unsigned int intervalMs, const bool isSingleShot) override;
    void stopTimerImpl(const TimerID_t timerID) override;

    void notifyDispatcherAboutEvent() override;
    bool onTimerEvent(const TimerID_t timerID);

private:
    Glib::RefPtr<Glib::MainContext> mMainContext;
    std::unique_ptr<Glib::Dispatcher> mDispatcher;
    sigc::connection mDispatcherConnection;
    std::map<TimerID_t, sigc::connection> mNativeTimerHandlers; // protected by mRunningTimersSync
};

}  // namespace hsmcpp

#endif  // HSMCPP_HSMEVENTDISPATCHERGLIBMM_HPP