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