зеркало из https://github.com/mozilla/gecko-dev.git
179 строки
4.9 KiB
JavaScript
179 строки
4.9 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 } = Components;
|
|
|
|
const PREF_DEBUG = "dom.payment.debug";
|
|
|
|
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
|
Cu.import("resource://gre/modules/Services.jsm");
|
|
|
|
XPCOMUtils.defineLazyServiceGetter(this, "gIccService",
|
|
"@mozilla.org/icc/iccservice;1",
|
|
"nsIIccService");
|
|
|
|
XPCOMUtils.defineLazyServiceGetter(this, "gRil",
|
|
"@mozilla.org/ril;1",
|
|
"nsIRadioInterfaceLayer");
|
|
|
|
XPCOMUtils.defineLazyServiceGetter(this, "gSettingsService",
|
|
"@mozilla.org/settingsService;1",
|
|
"nsISettingsService");
|
|
|
|
const kMozSettingsChangedObserverTopic = "mozsettings-changed";
|
|
const kRilDefaultDataServiceId = "ril.data.defaultServiceId";
|
|
const kRilDefaultPaymentServiceId = "ril.payment.defaultServiceId";
|
|
|
|
let _debug;
|
|
try {
|
|
_debug = Services.prefs.getPrefType(PREF_DEBUG) == Ci.nsIPrefBranch.PREF_BOOL
|
|
&& Services.prefs.getBoolPref(PREF_DEBUG);
|
|
} catch(e){
|
|
_debug = false;
|
|
}
|
|
|
|
function LOG(s) {
|
|
if (!_debug) {
|
|
return;
|
|
}
|
|
dump("== Payment Provider == " + s + "\n");
|
|
}
|
|
|
|
function LOGE(s) {
|
|
dump("== Payment Provider ERROR == " + s + "\n");
|
|
}
|
|
|
|
function PaymentSettings() {
|
|
Services.obs.addObserver(this, kMozSettingsChangedObserverTopic, false);
|
|
|
|
[kRilDefaultDataServiceId, kRilDefaultPaymentServiceId].forEach(setting => {
|
|
gSettingsService.createLock().get(setting, this);
|
|
});
|
|
}
|
|
|
|
PaymentSettings.prototype = {
|
|
QueryInterface: XPCOMUtils.generateQI([Ci.nsISettingsServiceCallback,
|
|
Ci.nsIObserver]),
|
|
|
|
dataServiceId: 0,
|
|
_paymentServiceId: 0,
|
|
|
|
get paymentServiceId() {
|
|
return this._paymentServiceId;
|
|
},
|
|
|
|
set paymentServiceId(serviceId) {
|
|
// We allow the payment provider to set the service ID that will be used
|
|
// for the payment process.
|
|
// This service ID will be the one used by the silent SMS flow.
|
|
// If the payment is done with an external SIM, the service ID must be set
|
|
// to null.
|
|
if (serviceId != null && serviceId >= gRil.numRadioInterfaces) {
|
|
LOGE("Invalid service ID " + serviceId);
|
|
return;
|
|
}
|
|
|
|
gSettingsService.createLock().set(kRilDefaultPaymentServiceId,
|
|
serviceId, 0);
|
|
this._paymentServiceId = serviceId;
|
|
},
|
|
|
|
setServiceId: function(aName, aValue) {
|
|
switch (aName) {
|
|
case kRilDefaultDataServiceId:
|
|
this.dataServiceId = aValue;
|
|
if (_debug) {
|
|
LOG("dataServiceId " + this.dataServiceId);
|
|
}
|
|
break;
|
|
case kRilDefaultPaymentServiceId:
|
|
this._paymentServiceId = aValue;
|
|
if (_debug) {
|
|
LOG("paymentServiceId " + this._paymentServiceId);
|
|
}
|
|
break;
|
|
}
|
|
},
|
|
|
|
handle: function(aName, aValue) {
|
|
if (aName != kRilDefaultDataServiceId) {
|
|
return;
|
|
}
|
|
|
|
this.setServiceId(aName, aValue);
|
|
},
|
|
|
|
observe: function(aSubject, aTopic, aData) {
|
|
if (aTopic != kMozSettingsChangedObserverTopic) {
|
|
return;
|
|
}
|
|
|
|
try {
|
|
if ("wrappedJSObject" in aSubject) {
|
|
aSubject = aSubject.wrappedJSObject;
|
|
}
|
|
if (!aSubject.key ||
|
|
(aSubject.key !== kRilDefaultDataServiceId &&
|
|
aSubject.key !== kRilDefaultPaymentServiceId)) {
|
|
return;
|
|
}
|
|
this.setServiceId(aSubject.key, aSubject.value);
|
|
} catch (e) {
|
|
LOGE(e);
|
|
}
|
|
},
|
|
|
|
cleanup: function() {
|
|
Services.obs.removeObserver(this, kMozSettingsChangedObserverTopic);
|
|
}
|
|
};
|
|
|
|
function PaymentProviderStrategy() {
|
|
this._settings = new PaymentSettings();
|
|
}
|
|
|
|
PaymentProviderStrategy.prototype = {
|
|
get paymentServiceId() {
|
|
return this._settings.paymentServiceId;
|
|
},
|
|
|
|
set paymentServiceId(aServiceId) {
|
|
this._settings.paymentServiceId = aServiceId;
|
|
},
|
|
|
|
get iccInfo() {
|
|
if (!this._iccInfo) {
|
|
this._iccInfo = [];
|
|
for (let i = 0; i < gRil.numRadioInterfaces; i++) {
|
|
let icc = gIccService.getIccByServiceId(i);
|
|
let info = icc && icc.iccInfo;
|
|
if (!info) {
|
|
LOGE("Tried to get the ICC info for an invalid service ID " + i);
|
|
continue;
|
|
}
|
|
|
|
this._iccInfo.push({
|
|
iccId: info.iccid,
|
|
mcc: info.mcc,
|
|
mnc: info.mnc,
|
|
dataPrimary: i == this._settings.dataServiceId
|
|
});
|
|
}
|
|
}
|
|
return this._iccInfo;
|
|
},
|
|
|
|
cleanup: function() {
|
|
this._settings.cleanup();
|
|
},
|
|
|
|
classID: Components.ID("{4834b2e1-2c91-44ea-b020-e2581ed279a4}"),
|
|
|
|
QueryInterface: XPCOMUtils.generateQI([Ci.nsIPaymentProviderStrategy])
|
|
};
|
|
|
|
this.NSGetFactory = XPCOMUtils.generateNSGetFactory([PaymentProviderStrategy]);
|