diff options
author | Dan Williams <dan@ioncontrol.co> | 2025-04-29 20:54:36 -0500 |
---|---|---|
committer | Dan Williams <dan@ioncontrol.co> | 2025-05-08 20:08:06 -0500 |
commit | ef5cee3ab578c2fde8ca6cc636f10acfdb79f123 (patch) | |
tree | 02510944a5782a9c4047234b747fdc02dd8f31c8 /src/mm-base-modem.c | |
parent | 7262b46a82642b7232ef922b827d77626a93eec0 (diff) |
auth-provider: move auth provider logic into each class
Rather than make all of them rely on MMBaseModem for it. This
lets us disentangle dependencies for easier unit testing.
For interfaces, rather than casting directly to MMBaseModem
use intermediate interfaces (MMIfaceAuth and MMIfaceOpLock)
that tests can fake out.
Signed-off-by: Dan Williams <dan@ioncontrol.co>
Diffstat (limited to 'src/mm-base-modem.c')
-rw-r--r-- | src/mm-base-modem.c | 175 |
1 files changed, 103 insertions, 72 deletions
diff --git a/src/mm-base-modem.c b/src/mm-base-modem.c index 6bf5b68d..2e4337fe 100644 --- a/src/mm-base-modem.c +++ b/src/mm-base-modem.c @@ -41,9 +41,13 @@ #include "mm-modem-helpers.h" static void log_object_iface_init (MMLogObjectInterface *iface); +static void auth_iface_init (MMIfaceAuthInterface *iface); +static void op_lock_iface_init (MMIfaceOpLockInterface *iface); G_DEFINE_ABSTRACT_TYPE_WITH_CODE (MMBaseModem, mm_base_modem, MM_GDBUS_TYPE_OBJECT_SKELETON, - G_IMPLEMENT_INTERFACE (MM_TYPE_LOG_OBJECT, log_object_iface_init)) + G_IMPLEMENT_INTERFACE (MM_TYPE_LOG_OBJECT, log_object_iface_init) + G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_AUTH, auth_iface_init) + G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_OP_LOCK, op_lock_iface_init)) /* If we get 10 consecutive timeouts in a serial port, we consider the modem * invalid and we request re-probing. */ @@ -150,6 +154,16 @@ struct _MMBaseModemPrivate { gboolean scheduled_operations_forbidden_forever; }; +static void mm_base_modem_operation_lock (MMBaseModem *self, + MMOperationPriority priority, + const gchar *description, + GAsyncReadyCallback callback, + gpointer user_data); +static gssize mm_base_modem_operation_lock_finish (MMBaseModem *self, + GAsyncResult *res, + GError **error); + + guint mm_base_modem_get_dbus_id (MMBaseModem *self) { @@ -774,7 +788,7 @@ state_operation_ready (MMBaseModem *self, ctx = g_task_get_task_data (task); if (ctx->operation_id >= 0) { - mm_base_modem_operation_unlock (self, ctx->operation_id); + mm_iface_op_lock_unlock (MM_IFACE_OP_LOCK (self), ctx->operation_id); ctx->operation_id = (gssize) -1; } @@ -821,12 +835,12 @@ lock_before_state_operation_ready (MMBaseModem *self, } static void -state_operation (MMBaseModem *self, - StateOperationType operation_type, - MMBaseModemOperationLock operation_lock, - MMBaseModemOperationPriority operation_priority, - GAsyncReadyCallback callback, - gpointer user_data) +state_operation (MMBaseModem *self, + StateOperationType operation_type, + MMOperationLock operation_lock, + MMOperationPriority operation_priority, + GAsyncReadyCallback callback, + gpointer user_data) { GTask *task; StateOperationContext *ctx; @@ -878,12 +892,12 @@ state_operation (MMBaseModem *self, } g_assert (ctx->operation && ctx->operation_finish); - if (operation_lock == MM_BASE_MODEM_OPERATION_LOCK_ALREADY_ACQUIRED) { + if (operation_lock == MM_OPERATION_LOCK_ALREADY_ACQUIRED) { state_operation_run (task); return; } - g_assert (operation_lock == MM_BASE_MODEM_OPERATION_LOCK_REQUIRED); + g_assert (operation_lock == MM_OPERATION_LOCK_REQUIRED); mm_base_modem_operation_lock (self, operation_priority, operation_description, @@ -905,14 +919,14 @@ mm_base_modem_sync_finish (MMBaseModem *self, void mm_base_modem_sync (MMBaseModem *self, - MMBaseModemOperationLock operation_lock, - GAsyncReadyCallback callback, - gpointer user_data) + MMOperationLock operation_lock, + GAsyncReadyCallback callback, + gpointer user_data) { state_operation (self, STATE_OPERATION_TYPE_SYNC, operation_lock, - MM_BASE_MODEM_OPERATION_PRIORITY_DEFAULT, + MM_OPERATION_PRIORITY_DEFAULT, callback, user_data); } @@ -930,11 +944,11 @@ mm_base_modem_disable_finish (MMBaseModem *self, } void -mm_base_modem_disable (MMBaseModem *self, - MMBaseModemOperationLock operation_lock, - MMBaseModemOperationPriority operation_priority, - GAsyncReadyCallback callback, - gpointer user_data) +mm_base_modem_disable (MMBaseModem *self, + MMOperationLock operation_lock, + MMOperationPriority operation_priority, + GAsyncReadyCallback callback, + gpointer user_data) { state_operation (self, STATE_OPERATION_TYPE_DISABLE, @@ -955,15 +969,15 @@ mm_base_modem_enable_finish (MMBaseModem *self, } void -mm_base_modem_enable (MMBaseModem *self, - MMBaseModemOperationLock operation_lock, - GAsyncReadyCallback callback, - gpointer user_data) +mm_base_modem_enable (MMBaseModem *self, + MMOperationLock operation_lock, + GAsyncReadyCallback callback, + gpointer user_data) { state_operation (self, STATE_OPERATION_TYPE_ENABLE, operation_lock, - MM_BASE_MODEM_OPERATION_PRIORITY_DEFAULT, + MM_OPERATION_PRIORITY_DEFAULT, callback, user_data); } @@ -979,15 +993,15 @@ mm_base_modem_initialize_finish (MMBaseModem *self, } void -mm_base_modem_initialize (MMBaseModem *self, - MMBaseModemOperationLock operation_lock, - GAsyncReadyCallback callback, - gpointer user_data) +mm_base_modem_initialize (MMBaseModem *self, + MMOperationLock operation_lock, + GAsyncReadyCallback callback, + gpointer user_data) { state_operation (self, STATE_OPERATION_TYPE_INITIALIZE, operation_lock, - MM_BASE_MODEM_OPERATION_PRIORITY_DEFAULT, + MM_OPERATION_PRIORITY_DEFAULT, callback, user_data); } @@ -1775,8 +1789,8 @@ mm_base_modem_organize_ports (MMBaseModem *self, /*****************************************************************************/ /* Authorization */ -gboolean -mm_base_modem_authorize_finish (MMBaseModem *self, +static gboolean +mm_base_modem_authorize_finish (MMIfaceAuth *auth, GAsyncResult *res, GError **error) { @@ -1798,14 +1812,15 @@ authorize_ready (MMAuthProvider *authp, g_object_unref (task); } -void -mm_base_modem_authorize (MMBaseModem *self, +static void +mm_base_modem_authorize (MMIfaceAuth *auth, GDBusMethodInvocation *invocation, const gchar *authorization, GAsyncReadyCallback callback, gpointer user_data) { - GTask *task; + MMBaseModem *self = MM_BASE_MODEM (auth); + GTask *task; task = g_task_new (self, self->priv->authp_cancellable, callback, user_data); @@ -1821,10 +1836,10 @@ mm_base_modem_authorize (MMBaseModem *self, /* Exclusive operation */ typedef struct { - gssize id; - MMBaseModemOperationPriority priority; - gchar *description; - GTask *wait_task; + gssize id; + MMOperationPriority priority; + gchar *description; + GTask *wait_task; } OperationInfo; static void @@ -1837,7 +1852,7 @@ operation_info_free (OperationInfo *info) /* Exclusive operation lock */ -gssize +static gssize mm_base_modem_operation_lock_finish (MMBaseModem *self, GAsyncResult *res, GError **error) @@ -1862,7 +1877,7 @@ base_modem_operation_run (MMBaseModem *self) /* Run the operation in head of the list */ mm_obj_dbg (self, "[operation %" G_GSSIZE_FORMAT "] %s - %s: lock acquired", info->id, - mm_base_modem_operation_priority_get_string (info->priority), + mm_operation_priority_get_string (info->priority), info->description); task = g_steal_pointer (&info->wait_task); g_task_return_int (task, info->id); @@ -1905,7 +1920,7 @@ abort_pending_operations (MMBaseModem *self) g_assert (info->wait_task); mm_obj_dbg (self, "[operation %" G_GSSIZE_FORMAT "] %s - %s: aborted early", info->id, - mm_base_modem_operation_priority_get_string (info->priority), + mm_operation_priority_get_string (info->priority), info->description); task = g_steal_pointer (&info->wait_task); @@ -1918,12 +1933,12 @@ abort_pending_operations (MMBaseModem *self) self->priv->scheduled_operations = head; } -void -mm_base_modem_operation_lock (MMBaseModem *self, - MMBaseModemOperationPriority priority, - const gchar *description, - GAsyncReadyCallback callback, - gpointer user_data) +static void +mm_base_modem_operation_lock (MMBaseModem *self, + MMOperationPriority priority, + const gchar *description, + GAsyncReadyCallback callback, + gpointer user_data) { GTask *task; OperationInfo *info; @@ -1950,19 +1965,19 @@ mm_base_modem_operation_lock (MMBaseModem *self, } else operation_id++; - if (info->priority == MM_BASE_MODEM_OPERATION_PRIORITY_OVERRIDE) { + if (info->priority == MM_OPERATION_PRIORITY_OVERRIDE) { mm_obj_dbg (self, "[operation %" G_GSSIZE_FORMAT "] %s - %s: override requested - no new operations will be allowed", info->id, - mm_base_modem_operation_priority_get_string (info->priority), + mm_operation_priority_get_string (info->priority), info->description); g_assert (!self->priv->scheduled_operations_forbidden_forever); self->priv->scheduled_operations_forbidden_forever = TRUE; abort_pending_operations (self); self->priv->scheduled_operations = g_list_append (self->priv->scheduled_operations, info); - } else if (info->priority == MM_BASE_MODEM_OPERATION_PRIORITY_DEFAULT) { + } else if (info->priority == MM_OPERATION_PRIORITY_DEFAULT) { mm_obj_dbg (self, "[operation %" G_GSSIZE_FORMAT "] %s - %s: scheduled", info->id, - mm_base_modem_operation_priority_get_string (info->priority), + mm_operation_priority_get_string (info->priority), info->description); self->priv->scheduled_operations = g_list_append (self->priv->scheduled_operations, info); } else @@ -1973,10 +1988,11 @@ mm_base_modem_operation_lock (MMBaseModem *self, /* Exclusive operation unlock */ -void -mm_base_modem_operation_unlock (MMBaseModem *self, - gssize operation_id) +static void +mm_base_modem_operation_unlock (MMIfaceOpLock *_self, + gssize operation_id) { + MMBaseModem *self = MM_BASE_MODEM (_self); OperationInfo *info; g_assert (self->priv->scheduled_operations); @@ -1987,7 +2003,7 @@ mm_base_modem_operation_unlock (MMBaseModem *self, mm_obj_dbg (self, "[operation %" G_GSSIZE_FORMAT "] %s - %s: lock released", info->id, - mm_base_modem_operation_priority_get_string (info->priority), + mm_operation_priority_get_string (info->priority), info->description); /* Remove head list item and free its contents */ @@ -2002,9 +2018,9 @@ mm_base_modem_operation_unlock (MMBaseModem *self, /*****************************************************************************/ typedef struct { - GDBusMethodInvocation *invocation; - MMBaseModemOperationPriority operation_priority; - gchar *operation_description; + GDBusMethodInvocation *invocation; + MMOperationPriority operation_priority; + gchar *operation_description; } AuthorizeAndOperationLockContext; static void @@ -2015,8 +2031,8 @@ authorize_and_operation_lock_context_free (AuthorizeAndOperationLockContext *ctx g_slice_free (AuthorizeAndOperationLockContext, ctx); } -gssize -mm_base_modem_authorize_and_operation_lock_finish (MMBaseModem *self, +static gssize +mm_base_modem_authorize_and_operation_lock_finish (MMIfaceOpLock *self, GAsyncResult *res, GError **error) { @@ -2040,35 +2056,35 @@ lock_after_authorize_ready (MMBaseModem *self, } static void -authorize_before_lock_ready (MMBaseModem *self, +authorize_before_lock_ready (MMIfaceAuth *auth, GAsyncResult *res, GTask *task) { GError *error = NULL; AuthorizeAndOperationLockContext *ctx; - if (!mm_base_modem_authorize_finish (self, res, &error)) { + if (!mm_iface_auth_authorize_finish (auth, res, &error)) { g_task_return_error (task, error); g_object_unref (task); return; } ctx = g_task_get_task_data (task); - mm_base_modem_operation_lock (self, + mm_base_modem_operation_lock (MM_BASE_MODEM (auth), ctx->operation_priority, ctx->operation_description, (GAsyncReadyCallback) lock_after_authorize_ready, task); } -void -mm_base_modem_authorize_and_operation_lock (MMBaseModem *self, - GDBusMethodInvocation *invocation, - const gchar *authorization, - MMBaseModemOperationPriority operation_priority, - const gchar *operation_description, - GAsyncReadyCallback callback, - gpointer user_data) +static void +mm_base_modem_authorize_and_operation_lock (MMIfaceOpLock *self, + GDBusMethodInvocation *invocation, + const gchar *authorization, + MMOperationPriority operation_priority, + const gchar *operation_description, + GAsyncReadyCallback callback, + gpointer user_data) { GTask *task; AuthorizeAndOperationLockContext *ctx; @@ -2081,7 +2097,7 @@ mm_base_modem_authorize_and_operation_lock (MMBaseModem *self, ctx->operation_description = g_strdup (operation_description); g_task_set_task_data (task, ctx, (GDestroyNotify)authorize_and_operation_lock_context_free); - mm_base_modem_authorize (self, + mm_iface_auth_authorize (MM_IFACE_AUTH (self), invocation, authorization, (GAsyncReadyCallback)authorize_before_lock_ready, @@ -2624,6 +2640,21 @@ log_object_iface_init (MMLogObjectInterface *iface) } static void +auth_iface_init (MMIfaceAuthInterface *iface) +{ + iface->authorize = mm_base_modem_authorize; + iface->authorize_finish = mm_base_modem_authorize_finish; +} + +static void +op_lock_iface_init (MMIfaceOpLockInterface *iface) +{ + iface->authorize_and_lock = mm_base_modem_authorize_and_operation_lock; + iface->authorize_and_lock_finish = mm_base_modem_authorize_and_operation_lock_finish; + iface->unlock = mm_base_modem_operation_unlock; +} + +static void mm_base_modem_class_init (MMBaseModemClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); |