diff options
author | Matthew Via <via@matthewvia.info> | 2021-10-23 18:23:32 -0400 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2021-11-21 21:17:20 +0000 |
commit | 6db9a48c343690c808aea92e29daf13e021d3fc8 (patch) | |
tree | 99f7d1bcaa84384b871e94af6ff126b1a2c0f411 /src/mm-sms-part-cdma.c | |
parent | afb213ac05aa72db010e17e0326408bf655f66fd (diff) |
sms-part-cdma: merge WDP multipart CDMA WAP messages.
CDMA WAPs have multipart message information in a 3 byte header in-band
with the user data, as described in WAP-259-WDP-20010614-a. Set the
message concat parameters and use the message-id as the reference.
Diffstat (limited to 'src/mm-sms-part-cdma.c')
-rw-r--r-- | src/mm-sms-part-cdma.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/mm-sms-part-cdma.c b/src/mm-sms-part-cdma.c index d79a0f91..67936715 100644 --- a/src/mm-sms-part-cdma.c +++ b/src/mm-sms-part-cdma.c @@ -13,6 +13,7 @@ * Copyright (C) 2013 Google, Inc. */ +#include "mm-sms-part.h" #include <ctype.h> #include <string.h> @@ -760,6 +761,7 @@ read_bearer_data_message_identifier (MMSmsPart *sms_part, message_id = ((read_bits (&subparameter->parameter_value[0], 4, 8) << 8) | (read_bits (&subparameter->parameter_value[1], 4, 8))); message_id = GUINT16_FROM_BE (message_id); + mm_sms_part_set_message_id (sms_part, message_id); mm_obj_dbg (log_object, " message id: %u", (guint) message_id); header_ind = read_bits (&subparameter->parameter_value[2], 4, 1); @@ -774,6 +776,8 @@ read_bearer_data_user_data (MMSmsPart *sms_part, guint8 message_encoding; guint8 message_type = 0; guint8 num_fields; + guint wdp_total_segments; + guint wdp_segment_number; guint byte_offset = 0; guint bit_offset = 0; @@ -830,6 +834,32 @@ read_bearer_data_user_data (MMSmsPart *sms_part, OFFSETS_UPDATE (8); } + if ((mm_sms_part_get_cdma_teleservice_id (sms_part) == MM_SMS_CDMA_TELESERVICE_ID_WAP) && + (num_fields >= 3) && + (data->data[0] == 0x00)) { + /* This is a CDMA WAP WDP message with a segmentation header, as + * defined in section 6.5 of WAP-256-WDP-20010614-a */ + wdp_total_segments = data->data[1]; + wdp_segment_number = data->data[2]; + mm_obj_dbg (log_object, " WAP WDP Payload, segment: %d total: %d", + wdp_segment_number, wdp_total_segments); + + /* Use message id as the reference number, since it is the same + * across message sets*/ + mm_sms_part_set_concat_reference (sms_part, mm_sms_part_get_message_id (sms_part)); + mm_sms_part_set_concat_max (sms_part, wdp_total_segments); + /* Segment Number is 0-indexed, concat_sequence expects 1-indexed values */ + mm_sms_part_set_concat_sequence (sms_part, wdp_segment_number + 1); + + if (wdp_segment_number == 0) { + /* Remove the 3 byte segmentation header as well as the 16 bit source and dest port fields */ + g_byte_array_remove_range (data, 0, 7); + } else { + /* Remove segmentation header from additional segments to merge cleanly */ + g_byte_array_remove_range (data, 0, 3); + } + } + mm_obj_dbg (log_object, " data: (%u bytes)", num_fields); mm_sms_part_take_data (sms_part, data); break; |