Listing 2: Major functions of the DocumentContentHandler<Data, Functor> class.
//.....
template <class Data, class Functor>
class DocumentContentHandler : public BaseContentHandler
{
protected:
typedef DocumentContentHandler<Data, Functor> DocHandlerType;
typedef map<XmlString, BaseContentHandler*> ContentHandlerMap;
typedef ContentHandlerMap::iterator ContentHandlerIterator;
protected:
ContentHandlerMap m_AllHandlers;
stack<BaseContentHandler*> m_ActiveHandlers;
ISAXXMLReader* m_pXMLReader;
public:
// destructor and other functions not shown
DocumentContentHandler(const XmlString& strDocumentName,
Functor* pFunctor)
: BaseContentHandler(strDocumentName)
{
m_AllHandlers.insert(
ContentHandlerMap::value_type(strDocumentName,this));
CompositeContentHandler<Data, Functor>* pHandler =
new DataHandler(Data::GetClassName(),this,pFunctor);
}
virtual HRESULT STDMETHODCALLTYPE startElement(
/* [in] */ wchar_t __RPC_FAR *pwchNamespaceUri,
/* [in] */ int cchNamespaceUri,
/* [in] */ wchar_t __RPC_FAR *pwchLocalName,
/* [in] */ int cchLocalName,
/* [in] */ wchar_t __RPC_FAR *pwchRawName,
/* [in] */ int cchRawName,
/* [in] */ ISAXAttributes __RPC_FAR *pAttributes)
{
ContentHandlerIterator iter =
m_AllHandlers.find(XmlString(pwchLocalName));
if (iter != m_AllHandlers.end())
{
m_ActiveHandlers.push(iter->second);
m_pXMLReader->putContentHandler(iter->second);
}
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE endElement(
/* [in] */ wchar_t __RPC_FAR *pwchNamespaceUri,
/* [in] */ int cchNamespaceUri,
/* [in] */ wchar_t __RPC_FAR *pwchLocalName,
/* [in] */ int cchLocalName,
/* [in] */ wchar_t __RPC_FAR *pwchRawName,
/* [in] */ int cchRawName)
{
if(!m_ActiveHandlers.empty())
m_ActiveHandlers.pop();
if(!m_ActiveHandlers.empty())
m_pXMLReader->putContentHandler(
m_ActiveHandlers.top());
return S_OK;
}
};