diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2013-08-19 12:37:43 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2013-10-25 19:47:19 +0200 |
commit | 49ab6ce9807a0a9925e998671df499081a0d47cc (patch) | |
tree | 95ab6197f8a92c7a07931855571ea904f05f103c | |
parent | aba7efb6155a15298689211053b47e725b25e66d (diff) | |
download | ModemManager-49ab6ce9807a0a9925e998671df499081a0d47cc.tar.gz |
sms-part-cdma: read 7-bit ASCII text or raw data
-rw-r--r-- | src/mm-sms-part-cdma.c | 44 | ||||
-rw-r--r-- | src/tests/test-sms-part-cdma.c | 17 |
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); } /************************************************************/ |