1 #pragma once
2 
3 #include <cstdint>
4 #include <functional>
5 #include <sdeventplus/internal/sdevent.hpp>
6 #include <sdeventplus/internal/sdref.hpp>
7 #include <systemd/sd-bus.h>
8 #include <type_traits>
9 
10 namespace sdeventplus
11 {
12 namespace source
13 {
14 
15 class Base
16 {
17   public:
18     using Callback = std::function<void(Base& source)>;
19 
20     virtual ~Base();
21 
22     // We don't want to allow any kind of slicing.
23     Base(const Base& source) = delete;
24     Base& operator=(const Base& source) = delete;
25     Base(Base&& source) = delete;
26     Base& operator=(Base&& source) = delete;
27 
28     int prepareCallback();
29 
30     const char* get_description();
31     void set_description(const char* description);
32     void set_prepare(Callback&& callback);
33     int get_pending();
34     int64_t get_priority();
35     void set_priority(int64_t priority);
36     int get_enabled();
37     void set_enabled(int enabled);
38 
39   protected:
40     const internal::SdEvent* const sdevent;
41     const internal::SdRef<sd_event_source> source;
42 
43     // Base sources cannot be directly constructed.
44     Base(sd_event_source* source,
45          internal::SdEvent* sdevent = &internal::sdevent_impl);
46     Base(sd_event_source* source, std::false_type,
47          internal::SdEvent* sdevent = &internal::sdevent_impl);
48 
49   private:
50     Callback prepare;
51 };
52 
53 } // namespace source
54 } // namespace sdeventplus
55