Bug 804667 - Part 3: Support TIMER MANAGEMENT in RIL. r=allstars.chh

This commit is contained in:
Edgar Chen 2012-11-28 16:16:20 +08:00
Родитель 8f77197e5a
Коммит 74cf7b6045
5 изменённых файлов: 171 добавлений и 4 удалений

Просмотреть файл

@ -51,6 +51,8 @@ interface nsIMobileConnectionProvider : nsISupports
void sendStkMenuSelection(in nsIDOMWindow window, void sendStkMenuSelection(in nsIDOMWindow window,
in unsigned short itemIdentifier, in unsigned short itemIdentifier,
in boolean helpRequested); in boolean helpRequested);
void sendStkTimerExpiration(in nsIDOMWindow window,
in jsval timer);
void sendStkEventDownload(in nsIDOMWindow window, void sendStkEventDownload(in nsIDOMWindow window,
in jsval event); in jsval event);

Просмотреть файл

@ -580,6 +580,15 @@ RILContentHelper.prototype = {
helpRequested: helpRequested}); helpRequested: helpRequested});
}, },
sendStkTimerExpiration: function sendStkTimerExpiration(window,
timer) {
if (window == null) {
throw Components.Exception("Can't get window object",
Cr.NS_ERROR_UNEXPECTED);
}
cpmm.sendAsyncMessage("RIL:SendStkTimerExpiration", {timer: timer});
},
sendStkEventDownload: function sendStkEventDownload(window, sendStkEventDownload: function sendStkEventDownload(window,
event) { event) {
if (window == null) { if (window == null) {

Просмотреть файл

@ -91,6 +91,7 @@ const RIL_IPC_MOBILECONNECTION_MSG_NAMES = [
"RIL:CancelMMI", "RIL:CancelMMI",
"RIL:SendStkResponse", "RIL:SendStkResponse",
"RIL:SendStkMenuSelection", "RIL:SendStkMenuSelection",
"RIL:SendStkTimerExpiration",
"RIL:SendStkEventDownload", "RIL:SendStkEventDownload",
"RIL:RegisterMobileConnectionMsg", "RIL:RegisterMobileConnectionMsg",
"RIL:SetCallForwardingOption", "RIL:SetCallForwardingOption",
@ -458,6 +459,9 @@ RadioInterfaceLayer.prototype = {
case "RIL:SendStkMenuSelection": case "RIL:SendStkMenuSelection":
this.sendStkMenuSelection(msg.json); this.sendStkMenuSelection(msg.json);
break; break;
case "RIL:SendStkTimerExpiration":
this.sendStkTimerExpiration(msg.json);
break;
case "RIL:SendStkEventDownload": case "RIL:SendStkEventDownload":
this.sendStkEventDownload(msg.json); this.sendStkEventDownload(msg.json);
break; break;
@ -1913,6 +1917,11 @@ RadioInterfaceLayer.prototype = {
this.worker.postMessage(message); this.worker.postMessage(message);
}, },
sendStkTimerExpiration: function sendStkTimerExpiration(message) {
message.rilMessageType = "sendStkTimerExpiration";
this.worker.postMessage(message);
},
sendStkEventDownload: function sendStkEventDownload(message) { sendStkEventDownload: function sendStkEventDownload(message) {
message.rilMessageType = "sendStkEventDownload"; message.rilMessageType = "sendStkEventDownload";
this.worker.postMessage(message); this.worker.postMessage(message);

Просмотреть файл

@ -536,6 +536,7 @@ this.BER_PROACTIVE_COMMAND_TAG = 0xd0;
this.BER_SMS_PP_DOWNLOAD_TAG = 0xd1; this.BER_SMS_PP_DOWNLOAD_TAG = 0xd1;
this.BER_MENU_SELECTION_TAG = 0xd3; this.BER_MENU_SELECTION_TAG = 0xd3;
this.BER_EVENT_DOWNLOAD_TAG = 0xd6; this.BER_EVENT_DOWNLOAD_TAG = 0xd6;
this.BER_TIMER_EXPIRATION_TAG = 0xd7;
// Flags in Comprehension TLV. // Flags in Comprehension TLV.
this.COMPREHENSIONTLV_FLAG_CR = 0x80; // Comprehension required. this.COMPREHENSIONTLV_FLAG_CR = 0x80; // Comprehension required.
@ -566,6 +567,8 @@ this.COMPREHENSIONTLV_TAG_TRANSACTION_ID = 0x1c;
this.COMPREHENSIONTLV_TAG_EVENT_LIST = 0x19; this.COMPREHENSIONTLV_TAG_EVENT_LIST = 0x19;
this.COMPREHENSIONTLV_TAG_ICON_ID = 0x1e; this.COMPREHENSIONTLV_TAG_ICON_ID = 0x1e;
this.COMPREHENSIONTLV_TAG_ICON_ID_LIST = 0x1f; this.COMPREHENSIONTLV_TAG_ICON_ID_LIST = 0x1f;
this.COMPREHENSIONTLV_TAG_TIMER_IDENTIFIER = 0x24;
this.COMPREHENSIONTLV_TAG_TIMER_VALUE = 0x25;
this.COMPREHENSIONTLV_TAG_DATE_TIME_ZONE = 0x26; this.COMPREHENSIONTLV_TAG_DATE_TIME_ZONE = 0x26;
this.COMPREHENSIONTLV_TAG_IMMEDIATE_RESPONSE = 0x2b; this.COMPREHENSIONTLV_TAG_IMMEDIATE_RESPONSE = 0x2b;
this.COMPREHENSIONTLV_TAG_LANGUAGE = 0x2d; this.COMPREHENSIONTLV_TAG_LANGUAGE = 0x2d;
@ -614,6 +617,7 @@ this.STK_CMD_GET_INPUT = 0x23;
this.STK_CMD_SELECT_ITEM = 0x24; this.STK_CMD_SELECT_ITEM = 0x24;
this.STK_CMD_SET_UP_MENU = 0x25; this.STK_CMD_SET_UP_MENU = 0x25;
this.STK_CMD_PROVIDE_LOCAL_INFO = 0x26; this.STK_CMD_PROVIDE_LOCAL_INFO = 0x26;
this.STK_CMD_TIMER_MANAGEMENT = 0x27;
this.STK_CMD_SET_UP_IDLE_MODE_TEXT = 0x28; this.STK_CMD_SET_UP_IDLE_MODE_TEXT = 0x28;
// STK Result code. // STK Result code.
@ -816,6 +820,11 @@ this.STK_LOCAL_INFO_MULTIPLE_ACCESS_TECH = 0x0E;
this.STK_LOCAL_INFO_INFO_FOR_MULTIPLE_ACCESS_TECH = 0x0F; this.STK_LOCAL_INFO_INFO_FOR_MULTIPLE_ACCESS_TECH = 0x0F;
this.STK_LOCAL_INFO_NMR_FOR_MULTIPLE_ACCESS_TECH = 0x10; this.STK_LOCAL_INFO_NMR_FOR_MULTIPLE_ACCESS_TECH = 0x10;
// Timer Management.
this.STK_TIMER_START = 0x00;
this.STK_TIMER_DEACTIVATE = 0x01;
this.STK_TMIER_GET_CURRENT_VALUE = 0x02;
/** /**
* Supported Terminal Facilities. * Supported Terminal Facilities.
* *
@ -827,7 +836,7 @@ this.STK_TERMINAL_SUPPORT_SMS_PP_DOWNLOAD = 1;
this.STK_TERMINAL_SUPPORT_CELL_BROADCAST_DATA_DOWNLOAD = 0; this.STK_TERMINAL_SUPPORT_CELL_BROADCAST_DATA_DOWNLOAD = 0;
this.STK_TERMINAL_SUPPORT_MENU_SELECTION = 1; this.STK_TERMINAL_SUPPORT_MENU_SELECTION = 1;
this.STK_TERMINAL_SUPPORT_SIM_DATA_DOWNLOAD_ERROR = 0; this.STK_TERMINAL_SUPPORT_SIM_DATA_DOWNLOAD_ERROR = 0;
this.STK_TERMINAL_SUPPORT_TIMER_EXPIRATION = 0; this.STK_TERMINAL_SUPPORT_TIMER_EXPIRATION = 1;
this.STK_TERMINAL_SUPPORT_USSD_IN_CALL_CONTROL = 0; this.STK_TERMINAL_SUPPORT_USSD_IN_CALL_CONTROL = 0;
this.STK_TERMINAL_SUPPORT_CALL_CONTROL_IN_REDIAL = 0; this.STK_TERMINAL_SUPPORT_CALL_CONTROL_IN_REDIAL = 0;
@ -867,8 +876,8 @@ this.STK_TERMINAL_SUPPORT_EVENT_USER_ACTIVITY = 0;
this.STK_TERMINAL_SUPPORT_EVENT_IDLE_SCREEN_AVAILABLE = 0; this.STK_TERMINAL_SUPPORT_EVENT_IDLE_SCREEN_AVAILABLE = 0;
this.STK_TERMINAL_SUPPORT_EVENT_CARD_READER_STATUS = 0; this.STK_TERMINAL_SUPPORT_EVENT_CARD_READER_STATUS = 0;
this.STK_TERMINAL_SUPPORT_PROACTIVE_TIMER_START_STOP = 0; this.STK_TERMINAL_SUPPORT_PROACTIVE_TIMER_START_STOP = 1;
this.STK_TERMINAL_SUPPORT_PROACTIVE_TIMER_GET_CURRENT = 0; this.STK_TERMINAL_SUPPORT_PROACTIVE_TIMER_GET_CURRENT = 1;
this.STK_TERMINAL_SUPPORT_PROACTIVE_LOCAL_INFO_DATE = 1; this.STK_TERMINAL_SUPPORT_PROACTIVE_LOCAL_INFO_DATE = 1;
this.STK_TERMINAL_SUPPORT_GET_INKEY = 1; this.STK_TERMINAL_SUPPORT_GET_INKEY = 1;
this.STK_TERMINAL_SUPPORT_SET_UP_IDLE_MODE_TEXT = 1; this.STK_TERMINAL_SUPPORT_SET_UP_IDLE_MODE_TEXT = 1;

Просмотреть файл

@ -63,6 +63,8 @@ const TLV_LOCATION_INFO_UMTS_SIZE = 11;
const TLV_IMEI_SIZE = 10; const TLV_IMEI_SIZE = 10;
const TLV_DATE_TIME_ZONE_SIZE = 9; const TLV_DATE_TIME_ZONE_SIZE = 9;
const TLV_LANGUAGE_SIZE = 4; const TLV_LANGUAGE_SIZE = 4;
const TLV_TIMER_IDENTIFIER = 3;
const TLV_TIMER_VALUE = 5;
const DEFAULT_EMERGENCY_NUMBERS = ["112", "911"]; const DEFAULT_EMERGENCY_NUMBERS = ["112", "911"];
@ -3364,6 +3366,7 @@ let RIL = {
* @param [optional] isYesNo * @param [optional] isYesNo
* @param [optional] hasConfirmed * @param [optional] hasConfirmed
* @param [optional] localInfo * @param [optional] localInfo
* @param [optional] timer
*/ */
sendStkTerminalResponse: function sendStkTerminalResponse(response) { sendStkTerminalResponse: function sendStkTerminalResponse(response) {
if (response.hasConfirmed !== undefined) { if (response.hasConfirmed !== undefined) {
@ -3407,6 +3410,12 @@ let RIL = {
(localInfo.date ? TLV_DATE_TIME_ZONE_SIZE : 0) + (localInfo.date ? TLV_DATE_TIME_ZONE_SIZE : 0) +
(localInfo.language ? TLV_LANGUAGE_SIZE : 0)) * 2); (localInfo.language ? TLV_LANGUAGE_SIZE : 0)) * 2);
} }
if (response.timer) {
let timer = response.timer;
size = size +
((timer.timerId ? TLV_TIMER_IDENTIFIER : 0) +
(timer.timerValue ? TLV_TIMER_VALUE : 0)) * 2;
}
Buf.writeUint32(size); Buf.writeUint32(size);
// Command Details // Command Details
@ -3525,6 +3534,21 @@ let RIL = {
} }
} }
// Timer
if (response.timer) {
let timer = response.timer;
if (timer.timerId) {
GsmPDUHelper.writeHexOctet(COMPREHENSIONTLV_TAG_TIMER_IDENTIFIER);
GsmPDUHelper.writeHexOctet(1);
GsmPDUHelper.writeHexOctet(timer.timerId);
}
if (timer.timerValue) {
ComprehensionTlvHelper.writeTimerValueTlv(timer.timerValue, false);
}
}
Buf.writeUint32(0); Buf.writeUint32(0);
Buf.sendParcel(); Buf.sendParcel();
}, },
@ -3544,6 +3568,22 @@ let RIL = {
this.sendICCEnvelopeCommand(command); this.sendICCEnvelopeCommand(command);
}, },
/**
* Send STK Envelope(Timer Expiration) command.
*
* @param timer
*/
sendStkTimerExpiration: function sendStkTimerExpiration(command) {
command.tag = BER_TIMER_EXPIRATION_TAG;
command.deviceId = {
sourceId: STK_DEVICE_ID_ME,
destinationId: STK_DEVICE_ID_SIM
};
command.timerId = command.timer.timerId;
command.timerValue = command.timer.timerValue;
this.sendICCEnvelopeCommand(command);
},
/** /**
* Send STK Envelope(Event Download) command. * Send STK Envelope(Event Download) command.
* @param event * @param event
@ -3598,6 +3638,8 @@ let RIL = {
* @param [optional] address * @param [optional] address
* @param [optional] transactionId * @param [optional] transactionId
* @param [optional] cause * @param [optional] cause
* @param [optional] timerId
* @param [optional] timerValue
*/ */
sendICCEnvelopeCommand: function sendICCEnvelopeCommand(options) { sendICCEnvelopeCommand: function sendICCEnvelopeCommand(options) {
if (DEBUG) { if (DEBUG) {
@ -3621,7 +3663,9 @@ let RIL = {
Math.ceil(options.address.length/2) + 1) + // Length of length field. Math.ceil(options.address.length/2) + 1) + // Length of length field.
Math.ceil(options.address.length/2) + 1 // address BCD + TON. Math.ceil(options.address.length/2) + 1 // address BCD + TON.
: 0) + : 0) +
(options.cause ? 4 : 0); (options.cause ? 4 : 0) +
(options.timerId ? TLV_TIMER_IDENTIFIER : 0) +
(options.timerValue ? TLV_TIMER_VALUE : 0);
let size = (2 + berLen) * 2; let size = (2 + berLen) * 2;
Buf.writeUint32(size); Buf.writeUint32(size);
@ -3698,6 +3742,19 @@ let RIL = {
ComprehensionTlvHelper.writeCauseTlv(options.cause); ComprehensionTlvHelper.writeCauseTlv(options.cause);
} }
// Timer Identifier
if (options.timerId) {
GsmPDUHelper.writeHexOctet(COMPREHENSIONTLV_TAG_TIMER_IDENTIFIER |
COMPREHENSIONTLV_FLAG_CR);
GsmPDUHelper.writeHexOctet(1);
GsmPDUHelper.writeHexOctet(options.timerId);
}
// Timer Value
if (options.timerValue) {
ComprehensionTlvHelper.writeTimerValueTlv(options.timerValue, true);
}
Buf.writeUint32(0); Buf.writeUint32(0);
Buf.sendParcel(); Buf.sendParcel();
}, },
@ -8199,6 +8256,9 @@ let StkCommandParamsFactory = {
case STK_CMD_PLAY_TONE: case STK_CMD_PLAY_TONE:
param = this.processPlayTone(cmdDetails, ctlvs); param = this.processPlayTone(cmdDetails, ctlvs);
break; break;
case STK_CMD_TIMER_MANAGEMENT:
param = this.processTimerManagement(cmdDetails, ctlvs);
break;
default: default:
debug("unknown proactive command"); debug("unknown proactive command");
break; break;
@ -8572,6 +8632,26 @@ let StkCommandParamsFactory = {
localInfoType: cmdDetails.commandQualifier localInfoType: cmdDetails.commandQualifier
}; };
return provideLocalInfo; return provideLocalInfo;
},
processTimerManagement: function processTimerManagement(cmdDetails, ctlvs) {
let timer = {
timerAction: cmdDetails.commandQualifier
};
let ctlv = StkProactiveCmdHelper.searchForTag(
COMPREHENSIONTLV_TAG_TIMER_IDENTIFIER, ctlvs);
if (ctlv) {
timer.timerId = ctlv.value.timerId;
}
ctlv = StkProactiveCmdHelper.searchForTag(
COMPREHENSIONTLV_TAG_TIMER_VALUE, ctlvs);
if (ctlv) {
timer.timerValue = ctlv.value.timerValue;
}
return timer;
} }
}; };
@ -8604,6 +8684,10 @@ let StkProactiveCmdHelper = {
return this.retrieveDefaultText(length); return this.retrieveDefaultText(length);
case COMPREHENSIONTLV_TAG_EVENT_LIST: case COMPREHENSIONTLV_TAG_EVENT_LIST:
return this.retrieveEventList(length); return this.retrieveEventList(length);
case COMPREHENSIONTLV_TAG_TIMER_IDENTIFIER:
return this.retrieveTimerId(length);
case COMPREHENSIONTLV_TAG_TIMER_VALUE:
return this.retrieveTimerValue(length);
case COMPREHENSIONTLV_TAG_IMMEDIATE_RESPONSE: case COMPREHENSIONTLV_TAG_IMMEDIATE_RESPONSE:
return this.retrieveImmediaResponse(length); return this.retrieveImmediaResponse(length);
case COMPREHENSIONTLV_TAG_URL: case COMPREHENSIONTLV_TAG_URL:
@ -8860,6 +8944,40 @@ let StkProactiveCmdHelper = {
}; };
}, },
/**
* Timer Identifier.
*
* | Byte | Description | Length |
* | 1 | Timer Identifier Tag | 1 |
* | 2 | Length = 01 | 1 |
* | 3 | Timer Identifier | 1 |
*/
retrieveTimerId: function retrieveTimerId(length) {
let id = {
timerId: GsmPDUHelper.readHexOctet()
};
return id;
},
/**
* Timer Value.
*
* | Byte | Description | Length |
* | 1 | Timer Value Tag | 1 |
* | 2 | Length = 03 | 1 |
* | 3 | Hour | 1 |
* | 4 | Minute | 1 |
* | 5 | Second | 1 |
*/
retrieveTimerValue: function retrieveTimerValue(length) {
let value = {
timerValue: (GsmPDUHelper.readSwappedNibbleBcdNum(1) * 60 * 60) +
(GsmPDUHelper.readSwappedNibbleBcdNum(1) * 60) +
(GsmPDUHelper.readSwappedNibbleBcdNum(1))
};
return value;
},
/** /**
* Immediate Response. * Immediate Response.
* *
@ -9116,6 +9234,26 @@ let ComprehensionTlvHelper = {
PDU_NL_LOCKING_SHIFT_TABLES[PDU_NL_IDENTIFIER_DEFAULT].indexOf(language[1])); PDU_NL_LOCKING_SHIFT_TABLES[PDU_NL_IDENTIFIER_DEFAULT].indexOf(language[1]));
}, },
/**
* Write Timer Value Comprehension TLV.
*
* @param seconds length of time during of the timer.
* @param cr Comprehension Required or not
*/
writeTimerValueTlv: function writeTimerValueTlv(seconds, cr) {
GsmPDUHelper.writeHexOctet(COMPREHENSIONTLV_TAG_TIMER_VALUE |
(cr ? COMPREHENSIONTLV_FLAG_CR : 0));
GsmPDUHelper.writeHexOctet(3);
// TS 102.223, clause 8.38
// +----------------+------------------+-------------------+
// | hours (1 byte) | minutes (1 btye) | secounds (1 byte) |
// +----------------+------------------+-------------------+
GsmPDUHelper.writeSwappedNibbleBCDNum(Math.floor(seconds / 60 / 60));
GsmPDUHelper.writeSwappedNibbleBCDNum(Math.floor(seconds / 60) % 60);
GsmPDUHelper.writeSwappedNibbleBCDNum(seconds % 60);
},
getSizeOfLengthOctets: function getSizeOfLengthOctets(length) { getSizeOfLengthOctets: function getSizeOfLengthOctets(length) {
if (length >= 0x10000) { if (length >= 0x10000) {
return 4; // 0x83, len_1, len_2, len_3 return 4; // 0x83, len_1, len_2, len_3