From 1283ee8c2a92c40d653168f94d8d6816d8be82b9 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Thu, 17 Apr 2025 21:54:14 -0500 Subject: base-sms,iface-modem-messaging: move lock/unlock logic into the interface Allows us to test things that rely on MMBaseSms more easily.. Signed-off-by: Dan Williams --- src/mm-iface-modem-messaging.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'src/mm-iface-modem-messaging.h') diff --git a/src/mm-iface-modem-messaging.h b/src/mm-iface-modem-messaging.h index 44cb077b..d341d3b0 100644 --- a/src/mm-iface-modem-messaging.h +++ b/src/mm-iface-modem-messaging.h @@ -78,6 +78,21 @@ struct _MMIfaceModemMessagingInterface { GAsyncResult *res, GError **error); + /* Lock storages (async) */ + void (*lock_storages) (MMIfaceModemMessaging *self, + MMSmsStorage mem1, /* reading/listing/deleting */ + MMSmsStorage mem2, /* storing/sending */ + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (*lock_storages_finish) (MMIfaceModemMessaging *self, + GAsyncResult *res, + GError **error); + + /* Unlock storages */ + void (*unlock_storages) (MMIfaceModemMessaging *self, + gboolean mem1, + gboolean mem2); + /* Setup SMS format (async) */ void (* setup_sms_format) (MMIfaceModemMessaging *self, GAsyncReadyCallback callback, @@ -182,6 +197,19 @@ gboolean mm_iface_modem_messaging_is_storage_supported_for_receiving (MMIfaceMod /* SMS creation */ MMBaseSms *mm_iface_modem_messaging_create_sms (MMIfaceModemMessaging *self); +/* Locking/unlocking SMS storages */ +void mm_iface_modem_messaging_lock_storages (MMIfaceModemMessaging *self, + MMSmsStorage mem1, + MMSmsStorage mem2, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean mm_iface_modem_messaging_lock_storages_finish (MMIfaceModemMessaging *self, + GAsyncResult *res, + GError **error); +void mm_iface_modem_messaging_unlock_storages (MMIfaceModemMessaging *self, + gboolean mem1, + gboolean mem2); + /* Look for a new valid multipart reference */ guint8 mm_iface_modem_messaging_get_local_multipart_reference (MMIfaceModemMessaging *self, const gchar *number, -- cgit v1.2.3-70-g09d2 From b81f23e24aad7d4fb37e837bbdcab4f43bccfc71 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Sat, 19 Apr 2025 10:30:58 -0500 Subject: base-sms,sms-list,iface-messaging: move MMBaseSms creation to MMBroadbandModem class This commit moves creation of the MMBaseSms objects out of MMSmsList and up into MMIfaceModemMessaging (which is already a MMBroadbandModem) and the MMBroadbandModem subclasses themselves. This flattens the creation of MMBaseSms objects by passing them down from the object that creates the SMS parts, rather than having a convoluted callback scheme relying on MMSmsList and MMBaseSms having direct knowledge of their owning modem. The goal is to eventually remove usage of MMBaseModem from MMBaseSms and MMSmsList so that we can test them more easily. Signed-off-by: Dan Williams --- src/mm-base-sms.c | 83 ++++++++++++++++---------------- src/mm-base-sms.h | 34 ++++++++------ src/mm-broadband-modem-mbim.c | 43 ++++++++++------- src/mm-broadband-modem-qmi.c | 33 +++++++------ src/mm-broadband-modem.c | 104 ++++++++++++++++++++++++++--------------- src/mm-broadband-modem.h | 7 +++ src/mm-iface-modem-messaging.c | 37 +++++++-------- src/mm-iface-modem-messaging.h | 13 +++--- src/mm-sms-list.c | 26 +++++------ src/mm-sms-list.h | 1 + 10 files changed, 216 insertions(+), 165 deletions(-) (limited to 'src/mm-iface-modem-messaging.h') diff --git a/src/mm-base-sms.c b/src/mm-base-sms.c index d6c93d0c..daf7fb67 100644 --- a/src/mm-base-sms.c +++ b/src/mm-base-sms.c @@ -61,6 +61,8 @@ enum { static GParamSpec *properties[PROP_LAST]; struct _MMBaseSmsPrivate { + gboolean initialized; + /* The connection to the system bus */ GDBusConnection *connection; guint dbus_id; @@ -1051,19 +1053,17 @@ mm_base_sms_multipart_take_part (MMBaseSms *self, return TRUE; } -MMBaseSms * -mm_base_sms_singlepart_new (MMBaseModem *modem, - MMSmsState state, - MMSmsStorage storage, - MMSmsPart *part, - GError **error) +gboolean +mm_base_sms_singlepart_init (MMBaseSms *self, + MMBaseModem *modem, + MMSmsState state, + MMSmsStorage storage, + MMSmsPart *part, + GError **error) { - MMBaseSms *self; - g_assert (MM_IS_IFACE_MODEM_MESSAGING (modem)); + g_assert (self->priv->initialized == FALSE); - /* Create an SMS object as defined by the interface */ - self = mm_iface_modem_messaging_create_sms (MM_IFACE_MODEM_MESSAGING (modem)); g_object_set (self, "state", state, "storage", storage, @@ -1079,34 +1079,33 @@ mm_base_sms_singlepart_new (MMBaseModem *modem, /* Note: we need to remove the part from the list, as we really didn't * take it, and therefore the caller is responsible for freeing it. */ self->priv->parts = g_list_remove (self->priv->parts, part); - g_clear_object (&self); - } else - /* Only export once properly created */ - mm_base_sms_export (self); + return FALSE; + } - return self; + /* Only export once properly created */ + self->priv->initialized = TRUE; + mm_base_sms_export (self); + return TRUE; } -MMBaseSms * -mm_base_sms_multipart_new (MMBaseModem *modem, - MMSmsState state, - MMSmsStorage storage, - guint reference, - guint max_parts, - MMSmsPart *first_part, - GError **error) +gboolean +mm_base_sms_multipart_init (MMBaseSms *self, + MMBaseModem *modem, + MMSmsState state, + MMSmsStorage storage, + guint reference, + guint max_parts, + MMSmsPart *first_part, + GError **error) { - MMBaseSms *self; - g_assert (MM_IS_IFACE_MODEM_MESSAGING (modem)); + g_assert (self->priv->initialized == FALSE); /* If this is the first part of a RECEIVED SMS, we overwrite the state * as RECEIVING, to indicate that it is not completed yet. */ if (state == MM_SMS_STATE_RECEIVED) state = MM_SMS_STATE_RECEIVING; - /* Create an SMS object as defined by the interface */ - self = mm_iface_modem_messaging_create_sms (MM_IFACE_MODEM_MESSAGING (modem)); g_object_set (self, MM_BASE_SMS_IS_MULTIPART, TRUE, MM_BASE_SMS_MAX_PARTS, max_parts, @@ -1120,29 +1119,30 @@ mm_base_sms_multipart_new (MMBaseModem *modem, NULL); if (!mm_base_sms_multipart_take_part (self, first_part, error)) - g_clear_object (&self); + return FALSE; /* We do export incomplete multipart messages, in order to be able to * request removal of all parts of those multipart SMS that will never * get completed. * Only the STATE of the SMS object will be valid in the exported DBus * interface.*/ - if (self) - mm_base_sms_export (self); + self->priv->initialized = TRUE; + mm_base_sms_export (self); - return self; + return TRUE; } -MMBaseSms * -mm_base_sms_new_from_properties (MMBaseModem *modem, - MMSmsProperties *props, - GError **error) +gboolean +mm_base_sms_init_from_properties (MMBaseSms *self, + MMBaseModem *modem, + MMSmsProperties *props, + GError **error) { - MMBaseSms *self; const gchar *text; GByteArray *data; g_assert (MM_IS_IFACE_MODEM_MESSAGING (modem)); + g_assert (self->priv->initialized == FALSE); text = mm_sms_properties_get_text (props); data = mm_sms_properties_peek_data_bytearray (props); @@ -1156,7 +1156,7 @@ mm_base_sms_new_from_properties (MMBaseModem *modem, "Cannot create SMS: mandatory parameter '%s' is missing", (!mm_sms_properties_get_number (props)? "number" : "text' or 'data")); - return NULL; + return FALSE; } /* Don't create SMS from properties if both text and data are given */ @@ -1165,11 +1165,9 @@ mm_base_sms_new_from_properties (MMBaseModem *modem, MM_CORE_ERROR, MM_CORE_ERROR_INVALID_ARGS, "Cannot create SMS: both 'text' and 'data' given"); - return NULL; + return FALSE; } - /* Create an SMS object as defined by the interface */ - self = mm_iface_modem_messaging_create_sms (MM_IFACE_MODEM_MESSAGING (modem)); g_object_set (self, "state", MM_SMS_STATE_UNKNOWN, "storage", MM_SMS_STORAGE_UNKNOWN, @@ -1197,10 +1195,11 @@ mm_base_sms_new_from_properties (MMBaseModem *modem, g_variant_new ("(uv)", MM_SMS_VALIDITY_TYPE_UNKNOWN, g_variant_new_boolean (FALSE))), NULL); - /* Only export once properly created */ + /* Only export once properly initialized */ + self->priv->initialized = TRUE; mm_base_sms_export (self); - return self; + return TRUE; } /*****************************************************************************/ diff --git a/src/mm-base-sms.h b/src/mm-base-sms.h index 5fceb719..22d25ebb 100644 --- a/src/mm-base-sms.h +++ b/src/mm-base-sms.h @@ -91,21 +91,25 @@ struct _MMBaseSmsClass { GType mm_base_sms_get_type (void); G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMBaseSms, g_object_unref) -MMBaseSms *mm_base_sms_new_from_properties (MMBaseModem *modem, - MMSmsProperties *properties, - GError **error); -MMBaseSms *mm_base_sms_singlepart_new (MMBaseModem *modem, - MMSmsState state, - MMSmsStorage storage, - MMSmsPart *part, - GError **error); -MMBaseSms *mm_base_sms_multipart_new (MMBaseModem *modem, - MMSmsState state, - MMSmsStorage storage, - guint reference, - guint max_parts, - MMSmsPart *first_part, - GError **error); +gboolean mm_base_sms_init_from_properties (MMBaseSms *self, + MMBaseModem *modem, + MMSmsProperties *properties, + GError **error); +gboolean mm_base_sms_singlepart_init (MMBaseSms *self, + MMBaseModem *modem, + MMSmsState state, + MMSmsStorage storage, + MMSmsPart *part, + GError **error); +gboolean mm_base_sms_multipart_init (MMBaseSms *self, + MMBaseModem *modem, + MMSmsState state, + MMSmsStorage storage, + guint reference, + guint max_parts, + MMSmsPart *first_part, + GError **error); + gboolean mm_base_sms_multipart_take_part (MMBaseSms *self, MMSmsPart *part, GError **error); diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c index 79de6291..91a18cb2 100644 --- a/src/mm-broadband-modem-mbim.c +++ b/src/mm-broadband-modem-mbim.c @@ -9035,24 +9035,33 @@ add_sms_part (MMBroadbandModemMbim *self, self, FALSE, &error); - if (part) { - mm_obj_dbg (self, "correctly parsed PDU (%d)", pdu->message_index); - if (expected_index != SMS_PART_INVALID_INDEX && (expected_index != mm_sms_part_get_index (part))) { - /* Some Fibocom L850 modems report an invalid part index (always 1) in the response - * message. Because we know which message part was requested, we can use that value - * instead to workaround this bug. */ - mm_obj_dbg (self, "Expected SMS part index '%u' but device reports index '%u': using the expected one", - expected_index, mm_sms_part_get_index (part)); - mm_sms_part_set_index (part, expected_index); - } - mm_iface_modem_messaging_take_part (MM_IFACE_MODEM_MESSAGING (self), - part, - mm_sms_state_from_mbim_message_status (pdu->message_status), - MM_SMS_STORAGE_MT); - } else { + if (!part) { /* Don't treat the error as critical */ mm_obj_dbg (self, "error parsing PDU (%d): %s", pdu->message_index, error->message); + return; + } + + mm_obj_dbg (self, "correctly parsed PDU (%d)", pdu->message_index); + if (expected_index != SMS_PART_INVALID_INDEX && (expected_index != mm_sms_part_get_index (part))) { + /* Some Fibocom L850 modems report an invalid part index (always 1) in the response + * message. Because we know which message part was requested, we can use that value + * instead to workaround this bug. */ + mm_obj_dbg (self, "Expected SMS part index '%u' but device reports index '%u': using the expected one", + expected_index, mm_sms_part_get_index (part)); + mm_sms_part_set_index (part, expected_index); + } + + if (!mm_iface_modem_messaging_take_part (MM_IFACE_MODEM_MESSAGING (self), + mm_broadband_modem_create_sms (MM_BROADBAND_MODEM (self)), + part, + mm_sms_state_from_mbim_message_status (pdu->message_status), + MM_SMS_STORAGE_MT, + &error)) { + /* Don't treat the error as critical */ + mm_obj_dbg (self, "error adding SMS (%d): %s", + pdu->message_index, error->message); + return; } } @@ -9231,7 +9240,7 @@ enable_unsolicited_events_messaging (MMIfaceModemMessaging *_self, /* Create SMS (Messaging interface) */ static MMBaseSms * -messaging_create_sms (MMIfaceModemMessaging *self) +messaging_create_sms (MMBroadbandModem *self) { return mm_sms_mbim_new (MM_BASE_MODEM (self), mm_iface_modem_is_3gpp (MM_IFACE_MODEM (self))); @@ -10717,7 +10726,6 @@ iface_modem_messaging_init (MMIfaceModemMessagingInterface *iface) iface->enable_unsolicited_events_finish = common_enable_disable_unsolicited_events_messaging_finish; iface->disable_unsolicited_events = disable_unsolicited_events_messaging; iface->disable_unsolicited_events_finish = common_enable_disable_unsolicited_events_messaging_finish; - iface->create_sms = messaging_create_sms; } static void @@ -10787,6 +10795,7 @@ mm_broadband_modem_mbim_class_init (MMBroadbandModemMbimClass *klass) /* Do not initialize the MBIM modem through AT commands */ broadband_modem_class->enabling_modem_init = NULL; broadband_modem_class->enabling_modem_init_finish = NULL; + broadband_modem_class->create_sms = messaging_create_sms; #if defined WITH_QMI && QMI_MBIM_QMUX_SUPPORTED g_object_class_install_property (object_class, PROP_QMI_UNSUPPORTED, diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c index d13e1995..6caccc21 100644 --- a/src/mm-broadband-modem-qmi.c +++ b/src/mm-broadband-modem-qmi.c @@ -7938,8 +7938,8 @@ add_new_read_sms_part (MMIfaceModemMessaging *self, gboolean transfer_route, GArray *data) { - MMSmsPart *part = NULL; - GError *error = NULL; + MMSmsPart *part = NULL; + g_autoptr(GError) error = NULL; switch (format) { case QMI_WMS_MESSAGE_FORMAT_CDMA: @@ -7967,16 +7967,21 @@ add_new_read_sms_part (MMIfaceModemMessaging *self, break; } - if (part) { - mm_obj_dbg (self, "correctly parsed PDU (%d)", index); - mm_iface_modem_messaging_take_part (self, - part, - mm_sms_state_from_qmi_message_tag (tag), - mm_sms_storage_from_qmi_storage_type (storage)); - } else if (error) { + if (!part) { /* Don't treat the error as critical */ mm_obj_dbg (self, "error parsing PDU (%d): %s", index, error->message); - g_error_free (error); + return; + } + + mm_obj_dbg (self, "correctly parsed PDU (%d)", index); + if (!mm_iface_modem_messaging_take_part (self, + mm_broadband_modem_create_sms (MM_BROADBAND_MODEM (self)), + part, + mm_sms_state_from_qmi_message_tag (tag), + mm_sms_storage_from_qmi_storage_type (storage), + &error)) { + /* Don't treat the error as critical */ + mm_obj_dbg (self, "error adding SMS (%d): %s", index, error->message); } } @@ -8870,16 +8875,16 @@ messaging_enable_unsolicited_events (MMIfaceModemMessaging *_self, } /*****************************************************************************/ -/* Create SMS (Messaging interface) */ +/* Create SMS */ static MMBaseSms * -messaging_create_sms (MMIfaceModemMessaging *_self) +messaging_create_sms (MMBroadbandModem *_self) { MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self); /* Handle AT URC only fallback */ if (self->priv->messaging_fallback_at_only) { - return iface_modem_messaging_parent->create_sms (_self); + return MM_BROADBAND_MODEM_CLASS (mm_broadband_modem_qmi_parent_class)->create_sms (_self); } return mm_sms_qmi_new (MM_BASE_MODEM (self), @@ -15331,7 +15336,6 @@ iface_modem_messaging_init (MMIfaceModemMessagingInterface *iface) iface->enable_unsolicited_events_finish = messaging_enable_unsolicited_events_finish; iface->disable_unsolicited_events = messaging_disable_unsolicited_events; iface->disable_unsolicited_events_finish = messaging_disable_unsolicited_events_finish; - iface->create_sms = messaging_create_sms; iface->init_current_storages = messaging_init_current_storages; iface->init_current_storages_finish = messaging_init_current_storages_finish; } @@ -15470,4 +15474,5 @@ mm_broadband_modem_qmi_class_init (MMBroadbandModemQmiClass *klass) /* Do not initialize the QMI modem through AT commands */ broadband_modem_class->enabling_modem_init = NULL; broadband_modem_class->enabling_modem_init_finish = NULL; + broadband_modem_class->create_sms = messaging_create_sms; } diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index cb01676d..c29c9190 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -7545,10 +7545,10 @@ sms_part_ready (MMBroadbandModem *self, GTask *task) { SmsPartContext *ctx; - MMSmsPart *part; - MM3gppPduInfo *info; - const gchar *response; - GError *error = NULL; + MMSmsPart *part; + MM3gppPduInfo *info; + const gchar *response; + GError *error = NULL; /* Always always always unlock mem1 storage. Warned you've been. */ mm_iface_modem_messaging_unlock_storages (MM_IFACE_MODEM_MESSAGING (self), TRUE, FALSE); @@ -7574,16 +7574,22 @@ sms_part_ready (MMBroadbandModem *self, } part = mm_sms_part_3gpp_new_from_pdu (info->index, info->pdu, self, &error); - if (part) { - mm_obj_dbg (self, "correctly parsed PDU (%d)", ctx->idx); - mm_iface_modem_messaging_take_part (MM_IFACE_MODEM_MESSAGING (self), - part, - MM_SMS_STATE_RECEIVED, - self->priv->modem_messaging_sms_default_storage); - } else { + if (!part) { /* Don't treat the error as critical */ mm_obj_dbg (self, "error parsing PDU (%d): %s", ctx->idx, error->message); g_error_free (error); + } else { + mm_obj_dbg (self, "correctly parsed PDU (%d)", ctx->idx); + if (!mm_iface_modem_messaging_take_part (MM_IFACE_MODEM_MESSAGING (self), + mm_broadband_modem_create_sms (MM_BROADBAND_MODEM (self)), + part, + MM_SMS_STATE_RECEIVED, + self->priv->modem_messaging_sms_default_storage, + &error)) { + /* Don't treat the error as critical */ + mm_obj_dbg (self, "error adding SMS (%d): %s", ctx->idx, error->message); + g_error_free (error); + } } /* All done */ @@ -7674,10 +7680,10 @@ cds_received (MMPortSerialAt *port, GMatchInfo *info, MMBroadbandModem *self) { - GError *error = NULL; - MMSmsPart *part; - guint length; - gchar *pdu; + g_autoptr(GError) error = NULL; + MMSmsPart *part; + guint length; + gchar *pdu; mm_obj_dbg (self, "got new non-stored message indication"); @@ -7689,16 +7695,20 @@ cds_received (MMPortSerialAt *port, return; part = mm_sms_part_3gpp_new_from_pdu (SMS_PART_INVALID_INDEX, pdu, self, &error); - if (part) { - mm_obj_dbg (self, "correctly parsed non-stored PDU"); - mm_iface_modem_messaging_take_part (MM_IFACE_MODEM_MESSAGING (self), - part, - MM_SMS_STATE_RECEIVED, - MM_SMS_STORAGE_UNKNOWN); - } else { + if (!part) { /* Don't treat the error as critical */ mm_obj_dbg (self, "error parsing non-stored PDU: %s", error->message); - g_error_free (error); + } else { + mm_obj_dbg (self, "correctly parsed non-stored PDU"); + if (!mm_iface_modem_messaging_take_part (MM_IFACE_MODEM_MESSAGING (self), + mm_broadband_modem_create_sms (MM_BROADBAND_MODEM (self)), + part, + MM_SMS_STATE_RECEIVED, + MM_SMS_STORAGE_UNKNOWN, + &error)) { + /* Don't treat the error as critical */ + mm_obj_dbg (self, "error adding SMS: %s", error->message); + } } } @@ -8082,10 +8092,16 @@ sms_text_part_list_ready (MMBroadbandModem *self, mm_sms_part_set_class (part, -1); mm_obj_dbg (self, "correctly parsed SMS list entry (%d)", idx); - mm_iface_modem_messaging_take_part (MM_IFACE_MODEM_MESSAGING (self), - part, - sms_state_from_str (stat), - ctx->list_storage); + if (!mm_iface_modem_messaging_take_part (MM_IFACE_MODEM_MESSAGING (self), + mm_broadband_modem_create_sms (MM_BROADBAND_MODEM (self)), + part, + sms_state_from_str (stat), + ctx->list_storage, + &error)) { + mm_obj_dbg (self, "failed to add SMS: %s", inner_error->message); + goto next; + } + next: g_match_info_next (match_info, NULL); } @@ -8147,16 +8163,22 @@ sms_pdu_part_list_ready (MMBroadbandModem *self, MMSmsPart *part; part = mm_sms_part_3gpp_new_from_pdu (info->index, info->pdu, self, &error); - if (part) { - mm_obj_dbg (self, "correctly parsed PDU (%d)", info->index); - mm_iface_modem_messaging_take_part (MM_IFACE_MODEM_MESSAGING (self), - part, - sms_state_from_index (info->status), - ctx->list_storage); - } else { + if (!part) { /* Don't treat the error as critical */ mm_obj_dbg (self, "error parsing PDU (%d): %s", info->index, error->message); g_clear_error (&error); + } else { + mm_obj_dbg (self, "correctly parsed PDU (%d)", info->index); + if (!mm_iface_modem_messaging_take_part (MM_IFACE_MODEM_MESSAGING (self), + mm_broadband_modem_create_sms (MM_BROADBAND_MODEM (self)), + part, + sms_state_from_index (info->status), + ctx->list_storage, + &error)) { + /* Don't treat the error as critical */ + mm_obj_dbg (self, "error adding SMS (%d): %s", info->index, error->message); + g_clear_error (&error); + } } } @@ -8224,10 +8246,18 @@ modem_messaging_load_initial_sms_parts (MMIfaceModemMessaging *self, } /*****************************************************************************/ -/* Create SMS (Messaging interface) */ +/* Create SMS */ + +MMBaseSms * +mm_broadband_modem_create_sms (MMBroadbandModem *self) +{ + g_assert (MM_BROADBAND_MODEM_GET_CLASS (self)->create_sms != NULL); + + return MM_BROADBAND_MODEM_GET_CLASS (self)->create_sms (self); +} static MMBaseSms * -modem_messaging_create_sms (MMIfaceModemMessaging *self) +modem_messaging_create_sms (MMBroadbandModem *self) { return mm_sms_at_new (MM_BASE_MODEM (self), mm_iface_modem_is_3gpp (MM_IFACE_MODEM (self))); @@ -14542,7 +14572,6 @@ iface_modem_messaging_init (MMIfaceModemMessagingInterface *iface) iface->enable_unsolicited_events_finish = modem_messaging_enable_unsolicited_events_finish; iface->cleanup_unsolicited_events = modem_messaging_cleanup_unsolicited_events; iface->cleanup_unsolicited_events_finish = modem_messaging_setup_cleanup_unsolicited_events_finish; - iface->create_sms = modem_messaging_create_sms; iface->init_current_storages = modem_messaging_init_current_storages; iface->init_current_storages_finish = modem_messaging_init_current_storages_finish; iface->lock_storages = modem_messaging_lock_storages; @@ -14664,6 +14693,7 @@ mm_broadband_modem_class_init (MMBroadbandModemClass *klass) klass->disabling_stopped = disabling_stopped; klass->load_initial_eps_bearer_cid = load_initial_eps_bearer_cid; klass->load_initial_eps_bearer_cid_finish = load_initial_eps_bearer_cid_finish; + klass->create_sms = modem_messaging_create_sms; g_object_class_override_property (object_class, PROP_MODEM_DBUS_SKELETON, diff --git a/src/mm-broadband-modem.h b/src/mm-broadband-modem.h index 2370d78a..b96e64e3 100644 --- a/src/mm-broadband-modem.h +++ b/src/mm-broadband-modem.h @@ -27,6 +27,7 @@ #include "mm-modem-helpers.h" #include "mm-charsets.h" #include "mm-base-modem.h" +#include "mm-base-sms.h" #define MM_TYPE_BROADBAND_MODEM (mm_broadband_modem_get_type ()) #define MM_BROADBAND_MODEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MM_TYPE_BROADBAND_MODEM, MMBroadbandModem)) @@ -105,6 +106,9 @@ struct _MMBroadbandModemClass { gint (* load_initial_eps_bearer_cid_finish) (MMBroadbandModem *self, GAsyncResult *res, GError **error); + + /* Create SMS objects */ + MMBaseSms * (* create_sms) (MMBroadbandModem *self); }; GType mm_broadband_modem_get_type (void); @@ -140,4 +144,7 @@ gboolean mm_broadband_modem_get_active_multiplexed_bearers (MMBroadbandModem *s /* Helper to manage initial EPS bearer */ gint mm_broadband_modem_get_initial_eps_bearer_cid (MMBroadbandModem *self); +/* Helper to create a new modem-specific SMS object */ +MMBaseSms *mm_broadband_modem_create_sms (MMBroadbandModem *self); + #endif /* MM_BROADBAND_MODEM_H */ diff --git a/src/mm-iface-modem-messaging.c b/src/mm-iface-modem-messaging.c index ef6b546c..51c8b24e 100644 --- a/src/mm-iface-modem-messaging.c +++ b/src/mm-iface-modem-messaging.c @@ -22,6 +22,7 @@ #include "mm-sms-list.h" #include "mm-error-helpers.h" #include "mm-log-object.h" +#include "mm-broadband-modem.h" #define SUPPORT_CHECKED_TAG "messaging-support-checked-tag" #define SUPPORTED_TAG "messaging-supported-tag" @@ -91,16 +92,6 @@ mm_iface_modem_messaging_bind_simple_status (MMIfaceModemMessaging *self, /*****************************************************************************/ -MMBaseSms * -mm_iface_modem_messaging_create_sms (MMIfaceModemMessaging *self) -{ - g_assert (MM_IFACE_MODEM_MESSAGING_GET_IFACE (self)->create_sms != NULL); - - return MM_IFACE_MODEM_MESSAGING_GET_IFACE (self)->create_sms (self); -} - -/*****************************************************************************/ - void mm_iface_modem_messaging_lock_storages (MMIfaceModemMessaging *self, MMSmsStorage mem1, @@ -339,8 +330,8 @@ handle_create_auth_ready (MMIfaceAuth *auth, return; } - sms = mm_base_sms_new_from_properties (MM_BASE_MODEM (self), properties, &error); - if (!sms) { + sms = mm_broadband_modem_create_sms (MM_BROADBAND_MODEM (self)); + if (!mm_base_sms_init_from_properties (sms, MM_BASE_MODEM (self), properties, &error)) { mm_dbus_method_invocation_take_error (ctx->invocation, error); handle_create_context_free (ctx); return; @@ -525,13 +516,14 @@ handle_set_default_storage (MmGdbusModemMessaging *skeleton, /*****************************************************************************/ gboolean -mm_iface_modem_messaging_take_part (MMIfaceModemMessaging *self, - MMSmsPart *sms_part, - MMSmsState state, - MMSmsStorage storage) +mm_iface_modem_messaging_take_part (MMIfaceModemMessaging *self, + MMBaseSms *uninitialized_sms, + MMSmsPart *sms_part, + MMSmsState state, + MMSmsStorage storage, + GError **error) { g_autoptr(MMSmsList) list = NULL; - g_autoptr(GError) error = NULL; gboolean added = FALSE; g_object_get (self, @@ -539,15 +531,20 @@ mm_iface_modem_messaging_take_part (MMIfaceModemMessaging *self, NULL); if (list) { - added = mm_sms_list_take_part (list, sms_part, state, storage, &error); + added = mm_sms_list_take_part (list, uninitialized_sms, sms_part, state, storage, error); if (!added) - mm_obj_dbg (self, "couldn't take part in SMS list: %s", error->message); + g_prefix_error (error, "couldn't take part in SMS list: "); } - /* If part wasn't taken, we need to free the part ourselves */ + /* If part wasn't taken, we need to free the part and SMS ourselves */ if (!added) mm_sms_part_free (sms_part); + /* Always drop original ref to the uninialized SMS, as MMSmsList will have + * taken a reference to the SMS if it wants to keep it around. + */ + g_object_unref (uninitialized_sms); + return added; } diff --git a/src/mm-iface-modem-messaging.h b/src/mm-iface-modem-messaging.h index d341d3b0..f62324c9 100644 --- a/src/mm-iface-modem-messaging.h +++ b/src/mm-iface-modem-messaging.h @@ -142,9 +142,6 @@ struct _MMIfaceModemMessagingInterface { gboolean (*load_initial_sms_parts_finish) (MMIfaceModemMessaging *self, GAsyncResult *res, GError **error); - - /* Create SMS objects */ - MMBaseSms * (* create_sms) (MMIfaceModemMessaging *self); }; /* Initialize Messaging interface (async) */ @@ -181,10 +178,12 @@ void mm_iface_modem_messaging_bind_simple_status (MMIfaceModemMessaging *self, MMSimpleStatus *status); /* Report new SMS part */ -gboolean mm_iface_modem_messaging_take_part (MMIfaceModemMessaging *self, - MMSmsPart *sms_part, - MMSmsState state, - MMSmsStorage storage); +gboolean mm_iface_modem_messaging_take_part (MMIfaceModemMessaging *self, + MMBaseSms *uninitialized_sms, + MMSmsPart *sms_part, + MMSmsState state, + MMSmsStorage storage, + GError **error); /* Check storage support */ gboolean mm_iface_modem_messaging_is_storage_supported_for_storing (MMIfaceModemMessaging *self, diff --git a/src/mm-sms-list.c b/src/mm-sms-list.c index f2401dae..21515aa5 100644 --- a/src/mm-sms-list.c +++ b/src/mm-sms-list.c @@ -259,24 +259,23 @@ cmp_sms_by_part_index_and_storage (MMBaseSms *sms, static gboolean take_singlepart (MMSmsList *self, + MMBaseSms *sms, MMSmsPart *part, MMSmsState state, MMSmsStorage storage, GError **error) { - MMBaseSms *sms; - - sms = mm_base_sms_singlepart_new (self->priv->modem, + if (!mm_base_sms_singlepart_init (sms, + self->priv->modem, state, storage, part, - error); - if (!sms) + error)) return FALSE; mm_obj_dbg (sms, "creating new singlepart SMS object"); - self->priv->list = g_list_prepend (self->priv->list, sms); + self->priv->list = g_list_prepend (self->priv->list, g_object_ref (sms)); g_signal_emit (self, signals[SIGNAL_ADDED], 0, mm_base_sms_get_path (sms), state == MM_SMS_STATE_RECEIVED); @@ -285,13 +284,13 @@ take_singlepart (MMSmsList *self, static gboolean take_multipart (MMSmsList *self, + MMBaseSms *sms, MMSmsPart *part, MMSmsState state, MMSmsStorage storage, GError **error) { GList *l; - MMBaseSms *sms; guint concat_reference; concat_reference = mm_sms_part_get_concat_reference (part); @@ -304,20 +303,20 @@ take_multipart (MMSmsList *self, } /* Create new Multipart */ - sms = mm_base_sms_multipart_new (self->priv->modem, + if (!mm_base_sms_multipart_init (sms, + self->priv->modem, state, storage, concat_reference, mm_sms_part_get_concat_max (part), part, - error); - if (!sms) + error)) return FALSE; mm_obj_dbg (sms, "creating new multipart SMS object: need to receive %u parts with reference '%u'", mm_sms_part_get_concat_max (part), concat_reference); - self->priv->list = g_list_prepend (self->priv->list, sms); + self->priv->list = g_list_prepend (self->priv->list, g_object_ref (sms)); g_signal_emit (self, signals[SIGNAL_ADDED], 0, mm_base_sms_get_path (sms), (state == MM_SMS_STATE_RECEIVED || @@ -347,6 +346,7 @@ mm_sms_list_has_part (MMSmsList *self, gboolean mm_sms_list_take_part (MMSmsList *self, + MMBaseSms *uninitialized_sms, MMSmsPart *part, MMSmsState state, MMSmsStorage storage, @@ -379,7 +379,7 @@ mm_sms_list_take_part (MMSmsList *self, mm_sms_part_get_concat_sequence (part), mm_sms_part_get_concat_max (part)); - return take_multipart (self, part, state, storage, error); + return take_multipart (self, uninitialized_sms, part, state, storage, error); } /* Otherwise, we build a whole new single-part MMSms just from this part */ @@ -389,7 +389,7 @@ mm_sms_list_take_part (MMSmsList *self, mm_sms_part_get_index (part)); else mm_obj_dbg (self, "SMS part (not stored) is from a singlepart SMS"); - return take_singlepart (self, part, state, storage, error); + return take_singlepart (self, uninitialized_sms, part, state, storage, error); } /*****************************************************************************/ diff --git a/src/mm-sms-list.h b/src/mm-sms-list.h index 775611c8..e8503a22 100644 --- a/src/mm-sms-list.h +++ b/src/mm-sms-list.h @@ -68,6 +68,7 @@ gboolean mm_sms_list_has_part (MMSmsList *self, guint index); gboolean mm_sms_list_take_part (MMSmsList *self, + MMBaseSms *uninitialized_sms, MMSmsPart *part, MMSmsState state, MMSmsStorage storage, -- cgit v1.2.3-70-g09d2 From 9c8ec57c24ed8eeafaa3c84f5a458c9c41d22ae5 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Sat, 19 Apr 2025 10:57:54 -0500 Subject: base-sms: pass SMS default storage at creation time and update as needed Instead of getting it from the MMIfaceModemMessaging when the SMS is stored. This flattens dependencies between MMBaseSms and MMIfaceModemMessaging. Signed-off-by: Dan Williams --- src/mm-base-sms.c | 22 +++++++++++++++++++--- src/mm-base-sms.h | 1 + src/mm-broadband-modem-mbim.c | 6 +++++- src/mm-broadband-modem-qmi.c | 5 ++++- src/mm-broadband-modem.c | 6 +++++- src/mm-iface-modem-messaging.c | 22 +++++++++++++++++++++- src/mm-iface-modem-messaging.h | 2 ++ src/mm-sms-at.c | 5 ++++- src/mm-sms-at.h | 5 +++-- src/mm-sms-list.c | 15 +++++++++++++++ src/mm-sms-list.h | 3 +++ src/mm-sms-mbim.c | 5 ++++- src/mm-sms-mbim.h | 5 +++-- src/mm-sms-qmi.c | 5 ++++- src/mm-sms-qmi.h | 5 +++-- 15 files changed, 96 insertions(+), 16 deletions(-) (limited to 'src/mm-iface-modem-messaging.h') diff --git a/src/mm-base-sms.c b/src/mm-base-sms.c index daf7fb67..07081aa3 100644 --- a/src/mm-base-sms.c +++ b/src/mm-base-sms.c @@ -55,6 +55,7 @@ enum { PROP_MAX_PARTS, PROP_MULTIPART_REFERENCE, PROP_IS_3GPP, + PROP_DEFAULT_STORAGE, PROP_LAST }; @@ -93,6 +94,8 @@ struct _MMBaseSmsPrivate { /* TRUE for 3GPP SMS; FALSE for CDMA */ gboolean is_3gpp; + + MMSmsStorage default_storage; }; /*****************************************************************************/ @@ -486,9 +489,7 @@ handle_store (MMBaseSms *self, if (ctx->storage == MM_SMS_STORAGE_UNKNOWN) { /* We'll set now the proper storage, taken from the default mem2 one */ - g_object_get (self->priv->modem, - MM_IFACE_MODEM_MESSAGING_SMS_DEFAULT_STORAGE, &ctx->storage, - NULL); + ctx->storage = self->priv->default_storage; g_assert (ctx->storage != MM_SMS_STORAGE_UNKNOWN); } @@ -1265,6 +1266,9 @@ set_property (GObject *object, case PROP_IS_3GPP: self->priv->is_3gpp = g_value_get_boolean (value); break; + case PROP_DEFAULT_STORAGE: + self->priv->default_storage = g_value_get_enum (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1304,6 +1308,9 @@ get_property (GObject *object, case PROP_IS_3GPP: g_value_set_boolean (value, self->priv->is_3gpp); break; + case PROP_DEFAULT_STORAGE: + g_value_set_enum (value, self->priv->default_storage); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1440,4 +1447,13 @@ mm_base_sms_class_init (MMBaseSmsClass *klass) FALSE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); g_object_class_install_property (object_class, PROP_IS_3GPP, properties[PROP_IS_3GPP]); + + properties[PROP_DEFAULT_STORAGE] = + g_param_spec_enum (MM_BASE_SMS_DEFAULT_STORAGE, + "Default storage", + "Default SMS storage", + MM_TYPE_SMS_STORAGE, + MM_SMS_STORAGE_UNKNOWN, + G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_DEFAULT_STORAGE, properties[PROP_DEFAULT_STORAGE]); } diff --git a/src/mm-base-sms.h b/src/mm-base-sms.h index 22d25ebb..14902167 100644 --- a/src/mm-base-sms.h +++ b/src/mm-base-sms.h @@ -53,6 +53,7 @@ typedef struct _MMBaseSmsPrivate MMBaseSmsPrivate; #define MM_BASE_SMS_MAX_PARTS "sms-max-parts" #define MM_BASE_SMS_MULTIPART_REFERENCE "sms-multipart-reference" #define MM_BASE_SMS_IS_3GPP "sms-is-3gpp" +#define MM_BASE_SMS_DEFAULT_STORAGE "sms-default-storage" struct _MMBaseSms { MmGdbusSmsSkeleton parent; diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c index 91a18cb2..5d7e37be 100644 --- a/src/mm-broadband-modem-mbim.c +++ b/src/mm-broadband-modem-mbim.c @@ -9242,8 +9242,12 @@ enable_unsolicited_events_messaging (MMIfaceModemMessaging *_self, static MMBaseSms * messaging_create_sms (MMBroadbandModem *self) { + MMSmsStorage default_storage; + + default_storage = mm_iface_modem_messaging_get_default_storage (MM_IFACE_MODEM_MESSAGING (self)); return mm_sms_mbim_new (MM_BASE_MODEM (self), - mm_iface_modem_is_3gpp (MM_IFACE_MODEM (self))); + mm_iface_modem_is_3gpp (MM_IFACE_MODEM (self)), + default_storage); } /*****************************************************************************/ diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c index 6caccc21..4f153009 100644 --- a/src/mm-broadband-modem-qmi.c +++ b/src/mm-broadband-modem-qmi.c @@ -8881,14 +8881,17 @@ static MMBaseSms * messaging_create_sms (MMBroadbandModem *_self) { MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self); + MMSmsStorage default_storage; /* Handle AT URC only fallback */ if (self->priv->messaging_fallback_at_only) { return MM_BROADBAND_MODEM_CLASS (mm_broadband_modem_qmi_parent_class)->create_sms (_self); } + default_storage = mm_iface_modem_messaging_get_default_storage (MM_IFACE_MODEM_MESSAGING (self)); return mm_sms_qmi_new (MM_BASE_MODEM (self), - mm_iface_modem_is_3gpp (MM_IFACE_MODEM (self))); + mm_iface_modem_is_3gpp (MM_IFACE_MODEM (self)), + default_storage); } diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index c29c9190..f164be01 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -8259,8 +8259,12 @@ mm_broadband_modem_create_sms (MMBroadbandModem *self) static MMBaseSms * modem_messaging_create_sms (MMBroadbandModem *self) { + MMSmsStorage default_storage; + + default_storage = mm_iface_modem_messaging_get_default_storage (MM_IFACE_MODEM_MESSAGING (self)); return mm_sms_at_new (MM_BASE_MODEM (self), - mm_iface_modem_is_3gpp (MM_IFACE_MODEM (self))); + mm_iface_modem_is_3gpp (MM_IFACE_MODEM (self)), + default_storage); } /*****************************************************************************/ diff --git a/src/mm-iface-modem-messaging.c b/src/mm-iface-modem-messaging.c index 51c8b24e..941e58e0 100644 --- a/src/mm-iface-modem-messaging.c +++ b/src/mm-iface-modem-messaging.c @@ -433,7 +433,8 @@ handle_set_default_storage_ready (MMIfaceModemMessaging *self, GAsyncResult *res, HandleSetDefaultStorageContext *ctx) { - GError *error = NULL; + GError *error = NULL; + g_autoptr(MMSmsList) list = NULL; if (!MM_IFACE_MODEM_MESSAGING_GET_IFACE (self)->set_default_storage_finish (self, res, &error)) { mm_obj_warn (self, "could not set default storage: %s", error->message); @@ -446,6 +447,13 @@ handle_set_default_storage_ready (MMIfaceModemMessaging *self, MM_IFACE_MODEM_MESSAGING_SMS_DEFAULT_STORAGE, ctx->storage, NULL); + /* Update default storage in all SMSs too */ + g_object_get (self, + MM_IFACE_MODEM_MESSAGING_SMS_LIST, &list, + NULL); + if (list) + mm_sms_list_set_default_storage (list, ctx->storage); + mm_obj_info (self, "set the default storage successfully"); mm_gdbus_modem_messaging_complete_set_default_storage (ctx->skeleton, ctx->invocation); handle_set_default_storage_context_free (ctx); @@ -598,6 +606,18 @@ mm_iface_modem_messaging_is_storage_supported_for_receiving (MMIfaceModemMessagi error); } +MMSmsStorage +mm_iface_modem_messaging_get_default_storage (MMIfaceModemMessaging *self) +{ + MMSmsStorage storage = MM_SMS_STORAGE_UNKNOWN; + + g_object_get (self, + MM_IFACE_MODEM_MESSAGING_SMS_DEFAULT_STORAGE, &storage, + NULL); + g_assert (storage != MM_SMS_STORAGE_UNKNOWN); + return storage; +} + /*****************************************************************************/ static void diff --git a/src/mm-iface-modem-messaging.h b/src/mm-iface-modem-messaging.h index f62324c9..d7f29b6d 100644 --- a/src/mm-iface-modem-messaging.h +++ b/src/mm-iface-modem-messaging.h @@ -193,6 +193,8 @@ gboolean mm_iface_modem_messaging_is_storage_supported_for_receiving (MMIfaceMod MMSmsStorage storage, GError **error); +MMSmsStorage mm_iface_modem_messaging_get_default_storage (MMIfaceModemMessaging *self); + /* SMS creation */ MMBaseSms *mm_iface_modem_messaging_create_sms (MMIfaceModemMessaging *self); diff --git a/src/mm-sms-at.c b/src/mm-sms-at.c index 3fc7c155..b79a95ab 100644 --- a/src/mm-sms-at.c +++ b/src/mm-sms-at.c @@ -788,13 +788,16 @@ sms_delete (MMBaseSms *sms, /*****************************************************************************/ MMBaseSms * -mm_sms_at_new (MMBaseModem *modem, gboolean is_3gpp) +mm_sms_at_new (MMBaseModem *modem, + gboolean is_3gpp, + MMSmsStorage default_storage) { MMBaseSms *sms; sms = MM_BASE_SMS (g_object_new (MM_TYPE_SMS_AT, MM_BASE_SMS_MODEM, modem, MM_BASE_SMS_IS_3GPP, is_3gpp, + MM_BASE_SMS_DEFAULT_STORAGE, default_storage, NULL)); MM_SMS_AT (sms)->priv->modem = g_object_ref (modem); return sms; diff --git a/src/mm-sms-at.h b/src/mm-sms-at.h index 26e2dae4..551d50eb 100644 --- a/src/mm-sms-at.h +++ b/src/mm-sms-at.h @@ -53,7 +53,8 @@ struct _MMSmsAtClass { GType mm_sms_at_get_type (void); G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMSmsAt, g_object_unref) -MMBaseSms *mm_sms_at_new (MMBaseModem *modem, - gboolean is_3gpp); +MMBaseSms *mm_sms_at_new (MMBaseModem *modem, + gboolean is_3gpp, + MMSmsStorage default_storage); #endif /* MM_SMS_AT_H */ diff --git a/src/mm-sms-list.c b/src/mm-sms-list.c index 21515aa5..69c62153 100644 --- a/src/mm-sms-list.c +++ b/src/mm-sms-list.c @@ -394,6 +394,21 @@ mm_sms_list_take_part (MMSmsList *self, /*****************************************************************************/ +void +mm_sms_list_set_default_storage (MMSmsList *self, + MMSmsStorage default_storage) +{ + GList *l; + + for (l = self->priv->list; l; l = g_list_next (l)) { + g_object_set (MM_BASE_SMS (l->data), + MM_BASE_SMS_DEFAULT_STORAGE, default_storage, + NULL); + } +} + +/*****************************************************************************/ + static gchar * log_object_build_id (MMLogObject *_self) { diff --git a/src/mm-sms-list.h b/src/mm-sms-list.h index e8503a22..53fa63f0 100644 --- a/src/mm-sms-list.h +++ b/src/mm-sms-list.h @@ -89,4 +89,7 @@ gboolean mm_sms_list_has_local_multipart_reference (MMSmsList *self, const gchar *number, guint8 reference); +void mm_sms_list_set_default_storage (MMSmsList *self, + MMSmsStorage default_storage); + #endif /* MM_SMS_LIST_H */ diff --git a/src/mm-sms-mbim.c b/src/mm-sms-mbim.c index 1cb442d6..7b3edb84 100644 --- a/src/mm-sms-mbim.c +++ b/src/mm-sms-mbim.c @@ -332,12 +332,15 @@ sms_delete (MMBaseSms *self, /*****************************************************************************/ MMBaseSms * -mm_sms_mbim_new (MMBaseModem *modem, gboolean is_3gpp) +mm_sms_mbim_new (MMBaseModem *modem, + gboolean is_3gpp, + MMSmsStorage default_storage) { return MM_BASE_SMS (g_object_new (MM_TYPE_SMS_MBIM, MM_BASE_SMS_MODEM, modem, MM_BIND_TO, G_OBJECT (modem), MM_BASE_SMS_IS_3GPP, is_3gpp, + MM_BASE_SMS_DEFAULT_STORAGE, default_storage, NULL)); } diff --git a/src/mm-sms-mbim.h b/src/mm-sms-mbim.h index 070ff677..7877c3f1 100644 --- a/src/mm-sms-mbim.h +++ b/src/mm-sms-mbim.h @@ -45,7 +45,8 @@ struct _MMSmsMbimClass { GType mm_sms_mbim_get_type (void); G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMSmsMbim, g_object_unref) -MMBaseSms *mm_sms_mbim_new (MMBaseModem *modem, - gboolean is_3gpp); +MMBaseSms *mm_sms_mbim_new (MMBaseModem *modem, + gboolean is_3gpp, + MMSmsStorage default_storage); #endif /* MM_SMS_MBIM_H */ diff --git a/src/mm-sms-qmi.c b/src/mm-sms-qmi.c index aa5101ee..ebd8f845 100644 --- a/src/mm-sms-qmi.c +++ b/src/mm-sms-qmi.c @@ -786,12 +786,15 @@ sms_delete (MMBaseSms *self, /*****************************************************************************/ MMBaseSms * -mm_sms_qmi_new (MMBaseModem *modem, gboolean is_3gpp) +mm_sms_qmi_new (MMBaseModem *modem, + gboolean is_3gpp, + MMSmsStorage default_storage) { return MM_BASE_SMS (g_object_new (MM_TYPE_SMS_QMI, MM_BASE_SMS_MODEM, modem, MM_BIND_TO, G_OBJECT (modem), MM_BASE_SMS_IS_3GPP, is_3gpp, + MM_BASE_SMS_DEFAULT_STORAGE, default_storage, NULL)); } diff --git a/src/mm-sms-qmi.h b/src/mm-sms-qmi.h index 250e406e..1dda2a95 100644 --- a/src/mm-sms-qmi.h +++ b/src/mm-sms-qmi.h @@ -47,7 +47,8 @@ struct _MMSmsQmiClass { GType mm_sms_qmi_get_type (void); G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMSmsQmi, g_object_unref) -MMBaseSms *mm_sms_qmi_new (MMBaseModem *modem, - gboolean is_3gpp); +MMBaseSms *mm_sms_qmi_new (MMBaseModem *modem, + gboolean is_3gpp, + MMSmsStorage default_storage); #endif /* MM_SMS_QMI_H */ -- cgit v1.2.3-70-g09d2 From 97c189910bfb6cf4974a04d34a2e53a8bd1cfdf1 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Sat, 19 Apr 2025 19:13:53 -0500 Subject: base-sms,sms-list: use signals to set multipart reference Instead of going through the messaging interface, which just asks the MMSmsList anyway, just go straight to the list. Signed-off-by: Dan Williams --- src/mm-base-sms.c | 68 ++++++++++++++++++++++++++----------- src/mm-base-sms.h | 10 ++++++ src/mm-iface-modem-messaging.c | 48 -------------------------- src/mm-iface-modem-messaging.h | 5 --- src/mm-sms-list.c | 76 ++++++++++++++++++++++++++++++++---------- 5 files changed, 117 insertions(+), 90 deletions(-) (limited to 'src/mm-iface-modem-messaging.h') diff --git a/src/mm-base-sms.c b/src/mm-base-sms.c index ecfee882..410ccc74 100644 --- a/src/mm-base-sms.c +++ b/src/mm-base-sms.c @@ -62,6 +62,13 @@ enum { static GParamSpec *properties[PROP_LAST]; +enum { + SIGNAL_SET_LOCAL_MULTIPART_REFERENCE, + SIGNAL_LAST +}; + +static guint signals[SIGNAL_LAST] = { 0 }; + struct _MMBaseSmsPrivate { gboolean initialized; @@ -383,26 +390,22 @@ prepare_sms_to_be_stored (MMBaseSms *self, * when storing locally, as we could collide with the references used * in other existing messages. */ if (self->priv->is_multipart) { - GList *l; - guint8 reference; - - /* Look for a valid multipart reference to use. When storing, we need to - * check whether we have already stored multipart SMS with the same - * reference and destination number */ - reference = mm_iface_modem_messaging_get_local_multipart_reference ( - MM_IFACE_MODEM_MESSAGING (self->priv->modem), - mm_gdbus_sms_get_number (MM_GDBUS_SMS (self)), - error); - if (!reference) { - g_prefix_error (error, "Cannot get local multipart reference: "); + const gchar *number; + + number = mm_gdbus_sms_get_number (MM_GDBUS_SMS (self)); + g_signal_emit (self, + signals[SIGNAL_SET_LOCAL_MULTIPART_REFERENCE], + 0, + number); + if (self->priv->multipart_reference == 0) { + g_set_error (error, + MM_CORE_ERROR, + MM_CORE_ERROR_TOO_MANY, + "Cannot create multipart SMS: No valid multipart reference " + "available for destination number '%s'", + number); return FALSE; } - - self->priv->multipart_reference = reference; - for (l = self->priv->parts; l; l = g_list_next (l)) { - mm_sms_part_set_concat_reference ((MMSmsPart *)l->data, - self->priv->multipart_reference); - } } return TRUE; @@ -587,7 +590,7 @@ prepare_sms_to_be_sent (MMBaseSms *self, * multipart reference. When sending a message which wasn't stored * yet, we can just get a random multipart reference. */ if (self->priv->is_multipart) { - self->priv->multipart_reference = g_random_int_range (1,255); + self->priv->multipart_reference = g_random_int_range (1, 255); for (l = self->priv->parts; l; l = g_list_next (l)) { mm_sms_part_set_concat_reference ((MMSmsPart *)l->data, self->priv->multipart_reference); @@ -762,6 +765,23 @@ mm_base_sms_get_multipart_reference (MMBaseSms *self) return self->priv->multipart_reference; } +void +mm_base_sms_set_multipart_reference (MMBaseSms *self, guint reference) +{ + GList *l; + + g_return_if_fail (self->priv->is_multipart); + g_return_if_fail (reference > 0); + g_return_if_fail (reference <= 255); + g_return_if_fail (self->priv->multipart_reference == 0); + + self->priv->multipart_reference = reference; + for (l = self->priv->parts; l; l = g_list_next (l)) { + mm_sms_part_set_concat_reference ((MMSmsPart *)l->data, + self->priv->multipart_reference); + } +} + gboolean mm_base_sms_multipart_is_complete (MMBaseSms *self) { @@ -1504,4 +1524,14 @@ mm_base_sms_class_init (MMBaseSmsClass *klass) G_TYPE_ARRAY, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); g_object_class_install_property (object_class, PROP_SUPPORTED_STORAGES, properties[PROP_SUPPORTED_STORAGES]); + + /* Signals */ + signals[SIGNAL_SET_LOCAL_MULTIPART_REFERENCE] = + g_signal_new (MM_BASE_SMS_SET_LOCAL_MULTIPART_REFERENCE, + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (MMBaseSmsClass, set_local_multipart_reference), + NULL, NULL, + g_cclosure_marshal_generic, + G_TYPE_NONE, 0); } diff --git a/src/mm-base-sms.h b/src/mm-base-sms.h index dd1c10bb..f87a6640 100644 --- a/src/mm-base-sms.h +++ b/src/mm-base-sms.h @@ -46,6 +46,7 @@ typedef struct _MMBaseSms MMBaseSms; typedef struct _MMBaseSmsClass MMBaseSmsClass; typedef struct _MMBaseSmsPrivate MMBaseSmsPrivate; +/* Properties */ #define MM_BASE_SMS_PATH "sms-path" #define MM_BASE_SMS_CONNECTION "sms-connection" #define MM_BASE_SMS_MODEM "sms-modem" @@ -56,6 +57,9 @@ typedef struct _MMBaseSmsPrivate MMBaseSmsPrivate; #define MM_BASE_SMS_DEFAULT_STORAGE "sms-default-storage" #define MM_BASE_SMS_SUPPORTED_STORAGES "sms-supported-storages" +/* Signals */ +#define MM_BASE_SMS_SET_LOCAL_MULTIPART_REFERENCE "sms-set-local-multipart-reference" + struct _MMBaseSms { MmGdbusSmsSkeleton parent; MMBaseSmsPrivate *priv; @@ -88,6 +92,10 @@ struct _MMBaseSmsClass { gboolean (* delete_finish) (MMBaseSms *self, GAsyncResult *res, GError **error); + + /* Signal */ + void (*set_local_multipart_reference) (MMBaseSms *self, + const gchar *number); }; GType mm_base_sms_get_type (void); @@ -128,6 +136,8 @@ GList *mm_base_sms_get_parts (MMBaseSms *self); gboolean mm_base_sms_is_multipart (MMBaseSms *self); guint mm_base_sms_get_max_parts (MMBaseSms *self); guint mm_base_sms_get_multipart_reference (MMBaseSms *self); +void mm_base_sms_set_multipart_reference (MMBaseSms *self, + guint reference); gboolean mm_base_sms_multipart_is_complete (MMBaseSms *self); gboolean mm_base_sms_multipart_is_assembled (MMBaseSms *self); diff --git a/src/mm-iface-modem-messaging.c b/src/mm-iface-modem-messaging.c index 941e58e0..b6b63e49 100644 --- a/src/mm-iface-modem-messaging.c +++ b/src/mm-iface-modem-messaging.c @@ -36,54 +36,6 @@ G_DEFINE_INTERFACE (MMIfaceModemMessaging, mm_iface_modem_messaging, MM_TYPE_IFA /*****************************************************************************/ -guint8 -mm_iface_modem_messaging_get_local_multipart_reference (MMIfaceModemMessaging *self, - const gchar *number, - GError **error) -{ - MMSmsList *list = NULL; - guint8 reference; - guint8 first; - - /* Start by looking for a random number */ - reference = g_random_int_range (1,255); - - /* Then, look for the given reference in user-created messages */ - g_object_get (self, - MM_IFACE_MODEM_MESSAGING_SMS_LIST, &list, - NULL); - if (!list) - return reference; - - first = reference; - do { - if (!mm_sms_list_has_local_multipart_reference (list, number, reference)) { - g_object_unref (list); - return reference; - } - - if (reference == 255) - reference = 1; - else - reference++; - } - while (reference != first); - - g_object_unref (list); - - /* We were not able to find a new valid multipart reference :/ - * return an error */ - g_set_error (error, - MM_CORE_ERROR, - MM_CORE_ERROR_TOO_MANY, - "Cannot create multipart SMS: No valid multipart reference " - "available for destination number '%s'", - number); - return 0; -} - -/*****************************************************************************/ - void mm_iface_modem_messaging_bind_simple_status (MMIfaceModemMessaging *self, MMSimpleStatus *status) diff --git a/src/mm-iface-modem-messaging.h b/src/mm-iface-modem-messaging.h index d7f29b6d..6cf7a0f6 100644 --- a/src/mm-iface-modem-messaging.h +++ b/src/mm-iface-modem-messaging.h @@ -211,9 +211,4 @@ void mm_iface_modem_messaging_unlock_storages (MMIfaceModemMessaging *s gboolean mem1, gboolean mem2); -/* Look for a new valid multipart reference */ -guint8 mm_iface_modem_messaging_get_local_multipart_reference (MMIfaceModemMessaging *self, - const gchar *number, - GError **error); - #endif /* MM_IFACE_MODEM_MESSAGING_H */ diff --git a/src/mm-sms-list.c b/src/mm-sms-list.c index 69c62153..99f35da1 100644 --- a/src/mm-sms-list.c +++ b/src/mm-sms-list.c @@ -61,6 +61,8 @@ struct _MMSmsListPrivate { GList *list; }; +static void _release_sms_internal (MMBaseSms *sms, MMSmsList *self); + /*****************************************************************************/ gboolean @@ -161,7 +163,7 @@ delete_ready (MMBaseSms *sms, path, (GCompareFunc)cmp_sms_by_path); if (l) { - g_object_unref (MM_BASE_SMS (l->data)); + _release_sms_internal (MM_BASE_SMS (l->data), self); self->priv->list = g_list_delete_link (self->priv->list, l); } @@ -213,14 +215,61 @@ mm_sms_list_delete_sms (MMSmsList *self, /*****************************************************************************/ -void -mm_sms_list_add_sms (MMSmsList *self, - MMBaseSms *sms) +static void +set_local_multipart_reference (MMBaseSms *sms, + const gchar *number, + MMSmsList *self) +{ + guint8 reference; + guint8 first; + + /* Start by looking for a random number */ + reference = g_random_int_range (1, 255); + + /* Then, look for the given reference in user-created messages */ + first = reference; + do { + if (!mm_sms_list_has_local_multipart_reference (self, number, reference)) { + mm_base_sms_set_multipart_reference (sms, reference); + return; + } + + if (reference == 255) + reference = 1; + else + reference++; + } while (reference != first); +} + +static void +_release_sms_internal (MMBaseSms *sms, MMSmsList *self) +{ + g_signal_handlers_disconnect_by_func (sms, set_local_multipart_reference, self); + g_object_unref (sms); +} + +static void +_add_sms_internal (MMSmsList *self, + MMBaseSms *sms, + gboolean received) { self->priv->list = g_list_prepend (self->priv->list, g_object_ref (sms)); + g_signal_connect (sms, + MM_BASE_SMS_SET_LOCAL_MULTIPART_REFERENCE, + (GCallback)set_local_multipart_reference, + self); + g_signal_emit (self, signals[SIGNAL_ADDED], 0, mm_base_sms_get_path (sms), - FALSE); + received); +} + + +void +mm_sms_list_add_sms (MMSmsList *self, + MMBaseSms *sms) +{ + _add_sms_internal (self, sms, FALSE); } /*****************************************************************************/ @@ -274,11 +323,7 @@ take_singlepart (MMSmsList *self, return FALSE; mm_obj_dbg (sms, "creating new singlepart SMS object"); - - self->priv->list = g_list_prepend (self->priv->list, g_object_ref (sms)); - g_signal_emit (self, signals[SIGNAL_ADDED], 0, - mm_base_sms_get_path (sms), - state == MM_SMS_STATE_RECEIVED); + _add_sms_internal (self, sms, state == MM_SMS_STATE_RECEIVED); return TRUE; } @@ -316,12 +361,7 @@ take_multipart (MMSmsList *self, mm_obj_dbg (sms, "creating new multipart SMS object: need to receive %u parts with reference '%u'", mm_sms_part_get_concat_max (part), concat_reference); - self->priv->list = g_list_prepend (self->priv->list, g_object_ref (sms)); - g_signal_emit (self, signals[SIGNAL_ADDED], 0, - mm_base_sms_get_path (sms), - (state == MM_SMS_STATE_RECEIVED || - state == MM_SMS_STATE_RECEIVING)); - + _add_sms_internal (self, sms, (state == MM_SMS_STATE_RECEIVED || state == MM_SMS_STATE_RECEIVING)); return TRUE; } @@ -488,8 +528,8 @@ dispose (GObject *object) g_clear_object (&self->priv->modem); g_clear_object (&self->priv->bind_to); - g_list_free_full (self->priv->list, g_object_unref); - self->priv->list = NULL; + g_list_foreach (self->priv->list, (GFunc)_release_sms_internal, self); + g_clear_pointer (&self->priv->list, (GDestroyNotify)g_list_free); G_OBJECT_CLASS (mm_sms_list_parent_class)->dispose (object); } -- cgit v1.2.3-70-g09d2