source/base: Expose trivial built in methods
diff --git a/src/sdeventplus/internal/sdevent.hpp b/src/sdeventplus/internal/sdevent.hpp
index 7603a3d..e6c420c 100644
--- a/src/sdeventplus/internal/sdevent.hpp
+++ b/src/sdeventplus/internal/sdevent.hpp
@@ -25,6 +25,22 @@
sd_event_source_ref(sd_event_source* source) const = 0;
virtual sd_event_source*
sd_event_source_unref(sd_event_source* source) const = 0;
+
+ virtual int
+ sd_event_source_get_description(sd_event_source* source,
+ const char** description) const = 0;
+ virtual int
+ sd_event_source_set_description(sd_event_source* source,
+ const char* description) const = 0;
+ virtual int sd_event_source_get_pending(sd_event_source* source) const = 0;
+ virtual int sd_event_source_get_priority(sd_event_source* source,
+ int64_t* priority) const = 0;
+ virtual int sd_event_source_set_priority(sd_event_source* source,
+ int64_t priority) const = 0;
+ virtual int sd_event_source_get_enabled(sd_event_source* source,
+ int* enabled) const = 0;
+ virtual int sd_event_source_set_enabled(sd_event_source* source,
+ int enabled) const = 0;
};
class SdEventImpl : public SdEvent
@@ -74,6 +90,41 @@
{
return ::sd_event_source_unref(source);
}
+
+ int sd_event_source_get_description(sd_event_source* source,
+ const char** description) const override
+ {
+ return ::sd_event_source_get_description(source, description);
+ }
+ int sd_event_source_set_description(sd_event_source* source,
+ const char* description) const override
+ {
+ return ::sd_event_source_set_description(source, description);
+ }
+ int sd_event_source_get_pending(sd_event_source* source) const override
+ {
+ return ::sd_event_source_get_pending(source);
+ }
+ int sd_event_source_get_priority(sd_event_source* source,
+ int64_t* priority) const override
+ {
+ return ::sd_event_source_get_priority(source, priority);
+ }
+ int sd_event_source_set_priority(sd_event_source* source,
+ int64_t priority) const override
+ {
+ return ::sd_event_source_set_priority(source, priority);
+ }
+ int sd_event_source_get_enabled(sd_event_source* source,
+ int* enabled) const override
+ {
+ return ::sd_event_source_get_enabled(source, enabled);
+ }
+ int sd_event_source_set_enabled(sd_event_source* source,
+ int enabled) const override
+ {
+ return ::sd_event_source_set_enabled(source, enabled);
+ }
};
extern SdEventImpl sdevent_impl;
diff --git a/src/sdeventplus/source/base.cpp b/src/sdeventplus/source/base.cpp
index fd9b45f..d99d562 100644
--- a/src/sdeventplus/source/base.cpp
+++ b/src/sdeventplus/source/base.cpp
@@ -1,12 +1,93 @@
+#include <cerrno>
+#include <exception>
+#include <sdeventplus/exception.hpp>
#include <sdeventplus/internal/sdevent.hpp>
#include <sdeventplus/source/base.hpp>
+#include <stdexcept>
#include <type_traits>
+#include <utility>
namespace sdeventplus
{
namespace source
{
+Base::~Base()
+{
+ set_enabled(SD_EVENT_OFF);
+}
+
+const char* Base::get_description()
+{
+ const char* description;
+ int r =
+ sdevent->sd_event_source_get_description(source.get(), &description);
+ if (r < 0)
+ {
+ throw SdEventError(-r, "sd_event_source_get_description");
+ }
+ return description;
+}
+
+void Base::set_description(const char* description)
+{
+ int r = sdevent->sd_event_source_set_description(source.get(), description);
+ if (r < 0)
+ {
+ throw SdEventError(-r, "sd_event_source_set_description");
+ }
+}
+
+int Base::get_pending()
+{
+ int r = sdevent->sd_event_source_get_pending(source.get());
+ if (r < 0)
+ {
+ throw SdEventError(-r, "sd_event_source_get_pending");
+ }
+ return r;
+}
+
+int64_t Base::get_priority()
+{
+ int64_t priority;
+ int r = sdevent->sd_event_source_get_priority(source.get(), &priority);
+ if (r < 0)
+ {
+ throw SdEventError(-r, "sd_event_source_get_priority");
+ }
+ return priority;
+}
+
+void Base::set_priority(int64_t priority)
+{
+ int r = sdevent->sd_event_source_set_priority(source.get(), priority);
+ if (r < 0)
+ {
+ throw SdEventError(-r, "sd_event_source_set_priority");
+ }
+}
+
+int Base::get_enabled()
+{
+ int enabled;
+ int r = sdevent->sd_event_source_get_enabled(source.get(), &enabled);
+ if (r < 0)
+ {
+ throw SdEventError(-r, "sd_event_source_get_enabled");
+ }
+ return enabled;
+}
+
+void Base::set_enabled(int enabled)
+{
+ int r = sdevent->sd_event_source_set_enabled(source.get(), enabled);
+ if (r < 0)
+ {
+ throw SdEventError(-r, "sd_event_source_set_enabled");
+ }
+}
+
Base::Base(sd_event_source* source, internal::SdEvent* sdevent) :
sdevent(sdevent), source(source, &internal::SdEvent::sd_event_source_ref,
&internal::SdEvent::sd_event_source_unref, sdevent)
diff --git a/src/sdeventplus/source/base.hpp b/src/sdeventplus/source/base.hpp
index 88a17f0..20ab820 100644
--- a/src/sdeventplus/source/base.hpp
+++ b/src/sdeventplus/source/base.hpp
@@ -1,5 +1,6 @@
#pragma once
+#include <cstdint>
#include <sdeventplus/internal/sdevent.hpp>
#include <sdeventplus/internal/sdref.hpp>
#include <systemd/sd-bus.h>
@@ -13,15 +14,25 @@
class Base
{
public:
+ virtual ~Base();
+
// We don't want to allow any kind of slicing.
Base(const Base& source) = delete;
Base& operator=(const Base& source) = delete;
Base(Base&& source) = delete;
Base& operator=(Base&& source) = delete;
+ const char* get_description();
+ void set_description(const char* description);
+ int get_pending();
+ int64_t get_priority();
+ void set_priority(int64_t priority);
+ int get_enabled();
+ void set_enabled(int enabled);
+
protected:
- internal::SdEvent* sdevent;
- internal::SdRef<sd_event_source> source;
+ const internal::SdEvent* const sdevent;
+ const internal::SdRef<sd_event_source> source;
// Base sources cannot be directly constructed.
Base(sd_event_source* source,
diff --git a/src/sdeventplus/test/sdevent.hpp b/src/sdeventplus/test/sdevent.hpp
index 982e4e7..1cb723f 100644
--- a/src/sdeventplus/test/sdevent.hpp
+++ b/src/sdeventplus/test/sdevent.hpp
@@ -24,6 +24,21 @@
MOCK_CONST_METHOD1(sd_event_source_ref, sd_event_source*(sd_event_source*));
MOCK_CONST_METHOD1(sd_event_source_unref,
sd_event_source*(sd_event_source*));
+
+ MOCK_CONST_METHOD2(sd_event_source_get_description,
+ int(sd_event_source*, const char**));
+ MOCK_CONST_METHOD2(sd_event_source_set_description,
+ int(sd_event_source*, const char*));
+ MOCK_CONST_METHOD2(sd_event_source_set_prepare,
+ int(sd_event_source*, sd_event_handler_t));
+ MOCK_CONST_METHOD1(sd_event_source_get_pending, int(sd_event_source*));
+ MOCK_CONST_METHOD2(sd_event_source_get_priority,
+ int(sd_event_source*, int64_t*));
+ MOCK_CONST_METHOD2(sd_event_source_set_priority,
+ int(sd_event_source*, int64_t));
+ MOCK_CONST_METHOD2(sd_event_source_get_enabled,
+ int(sd_event_source*, int*));
+ MOCK_CONST_METHOD2(sd_event_source_set_enabled, int(sd_event_source*, int));
};
} // namespace test