gecko-dev/dom/icc/gonk/StkCmdFactory.js

1617 lines
51 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
var RIL = {};
Cu.import("resource://gre/modules/ril_consts.js", RIL);
const GONK_STKCMDFACTORY_CONTRACTID = "@mozilla.org/icc/stkcmdfactory;1";
const GONK_STKCMDFACTORY_CID = Components.ID("{7a663440-e336-11e4-8fd5-c3140a7ff307}");
/**
* Helper Utilities to convert JS Objects to IDL Objects.
*/
/**
* To map { timeUnit, timeInterval } into StkDuration.
*/
function mapDurationToStkDuration(aDuration) {
return (aDuration)
? new StkDuration(aDuration.timeUnit, aDuration.timeInterval)
: null;
}
/**
* To map { iconSelfExplanatory, icons } into StkIconInfo.
*/
function mapIconInfoToStkIconInfo(aIconInfo) {
let mapIconToStkIcon = function(aIcon) {
return new StkIcon(aIcon.width, aIcon.height,
aIcon.codingScheme, aIcon.pixels);
};
return (aIconInfo &&
aIconInfo.icons !== undefined &&
aIconInfo.iconSelfExplanatory !== undefined)
? new StkIconInfo(aIconInfo.iconSelfExplanatory,
aIconInfo.icons.map(mapIconToStkIcon))
: null;
}
/**
* Helper Utilities to append the STK attributes to System Message.
*/
function appendDuration(aTarget, aStkDuration) {
aTarget.timeUnit = aStkDuration.timeUnit;
aTarget.timeInterval = aStkDuration.timeInterval;
}
function appendIconInfo(aTarget, aStkIconInfo) {
aTarget.iconSelfExplanatory = aStkIconInfo.iconSelfExplanatory;
aTarget.icons = aStkIconInfo.getIcons().map(function(aStkIcon) {
return {
width: aStkIcon.width,
height: aStkIcon.height,
codingScheme: RIL.ICC_IMG_CODING_SCHEME_TO_GECKO[aStkIcon.codingScheme],
pixels: aStkIcon.getPixels()
};
});
}
/**
* The implementation of the data types used in variant types of
* StkProactiveCommand, StkTerminalResponse, StkDownloadEvent.
*/
function StkDuration(aTimeUnit, aTimeInterval) {
this.timeUnit = aTimeUnit;
this.timeInterval = aTimeInterval;
}
StkDuration.prototype = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIStkDuration]),
// nsIStkDuration
timeUnit: 0,
timeInterval: 0
};
function StkIcon(aWidth, aHeight, aCodingScheme, aPixels) {
this.width = aWidth;
this.height = aHeight;
this.codingScheme = this.IMG_CODING_SCHEME[aCodingScheme];
this.pixels = aPixels.slice();
}
StkIcon.prototype = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIStkIcon]),
// Cache pixels for getPixels()
pixels: null,
// Scheme mapping.
IMG_CODING_SCHEME: {
"basic": Ci.nsIStkIcon.CODING_SCHEME_BASIC,
"color": Ci.nsIStkIcon.CODING_SCHEME_COLOR,
"color-transparency": Ci.nsIStkIcon.CODING_SCHEME_COLOR_TRANSPARENCY
},
// StkIcon
width: 0,
height: 0,
codingScheme: 0,
getPixels: function(aCount) {
if (!this.pixels) {
if (aCount) {
aCount.value = 0;
}
return null;
}
if (aCount) {
aCount.value = this.pixels.length;
}
return this.pixels.slice();
}
};
function StkIconInfo(aIconSelfExplanatory, aStkIcons) {
this.iconSelfExplanatory = aIconSelfExplanatory;
this.icons = aStkIcons;
}
StkIconInfo.prototype = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIStkIconInfo]),
// Cache the list of StkIcon(s) for getIcons()
icons: null,
// nsIStkIconInfo
iconSelfExplanatory: false,
getIcons: function(aCount) {
if (!this.icons) {
if (aCount) {
aCount.value = 0;
}
return null;
}
if (aCount) {
aCount.value = this.icons.length;
}
return this.icons.slice();
}
};
function StkItem(aIdentifier, aText, aStkIconInfo) {
this.identifier = aIdentifier;
if (aText !== undefined) {
this.text = aText;
}
this.iconInfo = aStkIconInfo;
}
StkItem.prototype = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIStkItem]),
// nsIStkItem
identifier: 0,
text: null,
iconInfo: null
};
function StkTimer(aTimerId, aTimerValue, aTimerAction) {
this.timerId = aTimerId;
if (aTimerValue !== undefined &&
aTimerValue !== null) {
this.timerValue = aTimerValue;
}
this.timerAction = aTimerAction;
}
StkTimer.prototype = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIStkTimer]),
// nsIStkTimer
timerId: 0,
timerValue: Ci.nsIStkTimer.TIMER_VALUE_INVALID,
timerAction: Ci.nsIStkTimer.TIMER_ACTION_INVALID
};
function StkLocationInfo(aMcc, aMnc, aGsmLocationAreaCode, aGsmCellId) {
this.mcc = aMcc;
this.mnc = aMnc;
this.gsmLocationAreaCode = aGsmLocationAreaCode;
this.gsmCellId = aGsmCellId;
}
StkLocationInfo.prototype = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIStkLocationInfo]),
// nsIStkLocationInfo
mcc: null,
mnc: null,
gsmLocationAreaCode: -1,
gsmCellId: -1
};
/**
* The implementation of nsIStkProactiveCommand set and paired JS object set.
*/
function StkProactiveCommand(aCommandDetails) {
this.commandNumber = aCommandDetails.commandNumber;
this.typeOfCommand = aCommandDetails.typeOfCommand;
this.commandQualifier = aCommandDetails.commandQualifier;
}
StkProactiveCommand.prototype = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIStkProactiveCmd]),
// nsIStkProactiveCmd
commandNumber: 0,
typeOfCommand: 0,
commandQualifier: 0
};
function StkCommandMessage(aStkProactiveCmd) {
this.commandNumber = aStkProactiveCmd.commandNumber;
this.typeOfCommand = aStkProactiveCmd.typeOfCommand;
this.commandQualifier = aStkProactiveCmd.commandQualifier;
}
StkCommandMessage.prototype = {
commandNumber: 0,
typeOfCommand: 0,
commandQualifier: 0,
options: null
};
function StkPollIntervalCmd(aCommandDetails) {
// Call |StkProactiveCommand| constructor.
StkProactiveCommand.call(this, aCommandDetails);
this.duration = mapDurationToStkDuration(aCommandDetails.options);
}
StkPollIntervalCmd.prototype = Object.create(StkProactiveCommand.prototype, {
QueryInterface: {
value: XPCOMUtils.generateQI([Ci.nsIStkProactiveCmd,
Ci.nsIStkPollIntervalCmd])
},
// nsIStkPollIntervalCmd
duration: { value: null, writable: true }
});
function StkPollIntervalMessage(aStkPollIntervalCmd) {
// Call |StkCommandMessage| constructor.
StkCommandMessage.call(this, aStkPollIntervalCmd);
this.options = {};
appendDuration(this.options, aStkPollIntervalCmd.duration);
}
StkPollIntervalMessage.prototype = Object.create(StkCommandMessage.prototype);
function StkProvideLocalInfoCmd(aCommandDetails) {
// Call |StkProactiveCommand| constructor.
StkProactiveCommand.call(this, aCommandDetails);
this.localInfoType = aCommandDetails.options.localInfoType;
}
StkProvideLocalInfoCmd.prototype = Object.create(StkProactiveCommand.prototype, {
QueryInterface: {
value: XPCOMUtils.generateQI([Ci.nsIStkProactiveCmd,
Ci.nsIStkProvideLocalInfoCmd])
},
// nsIStkPollIntervalCmd
localInfoType: { value: 0x00, writable: true }
});
function StkProvideLocalInfoMessage(aStkProvideLocalInfoCmd) {
// Call |StkCommandMessage| constructor.
StkCommandMessage.call(this, aStkProvideLocalInfoCmd);
this.options = {
localInfoType: aStkProvideLocalInfoCmd.localInfoType
};
}
StkProvideLocalInfoMessage.prototype = Object.create(StkCommandMessage.prototype);
function StkSetupEventListCmd(aCommandDetails) {
// Call |StkProactiveCommand| constructor.
StkProactiveCommand.call(this, aCommandDetails);
let eventList = aCommandDetails.options.eventList;
if (eventList) {
this.eventList = eventList.slice();
}
}
StkSetupEventListCmd.prototype = Object.create(StkProactiveCommand.prototype, {
QueryInterface: {
value: XPCOMUtils.generateQI([Ci.nsIStkProactiveCmd,
Ci.nsIStkSetupEventListCmd])
},
// Cache eventList for getEventList()
eventList: { value: null, writable: true },
// nsIStkSetupEventListCmd
getEventList: {
value: function(aCount) {
if (!this.eventList) {
if (aCount) {
aCount.value = 0;
}
return null;
}
if (aCount) {
aCount.value = this.eventList.length;
}
return this.eventList.slice();
}
}
});
function StkSetupEventListMessage(aStkSetupEventListCmd) {
// Call |StkCommandMessage| constructor.
StkCommandMessage.call(this, aStkSetupEventListCmd);
this.options = {
eventList: null
};
let eventList = aStkSetupEventListCmd.getEventList();
if (eventList && eventList.length > 0) {
this.options.eventList = eventList;
}
}
StkSetupEventListMessage.prototype = Object.create(StkCommandMessage.prototype);
function StkSetUpMenuCmd(aCommandDetails) {
// Call |StkProactiveCommand| constructor.
StkProactiveCommand.call(this, aCommandDetails);
let options = aCommandDetails.options;
if (options.title !== undefined) {
this.title = options.title;
}
this.items = options.items.map(function(aItem) {
// For |SET-UP MENU|, the 1st item in |aItems| could be null as an
// indication to the ME to remove the existing menu from the menu
// system in the ME.
return (aItem) ? new StkItem(aItem.identifier,
aItem.text,
mapIconInfoToStkIconInfo(aItem))
: null;
});
if (options.nextActionList) {
this.nextActionList = options.nextActionList.slice();
}
this.iconInfo = mapIconInfoToStkIconInfo(options);
this.isHelpAvailable = !!(options.isHelpAvailable);
}
StkSetUpMenuCmd.prototype = Object.create(StkProactiveCommand.prototype, {
QueryInterface: {
value: XPCOMUtils.generateQI([Ci.nsIStkProactiveCmd,
Ci.nsIStkSetUpMenuCmd])
},
// Cache items for getItems()
items: { value: null, writable: true },
// Cache items for getNextActionList()
nextActionList: { value: null, writable: true },
// nsIStkSetUpMenuCmd
title: { value: null, writable: true },
getItems: {
value: function(aCount) {
if (!this.items) {
if (aCount) {
aCount.value = 0;
}
return null;
}
if (aCount) {
aCount.value = this.items.length;
}
return this.items.slice();
}
},
getNextActionList: {
value: function(aCount) {
if (!this.nextActionList) {
if (aCount) {
aCount.value = 0;
}
return null;
}
if (aCount) {
aCount.value = this.nextActionList.length;
}
return this.nextActionList.slice();
}
},
iconInfo: { value: null, writable: true },
isHelpAvailable: { value: false, writable: true }
});
function StkSetUpMenuMessage(aStkSetUpMenuCmd) {
// Call |StkCommandMessage| constructor.
StkCommandMessage.call(this, aStkSetUpMenuCmd);
this.options = {
items: aStkSetUpMenuCmd.getItems().map(function(aStkItem) {
if (!aStkItem) {
return null;
}
let item = {
identifier: aStkItem.identifier,
text: aStkItem.text
};
if (aStkItem.iconInfo) {
appendIconInfo(item, aStkItem.iconInfo);
}
return item;
}),
isHelpAvailable: aStkSetUpMenuCmd.isHelpAvailable,
title: aStkSetUpMenuCmd.title
};
let nextActionList = aStkSetUpMenuCmd.getNextActionList();
if (nextActionList && nextActionList.length > 0) {
this.options.nextActionList = nextActionList;
}
if (aStkSetUpMenuCmd.iconInfo) {
appendIconInfo(this.options, aStkSetUpMenuCmd.iconInfo);
}
}
StkSetUpMenuMessage.prototype = Object.create(StkCommandMessage.prototype);
function StkSelectItemCmd(aCommandDetails) {
// Call |StkSetUpMenuCmd| constructor.
StkSetUpMenuCmd.call(this, aCommandDetails);
let options = aCommandDetails.options;
this.presentationType = options.presentationType;
if (options.defaultItem !== undefined &&
options.defaultItem !== null) {
this.defaultItem = options.defaultItem;
}
}
StkSelectItemCmd.prototype = Object.create(StkSetUpMenuCmd.prototype, {
QueryInterface: {
value: XPCOMUtils.generateQI([Ci.nsIStkProactiveCmd,
Ci.nsIStkSetUpMenuCmd,
Ci.nsIStkSelectItemCmd])
},
// nsIStkSelectItemCmd
presentationType: {
value: 0,
writable: true
},
defaultItem: {
value: Ci.nsIStkSelectItemCmd.DEFAULT_ITEM_INVALID,
writable: true
}
});
function StkSelectItemMessage(aStkSelectItemCmd) {
// Call |StkSetUpMenuMessage| constructor.
StkSetUpMenuMessage.call(this, aStkSelectItemCmd);
this.options.presentationType = aStkSelectItemCmd.presentationType;
if (aStkSelectItemCmd.defaultItem !== Ci.nsIStkSelectItemCmd.DEFAULT_ITEM_INVALID) {
this.options.defaultItem = aStkSelectItemCmd.defaultItem;
}
}
StkSelectItemMessage.prototype = Object.create(StkSetUpMenuMessage.prototype);
function StkTextMessageCmd(aCommandDetails) {
// Call |StkProactiveCommand| constructor.
StkProactiveCommand.call(this, aCommandDetails);
let options = aCommandDetails.options;
if (options.text !== undefined) {
this.text = options.text;
}
this.iconInfo = mapIconInfoToStkIconInfo(options);
}
StkTextMessageCmd.prototype = Object.create(StkProactiveCommand.prototype, {
QueryInterface: {
value: XPCOMUtils.generateQI([Ci.nsIStkProactiveCmd,
Ci.nsIStkTextMessageCmd])
},
// nsIStkTextMessageCmd
text: { value: null, writable: true },
iconInfo: { value: null, writable: true }
});
function StkTextMessage(aStkTextMessageCmd) {
// Call |StkCommandMessage| constructor.
StkCommandMessage.call(this, aStkTextMessageCmd);
this.options = {
text: aStkTextMessageCmd.text
};
if (aStkTextMessageCmd.iconInfo) {
appendIconInfo(this.options, aStkTextMessageCmd.iconInfo);
}
}
StkTextMessage.prototype = Object.create(StkCommandMessage.prototype);
function StkDisplayTextCmd(aCommandDetails) {
// Call |StkTextMessageCmd| constructor.
StkTextMessageCmd.call(this, aCommandDetails);
let options = aCommandDetails.options;
this.duration = mapDurationToStkDuration(options.duration);
this.isHighPriority = !!(options.isHighPriority);
this.userClear = !!(options.userClear);
this.responseNeeded = !!(options.responseNeeded);
}
StkDisplayTextCmd.prototype = Object.create(StkTextMessageCmd.prototype, {
QueryInterface: {
value: XPCOMUtils.generateQI([Ci.nsIStkProactiveCmd,
Ci.nsIStkTextMessageCmd,
Ci.nsIStkDisplayTextCmd])
},
// nsIStkDisplayTextCmd
duration: { value: null, writable: true },
isHighPriority: { value: false, writable: true },
userClear: { value: false, writable: true },
responseNeeded: { value: false, writable: true }
});
function StkDisplayTextMessage(aStkDisplayTextCmd) {
// Call |StkTextMessage| constructor.
StkTextMessage.call(this, aStkDisplayTextCmd);
this.options.isHighPriority = aStkDisplayTextCmd.isHighPriority;
this.options.userClear = aStkDisplayTextCmd.userClear;
this.options.responseNeeded = aStkDisplayTextCmd.responseNeeded;
if (aStkDisplayTextCmd.duration) {
this.options.duration = {};
appendDuration(this.options.duration, aStkDisplayTextCmd.duration);
}
}
StkDisplayTextMessage.prototype = Object.create(StkTextMessage.prototype);
function StkInputCmd(aCommandDetails) {
// Call |StkProactiveCommand| constructor.
StkProactiveCommand.call(this, aCommandDetails);
let options = aCommandDetails.options;
if (options.text !== undefined) {
this.text = options.text;
}
this.duration = mapDurationToStkDuration(options.duration);
if (options.defaultText !== undefined) {
this.defaultText = options.defaultText;
}
this.isAlphabet = !!(options.isAlphabet);
this.isUCS2 = !!(options.isUCS2);
this.isHelpAvailable = !!(options.isHelpAvailable);
this.iconInfo = mapIconInfoToStkIconInfo(options);
}
StkInputCmd.prototype = Object.create(StkProactiveCommand.prototype, {
QueryInterface: {
value: XPCOMUtils.generateQI([Ci.nsIStkProactiveCmd,
Ci.nsIStkInputCmd])
},
// nsIStkInputCmd
text: { value: null, writable: true },
duration: { value: null, writable: true },
minLength: { value: 1, writable: true },
maxLength: { value: 1, writable: true },
defaultText: { value: null, writable: true },
isAlphabet: { value: false, writable: true },
isUCS2: { value: false, writable: true },
isHelpAvailable: { value: false, writable: true },
iconInfo: { value: null, writable: true }
});
function StkInputMessage(aStkInputCmd) {
// Call |StkCommandMessage| constructor.
StkCommandMessage.call(this, aStkInputCmd);
this.options = {
text: aStkInputCmd.text,
minLength: aStkInputCmd.minLength,
maxLength: aStkInputCmd.maxLength,
isAlphabet: aStkInputCmd.isAlphabet,
isUCS2: aStkInputCmd.isUCS2,
isHelpAvailable: aStkInputCmd.isHelpAvailable,
defaultText: aStkInputCmd.defaultText
};
if (aStkInputCmd.duration) {
this.options.duration = {};
appendDuration(this.options.duration, aStkInputCmd.duration);
}
if (aStkInputCmd.iconInfo) {
appendIconInfo(this.options, aStkInputCmd.iconInfo);
}
}
StkInputMessage.prototype = Object.create(StkCommandMessage.prototype);
function StkInputKeyCmd(aCommandDetails) {
// Call |StkInputCmd| constructor.
StkInputCmd.call(this, aCommandDetails);
let options = aCommandDetails.options;
// Note: For STK_CMD_INKEY,
// this.minLength = this.maxLength = 1;
this.isYesNoRequested = !!(options.isYesNoRequested);
}
StkInputKeyCmd.prototype = Object.create(StkInputCmd.prototype, {
QueryInterface: {
value: XPCOMUtils.generateQI([Ci.nsIStkProactiveCmd,
Ci.nsIStkInputCmd,
Ci.nsIStkInputKeyCmd])
},
// nsIStkInputKeyCmd
isYesNoRequested: { value: false, writable: true }
});
function StkInputKeyMessage(aStkInputKeyCmd) {
// Call |StkInputMessage| constructor.
StkInputMessage.call(this, aStkInputKeyCmd);
this.options.isYesNoRequested = aStkInputKeyCmd.isYesNoRequested;
}
StkInputKeyMessage.prototype = Object.create(StkInputMessage.prototype);
function StkInputTextCmd(aCommandDetails) {
// Call |StkInputCmd| constructor.
StkInputCmd.call(this, aCommandDetails);
let options = aCommandDetails.options;
this.minLength = options.minLength;
this.maxLength = options.maxLength;
this.hideInput = !!(options.hideInput);
this.isPacked = !!(options.isPacked);
}
StkInputTextCmd.prototype = Object.create(StkInputCmd.prototype, {
QueryInterface: {
value: XPCOMUtils.generateQI([Ci.nsIStkProactiveCmd,
Ci.nsIStkInputCmd,
Ci.nsIStkInputTextCmd])
},
// nsIStkInputTextCmd
hideInput: { value: false, writable: true },
isPacked: { value: false, writable: true }
});
function StkInputTextMessage(aStkInputTextCmd) {
// Call |StkInputMessage| constructor.
StkInputMessage.call(this, aStkInputTextCmd);
this.options.hideInput = aStkInputTextCmd.hideInput;
this.options.isPacked = aStkInputTextCmd.isPacked;
}
StkInputTextMessage.prototype = Object.create(StkInputMessage.prototype);
function StkSetUpCallCmd(aCommandDetails) {
// Call |StkProactiveCommand| constructor.
StkProactiveCommand.call(this, aCommandDetails);
let options = aCommandDetails.options;
let confirmMessage = options.confirmMessage;
let callMessage = options.callMessage;
this.address = options.address;
if(confirmMessage) {
if (confirmMessage.text !== undefined) {
this.confirmText = confirmMessage.text;
}
this.confirmIconInfo = mapIconInfoToStkIconInfo(confirmMessage);
}
if(callMessage) {
if (callMessage.text !== undefined) {
this.callText = callMessage.text;
}
this.callIconInfo = mapIconInfoToStkIconInfo(callMessage);
}
this.duration = mapDurationToStkDuration(options.duration);
}
StkSetUpCallCmd.prototype = Object.create(StkProactiveCommand.prototype, {
QueryInterface: {
value: XPCOMUtils.generateQI([Ci.nsIStkProactiveCmd,
Ci.nsIStkSetUpCallCmd])
},
// nsIStkSetUpCallCmd
address: { value: null, writable: true },
confirmText: { value: null, writable: true },
confirmIconInfo: { value: null, writable: true },
callText: { value: null, writable: true },
callIconInfo: { value: null, writable: true },
duration: { value: null, writable: true }
});
function StkSetUpCallMessage(aStkSetUpCallCmd) {
// Call |StkCommandMessage| constructor.
StkCommandMessage.call(this, aStkSetUpCallCmd);
this.options = {
address: aStkSetUpCallCmd.address
};
if (aStkSetUpCallCmd.confirmText !== null ||
aStkSetUpCallCmd.confirmIconInfo) {
let confirmMessage = {
text: aStkSetUpCallCmd.confirmText
};
if (aStkSetUpCallCmd.confirmIconInfo) {
appendIconInfo(confirmMessage, aStkSetUpCallCmd.confirmIconInfo);
}
this.options.confirmMessage = confirmMessage;
}
if (aStkSetUpCallCmd.callText !== null ||
aStkSetUpCallCmd.callIconInfo) {
let callMessage = {
text: aStkSetUpCallCmd.callText
};
if (aStkSetUpCallCmd.callIconInfo) {
appendIconInfo(callMessage, aStkSetUpCallCmd.callIconInfo);
}
this.options.callMessage = callMessage;
}
if (aStkSetUpCallCmd.duration) {
this.options.duration = {};
appendDuration(this.options.duration, aStkSetUpCallCmd.duration);
}
}
StkSetUpCallMessage.prototype = Object.create(StkCommandMessage.prototype);
function StkBrowserSettingCmd(aCommandDetails) {
// Call |StkProactiveCommand| constructor.
StkProactiveCommand.call(this, aCommandDetails);
let options = aCommandDetails.options;
this.url = options.url;
this.mode = options.mode;
let confirmMessage = options.confirmMessage;
if(confirmMessage) {
if (confirmMessage.text !== undefined) {
this.confirmText = confirmMessage.text;
}
this.confirmIconInfo = mapIconInfoToStkIconInfo(confirmMessage);
}
}
StkBrowserSettingCmd.prototype = Object.create(StkProactiveCommand.prototype, {
QueryInterface: {
value: XPCOMUtils.generateQI([Ci.nsIStkProactiveCmd,
Ci.nsIStkBrowserSettingCmd])
},
// nsIStkBrowserSettingCmd
url: { value: null, writable: true },
mode: { value: 0, writable: true },
confirmText: { value: null, writable: true },
confirmIconInfo: { value: null, writable: true }
});
function StkBrowserSettingMessage(aStkBrowserSettingCmd) {
// Call |StkCommandMessage| constructor.
StkCommandMessage.call(this, aStkBrowserSettingCmd);
this.options = {
url: aStkBrowserSettingCmd.url,
mode: aStkBrowserSettingCmd.mode
};
if (aStkBrowserSettingCmd.confirmText !== null ||
aStkBrowserSettingCmd.confirmIconInfo) {
let confirmMessage = {
text: aStkBrowserSettingCmd.confirmText
};
if (aStkBrowserSettingCmd.confirmIconInfo) {
appendIconInfo(confirmMessage, aStkBrowserSettingCmd.confirmIconInfo);
}
this.options.confirmMessage = confirmMessage;
}
}
StkBrowserSettingMessage.prototype = Object.create(StkCommandMessage.prototype);
function StkPlayToneCmd(aCommandDetails) {
// Call |StkProactiveCommand| constructor.
StkProactiveCommand.call(this, aCommandDetails);
let options = aCommandDetails.options;
if(options.text !== undefined) {
this.text = options.text;
}
if (options.tone !== undefined &&
options.tone !== null) {
this.tone = options.tone;
}
if (options.isVibrate) {
this.isVibrate = true;
}
this.duration = mapDurationToStkDuration(options.duration);
this.iconInfo = mapIconInfoToStkIconInfo(options);
}
StkPlayToneCmd.prototype = Object.create(StkProactiveCommand.prototype, {
QueryInterface: {
value: XPCOMUtils.generateQI([Ci.nsIStkProactiveCmd,
Ci.nsIStkPlayToneCmd])
},
// nsIStkPlayToneCmd
text: { value: null, writable: true },
tone: { value: Ci.nsIStkPlayToneCmd.TONE_TYPE_INVALID, writable: true },
duration: { value: null, writable: true },
isVibrate: { value: false, writable: true },
iconInfo: { value: null, writable: true }
});
function StkPlayToneMessage(aStkPlayToneCmd) {
// Call |StkCommandMessage| constructor.
StkCommandMessage.call(this, aStkPlayToneCmd);
this.options = {
isVibrate: aStkPlayToneCmd.isVibrate,
text: aStkPlayToneCmd.text
};
if (aStkPlayToneCmd.tone != Ci.nsIStkPlayToneCmd.TONE_TYPE_INVALID) {
this.options.tone = aStkPlayToneCmd.tone;
}
if (aStkPlayToneCmd.duration) {
this.options.duration = {};
appendDuration(this.options.duration, aStkPlayToneCmd.duration);
}
if (aStkPlayToneCmd.iconInfo) {
appendIconInfo(this.options, aStkPlayToneCmd.iconInfo);
}
}
StkPlayToneMessage.prototype = Object.create(StkCommandMessage.prototype);
function StkTimerManagementCmd(aCommandDetails) {
// Call |StkProactiveCommand| constructor.
StkProactiveCommand.call(this, aCommandDetails);
let options = aCommandDetails.options;
this.timerInfo = new StkTimer(options.timerId,
options.timerValue,
options.timerAction);
}
StkTimerManagementCmd.prototype = Object.create(StkProactiveCommand.prototype, {
QueryInterface: {
value: XPCOMUtils.generateQI([Ci.nsIStkProactiveCmd,
Ci.nsIStkTimerManagementCmd])
},
// nsIStkTimerManagementCmd
timerInfo: { value: null, writable: true }
});
function StkTimerMessage(aStkTimerManagementCmd) {
// Call |StkCommandMessage| constructor.
StkCommandMessage.call(this, aStkTimerManagementCmd);
let timerInfo = aStkTimerManagementCmd.timerInfo;
this.options = {
timerId: timerInfo.timerId,
timerAction: timerInfo.timerAction
};
if (timerInfo.timerValue !== Ci.nsIStkTimer.TIMER_VALUE_INVALID) {
this.options.timerValue = timerInfo.timerValue;
}
}
StkTimerMessage.prototype = Object.create(StkCommandMessage.prototype);
/**
* Command Prototype Mappings.
*/
var CmdPrototypes = {};
CmdPrototypes[RIL.STK_CMD_REFRESH] = StkProactiveCommand;
CmdPrototypes[RIL.STK_CMD_POLL_INTERVAL] = StkPollIntervalCmd;
CmdPrototypes[RIL.STK_CMD_POLL_OFF] = StkProactiveCommand;
CmdPrototypes[RIL.STK_CMD_PROVIDE_LOCAL_INFO] = StkProvideLocalInfoCmd;
CmdPrototypes[RIL.STK_CMD_SET_UP_EVENT_LIST] = StkSetupEventListCmd;
CmdPrototypes[RIL.STK_CMD_SET_UP_MENU] = StkSetUpMenuCmd;
CmdPrototypes[RIL.STK_CMD_SELECT_ITEM] = StkSelectItemCmd;
CmdPrototypes[RIL.STK_CMD_DISPLAY_TEXT] = StkDisplayTextCmd;
CmdPrototypes[RIL.STK_CMD_SET_UP_IDLE_MODE_TEXT] = StkTextMessageCmd;
CmdPrototypes[RIL.STK_CMD_SEND_SS] = StkTextMessageCmd;
CmdPrototypes[RIL.STK_CMD_SEND_USSD] = StkTextMessageCmd;
CmdPrototypes[RIL.STK_CMD_SEND_SMS] = StkTextMessageCmd;
CmdPrototypes[RIL.STK_CMD_SEND_DTMF] = StkTextMessageCmd;
CmdPrototypes[RIL.STK_CMD_GET_INKEY] = StkInputKeyCmd;
CmdPrototypes[RIL.STK_CMD_GET_INPUT] = StkInputTextCmd;
CmdPrototypes[RIL.STK_CMD_SET_UP_CALL] = StkSetUpCallCmd;
CmdPrototypes[RIL.STK_CMD_LAUNCH_BROWSER] = StkBrowserSettingCmd;
CmdPrototypes[RIL.STK_CMD_PLAY_TONE] = StkPlayToneCmd;
CmdPrototypes[RIL.STK_CMD_TIMER_MANAGEMENT] = StkTimerManagementCmd;
CmdPrototypes[RIL.STK_CMD_OPEN_CHANNEL] = StkTextMessageCmd;
CmdPrototypes[RIL.STK_CMD_CLOSE_CHANNEL] = StkTextMessageCmd;
CmdPrototypes[RIL.STK_CMD_SEND_DATA] = StkTextMessageCmd;
CmdPrototypes[RIL.STK_CMD_RECEIVE_DATA] = StkTextMessageCmd;
/**
* Message Prototype Mappings.
*/
var MsgPrototypes = {};
MsgPrototypes[RIL.STK_CMD_REFRESH] = StkCommandMessage;
MsgPrototypes[RIL.STK_CMD_POLL_INTERVAL] = StkPollIntervalMessage;
MsgPrototypes[RIL.STK_CMD_POLL_OFF] = StkCommandMessage;
MsgPrototypes[RIL.STK_CMD_PROVIDE_LOCAL_INFO] = StkProvideLocalInfoMessage;
MsgPrototypes[RIL.STK_CMD_SET_UP_EVENT_LIST] = StkSetupEventListMessage;
MsgPrototypes[RIL.STK_CMD_SET_UP_MENU] = StkSetUpMenuMessage;
MsgPrototypes[RIL.STK_CMD_SELECT_ITEM] = StkSelectItemMessage;
MsgPrototypes[RIL.STK_CMD_DISPLAY_TEXT] = StkDisplayTextMessage;
MsgPrototypes[RIL.STK_CMD_SET_UP_IDLE_MODE_TEXT] = StkTextMessage;
MsgPrototypes[RIL.STK_CMD_SEND_SS] = StkTextMessage;
MsgPrototypes[RIL.STK_CMD_SEND_USSD] = StkTextMessage;
MsgPrototypes[RIL.STK_CMD_SEND_SMS] = StkTextMessage;
MsgPrototypes[RIL.STK_CMD_SEND_DTMF] = StkTextMessage;
MsgPrototypes[RIL.STK_CMD_GET_INKEY] = StkInputKeyMessage;
MsgPrototypes[RIL.STK_CMD_GET_INPUT] = StkInputTextMessage;
MsgPrototypes[RIL.STK_CMD_SET_UP_CALL] = StkSetUpCallMessage;
MsgPrototypes[RIL.STK_CMD_LAUNCH_BROWSER] = StkBrowserSettingMessage;
MsgPrototypes[RIL.STK_CMD_PLAY_TONE] = StkPlayToneMessage;
MsgPrototypes[RIL.STK_CMD_TIMER_MANAGEMENT] = StkTimerMessage;
MsgPrototypes[RIL.STK_CMD_OPEN_CHANNEL] = StkTextMessage;
MsgPrototypes[RIL.STK_CMD_CLOSE_CHANNEL] = StkTextMessage;
MsgPrototypes[RIL.STK_CMD_SEND_DATA] = StkTextMessage;
MsgPrototypes[RIL.STK_CMD_RECEIVE_DATA] = StkTextMessage;
/**
* QueryInterface Mappings.
*/
var QueriedIFs = {};
QueriedIFs[RIL.STK_CMD_REFRESH] = Ci.nsIStkProactiveCmd;
QueriedIFs[RIL.STK_CMD_POLL_INTERVAL] = Ci.nsIStkPollIntervalCmd;
QueriedIFs[RIL.STK_CMD_POLL_OFF] = Ci.nsIStkProactiveCmd;
QueriedIFs[RIL.STK_CMD_PROVIDE_LOCAL_INFO] = Ci.nsIStkProvideLocalInfoCmd;
QueriedIFs[RIL.STK_CMD_SET_UP_EVENT_LIST] = Ci.nsIStkSetupEventListCmd;
QueriedIFs[RIL.STK_CMD_SET_UP_MENU] = Ci.nsIStkSetUpMenuCmd;
QueriedIFs[RIL.STK_CMD_SELECT_ITEM] = Ci.nsIStkSelectItemCmd;
QueriedIFs[RIL.STK_CMD_DISPLAY_TEXT] = Ci.nsIStkDisplayTextCmd;
QueriedIFs[RIL.STK_CMD_SET_UP_IDLE_MODE_TEXT] = Ci.nsIStkTextMessageCmd;
QueriedIFs[RIL.STK_CMD_SEND_SS] = Ci.nsIStkTextMessageCmd;
QueriedIFs[RIL.STK_CMD_SEND_USSD] = Ci.nsIStkTextMessageCmd;
QueriedIFs[RIL.STK_CMD_SEND_SMS] = Ci.nsIStkTextMessageCmd;
QueriedIFs[RIL.STK_CMD_SEND_DTMF] = Ci.nsIStkTextMessageCmd;
QueriedIFs[RIL.STK_CMD_GET_INKEY] = Ci.nsIStkInputKeyCmd;
QueriedIFs[RIL.STK_CMD_GET_INPUT] = Ci.nsIStkInputTextCmd;
QueriedIFs[RIL.STK_CMD_SET_UP_CALL] = Ci.nsIStkSetUpCallCmd;
QueriedIFs[RIL.STK_CMD_LAUNCH_BROWSER] = Ci.nsIStkBrowserSettingCmd;
QueriedIFs[RIL.STK_CMD_PLAY_TONE] = Ci.nsIStkPlayToneCmd;
QueriedIFs[RIL.STK_CMD_TIMER_MANAGEMENT] = Ci.nsIStkTimerManagementCmd;
QueriedIFs[RIL.STK_CMD_OPEN_CHANNEL] = Ci.nsIStkTextMessageCmd;
QueriedIFs[RIL.STK_CMD_CLOSE_CHANNEL] = Ci.nsIStkTextMessageCmd;
QueriedIFs[RIL.STK_CMD_SEND_DATA] = Ci.nsIStkTextMessageCmd;
QueriedIFs[RIL.STK_CMD_RECEIVE_DATA] = Ci.nsIStkTextMessageCmd;
/**
* The implementation of nsIStkTerminalResponse set and paired JS object set.
*/
function StkTerminalResponse(aResponseMessage) {
this.resultCode = aResponseMessage.resultCode;
if (aResponseMessage.additionalInformation != undefined) {
this.additionalInformation = aResponseMessage.additionalInformation;
}
}
StkTerminalResponse.prototype = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIStkTerminalResponse]),
// nsIStkTerminalResponse
resultCode: 0,
additionalInformation: Ci.nsIStkTerminalResponse.ADDITIONAL_INFO_INVALID
};
function StkResponseMessage(aStkTerminalResponse) {
this.resultCode = aStkTerminalResponse.resultCode;
if (aStkTerminalResponse.additionalInformation
!== Ci.nsIStkTerminalResponse.ADDITIONAL_INFO_INVALID) {
this.additionalInformation = aStkTerminalResponse.additionalInformation;
}
}
StkResponseMessage.prototype = {
resultCode: Ci.nsIStkTerminalResponse.RESULT_OK
};
function StkSelectItemResponse(aStkSelectItemResponseMessage) {
// Call |StkTerminalResponse| constructor.
StkTerminalResponse.call(this, aStkSelectItemResponseMessage);
this.itemIdentifier = aStkSelectItemResponseMessage.itemIdentifier;
}
StkSelectItemResponse.prototype = Object.create(StkTerminalResponse.prototype, {
QueryInterface: {
value: XPCOMUtils.generateQI([Ci.nsIStkTerminalResponse,
Ci.nsIStkSelectItemResponse])
},
// nsIStkSelectItemResponse
itemIdentifier: { value: 0, writable: true }
});
function StkSelectItemResponseMessage(aStkSelectItemResponse) {
// Call |StkResponseMessage| constructor.
StkResponseMessage.call(this, aStkSelectItemResponse);
this.itemIdentifier = aStkSelectItemResponse.itemIdentifier;
}
StkSelectItemResponseMessage.prototype = Object.create(StkResponseMessage.prototype);
function StkGetInputResponse(aStkGetInputResponseMessage) {
// Call |StkTerminalResponse| constructor.
StkTerminalResponse.call(this, aStkGetInputResponseMessage);
if (aStkGetInputResponseMessage.isYesNo !== undefined) {
this.isYesNo = (aStkGetInputResponseMessage.isYesNo)
? Ci.nsIStkGetInputResponse.YES
: Ci.nsIStkGetInputResponse.NO;
}
if (aStkGetInputResponseMessage.input !== undefined) {
// We expect input to be "" if user confirmed the input with nothing,
// and we use null to present 'undefined' internally for the conversion
// between nsIStkTerminalResponse and JS objects.
this.input = aStkGetInputResponseMessage.input || "";
}
}
StkGetInputResponse.prototype = Object.create(StkTerminalResponse.prototype, {
QueryInterface: {
value: XPCOMUtils.generateQI([Ci.nsIStkTerminalResponse,
Ci.nsIStkGetInputResponse])
},
// nsIStkGetInputResponse
isYesNo: { value: Ci.nsIStkGetInputResponse.YES_NO_INVALID, writable: true },
input: { value: null, writable: true }
});
function StkGetInputResponseMessage(aStkGetInputResponse) {
// Call |StkResponseMessage| constructor.
StkResponseMessage.call(this, aStkGetInputResponse);
if (aStkGetInputResponse.isYesNo !== Ci.nsIStkGetInputResponse.YES_NO_INVALID) {
this.isYesNo = !!aStkGetInputResponse.isYesNo;
}
if (aStkGetInputResponse.input !== null) {
this.input = aStkGetInputResponse.input;
}
}
StkGetInputResponseMessage.prototype = Object.create(StkResponseMessage.prototype);
function StkCallSetupResponse(aStkCallSetupResponseMessage) {
// Call |StkTerminalResponse| constructor.
StkTerminalResponse.call(this, aStkCallSetupResponseMessage);
this.hasConfirmed = !! aStkCallSetupResponseMessage.hasConfirmed;
}
StkCallSetupResponse.prototype = Object.create(StkTerminalResponse.prototype, {
QueryInterface: {
value: XPCOMUtils.generateQI([Ci.nsIStkTerminalResponse,
Ci.nsIStkCallSetupResponse])
},
// nsIStkCallSetupResponse
hasConfirmed: { value: false, writable: true }
});
function StkCallSetupResponseMessage(aStkCallSetupResponse) {
// Call |StkResponseMessage| constructor.
StkResponseMessage.call(this, aStkCallSetupResponse);
this.hasConfirmed = aStkCallSetupResponse.hasConfirmed;
}
StkCallSetupResponseMessage.prototype = Object.create(StkResponseMessage.prototype);
function StkLocalInfoResponse(aStkLocalInfoResponseMessage) {
// Call |StkTerminalResponse| constructor.
StkTerminalResponse.call(this, aStkLocalInfoResponseMessage);
let localInfo = aStkLocalInfoResponseMessage.localInfo;
if (localInfo.imei) {
this.imei = localInfo.imei;
return;
}
if (localInfo.locationInfo) {
let info = localInfo.locationInfo;
this.locationInfo = new StkLocationInfo(info.mcc,
info.mnc,
info.gsmLocationAreaCode,
info.gsmCellId);
return;
}
if (localInfo.date) {
if (localInfo.date instanceof Date) {
this.date = localInfo.date.getTime();
} else {
// JSON is adopted as our IPDL protocol, so Date object will be presented as
// a String in ISO8601 format by JSON.
// For the conversion between Date and JSON, please see:
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toJSON#Example:_Using_toJSON
this.date = new Date(localInfo.date).getTime();
}
return;
}
if (localInfo.language) {
this.language = localInfo.language;
return;
}
}
StkLocalInfoResponse.prototype = Object.create(StkTerminalResponse.prototype, {
QueryInterface: {
value: XPCOMUtils.generateQI([Ci.nsIStkTerminalResponse,
Ci.nsIStkLocalInfoResponse])
},
// nsIStkLocalInfoResponse
imei: { value: null, writable: true },
locationInfo: { value: null, writable: true },
date: { value: Ci.nsIStkLocalInfoResponse.DATE_INVALID, writable: true },
language: { value: null, writable: true },
});
function StkLocalInfoResponseMessage(aStkLocalInfoResponse) {
// Call |StkResponseMessage| constructor.
StkResponseMessage.call(this, aStkLocalInfoResponse);
let localInfo = this.localInfo = {};
if (aStkLocalInfoResponse.imei) {
localInfo.imei = aStkLocalInfoResponse.imei;
return;
}
if (aStkLocalInfoResponse.locationInfo) {
let srcInfo = aStkLocalInfoResponse.locationInfo;
let destInfo = localInfo.locationInfo = {};
destInfo.mcc = srcInfo.mcc;
destInfo.mnc = srcInfo.mnc;
destInfo.gsmLocationAreaCode = srcInfo.gsmLocationAreaCode;
destInfo.gsmCellId = srcInfo.gsmCellId;
return;
}
if (aStkLocalInfoResponse.date !== Ci.nsIStkLocalInfoResponse.DATE_INVALID) {
localInfo.date = new Date(aStkLocalInfoResponse.date);
return;
}
if (aStkLocalInfoResponse.language) {
localInfo.language = aStkLocalInfoResponse.language;
return;
}
}
StkLocalInfoResponseMessage.prototype = Object.create(StkResponseMessage.prototype);
function StkTimerResponse(aStkTimerResponseMessage) {
// Call |StkTerminalResponse| constructor.
StkTerminalResponse.call(this, aStkTimerResponseMessage);
let timer = aStkTimerResponseMessage.timer;
// timerAction is useless in Terminal Response,
// so we always set it to TIMER_ACTION_INVALID.
this.timer = new StkTimer(timer.timerId,
Math.floor(timer.timerValue),
Ci.nsIStkTimer.TIMER_ACTION_INVALID);
}
StkTimerResponse.prototype = Object.create(StkTerminalResponse.prototype, {
QueryInterface: {
value: XPCOMUtils.generateQI([Ci.nsIStkTerminalResponse,
Ci.nsIStkTimerResponse])
},
// nsIStkTimerResponse
timer: { value: null, writable: true }
});
function StkTimerResponseMessage(aStkTimerResponse) {
// Call |StkResponseMessage| constructor.
StkResponseMessage.call(this, aStkTimerResponse);
let timer = this.timer = {};
// timerAction is meaningless for terminal response.
timer.timerId = aStkTimerResponse.timer.timerId;
timer.timerValue = aStkTimerResponse.timer.timerValue;
}
StkTimerResponseMessage.prototype = Object.create(StkResponseMessage.prototype);
/**
* The implementation of nsIStkDownloadEvent set and paired JS object set.
*/
function StkDownloadEvent(aEventMessage) {
this.eventType = aEventMessage.eventType;
}
StkDownloadEvent.prototype = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIStkDownloadEvent]),
// nsIStkDownloadEvent
eventType: 0
};
function StkEventMessage(aStkDownloadEvent) {
this.eventType = aStkDownloadEvent.eventType;
}
StkEventMessage.prototype = {
eventType: 0
};
function StkLocationEvent(aStkLocationEventMessage) {
// Call |StkDownloadEvent| constructor.
StkDownloadEvent.call(this, aStkLocationEventMessage);
this.locationStatus = aStkLocationEventMessage.locationStatus;
if (this.locationStatus == Ci.nsIStkLocationEvent.SERVICE_STATE_NORMAL &&
aStkLocationEventMessage.locationInfo) {
let info = aStkLocationEventMessage.locationInfo;
this.locationInfo = new StkLocationInfo(info.mcc,
info.mnc,
info.gsmLocationAreaCode,
info.gsmCellId);
}
}
StkLocationEvent.prototype = Object.create(StkDownloadEvent.prototype, {
QueryInterface: {
value: XPCOMUtils.generateQI([Ci.nsIStkDownloadEvent,
Ci.nsIStkLocationEvent])
},
// nsIStkLocationEvent
locationStatus: { value: Ci.nsIStkLocationEvent.SERVICE_STATE_UNAVAILABLE, writable: true },
locationInfo: { value: null, writable: true }
});
function StkLocationEventMessage(aStkLocationEvent) {
// Call |StkEventMessage| constructor.
StkEventMessage.call(this, aStkLocationEvent);
this.locationStatus = aStkLocationEvent.locationStatus;
if (aStkLocationEvent.locationInfo) {
let info = aStkLocationEvent.locationInfo;
this.locationInfo = new StkLocationInfo(info.mcc,
info.mnc,
info.gsmLocationAreaCode,
info.gsmCellId);
}
}
StkLocationEventMessage.prototype = Object.create(StkEventMessage.prototype);
function StkCallEvent(aStkCallEventMessage) {
// Call |StkDownloadEvent| constructor.
StkDownloadEvent.call(this, aStkCallEventMessage);
if (aStkCallEventMessage.number) {
this.number = aStkCallEventMessage.number;
}
this.isIssuedByRemote = !!aStkCallEventMessage.isIssuedByRemote;
if (aStkCallEventMessage.error) {
this.error = aStkCallEventMessage.error;
}
}
StkCallEvent.prototype = Object.create(StkDownloadEvent.prototype, {
QueryInterface: {
value: XPCOMUtils.generateQI([Ci.nsIStkDownloadEvent,
Ci.nsIStkCallEvent])
},
// nsIStkCallEvent
number: { value: null, writable: true },
isIssuedByRemote: { value: false, writable: true },
error: { value: null, writable: true }
});
function StkCallEventMessage(aStkCallEvent) {
// Call |StkEventMessage| constructor.
StkEventMessage.call(this, aStkCallEvent);
this.number = aStkCallEvent.number;
this.isIssuedByRemote = aStkCallEvent.isIssuedByRemote;
this.error = aStkCallEvent.error;
}
StkCallEventMessage.prototype = Object.create(StkEventMessage.prototype);
function StkLanguageSelectionEvent(aStkLanguageSelectionEventMessage) {
// Call |StkDownloadEvent| constructor.
StkDownloadEvent.call(this, aStkLanguageSelectionEventMessage);
if (aStkLanguageSelectionEventMessage.language) {
this.language = aStkLanguageSelectionEventMessage.language;
}
}
StkLanguageSelectionEvent.prototype = Object.create(StkDownloadEvent.prototype, {
QueryInterface: {
value: XPCOMUtils.generateQI([Ci.nsIStkDownloadEvent,
Ci.nsIStkLanguageSelectionEvent])
},
// nsIStkLanguageSelectionEvent
language: { value: null, writable: true }
});
function StkLanguageSelectionEventMessage(aStkLanguageSelectionEvent) {
// Call |StkEventMessage| constructor.
StkEventMessage.call(this, aStkLanguageSelectionEvent);
this.language = aStkLanguageSelectionEvent.language;
}
StkLanguageSelectionEventMessage.prototype = Object.create(StkEventMessage.prototype);
function StkBrowserTerminationEvent(aStkBrowserTerminationEventMessage) {
// Call |StkDownloadEvent| constructor.
StkDownloadEvent.call(this, aStkBrowserTerminationEventMessage);
if (aStkBrowserTerminationEventMessage.terminationCause) {
this.terminationCause = aStkBrowserTerminationEventMessage.terminationCause;
}
}
StkBrowserTerminationEvent.prototype = Object.create(StkDownloadEvent.prototype, {
QueryInterface: {
value: XPCOMUtils.generateQI([Ci.nsIStkDownloadEvent,
Ci.nsIStkBrowserTerminationEvent])
},
// nsIStkBrowserTerminationEvent
terminationCause: { value: Ci.nsIStkBrowserTerminationEvent.BROWSER_TERMINATION_CAUSE_USER, writable: true }
});
function StkBrowserTerminationEventMessage(aStkBrowserTerminationEvent) {
// Call |StkEventMessage| constructor.
StkEventMessage.call(this, aStkBrowserTerminationEvent);
this.terminationCause = aStkBrowserTerminationEvent.terminationCause;
}
StkBrowserTerminationEventMessage.prototype = Object.create(StkEventMessage.prototype);
/**
* Event Prototype Mappings.
*/
var EventPrototypes = {};
EventPrototypes[RIL.STK_EVENT_TYPE_USER_ACTIVITY] = StkDownloadEvent;
EventPrototypes[RIL.STK_EVENT_TYPE_IDLE_SCREEN_AVAILABLE] = StkDownloadEvent;
EventPrototypes[RIL.STK_EVENT_TYPE_MT_CALL] = StkCallEvent;
EventPrototypes[RIL.STK_EVENT_TYPE_CALL_CONNECTED] = StkCallEvent;
EventPrototypes[RIL.STK_EVENT_TYPE_CALL_DISCONNECTED] = StkCallEvent;
EventPrototypes[RIL.STK_EVENT_TYPE_LOCATION_STATUS] = StkLocationEvent;
EventPrototypes[RIL.STK_EVENT_TYPE_LANGUAGE_SELECTION] = StkLanguageSelectionEvent;
EventPrototypes[RIL.STK_EVENT_TYPE_BROWSER_TERMINATION] = StkBrowserTerminationEvent;
/**
* Event Message Prototype Mappings.
*/
var EventMsgPrototypes = {};
EventMsgPrototypes[RIL.STK_EVENT_TYPE_USER_ACTIVITY] = StkEventMessage;
EventMsgPrototypes[RIL.STK_EVENT_TYPE_IDLE_SCREEN_AVAILABLE] = StkEventMessage;
EventMsgPrototypes[RIL.STK_EVENT_TYPE_MT_CALL] = StkCallEventMessage;
EventMsgPrototypes[RIL.STK_EVENT_TYPE_CALL_CONNECTED] = StkCallEventMessage;
EventMsgPrototypes[RIL.STK_EVENT_TYPE_CALL_DISCONNECTED] = StkCallEventMessage;
EventMsgPrototypes[RIL.STK_EVENT_TYPE_LOCATION_STATUS] = StkLocationEventMessage;
EventMsgPrototypes[RIL.STK_EVENT_TYPE_LANGUAGE_SELECTION] = StkLanguageSelectionEventMessage;
EventMsgPrototypes[RIL.STK_EVENT_TYPE_BROWSER_TERMINATION] = StkBrowserTerminationEventMessage;
/**
* Event QueryInterface Mappings.
*/
var QueriedEventIFs = {};
QueriedEventIFs[RIL.STK_EVENT_TYPE_USER_ACTIVITY] = Ci.nsIStkDownloadEvent;
QueriedEventIFs[RIL.STK_EVENT_TYPE_IDLE_SCREEN_AVAILABLE] = Ci.nsIStkDownloadEvent;
QueriedEventIFs[RIL.STK_EVENT_TYPE_MT_CALL] = Ci.nsIStkCallEvent;
QueriedEventIFs[RIL.STK_EVENT_TYPE_CALL_CONNECTED] = Ci.nsIStkCallEvent;
QueriedEventIFs[RIL.STK_EVENT_TYPE_CALL_DISCONNECTED] = Ci.nsIStkCallEvent;
QueriedEventIFs[RIL.STK_EVENT_TYPE_LOCATION_STATUS] = Ci.nsIStkLocationEvent;
QueriedEventIFs[RIL.STK_EVENT_TYPE_LANGUAGE_SELECTION] = Ci.nsIStkLanguageSelectionEvent;
QueriedEventIFs[RIL.STK_EVENT_TYPE_BROWSER_TERMINATION] = Ci.nsIStkBrowserTerminationEvent;
/**
* StkProactiveCmdFactory
*/
function StkProactiveCmdFactory() {
}
StkProactiveCmdFactory.prototype = {
classID: GONK_STKCMDFACTORY_CID,
classInfo: XPCOMUtils.generateCI({classID: GONK_STKCMDFACTORY_CID,
contractID: GONK_STKCMDFACTORY_CONTRACTID,
classDescription: "StkProactiveCmdFactory",
interfaces: [Ci.nsIStkCmdFactory],
flags: Ci.nsIClassInfo.SINGLETON}),
QueryInterface: XPCOMUtils.generateQI([Ci.nsIStkCmdFactory]),
/**
* nsIStkCmdFactory interface.
*/
createCommand: function(aCommandDetails) {
let cmdType = CmdPrototypes[aCommandDetails.typeOfCommand];
if (typeof cmdType != "function") {
throw new Error("Unknown Command Type: " + aCommandDetails.typeOfCommand);
}
return new cmdType(aCommandDetails);
},
createCommandMessage: function(aStkProactiveCmd) {
let cmd = null;
let msgType = MsgPrototypes[aStkProactiveCmd.typeOfCommand];
if (typeof msgType != "function") {
throw new Error("Unknown Command Type: " + aStkProactiveCmd.typeOfCommand);
}
// convert aStkProactiveCmd to it's concrete interface before creating
// system message.
try {
cmd = aStkProactiveCmd.QueryInterface(QueriedIFs[aStkProactiveCmd.typeOfCommand]);
} catch (e) {
throw new Error("Failed to convert command into concrete class: " + e);
}
return new msgType(cmd);
},
deflateCommand: function(aStkProactiveCmd) {
return JSON.stringify(this.createCommandMessage(aStkProactiveCmd));
},
inflateCommand: function(aJSON) {
return this.createCommand(JSON.parse(aJSON));
},
createResponse: function(aResponseMessage) {
if (!aResponseMessage || aResponseMessage.resultCode === undefined) {
throw new Error("Invalid response message: " + JSON.stringify(aResponseMessage));
}
if (aResponseMessage.itemIdentifier !== undefined) {
return new StkSelectItemResponse(aResponseMessage);
}
if (aResponseMessage.input !== undefined ||
aResponseMessage.isYesNo !== undefined) {
return new StkGetInputResponse(aResponseMessage);
}
if (aResponseMessage.hasConfirmed !== undefined) {
return new StkCallSetupResponse(aResponseMessage);
}
if (aResponseMessage.localInfo !== undefined) {
return new StkLocalInfoResponse(aResponseMessage);
}
if (aResponseMessage.timer !== undefined) {
return new StkTimerResponse(aResponseMessage);
}
return new StkTerminalResponse(aResponseMessage);
},
createResponseMessage: function(aStkTerminalResponse) {
if (!aStkTerminalResponse) {
throw new Error("Invalid terminal response: " + JSON.stringify(aStkTerminalResponse));
}
let response;
if (aStkTerminalResponse instanceof Ci.nsIStkSelectItemResponse) {
response = aStkTerminalResponse.QueryInterface(Ci.nsIStkSelectItemResponse);
return new StkSelectItemResponseMessage(response);
}
if (aStkTerminalResponse instanceof Ci.nsIStkGetInputResponse) {
response = aStkTerminalResponse.QueryInterface(Ci.nsIStkGetInputResponse);
return new StkGetInputResponseMessage(response);
}
if (aStkTerminalResponse instanceof Ci.nsIStkCallSetupResponse) {
response = aStkTerminalResponse.QueryInterface(Ci.nsIStkCallSetupResponse);
return new StkCallSetupResponseMessage(response);
}
if (aStkTerminalResponse instanceof Ci.nsIStkLocalInfoResponse) {
response = aStkTerminalResponse.QueryInterface(Ci.nsIStkLocalInfoResponse);
return new StkLocalInfoResponseMessage(response);
}
if (aStkTerminalResponse instanceof Ci.nsIStkTimerResponse) {
response = aStkTerminalResponse.QueryInterface(Ci.nsIStkTimerResponse);
return new StkTimerResponseMessage(response);
}
return new StkResponseMessage(aStkTerminalResponse);
},
deflateResponse: function(aStkTerminalResponse) {
return JSON.stringify(this.createResponseMessage(aStkTerminalResponse));
},
inflateResponse: function(aJSON) {
return this.createResponse(JSON.parse(aJSON));
},
createEvent: function(aEventMessage) {
let eventType = EventPrototypes[aEventMessage.eventType];
if (typeof eventType != "function") {
throw new Error("Unknown Event Type: " + aEventMessage.eventType);
}
return new eventType(aEventMessage);
},
createEventMessage: function(aStkDownloadEvent) {
let event = null;
let eventType = EventMsgPrototypes[aStkDownloadEvent.eventType];
if (typeof eventType != "function") {
throw new Error("Unknown Event Type: " + aStkDownloadEvent.eventType);
}
// convert aStkDownloadEvent to it's concrete interface before creating message.
try {
event = aStkDownloadEvent.QueryInterface(QueriedEventIFs[aStkDownloadEvent.eventType]);
} catch (e) {
throw new Error("Failed to convert event into concrete class: " + e);
}
return new eventType(event);
},
deflateDownloadEvent: function(aStkDownloadEvent) {
return JSON.stringify(this.createEventMessage(aStkDownloadEvent));
},
inflateDownloadEvent: function(aJSON) {
return this.createEvent(JSON.parse(aJSON));
},
createTimer: function(aStkTimerMessage) {
if (!aStkTimerMessage ||
aStkTimerMessage.timerId === undefined) {
throw new Error("Invalid timer object: " + JSON.stringify(aStkTimerMessage));
}
// timerAction is useless in TIMER EXPIRATION envelope,
// so we always set it to TIMER_ACTION_INVALID.
return new StkTimer(aStkTimerMessage.timerId,
Math.floor(aStkTimerMessage.timerValue),
Ci.nsIStkTimer.TIMER_ACTION_INVALID);
}
};
this.NSGetFactory = XPCOMUtils.generateNSGetFactory([StkProactiveCmdFactory]);