00001 #include "xmltk.h"
00002
00003
00004 class CTSAX2SAX : public ITSAXContentHandler
00005 {
00006 public:
00007
00008 CL_STDMETHOD(QueryInterface) (RCLIID riid, void **ppvObj);
00009 CL_STDMETHOD_(ULONG,AddRef) ();
00010 CL_STDMETHOD_(ULONG,Release) ();
00011
00012
00013 CL_STDMETHOD(startDocument) ();
00014 CL_STDMETHOD(endDocument) ();
00015 CL_STDMETHOD(startElement) (XTOKEN xtName);
00016 CL_STDMETHOD(endElement) (XTOKEN xtName);
00017 CL_STDMETHOD(attribute) (XTOKEN xtName, char *pszChars, int cchChars);
00018 CL_STDMETHOD(characters) (char *pszChars, int cchChars);
00019 CL_STDMETHOD(cdata) (char *pszChars, int cchChars);
00020 CL_STDMETHOD(extendedint) (XTOKEN xt, int iInt);
00021
00022 CTSAX2SAX(SAXClient *psc) : m_cRef(1), m_psc(psc)
00023 {
00024 }
00025
00026 virtual ~CTSAX2SAX()
00027 {
00028 }
00029
00030 private:
00031
00032
00033 ULONG m_cRef;
00034 SAXClient *m_psc;
00035 };
00036
00037
00038 bool CTSAX2SAX::QueryInterface(RCLIID riid, void **ppvObj)
00039 {
00040 if (IsEqualCLIID(riid, &IID_IUnknownCL))
00041 {
00042 *ppvObj = static_cast<IUnknownCL*>(this);
00043 }
00044 else if (IsEqualCLIID(riid, &IID_ITSAXContentHandler))
00045 {
00046 *ppvObj = static_cast<ITSAXContentHandler*>(this);
00047 }
00048 else
00049 {
00050 *ppvObj = NULL;
00051 return false;
00052 }
00053 AddRef();
00054 return true;
00055 }
00056
00057 ULONG CTSAX2SAX::AddRef()
00058 {
00059 return ++m_cRef;
00060 }
00061
00062 ULONG CTSAX2SAX::Release()
00063 {
00064 --m_cRef;
00065 if (m_cRef > 0)
00066 {
00067 return m_cRef;
00068 }
00069 delete this;
00070 return 0;
00071 }
00072
00073 bool CTSAX2SAX::characters(char* pszChars, int cchChars)
00074 {
00075 m_psc->HandleText(pszChars, cchChars, 0, 0, 0);
00076 return true;
00077 }
00078
00079 bool CTSAX2SAX::cdata(char* pszChars, int cchChars)
00080 {
00081 m_psc->HandleCDATA(pszChars, cchChars, 0);
00082 return true;
00083 }
00084
00085 bool CTSAX2SAX::extendedint(XTOKEN xt, int iInt)
00086 {
00087 STRPAIR *ppair = g_ptt->PairFromXTOKEN(xt);
00088
00089 if (ppair->first)
00090 m_psc->HandleText(ppair->first, strlen(ppair->first), 0, 0, 0);
00091
00092 char sz[32];
00093 sprintf(sz, "%i", iInt);
00094 m_psc->HandleText(sz, strlen(sz), 0, 0, 0);
00095
00096 if (ppair->second)
00097 m_psc->HandleText(ppair->second, strlen(ppair->second), 0, 0, 0);
00098
00099 return true;
00100 }
00101
00102 bool CTSAX2SAX::endDocument()
00103 {
00104
00105 return true;
00106 }
00107
00108 bool CTSAX2SAX::startDocument()
00109 {
00110
00111 return true;
00112 }
00113
00114 bool CTSAX2SAX::endElement(XTOKEN xtName)
00115 {
00116 char *psz = g_ptt->StrFromXTOKEN(xtName);
00117 m_psc->HandleEndLabel(psz, strlen(psz), 0);
00118
00119 return true;
00120 }
00121
00122 bool CTSAX2SAX::startElement(XTOKEN xtName)
00123 {
00124 char *psz = g_ptt->StrFromXTOKEN(xtName);
00125 m_psc->HandleStartLabel(psz, strlen(psz), 0);
00126
00127 return true;
00128 }
00129
00130 bool CTSAX2SAX::attribute(XTOKEN xtName, char *pszChars, int cchChars)
00131 {
00132 char *psz = g_ptt->StrFromXTOKEN(xtName);
00133 m_psc->HandleAttribName(psz, strlen(psz), 0);
00134 m_psc->HandleAttribValue(pszChars, cchChars, 0);
00135 return true;
00136 }
00137
00138
00139 bool CreateTSAX2SAX(RCLIID riid, void **ppvObj, SAXClient *psc)
00140 {
00141 bool bResult = false;
00142
00143 CTSAX2SAX *ptx = new CTSAX2SAX(psc);
00144 if (ptx)
00145 {
00146 bResult = ptx->QueryInterface(riid, ppvObj);
00147 ptx->Release();
00148 }
00149
00150 return bResult;
00151 }