aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mm-broadband-modem.c6
-rw-r--r--src/mm-iface-modem-messaging.c4
-rw-r--r--src/mm-iface-modem-messaging.h2
-rw-r--r--src/mm-sms-list.c87
-rw-r--r--src/mm-sms-list.h2
-rw-r--r--src/mm-sms.c22
6 files changed, 67 insertions, 56 deletions
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c
index 5df730ed..90696d8f 100644
--- a/src/mm-broadband-modem.c
+++ b/src/mm-broadband-modem.c
@@ -3675,7 +3675,7 @@ sms_part_ready (MMBroadbandModem *self,
mm_dbg ("Correctly parsed PDU (%d)", ctx->idx);
mm_iface_modem_messaging_take_part (MM_IFACE_MODEM_MESSAGING (self),
part,
- TRUE);
+ MM_SMS_STATE_RECEIVED);
} else {
/* Don't treat the error as critical */
mm_dbg ("Error parsing PDU (%d): %s", ctx->idx, error->message);
@@ -3932,7 +3932,7 @@ sms_text_part_list_ready (MMBroadbandModem *self,
mm_dbg ("Correctly parsed SMS list entry (%d)", idx);
mm_iface_modem_messaging_take_part (MM_IFACE_MODEM_MESSAGING (self),
part,
- FALSE);
+ MM_SMS_STATE_STORED);
next:
g_match_info_next (match_info, NULL);
}
@@ -3993,7 +3993,7 @@ sms_pdu_part_list_ready (MMBroadbandModem *self,
mm_dbg ("Correctly parsed PDU (%d)", idx);
mm_iface_modem_messaging_take_part (MM_IFACE_MODEM_MESSAGING (self),
part,
- FALSE);
+ MM_SMS_STATE_STORED);
} else {
/* Don't treat the error as critical */
mm_dbg ("Error parsing PDU (%d): %s", idx, error->message);
diff --git a/src/mm-iface-modem-messaging.c b/src/mm-iface-modem-messaging.c
index b13e1520..68f87497 100644
--- a/src/mm-iface-modem-messaging.c
+++ b/src/mm-iface-modem-messaging.c
@@ -228,7 +228,7 @@ handle_list (MmGdbusModemMessaging *skeleton,
gboolean
mm_iface_modem_messaging_take_part (MMIfaceModemMessaging *self,
MMSmsPart *sms_part,
- gboolean received)
+ MMSmsState state)
{
MMSmsList *list = NULL;
GError *error = NULL;
@@ -238,7 +238,7 @@ mm_iface_modem_messaging_take_part (MMIfaceModemMessaging *self,
MM_IFACE_MODEM_MESSAGING_SMS_LIST, &list,
NULL);
g_assert (list != NULL);
- added = mm_sms_list_take_part (list, sms_part, received, &error);
+ added = mm_sms_list_take_part (list, sms_part, state, &error);
if (!added) {
mm_dbg ("Couldn't take part in SMS list: '%s'", error->message);
g_error_free (error);
diff --git a/src/mm-iface-modem-messaging.h b/src/mm-iface-modem-messaging.h
index 8a09deb9..20890117 100644
--- a/src/mm-iface-modem-messaging.h
+++ b/src/mm-iface-modem-messaging.h
@@ -118,6 +118,6 @@ void mm_iface_modem_messaging_bind_simple_status (MMIfaceModemMessaging *self,
/* Report new SMS part */
gboolean mm_iface_modem_messaging_take_part (MMIfaceModemMessaging *self,
MMSmsPart *sms_part,
- gboolean received);
+ MMSmsState state);
#endif /* MM_IFACE_MODEM_MESSAGING_H */
diff --git a/src/mm-sms-list.c b/src/mm-sms-list.c
index 44b41668..d0b0b23d 100644
--- a/src/mm-sms-list.c
+++ b/src/mm-sms-list.c
@@ -194,36 +194,32 @@ cmp_sms_by_part_index (MMSms *sms,
return !mm_sms_has_part_index (sms, GPOINTER_TO_UINT (user_data));
}
-static void
+static gboolean
take_singlepart (MMSmsList *self,
MMSmsPart *part,
- gboolean received)
+ MMSmsState state,
+ GError **error)
{
MMSms *sms;
- GError *error = NULL;
sms = mm_sms_singlepart_new (self->priv->modem,
- (received ?
- MM_SMS_STATE_RECEIVED :
- MM_SMS_STATE_STORED),
+ state,
part,
- &error);
-
- if (!sms) {
- mm_warn ("Couldn't create single-part SMS: '%s'", error->message);
- g_error_free (error);
- } else {
- self->priv->list = g_list_prepend (self->priv->list, sms);
- g_signal_emit (self, signals[SIGNAL_ADDED], 0,
- mm_sms_get_path (sms),
- received);
- }
+ error);
+ if (!sms)
+ return FALSE;
+
+ self->priv->list = g_list_prepend (self->priv->list, sms);
+ g_signal_emit (self, signals[SIGNAL_ADDED], 0,
+ mm_sms_get_path (sms),
+ state == MM_SMS_STATE_RECEIVED);
+ return TRUE;
}
static gboolean
take_multipart (MMSmsList *self,
MMSmsPart *part,
- gboolean received,
+ MMSmsState state,
GError **error)
{
GList *l;
@@ -234,32 +230,32 @@ take_multipart (MMSmsList *self,
l = g_list_find_custom (self->priv->list,
GUINT_TO_POINTER (concat_reference),
(GCompareFunc)cmp_sms_by_concat_reference);
- if (l) {
- sms = MM_SMS (l->data);
+ if (l)
/* Try to take the part */
- if (!mm_sms_multipart_take_part (sms, part, error))
- return FALSE;
- } else {
- /* Create new Multipart */
- sms = mm_sms_multipart_new (self->priv->modem,
- (received ?
- MM_SMS_STATE_RECEIVED :
- MM_SMS_STATE_STORED),
- concat_reference,
- mm_sms_part_get_concat_max (part),
- part,
- error);
- if (!sms)
- return FALSE;
-
- self->priv->list = g_list_prepend (self->priv->list, sms);
- }
+ return mm_sms_multipart_take_part (MM_SMS (l->data), part, error);
+
+ /* Create new Multipart */
+ sms = mm_sms_multipart_new (self->priv->modem,
+ state,
+ concat_reference,
+ mm_sms_part_get_concat_max (part),
+ part,
+ error);
+ if (!sms)
+ return FALSE;
- /* Check if completed and assembled */
- if (mm_sms_multipart_is_complete (sms) &&
- mm_sms_multipart_is_assembled (sms))
- g_signal_emit (self, signals[SIGNAL_ADDED], 0,
- mm_sms_get_path (sms));
+ /* We do export uncomplete 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.*/
+ mm_sms_export (sms);
+
+ self->priv->list = g_list_prepend (self->priv->list, sms);
+ g_signal_emit (self, signals[SIGNAL_ADDED], 0,
+ mm_sms_get_path (sms),
+ (state == MM_SMS_STATE_RECEIVED ||
+ state == MM_SMS_STATE_RECEIVING));
return TRUE;
}
@@ -267,7 +263,7 @@ take_multipart (MMSmsList *self,
gboolean
mm_sms_list_take_part (MMSmsList *self,
MMSmsPart *part,
- gboolean received,
+ MMSmsState state,
GError **error)
{
/* Ensure we don't have already taken a part with the same index */
@@ -284,11 +280,10 @@ mm_sms_list_take_part (MMSmsList *self,
/* Did we just get a part of a multi-part SMS? */
if (mm_sms_part_should_concat (part))
- return take_multipart (self, part, received, error);
+ return take_multipart (self, part, state, error);
/* Otherwise, we build a whole new single-part MMSms just from this part */
- take_singlepart (self, part, received);
- return TRUE;
+ return take_singlepart (self, part, state, error);
}
/*****************************************************************************/
diff --git a/src/mm-sms-list.h b/src/mm-sms-list.h
index 609f1173..239ed657 100644
--- a/src/mm-sms-list.h
+++ b/src/mm-sms-list.h
@@ -63,7 +63,7 @@ guint mm_sms_list_get_count (MMSmsList *self);
gboolean mm_sms_list_take_part (MMSmsList *self,
MMSmsPart *part,
- gboolean received,
+ MMSmsState state,
GError **error);
void mm_sms_list_add_sms (MMSmsList *self,
diff --git a/src/mm-sms.c b/src/mm-sms.c
index 54fa4dbd..88a9ad3d 100644
--- a/src/mm-sms.c
+++ b/src/mm-sms.c
@@ -562,9 +562,20 @@ mm_sms_multipart_take_part (MMSms *self,
mm_warn ("Couldn't assemble SMS: '%s'",
inner_error->message);
g_error_free (inner_error);
- } else
- /* Only export once properly assembled */
- mm_sms_export (self);
+ } else {
+ /* Completed AND assembled */
+ MMSmsState state = MM_SMS_STATE_UNKNOWN;
+
+ /* Change state RECEIVING->RECEIVED, and signal completeness */
+ g_object_get (self,
+ "state", &state,
+ NULL);
+ if (state == MM_SMS_STATE_RECEIVING) {
+ g_object_set (self,
+ "state", MM_SMS_STATE_RECEIVED,
+ NULL);
+ }
+ }
}
return TRUE;
@@ -613,6 +624,11 @@ mm_sms_multipart_new (MMBaseModem *modem,
{
MMSms *self;
+ /* 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;
+
self = mm_sms_new (modem);
g_object_set (self,
MM_SMS_IS_MULTIPART, TRUE,