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:
@@ -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);
|
||||
|
@@ -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);
|
||||
|
@@ -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 */
|
||||
|
@@ -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);
|
||||
error);
|
||||
if (!sms)
|
||||
return FALSE;
|
||||
|
||||
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);
|
||||
}
|
||||
state == MM_SMS_STATE_RECEIVED);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
take_multipart (MMSmsList *self,
|
||||
MMSmsPart *part,
|
||||
gboolean received,
|
||||
MMSmsState state,
|
||||
GError **error)
|
||||
{
|
||||
GList *l;
|
||||
@@ -234,17 +230,13 @@ 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 {
|
||||
return mm_sms_multipart_take_part (MM_SMS (l->data), part, error);
|
||||
|
||||
/* Create new Multipart */
|
||||
sms = mm_sms_multipart_new (self->priv->modem,
|
||||
(received ?
|
||||
MM_SMS_STATE_RECEIVED :
|
||||
MM_SMS_STATE_STORED),
|
||||
state,
|
||||
concat_reference,
|
||||
mm_sms_part_get_concat_max (part),
|
||||
part,
|
||||
@@ -252,14 +244,18 @@ take_multipart (MMSmsList *self,
|
||||
if (!sms)
|
||||
return FALSE;
|
||||
|
||||
self->priv->list = g_list_prepend (self->priv->list, 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);
|
||||
|
||||
/* Check if completed and assembled */
|
||||
if (mm_sms_multipart_is_complete (sms) &&
|
||||
mm_sms_multipart_is_assembled (sms))
|
||||
self->priv->list = g_list_prepend (self->priv->list, sms);
|
||||
g_signal_emit (self, signals[SIGNAL_ADDED], 0,
|
||||
mm_sms_get_path (sms));
|
||||
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);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@@ -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,
|
||||
|
22
src/mm-sms.c
22
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,
|
||||
|
Reference in New Issue
Block a user