10a816c5dSWilliam A. Kennington III #pragma once
20a816c5dSWilliam A. Kennington III 
365db863eSWilliam A. Kennington III #include <cstdint>
448c42751SWilliam A. Kennington III #include <functional>
5715c72f8SWilliam A. Kennington III #include <sdeventplus/event.hpp>
60a816c5dSWilliam A. Kennington III #include <sdeventplus/internal/sdref.hpp>
70a816c5dSWilliam A. Kennington III #include <systemd/sd-bus.h>
80a816c5dSWilliam A. Kennington III #include <type_traits>
90a816c5dSWilliam A. Kennington III 
100a816c5dSWilliam A. Kennington III namespace sdeventplus
110a816c5dSWilliam A. Kennington III {
120a816c5dSWilliam A. Kennington III namespace source
130a816c5dSWilliam A. Kennington III {
140a816c5dSWilliam A. Kennington III 
150a816c5dSWilliam A. Kennington III class Base
160a816c5dSWilliam A. Kennington III {
170a816c5dSWilliam A. Kennington III   public:
1848c42751SWilliam A. Kennington III     using Callback = std::function<void(Base& source)>;
1948c42751SWilliam A. Kennington III 
2065db863eSWilliam A. Kennington III     virtual ~Base();
2165db863eSWilliam A. Kennington III 
2248c42751SWilliam A. Kennington III     int prepareCallback();
2348c42751SWilliam A. Kennington III 
244863b96bSWilliam A. Kennington III     sd_event_source* get() const;
25715c72f8SWilliam A. Kennington III     const Event& get_event() const;
26715c72f8SWilliam A. Kennington III 
27d9fd9815SWilliam A. Kennington III     const char* get_description() const;
28d9fd9815SWilliam A. Kennington III     void set_description(const char* description) const;
2948c42751SWilliam A. Kennington III     void set_prepare(Callback&& callback);
30f5285c73SWilliam A. Kennington III     const Callback& get_prepare() const;
31d9fd9815SWilliam A. Kennington III     int get_pending() const;
32d9fd9815SWilliam A. Kennington III     int64_t get_priority() const;
33d9fd9815SWilliam A. Kennington III     void set_priority(int64_t priority) const;
34d9fd9815SWilliam A. Kennington III     int get_enabled() const;
35d9fd9815SWilliam A. Kennington III     void set_enabled(int enabled) const;
3665db863eSWilliam A. Kennington III 
370a816c5dSWilliam A. Kennington III   protected:
38cc6b12beSWilliam A. Kennington III     Event event;
39cc6b12beSWilliam A. Kennington III     internal::SdRef<sd_event_source> source;
400a816c5dSWilliam A. Kennington III 
410a816c5dSWilliam A. Kennington III     // Base sources cannot be directly constructed.
42715c72f8SWilliam A. Kennington III     Base(const Event& event, sd_event_source* source);
43715c72f8SWilliam A. Kennington III     Base(const Event& event, sd_event_source* source, std::false_type);
4448c42751SWilliam A. Kennington III 
45cc6b12beSWilliam A. Kennington III     // We can't ever copy an event_source because the callback
46cc6b12beSWilliam A. Kennington III     // data has to be unique.
47cc6b12beSWilliam A. Kennington III     Base(const Base& other) = delete;
48cc6b12beSWilliam A. Kennington III     Base& operator=(const Base& other) = delete;
49cc6b12beSWilliam A. Kennington III     // We don't want to allow any kind of slicing.
50*2d943eadSWilliam A. Kennington III     Base(Base&& other);
51cc6b12beSWilliam A. Kennington III     Base& operator=(Base&& other);
52cc6b12beSWilliam A. Kennington III 
5348c42751SWilliam A. Kennington III   private:
5448c42751SWilliam A. Kennington III     Callback prepare;
55*2d943eadSWilliam A. Kennington III 
56*2d943eadSWilliam A. Kennington III     void set_userdata();
570a816c5dSWilliam A. Kennington III };
580a816c5dSWilliam A. Kennington III 
590a816c5dSWilliam A. Kennington III } // namespace source
600a816c5dSWilliam A. Kennington III } // namespace sdeventplus
61