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.
This commit is contained in:
Aleksander Morgado
2012-02-09 12:48:00 +01:00
parent 186584f26f
commit 714e4ca44b
6 changed files with 65 additions and 54 deletions

View File

@@ -3675,7 +3675,7 @@ sms_part_ready (MMBroadbandModem *self,
mm_dbg ("Correctly parsed PDU (%d)", ctx->idx); mm_dbg ("Correctly parsed PDU (%d)", ctx->idx);
mm_iface_modem_messaging_take_part (MM_IFACE_MODEM_MESSAGING (self), mm_iface_modem_messaging_take_part (MM_IFACE_MODEM_MESSAGING (self),
part, part,
TRUE); MM_SMS_STATE_RECEIVED);
} else { } else {
/* Don't treat the error as critical */ /* Don't treat the error as critical */
mm_dbg ("Error parsing PDU (%d): %s", ctx->idx, error->message); 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_dbg ("Correctly parsed SMS list entry (%d)", idx);
mm_iface_modem_messaging_take_part (MM_IFACE_MODEM_MESSAGING (self), mm_iface_modem_messaging_take_part (MM_IFACE_MODEM_MESSAGING (self),
part, part,
FALSE); MM_SMS_STATE_STORED);
next: next:
g_match_info_next (match_info, NULL); 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_dbg ("Correctly parsed PDU (%d)", idx);
mm_iface_modem_messaging_take_part (MM_IFACE_MODEM_MESSAGING (self), mm_iface_modem_messaging_take_part (MM_IFACE_MODEM_MESSAGING (self),
part, part,
FALSE); MM_SMS_STATE_STORED);
} else { } else {
/* Don't treat the error as critical */ /* Don't treat the error as critical */
mm_dbg ("Error parsing PDU (%d): %s", idx, error->message); mm_dbg ("Error parsing PDU (%d): %s", idx, error->message);

View File

@@ -228,7 +228,7 @@ handle_list (MmGdbusModemMessaging *skeleton,
gboolean gboolean
mm_iface_modem_messaging_take_part (MMIfaceModemMessaging *self, mm_iface_modem_messaging_take_part (MMIfaceModemMessaging *self,
MMSmsPart *sms_part, MMSmsPart *sms_part,
gboolean received) MMSmsState state)
{ {
MMSmsList *list = NULL; MMSmsList *list = NULL;
GError *error = NULL; GError *error = NULL;
@@ -238,7 +238,7 @@ mm_iface_modem_messaging_take_part (MMIfaceModemMessaging *self,
MM_IFACE_MODEM_MESSAGING_SMS_LIST, &list, MM_IFACE_MODEM_MESSAGING_SMS_LIST, &list,
NULL); NULL);
g_assert (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) { if (!added) {
mm_dbg ("Couldn't take part in SMS list: '%s'", error->message); mm_dbg ("Couldn't take part in SMS list: '%s'", error->message);
g_error_free (error); g_error_free (error);

View File

@@ -118,6 +118,6 @@ void mm_iface_modem_messaging_bind_simple_status (MMIfaceModemMessaging *self,
/* Report new SMS part */ /* Report new SMS part */
gboolean mm_iface_modem_messaging_take_part (MMIfaceModemMessaging *self, gboolean mm_iface_modem_messaging_take_part (MMIfaceModemMessaging *self,
MMSmsPart *sms_part, MMSmsPart *sms_part,
gboolean received); MMSmsState state);
#endif /* MM_IFACE_MODEM_MESSAGING_H */ #endif /* MM_IFACE_MODEM_MESSAGING_H */

View File

@@ -194,36 +194,32 @@ cmp_sms_by_part_index (MMSms *sms,
return !mm_sms_has_part_index (sms, GPOINTER_TO_UINT (user_data)); return !mm_sms_has_part_index (sms, GPOINTER_TO_UINT (user_data));
} }
static void static gboolean
take_singlepart (MMSmsList *self, take_singlepart (MMSmsList *self,
MMSmsPart *part, MMSmsPart *part,
gboolean received) MMSmsState state,
GError **error)
{ {
MMSms *sms; MMSms *sms;
GError *error = NULL;
sms = mm_sms_singlepart_new (self->priv->modem, sms = mm_sms_singlepart_new (self->priv->modem,
(received ? state,
MM_SMS_STATE_RECEIVED :
MM_SMS_STATE_STORED),
part, part,
&error); error);
if (!sms)
return FALSE;
if (!sms) { self->priv->list = g_list_prepend (self->priv->list, sms);
mm_warn ("Couldn't create single-part SMS: '%s'", error->message); g_signal_emit (self, signals[SIGNAL_ADDED], 0,
g_error_free (error); mm_sms_get_path (sms),
} else { state == MM_SMS_STATE_RECEIVED);
self->priv->list = g_list_prepend (self->priv->list, sms); return TRUE;
g_signal_emit (self, signals[SIGNAL_ADDED], 0,
mm_sms_get_path (sms),
received);
}
} }
static gboolean static gboolean
take_multipart (MMSmsList *self, take_multipart (MMSmsList *self,
MMSmsPart *part, MMSmsPart *part,
gboolean received, MMSmsState state,
GError **error) GError **error)
{ {
GList *l; GList *l;
@@ -234,32 +230,32 @@ take_multipart (MMSmsList *self,
l = g_list_find_custom (self->priv->list, l = g_list_find_custom (self->priv->list,
GUINT_TO_POINTER (concat_reference), GUINT_TO_POINTER (concat_reference),
(GCompareFunc)cmp_sms_by_concat_reference); (GCompareFunc)cmp_sms_by_concat_reference);
if (l) { if (l)
sms = MM_SMS (l->data);
/* Try to take the part */ /* Try to take the part */
if (!mm_sms_multipart_take_part (sms, part, error)) return mm_sms_multipart_take_part (MM_SMS (l->data), 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); /* 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 */ /* We do export uncomplete multipart messages, in order to be able to
if (mm_sms_multipart_is_complete (sms) && * request removal of all parts of those multipart SMS that will never
mm_sms_multipart_is_assembled (sms)) * get completed.
g_signal_emit (self, signals[SIGNAL_ADDED], 0, * Only the STATE of the SMS object will be valid in the exported DBus
mm_sms_get_path (sms)); * 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; return TRUE;
} }
@@ -267,7 +263,7 @@ take_multipart (MMSmsList *self,
gboolean gboolean
mm_sms_list_take_part (MMSmsList *self, mm_sms_list_take_part (MMSmsList *self,
MMSmsPart *part, MMSmsPart *part,
gboolean received, MMSmsState state,
GError **error) GError **error)
{ {
/* Ensure we don't have already taken a part with the same index */ /* 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? */ /* Did we just get a part of a multi-part SMS? */
if (mm_sms_part_should_concat (part)) 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 */ /* Otherwise, we build a whole new single-part MMSms just from this part */
take_singlepart (self, part, received); return take_singlepart (self, part, state, error);
return TRUE;
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@@ -63,7 +63,7 @@ guint mm_sms_list_get_count (MMSmsList *self);
gboolean mm_sms_list_take_part (MMSmsList *self, gboolean mm_sms_list_take_part (MMSmsList *self,
MMSmsPart *part, MMSmsPart *part,
gboolean received, MMSmsState state,
GError **error); GError **error);
void mm_sms_list_add_sms (MMSmsList *self, void mm_sms_list_add_sms (MMSmsList *self,

View File

@@ -562,9 +562,20 @@ mm_sms_multipart_take_part (MMSms *self,
mm_warn ("Couldn't assemble SMS: '%s'", mm_warn ("Couldn't assemble SMS: '%s'",
inner_error->message); inner_error->message);
g_error_free (inner_error); g_error_free (inner_error);
} else } else {
/* Only export once properly assembled */ /* Completed AND assembled */
mm_sms_export (self); 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; return TRUE;
@@ -613,6 +624,11 @@ mm_sms_multipart_new (MMBaseModem *modem,
{ {
MMSms *self; 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); self = mm_sms_new (modem);
g_object_set (self, g_object_set (self,
MM_SMS_IS_MULTIPART, TRUE, MM_SMS_IS_MULTIPART, TRUE,