aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2013-04-03 16:30:48 +0200
committerAleksander Morgado <aleksander@lanedo.com>2013-04-05 17:48:51 +0200
commitf9105bff875ae0e7263718a317e156948957a6d0 (patch)
tree417299f51a7d17d7d5bd30692fd7b5ffd98092de
parent372a49bbf661c95110852c86df54008a7bad2774 (diff)
api,introspection: update 'Validity' property in the SMS interface
We don't want to support only 'relative' validity, so don't assume that the Validity property will always be a uint32 value. Instead, we define the Validity propery as '(uv)' tuple, where the first value (a MMSmsValidityType) specifies the type of validity, and the second value is a variant formatted accordingly to what the validity type specifies (e.g. a uint32 value if the type is MM_SMS_VALIDITY_TYPE_RELATIVE).
-rw-r--r--cli/mmcli-sms.c17
-rw-r--r--docs/reference/api/ModemManager-sections.txt1
-rw-r--r--docs/reference/libmm-glib/libmm-glib-sections.txt8
-rw-r--r--include/ModemManager-enums.h16
-rw-r--r--introspection/org.freedesktop.ModemManager1.Sms.xml24
-rw-r--r--libmm-glib/mm-sms.c59
-rw-r--r--libmm-glib/mm-sms.h3
-rw-r--r--src/mm-sms-part.c16
-rw-r--r--src/mm-sms-part.h4
-rw-r--r--src/mm-sms.c33
-rw-r--r--src/tests/test-sms-part.c2
11 files changed, 149 insertions, 34 deletions
diff --git a/cli/mmcli-sms.c b/cli/mmcli-sms.c
index 214ba9d6..a9c2cb14 100644
--- a/cli/mmcli-sms.c
+++ b/cli/mmcli-sms.c
@@ -181,16 +181,17 @@ print_sms_info (MMSms *sms)
g_print (" -----------------------------------\n"
" Properties | PDU type: '%s'\n"
" | state: '%s'\n"
- " | smsc: '%s'\n"
- " | validity: '%u'\n"
- " | class: '%u'\n"
- " | storage: '%s'\n",
-
-
+ " | smsc: '%s'\n",
mm_sms_pdu_type_get_string (pdu_type),
mm_sms_state_get_string (mm_sms_get_state (sms)),
- VALIDATE (mm_sms_get_smsc (sms)),
- mm_sms_get_validity (sms),
+ VALIDATE (mm_sms_get_smsc (sms)));
+
+ if (mm_sms_get_validity_type (sms) == MM_SMS_VALIDITY_TYPE_RELATIVE)
+ g_print (" | validity (relative): '%u'\n",
+ mm_sms_get_validity_relative (sms));
+
+ g_print (" | class: '%u'\n"
+ " | storage: '%s'\n",
mm_sms_get_class (sms),
mm_sms_storage_get_string (mm_sms_get_storage (sms)));
diff --git a/docs/reference/api/ModemManager-sections.txt b/docs/reference/api/ModemManager-sections.txt
index 37309e9d..94cc0336 100644
--- a/docs/reference/api/ModemManager-sections.txt
+++ b/docs/reference/api/ModemManager-sections.txt
@@ -27,6 +27,7 @@ MMSmsPduType
MMSmsState
MMSmsDeliveryState
MMSmsStorage
+MMSmsValidityType
</SECTION>
<SECTION>
diff --git a/docs/reference/libmm-glib/libmm-glib-sections.txt b/docs/reference/libmm-glib/libmm-glib-sections.txt
index 7fed42c1..d2626187 100644
--- a/docs/reference/libmm-glib/libmm-glib-sections.txt
+++ b/docs/reference/libmm-glib/libmm-glib-sections.txt
@@ -885,7 +885,8 @@ mm_sms_get_smsc
mm_sms_dup_smsc
mm_sms_get_message_reference
mm_sms_get_class
-mm_sms_get_validity
+mm_sms_get_validity_type
+mm_sms_get_validity_relative
mm_sms_get_timestamp
mm_sms_dup_timestamp
mm_sms_get_discharge_timestamp
@@ -979,6 +980,7 @@ mm_sms_pdu_type_get_string
mm_sms_state_get_string
mm_sms_delivery_state_get_string
mm_sms_storage_get_string
+mm_sms_validity_type_get_string
mm_firmware_image_type_get_string
<SUBSECTION Private>
mm_modem_capability_get_string
@@ -994,6 +996,7 @@ mm_sms_pdu_type_build_string_from_mask
mm_sms_state_build_string_from_mask
mm_sms_delivery_state_build_string_from_mask
mm_sms_storage_build_string_from_mask
+mm_sms_validity_type_build_string_from_mask
mm_modem_location_source_get_string
mm_modem_contacts_storage_build_string_from_mask
mm_bearer_ip_family_build_string_from_mask
@@ -1034,6 +1037,7 @@ MM_TYPE_SMS_DELIVERY_STATE
MM_TYPE_SMS_PDU_TYPE
MM_TYPE_SMS_STATE
MM_TYPE_SMS_STORAGE
+MM_TYPE_SMS_VALIDITY_TYPE
mm_bearer_ip_family_get_type
mm_bearer_ip_method_get_type
mm_bearer_allowed_auth_get_type
@@ -1060,6 +1064,7 @@ mm_sms_delivery_state_get_type
mm_sms_pdu_type_get_type
mm_sms_state_get_type
mm_sms_storage_get_type
+mm_sms_validity_type_get_type
</SECTION>
<SECTION>
@@ -2317,6 +2322,7 @@ mm_gdbus_sms_dup_number
mm_gdbus_sms_get_smsc
mm_gdbus_sms_dup_smsc
mm_gdbus_sms_get_validity
+mm_gdbus_sms_dup_validity
mm_gdbus_sms_get_class
mm_gdbus_sms_get_timestamp
mm_gdbus_sms_dup_timestamp
diff --git a/include/ModemManager-enums.h b/include/ModemManager-enums.h
index 6c121354..f297d1be 100644
--- a/include/ModemManager-enums.h
+++ b/include/ModemManager-enums.h
@@ -522,6 +522,22 @@ typedef enum { /*< underscore_name=mm_sms_storage >*/
} MMSmsStorage;
/**
+ * MMSmsValidityType:
+ * @MM_SMS_VALIDITY_TYPE_UNKNOWN: Validity type unknown.
+ * @MM_SMS_VALIDITY_TYPE_RELATIVE: Relative validity.
+ * @MM_SMS_VALIDITY_TYPE_ABSOLUTE: Absolute validity.
+ * @MM_SMS_VALIDITY_TYPE_ENHANCED: Enhanced validity.
+ *
+ * Type of SMS validity value.
+ */
+typedef enum { /*< underscore_name=mm_sms_validity_type >*/
+ MM_SMS_VALIDITY_TYPE_UNKNOWN = 0,
+ MM_SMS_VALIDITY_TYPE_RELATIVE = 1,
+ MM_SMS_VALIDITY_TYPE_ABSOLUTE = 2,
+ MM_SMS_VALIDITY_TYPE_ENHANCED = 3,
+} MMSmsValidityType;
+
+/**
* MMModemLocationSource:
* @MM_MODEM_LOCATION_SOURCE_NONE: None.
* @MM_MODEM_LOCATION_SOURCE_3GPP_LAC_CI: Location Area Code and Cell ID.
diff --git a/introspection/org.freedesktop.ModemManager1.Sms.xml b/introspection/org.freedesktop.ModemManager1.Sms.xml
index 858c9890..16e29d2f 100644
--- a/introspection/org.freedesktop.ModemManager1.Sms.xml
+++ b/introspection/org.freedesktop.ModemManager1.Sms.xml
@@ -99,11 +99,25 @@
<!--
Validity:
- Specifies when the SMS expires in the SMSC.
-
- Always 0 for 3GPP2/CDMA.
- -->
- <property name="Validity" type="u" access="read" />
+ Indicates when the SMS expires in the SMSC.
+
+ This value is composed of a
+ <link linkend="MMSmsValidityType">MMSmsValidityType</link>
+ key, with an associated data which contains type-specific validity
+ information:
+
+ <variablelist>
+ <varlistentry><term><link linkend="MM-SMS-VALIDITY-TYPE-RELATIVE:CAPS">MM_SMS_VALIDITY_TYPE_RELATIVE</link></term>
+ <listitem>
+ <para>
+ The value is the length of the validity period in minutes, given
+ as an unsigned integer (D-Bus signature <literal>'u'</literal>).
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ -->
+ <property name="Validity" type="(uv)" access="read" />
<!--
Class:
diff --git a/libmm-glib/mm-sms.c b/libmm-glib/mm-sms.c
index 3a0bd5f5..a69b5dc7 100644
--- a/libmm-glib/mm-sms.c
+++ b/libmm-glib/mm-sms.c
@@ -375,19 +375,66 @@ mm_sms_dup_discharge_timestamp (MMSms *self)
/*****************************************************************************/
/**
- * mm_sms_get_validity:
+ * mm_sms_get_validity_type:
* @self: A #MMSms.
*
- * Gets the validity time of the SMS.
+ * Gets the type of validity information in the SMS.
*
- * Returns: the validity time or 0 if unknown.
+ * Returns: the validity type or #MM_SMS_VALIDITY_TYPE_UNKNOWN.
+ */
+MMSmsValidityType
+mm_sms_get_validity_type (MMSms *self)
+{
+ GVariant *variant;
+ guint type;
+ GVariant *value;
+
+ g_return_val_if_fail (MM_IS_SMS (self), MM_SMS_VALIDITY_TYPE_UNKNOWN);
+
+ variant = mm_gdbus_sms_dup_validity (MM_GDBUS_SMS (self));
+ if (!variant)
+ return MM_SMS_VALIDITY_TYPE_UNKNOWN;
+
+ g_variant_get (variant, "(uv)", &type, &value);
+ g_variant_unref (variant);
+ g_variant_unref (value);
+
+ return (MMSmsValidityType)type;
+}
+
+/**
+ * mm_sms_get_validity_relative:
+ * @self: A #MMSms.
+ *
+ * Gets the length of the validity period, in minutes.
+ *
+ * Only applicable if the type of validity is #MM_SMS_VALIDITY_TYPE_RELATIVE.
+ *
+ * Returns: the length of the validity period, or 0 if unknown.
*/
guint
-mm_sms_get_validity (MMSms *self)
+mm_sms_get_validity_relative (MMSms *self)
{
- g_return_val_if_fail (MM_IS_SMS (self), 0);
+ GVariant *variant;
+ guint type;
+ GVariant *value;
+ guint value_integer = 0;
+
+ g_return_val_if_fail (MM_IS_SMS (self), MM_SMS_VALIDITY_TYPE_UNKNOWN);
+
+ variant = mm_gdbus_sms_dup_validity (MM_GDBUS_SMS (self));
+ if (!variant)
+ return 0;
+
+ g_variant_get (variant, "(uv)", &type, &value);
+
+ if (type == MM_SMS_VALIDITY_TYPE_RELATIVE)
+ value_integer = g_variant_get_uint32 (value);
+
+ g_variant_unref (variant);
+ g_variant_unref (value);
- return mm_gdbus_sms_get_validity (MM_GDBUS_SMS (self));
+ return value_integer;
}
/*****************************************************************************/
diff --git a/libmm-glib/mm-sms.h b/libmm-glib/mm-sms.h
index 6cfb5b78..cb5b2b9d 100644
--- a/libmm-glib/mm-sms.h
+++ b/libmm-glib/mm-sms.h
@@ -86,7 +86,8 @@ gchar *mm_sms_dup_timestamp (MMSms *self);
const gchar *mm_sms_get_discharge_timestamp (MMSms *self);
gchar *mm_sms_dup_discharge_timestamp (MMSms *self);
-guint mm_sms_get_validity (MMSms *self);
+MMSmsValidityType mm_sms_get_validity_type (MMSms *self);
+guint mm_sms_get_validity_relative (MMSms *self);
guint mm_sms_get_class (MMSms *self);
diff --git a/src/mm-sms-part.c b/src/mm-sms-part.c
index ffe15a99..e68a25b6 100644
--- a/src/mm-sms-part.c
+++ b/src/mm-sms-part.c
@@ -326,7 +326,7 @@ struct _MMSmsPart {
MMSmsEncoding encoding;
GByteArray *data;
guint class;
- guint validity;
+ guint validity_relative;
gboolean delivery_report_request;
guint message_reference;
/* NOT a MMSmsDeliveryState, which just includes the known values */
@@ -405,8 +405,8 @@ PART_GET_FUNC (MMSmsEncoding, encoding)
PART_SET_FUNC (MMSmsEncoding, encoding)
PART_GET_FUNC (guint, class)
PART_SET_FUNC (guint, class)
-PART_GET_FUNC (guint, validity)
-PART_SET_FUNC (guint, validity)
+PART_GET_FUNC (guint, validity_relative)
+PART_SET_FUNC (guint, validity_relative)
PART_GET_FUNC (gboolean, delivery_report_request)
PART_SET_FUNC (gboolean, delivery_report_request)
PART_GET_FUNC (guint, message_reference)
@@ -655,8 +655,8 @@ mm_sms_part_new_from_binary_pdu (guint index,
switch (validity_format) {
case 0x10:
mm_dbg (" validity available, format relative");
- mm_sms_part_set_validity (sms_part,
- relative_to_validity (pdu[offset]));
+ mm_sms_part_set_validity_relative (sms_part,
+ relative_to_validity (pdu[offset]));
offset++;
break;
case 0x08:
@@ -972,7 +972,7 @@ mm_sms_part_get_submit_pdu (MMSmsPart *part,
pdu[offset] = 0;
/* TP-VP present; format RELATIVE */
- if (part->validity > 0) {
+ if (part->validity_relative > 0) {
mm_dbg (" adding validity to PDU...");
pdu[offset] |= 0x10;
}
@@ -1034,8 +1034,8 @@ mm_sms_part_get_submit_pdu (MMSmsPart *part,
/* ----------- TP-Validity-Period (1 byte): 4 days ----------- */
/* Only if TP-VPF was set in first byte */
- if (part->validity > 0)
- pdu[offset++] = validity_to_relative (part->validity);
+ if (part->validity_relative > 0)
+ pdu[offset++] = validity_to_relative (part->validity_relative);
/* ----------- TP-User-Data-Length ----------- */
/* Set to zero initially, and keep a ptr for easy access later */
diff --git a/src/mm-sms-part.h b/src/mm-sms-part.h
index 4517a7a7..8e7cdd92 100644
--- a/src/mm-sms-part.h
+++ b/src/mm-sms-part.h
@@ -100,8 +100,8 @@ guint mm_sms_part_get_class (MMSmsPart *part);
void mm_sms_part_set_class (MMSmsPart *part,
guint class);
-guint mm_sms_part_get_validity (MMSmsPart *part);
-void mm_sms_part_set_validity (MMSmsPart *part,
+guint mm_sms_part_get_validity_relative (MMSmsPart *part);
+void mm_sms_part_set_validity_relative (MMSmsPart *part,
guint validity);
guint mm_sms_part_get_delivery_state (MMSmsPart *part);
diff --git a/src/mm-sms.c b/src/mm-sms.c
index c540692e..f0a08e69 100644
--- a/src/mm-sms.c
+++ b/src/mm-sms.c
@@ -73,6 +73,29 @@ struct _MMSmsPrivate {
/*****************************************************************************/
+static guint
+get_validity_relative (GVariant *tuple)
+{
+ guint type;
+ GVariant *value;
+ guint value_integer = 0;
+
+ if (!tuple)
+ return 0;
+
+ g_variant_get (tuple, "(ub)", &type, &value);
+
+ if (type == MM_SMS_VALIDITY_TYPE_RELATIVE)
+ value_integer = g_variant_get_uint32 (value);
+ else
+ /* Currently not supported other than relative */
+ g_warn_if_reached ();
+
+ g_variant_unref (value);
+
+ return value_integer;
+}
+
static gboolean
generate_submit_pdus (MMSms *self,
GError **error)
@@ -172,7 +195,7 @@ generate_submit_pdus (MMSms *self,
mm_sms_part_set_encoding (part, encoding);
mm_sms_part_set_number (part, mm_gdbus_sms_get_number (MM_GDBUS_SMS (self)));
mm_sms_part_set_smsc (part, mm_gdbus_sms_get_smsc (MM_GDBUS_SMS (self)));
- mm_sms_part_set_validity (part, mm_gdbus_sms_get_validity (MM_GDBUS_SMS (self)));
+ mm_sms_part_set_validity_relative (part, get_validity_relative (mm_gdbus_sms_get_validity (MM_GDBUS_SMS (self))));
mm_sms_part_set_class (part, mm_gdbus_sms_get_class (MM_GDBUS_SMS (self)));
mm_sms_part_set_delivery_report_request (part, mm_gdbus_sms_get_delivery_report_request (MM_GDBUS_SMS (self)));
@@ -1376,6 +1399,7 @@ assemble_sms (MMSms *self,
MMSmsPart **sorted_parts;
GString *fulltext;
GByteArray *fulldata;
+ guint validity_relative;
sorted_parts = g_new0 (MMSmsPart *, self->priv->max_parts);
@@ -1463,6 +1487,9 @@ assemble_sms (MMSms *self,
/* If we got all parts, we also have the first one always */
g_assert (sorted_parts[0] != NULL);
+ /* Prepare for validity tuple */
+ validity_relative = mm_sms_part_get_validity_relative (sorted_parts[0]);
+
/* If we got everything, assemble the text! */
g_object_set (self,
"pdu-type", mm_sms_part_get_pdu_type (sorted_parts[0]),
@@ -1476,7 +1503,9 @@ assemble_sms (MMSms *self,
"smsc", mm_sms_part_get_smsc (sorted_parts[0]),
"class", mm_sms_part_get_class (sorted_parts[0]),
"number", mm_sms_part_get_number (sorted_parts[0]),
- "validity", mm_sms_part_get_validity (sorted_parts[0]),
+ "validity", (validity_relative ?
+ g_variant_new ("(uv)", MM_SMS_VALIDITY_TYPE_RELATIVE, g_variant_new_uint32 (validity_relative)) :
+ g_variant_new ("(uv)", MM_SMS_VALIDITY_TYPE_UNKNOWN, g_variant_new_boolean (FALSE))),
"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]),
diff --git a/src/tests/test-sms-part.c b/src/tests/test-sms-part.c
index 7d03f8f6..6a3f7183 100644
--- a/src/tests/test-sms-part.c
+++ b/src/tests/test-sms-part.c
@@ -536,7 +536,7 @@ common_test_create_pdu (const gchar *smsc,
mm_sms_part_set_encoding (part, encoding);
}
if (validity > 0)
- mm_sms_part_set_validity (part, validity);
+ mm_sms_part_set_validity_relative (part, validity);
if (class > 0)
mm_sms_part_set_class (part, class);