aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/reference/api/ModemManager-sections.txt1
-rw-r--r--include/ModemManager-enums.h71
-rw-r--r--introspection/org.freedesktop.ModemManager1.Sms.xml11
-rw-r--r--libmm-common/mm-common-helpers.c44
-rw-r--r--libmm-common/mm-common-helpers.h2
-rw-r--r--src/mm-sms-part.c9
-rw-r--r--src/mm-sms-part.h4
-rw-r--r--src/mm-sms.c1
8 files changed, 142 insertions, 1 deletions
diff --git a/docs/reference/api/ModemManager-sections.txt b/docs/reference/api/ModemManager-sections.txt
index cfbabcfd..26c708f4 100644
--- a/docs/reference/api/ModemManager-sections.txt
+++ b/docs/reference/api/ModemManager-sections.txt
@@ -21,6 +21,7 @@ MMModemState
MMModemStateChangeReason
MMSmsPduType
MMSmsState
+MMSmsDeliveryState
MMSmsStorage
</SECTION>
diff --git a/include/ModemManager-enums.h b/include/ModemManager-enums.h
index 75693823..16fcb70e 100644
--- a/include/ModemManager-enums.h
+++ b/include/ModemManager-enums.h
@@ -391,6 +391,77 @@ typedef enum { /*< underscore_name=mm_sms_state >*/
} MMSmsState;
/**
+ * MMSmsDeliveryState:
+ * @MM_SMS_DELIVERY_STATE_COMPLETED_RECEIVED: Delivery completed, message received by the SME.
+ * @MM_SMS_DELIVERY_STATE_COMPLETED_FORWARDED_UNCONFIRMED: Forwarded by the SC to the SME but the SC is unable to confirm delivery.
+ * @MM_SMS_DELIVERY_STATE_COMPLETED_REPLACED_BY_SC: Message replaced by the SC.
+ * @MM_SMS_DELIVERY_STATE_TEMPORARY_ERROR_CONGESTION: Temporary error, congestion.
+ * @MM_SMS_DELIVERY_STATE_TEMPORARY_ERROR_SME_BUSY: Temporary error, SME busy.
+ * @MM_SMS_DELIVERY_STATE_TEMPORARY_ERROR_NO_RESPONSE_FROM_SME: Temporary error, no response from the SME.
+ * @MM_SMS_DELIVERY_STATE_TEMPORARY_ERROR_SERVICE_REJECTED: Temporary error, service rejected.
+ * @MM_SMS_DELIVERY_STATE_TEMPORARY_ERROR_QOS_NOT_AVAILABLE: Temporary error, QoS not available.
+ * @MM_SMS_DELIVERY_STATE_TEMPORARY_ERROR_IN_SME: Temporary error in the SME.
+ * @MM_SMS_DELIVERY_STATE_ERROR_REMOTE_PROCEDURE: Permanent remote procedure error.
+ * @MM_SMS_DELIVERY_STATE_ERROR_INCOMPATIBLE_DESTINATION: Permanent error, incompatible destination.
+ * @MM_SMS_DELIVERY_STATE_ERROR_CONNECTION_REJECTED: Permanent error, connection rejected by the SME.
+ * @MM_SMS_DELIVERY_STATE_ERROR_NOT_OBTAINABLE: Permanent error, not obtainable.
+ * @MM_SMS_DELIVERY_STATE_ERROR_QOS_NOT_AVAILABLE: Permanent error, QoS not available.
+ * @MM_SMS_DELIVERY_STATE_ERROR_NO_INTERWORKING_AVAILABLE: Permanent error, no interworking available.
+ * @MM_SMS_DELIVERY_STATE_ERROR_VALIDITY_PERIOD_EXPIRED: Permanent error, message validity period expired.
+ * @MM_SMS_DELIVERY_STATE_ERROR_DELETED_BY_ORIGINATING_SME: Permanent error, deleted by originating SME.
+ * @MM_SMS_DELIVERY_STATE_ERROR_DELETED_BY_SC_ADMINISTRATION: Permanent error, deleted by SC administration.
+ * @MM_SMS_DELIVERY_STATE_ERROR_MESSAGE_DOES_NOT_EXIST: Permanent error, message does no longer exist.
+ * @MM_SMS_DELIVERY_STATE_TEMPORARY_FATAL_ERROR_CONGESTION: Permanent error, congestion.
+ * @MM_SMS_DELIVERY_STATE_TEMPORARY_FATAL_ERROR_SME_BUSY: Permanent error, SME busy.
+ * @MM_SMS_DELIVERY_STATE_TEMPORARY_FATAL_ERROR_NO_RESPONSE_FROM_SME: Permanent error, no response from the SME.
+ * @MM_SMS_DELIVERY_STATE_TEMPORARY_FATAL_ERROR_SERVICE_REJECTED: Permanent error, service rejected.
+ * @MM_SMS_DELIVERY_STATE_TEMPORARY_FATAL_ERROR_QOS_NOT_AVAILABLE: Permanent error, QoS not available.
+ * @MM_SMS_DELIVERY_STATE_TEMPORARY_FATAL_ERROR_IN_SME: Permanent error in SME.
+ * @MM_SMS_DELIVERY_STATE_UNKNOWN: Unknown state.
+ *
+ * Enumeration of known SMS delivery states as defined in 3GPP TS 03.40.
+ *
+ * States out of the known ranges may also be valid (either reserved or SC-specific).
+ */
+typedef enum { /*< underscore_name=mm_sms_delivery_state >*/
+ /* Completed deliveries */
+ MM_SMS_DELIVERY_STATE_COMPLETED_RECEIVED = 0x00,
+ MM_SMS_DELIVERY_STATE_COMPLETED_FORWARDED_UNCONFIRMED = 0x01,
+ MM_SMS_DELIVERY_STATE_COMPLETED_REPLACED_BY_SC = 0x02,
+
+ /* Temporary failures */
+ MM_SMS_DELIVERY_STATE_TEMPORARY_ERROR_CONGESTION = 0x20,
+ MM_SMS_DELIVERY_STATE_TEMPORARY_ERROR_SME_BUSY = 0x21,
+ MM_SMS_DELIVERY_STATE_TEMPORARY_ERROR_NO_RESPONSE_FROM_SME = 0x22,
+ MM_SMS_DELIVERY_STATE_TEMPORARY_ERROR_SERVICE_REJECTED = 0x23,
+ MM_SMS_DELIVERY_STATE_TEMPORARY_ERROR_QOS_NOT_AVAILABLE = 0x24,
+ MM_SMS_DELIVERY_STATE_TEMPORARY_ERROR_IN_SME = 0x25,
+
+ /* Permanent failures */
+ MM_SMS_DELIVERY_STATE_ERROR_REMOTE_PROCEDURE = 0x40,
+ MM_SMS_DELIVERY_STATE_ERROR_INCOMPATIBLE_DESTINATION = 0x41,
+ MM_SMS_DELIVERY_STATE_ERROR_CONNECTION_REJECTED = 0x42,
+ MM_SMS_DELIVERY_STATE_ERROR_NOT_OBTAINABLE = 0x43,
+ MM_SMS_DELIVERY_STATE_ERROR_QOS_NOT_AVAILABLE = 0x44,
+ MM_SMS_DELIVERY_STATE_ERROR_NO_INTERWORKING_AVAILABLE = 0x45,
+ MM_SMS_DELIVERY_STATE_ERROR_VALIDITY_PERIOD_EXPIRED = 0x46,
+ MM_SMS_DELIVERY_STATE_ERROR_DELETED_BY_ORIGINATING_SME = 0x47,
+ MM_SMS_DELIVERY_STATE_ERROR_DELETED_BY_SC_ADMINISTRATION = 0x48,
+ MM_SMS_DELIVERY_STATE_ERROR_MESSAGE_DOES_NOT_EXIST = 0x49,
+
+ /* Temporary failures that became permanent */
+ MM_SMS_DELIVERY_STATE_TEMPORARY_FATAL_ERROR_CONGESTION = 0x60,
+ MM_SMS_DELIVERY_STATE_TEMPORARY_FATAL_ERROR_SME_BUSY = 0x61,
+ MM_SMS_DELIVERY_STATE_TEMPORARY_FATAL_ERROR_NO_RESPONSE_FROM_SME = 0x62,
+ MM_SMS_DELIVERY_STATE_TEMPORARY_FATAL_ERROR_SERVICE_REJECTED = 0x63,
+ MM_SMS_DELIVERY_STATE_TEMPORARY_FATAL_ERROR_QOS_NOT_AVAILABLE = 0x64,
+ MM_SMS_DELIVERY_STATE_TEMPORARY_FATAL_ERROR_IN_SME = 0x65,
+
+ /* Unknown, out of any possible valid value [0x00-0xFF] */
+ MM_SMS_DELIVERY_STATE_UNKNOWN = 0x100
+} MMSmsDeliveryState;
+
+/**
* MMSmsStorage:
* @MM_SMS_STORAGE_UNKNOWN: Storage unknown.
* @MM_SMS_STORAGE_SM: SIM card storage area.
diff --git a/introspection/org.freedesktop.ModemManager1.Sms.xml b/introspection/org.freedesktop.ModemManager1.Sms.xml
index 7f41ba77..534be3be 100644
--- a/introspection/org.freedesktop.ModemManager1.Sms.xml
+++ b/introspection/org.freedesktop.ModemManager1.Sms.xml
@@ -154,6 +154,17 @@
<property name="DischargeTimestamp" type="s" access="read" />
<!--
+ DeliveryState:
+
+ A <link linkend="MMSmsDeliveryState">MMSmsDeliveryState</link> value,
+ describing the state of the delivery reported in the Status Report message.
+
+ This field is only applicable if the PDU type is
+ <link linkend="MM-SMS-PDU-TYPE-STATUS-REPORT:CAPS"><constant>MM_SMS_PDU_TYPE_STATUS_REPORT</constant></link>.
+ -->
+ <property name="DeliveryState" type="u" access="read" />
+
+ <!--
Storage:
A <link linkend="MMSmsStorage">MMSmsStorage</link> value,
diff --git a/libmm-common/mm-common-helpers.c b/libmm-common/mm-common-helpers.c
index 3f48e2f1..b954afee 100644
--- a/libmm-common/mm-common-helpers.c
+++ b/libmm-common/mm-common-helpers.c
@@ -761,3 +761,47 @@ mm_get_string_unquoted_from_match_info (GMatchInfo *match_info,
return str;
}
+
+/*****************************************************************************/
+
+const gchar *
+mm_sms_delivery_state_get_string_extended (guint delivery_state)
+{
+ if (delivery_state > 0x02 && delivery_state < 0x20) {
+ if (delivery_state < 0x10)
+ return "completed-reason-reserved";
+ else
+ return "completed-sc-specific-reason";
+ }
+
+ if (delivery_state > 0x25 && delivery_state < 0x40) {
+ if (delivery_state < 0x30)
+ return "temporary-error-reason-reserved";
+ else
+ return "temporary-error-sc-specific-reason";
+ }
+
+ if (delivery_state > 0x49 && delivery_state < 0x60) {
+ if (delivery_state < 0x50)
+ return "error-reason-reserved";
+ else
+ return "error-sc-specific-reason";
+ }
+
+ if (delivery_state > 0x65 && delivery_state < 0x80) {
+ if (delivery_state < 0x70)
+ return "temporary-fatal-error-reason-reserved";
+ else
+ return "temporary-fatal-error-sc-specific-reason";
+ }
+
+ if (delivery_state >= 0x80 && delivery_state < 0x100)
+ return "unknown-reason-reserved";
+
+ if (delivery_state >= 0x100)
+ return "unknown";
+
+ /* Otherwise, use the MMSmsDeliveryState enum as we can match the known
+ * value */
+ return mm_sms_delivery_state_get_string ((MMSmsDeliveryState)delivery_state);
+}
diff --git a/libmm-common/mm-common-helpers.h b/libmm-common/mm-common-helpers.h
index 4203af96..0bbaf145 100644
--- a/libmm-common/mm-common-helpers.h
+++ b/libmm-common/mm-common-helpers.h
@@ -87,4 +87,6 @@ gboolean mm_get_double_from_match_info (GMatchInfo *match_info,
gchar *mm_get_string_unquoted_from_match_info (GMatchInfo *match_info,
guint32 match_index);
+const gchar *mm_sms_delivery_state_get_string_extended (guint delivery_state);
+
#endif /* MM_COMMON_HELPERS_H */
diff --git a/src/mm-sms-part.c b/src/mm-sms-part.c
index 95c41264..4f21e3a7 100644
--- a/src/mm-sms-part.c
+++ b/src/mm-sms-part.c
@@ -331,6 +331,8 @@ struct _MMSmsPart {
guint validity;
gboolean delivery_report_request;
guint message_reference;
+ /* NOT a MMSmsDeliveryState, which just includes the known values */
+ guint delivery_state;
gboolean should_concat;
guint concat_reference;
@@ -413,6 +415,8 @@ PART_GET_FUNC (gboolean, delivery_report_request)
PART_SET_FUNC (gboolean, delivery_report_request)
PART_GET_FUNC (guint, message_reference)
PART_SET_FUNC (guint, message_reference)
+PART_GET_FUNC (guint, delivery_state)
+PART_SET_FUNC (guint, delivery_state)
PART_GET_FUNC (guint, concat_reference)
@@ -459,6 +463,8 @@ mm_sms_part_new (guint index,
sms_part = g_slice_new0 (MMSmsPart);
sms_part->index = index;
sms_part->pdu_type = pdu_type;
+ sms_part->encoding = MM_SMS_ENCODING_UNKNOWN;
+ sms_part->delivery_state = MM_SMS_DELIVERY_STATE_UNKNOWN;
return sms_part;
}
@@ -693,7 +699,8 @@ mm_sms_part_new_from_binary_pdu (guint index,
offset += 7;
/* ----- TP-STATUS (1 byte) ------ */
- mm_dbg (" status: %u", (guint)pdu[offset]);
+ mm_dbg (" delivery state: %u", (guint)pdu[offset]);
+ mm_sms_part_set_delivery_state (sms_part, pdu[offset]);
offset++;
/* ------ TP-PI (1 byte) OPTIONAL ------ */
diff --git a/src/mm-sms-part.h b/src/mm-sms-part.h
index bfb11753..ee5f62f2 100644
--- a/src/mm-sms-part.h
+++ b/src/mm-sms-part.h
@@ -108,6 +108,10 @@ guint mm_sms_part_get_validity (MMSmsPart *part);
void mm_sms_part_set_validity (MMSmsPart *part,
guint validity);
+guint mm_sms_part_get_delivery_state (MMSmsPart *part);
+void mm_sms_part_set_delivery_state (MMSmsPart *part,
+ guint delivery_state);
+
guint mm_sms_part_get_message_reference (MMSmsPart *part);
void mm_sms_part_set_message_reference (MMSmsPart *part,
guint message_reference);
diff --git a/src/mm-sms.c b/src/mm-sms.c
index 1de83af0..f9e9b251 100644
--- a/src/mm-sms.c
+++ b/src/mm-sms.c
@@ -1252,6 +1252,7 @@ assemble_sms (MMSms *self,
"validity", mm_sms_part_get_validity (sorted_parts[0]),
"timestamp", mm_sms_part_get_timestamp (sorted_parts[0]),
"discharge-timestamp", mm_sms_part_get_discharge_timestamp (sorted_parts[0]),
+ "delivery-state", mm_sms_part_get_delivery_state (sorted_parts[0]),
/* delivery report request and message reference taken always from the last part */
"message-reference", mm_sms_part_get_message_reference (sorted_parts[self->priv->max_parts - 1]),
"delivery-report-request", mm_sms_part_get_delivery_report_request (sorted_parts[self->priv->max_parts - 1]),