aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mm-base-sms.c83
-rw-r--r--src/mm-base-sms.h34
-rw-r--r--src/mm-broadband-modem-mbim.c43
-rw-r--r--src/mm-broadband-modem-qmi.c33
-rw-r--r--src/mm-broadband-modem.c104
-rw-r--r--src/mm-broadband-modem.h7
-rw-r--r--src/mm-iface-modem-messaging.c37
-rw-r--r--src/mm-iface-modem-messaging.h13
-rw-r--r--src/mm-sms-list.c26
-rw-r--r--src/mm-sms-list.h1
10 files changed, 216 insertions, 165 deletions
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,