diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2012-02-09 12:48:00 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-03-15 14:15:02 +0100 |
commit | 714e4ca44b2dc4d877e28d01e9f402fa0d9066a7 (patch) | |
tree | 3d6396dd49ba8ecb363fb87fe4773e2389245e97 | |
parent | 186584f26f1aa6699ddc970fa6b85f60a27d1820 (diff) |
sms: export uncomplete multipart messages as well
Uncompleted multipart SMS will be exported to DBus, where only the "state"
property is valid, so that we allow completely removing those uncompleted
multipart SMS which will never get completed due to one reason or another.
-rw-r--r-- | src/mm-broadband-modem.c | 6 | ||||
-rw-r--r-- | src/mm-iface-modem-messaging.c | 4 | ||||
-rw-r--r-- | src/mm-iface-modem-messaging.h | 2 | ||||
-rw-r--r-- | src/mm-sms-list.c | 87 | ||||
-rw-r--r-- | src/mm-sms-list.h | 2 | ||||
-rw-r--r-- | src/mm-sms.c | 22 |
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, |