diff --git a/src/slack-timedate.cpp b/src/slack-timedate.cpp index cc48ce8..e800236 100644 --- a/src/slack-timedate.cpp +++ b/src/slack-timedate.cpp @@ -85,8 +85,9 @@ static void slack_method_call (GDBusConnection *connection, const gchar *sender, } else if (g_strcmp0(method_name, "ListTimezones") == 0) { - auto return_value = Glib::Variant>::create({}); - auto return_tuple = Glib::Variant>::create_tuple({ return_value }); + auto return_tuple = Glib::Variant>::create_tuple({ + dlackware::timedate::list_timezones() + }); g_dbus_method_invocation_return_value(invocation, return_tuple.gobj()); } @@ -165,6 +166,39 @@ int main(int argc, char **argv) return EXIT_SUCCESS; } +namespace dlackware::timedate +{ + void list_timezones(const std::string& prefix, std::vector& accumulator) + { + Glib::FileTest is_directory = Glib::FILE_TEST_IS_DIR; + Glib::FileTest is_regular = Glib::FILE_TEST_IS_REGULAR; + auto zoneinfo_path = std::filesystem::path(zoneinfo_database) / prefix; + auto zoneinfo_directory = Glib::Dir(zoneinfo_path); + + for (auto zoneinfo_entry : zoneinfo_directory) + { + auto entry_path = zoneinfo_path / zoneinfo_entry; + + if (Glib::file_test(entry_path, is_directory)) + { + list_timezones(prefix + zoneinfo_entry + "/", accumulator); + } + else if (Glib::file_test(entry_path, is_regular) && !entry_path.has_extension() + && zoneinfo_entry != "leapseconds") + { + accumulator.push_back(prefix + zoneinfo_entry); + } + } + } + + Glib::Variant> list_timezones() + { + std::vector result; + + list_timezones("", result); + return Glib::Variant>::create(result); + } +} gchar *slack_get_timezone () { gchar *zone_copied_from, *zone; diff --git a/src/slack-timedate.h b/src/slack-timedate.h index 72fcc2d..61ee8d5 100644 --- a/src/slack-timedate.h +++ b/src/slack-timedate.h @@ -59,6 +59,13 @@ constexpr gint32 USEC_PER_SEC = 1000000ULL; constexpr gint32 NSEC_PER_USEC = 1000ULL; +namespace dlackware::timedate +{ + constexpr const char *zoneinfo_database = "/usr/share/zoneinfo"; + + Glib::Variant> list_timezones(); +} + // Returns the system time zone gchar *slack_get_timezone ();