agent-manager: always invoke complete function for asynchronous nm_agent_manager_get_secrets()
Refactor agent-manager to always invoke the complete function for nm_agent_manager_get_secrets(). In general, the complete function is always invoked asnychronously when starting the operation. On the other hand, when cancelling the operation or disposing the manager with pending operations, we now (always) synchronously invoke the callback. This makes it simpler for the user to reliably cancel the request and perform potential cleanup. This behavior bubbles up through NMSettingsConnection and NMActRequest, and other callers that make directly or indicrectly make use of nm_agent_manager_get_secrets().
This commit is contained in:
@@ -96,12 +96,34 @@ get_secrets_cb (NMSettingsConnection *connection,
|
||||
NMActRequestPrivate *priv = NM_ACT_REQUEST_GET_PRIVATE (info->self);
|
||||
|
||||
g_return_if_fail (info->call_id_s == call_id_s);
|
||||
g_return_if_fail (g_slist_find (priv->secrets_calls, info));
|
||||
|
||||
priv->secrets_calls = g_slist_remove (priv->secrets_calls, info);
|
||||
|
||||
info->callback (info->self, info, NM_CONNECTION (connection), error, info->callback_data);
|
||||
if (info->callback)
|
||||
info->callback (info->self, info, NM_CONNECTION (connection), error, info->callback_data);
|
||||
g_free (info);
|
||||
}
|
||||
|
||||
/**
|
||||
* nm_act_request_get_secrets:
|
||||
* @self:
|
||||
* @setting_name:
|
||||
* @flags:
|
||||
* @hint:
|
||||
* @callback:
|
||||
* @callback_data:
|
||||
*
|
||||
* Asnychronously starts the request for secrets. This function cannot
|
||||
* fail.
|
||||
*
|
||||
* The return call-id can be used to cancel the request. You are
|
||||
* only allowed to cancel a still pending operation (once).
|
||||
* The callback will always be invoked once, even for canceling
|
||||
* or disposing of NMActRequest.
|
||||
*
|
||||
* Returns: a call-id.
|
||||
*/
|
||||
NMActRequestGetSecretsCallId
|
||||
nm_act_request_get_secrets (NMActRequest *self,
|
||||
const char *setting_name,
|
||||
@@ -152,7 +174,6 @@ nm_act_request_cancel_secrets (NMActRequest *self, NMActRequestGetSecretsCallId
|
||||
{
|
||||
NMActRequestPrivate *priv;
|
||||
NMConnection *connection;
|
||||
GSList *iter;
|
||||
|
||||
g_return_if_fail (self);
|
||||
g_return_if_fail (NM_IS_ACT_REQUEST (self));
|
||||
@@ -160,21 +181,11 @@ nm_act_request_cancel_secrets (NMActRequest *self, NMActRequestGetSecretsCallId
|
||||
|
||||
priv = NM_ACT_REQUEST_GET_PRIVATE (self);
|
||||
|
||||
for (iter = priv->secrets_calls; iter; iter = g_slist_next (iter)) {
|
||||
GetSecretsInfo *info = iter->data;
|
||||
if (g_slist_find (priv->secrets_calls, call_id))
|
||||
g_return_if_reached ();
|
||||
|
||||
/* Remove the matching info */
|
||||
if (info == call_id) {
|
||||
priv->secrets_calls = g_slist_remove_link (priv->secrets_calls, iter);
|
||||
g_slist_free (iter);
|
||||
|
||||
connection = nm_active_connection_get_connection (NM_ACTIVE_CONNECTION (self));
|
||||
nm_settings_connection_cancel_secrets (NM_SETTINGS_CONNECTION (connection), info->call_id_s);
|
||||
g_free (info);
|
||||
return;
|
||||
}
|
||||
}
|
||||
g_return_if_reached ();
|
||||
connection = nm_active_connection_get_connection (NM_ACTIVE_CONNECTION (self));
|
||||
nm_settings_connection_cancel_secrets (NM_SETTINGS_CONNECTION (connection), call_id->call_id_s);
|
||||
}
|
||||
|
||||
/********************************************************************/
|
||||
@@ -434,7 +445,6 @@ dispose (GObject *object)
|
||||
{
|
||||
NMActRequestPrivate *priv = NM_ACT_REQUEST_GET_PRIVATE (object);
|
||||
NMConnection *connection;
|
||||
GSList *iter;
|
||||
|
||||
/* Clear any share rules */
|
||||
if (priv->share_rules) {
|
||||
@@ -444,14 +454,13 @@ dispose (GObject *object)
|
||||
|
||||
/* Kill any in-progress secrets requests */
|
||||
connection = nm_active_connection_get_connection (NM_ACTIVE_CONNECTION (object));
|
||||
for (iter = priv->secrets_calls; connection && iter; iter = g_slist_next (iter)) {
|
||||
GetSecretsInfo *info = iter->data;
|
||||
while (priv->secrets_calls) {
|
||||
GetSecretsInfo *info = priv->secrets_calls->data;
|
||||
|
||||
nm_settings_connection_cancel_secrets (NM_SETTINGS_CONNECTION (connection), info->call_id_s);
|
||||
g_free (info);
|
||||
|
||||
g_return_if_fail (!priv->secrets_calls || info != priv->secrets_calls->data);
|
||||
}
|
||||
g_slist_free (priv->secrets_calls);
|
||||
priv->secrets_calls = NULL;
|
||||
|
||||
G_OBJECT_CLASS (nm_act_request_parent_class)->dispose (object);
|
||||
}
|
||||
|
Reference in New Issue
Block a user