mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
161 lines
4.1 KiB
JavaScript
161 lines
4.1 KiB
JavaScript
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
|
|
|
|
|
|
|
|
const kSCHEME = "tel";
|
|
const kPROTOCOL_NAME = "Tel Protocol";
|
|
const kPROTOCOL_CONTRACTID = "@mozilla.org/network/protocol;1?name=" + kSCHEME;
|
|
const kPROTOCOL_CID = Components.ID("d4bc06cc-fa9f-48ce-98e4-5326ca96ba28");
|
|
|
|
// Mozilla defined
|
|
const kSIMPLEURI_CONTRACTID = "@mozilla.org/network/simple-uri;1";
|
|
const kIOSERVICE_CONTRACTID = "@mozilla.org/network/io-service;1";
|
|
|
|
const Ci = Components.interfaces;
|
|
|
|
|
|
|
|
function TelProtocol()
|
|
{
|
|
}
|
|
|
|
TelProtocol.prototype =
|
|
{
|
|
|
|
classDescription: "Handler for tel URIs",
|
|
classID: Components.ID(kPROTOCOL_CID),
|
|
contractID: kPROTOCOL_CONTRACTID,
|
|
QueryInterface: XPCOMUtils.generateQI([Ci.nsIProtocolHandler]),
|
|
|
|
|
|
scheme: kSCHEME,
|
|
defaultPort: -1,
|
|
protocolFlags: Ci.nsIProtocolHandler.URI_NORELATIVE |
|
|
Ci.nsIProtocolHandler.URI_NOAUTH,
|
|
|
|
allowPort: function(port, scheme)
|
|
{
|
|
return false;
|
|
},
|
|
|
|
newURI: function(spec, charset, baseURI)
|
|
{
|
|
var uri = Components.classes[kSIMPLEURI_CONTRACTID].createInstance(Ci.nsIURI);
|
|
uri.spec = spec;
|
|
return uri;
|
|
},
|
|
|
|
|
|
newChannel: function(aURI)
|
|
{
|
|
// aURI is a nsIUri, so get a string from it using .spec
|
|
let phoneNumber = aURI.spec;
|
|
|
|
// strip away the kSCHEME: part
|
|
phoneNumber = phoneNumber.substring(phoneNumber.indexOf(":") + 1, phoneNumber.length);
|
|
phoneNumber = encodeURI(phoneNumber);
|
|
|
|
#ifdef WINCE
|
|
try {
|
|
//try tel:
|
|
let channel = new nsWinceTelChannel (aURI, phoneNumber);
|
|
return channel;
|
|
} catch(e){
|
|
//tel not registered, try the next one
|
|
}
|
|
#endif
|
|
|
|
var ios = Components.classes[kIOSERVICE_CONTRACTID].getService(Ci.nsIIOService);
|
|
|
|
try {
|
|
//try voipto:
|
|
let channel = ios.newChannel("voipto:"+phoneNumber, null, null);
|
|
return channel;
|
|
} catch(e){
|
|
//voipto not registered, try the next one
|
|
}
|
|
try {
|
|
//try callto:
|
|
let channel = ios.newChannel("callto:"+phoneNumber, null, null);
|
|
return channel;
|
|
} catch(e){
|
|
//callto not registered, try the next one
|
|
}
|
|
//try wtai:
|
|
//this is our last equivalent protocol, so if it fails pass the exception on
|
|
let channel = ios.newChannel("wtai:"+phoneNumber, null, null);
|
|
return channel;
|
|
}
|
|
};
|
|
|
|
var components = [TelProtocol];
|
|
function NSGetModule(compMgr, fileSpec) {
|
|
return XPCOMUtils.generateModule(components);
|
|
}
|
|
|
|
#ifdef WINCE
|
|
function nsWinceTelChannel(URI, phoneNumber)
|
|
{
|
|
this.URI = URI;
|
|
this.originalURI = URI;
|
|
this.phoneNumber = phoneNumber
|
|
}
|
|
|
|
nsWinceTelChannel.prototype.QueryInterface =
|
|
function bc_QueryInterface(iid)
|
|
{
|
|
if (!iid.equals(Ci.nsIChannel) && !iid.equals(Ci.nsIRequest) &&
|
|
!iid.equals(Ci.nsISupports))
|
|
throw Components.results.NS_ERROR_NO_INTERFACE;
|
|
return this;
|
|
}
|
|
|
|
/* nsIChannel */
|
|
nsWinceTelChannel.prototype.loadAttributes = null;
|
|
nsWinceTelChannel.prototype.contentLength = 0;
|
|
nsWinceTelChannel.prototype.owner = null;
|
|
nsWinceTelChannel.prototype.loadGroup = null;
|
|
nsWinceTelChannel.prototype.notificationCallbacks = null;
|
|
nsWinceTelChannel.prototype.securityInfo = null;
|
|
|
|
nsWinceTelChannel.prototype.open =
|
|
nsWinceTelChannel.prototype.asyncOpen =
|
|
function bc_open(observer, ctxt)
|
|
{
|
|
var phoneInterface= Components.classes["@mozilla.org/phone/support;1"].createInstance(Ci.nsIPhoneSupport);
|
|
phoneInterface.makeCall(this.phoneNumber,"",false);
|
|
|
|
// We don't throw this (a number, not a real 'resultcode') because it
|
|
// upsets xpconnect if we do (error in the js console).
|
|
Components.returnCode = NS_ERROR_NO_CONTENT;
|
|
}
|
|
|
|
nsWinceTelChannel.prototype.asyncRead =
|
|
function bc_asyncRead(listener, ctxt)
|
|
{
|
|
throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
|
|
}
|
|
|
|
/* nsIRequest */
|
|
nsWinceTelChannel.prototype.isPending =
|
|
function bc_isPending()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
nsWinceTelChannel.prototype.status = Components.results.NS_OK;
|
|
|
|
nsWinceTelChannel.prototype.cancel =
|
|
function bc_cancel(status)
|
|
{
|
|
this.status = status;
|
|
}
|
|
|
|
nsWinceTelChannel.prototype.suspend =
|
|
nsWinceTelChannel.prototype.resume =
|
|
function bc_suspres()
|
|
{
|
|
throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
|
|
}
|
|
#endif
|