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 } 353