diff options
author | Lennart Poettering <lennart@poettering.net> | 2013-01-10 00:54:46 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2013-01-10 00:56:32 +0100 |
commit | b719810db446244ff708a2f5f08566af67ddab61 (patch) | |
tree | ceea2415cac3f0f57a42c5c8f84269a6434118b1 /src/core/dbus-timer.c | |
parent | 28989b63f5e3a959557000f21f3891af08be40f7 (diff) |
dbus: properly serialize calendar timer data
As it turns out the bus properties for timer units wre really broken,
so let's clean this up for good and properly add calendar timer
serialization. We really should get that right before finalizing the
bus API documentation in the wiki...
Diffstat (limited to 'src/core/dbus-timer.c')
-rw-r--r-- | src/core/dbus-timer.c | 92 |
1 files changed, 68 insertions, 24 deletions
diff --git a/src/core/dbus-timer.c b/src/core/dbus-timer.c index b22fcb5934..75add81519 100644 --- a/src/core/dbus-timer.c +++ b/src/core/dbus-timer.c @@ -30,8 +30,10 @@ #define BUS_TIMER_INTERFACE \ " <interface name=\"org.freedesktop.systemd1.Timer\">\n" \ " <property name=\"Unit\" type=\"s\" access=\"read\"/>\n" \ - " <property name=\"Timers\" type=\"a(stt)\" access=\"read\"/>\n" \ - " <property name=\"NextElapseUSec\" type=\"t\" access=\"read\"/>\n" \ + " <property name=\"TimersMonotonic\" type=\"a(stt)\" access=\"read\"/>\n" \ + " <property name=\"TimersCalendar\" type=\"a(sst)\" access=\"read\"/>\n" \ + " <property name=\"NextElapseUSecRealtime\" type=\"t\" access=\"read\"/>\n" \ + " <property name=\"NextElapseUSecMonotonic\" type=\"t\" access=\"read\"/>\n" \ " <property name=\"Result\" type=\"s\" access=\"read\"/>\n" \ " </interface>\n" @@ -52,11 +54,13 @@ const char bus_timer_interface[] _introspect_("Timer") = BUS_TIMER_INTERFACE; const char bus_timer_invalidating_properties[] = - "Timers\0" - "NextElapseUSec\0" + "TimersMonotonic\0" + "TimersRealtime\0" + "NextElapseUSecRealtime\0" + "NextElapseUSecMonotonic\0" "Result\0"; -static int bus_timer_append_timers(DBusMessageIter *i, const char *property, void *data) { +static int bus_timer_append_monotonic_timers(DBusMessageIter *i, const char *property, void *data) { Timer *p = data; DBusMessageIter sub, sub2; TimerValue *k; @@ -74,23 +78,20 @@ static int bus_timer_append_timers(DBusMessageIter *i, const char *property, voi size_t l; bool b; - t = timer_base_to_string(k->base); + if (k->base == TIMER_CALENDAR) + continue; - if (endswith(t, "Sec")) { + t = timer_base_to_string(k->base); + assert(endswith(t, "Sec")); - /* s/Sec/USec/ */ - l = strlen(t); - buf = new(char, l+2); - if (!buf) - return -ENOMEM; + /* s/Sec/USec/ */ + l = strlen(t); + buf = new(char, l+2); + if (!buf) + return -ENOMEM; - memcpy(buf, t, l-3); - memcpy(buf+l-3, "USec", 5); - } else { - buf = strdup(t); - if (!buf) - return -ENOMEM; - } + memcpy(buf, t, l-3); + memcpy(buf+l-3, "USec", 5); b = dbus_message_iter_open_container(&sub, DBUS_TYPE_STRUCT, NULL, &sub2) && dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &buf) && @@ -108,6 +109,48 @@ static int bus_timer_append_timers(DBusMessageIter *i, const char *property, voi return 0; } +static int bus_timer_append_calendar_timers(DBusMessageIter *i, const char *property, void *data) { + Timer *p = data; + DBusMessageIter sub, sub2; + TimerValue *k; + + assert(i); + assert(property); + assert(p); + + if (!dbus_message_iter_open_container(i, DBUS_TYPE_ARRAY, "(sst)", &sub)) + return -ENOMEM; + + LIST_FOREACH(value, k, p->values) { + _cleanup_free_ char *buf = NULL; + const char *t; + bool b; + int j; + + if (k->base != TIMER_CALENDAR) + continue; + + t = timer_base_to_string(k->base); + j = calendar_spec_to_string(k->calendar_spec, &buf); + if (j < 0) + return j; + + b = dbus_message_iter_open_container(&sub, DBUS_TYPE_STRUCT, NULL, &sub2) && + dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &t) && + dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &buf) && + dbus_message_iter_append_basic(&sub2, DBUS_TYPE_UINT64, &k->next_elapse) && + dbus_message_iter_close_container(&sub, &sub2); + + if (!b) + return -ENOMEM; + } + + if (!dbus_message_iter_close_container(i, &sub)) + return -ENOMEM; + + return 0; +} + static int bus_timer_append_unit(DBusMessageIter *i, const char *property, void *data) { Unit *u = data; Timer *timer = TIMER(u); @@ -125,11 +168,12 @@ static int bus_timer_append_unit(DBusMessageIter *i, const char *property, void static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_timer_append_timer_result, timer_result, TimerResult); static const BusProperty bus_timer_properties[] = { - { "Unit", bus_timer_append_unit, "s", 0 }, - { "Timers", bus_timer_append_timers, "a(stt)", 0 }, - { "NextElapseUSec", bus_property_append_usec, "t", offsetof(Timer, next_elapse_monotonic) }, - { "NextElapseUSecRealtime", bus_property_append_usec, "t", offsetof(Timer, next_elapse_realtime) }, - { "Result", bus_timer_append_timer_result,"s", offsetof(Timer, result) }, + { "Unit", bus_timer_append_unit, "s", 0 }, + { "TimersMonotonic", bus_timer_append_monotonic_timers, "a(stt)", 0 }, + { "TimersCalendar", bus_timer_append_calendar_timers, "a(sst)", 0 }, + { "NextElapseUSecMonotonic", bus_property_append_usec, "t", offsetof(Timer, next_elapse_monotonic) }, + { "NextElapseUSecRealtime", bus_property_append_usec, "t", offsetof(Timer, next_elapse_realtime) }, + { "Result", bus_timer_append_timer_result, "s", offsetof(Timer, result) }, { NULL, } }; |