diff options
author | Lars Uebernickel <lars@uebernic.de> | 2015-09-03 18:00:36 +0200 |
---|---|---|
committer | Lars Uebernickel <lars@uebernic.de> | 2015-09-03 18:00:36 +0200 |
commit | bda03d74c5a36bdaac89a64ff73fcc92dbd795a0 (patch) | |
tree | 4927774e22774d89307003d3b109fdda074f0651 /src | |
parent | 49dbcaf901fb3d5fba29f616d1e57a286e85bae8 (diff) | |
download | ayatana-indicator-datetime-bda03d74c5a36bdaac89a64ff73fcc92dbd795a0.tar.gz ayatana-indicator-datetime-bda03d74c5a36bdaac89a64ff73fcc92dbd795a0.tar.bz2 ayatana-indicator-datetime-bda03d74c5a36bdaac89a64ff73fcc92dbd795a0.zip |
timezone-timedated: subscribe to PropertiesChanged directly
This avoids some unnecessary calls that GDBusProxy makes and the name
watching.
Diffstat (limited to 'src')
-rw-r--r-- | src/timezone-timedated.cpp | 132 |
1 files changed, 30 insertions, 102 deletions
diff --git a/src/timezone-timedated.cpp b/src/timezone-timedated.cpp index a2918f0..fa99cd2 100644 --- a/src/timezone-timedated.cpp +++ b/src/timezone-timedated.cpp @@ -53,112 +53,42 @@ private: void clear() { - if (m_bus_watch_id) + if (m_connection && m_signal_subscription_id) { - g_bus_unwatch_name (m_bus_watch_id); - m_bus_watch_id = 0; + g_dbus_connection_signal_unsubscribe (m_connection, m_signal_subscription_id); + m_signal_subscription_id = 0; } - if (m_properties_changed_id) - { - g_signal_handler_disconnect(m_proxy, m_properties_changed_id); - m_properties_changed_id = 0; - } - - g_clear_object(&m_proxy); - } - - static void on_properties_changed(GDBusProxy *proxy G_GNUC_UNUSED, - GVariant *changed_properties /* a{sv} */, - GStrv invalidated_properties G_GNUC_UNUSED, - gpointer gself) - { - auto self = static_cast<Impl*>(gself); - char *tz; - - if (g_variant_lookup(changed_properties, "Timezone", "s", &tz, NULL)) - { - g_debug("on_properties_changed: got timezone '%s'", tz); - self->notify_timezone(tz); - g_free (tz); - } + g_clear_object(&m_connection); } - static void on_proxy_ready(GObject *object G_GNUC_UNUSED, - GAsyncResult *res, + 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); - GError *error = nullptr; - self->m_proxy = g_dbus_proxy_new_finish(res, &error); + const char *tz; + GVariant *changed_properties; + gchar **invalidated_properties; - if (error) - { - g_warning ("Couldn't create proxy to read timezone: %s", error->message); - goto out; - } - - /* Read the property */ - GVariant *prop; - prop = g_dbus_proxy_get_cached_property(self->m_proxy, "Timezone"); - - if (!prop || !g_variant_is_of_type(prop, G_VARIANT_TYPE_STRING)) - { - g_warning("Couldn't read the Timezone property, defaulting to Etc/Utc"); - self->notify_timezone("Etc/Utc"); - goto out; - } + g_variant_get (parameters, "(s@a{sv}^as)", NULL, &changed_properties, &invalidated_properties); - const gchar *tz; - tz = g_variant_get_string(prop, nullptr); - - self->notify_timezone(tz); - - self->m_properties_changed_id = g_signal_connect(self->m_proxy, - "g-properties-changed", - (GCallback) on_properties_changed, - gself); - -out: - g_clear_pointer(&error, g_error_free); - g_clear_pointer(&prop, g_variant_unref); - } - - static void on_name_appeared(GDBusConnection *connection, - const gchar *name, - const gchar *name_owner G_GNUC_UNUSED, - gpointer gself G_GNUC_UNUSED) - { - g_debug ("timedate1 appeared"); - g_dbus_proxy_new(connection, - G_DBUS_PROXY_FLAGS_NONE, - NULL, - name, - "/org/freedesktop/timedate1", - "org.freedesktop.timedate1", - nullptr, - on_proxy_ready, - gself); - } - - static void on_name_vanished(GDBusConnection *connection G_GNUC_UNUSED, - const gchar *name G_GNUC_UNUSED, - gpointer gself) - { - auto self = static_cast<Impl*>(gself); - g_debug ("timedate1 vanished"); + 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_signal_handler_disconnect(self->m_proxy, - self->m_properties_changed_id); - self->m_properties_changed_id = 0; - g_clear_object(&self->m_proxy); - g_clear_pointer(&self->m_proxy, g_main_loop_unref); + g_variant_unref (changed_properties); + g_strfreev (invalidated_properties); } void monitor_timezone_property() { GError *err = nullptr; - GDBusConnection *conn; /* * There is an unlikely race which happens if there is an activation @@ -170,7 +100,7 @@ out: * Make sure the bus is around at least until we add the match rules, * otherwise things (tests) are sad. */ - conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, + m_connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, nullptr, &err); @@ -181,15 +111,14 @@ out: return; } - m_bus_watch_id = g_bus_watch_name_on_connection(conn, + m_signal_subscription_id = g_dbus_connection_signal_subscribe(m_connection, "org.freedesktop.timedate1", - G_BUS_NAME_WATCHER_FLAGS_NONE, - on_name_appeared, - on_name_vanished, - this, - nullptr); - - g_object_unref (conn); + "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) @@ -256,9 +185,8 @@ out: ***/ TimedatedTimezone & m_owner; - unsigned long m_properties_changed_id = 0; - unsigned long m_bus_watch_id = 0; - GDBusProxy *m_proxy = nullptr; + GDBusConnection *m_connection = nullptr; + unsigned long m_signal_subscription_id = 0; std::string m_filename; }; |