为了共同讨论微软的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.*
微软 XML 解析服务器其他源代码列表:
StdAfx.h Main location for include files
XmlServerDoc.{h,cpp,rgs} Main logic for stylesheet selection and XSL processin
g.
PreProcess.{h,cpp} Convert PASP file into ASP file
ASPPreProcessor.{h,cpp,rgs} Request broker for preprocessing tasks, also deter
mines whether preprocessing is necessary.
ProcessingStream.h Post-processing
Xmlcache.{h,cpp}, hashtable.{h,cpp} Implements simple in-memory cache for XML
documents (and IXSLTemplates)
Utils.{h,cpp} Utilities for: XML, ASP, error handling, string operations, debu
gging
Charset.{h,cpp} Utilities for character set and encoding issues.
PIParse.{h,cpp} Simple class for parsing XML processing instructions.
IncludeFile*.{h,cpp} Support for the PASP include file functionality.
Msxml3.tlb Type-library information extracted from msxml3.dll. Referenced by S
tdAfx.h.
Global.{h,cpp} Global state
【 在 AdamGet (兴之) 的大作中提到: 】
:
: 为了共同讨论微软的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.
: ...................
--
FROM 61.48.32.*