Bug 749856 - Part 4: handle M-Retrieve.conf PDU, r=philikon

This commit is contained in:
Vicamo Yang 2012-06-01 16:48:51 +08:00
parent a38e6450d8
commit 39bcf88a39
3 changed files with 79 additions and 6 deletions

View File

@ -13,6 +13,19 @@ Cu.import("resource://gre/modules/mms_consts.js");
let DEBUG; // set to true to see debug messages let DEBUG; // set to true to see debug messages
function translatePduErrorToStatus(error) {
switch (error) {
case MMS_PDU_ERROR_OK:
return MMS_PDU_STATUS_RETRIEVED;
case MMS_PDU_ERROR_TRANSIENT_FAILURE:
case MMS_PDU_ERROR_TRANSIENT_MESSAGE_NOT_FOUND:
case MMS_PDU_ERROR_TRANSIENT_NETWORK_PROBLEM:
return MMS_PDU_STATUS_DEFERRED;
default:
return MMS_PDU_STATUS_UNRECOGNISED;
}
}
/** /**
* Internal decoding function for boolean values. * Internal decoding function for boolean values.
* *
@ -1109,6 +1122,9 @@ if (DEBUG) {
} }
const EXPORTED_SYMBOLS = ALL_CONST_SYMBOLS.concat([ const EXPORTED_SYMBOLS = ALL_CONST_SYMBOLS.concat([
// Utility functions
"translatePduErrorToStatus",
// Decoders // Decoders
"BooleanValue", "BooleanValue",
"Address", "Address",

View File

@ -153,22 +153,32 @@ MmsService.prototype = {
/** /**
* @param data * @param data
* A wrapped object containing raw PDU data. * A wrapped object containing raw PDU data.
* @param options
* Additional options to be passed to corresponding PDU handler.
*
* @return true if incoming data parsed successfully and passed to PDU
* handler; false otherwise.
*/ */
parseStreamAndDispatch: function parseStreamAndDispatch(data) { parseStreamAndDispatch: function parseStreamAndDispatch(data, options) {
let msg = MMS.PduHelper.parse(data, null); let msg = MMS.PduHelper.parse(data, null);
if (!msg) { if (!msg) {
return; return false;
} }
debug("parseStreamAndDispatch: msg = " + JSON.stringify(msg)); debug("parseStreamAndDispatch: msg = " + JSON.stringify(msg));
switch (msg.type) { switch (msg.type) {
case MMS.MMS_PDU_TYPE_NOTIFICATION_IND: case MMS.MMS_PDU_TYPE_NOTIFICATION_IND:
this.handleNotificationIndication(msg); this.handleNotificationIndication(msg, options);
break;
case MMS.MMS_PDU_TYPE_RETRIEVE_CONF:
this.handleRetrieveConfirmation(msg, options);
break; break;
default: default:
debug("Unsupported X-MMS-Message-Type: " + msg.type); debug("Unsupported X-MMS-Message-Type: " + msg.type);
break; return false;
} }
return true;
}, },
/** /**
@ -178,14 +188,50 @@ MmsService.prototype = {
* The MMS message object. * The MMS message object.
*/ */
handleNotificationIndication: function handleNotificationIndication(msg) { handleNotificationIndication: function handleNotificationIndication(msg) {
function callback(status, retr) {
// FIXME
}
function retrCallback(error, retr) {
callback(MMS.translatePduErrorToStatus(error), retr);
}
let url = msg.headers["x-mms-content-location"].uri; let url = msg.headers["x-mms-content-location"].uri;
this.sendMmsRequest("GET", url, (function (status, data) { this.sendMmsRequest("GET", url, (function (status, data) {
if (data) { if (!data) {
this.parseStreamAndDispatch(data); callback.call(null, MMS.MMS_PDU_STATUS_DEFERRED, null);
} else if (!this.parseStreamAndDispatch(data, retrCallback)) {
callback.call(null, MMS.MMS_PDU_STATUS_UNRECOGNISED, null);
} }
}).bind(this)); }).bind(this));
}, },
/**
* Handle incoming M-Retrieve.conf PDU.
*
* @param msg
* The MMS message object.
* @param callback
* A callback function that accepts one argument as retrieved message.
*/
handleRetrieveConfirmation: function handleRetrieveConfirmation(msg, callback) {
function callbackIfValid(status, msg) {
if (callback) {
callback(status, msg)
}
}
let status = msg.headers["x-mms-retrieve-status"];
if ((status != null) && (status != MMS.MMS_PDU_ERROR_OK)) {
callbackIfValid(status, msg);
return;
}
// FIXME: further processing
callbackIfValid(MMS.MMS_PDU_ERROR_OK, msg);
},
/** /**
* Update proxyInfo & MMSC from preferences. * Update proxyInfo & MMSC from preferences.
* *

View File

@ -40,6 +40,17 @@ const MMS_PDU_ERROR_PERMANENT_SERVICE_DENIED = 225;
const MMS_PDU_ERROR_PERMANENT_MESSAGE_NOT_FOUND = 226; const MMS_PDU_ERROR_PERMANENT_MESSAGE_NOT_FOUND = 226;
const MMS_PDU_ERROR_PERMANENT_CONTENT_UNSUPPORTED = 227; const MMS_PDU_ERROR_PERMANENT_CONTENT_UNSUPPORTED = 227;
// X-Mms-Status values
// @see OMA-TS-MMS_ENC-V1_3-20110913-A clause 7.3.54
const MMS_PDU_STATUS_EXPIRED = 128;
const MMS_PDU_STATUS_RETRIEVED = 129;
const MMS_PDU_STATUS_REJECTED = 130;
const MMS_PDU_STATUS_DEFERRED = 131;
const MMS_PDU_STATUS_UNRECOGNISED = 132;
const MMS_PDU_STATUS_INDETERMINATE = 133;
const MMS_PDU_STATUS_FORWARDED = 134;
const MMS_PDU_STATUS_UNREACHABLE = 135;
const ALL_CONST_SYMBOLS = Object.keys(this); const ALL_CONST_SYMBOLS = Object.keys(this);
// Allow this file to be imported via Components.utils.import(). // Allow this file to be imported via Components.utils.import().