aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Via <via@matthewvia.info>2021-10-23 18:23:32 -0400
committerAleksander Morgado <aleksander@aleksander.es>2021-11-21 21:17:20 +0000
commit6db9a48c343690c808aea92e29daf13e021d3fc8 (patch)
tree99f7d1bcaa84384b871e94af6ff126b1a2c0f411
parentafb213ac05aa72db010e17e0326408bf655f66fd (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.
-rw-r--r--src/mm-sms-part-cdma.c30
-rw-r--r--src/mm-sms-part.c3
-rw-r--r--src/mm-sms-part.h4
3 files changed, 37 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;
diff --git a/src/mm-sms-part.c b/src/mm-sms-part.c
index 9aafcc36..ee2cd9f0 100644
--- a/src/mm-sms-part.c
+++ b/src/mm-sms-part.c
@@ -41,6 +41,7 @@ struct _MMSmsPart {
guint validity_relative;
gboolean delivery_report_request;
guint message_reference;
+ guint message_id;
/* NOT a MMSmsDeliveryState, which just includes the known values */
guint delivery_state;
@@ -125,6 +126,8 @@ 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_id)
+PART_SET_FUNC (guint, message_id)
PART_GET_FUNC (guint, message_reference)
PART_SET_FUNC (guint, message_reference)
PART_GET_FUNC (guint, delivery_state)
diff --git a/src/mm-sms-part.h b/src/mm-sms-part.h
index 133d2e08..2ea44a85 100644
--- a/src/mm-sms-part.h
+++ b/src/mm-sms-part.h
@@ -129,6 +129,10 @@ gboolean mm_sms_part_get_delivery_report_request (MMSmsPart *part);
void mm_sms_part_set_delivery_report_request (MMSmsPart *part,
gboolean delivery_report_request);
+guint mm_sms_part_get_message_id (MMSmsPart *part);
+void mm_sms_part_set_message_id (MMSmsPart *part,
+ guint message_id);
+
guint mm_sms_part_get_concat_reference (MMSmsPart *part);
void mm_sms_part_set_concat_reference (MMSmsPart *part,
guint concat_reference);