sms-part-cdma: read 7-bit ASCII text or raw data

This commit is contained in:
Aleksander Morgado
2013-08-19 12:37:43 +02:00
parent aba7efb615
commit 49ab6ce980
2 changed files with 55 additions and 6 deletions

View File

@@ -744,7 +744,7 @@ read_bearer_data_user_data (MMSmsPart *sms_part,
const struct Parameter *subparameter) const struct Parameter *subparameter)
{ {
guint8 message_encoding; guint8 message_encoding;
guint8 message_type; guint8 message_type = 0;
guint8 num_fields; guint8 num_fields;
guint byte_offset = 0; guint byte_offset = 0;
guint bit_offset = 0; guint bit_offset = 0;
@@ -824,6 +824,48 @@ read_bearer_data_user_data (MMSmsPart *sms_part,
OFFSETS_UPDATE (8); OFFSETS_UPDATE (8);
mm_dbg (" num fields: %u", num_fields); 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 OFFSETS_UPDATE
#undef SUBPARAMETER_SIZE_CHECK #undef SUBPARAMETER_SIZE_CHECK
} }

View File

@@ -49,7 +49,8 @@ common_test_part_from_hexpdu (const gchar *hexpdu,
MMSmsCdmaTeleserviceId expected_teleservice_id, MMSmsCdmaTeleserviceId expected_teleservice_id,
MMSmsCdmaServiceCategory expected_service_category, MMSmsCdmaServiceCategory expected_service_category,
const gchar *expected_address, const gchar *expected_address,
guint8 expected_bearer_reply_option) guint8 expected_bearer_reply_option,
const gchar *expected_text)
{ {
MMSmsPart *part; MMSmsPart *part;
GError *error = NULL; GError *error = NULL;
@@ -71,6 +72,8 @@ common_test_part_from_hexpdu (const gchar *hexpdu,
} }
if (expected_bearer_reply_option) if (expected_bearer_reply_option)
g_assert_cmpuint (expected_bearer_reply_option, ==, mm_sms_part_get_message_reference (part)); 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); mm_sms_part_free (part);
} }
@@ -81,7 +84,8 @@ common_test_part_from_pdu (const guint8 *pdu,
MMSmsCdmaTeleserviceId expected_teleservice_id, MMSmsCdmaTeleserviceId expected_teleservice_id,
MMSmsCdmaServiceCategory expected_service_category, MMSmsCdmaServiceCategory expected_service_category,
const gchar *expected_address, const gchar *expected_address,
guint8 expected_bearer_reply_option) guint8 expected_bearer_reply_option,
const gchar *expected_text)
{ {
gchar *hexpdu; gchar *hexpdu;
@@ -90,7 +94,8 @@ common_test_part_from_pdu (const guint8 *pdu,
expected_teleservice_id, expected_teleservice_id,
expected_service_category, expected_service_category,
expected_address, expected_address,
expected_bearer_reply_option); expected_bearer_reply_option,
expected_text);
g_free (hexpdu); g_free (hexpdu);
} }
@@ -146,7 +151,8 @@ test_pdu1 (void)
MM_SMS_CDMA_TELESERVICE_ID_WMT, MM_SMS_CDMA_TELESERVICE_ID_WMT,
MM_SMS_CDMA_SERVICE_CATEGORY_UNKNOWN, MM_SMS_CDMA_SERVICE_CATEGORY_UNKNOWN,
"3305773196", "3305773196",
63); 63,
"AAAA");
} }
static void static void
@@ -201,7 +207,8 @@ test_invalid_address_length (void)
MM_SMS_CDMA_TELESERVICE_ID_WMT, MM_SMS_CDMA_TELESERVICE_ID_WMT,
MM_SMS_CDMA_SERVICE_CATEGORY_UNKNOWN, MM_SMS_CDMA_SERVICE_CATEGORY_UNKNOWN,
"", "",
63); 63,
NULL);
} }
/************************************************************/ /************************************************************/