aboutsummaryrefslogtreecommitdiff
path: root/src/mm-broadband-modem.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mm-broadband-modem.c')
-rw-r--r--src/mm-broadband-modem.c190
1 files changed, 116 insertions, 74 deletions
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c
index 16d579c7..f164be01 100644
--- a/src/mm-broadband-modem.c
+++ b/src/mm-broadband-modem.c
@@ -52,6 +52,7 @@
#include "mm-cbm-part.h"
#include "mm-sms-list.h"
#include "mm-sms-part-3gpp.h"
+#include "mm-sms-at.h"
#include "mm-call-list.h"
#include "mm-base-sim.h"
#include "mm-log-object.h"
@@ -7185,11 +7186,13 @@ modem_messaging_init_current_storages (MMIfaceModemMessaging *self,
* the default one if needed.
*/
-void
-mm_broadband_modem_unlock_sms_storages (MMBroadbandModem *self,
- gboolean mem1,
- gboolean mem2)
+static void
+modem_messaging_unlock_storages (MMIfaceModemMessaging *_self,
+ gboolean mem1,
+ gboolean mem2)
{
+ MMBroadbandModem *self = MM_BROADBAND_MODEM (_self);
+
if (mem1) {
g_assert (self->priv->mem1_storage_locked);
self->priv->mem1_storage_locked = FALSE;
@@ -7201,10 +7204,10 @@ mm_broadband_modem_unlock_sms_storages (MMBroadbandModem *self,
}
}
-gboolean
-mm_broadband_modem_lock_sms_storages_finish (MMBroadbandModem *self,
- GAsyncResult *res,
- GError **error)
+static gboolean
+modem_messaging_lock_storages_finish (MMIfaceModemMessaging *self,
+ GAsyncResult *res,
+ GError **error)
{
return g_task_propagate_boolean (G_TASK (res), error);
}
@@ -7246,13 +7249,14 @@ lock_storages_cpms_set_ready (MMBaseModem *_self,
g_object_unref (task);
}
-void
-mm_broadband_modem_lock_sms_storages (MMBroadbandModem *self,
- MMSmsStorage mem1, /* reading/listing/deleting */
- MMSmsStorage mem2, /* storing/sending */
- GAsyncReadyCallback callback,
- gpointer user_data)
+static void
+modem_messaging_lock_storages (MMIfaceModemMessaging *_self,
+ MMSmsStorage mem1, /* reading/listing/deleting */
+ MMSmsStorage mem2, /* storing/sending */
+ GAsyncReadyCallback callback,
+ gpointer user_data)
{
+ MMBroadbandModem *self = MM_BROADBAND_MODEM (_self);
LockSmsStoragesContext *ctx;
GTask *task;
gchar *cmd = NULL;
@@ -7267,7 +7271,7 @@ mm_broadband_modem_lock_sms_storages (MMBroadbandModem *self,
self,
callback,
user_data,
- mm_broadband_modem_lock_sms_storages,
+ modem_messaging_lock_storages,
MM_CORE_ERROR,
MM_CORE_ERROR_RETRY,
"SMS storage currently locked, try again later");
@@ -7541,13 +7545,13 @@ 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_broadband_modem_unlock_sms_storages (self, TRUE, FALSE);
+ mm_iface_modem_messaging_unlock_storages (MM_IFACE_MODEM_MESSAGING (self), TRUE, FALSE);
response = mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, &error);
if (error) {
@@ -7570,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 */
@@ -7589,15 +7599,15 @@ sms_part_ready (MMBroadbandModem *self,
}
static void
-indication_lock_storages_ready (MMBroadbandModem *self,
- GAsyncResult *res,
- GTask *task)
+indication_lock_storages_ready (MMIfaceModemMessaging *messaging,
+ GAsyncResult *res,
+ GTask *task)
{
SmsPartContext *ctx;
gchar *command;
GError *error = NULL;
- if (!mm_broadband_modem_lock_sms_storages_finish (self, res, &error)) {
+ if (!mm_iface_modem_messaging_lock_storages_finish (messaging, res, &error)) {
/* TODO: we should either make this lock() never fail, by automatically
* retrying after some time, or otherwise retry here. */
g_task_return_error (task, error);
@@ -7610,7 +7620,7 @@ indication_lock_storages_ready (MMBroadbandModem *self,
/* Retrieve the message */
ctx = g_task_get_task_data (task);
command = g_strdup_printf ("+CMGR=%d", ctx->idx);
- mm_base_modem_at_command (MM_BASE_MODEM (self),
+ mm_base_modem_at_command (MM_BASE_MODEM (messaging),
command,
10,
FALSE,
@@ -7658,11 +7668,11 @@ cmti_received (MMPortSerialAt *port,
g_task_set_task_data (task, ctx, g_free);
/* First, request to set the proper storage to read from */
- mm_broadband_modem_lock_sms_storages (self,
- storage,
- MM_SMS_STORAGE_UNKNOWN,
- (GAsyncReadyCallback)indication_lock_storages_ready,
- task);
+ mm_iface_modem_messaging_lock_storages (MM_IFACE_MODEM_MESSAGING (self),
+ storage,
+ MM_SMS_STORAGE_UNKNOWN,
+ (GAsyncReadyCallback)indication_lock_storages_ready,
+ task);
}
static void
@@ -7670,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");
@@ -7685,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);
+ }
}
}
@@ -8078,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);
}
@@ -8120,7 +8140,7 @@ sms_pdu_part_list_ready (MMBroadbandModem *self,
GList *l;
/* Always always always unlock mem1 storage. Warned you've been. */
- mm_broadband_modem_unlock_sms_storages (self, TRUE, FALSE);
+ mm_iface_modem_messaging_unlock_storages (MM_IFACE_MODEM_MESSAGING (self), TRUE, FALSE);
response = mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, &error);
if (error) {
@@ -8143,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);
+ }
}
}
@@ -8164,13 +8190,13 @@ sms_pdu_part_list_ready (MMBroadbandModem *self,
}
static void
-list_parts_lock_storages_ready (MMBroadbandModem *self,
- GAsyncResult *res,
- GTask *task)
+list_parts_lock_storages_ready (MMIfaceModemMessaging *self,
+ GAsyncResult *res,
+ GTask *task)
{
GError *error = NULL;
- if (!mm_broadband_modem_lock_sms_storages_finish (self, res, &error)) {
+ if (!mm_iface_modem_messaging_lock_storages_finish (self, res, &error)) {
/* TODO: we should either make this lock() never fail, by automatically
* retrying after some time, or otherwise retry here. */
g_task_return_error (task, error);
@@ -8212,20 +8238,33 @@ modem_messaging_load_initial_sms_parts (MMIfaceModemMessaging *self,
mm_obj_dbg (self, "listing SMS parts in storage '%s'", mm_sms_storage_get_string (storage));
/* First, request to set the proper storage to read from */
- mm_broadband_modem_lock_sms_storages (MM_BROADBAND_MODEM (self),
- storage,
- MM_SMS_STORAGE_UNKNOWN,
- (GAsyncReadyCallback)list_parts_lock_storages_ready,
- task);
+ mm_iface_modem_messaging_lock_storages (self,
+ storage,
+ MM_SMS_STORAGE_UNKNOWN,
+ (GAsyncReadyCallback)list_parts_lock_storages_ready,
+ task);
}
/*****************************************************************************/
-/* 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_base_sms_new (MM_BASE_MODEM (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)),
+ default_storage);
}
/*****************************************************************************/
@@ -14537,9 +14576,11 @@ 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;
+ iface->lock_storages_finish = modem_messaging_lock_storages_finish;
+ iface->unlock_storages = modem_messaging_unlock_storages;
}
static void
@@ -14656,6 +14697,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,