为了共同讨论微软的XML解析服务器内部机制,现贴出一段微软提供的源代码供同好共同学
习研究使用。
// ===========================================================================
=
// Implementation of server-side object that gathers XML data and
// processes it by combining with the appropriate XSL transform.
//
// Copyright (c) Microsoft Corporation. All rights reserved.
#pragma once
#include "PIParse.h"
// ===========================================================================
=
// CLASS: CXMLServerDocument
//
// Server-side object that accumulates XML, then transforms it via reques
t-
// specific XSL.
class CResponseOrStream;
class ATL_NO_VTABLE CXMLServerDocument :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CXMLServerDocument, &CLSID_XMLServerDocument>,
public IDispatchImpl<IXMLServerDocument, &IID_IXMLServerDocument, &LIBID_X
SLISAPI2Lib>
{
public:
DECLARE_REGISTRY_RESOURCEID(IDR_XMLSERVERDOCUMENT)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CXMLServerDocument)
COM_INTERFACE_ENTRY(IXMLServerDocument)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()
public:
CXMLServerDocument();
HRESULT SetErrorToLastCOMError(wchar_t *pwszURL);
// IXMLServerDocument
STDMETHOD(put_URL)(/*[in]*/ BSTR bstrURL);
STDMETHOD(put_UserAgent)(/*[in]*/ BSTR bstrUserAgent);
STDMETHOD(put_ServerConfigFile)(/*[in]*/ BSTR bstrServerConfigFile);
STDMETHOD(put_SingleXSLFile)(/*[in]*/ BSTR bstrSingleXSLFile);
STDMETHOD(put_ServerSupportFunctions)(
/*[in]*/ IXMLServerDocumentSupportFunctions *supportFunctions);
STDMETHOD(Transform)(IDispatch * pdispResponse);
STDMETHOD(TransformEx)(IUnknown *pIncomingXMLStream,
IUnknown *punkOutput);
STDMETHOD(HandleError)(IUnknown * punkOutput);
STDMETHOD(Load)(BSTR bstrFileName);
STDMETHOD(Write)(BSTR bstrText);
STDMETHOD(End)();
STDMETHOD(Flush)();
STDMETHOD(Clear)();
STDMETHOD(WriteLine)(BSTR bstrLine);
// Errors may be set on this object by other classes. (Note that
// these incoming BSTRs can just be wchar_t*'s.)
STDMETHOD(SetError)(BSTR errorString,
BSTR errorURL,
BSTR errorHTTPCode);
STDMETHOD(ClearError());
private:
HRESULT EnsureXMLDocumentObject(bool bAcquireStream);
HRESULT EnsureAspServerObject();
HRESULT WriteToXML(BSTR bstrLine, bool bAddCR);
HRESULT WriteIdentityXML(CResponseOrStream & responseOrStream);
HRESULT LoadMasterConfig(CComBSTR & bstrSpecialPIAttrib);
HRESULT GetServerConfig(IXMLDOMDocument **pServerConfig);
HRESULT GetDoctype();
HRESULT InitializeBrowserCapAndAttribs();
HRESULT ExtractStylesheets(IXMLDOMDocument *pServerConfig,
CComBSTR arrStylesheets[],
short *pNumStylesheets);
HRESULT PullStylesheetsFromDeviceInfo(IXMLDOMNode *pServerConfig,
CComBSTR arrStylesheets[],
short *pNumStylesheets);
HRESULT ApplyStylesheets(CResponseOrStream & responseOrStream,
CComBSTR arrStylesheets[],
short numStylesheets);
HRESULT LoadXMLFromRelativeLoc(BSTR localName,
BSTR pathName,
bool isConfigXML,
IXMLDOMDocument **ppXMLDoc,
IXSLTemplate **ppXSLTemplate);
HRESULT VerifyEncodingAndCharset(UINT *puiCP);
HRESULT GrabFromBrowserCap(wchar_t *pwszAttrib,
wchar_t *pwszDefault,
CComBSTR & destination);
private:
CComBSTR m_bstrURL;
CComBSTR m_bstrURLServerConfig;
CComBSTR m_bstrURLDirectory;
CComBSTR m_bstrConfigDirectory;
CComBSTR m_bstrContentType;
CComBSTR m_bstrDoctypeName;
CComBSTR m_bstrEncoding;
CComBSTR m_bstrCharset;
CComBSTR m_bstrErrorDescrip;
CComBSTR m_bstrErrorURL;
CComBSTR m_bstrErrorHTTPCode;
CComBSTR m_bstrUserAgent;
CComBSTR m_bstrSingleXSLStylesheetFile;
CComPtr<IXMLDOMDocument> m_pcomXMLDocument;
CComPtr<IStream> m_pcomXMLDocumentStream;
CComPtr<IXMLDOMDocument> m_pcomTransformConfig;
CComPtr<IXMLDOMDocument> m_pcomSingleXSLFile;
CComPtr<asp::IServer> m_pcomASPServer;
CComPtr<IDispatch> m_pcomBrowserTypeDisp;
CComPtr<IXMLServerDocumentSupportFunctions> m_pcomSupportFunctions;
PIParseInfo m_piParseInfo;
bool m_bInErrorHandling;
bool m_bResponseEndCalled;
bool m_bServerConfigSetExplicitly;
bool m_bForbidDriveSpecification;
bool m_bBrowserCapsInitialized;
};
--
FROM 61.48.32.*