libnm: implement nm_client_check_connectivity() by using GDBusConnection directly

Note that nm_client_check_connectivity() has this odd behavior of
updating the connectivity state right away. We keep doing that.
This commit is contained in:
Thomas Haller
2019-10-04 16:18:51 +02:00
parent 2f21e96e84
commit 9bc83ca102
3 changed files with 38 additions and 29 deletions

View File

@@ -758,13 +758,38 @@ nm_client_check_connectivity (NMClient *client,
GCancellable *cancellable, GCancellable *cancellable,
GError **error) GError **error)
{ {
gs_unref_variant GVariant *ret = NULL;
guint32 connectivity;
g_return_val_if_fail (NM_IS_CLIENT (client), NM_CONNECTIVITY_UNKNOWN); g_return_val_if_fail (NM_IS_CLIENT (client), NM_CONNECTIVITY_UNKNOWN);
if (!_nm_client_check_nm_running (client, error)) ret = _nm_object_dbus_call_sync (client,
cancellable,
NM_DBUS_PATH,
NM_DBUS_INTERFACE,
"CheckConnectivity",
g_variant_new ("()"),
G_VARIANT_TYPE ("(u)"),
G_DBUS_CALL_FLAGS_NONE,
NM_DBUS_DEFAULT_TIMEOUT_MSEC,
TRUE,
error);
if (!ret)
return NM_CONNECTIVITY_UNKNOWN; return NM_CONNECTIVITY_UNKNOWN;
return nm_manager_check_connectivity (NM_CLIENT_GET_PRIVATE (client)->manager, g_variant_get (ret,
cancellable, error); "(u)",
&connectivity);
/* upon receiving the synchronous response, we hack the NMClient state
* and update the property outside the ordered D-Bus messages (like
* "PropertiesChanged" signals).
*
* This is really ugly, we shouldn't do this. */
_nm_manager_set_connectivity_hack (NM_CLIENT_GET_PRIVATE (client)->manager,
connectivity);
return connectivity;
} }
static void static void

View File

@@ -629,30 +629,15 @@ nm_manager_get_connectivity (NMManager *manager)
return NM_MANAGER_GET_PRIVATE (manager)->connectivity; return NM_MANAGER_GET_PRIVATE (manager)->connectivity;
} }
NMConnectivityState void
nm_manager_check_connectivity (NMManager *manager, _nm_manager_set_connectivity_hack (NMManager *manager,
GCancellable *cancellable, guint32 connectivity)
GError **error)
{ {
NMManagerPrivate *priv; NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager);
guint32 connectivity;
g_return_val_if_fail (NM_IS_MANAGER (manager), NM_CONNECTIVITY_UNKNOWN); if ((NMConnectivityState) connectivity != priv->connectivity) {
priv = NM_MANAGER_GET_PRIVATE (manager); priv->connectivity = (NMConnectivityState) connectivity;
g_object_notify (G_OBJECT (manager), NM_MANAGER_CONNECTIVITY);
if (nmdbus_manager_call_check_connectivity_sync (priv->proxy,
&connectivity,
cancellable, error)) {
if (connectivity != priv->connectivity) {
priv->connectivity = connectivity;
g_object_notify (G_OBJECT (manager), NM_MANAGER_CONNECTIVITY);
}
return connectivity;
}
else {
if (error && *error)
g_dbus_error_strip_remote_error (*error);
return NM_CONNECTIVITY_UNKNOWN;
} }
} }

View File

@@ -118,10 +118,9 @@ NMClientPermissionResult nm_manager_get_permission_result (NMManager *manager,
NMConnectivityState nm_manager_get_connectivity (NMManager *manager); NMConnectivityState nm_manager_get_connectivity (NMManager *manager);
_NM_DEPRECATED_SYNC_METHOD_INTERNAL void _nm_manager_set_connectivity_hack (NMManager *manager,
NMConnectivityState nm_manager_check_connectivity (NMManager *manager, guint32 connectivity);
GCancellable *cancellable,
GError **error);
void nm_manager_check_connectivity_async (NMManager *manager, void nm_manager_check_connectivity_async (NMManager *manager,
GCancellable *cancellable, GCancellable *cancellable,
GAsyncReadyCallback callback, GAsyncReadyCallback callback,