2 * XML Parser implementation
4 * Copyright 2011 Alistair Leslie-Hughes
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
27 #include "xmlparser.h"
29 #include "wine/debug.h"
30 #include "wine/heap.h"
32 WINE_DEFAULT_DEBUG_CHANNEL(msxml
);
34 typedef struct _xmlparser
36 IXMLParser IXMLParser_iface
;
37 IXMLNodeFactory
*nodefactory
;
42 XML_PARSER_STATE state
;
45 static inline xmlparser
*impl_from_IXMLParser( IXMLParser
*iface
)
47 return CONTAINING_RECORD(iface
, xmlparser
, IXMLParser_iface
);
50 /*** IUnknown methods ***/
51 static HRESULT WINAPI
xmlparser_QueryInterface(IXMLParser
* iface
, REFIID riid
, void **ppvObject
)
53 xmlparser
*This
= impl_from_IXMLParser( iface
);
54 TRACE("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppvObject
);
56 if ( IsEqualGUID( riid
, &IID_IXMLParser
) ||
57 IsEqualGUID( riid
, &IID_IXMLNodeSource
) ||
58 IsEqualGUID( riid
, &IID_IUnknown
) )
64 TRACE("Unsupported interface %s\n", debugstr_guid(riid
));
69 IXMLParser_AddRef(iface
);
73 static ULONG WINAPI
xmlparser_AddRef(IXMLParser
* iface
)
75 xmlparser
*This
= impl_from_IXMLParser( iface
);
76 ULONG ref
= InterlockedIncrement( &This
->ref
);
77 TRACE("%p, refcount %lu.\n", iface
, ref
);
81 static ULONG WINAPI
xmlparser_Release(IXMLParser
* iface
)
83 xmlparser
*This
= impl_from_IXMLParser( iface
);
84 ULONG ref
= InterlockedDecrement( &This
->ref
);
86 TRACE("%p, refcount %lu.\n", iface
, ref
);
90 IUnknown_Release(This
->input
);
93 IXMLNodeFactory_Release(This
->nodefactory
);
101 /*** IXMLNodeSource methods ***/
102 static HRESULT WINAPI
xmlparser_SetFactory(IXMLParser
*iface
, IXMLNodeFactory
*pNodeFactory
)
104 xmlparser
*This
= impl_from_IXMLParser( iface
);
106 TRACE("(%p %p)\n", This
, pNodeFactory
);
108 if(This
->nodefactory
)
109 IXMLNodeFactory_Release(This
->nodefactory
);
111 This
->nodefactory
= pNodeFactory
;
112 if(This
->nodefactory
)
113 IXMLNodeFactory_AddRef(This
->nodefactory
);
118 static HRESULT WINAPI
xmlparser_GetFactory(IXMLParser
*iface
, IXMLNodeFactory
**ppNodeFactory
)
120 xmlparser
*This
= impl_from_IXMLParser( iface
);
122 TRACE("(%p, %p)\n", This
, ppNodeFactory
);
127 *ppNodeFactory
= This
->nodefactory
;
130 IXMLNodeFactory_AddRef(*ppNodeFactory
);
135 static HRESULT WINAPI
xmlparser_Abort(IXMLParser
*iface
, BSTR bstrErrorInfo
)
137 xmlparser
*This
= impl_from_IXMLParser( iface
);
139 FIXME("(%p, %s)\n", This
, debugstr_w(bstrErrorInfo
));
144 static ULONG WINAPI
xmlparser_GetLineNumber(IXMLParser
*iface
)
146 xmlparser
*This
= impl_from_IXMLParser( iface
);
148 FIXME("(%p)\n", This
);
153 static ULONG WINAPI
xmlparser_GetLinePosition(IXMLParser
*iface
)
155 xmlparser
*This
= impl_from_IXMLParser( iface
);
157 FIXME("(%p)\n", This
);
162 static ULONG WINAPI
xmlparser_GetAbsolutePosition(IXMLParser
*iface
)
164 xmlparser
*This
= impl_from_IXMLParser( iface
);
166 FIXME("(%p)\n", This
);
171 static HRESULT WINAPI
xmlparser_GetLineBuffer(IXMLParser
*iface
, const WCHAR
**ppBuf
,
172 ULONG
*len
, ULONG
*startPos
)
174 xmlparser
*This
= impl_from_IXMLParser( iface
);
176 FIXME("(%p %p %p %p)\n", This
, ppBuf
, len
, startPos
);
181 static HRESULT WINAPI
xmlparser_GetLastError(IXMLParser
*iface
)
183 xmlparser
*This
= impl_from_IXMLParser( iface
);
185 FIXME("(%p)\n", This
);
190 static HRESULT WINAPI
xmlparser_GetErrorInfo(IXMLParser
*iface
, BSTR
*pErrorInfo
)
192 xmlparser
*This
= impl_from_IXMLParser( iface
);
194 FIXME("(%p %p)\n", This
, pErrorInfo
);
199 static ULONG WINAPI
xmlparser_GetFlags(IXMLParser
*iface
)
201 xmlparser
*This
= impl_from_IXMLParser( iface
);
203 TRACE("(%p)\n", This
);
208 static HRESULT WINAPI
xmlparser_GetURL(IXMLParser
*iface
, const WCHAR
**ppBuf
)
210 xmlparser
*This
= impl_from_IXMLParser( iface
);
212 FIXME("(%p %p)\n", This
, ppBuf
);
217 /*** IXMLParser methods ***/
218 static HRESULT WINAPI
xmlparser_SetURL(IXMLParser
*iface
,const WCHAR
*pszBaseUrl
,
219 const WCHAR
*relativeUrl
, BOOL async
)
221 xmlparser
*This
= impl_from_IXMLParser( iface
);
223 FIXME("(%p %s %s %d)\n", This
, debugstr_w(pszBaseUrl
), debugstr_w(relativeUrl
), async
);
228 static HRESULT WINAPI
xmlparser_Load(IXMLParser
*iface
, BOOL bFullyAvailable
,
229 IMoniker
*pMon
, LPBC pBC
, DWORD dwMode
)
231 FIXME("%p, %d, %p, %p, %ld.\n", iface
, bFullyAvailable
, pMon
, pBC
, dwMode
);
236 static HRESULT WINAPI
xmlparser_SetInput(IXMLParser
*iface
, IUnknown
*pStm
)
238 xmlparser
*This
= impl_from_IXMLParser( iface
);
240 TRACE("(%p %p)\n", This
, pStm
);
246 IUnknown_Release(This
->input
);
249 IUnknown_AddRef(This
->input
);
254 static HRESULT WINAPI
xmlparser_PushData(IXMLParser
*iface
, const char *pData
,
255 ULONG nChars
, BOOL fLastBuffer
)
257 FIXME("%p, %s, %lu, %d.\n", iface
, debugstr_a(pData
), nChars
, fLastBuffer
);
262 static HRESULT WINAPI
xmlparser_LoadDTD(IXMLParser
*iface
, const WCHAR
*baseUrl
,
263 const WCHAR
*relativeUrl
)
265 xmlparser
*This
= impl_from_IXMLParser( iface
);
267 FIXME("(%p %s %s)\n", This
, debugstr_w(baseUrl
), debugstr_w(relativeUrl
));
272 static HRESULT WINAPI
xmlparser_LoadEntity(IXMLParser
*iface
, const WCHAR
*baseUrl
,
273 const WCHAR
*relativeUrl
, BOOL fpe
)
275 xmlparser
*This
= impl_from_IXMLParser( iface
);
277 FIXME("(%p %s %s %d)\n", This
, debugstr_w(baseUrl
), debugstr_w(relativeUrl
), fpe
);
282 static HRESULT WINAPI
xmlparser_ParseEntity(IXMLParser
*iface
, const WCHAR
*text
,
285 FIXME("%p, %s, %lu, %d.\n", iface
, debugstr_w(text
), len
, fpe
);
290 static HRESULT WINAPI
xmlparser_ExpandEntity(IXMLParser
*iface
, const WCHAR
*text
,
293 FIXME("%p, %s, %ld.\n", iface
, debugstr_w(text
), len
);
298 static HRESULT WINAPI
xmlparser_SetRoot(IXMLParser
*iface
, PVOID pRoot
)
300 xmlparser
*This
= impl_from_IXMLParser( iface
);
302 FIXME("(%p %p)\n", This
, pRoot
);
307 static HRESULT WINAPI
xmlparser_GetRoot( IXMLParser
*iface
, PVOID
*ppRoot
)
309 xmlparser
*This
= impl_from_IXMLParser( iface
);
311 FIXME("(%p %p)\n", This
, ppRoot
);
316 static HRESULT WINAPI
xmlparser_Run(IXMLParser
*iface
, LONG chars
)
318 FIXME("%p, %ld.\n", iface
, chars
);
323 static HRESULT WINAPI
xmlparser_GetParserState(IXMLParser
*iface
)
325 xmlparser
*This
= impl_from_IXMLParser( iface
);
327 TRACE("(%p)\n", This
);
332 static HRESULT WINAPI
xmlparser_Suspend(IXMLParser
*iface
)
334 xmlparser
*This
= impl_from_IXMLParser( iface
);
336 FIXME("(%p)\n", This
);
341 static HRESULT WINAPI
xmlparser_Reset(IXMLParser
*iface
)
343 xmlparser
*This
= impl_from_IXMLParser( iface
);
345 FIXME("(%p)\n", This
);
350 static HRESULT WINAPI
xmlparser_SetFlags(IXMLParser
*iface
, ULONG flags
)
352 xmlparser
*This
= impl_from_IXMLParser( iface
);
354 TRACE("%p, %lx.\n", iface
, flags
);
361 static HRESULT WINAPI
xmlparser_SetSecureBaseURL(IXMLParser
*iface
, const WCHAR
*baseUrl
)
363 xmlparser
*This
= impl_from_IXMLParser( iface
);
365 FIXME("(%p %s)\n", This
, debugstr_w(baseUrl
));
370 static HRESULT WINAPI
xmlparser_GetSecureBaseURL( IXMLParser
*iface
, const WCHAR
**ppBuf
)
372 xmlparser
*This
= impl_from_IXMLParser( iface
);
374 FIXME("(%p %p)\n", This
, ppBuf
);
380 static const struct IXMLParserVtbl xmlparser_vtbl
=
382 xmlparser_QueryInterface
,
385 xmlparser_SetFactory
,
386 xmlparser_GetFactory
,
388 xmlparser_GetLineNumber
,
389 xmlparser_GetLinePosition
,
390 xmlparser_GetAbsolutePosition
,
391 xmlparser_GetLineBuffer
,
392 xmlparser_GetLastError
,
393 xmlparser_GetErrorInfo
,
401 xmlparser_LoadEntity
,
402 xmlparser_ParseEntity
,
403 xmlparser_ExpandEntity
,
407 xmlparser_GetParserState
,
411 xmlparser_SetSecureBaseURL
,
412 xmlparser_GetSecureBaseURL
415 HRESULT
XMLParser_create(void **ppObj
)
419 TRACE("(%p)\n", ppObj
);
421 This
= heap_alloc( sizeof(xmlparser
) );
423 return E_OUTOFMEMORY
;
425 This
->IXMLParser_iface
.lpVtbl
= &xmlparser_vtbl
;
426 This
->nodefactory
= NULL
;
429 This
->state
= XMLPARSER_IDLE
;
432 *ppObj
= &This
->IXMLParser_iface
;
434 TRACE("returning iface %p\n", *ppObj
);