summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2013-08-19 12:37:43 +0200
committerAleksander Morgado <aleksander@lanedo.com>2013-10-25 19:47:19 +0200
commit49ab6ce9807a0a9925e998671df499081a0d47cc (patch)
tree95ab6197f8a92c7a07931855571ea904f05f103c
parentaba7efb6155a15298689211053b47e725b25e66d (diff)
downloadModemManager-49ab6ce9807a0a9925e998671df499081a0d47cc.tar.gz
sms-part-cdma: read 7-bit ASCII text or raw data
-rw-r--r--src/mm-sms-part-cdma.c44
-rw-r--r--src/tests/test-sms-part-cdma.c17
2 files changed, 55 insertions, 6 deletions
diff --git a/src/mm-sms-part-cdma.c b/src/mm-sms-part-cdma.c
index b567e38e3..4e1ff462f 100644
--- a/src/mm-sms-part-cdma.c
+++ b/src/mm-sms-part-cdma.c
@@ -744,7 +744,7 @@ read_bearer_data_user_data (MMSmsPart *sms_part,
const struct Parameter *subparameter)
{
guint8 message_encoding;
- guint8 message_type;
+ guint8 message_type = 0;
guint8 num_fields;
guint byte_offset = 0;
guint bit_offset = 0;
@@ -824,6 +824,48 @@ read_bearer_data_user_data (MMSmsPart *sms_part,
OFFSETS_UPDATE (8);
mm_dbg (" num fields: %u", num_fields);
+ /* Now, process actual text or data */
+ switch (message_encoding) {
+ case ENCODING_OCTET: {
+ GByteArray *data;
+ guint i;
+
+ SUBPARAMETER_SIZE_CHECK (byte_offset + 1 + ((bit_offset + (num_fields * 8)) / 8));
+
+ data = g_byte_array_sized_new (num_fields);
+ g_byte_array_set_size (data, num_fields);
+ for (i = 0; i < num_fields; i++) {
+ data->data[i] = read_bits (&subparameter->parameter_value[byte_offset], bit_offset, 8);
+ OFFSETS_UPDATE (8);
+ }
+
+ mm_dbg (" data: (%u bytes)", num_fields);
+ mm_sms_part_take_data (sms_part, data);
+ break;
+ }
+
+ case ENCODING_ASCII_7BIT: {
+ gchar *text;
+ guint i;
+
+ SUBPARAMETER_SIZE_CHECK (byte_offset + 1 + ((bit_offset + (num_fields * 7)) / 8));
+
+ text = g_malloc (num_fields + 1);
+ for (i = 0; i < num_fields; i++) {
+ text[i] = read_bits (&subparameter->parameter_value[byte_offset], bit_offset, 7);
+ OFFSETS_UPDATE (7);
+ }
+ text[i] = '\0';
+
+ mm_dbg (" text: '%s'", text);
+ mm_sms_part_take_text (sms_part, text);
+ break;
+ }
+
+ default:
+ mm_dbg (" text/data: ignored (unsupported encoding)");
+ }
+
#undef OFFSETS_UPDATE
#undef SUBPARAMETER_SIZE_CHECK
}
diff --git a/src/tests/test-sms-part-cdma.c b/src/tests/test-sms-part-cdma.c
index 86aaaed59..cad20323f 100644
--- a/src/tests/test-sms-part-cdma.c
+++ b/src/tests/test-sms-part-cdma.c
@@ -49,7 +49,8 @@ common_test_part_from_hexpdu (const gchar *hexpdu,
MMSmsCdmaTeleserviceId expected_teleservice_id,
MMSmsCdmaServiceCategory expected_service_category,
const gchar *expected_address,
- guint8 expected_bearer_reply_option)
+ guint8 expected_bearer_reply_option,
+ const gchar *expected_text)
{
MMSmsPart *part;
GError *error = NULL;
@@ -71,6 +72,8 @@ common_test_part_from_hexpdu (const gchar *hexpdu,
}
if (expected_bearer_reply_option)
g_assert_cmpuint (expected_bearer_reply_option, ==, mm_sms_part_get_message_reference (part));
+ if (expected_text)
+ g_assert_cmpstr (expected_text, ==, mm_sms_part_get_text (part));
mm_sms_part_free (part);
}
@@ -81,7 +84,8 @@ common_test_part_from_pdu (const guint8 *pdu,
MMSmsCdmaTeleserviceId expected_teleservice_id,
MMSmsCdmaServiceCategory expected_service_category,
const gchar *expected_address,
- guint8 expected_bearer_reply_option)
+ guint8 expected_bearer_reply_option,
+ const gchar *expected_text)
{
gchar *hexpdu;
@@ -90,7 +94,8 @@ common_test_part_from_pdu (const guint8 *pdu,
expected_teleservice_id,
expected_service_category,
expected_address,
- expected_bearer_reply_option);
+ expected_bearer_reply_option,
+ expected_text);
g_free (hexpdu);
}
@@ -146,7 +151,8 @@ test_pdu1 (void)
MM_SMS_CDMA_TELESERVICE_ID_WMT,
MM_SMS_CDMA_SERVICE_CATEGORY_UNKNOWN,
"3305773196",
- 63);
+ 63,
+ "AAAA");
}
static void
@@ -201,7 +207,8 @@ test_invalid_address_length (void)
MM_SMS_CDMA_TELESERVICE_ID_WMT,
MM_SMS_CDMA_SERVICE_CATEGORY_UNKNOWN,
"",
- 63);
+ 63,
+ NULL);
}
/************************************************************/