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:

committed by
Aleksander Morgado

parent
afb213ac05
commit
6db9a48c34
@@ -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;
|
||||||
|
@@ -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)
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user