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.
This commit is contained in:
Matthew Via
2021-10-23 18:23:32 -04:00
committed by Aleksander Morgado
parent afb213ac05
commit 6db9a48c34
3 changed files with 37 additions and 0 deletions

View File

@@ -13,6 +13,7 @@
* Copyright (C) 2013 Google, Inc. * Copyright (C) 2013 Google, Inc.
*/ */
#include "mm-sms-part.h"
#include <ctype.h> #include <ctype.h>
#include <string.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) | message_id = ((read_bits (&subparameter->parameter_value[0], 4, 8) << 8) |
(read_bits (&subparameter->parameter_value[1], 4, 8))); (read_bits (&subparameter->parameter_value[1], 4, 8)));
message_id = GUINT16_FROM_BE (message_id); 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); mm_obj_dbg (log_object, " message id: %u", (guint) message_id);
header_ind = read_bits (&subparameter->parameter_value[2], 4, 1); 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_encoding;
guint8 message_type = 0; guint8 message_type = 0;
guint8 num_fields; guint8 num_fields;
guint wdp_total_segments;
guint wdp_segment_number;
guint byte_offset = 0; guint byte_offset = 0;
guint bit_offset = 0; guint bit_offset = 0;
@@ -830,6 +834,32 @@ read_bearer_data_user_data (MMSmsPart *sms_part,
OFFSETS_UPDATE (8); 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_obj_dbg (log_object, " data: (%u bytes)", num_fields);
mm_sms_part_take_data (sms_part, data); mm_sms_part_take_data (sms_part, data);
break; break;

View File

@@ -41,6 +41,7 @@ struct _MMSmsPart {
guint validity_relative; guint validity_relative;
gboolean delivery_report_request; gboolean delivery_report_request;
guint message_reference; guint message_reference;
guint message_id;
/* NOT a MMSmsDeliveryState, which just includes the known values */ /* NOT a MMSmsDeliveryState, which just includes the known values */
guint delivery_state; guint delivery_state;
@@ -125,6 +126,8 @@ PART_GET_FUNC (guint, validity_relative)
PART_SET_FUNC (guint, validity_relative) PART_SET_FUNC (guint, validity_relative)
PART_GET_FUNC (gboolean, delivery_report_request) PART_GET_FUNC (gboolean, delivery_report_request)
PART_SET_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_GET_FUNC (guint, message_reference)
PART_SET_FUNC (guint, message_reference) PART_SET_FUNC (guint, message_reference)
PART_GET_FUNC (guint, delivery_state) PART_GET_FUNC (guint, delivery_state)

View File

@@ -129,6 +129,10 @@ gboolean mm_sms_part_get_delivery_report_request (MMSmsPart *part);
void mm_sms_part_set_delivery_report_request (MMSmsPart *part, void mm_sms_part_set_delivery_report_request (MMSmsPart *part,
gboolean delivery_report_request); 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); guint mm_sms_part_get_concat_reference (MMSmsPart *part);
void mm_sms_part_set_concat_reference (MMSmsPart *part, void mm_sms_part_set_concat_reference (MMSmsPart *part,
guint concat_reference); guint concat_reference);