📄 webserviced.htc
字号:
dbgPrintObject(oS.ns, 'NAMESPACES');
dbgPrintObject(oS.schemas, 'SCHEMAS');
oS.soapPort = new Array();
oS.headers = new Array();
if (nService.length == 0)
{
oS.defPortName = "defaultPort";
var aPort = new Object();
oS.soapPort[oS.defPortName] = aPort;
aPort.location = null;
var firstBind = get1stAryItem(aBinding);
aPort.msgs = firstBind == null ? (new Array()) : firstBind.msgs;
//dbgPrintObject(oS.soapPort, 'METHODS');
return;
}
var nports = nService[0].selectNodes(nsqService + "port");
for (var j = 0; j < nports.length; j++)
{
var oAddress = nports[j].selectNodes("soap:address");
if (oAddress.length == 0)
continue;
var oSOAPHdr = nports[j].selectNodes("soap:header");
for (var k = 0; k < oSOAPHdr.length; k ++)
oS.headers[k] = parseSoapHeader(oS, oSOAPHdr[k]);
oPort = new Object();
oPort.location = getAttrib(oAddress[0], "location");
var b = aBinding[getBaseName(getAttrib(nports[j], "binding"))];
if (b == null)
continue
oPort.msgs = b.msgs;
var szname = getAttrib(nports[j], "name");
oS.soapPort[szname] = oPort;
if (oS.defPortName == null)
oS.defPortName = szname;
}
//dbgPrintObject(oS.soapPort, 'METHODS');
//dbgPrintObject(oS.headers, 'SOAPHEADERS');
}
function ensureXmlHttp(fAsync, oS)
{
var oXmlHttp = null;
var fCreate = fAsync ? oS.aXmlHttp == null : oS.sXmlHttp == null;
if (!fCreate && oS.fSeq)
{
oXmlHttp = fAsync ? oS.aXmlHttp : oS.sXmlHttp;
oXmlHttp.fFree = false;
return oXmlHttp;
}
for (var i = 0; i < _aXmlHttp.length; i++)
if (_aXmlHttp[i].fFree)
{
_aXmlHttp[i].fFree = false;
oXmlHttp = _aXmlHttp[i];
break;
}
if (oXmlHttp == null)
{
var xmlHttp;
try
{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e)
{
return null;
}
var oXmlHttp = new Object();
oXmlHttp.fFree = false;
oXmlHttp.xmlHttp = xmlHttp;
_aXmlHttp[_aXmlHttp.length] = oXmlHttp;
dbgPrint("Created a new XmlHttp Object index=" + _aXmlHttp.length+"\n");
}
if (!oS.fSeq)
return oXmlHttp;
if (fAsync)
oS.aXmlHttp = oXmlHttp;
else
oS.sXmlHttp = oXmlHttp;
return oXmlHttp;
}
function encodeHeader(oS, oM, oCall)
{
dbgPrint("Encoding headers : \n");
var co = oCall.co;
var sh = co.SOAPHeader == null ? oS.SOAPHeader : co.SOAPHeader;
if (sh == null)
return "";
var ht = (oM.hdrsIn == null) ? oS.headers : oM.hdrsIn;
var szHeader = "";
if (typeof sh == 'string')
szHeader = sh;
else if (typeof sh == 'object' && sh.xml != null)
szHeader = sh.xml;
else if (ht.length != 0)
{
// fixup fir VB
if (typeof(sh) == "unknown")
sh = vbArrayToJs(sh, 1);
dbgPrintObject(ht, "header types");
dbgPrintObject(sh, "headers input");
//
// make a fake method
oM1 = new Object();
oM1.opname = null; // Header doesn't have a opname
oM1.ns = oM.ns;
oM1.fRpc = oM.fRpc;
oM1.fWrapped = false; // header is never wrapped
// we assume that SOAP actor is omitted, the receipient is final
// and mustunderstand is false
// the user will need to construct his/her own header if needed
// we will assume all headers will be encoded the same way
for (var i = 0; i < ht.length; i++)
{
if (sh[i] == null)
{
if (ht[i].fRequired)
return returnError(oCall, 9);
continue;
}
oM1.fLiteral = ht[i].fLiteral;
var ta = new Array();
ta[ht[i].type.name] = ht[i].type;
var va = new Array();
va[0] = sh[i];
szHeader += encodeArgs(oS, oM1, ta, va, 0, false);
}
}
var soapenvns = oS.qlt["SOAP-ENV"];
return '<'+soapenvns+':Header>' + szHeader +"</"+soapenvns+":Header>\n";
}
function _invoke(oCall)
{
var szS = oCall.service;
var oS = _sdl[szS];
var co = oCall.co;
if (oS == null)
{
dbgPrint(szS + " not available!\n");
return postError(oCall, 1);
}
if (co.portName == null)
co.portName = oS.defPortName;
if (oS.soapPort[co.portName] == null)
{
dbgPrint(co.portName + " is not a valid port\n");
callNext(oS);
return returnError(oCall, 8);
}
var oXmlHttp = ensureXmlHttp(co.async, oS);
if (oXmlHttp == null)
return returnError(oCall, 6);
var args = co.params == null ? oCall.args : co.params;
var cb = oCall.cb;
var j = cb == null ? 1 : 2;
j = co.params == null ? j : 0;
var oM = getMsg(szS, co, args, j);
var szParams = null;
dbgPrint("Encoding SOAP Body\n");
//dbgPrintObject(oM, "Soap Message");
if (oM != null)
{
szParams = encodeArgs(oS, oM, oM.args, args, j, co.params != null);
}
if (szParams == null)
{
dbgPrint("can't build params\n");
callNext(oS);
return returnError(oCall, 0);
}
oCall.oM = oM;
if (showProgress == "true" || showProgress == true)
fnShowProgress();
var oP = oS.soapPort[co.portName];
var loc = co.endpoint == null ? oP.location : co.endpoint;
dbgPrint("\nService Endpoint URI=" + loc + "\n");
if (loc == null)
{
callNext(oS);
return returnError(oCall, 8);
}
try
{
if (co.userName == null)
oXmlHttp.xmlHttp.open("POST", loc, co.async);
else
oXmlHttp.xmlHttp.open("POST", loc, co.async,
co.userName, co.password == null ? "" : co.password);
}
catch (e)
{
callNext(oS);
return returnError(oCall, 5);
}
var szAction = oM.soapAction;
if (szAction != null && szAction.length > 0)
oXmlHttp.xmlHttp.setRequestHeader("SOAPAction", '"'+szAction+'"');
oXmlHttp.xmlHttp.setRequestHeader("Content-Type",
'text/xml; charset="UTF-8"');
var sNS = ' xmlns=""';
for (var ns in oS.ns)
{
var nsuri = oS.ns[ns];
if (ns == "" || nsuri == "")
continue;
sNS += " xmlns:" + ns + '="' + nsuri + '"';
}
var szHeader = encodeHeader(oS, oM, oCall);
var soapenvns = oS.qlt["SOAP-ENV"];
var soapes = (oM.es==null?'':(' '+soapenvns+':encodingStyle="'+oM.es+'"'));
var szPayload = "<?xml version='1.0' encoding='utf-8'?>\n<"
+ soapenvns + ":Envelope"
+ soapes
+ sNS + ">\n"
+ szHeader
+ '<' + soapenvns + ':Body>'
+ szParams + "</" + soapenvns + ":Body>\n"
+ "</" + soapenvns + ":Envelope>\n";
szPayload = dbgDirectSoap(szPayload);
dbgPrint("\n" + szPayload);
if (co.async)
{
oCall.oXmlHttp = oXmlHttp;
oXmlHttp.xmlHttp.onreadystatechange = function() {getResult(oCall);};
try
{
oXmlHttp.xmlHttp.send(szPayload);
}
catch(e)
{
return postError(oCall, 5);
}
dbgPrint("\nAction: " + szAction + " sent\n");
return oCall.id;
}
try
{
oXmlHttp.xmlHttp.send(szPayload);
}
catch(e)
{
return returnError(oCall, 5);
}
if (oXmlHttp.xmlHttp.responseXML.parseError.errorCode != 0)
{
_errUnknownS.raw = oXmlHttp.xmlHttp.responseText;
dbgPrint(oCall.id+") err4 (\n" + oXmlHttp.xmlHttp.responseText + ")\n");
return returnError(oCall, 4);
}
var r;
try
{
r = processResult(oCall, oXmlHttp.xmlHttp.responseXML.documentElement);
}
catch (e)
{
return returnError(oCall, 7);
}
return r;
}
function callService(service, args)
{
var oC = allocCall();
dbgPrint( "call[" + oC.id + "] " + service + ";\n");
if (args.length < 1)
{
return postError(oC, 0);
}
var cb = null;
var iM = 0;
if ( typeof args[0] == "function"
|| typeof args[0] == "object" && args[0].funcName == null)
{
iM = 1;
cb = args[0];
}
var co;
if (typeof args[iM] == 'string')
co = createCallOptions(args[iM]);
else
co = cloneObject(args[iM]);
oC.co = co;
oC.cb = cb;
oC.service = service;
oC.args = args;
if (co.async == null)
co.async = true;
if (co.funcName == null)
{
return postError(oC, 0);
}
var oS = _sdl[service];
if (oS == null)
{
dbgPrint("service: " + service + " is not available!\n");
return postError(oC, 1);
}
if (co.async == false)
return oS.fPending ? returnError(oC, 1) : _invoke(oC);
if (oS.fSeq || oS.fPending)
{
if (oS.lastCall != null)
oS.lastCall.next = oC;
else
oS.nextCall = oC;
oS.lastCall = oC;
}
if (oS.fPending)
{
dbgPrint(oC.co.funcName + " is pending\n");
return oC.id;
}
dbgPrintObject(oS.nextCall, "call chain");
if (!oS.fSeq)
_invoke(oC);
else if (oC == oS.nextCall && (oS.aXmlHttp == null || oS.aXmlHttp.fFree))
invokeNext(service);
return oC.id;
}
function useService(szService, userName, options)
{
if ( szService == null || szService.length == 0
|| userName == null || userName.length == 0)
{
dbgPrint("you didn't call use correctly\n");
throw("Invalid arguments");
return;
}
var url = ensureWsdlUrl(szService);
var oProp = getAttribute(userName);
if (oProp == null)
{
oProp=document.createElement("<PUBLIC:PROPERTY NAME="+userName+" />");
_webservice.appendChild(oProp);
}
var oPropValue = new Object();
setAttribute(userName, oPropValue);
oPropValue.callService = function(){return callService(url, arguments)};
if (_sdl[url] != null)
{
dbgPrint(userName + " is already defined, change to " + userName +"\n");
if (options != null)
{
_sdl[url].fSeq = options.reuseConnection == null
? false : options.reuseConnection;
_sdl[url].SOAPHeader = options.SOAPHeader;
}
return;
}
var oXml = document.createElement("XML");
document.body.appendChild(oXml);
oS = new Object();
oS.sXmlHttp = null;
oS.aXmlHttp = null;
oS.fPending = true;
oS.nextCall = null;
oS.lastCall = null;
oS.url = url;
oS._oXml = oXml;
oS.ns = new Array();
oS.nsalias = new Array();
if (options != null)
{
oS.fSeq = options.reuseConnection;
oS.SOAPHeader = options.SOAPHeader;
}
if (oS.fSeq == null)
oS.fSeq = false;
_sdl[url] = oS;
oXml.service = userName;
oXml.onreadystatechange = getWsdl;
oXml.src = url;
dbgPrint( "use(" + userName + ") successful\n");
return;
}
function getMsg(service, co, args, argIdx)
{
var oM;
var mn = co.funcName;
var oS = _sdl[service];
var sp = oS.soapPort[co.portName];
if (sp == null)
return null;
oM = sp.msgs[mn];
if (oM == null || oM.length == null)
{
dbgPrint("no such method " + mn + "\n");
return null;
}
var om1;
for (om1 in oM)
{
if (co.params != null || oM[om1].args.length == args.length - argIdx)
{
oM = oM[om1];
break;
}
}
if (oM.length != null)
oM = oM[om1];
return oM;
}
function fixupDT(x)
{
return (x < 10) ? ("0" + x) : x;
}
function encTZ(d)
{
var tzo = d.getTimezoneOffset();
return (tzo > 0 ? '-' : '+') + fixupDT(tzo / 60) + ':' + fixupDT(tzo % 60);
}
function encodePrimitive(os, argType, argVal)
{
var sz = '';
switch(_st[argType])
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -