aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIain Lane <iain.lane@canonical.com>2015-09-09 16:40:41 +0000
committerCI Train Bot <ci-train-bot@canonical.com>2015-09-09 16:40:41 +0000
commit13bcfccd0c9038c4b4c20c37c8d3267a5e6fbfee (patch)
tree30705f0a3f047a46020c7204397649ff2c609936 /src
parentad2d17a82ebe369adca6b477d5ecb362e243f585 (diff)
parentec001e64b2225a3c80b7e89d9a570728fcbca830 (diff)
downloadayatana-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.txt5
-rw-r--r--src/main.cpp6
-rw-r--r--src/timezone-file.cpp192
-rw-r--r--src/timezone-timedated.cpp212
-rw-r--r--src/timezones-live.cpp5
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();});