diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2012-09-10 20:13:00 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-09-14 07:05:24 +0200 |
commit | 1c119be83492dac56f8d2ea5bd6b8717ccda1ae6 (patch) | |
tree | 4d7b1cefbb8c79b3d4a14c94ce6eac0cb5ed7063 | |
parent | b42b5795e33e052e7dacc4731af89fde44f56ff5 (diff) |
api: new `Sms.DeliveryReportRequest' property
Also allowing the 'delivery-report-request' key in the `Messaging.CreateSms()'
method.
-rw-r--r-- | introspection/org.freedesktop.ModemManager1.Sms.xml | 7 | ||||
-rw-r--r-- | libmm-common/mm-sms-properties.c | 78 | ||||
-rw-r--r-- | libmm-common/mm-sms-properties.h | 51 | ||||
-rw-r--r-- | src/mm-sms-part.c | 17 | ||||
-rw-r--r-- | src/mm-sms-part.h | 4 | ||||
-rw-r--r-- | src/mm-sms.c | 4 |
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, |