⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webserviced.htc

📁 浏览器端看到树型目录结构,用户可以完整地看到像windows资源管理器一样的效果
💻 HTC
📖 第 1 页 / 共 5 页
字号:
    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 + -