aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--introspection/org.freedesktop.ModemManager1.Sms.xml7
-rw-r--r--libmm-common/mm-sms-properties.c78
-rw-r--r--libmm-common/mm-sms-properties.h51
-rw-r--r--src/mm-sms-part.c17
-rw-r--r--src/mm-sms-part.h4
-rw-r--r--src/mm-sms.c4
6 files changed, 128 insertions, 33 deletions
diff --git a/introspection/org.freedesktop.ModemManager1.Sms.xml b/introspection/org.freedesktop.ModemManager1.Sms.xml
index dd3f18f8..1992edcf 100644
--- a/introspection/org.freedesktop.ModemManager1.Sms.xml
+++ b/introspection/org.freedesktop.ModemManager1.Sms.xml
@@ -103,6 +103,13 @@
<property name="Class" type="u" access="readwrite" />
<!--
+ DeliveryReportRequest:
+
+ #TRUE if delivery report request is required, #FALSE otherwise.
+ -->
+ <property name="DeliveryReportRequest" type="b" access="readwrite" />
+
+ <!--
Timestamp:
Time message was received or was sent, in
diff --git a/libmm-common/mm-sms-properties.c b/libmm-common/mm-sms-properties.c
index 3dd29933..3d619220 100644
--- a/libmm-common/mm-sms-properties.c
+++ b/libmm-common/mm-sms-properties.c
@@ -23,12 +23,13 @@
G_DEFINE_TYPE (MMSmsProperties, mm_sms_properties, G_TYPE_OBJECT);
-#define PROPERTY_TEXT "text"
-#define PROPERTY_DATA "data"
-#define PROPERTY_NUMBER "number"
-#define PROPERTY_SMSC "smsc"
-#define PROPERTY_VALIDITY "validity"
-#define PROPERTY_CLASS "class"
+#define PROPERTY_TEXT "text"
+#define PROPERTY_DATA "data"
+#define PROPERTY_NUMBER "number"
+#define PROPERTY_SMSC "smsc"
+#define PROPERTY_VALIDITY "validity"
+#define PROPERTY_CLASS "class"
+#define PROPERTY_DELIVERY_REPORT_REQUEST "delivery-report-request"
struct _MMSmsPropertiesPrivate {
gchar *text;
@@ -39,6 +40,8 @@ struct _MMSmsPropertiesPrivate {
guint validity;
gboolean class_set;
guint class;
+ gboolean delivery_report_request_set;
+ gboolean delivery_report_request;
};
/*****************************************************************************/
@@ -123,6 +126,16 @@ mm_sms_properties_set_class (MMSmsProperties *self,
self->priv->class = class;
}
+void
+mm_sms_properties_set_delivery_report_request (MMSmsProperties *self,
+ gboolean request)
+{
+ g_return_if_fail (MM_IS_SMS_PROPERTIES (self));
+
+ self->priv->delivery_report_request_set = TRUE;
+ self->priv->delivery_report_request = request;
+}
+
/*****************************************************************************/
const gchar *
@@ -193,6 +206,14 @@ mm_sms_properties_get_class (MMSmsProperties *self)
return self->priv->class;
}
+gboolean
+mm_sms_properties_get_delivery_report_request (MMSmsProperties *self)
+{
+ g_return_val_if_fail (MM_IS_SMS_PROPERTIES (self), FALSE);
+
+ return self->priv->delivery_report_request;
+}
+
/*****************************************************************************/
GVariant *
@@ -250,6 +271,12 @@ mm_sms_properties_get_dictionary (MMSmsProperties *self)
PROPERTY_CLASS,
g_variant_new_uint32 (self->priv->class));
+ if (self->priv->delivery_report_request_set)
+ g_variant_builder_add (&builder,
+ "{sv}",
+ PROPERTY_DELIVERY_REPORT_REQUEST,
+ g_variant_new_boolean (self->priv->delivery_report_request));
+
return g_variant_ref_sink (g_variant_builder_end (&builder));
}
@@ -275,6 +302,28 @@ parse_uint (const gchar *str,
}
static gboolean
+parse_boolean (const gchar *str,
+ GError **error)
+{
+ if (g_ascii_strcasecmp (str, "yes") == 0 ||
+ g_ascii_strcasecmp (str, "true") == 0 ||
+ g_str_equal (str, "1"))
+ return TRUE;
+
+ if (g_ascii_strcasecmp (str, "no") == 0 ||
+ g_ascii_strcasecmp (str, "false") == 0 ||
+ g_str_equal (str, "0"))
+ return FALSE;
+
+ g_set_error (error,
+ MM_CORE_ERROR,
+ MM_CORE_ERROR_INVALID_ARGS,
+ "Invalid properties string, cannot parse '%s' as boolean",
+ str);
+ return FALSE;
+}
+
+static gboolean
consume_string (MMSmsProperties *self,
const gchar *key,
const gchar *value,
@@ -308,7 +357,18 @@ consume_string (MMSmsProperties *self,
}
mm_sms_properties_set_class (self, n);
- } else if (g_str_equal (key, PROPERTY_DATA)) {
+ } else if (g_str_equal (key, PROPERTY_DELIVERY_REPORT_REQUEST)) {
+ GError *inner_error = NULL;
+ gboolean request;
+
+ request = parse_boolean (value, &inner_error);
+ if (inner_error) {
+ g_propagate_error (error, inner_error);
+ return FALSE;
+ }
+
+ mm_sms_properties_set_delivery_report_request (self, request);
+ } else if (g_str_equal (key, PROPERTY_DATA)) {
g_set_error (error,
MM_CORE_ERROR,
MM_CORE_ERROR_INVALID_ARGS,
@@ -404,6 +464,10 @@ consume_variant (MMSmsProperties *properties,
mm_sms_properties_set_class (
properties,
g_variant_get_uint32 (value));
+ else if (g_str_equal (key, PROPERTY_DELIVERY_REPORT_REQUEST))
+ mm_sms_properties_set_delivery_report_request (
+ properties,
+ g_variant_get_boolean (value));
else {
/* Set error */
g_set_error (error,
diff --git a/libmm-common/mm-sms-properties.h b/libmm-common/mm-sms-properties.h
index 7996ee6e..dc944162 100644
--- a/libmm-common/mm-sms-properties.h
+++ b/libmm-common/mm-sms-properties.h
@@ -51,31 +51,34 @@ MMSmsProperties *mm_sms_properties_new_from_dictionary (GVariant *dictionary,
MMSmsProperties *mm_sms_properties_dup (MMSmsProperties *orig);
-void mm_sms_properties_set_text (MMSmsProperties *self,
- const gchar *text);
-void mm_sms_properties_set_data (MMSmsProperties *self,
- const guint8 *data,
- gsize data_length);
-void mm_sms_properties_set_data_bytearray (MMSmsProperties *self,
- GByteArray *data);
-void mm_sms_properties_set_number (MMSmsProperties *self,
- const gchar *number);
-void mm_sms_properties_set_smsc (MMSmsProperties *self,
- const gchar *smsc);
-void mm_sms_properties_set_validity (MMSmsProperties *self,
- guint validity);
-void mm_sms_properties_set_class (MMSmsProperties *self,
- guint class);
+void mm_sms_properties_set_text (MMSmsProperties *self,
+ const gchar *text);
+void mm_sms_properties_set_data (MMSmsProperties *self,
+ const guint8 *data,
+ gsize data_length);
+void mm_sms_properties_set_data_bytearray (MMSmsProperties *self,
+ GByteArray *data);
+void mm_sms_properties_set_number (MMSmsProperties *self,
+ const gchar *number);
+void mm_sms_properties_set_smsc (MMSmsProperties *self,
+ const gchar *smsc);
+void mm_sms_properties_set_validity (MMSmsProperties *self,
+ guint validity);
+void mm_sms_properties_set_class (MMSmsProperties *self,
+ guint class);
+void mm_sms_properties_set_delivery_report_request (MMSmsProperties *self,
+ gboolean request);
-const gchar *mm_sms_properties_get_text (MMSmsProperties *self);
-const guint8 *mm_sms_properties_get_data (MMSmsProperties *self,
- gsize *data_len);
-GByteArray *mm_sms_properties_peek_data_bytearray (MMSmsProperties *self);
-GByteArray *mm_sms_properties_get_data_bytearray (MMSmsProperties *self);
-const gchar *mm_sms_properties_get_number (MMSmsProperties *self);
-const gchar *mm_sms_properties_get_smsc (MMSmsProperties *self);
-guint mm_sms_properties_get_validity (MMSmsProperties *self);
-guint mm_sms_properties_get_class (MMSmsProperties *self);
+const gchar *mm_sms_properties_get_text (MMSmsProperties *self);
+const guint8 *mm_sms_properties_get_data (MMSmsProperties *self,
+ gsize *data_len);
+GByteArray *mm_sms_properties_peek_data_bytearray (MMSmsProperties *self);
+GByteArray *mm_sms_properties_get_data_bytearray (MMSmsProperties *self);
+const gchar *mm_sms_properties_get_number (MMSmsProperties *self);
+const gchar *mm_sms_properties_get_smsc (MMSmsProperties *self);
+guint mm_sms_properties_get_validity (MMSmsProperties *self);
+guint mm_sms_properties_get_class (MMSmsProperties *self);
+gboolean mm_sms_properties_get_delivery_report_request (MMSmsProperties *self);
GVariant *mm_sms_properties_get_dictionary (MMSmsProperties *self);
diff --git a/src/mm-sms-part.c b/src/mm-sms-part.c
index 62debf59..f0b36ce4 100644
--- a/src/mm-sms-part.c
+++ b/src/mm-sms-part.c
@@ -269,6 +269,7 @@ struct _MMSmsPart {
guint data_coding_scheme;
guint class;
guint validity;
+ gboolean delivery_report_request;
gboolean should_concat;
guint concat_reference;
@@ -342,6 +343,8 @@ PART_GET_FUNC (guint, class)
PART_SET_FUNC (guint, class)
PART_GET_FUNC (guint, validity)
PART_SET_FUNC (guint, validity)
+PART_GET_FUNC (gboolean, delivery_report_request)
+PART_SET_FUNC (gboolean, delivery_report_request)
PART_GET_FUNC (guint, concat_reference)
@@ -759,8 +762,18 @@ mm_sms_part_get_submit_pdu (MMSmsPart *part,
pdu[offset] |= 0x40; /* UDHI */
}
- /* TODO: Request status only in last part */
- pdu[offset++] |= 0x01; /* TP-MTI = SMS-SUBMIT */
+ /* Delivery report requested in singlepart messages or in the last PDU of
+ * multipart messages */
+ if (part->delivery_report_request &&
+ (!part->concat_sequence ||
+ part->concat_max == part->concat_sequence)) {
+ mm_dbg (" requesting delivery report...");
+ pdu[offset] |= 0x20;
+ }
+
+ /* TP-MTI = SMS-SUBMIT */
+ pdu[offset++] |= 0x01;
+
/* ----------- TP-MR (1 byte) ----------- */
diff --git a/src/mm-sms-part.h b/src/mm-sms-part.h
index 27b73914..7fbbc411 100644
--- a/src/mm-sms-part.h
+++ b/src/mm-sms-part.h
@@ -96,6 +96,10 @@ guint mm_sms_part_get_validity (MMSmsPart *part);
void mm_sms_part_set_validity (MMSmsPart *part,
guint validity);
+gboolean mm_sms_part_get_delivery_report_request (MMSmsPart *part);
+void mm_sms_part_set_delivery_report_request (MMSmsPart *part,
+ gboolean delivery_report_request);
+
guint mm_sms_part_get_concat_reference (MMSmsPart *part);
void mm_sms_part_set_concat_reference (MMSmsPart *part,
guint concat_reference);
diff --git a/src/mm-sms.c b/src/mm-sms.c
index ae7df500..c18f167c 100644
--- a/src/mm-sms.c
+++ b/src/mm-sms.c
@@ -1183,6 +1183,8 @@ assemble_sms (MMSms *self,
"number", mm_sms_part_get_number (sorted_parts[0]),
"timestamp", mm_sms_part_get_timestamp (sorted_parts[0]),
"validity", mm_sms_part_get_validity (sorted_parts[0]),
+ /* delivery report request usually set in the last part only */
+ "delivery-report-request", mm_sms_part_get_delivery_report_request (sorted_parts[self->priv->max_parts - 1]),
NULL);
g_string_free (fulltext, TRUE);
@@ -1397,6 +1399,7 @@ mm_sms_new_from_properties (MMBaseModem *modem,
mm_sms_part_set_smsc (part, mm_sms_properties_get_smsc (properties));
mm_sms_part_set_validity (part, mm_sms_properties_get_validity (properties));
mm_sms_part_set_class (part, mm_sms_properties_get_class (properties));
+ mm_sms_part_set_delivery_report_request (part, mm_sms_properties_get_delivery_report_request (properties));
mm_sms_part_set_concat_reference (part, reference);
mm_sms_part_set_concat_sequence (part, i + 1);
mm_sms_part_set_concat_max (part, n_parts);
@@ -1437,6 +1440,7 @@ mm_sms_new_from_properties (MMBaseModem *modem,
mm_sms_part_set_smsc (part, mm_sms_properties_get_smsc (properties));
mm_sms_part_set_validity (part, mm_sms_properties_get_validity (properties));
mm_sms_part_set_class (part, mm_sms_properties_get_class (properties));
+ mm_sms_part_set_delivery_report_request (part, mm_sms_properties_get_delivery_report_request (properties));
return mm_sms_singlepart_new (modem,
MM_SMS_STATE_UNKNOWN,