Bug 736697 - Part 3: support SMS-STATUS-REPORT. r=philikon

This commit is contained in:
Vicamo Yang 2012-04-05 14:16:56 -07:00
parent f9cd3dc8fe
commit d8957ffbf5
2 changed files with 114 additions and 11 deletions

View File

@ -520,10 +520,18 @@ const PDU_MMS_RD = 0x04;// More messages to send. (SMS-DELIVER only) or
// MTI - Message Type Indicator
const PDU_MTI_SMS_RESERVED = 0x03;
const PDU_MTI_SMS_STATUS_COMMAND = 0x02;
const PDU_MTI_SMS_STATUS_REPORT = 0x02;
const PDU_MTI_SMS_COMMAND = 0x02;
const PDU_MTI_SMS_SUBMIT = 0x01;
const PDU_MTI_SMS_DELIVER = 0x00;
// PI - Parameter Indicator
const PDU_PI_EXTENSION = 0x80;
const PDU_PI_USER_DATA_LENGTH = 0x04;
const PDU_PI_DATA_CODING_SCHEME = 0x02;
const PDU_PI_PROTOCOL_IDENTIFIER = 0x01;
const PDU_PI_RESERVED = 0x78;
// FCS - Failure Cause
const PDU_FCS_OK = 0x00;
const PDU_FCS_UNSPECIFIED = 0xFF;

View File

@ -1531,6 +1531,23 @@ let RIL = {
return PDU_FCS_OK;
},
/**
* Helper for processing SMS-STATUS-REPORT PDUs.
*
* @param length
* Length of SMS string in the incoming parcel.
*
* @return A failure cause defined in 3GPP 23.040 clause 9.2.3.22.
*/
_processSmsStatusReport: function _processSmsStatusReport(length) {
let message = this._processReceivedSms(length);
if (!message) {
return PDU_FCS_UNSPECIFIED;
}
return PDU_FCS_OK;
},
/**
* Helper for processing received multipart SMS.
*
@ -2149,8 +2166,8 @@ RIL[UNSOLICITED_RESPONSE_NEW_SMS] = function UNSOLICITED_RESPONSE_NEW_SMS(length
this.acknowledgeSMS(result == PDU_FCS_OK, result);
};
RIL[UNSOLICITED_RESPONSE_NEW_SMS_STATUS_REPORT] = function UNSOLICITED_RESPONSE_NEW_SMS_STATUS_REPORT(length) {
let info = Buf.readStringList();
//TODO
let result = this._processSmsStatusReport(length);
this.acknowledgeSMS(result == PDU_FCS_OK, result);
};
RIL[UNSOLICITED_RESPONSE_NEW_SMS_ON_SIM] = function UNSOLICITED_RESPONSE_NEW_SMS_ON_SIM(length) {
let info = Buf.readUint32List();
@ -2863,6 +2880,50 @@ let GsmPDUHelper = {
}
},
/**
* Read extra parameters if TP-PI is set.
*
* @param msg
* message object for output.
*/
readExtraParams: function readExtraParams(msg) {
// Because each PDU octet is converted to two UCS2 char2, we should always
// get even messageStringLength in this#_processReceivedSms(). So, we'll
// always need two delimitors at the end.
if (Buf.readAvailable <= 4) {
return;
}
// TP-Parameter-Indicator
let pi;
do {
// `The most significant bit in octet 1 and any other TP-PI octets which
// may be added later is reserved as an extension bit which when set to a
// 1 shall indicate that another TP-PI octet follows immediately
// afterwards.` ~ 3GPP TS 23.040 9.2.3.27
pi = this.readHexOctet();
} while (pi & PDU_PI_EXTENSION);
// `If the TP-UDL bit is set to "1" but the TP-DCS bit is set to "0" then
// the receiving entity shall for TP-DCS assume a value of 0x00, i.e. the
// 7bit default alphabet.` ~ 3GPP 23.040 9.2.3.27
msg.dcs = 0;
// TP-Protocol-Identifier
if (pi & PDU_PI_PROTOCOL_IDENTIFIER) {
msg.pid = this.readHexOctet();
}
// TP-Data-Coding-Scheme
if (pi & PDU_PI_DATA_CODING_SCHEME) {
msg.dcs = this.readHexOctet();
}
// TP-User-Data-Length
if (pi & PDU_PI_USER_DATA_LENGTH) {
let userDataLength = this.readHexOctet();
this.readUserData(msg, userDataLength);
}
},
/**
* Read and decode a PDU-encoded message from the stream.
*
@ -2872,14 +2933,22 @@ let GsmPDUHelper = {
readMessage: function readMessage() {
// An empty message object. This gets filled below and then returned.
let msg = {
SMSC: null,
mti: null,
udhi: null,
sender: null,
pid: null,
dcs: null,
body: null,
timestamp: null
// D:DELIVER, DR:DELIVER-REPORT, S:SUBMIT, SR:SUBMIT-REPORT,
// ST:STATUS-REPORT, C:COMMAND
// M:Mandatory, O:Optional, X:Unavailable
// D DR S SR ST C
SMSC: null, // M M M M M M
mti: null, // M M M M M M
udhi: null, // M M X M M M
sender: null, // M X X X X X
recipient: null, // X X M X M M
pid: null, // M O M O O M
dcs: null, // M O M O O X
body: null, // M O M O O O
timestamp: null, // M X X X X X
status: null, // X X X X M X
scts: null, // X X X M M X
dt: null, // X X X X M X
};
// SMSC info
@ -2907,6 +2976,8 @@ let GsmPDUHelper = {
// the message exactly as received.` ~ 3GPP TS 23.040 9.2.3.1
case PDU_MTI_SMS_DELIVER:
return this.readDeliverMessage(msg);
case PDU_MTI_SMS_STATUS_REPORT:
return this.readStatusReportMessage(msg);
default:
return null;
}
@ -2939,6 +3010,30 @@ let GsmPDUHelper = {
return msg;
},
/**
* Read and decode a SMS-STATUS-REPORT PDU.
*
* @param msg
* message object for output.
*/
readStatusReportMessage: function readStatusReportMessage(msg) {
// TP-Message-Reference
msg.messageRef = this.readHexOctet();
// TP-Recipient-Address
let recipientAddressLength = this.readHexOctet();
msg.recipient = this.readAddress(recipientAddressLength);
// TP-Service-Centre-Time-Stamp
msg.scts = this.readTimestamp();
// TP-Discharge-Time
msg.dt = this.readTimestamp();
// TP-Status
msg.status = this.readHexOctet();
this.readExtraParams(msg);
return msg;
},
/**
* Serialize a SMS-SUBMIT PDU message and write it to the output stream.
*