summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWill Thompson <will.thompson@collabora.co.uk>2011-09-28 17:57:20 +0100
committerWill Thompson <will.thompson@collabora.co.uk>2011-09-28 17:57:20 +0100
commitc9907c9e7141acdda3cdf326db387f9c4c1b4abe (patch)
tree061636fa78989aee51e59cb05db15d14a9a3df41
parent7ffc20512ac6a81e9465622ec692a622bf7ebf8d (diff)
Connectivity: refactor signalling state changes
As Guillaume pointed out on <https://bugs.freedesktop.org/show_bug.cgi?id=28370#c5>, previously McdConnectivityMonitor would signal ::state-change even if the state hasn't changed in some cases. This patch reduces duplication and fixes that case.
-rw-r--r--src/connectivity-monitor.c46
1 files changed, 25 insertions, 21 deletions
diff --git a/src/connectivity-monitor.c b/src/connectivity-monitor.c
index 0756d5a9..8ab03f7d 100644
--- a/src/connectivity-monitor.c
+++ b/src/connectivity-monitor.c
@@ -83,20 +83,32 @@ static McdConnectivityMonitor *connectivity_monitor_singleton = NULL;
G_DEFINE_TYPE (McdConnectivityMonitor, mcd_connectivity_monitor, G_TYPE_OBJECT);
static void
-connectivity_monitor_change_state (McdConnectivityMonitor *connectivity_monitor,
- gboolean new_state)
+connectivity_monitor_change_states (
+ McdConnectivityMonitor *self,
+ gboolean connected,
+ gboolean awake)
{
- McdConnectivityMonitorPrivate *priv;
-
- priv = connectivity_monitor->priv;
+ McdConnectivityMonitorPrivate *priv = self->priv;
+ gboolean old_total = priv->connected && priv->awake;
+ gboolean new_total = connected && awake;
- if (priv->connected == new_state)
+ if (priv->connected == connected &&
+ priv->awake == awake)
return;
- priv->connected = new_state;
+ priv->connected = connected;
+ priv->awake = awake;
+
+ if (old_total != new_total)
+ g_signal_emit (self, signals[STATE_CHANGE], 0, new_total);
+}
- g_signal_emit (connectivity_monitor, signals[STATE_CHANGE], 0,
- priv->connected && priv->awake);
+static void
+connectivity_monitor_set_connected (
+ McdConnectivityMonitor *self,
+ gboolean connected)
+{
+ connectivity_monitor_change_states (self, connected, self->priv->awake);
}
static void
@@ -104,15 +116,7 @@ connectivity_monitor_set_awake (
McdConnectivityMonitor *self,
gboolean awake)
{
- McdConnectivityMonitorPrivate *priv = self->priv;
-
- if (priv->awake == awake)
- return;
-
- priv->awake = awake;
-
- g_signal_emit (self, signals[STATE_CHANGE], 0,
- priv->connected && priv->awake);
+ connectivity_monitor_change_states (self, self->priv->connected, awake);
}
#ifdef HAVE_NM
@@ -146,7 +150,7 @@ connectivity_monitor_nm_state_change_cb (NMClient *client,
DEBUG ("New NetworkManager network state %d (connected: %s)", state,
new_nm_connected ? "true" : "false");
- connectivity_monitor_change_state (connectivity_monitor, new_nm_connected);
+ connectivity_monitor_set_connected (connectivity_monitor, new_nm_connected);
}
#endif
@@ -168,7 +172,7 @@ connectivity_monitor_connman_state_changed_cb (DBusGProxy *proxy,
DEBUG ("New ConnMan network state %s", new_state);
- connectivity_monitor_change_state (connectivity_monitor, new_connected);
+ connectivity_monitor_set_connected (connectivity_monitor, new_connected);
}
static void
@@ -499,7 +503,7 @@ mcd_connectivity_monitor_set_use_conn (McdConnectivityMonitor *connectivity_moni
else
#endif
{
- connectivity_monitor_change_state (connectivity_monitor, TRUE);
+ connectivity_monitor_set_connected (connectivity_monitor, TRUE);
}
g_object_notify (G_OBJECT (connectivity_monitor), "use-conn");