gnetworkmonitornm: Fix network available detection

The network-available property can be asserted by querying the NMState
describing the current overval network state, instead of the
NMConnectivityState. The advantage of the NMState is that is reflects
immediately the network state modification, while the connectivity
state is tested at a fixed frequency.
This commit is contained in:
Fabrice Bellet 2019-04-29 12:05:54 +00:00 committed by Michael Catanzaro
parent d139986b1f
commit 5b4e6f9813

View File

@ -52,6 +52,19 @@ typedef enum {
NM_CONNECTIVITY_FULL NM_CONNECTIVITY_FULL
} NMConnectivityState; } NMConnectivityState;
/* Copied from https://developer.gnome.org/libnm-util/stable/libnm-util-NetworkManager.html#NMState;
* used inline to avoid a NetworkManager dependency from GLib. */
typedef enum {
NM_STATE_UNKNOWN = 0,
NM_STATE_ASLEEP = 10,
NM_STATE_DISCONNECTED = 20,
NM_STATE_DISCONNECTING = 30,
NM_STATE_CONNECTING = 40,
NM_STATE_CONNECTED_LOCAL = 50,
NM_STATE_CONNECTED_SITE = 60,
NM_STATE_CONNECTED_GLOBAL = 70,
} NMState;
struct _GNetworkMonitorNMPrivate struct _GNetworkMonitorNMPrivate
{ {
GDBusProxy *proxy; GDBusProxy *proxy;
@ -155,11 +168,19 @@ sync_properties (GNetworkMonitorNM *nm,
gboolean emit_signals) gboolean emit_signals)
{ {
GVariant *v; GVariant *v;
NMState nm_state;
NMConnectivityState nm_connectivity; NMConnectivityState nm_connectivity;
gboolean new_network_available; gboolean new_network_available;
gboolean new_network_metered; gboolean new_network_metered;
GNetworkConnectivity new_connectivity; GNetworkConnectivity new_connectivity;
v = g_dbus_proxy_get_cached_property (nm->priv->proxy, "State");
if (!v)
return;
nm_state = g_variant_get_uint32 (v);
g_variant_unref (v);
v = g_dbus_proxy_get_cached_property (nm->priv->proxy, "Connectivity"); v = g_dbus_proxy_get_cached_property (nm->priv->proxy, "Connectivity");
if (!v) if (!v)
return; return;
@ -167,14 +188,26 @@ sync_properties (GNetworkMonitorNM *nm,
nm_connectivity = g_variant_get_uint32 (v); nm_connectivity = g_variant_get_uint32 (v);
g_variant_unref (v); g_variant_unref (v);
if (nm_connectivity == NM_CONNECTIVITY_UNKNOWN || if (nm_state <= NM_STATE_CONNECTED_LOCAL)
nm_connectivity == NM_CONNECTIVITY_NONE)
{ {
new_network_available = FALSE; new_network_available = FALSE;
new_network_metered = FALSE; new_network_metered = FALSE;
new_connectivity = G_NETWORK_CONNECTIVITY_LOCAL; new_connectivity = G_NETWORK_CONNECTIVITY_LOCAL;
} }
else if (nm_state <= NM_STATE_CONNECTED_SITE)
{
new_network_available = FALSE;
new_network_metered = FALSE;
if (nm_connectivity == NM_CONNECTIVITY_PORTAL)
{
new_connectivity = G_NETWORK_CONNECTIVITY_PORTAL;
}
else else
{
new_connectivity = G_NETWORK_CONNECTIVITY_LIMITED;
}
}
else /* nm_state == NM_STATE_CONNECTED_FULL */
{ {
/* this is only available post NM 1.0 */ /* this is only available post NM 1.0 */