Synchronize with trunk revision 59636 (just before Alex's CreateProcess revamp).
[reactos.git] / dll / win32 / msxml3 / parseerror.c
1 /*
2 * ParseError implementation
3 *
4 * Copyright 2005 Huw Davies
5 *
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.
10 *
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.
15 *
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
19 */
20
21 #define WIN32_NO_STATUS
22 #define _INC_WINDOWS
23
24 #define COBJMACROS
25
26 #include <config.h>
27
28 //#include <stdarg.h>
29 #ifdef HAVE_LIBXML2
30 # include <libxml/parser.h>
31 //# include <libxml/xmlerror.h>
32 #endif
33
34 #include <windef.h>
35 #include <winbase.h>
36 //#include "winerror.h"
37 //#include "winuser.h"
38 #include <ole2.h>
39 #include <msxml6.h>
40
41 #include "msxml_private.h"
42
43 #include <wine/debug.h>
44
45 WINE_DEFAULT_DEBUG_CHANNEL(msxml);
46
47 typedef struct
48 {
49 DispatchEx dispex;
50 IXMLDOMParseError2 IXMLDOMParseError2_iface;
51 LONG ref;
52 LONG code, line, linepos, filepos;
53 BSTR url, reason, srcText;
54 } parse_error_t;
55
56 static inline parse_error_t *impl_from_IXMLDOMParseError2( IXMLDOMParseError2 *iface )
57 {
58 return CONTAINING_RECORD(iface, parse_error_t, IXMLDOMParseError2_iface);
59 }
60
61 static HRESULT WINAPI parseError_QueryInterface(
62 IXMLDOMParseError2 *iface,
63 REFIID riid,
64 void** ppvObject )
65 {
66 parse_error_t *This = impl_from_IXMLDOMParseError2( iface );
67
68 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
69
70 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
71 IsEqualGUID( riid, &IID_IDispatch ) ||
72 IsEqualGUID( riid, &IID_IXMLDOMParseError ) ||
73 IsEqualGUID( riid, &IID_IXMLDOMParseError2 ) )
74 {
75 *ppvObject = iface;
76 }
77 else if (dispex_query_interface(&This->dispex, riid, ppvObject))
78 {
79 return *ppvObject ? S_OK : E_NOINTERFACE;
80 }
81 else
82 {
83 FIXME("interface %s not implemented\n", debugstr_guid(riid));
84 *ppvObject = NULL;
85 return E_NOINTERFACE;
86 }
87
88 IXMLDOMParseError2_AddRef( iface );
89
90 return S_OK;
91 }
92
93 static ULONG WINAPI parseError_AddRef(
94 IXMLDOMParseError2 *iface )
95 {
96 parse_error_t *This = impl_from_IXMLDOMParseError2( iface );
97 ULONG ref = InterlockedIncrement( &This->ref );
98 TRACE("(%p)->(%d)\n", This, ref);
99 return ref;
100 }
101
102 static ULONG WINAPI parseError_Release(
103 IXMLDOMParseError2 *iface )
104 {
105 parse_error_t *This = impl_from_IXMLDOMParseError2( iface );
106 ULONG ref = InterlockedDecrement( &This->ref );
107
108 TRACE("(%p)->(%d)\n", This, ref);
109 if ( ref == 0 )
110 {
111 SysFreeString(This->url);
112 SysFreeString(This->reason);
113 SysFreeString(This->srcText);
114 release_dispex(&This->dispex);
115 heap_free( This );
116 }
117
118 return ref;
119 }
120
121 static HRESULT WINAPI parseError_GetTypeInfoCount(
122 IXMLDOMParseError2 *iface,
123 UINT* pctinfo )
124 {
125 parse_error_t *This = impl_from_IXMLDOMParseError2( iface );
126 return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo);
127 }
128
129 static HRESULT WINAPI parseError_GetTypeInfo(
130 IXMLDOMParseError2 *iface,
131 UINT iTInfo,
132 LCID lcid,
133 ITypeInfo** ppTInfo )
134 {
135 parse_error_t *This = impl_from_IXMLDOMParseError2( iface );
136 return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface,
137 iTInfo, lcid, ppTInfo);
138 }
139
140 static HRESULT WINAPI parseError_GetIDsOfNames(
141 IXMLDOMParseError2 *iface,
142 REFIID riid,
143 LPOLESTR* rgszNames,
144 UINT cNames,
145 LCID lcid,
146 DISPID* rgDispId )
147 {
148 parse_error_t *This = impl_from_IXMLDOMParseError2( iface );
149 return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface,
150 riid, rgszNames, cNames, lcid, rgDispId);
151 }
152
153 static HRESULT WINAPI parseError_Invoke(
154 IXMLDOMParseError2 *iface,
155 DISPID dispIdMember,
156 REFIID riid,
157 LCID lcid,
158 WORD wFlags,
159 DISPPARAMS* pDispParams,
160 VARIANT* pVarResult,
161 EXCEPINFO* pExcepInfo,
162 UINT* puArgErr )
163 {
164 parse_error_t *This = impl_from_IXMLDOMParseError2( iface );
165 return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface,
166 dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
167 }
168
169 static HRESULT WINAPI parseError_get_errorCode(
170 IXMLDOMParseError2 *iface,
171 LONG *code )
172 {
173 parse_error_t *This = impl_from_IXMLDOMParseError2( iface );
174 TRACE("(%p)->(%p)\n", This, code);
175
176 *code = This->code;
177
178 if(This->code == 0)
179 return S_FALSE;
180
181 return S_OK;
182 }
183
184 static HRESULT WINAPI parseError_get_url(
185 IXMLDOMParseError2 *iface,
186 BSTR *url )
187 {
188 parse_error_t *This = impl_from_IXMLDOMParseError2( iface );
189 FIXME("(%p)->(%p)\n", This, url);
190 return E_NOTIMPL;
191 }
192
193 static HRESULT WINAPI parseError_get_reason(
194 IXMLDOMParseError2 *iface,
195 BSTR *reason )
196 {
197 parse_error_t *This = impl_from_IXMLDOMParseError2( iface );
198 TRACE("(%p)->(%p)\n", This, reason);
199
200 if(!This->reason)
201 {
202 *reason = NULL;
203 return S_FALSE;
204 }
205 *reason = SysAllocString(This->reason);
206 return S_OK;
207 }
208
209 static HRESULT WINAPI parseError_get_srcText(
210 IXMLDOMParseError2 *iface,
211 BSTR *srcText )
212 {
213 parse_error_t *This = impl_from_IXMLDOMParseError2( iface );
214
215 TRACE("(%p)->(%p)\n", This, srcText);
216
217 if (!srcText) return E_INVALIDARG;
218
219 *srcText = SysAllocString(This->srcText);
220
221 return S_OK;
222 }
223
224 static HRESULT WINAPI parseError_get_line(
225 IXMLDOMParseError2 *iface,
226 LONG *line )
227 {
228 parse_error_t *This = impl_from_IXMLDOMParseError2( iface );
229
230 TRACE("(%p)->(%p): stub\n", This, line);
231
232 if (!line) return E_INVALIDARG;
233
234 *line = This->line;
235 return S_OK;
236 }
237
238 static HRESULT WINAPI parseError_get_linepos(
239 IXMLDOMParseError2 *iface,
240 LONG *linepos )
241 {
242 parse_error_t *This = impl_from_IXMLDOMParseError2( iface );
243
244 TRACE("(%p)->(%p)\n", This, linepos);
245
246 if (!linepos) return E_INVALIDARG;
247
248 *linepos = This->linepos;
249 return S_OK;
250 }
251
252 static HRESULT WINAPI parseError_get_filepos(
253 IXMLDOMParseError2 *iface,
254 LONG *filepos )
255 {
256 parse_error_t *This = impl_from_IXMLDOMParseError2( iface );
257 FIXME("(%p)->(%p)\n", This, filepos);
258 return E_NOTIMPL;
259 }
260
261 static HRESULT WINAPI parseError_get_errorXPath(
262 IXMLDOMParseError2 *iface,
263 BSTR *xpathexpr)
264 {
265 parse_error_t *This = impl_from_IXMLDOMParseError2( iface );
266 FIXME("(%p)->(%p)\n", This, xpathexpr);
267 return E_NOTIMPL;
268 }
269
270 static HRESULT WINAPI parseError_get_AllErrors(
271 IXMLDOMParseError2 *iface,
272 IXMLDOMParseErrorCollection **allErrors)
273 {
274 parse_error_t *This = impl_from_IXMLDOMParseError2( iface );
275 FIXME("(%p)->(%p)\n", This, allErrors);
276 return E_NOTIMPL;
277 }
278
279 static HRESULT WINAPI parseError_errorParameters(
280 IXMLDOMParseError2 *iface,
281 LONG index,
282 BSTR *param)
283 {
284 parse_error_t *This = impl_from_IXMLDOMParseError2( iface );
285 FIXME("(%p)->(%p)\n", This, param);
286 return E_NOTIMPL;
287 }
288
289 static HRESULT WINAPI parseError_get_errorParametersCount(
290 IXMLDOMParseError2 *iface,
291 LONG *count)
292 {
293 parse_error_t *This = impl_from_IXMLDOMParseError2( iface );
294 FIXME("(%p)->(%p)\n", This, count);
295 return E_NOTIMPL;
296 }
297
298 static const struct IXMLDOMParseError2Vtbl XMLDOMParseError2Vtbl =
299 {
300 parseError_QueryInterface,
301 parseError_AddRef,
302 parseError_Release,
303 parseError_GetTypeInfoCount,
304 parseError_GetTypeInfo,
305 parseError_GetIDsOfNames,
306 parseError_Invoke,
307 parseError_get_errorCode,
308 parseError_get_url,
309 parseError_get_reason,
310 parseError_get_srcText,
311 parseError_get_line,
312 parseError_get_linepos,
313 parseError_get_filepos,
314 parseError_get_errorXPath,
315 parseError_get_AllErrors,
316 parseError_errorParameters,
317 parseError_get_errorParametersCount
318 };
319
320 static const tid_t parseError_iface_tids[] = {
321 IXMLDOMParseError2_tid,
322 0
323 };
324
325 static dispex_static_data_t parseError_dispex = {
326 NULL,
327 IXMLDOMParseError2_tid,
328 NULL,
329 parseError_iface_tids
330 };
331
332 IXMLDOMParseError *create_parseError( LONG code, BSTR url, BSTR reason, BSTR srcText,
333 LONG line, LONG linepos, LONG filepos )
334 {
335 parse_error_t *This;
336
337 This = heap_alloc( sizeof(*This) );
338 if ( !This )
339 return NULL;
340
341 This->IXMLDOMParseError2_iface.lpVtbl = &XMLDOMParseError2Vtbl;
342 This->ref = 1;
343
344 This->code = code;
345 This->url = url;
346 This->reason = reason;
347 This->srcText = srcText;
348 This->line = line;
349 This->linepos = linepos;
350 This->filepos = filepos;
351
352 init_dispex(&This->dispex, (IUnknown*)&This->IXMLDOMParseError2_iface, &parseError_dispex);
353
354 return (IXMLDOMParseError*)&This->IXMLDOMParseError2_iface;
355 }