summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2024-06-27 01:24:37 +0200
committerEugen Wissner <belka@caraus.de>2024-06-27 01:24:37 +0200
commitd75053b2439ab30d45aaa55365e7586498cd3299 (patch)
treed3aff698101e7ad3a0b79dcb06c1c5641c47caf7
parentb11e18e560edc9f363c4a98ddb5f5da3d66a7881 (diff)
downloadslack-timedate-d75053b2439ab30d45aaa55365e7586498cd3299.tar.gz
Implement TimeUSec property
-rw-r--r--data/org.freedesktop.timedate1.xml3
-rw-r--r--src/timedate.cpp33
-rw-r--r--src/timedate.h5
3 files changed, 36 insertions, 5 deletions
diff --git a/data/org.freedesktop.timedate1.xml b/data/org.freedesktop.timedate1.xml
index ab148da..effd806 100644
--- a/data/org.freedesktop.timedate1.xml
+++ b/data/org.freedesktop.timedate1.xml
@@ -7,7 +7,8 @@
<property name="NTP" type="b" access="read"/>
<property name="CanNTP" type="b" access="read"/>
<property name="NTPSynchronized" type="b" access="read"/>
- <property name="TimeUSecRTC" type="t" access="read"/>
+ <property name="TimeUSec" type="t" access="read"/>
+ <property name="RTCTimeUSec" type="t" access="read"/>
<method name="SetTime">
<arg name="usec_utc" type="x" direction="in"/>
<arg name="relative" type="b" direction="in"/>
diff --git a/src/timedate.cpp b/src/timedate.cpp
index 42bacf6..e6ec83f 100644
--- a/src/timedate.cpp
+++ b/src/timedate.cpp
@@ -125,9 +125,13 @@ static void slack_get_property(Glib::VariantBase& result, const Glib::RefPtr<Gio
{
result = Glib::Variant<bool>::create(dlackware::timedate::ntp_synchronized());
}
- else if (prop_name == "TimeUSecRTC")
+ else if (prop_name == "TimeUSec")
{
- result = Glib::Variant<std::uint64_t>::create(dlackware::timedate::time_usec_rtc());
+ result = Glib::Variant<std::uint64_t>::create(dlackware::timedate::time_usec());
+ }
+ else if (prop_name == "RTCTimeUSec")
+ {
+ result = Glib::Variant<std::uint64_t>::create(dlackware::timedate::rtc_time_usec());
}
}
@@ -338,7 +342,30 @@ namespace dlackware::timedate
return ntp_result != TIME_ERROR && (buffer.status & STA_UNSYNC) == 0;
}
- std::uint64_t time_usec_rtc()
+ std::uint64_t time_usec()
+ {
+ timespec spec;
+
+ if (clock_gettime(CLOCK_REALTIME, &spec) == -1)
+ {
+ throw std::system_error(errno, std::generic_category());
+ }
+ time_t seconds = spec.tv_sec;
+ tm time;
+
+ if (local_rtc())
+ {
+ gmtime_r(&seconds, &time);
+ }
+ else
+ {
+ localtime_r(&seconds, &time);
+ }
+ return std::chrono::duration_cast<std::chrono::microseconds>(
+ std::chrono::seconds(std::mktime(&time)) + std::chrono::nanoseconds(spec.tv_nsec)).count();
+ }
+
+ std::uint64_t rtc_time_usec()
{
return std::chrono::duration_cast<std::chrono::microseconds>(
std::chrono::system_clock::now().time_since_epoch()).count();
diff --git a/src/timedate.h b/src/timedate.h
index 952209c..1c33594 100644
--- a/src/timedate.h
+++ b/src/timedate.h
@@ -44,7 +44,10 @@ namespace dlackware::timedate
bool ntp_synchronized();
// Shows the current time in the RTC.
- std::uint64_t time_usec_rtc();
+ std::uint64_t rtc_time_usec();
+
+ // Shows the current time on the system.
+ std::uint64_t time_usec();
// Returns the timezones available on the system.
std::vector<Glib::ustring> list_timezones();