diff options
author | Iain Lane <iain.lane@canonical.com> | 2015-09-09 16:40:41 +0000 |
---|---|---|
committer | CI Train Bot <ci-train-bot@canonical.com> | 2015-09-09 16:40:41 +0000 |
commit | 13bcfccd0c9038c4b4c20c37c8d3267a5e6fbfee (patch) | |
tree | 30705f0a3f047a46020c7204397649ff2c609936 /src | |
parent | ad2d17a82ebe369adca6b477d5ecb362e243f585 (diff) | |
parent | ec001e64b2225a3c80b7e89d9a570728fcbca830 (diff) | |
download | ayatana-indicator-datetime-13bcfccd0c9038c4b4c20c37c8d3267a5e6fbfee.tar.gz ayatana-indicator-datetime-13bcfccd0c9038c4b4c20c37c8d3267a5e6fbfee.tar.bz2 ayatana-indicator-datetime-13bcfccd0c9038c4b4c20c37c8d3267a5e6fbfee.zip |
Remove warnings from test logs. Swallow the ones that are expected and fail the test if they don't show up. In addition, fail tests if unexpected warnings show up again.
Approved by: Charles Kerr
Diffstat (limited to 'src')
-rw-r--r-- | src/CMakeLists.txt | 5 | ||||
-rw-r--r-- | src/main.cpp | 6 | ||||
-rw-r--r-- | src/timezone-file.cpp | 192 | ||||
-rw-r--r-- | src/timezone-timedated.cpp | 212 | ||||
-rw-r--r-- | src/timezones-live.cpp | 5 |
5 files changed, 219 insertions, 201 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5fc822c..f8d219a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,8 +1,7 @@ set (SERVICE_LIB "indicatordatetimeservice") set (SERVICE_EXEC "indicator-datetime-service") -add_definitions (-DTIMEZONE_FILE="/etc/timezone" - -DG_LOG_DOMAIN="Indicator-Datetime") +add_definitions (-DG_LOG_DOMAIN="Indicator-Datetime") # handwritten sources set (SERVICE_C_SOURCES @@ -34,9 +33,9 @@ set (SERVICE_CXX_SOURCES settings-live.cpp snap.cpp sound.cpp - timezone-file.cpp timezone-geoclue.cpp timezones-live.cpp + timezone-timedated.cpp utils.c wakeup-timer-mainloop.cpp wakeup-timer-powerd.cpp) diff --git a/src/main.cpp b/src/main.cpp index 907d49f..c7769c9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -31,8 +31,8 @@ #include <datetime/settings-live.h> #include <datetime/snap.h> #include <datetime/state.h> -#include <datetime/timezone-file.h> #include <datetime/timezones-live.h> +#include <datetime/timezone-timedated.h> #include <datetime/wakeup-timer-powerd.h> #include <notifications/notifications.h> @@ -68,7 +68,7 @@ namespace { // create the live objects auto live_settings = std::make_shared<LiveSettings>(); - auto live_timezones = std::make_shared<LiveTimezones>(live_settings, TIMEZONE_FILE); + auto live_timezones = std::make_shared<LiveTimezones>(live_settings); auto live_clock = std::make_shared<LiveClock>(timezone_); // create a full-month planner currently pointing to the current month @@ -128,7 +128,7 @@ main(int /*argc*/, char** /*argv*/) textdomain(GETTEXT_PACKAGE); auto engine = create_engine(); - auto timezone_ = std::make_shared<FileTimezone>(TIMEZONE_FILE); + auto timezone_ = std::make_shared<TimedatedTimezone>(); auto state = create_state(engine, timezone_); auto actions = std::make_shared<LiveActions>(state); MenuFactory factory(actions, state); diff --git a/src/timezone-file.cpp b/src/timezone-file.cpp deleted file mode 100644 index 3c73913..0000000 --- a/src/timezone-file.cpp +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Copyright 2013 Canonical Ltd. - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 3, as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranties of - * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - * - * Authors: - * Charles Kerr <charles.kerr@canonical.com> - */ - -#include <datetime/timezone-file.h> - -#include <gio/gio.h> - -#include <cerrno> -#include <cstdlib> - -namespace unity { -namespace indicator { -namespace datetime { - -/*** -**** -***/ - -class FileTimezone::Impl -{ -public: - - Impl(FileTimezone& owner, const std::string& filename): - m_owner(owner) - { - set_filename(filename); - } - - ~Impl() - { - clear(); - } - -private: - - void clear() - { - if (m_monitor_handler_id) - g_signal_handler_disconnect(m_monitor, m_monitor_handler_id); - - g_clear_object (&m_monitor); - - m_filename.clear(); - } - - void set_filename(const std::string& filename) - { - clear(); - - auto tmp = realpath(filename.c_str(), nullptr); - if(tmp != nullptr) - { - m_filename = tmp; - free(tmp); - } - else - { - g_warning("Unable to resolve path '%s': %s", filename.c_str(), g_strerror(errno)); - m_filename = filename; // better than nothing? - } - - auto file = g_file_new_for_path(m_filename.c_str()); - GError * err = nullptr; - m_monitor = g_file_monitor_file(file, G_FILE_MONITOR_NONE, nullptr, &err); - g_object_unref(file); - if (err) - { - g_warning("%s Unable to monitor timezone file '%s': %s", G_STRLOC, TIMEZONE_FILE, err->message); - g_error_free(err); - } - else - { - m_monitor_handler_id = g_signal_connect_swapped(m_monitor, "changed", G_CALLBACK(on_file_changed), this); - g_debug("%s Monitoring timezone file '%s'", G_STRLOC, m_filename.c_str()); - } - - reload(); - } - - static void on_file_changed(gpointer gself) - { - static_cast<Impl*>(gself)->reload(); - } - - void reload() - { - const auto new_timezone = get_timezone_from_file(m_filename); - - if (!new_timezone.empty()) - m_owner.timezone.set(new_timezone); - } - - /*** - **** - ***/ - - std::string get_timezone_from_file(const std::string& filename) - { - GError * error; - GIOChannel * io_channel; - std::string ret; - - // read through filename line-by-line until we fine a nonempty non-comment line - error = nullptr; - io_channel = g_io_channel_new_file(filename.c_str(), "r", &error); - if (error == nullptr) - { - auto line = g_string_new(nullptr); - - while(ret.empty()) - { - const auto io_status = g_io_channel_read_line_string(io_channel, line, nullptr, &error); - if ((io_status == G_IO_STATUS_EOF) || (io_status == G_IO_STATUS_ERROR)) - break; - if (error != nullptr) - break; - - g_strstrip(line->str); - - if (!line->len) // skip empty lines - continue; - - if (*line->str=='#') // skip comments - continue; - - ret = line->str; - } - - g_string_free(line, true); - } - - if (io_channel != nullptr) - { - g_io_channel_shutdown(io_channel, false, nullptr); - g_io_channel_unref(io_channel); - } - - if (error != nullptr) - { - g_warning("%s Unable to read timezone file '%s': %s", G_STRLOC, filename.c_str(), error->message); - g_error_free(error); - } - - return ret; - } - - /*** - **** - ***/ - - FileTimezone & m_owner; - std::string m_filename; - GFileMonitor * m_monitor = nullptr; - unsigned long m_monitor_handler_id = 0; -}; - -/*** -**** -***/ - -FileTimezone::FileTimezone(const std::string& filename): - impl(new Impl{*this, filename}) -{ -} - -FileTimezone::~FileTimezone() -{ -} - -/*** -**** -***/ - -} // namespace datetime -} // namespace indicator -} // namespace unity diff --git a/src/timezone-timedated.cpp b/src/timezone-timedated.cpp new file mode 100644 index 0000000..fa99cd2 --- /dev/null +++ b/src/timezone-timedated.cpp @@ -0,0 +1,212 @@ +/* + * Copyright 2013 Canonical Ltd. + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 3, as published + * by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranties of + * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + * + * Authors: + * Charles Kerr <charles.kerr@canonical.com> + */ + +#include <datetime/timezone-timedated.h> + +#include <gio/gio.h> + +#include <cerrno> +#include <cstdlib> + +namespace unity { +namespace indicator { +namespace datetime { + +/*** +**** +***/ + +class TimedatedTimezone::Impl +{ +public: + + Impl(TimedatedTimezone& owner, std::string filename): + m_owner(owner), + m_filename(filename) + { + g_debug("Filename is '%s'", filename.c_str()); + monitor_timezone_property(); + } + + ~Impl() + { + clear(); + } + +private: + + void clear() + { + if (m_connection && m_signal_subscription_id) + { + g_dbus_connection_signal_unsubscribe (m_connection, m_signal_subscription_id); + m_signal_subscription_id = 0; + } + + g_clear_object(&m_connection); + } + + static void on_properties_changed (GDBusConnection *connection G_GNUC_UNUSED, + const gchar *sender_name G_GNUC_UNUSED, + const gchar *object_path G_GNUC_UNUSED, + const gchar *interface_name G_GNUC_UNUSED, + const gchar *signal_name G_GNUC_UNUSED, + GVariant *parameters, + gpointer gself) + { + auto self = static_cast<Impl*>(gself); + const char *tz; + GVariant *changed_properties; + gchar **invalidated_properties; + + g_variant_get (parameters, "(s@a{sv}^as)", NULL, &changed_properties, &invalidated_properties); + + if (g_variant_lookup(changed_properties, "Timezone", "&s", &tz, NULL)) + self->notify_timezone(tz); + else if (g_strv_contains (invalidated_properties, "Timezone")) + self->notify_timezone(self->get_timezone_from_file(self->m_filename)); + + g_variant_unref (changed_properties); + g_strfreev (invalidated_properties); + } + + void monitor_timezone_property() + { + GError *err = nullptr; + + /* + * There is an unlikely race which happens if there is an activation + * and timezone change before our match rule is added. + */ + notify_timezone(get_timezone_from_file(m_filename)); + + /* + * Make sure the bus is around at least until we add the match rules, + * otherwise things (tests) are sad. + */ + m_connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, + nullptr, + &err); + + if (err) + { + g_warning("Couldn't get bus connection: '%s'", err->message); + g_error_free(err); + return; + } + + m_signal_subscription_id = g_dbus_connection_signal_subscribe(m_connection, + "org.freedesktop.timedate1", + "org.freedesktop.DBus.Properties", + "PropertiesChanged", + "/org/freedesktop/timedate1", + NULL, G_DBUS_SIGNAL_FLAGS_NONE, + on_properties_changed, + this, nullptr); + } + + void notify_timezone(std::string new_timezone) + { + g_debug("notify_timezone '%s'", new_timezone.c_str()); + if (!new_timezone.empty()) + m_owner.timezone.set(new_timezone); + } + + std::string get_timezone_from_file(const std::string& filename) + { + GError * error; + GIOChannel * io_channel; + std::string ret; + + // read through filename line-by-line until we fine a nonempty non-comment line + error = nullptr; + io_channel = g_io_channel_new_file(filename.c_str(), "r", &error); + if (error == nullptr) + { + auto line = g_string_new(nullptr); + + while(ret.empty()) + { + const auto io_status = g_io_channel_read_line_string(io_channel, line, nullptr, &error); + if ((io_status == G_IO_STATUS_EOF) || (io_status == G_IO_STATUS_ERROR)) + break; + if (error != nullptr) + break; + + g_strstrip(line->str); + + if (!line->len) // skip empty lines + continue; + + if (*line->str=='#') // skip comments + continue; + + ret = line->str; + } + + g_string_free(line, true); + } else + /* Default to UTC */ + ret = "Etc/Utc"; + + if (io_channel != nullptr) + { + g_io_channel_shutdown(io_channel, false, nullptr); + g_io_channel_unref(io_channel); + } + + if (error != nullptr) + { + g_warning("%s Unable to read timezone file '%s': %s", G_STRLOC, filename.c_str(), error->message); + g_error_free(error); + } + + return ret; + } + + /*** + **** + ***/ + + TimedatedTimezone & m_owner; + GDBusConnection *m_connection = nullptr; + unsigned long m_signal_subscription_id = 0; + std::string m_filename; +}; + +/*** +**** +***/ + +TimedatedTimezone::TimedatedTimezone(std::string filename): + impl(new Impl{*this, filename}) +{ +} + +TimedatedTimezone::~TimedatedTimezone() +{ +} + +/*** +**** +***/ + +} // namespace datetime +} // namespace indicator +} // namespace unity diff --git a/src/timezones-live.cpp b/src/timezones-live.cpp index 4902b76..c5dd43c 100644 --- a/src/timezones-live.cpp +++ b/src/timezones-live.cpp @@ -25,9 +25,8 @@ namespace unity { namespace indicator { namespace datetime { -LiveTimezones::LiveTimezones(const std::shared_ptr<const Settings>& settings, - const std::string& filename): - m_file(filename), +LiveTimezones::LiveTimezones(const std::shared_ptr<const Settings>& settings): + m_file(), m_settings(settings) { m_file.timezone.changed().connect([this](const std::string&){update_timezones();}); |