aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2012-02-09 12:48:00 +0100
committerAleksander Morgado <aleksander@lanedo.com>2012-03-15 14:15:02 +0100
commit714e4ca44b2dc4d877e28d01e9f402fa0d9066a7 (patch)
tree3d6396dd49ba8ecb363fb87fe4773e2389245e97
parent186584f26f1aa6699ddc970fa6b85f60a27d1820 (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.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,