msxml3: Support IDispatchEx for IXMLDOMParseError.
[wine/multimedia.git] / dlls / msxml3 / parseerror.c
blobb8cc381e3b241187ece1abf553b0e976d45e3b88
1 /*
2 * ParseError implementation
4 * Copyright 2005 Huw Davies
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
22 #define COBJMACROS
24 #include "config.h"
26 #include <stdarg.h>
27 #ifdef HAVE_LIBXML2
28 # include <libxml/parser.h>
29 # include <libxml/xmlerror.h>
30 #endif
32 #include "windef.h"
33 #include "winbase.h"
34 #include "winerror.h"
35 #include "winuser.h"
36 #include "ole2.h"
37 #include "msxml6.h"
39 #include "msxml_private.h"
41 #include "wine/debug.h"
43 WINE_DEFAULT_DEBUG_CHANNEL(msxml);
45 typedef struct
47 DispatchEx dispex;
48 IXMLDOMParseError IXMLDOMParseError_iface;
49 LONG ref;
50 LONG code, line, linepos, filepos;
51 BSTR url, reason, srcText;
52 } parse_error_t;
54 static inline parse_error_t *impl_from_IXMLDOMParseError( IXMLDOMParseError *iface )
56 return CONTAINING_RECORD(iface, parse_error_t, IXMLDOMParseError_iface);
59 static HRESULT WINAPI parseError_QueryInterface(
60 IXMLDOMParseError *iface,
61 REFIID riid,
62 void** ppvObject )
64 parse_error_t *This = impl_from_IXMLDOMParseError( iface );
66 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
68 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
69 IsEqualGUID( riid, &IID_IDispatch ) ||
70 IsEqualGUID( riid, &IID_IXMLDOMParseError ) )
72 *ppvObject = iface;
74 else if (dispex_query_interface(&This->dispex, riid, ppvObject))
76 return *ppvObject ? S_OK : E_NOINTERFACE;
78 else
80 FIXME("interface %s not implemented\n", debugstr_guid(riid));
81 *ppvObject = NULL;
82 return E_NOINTERFACE;
85 IXMLDOMParseError_AddRef( iface );
87 return S_OK;
90 static ULONG WINAPI parseError_AddRef(
91 IXMLDOMParseError *iface )
93 parse_error_t *This = impl_from_IXMLDOMParseError( iface );
94 ULONG ref = InterlockedIncrement( &This->ref );
95 TRACE("(%p)->(%d)\n", This, ref);
96 return ref;
99 static ULONG WINAPI parseError_Release(
100 IXMLDOMParseError *iface )
102 parse_error_t *This = impl_from_IXMLDOMParseError( iface );
103 ULONG ref = InterlockedDecrement( &This->ref );
105 TRACE("(%p)->(%d)\n", This, ref);
106 if ( ref == 0 )
108 SysFreeString(This->url);
109 SysFreeString(This->reason);
110 SysFreeString(This->srcText);
111 release_dispex(&This->dispex);
112 heap_free( This );
115 return ref;
118 static HRESULT WINAPI parseError_GetTypeInfoCount(
119 IXMLDOMParseError *iface,
120 UINT* pctinfo )
122 parse_error_t *This = impl_from_IXMLDOMParseError( iface );
124 TRACE("(%p)->(%p)\n", This, pctinfo);
126 *pctinfo = 1;
128 return S_OK;
131 static HRESULT WINAPI parseError_GetTypeInfo(
132 IXMLDOMParseError *iface,
133 UINT iTInfo,
134 LCID lcid,
135 ITypeInfo** ppTInfo )
137 parse_error_t *This = impl_from_IXMLDOMParseError( iface );
138 HRESULT hr;
140 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
142 hr = get_typeinfo(IXMLDOMParseError_tid, ppTInfo);
144 return hr;
147 static HRESULT WINAPI parseError_GetIDsOfNames(
148 IXMLDOMParseError *iface,
149 REFIID riid,
150 LPOLESTR* rgszNames,
151 UINT cNames,
152 LCID lcid,
153 DISPID* rgDispId )
155 parse_error_t *This = impl_from_IXMLDOMParseError( iface );
156 ITypeInfo *typeinfo;
157 HRESULT hr;
159 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
160 lcid, rgDispId);
162 if(!rgszNames || cNames == 0 || !rgDispId)
163 return E_INVALIDARG;
165 hr = get_typeinfo(IXMLDOMParseError_tid, &typeinfo);
166 if(SUCCEEDED(hr))
168 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
169 ITypeInfo_Release(typeinfo);
172 return hr;
175 static HRESULT WINAPI parseError_Invoke(
176 IXMLDOMParseError *iface,
177 DISPID dispIdMember,
178 REFIID riid,
179 LCID lcid,
180 WORD wFlags,
181 DISPPARAMS* pDispParams,
182 VARIANT* pVarResult,
183 EXCEPINFO* pExcepInfo,
184 UINT* puArgErr )
186 parse_error_t *This = impl_from_IXMLDOMParseError( iface );
187 ITypeInfo *typeinfo;
188 HRESULT hr;
190 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
191 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
193 hr = get_typeinfo(IXMLDOMParseError_tid, &typeinfo);
194 if(SUCCEEDED(hr))
196 hr = ITypeInfo_Invoke(typeinfo, &This->IXMLDOMParseError_iface, dispIdMember, wFlags,
197 pDispParams, pVarResult, pExcepInfo, puArgErr);
198 ITypeInfo_Release(typeinfo);
201 return hr;
204 static HRESULT WINAPI parseError_get_errorCode(
205 IXMLDOMParseError *iface,
206 LONG *code )
208 parse_error_t *This = impl_from_IXMLDOMParseError( iface );
209 TRACE("(%p)->(%p)\n", This, code);
211 *code = This->code;
213 if(This->code == 0)
214 return S_FALSE;
216 return S_OK;
219 static HRESULT WINAPI parseError_get_url(
220 IXMLDOMParseError *iface,
221 BSTR *url )
223 parse_error_t *This = impl_from_IXMLDOMParseError( iface );
224 FIXME("(%p)->(%p)\n", This, url);
225 return E_NOTIMPL;
228 static HRESULT WINAPI parseError_get_reason(
229 IXMLDOMParseError *iface,
230 BSTR *reason )
232 parse_error_t *This = impl_from_IXMLDOMParseError( iface );
233 TRACE("(%p)->(%p)\n", This, reason);
235 if(!This->reason)
237 *reason = NULL;
238 return S_FALSE;
240 *reason = SysAllocString(This->reason);
241 return S_OK;
244 static HRESULT WINAPI parseError_get_srcText(
245 IXMLDOMParseError *iface,
246 BSTR *srcText )
248 parse_error_t *This = impl_from_IXMLDOMParseError( iface );
249 FIXME("(%p)->(%p)\n", This, srcText);
250 return E_NOTIMPL;
253 static HRESULT WINAPI parseError_get_line(
254 IXMLDOMParseError *iface,
255 LONG *line )
257 parse_error_t *This = impl_from_IXMLDOMParseError( iface );
258 FIXME("(%p)->(%p)\n", This, line);
259 return E_NOTIMPL;
262 static HRESULT WINAPI parseError_get_linepos(
263 IXMLDOMParseError *iface,
264 LONG *linepos )
266 parse_error_t *This = impl_from_IXMLDOMParseError( iface );
267 FIXME("(%p)->(%p)\n", This, linepos);
268 return E_NOTIMPL;
271 static HRESULT WINAPI parseError_get_filepos(
272 IXMLDOMParseError *iface,
273 LONG *filepos )
275 parse_error_t *This = impl_from_IXMLDOMParseError( iface );
276 FIXME("(%p)->(%p)\n", This, filepos);
277 return E_NOTIMPL;
280 static const struct IXMLDOMParseErrorVtbl parseError_vtbl =
282 parseError_QueryInterface,
283 parseError_AddRef,
284 parseError_Release,
285 parseError_GetTypeInfoCount,
286 parseError_GetTypeInfo,
287 parseError_GetIDsOfNames,
288 parseError_Invoke,
289 parseError_get_errorCode,
290 parseError_get_url,
291 parseError_get_reason,
292 parseError_get_srcText,
293 parseError_get_line,
294 parseError_get_linepos,
295 parseError_get_filepos
298 static const tid_t parseError_iface_tids[] = {
299 IXMLDOMParseError_tid,
303 static dispex_static_data_t parseError_dispex = {
304 NULL,
305 IXMLDOMParseError_tid,
306 NULL,
307 parseError_iface_tids
310 IXMLDOMParseError *create_parseError( LONG code, BSTR url, BSTR reason, BSTR srcText,
311 LONG line, LONG linepos, LONG filepos )
313 parse_error_t *This;
315 This = heap_alloc( sizeof(*This) );
316 if ( !This )
317 return NULL;
319 This->IXMLDOMParseError_iface.lpVtbl = &parseError_vtbl;
320 This->ref = 1;
322 This->code = code;
323 This->url = url;
324 This->reason = reason;
325 This->srcText = srcText;
326 This->line = line;
327 This->linepos = linepos;
328 This->filepos = filepos;
330 init_dispex(&This->dispex, (IUnknown*)&This->IXMLDOMParseError_iface, &parseError_dispex);
332 return &This->IXMLDOMParseError_iface;