Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenelement.c
Go to the documentation of this file.
00001 /* 00002 * DOM Document implementation 00003 * 00004 * Copyright 2005 Mike McCormack 00005 * 00006 * This library is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU Lesser General Public 00008 * License as published by the Free Software Foundation; either 00009 * version 2.1 of the License, or (at your option) any later version. 00010 * 00011 * This library is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 * Lesser General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU Lesser General Public 00017 * License along with this library; if not, write to the Free Software 00018 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 00019 */ 00020 00021 #define COBJMACROS 00022 00023 #include "config.h" 00024 00025 #include <stdarg.h> 00026 #include "windef.h" 00027 #include "winbase.h" 00028 #include "winuser.h" 00029 #include "winnls.h" 00030 #include "ole2.h" 00031 #include "msxml2.h" 00032 00033 #include "msxml_private.h" 00034 00035 #include "wine/debug.h" 00036 00037 WINE_DEFAULT_DEBUG_CHANNEL(msxml); 00038 00039 #ifdef HAVE_LIBXML2 00040 00041 typedef struct _domelem 00042 { 00043 xmlnode node; 00044 const struct IXMLDOMElementVtbl *lpVtbl; 00045 LONG ref; 00046 } domelem; 00047 00048 static inline domelem *impl_from_IXMLDOMElement( IXMLDOMElement *iface ) 00049 { 00050 return (domelem *)((char*)iface - FIELD_OFFSET(domelem, lpVtbl)); 00051 } 00052 00053 static inline xmlNodePtr get_element( domelem *This ) 00054 { 00055 return This->node.node; 00056 } 00057 00058 static HRESULT WINAPI domelem_QueryInterface( 00059 IXMLDOMElement *iface, 00060 REFIID riid, 00061 void** ppvObject ) 00062 { 00063 domelem *This = impl_from_IXMLDOMElement( iface ); 00064 00065 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject); 00066 00067 if ( IsEqualGUID( riid, &IID_IXMLDOMElement ) || 00068 IsEqualGUID( riid, &IID_IDispatch ) || 00069 IsEqualGUID( riid, &IID_IUnknown ) ) 00070 { 00071 *ppvObject = &This->lpVtbl; 00072 } 00073 else if ( IsEqualGUID( riid, &IID_IXMLDOMNode ) ) 00074 { 00075 *ppvObject = IXMLDOMNode_from_impl(&This->node); 00076 } 00077 else if(dispex_query_interface(&This->node.dispex, riid, ppvObject)) 00078 { 00079 return *ppvObject ? S_OK : E_NOINTERFACE; 00080 } 00081 else 00082 { 00083 FIXME("interface %s not implemented\n", debugstr_guid(riid)); 00084 return E_NOINTERFACE; 00085 } 00086 00087 IUnknown_AddRef( (IUnknown*)*ppvObject ); 00088 return S_OK; 00089 } 00090 00091 static ULONG WINAPI domelem_AddRef( 00092 IXMLDOMElement *iface ) 00093 { 00094 domelem *This = impl_from_IXMLDOMElement( iface ); 00095 LONG ref = InterlockedIncrement(&This->ref); 00096 00097 TRACE("(%p) ref=%d\n", This, ref); 00098 00099 return ref; 00100 } 00101 00102 static ULONG WINAPI domelem_Release( 00103 IXMLDOMElement *iface ) 00104 { 00105 domelem *This = impl_from_IXMLDOMElement( iface ); 00106 ULONG ref = InterlockedDecrement(&This->ref); 00107 00108 TRACE("(%p) ref=%d\n", This, ref); 00109 00110 if(!ref) { 00111 destroy_xmlnode(&This->node); 00112 heap_free(This); 00113 } 00114 00115 return ref; 00116 } 00117 00118 static HRESULT WINAPI domelem_GetTypeInfoCount( 00119 IXMLDOMElement *iface, 00120 UINT* pctinfo ) 00121 { 00122 domelem *This = impl_from_IXMLDOMElement( iface ); 00123 00124 TRACE("(%p)->(%p)\n", This, pctinfo); 00125 00126 *pctinfo = 1; 00127 00128 return S_OK; 00129 } 00130 00131 static HRESULT WINAPI domelem_GetTypeInfo( 00132 IXMLDOMElement *iface, 00133 UINT iTInfo, LCID lcid, 00134 ITypeInfo** ppTInfo ) 00135 { 00136 domelem *This = impl_from_IXMLDOMElement( iface ); 00137 HRESULT hr; 00138 00139 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo); 00140 00141 hr = get_typeinfo(IXMLDOMElement_tid, ppTInfo); 00142 00143 return hr; 00144 } 00145 00146 static HRESULT WINAPI domelem_GetIDsOfNames( 00147 IXMLDOMElement *iface, 00148 REFIID riid, LPOLESTR* rgszNames, 00149 UINT cNames, LCID lcid, DISPID* rgDispId ) 00150 { 00151 domelem *This = impl_from_IXMLDOMElement( iface ); 00152 ITypeInfo *typeinfo; 00153 HRESULT hr; 00154 00155 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, 00156 lcid, rgDispId); 00157 00158 if(!rgszNames || cNames == 0 || !rgDispId) 00159 return E_INVALIDARG; 00160 00161 hr = get_typeinfo(IXMLDOMElement_tid, &typeinfo); 00162 if(SUCCEEDED(hr)) 00163 { 00164 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId); 00165 ITypeInfo_Release(typeinfo); 00166 } 00167 00168 return hr; 00169 } 00170 00171 static HRESULT WINAPI domelem_Invoke( 00172 IXMLDOMElement *iface, 00173 DISPID dispIdMember, REFIID riid, LCID lcid, 00174 WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, 00175 EXCEPINFO* pExcepInfo, UINT* puArgErr ) 00176 { 00177 domelem *This = impl_from_IXMLDOMElement( iface ); 00178 ITypeInfo *typeinfo; 00179 HRESULT hr; 00180 00181 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid), 00182 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); 00183 00184 hr = get_typeinfo(IXMLDOMElement_tid, &typeinfo); 00185 if(SUCCEEDED(hr)) 00186 { 00187 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVtbl), dispIdMember, wFlags, pDispParams, 00188 pVarResult, pExcepInfo, puArgErr); 00189 ITypeInfo_Release(typeinfo); 00190 } 00191 00192 return hr; 00193 } 00194 00195 static HRESULT WINAPI domelem_get_nodeName( 00196 IXMLDOMElement *iface, 00197 BSTR* p ) 00198 { 00199 domelem *This = impl_from_IXMLDOMElement( iface ); 00200 return IXMLDOMNode_get_nodeName( IXMLDOMNode_from_impl(&This->node), p ); 00201 } 00202 00203 static HRESULT WINAPI domelem_get_nodeValue( 00204 IXMLDOMElement *iface, 00205 VARIANT* var1 ) 00206 { 00207 domelem *This = impl_from_IXMLDOMElement( iface ); 00208 return IXMLDOMNode_get_nodeValue( IXMLDOMNode_from_impl(&This->node), var1 ); 00209 } 00210 00211 static HRESULT WINAPI domelem_put_nodeValue( 00212 IXMLDOMElement *iface, 00213 VARIANT var1 ) 00214 { 00215 domelem *This = impl_from_IXMLDOMElement( iface ); 00216 return IXMLDOMNode_put_nodeValue( IXMLDOMNode_from_impl(&This->node), var1 ); 00217 } 00218 00219 static HRESULT WINAPI domelem_get_nodeType( 00220 IXMLDOMElement *iface, 00221 DOMNodeType* domNodeType ) 00222 { 00223 domelem *This = impl_from_IXMLDOMElement( iface ); 00224 return IXMLDOMNode_get_nodeType( IXMLDOMNode_from_impl(&This->node), domNodeType ); 00225 } 00226 00227 static HRESULT WINAPI domelem_get_parentNode( 00228 IXMLDOMElement *iface, 00229 IXMLDOMNode** parent ) 00230 { 00231 domelem *This = impl_from_IXMLDOMElement( iface ); 00232 return IXMLDOMNode_get_parentNode( IXMLDOMNode_from_impl(&This->node), parent ); 00233 } 00234 00235 static HRESULT WINAPI domelem_get_childNodes( 00236 IXMLDOMElement *iface, 00237 IXMLDOMNodeList** outList) 00238 { 00239 domelem *This = impl_from_IXMLDOMElement( iface ); 00240 return IXMLDOMNode_get_childNodes( IXMLDOMNode_from_impl(&This->node), outList ); 00241 } 00242 00243 static HRESULT WINAPI domelem_get_firstChild( 00244 IXMLDOMElement *iface, 00245 IXMLDOMNode** domNode) 00246 { 00247 domelem *This = impl_from_IXMLDOMElement( iface ); 00248 return IXMLDOMNode_get_firstChild( IXMLDOMNode_from_impl(&This->node), domNode ); 00249 } 00250 00251 static HRESULT WINAPI domelem_get_lastChild( 00252 IXMLDOMElement *iface, 00253 IXMLDOMNode** domNode) 00254 { 00255 domelem *This = impl_from_IXMLDOMElement( iface ); 00256 return IXMLDOMNode_get_lastChild( IXMLDOMNode_from_impl(&This->node), domNode ); 00257 } 00258 00259 static HRESULT WINAPI domelem_get_previousSibling( 00260 IXMLDOMElement *iface, 00261 IXMLDOMNode** domNode) 00262 { 00263 domelem *This = impl_from_IXMLDOMElement( iface ); 00264 return IXMLDOMNode_get_previousSibling( IXMLDOMNode_from_impl(&This->node), domNode ); 00265 } 00266 00267 static HRESULT WINAPI domelem_get_nextSibling( 00268 IXMLDOMElement *iface, 00269 IXMLDOMNode** domNode) 00270 { 00271 domelem *This = impl_from_IXMLDOMElement( iface ); 00272 return IXMLDOMNode_get_nextSibling( IXMLDOMNode_from_impl(&This->node), domNode ); 00273 } 00274 00275 static HRESULT WINAPI domelem_get_attributes( 00276 IXMLDOMElement *iface, 00277 IXMLDOMNamedNodeMap** attributeMap) 00278 { 00279 domelem *This = impl_from_IXMLDOMElement( iface ); 00280 return IXMLDOMNode_get_attributes( IXMLDOMNode_from_impl(&This->node), attributeMap ); 00281 } 00282 00283 static HRESULT WINAPI domelem_insertBefore( 00284 IXMLDOMElement *iface, 00285 IXMLDOMNode* newNode, VARIANT var1, 00286 IXMLDOMNode** outOldNode) 00287 { 00288 domelem *This = impl_from_IXMLDOMElement( iface ); 00289 return IXMLDOMNode_insertBefore( IXMLDOMNode_from_impl(&This->node), newNode, var1, outOldNode ); 00290 } 00291 00292 static HRESULT WINAPI domelem_replaceChild( 00293 IXMLDOMElement *iface, 00294 IXMLDOMNode* newNode, 00295 IXMLDOMNode* oldNode, 00296 IXMLDOMNode** outOldNode) 00297 { 00298 domelem *This = impl_from_IXMLDOMElement( iface ); 00299 return IXMLDOMNode_replaceChild( IXMLDOMNode_from_impl(&This->node), newNode, oldNode, outOldNode ); 00300 } 00301 00302 static HRESULT WINAPI domelem_removeChild( 00303 IXMLDOMElement *iface, 00304 IXMLDOMNode* domNode, IXMLDOMNode** oldNode) 00305 { 00306 domelem *This = impl_from_IXMLDOMElement( iface ); 00307 return IXMLDOMNode_removeChild( IXMLDOMNode_from_impl(&This->node), domNode, oldNode ); 00308 } 00309 00310 static HRESULT WINAPI domelem_appendChild( 00311 IXMLDOMElement *iface, 00312 IXMLDOMNode* newNode, IXMLDOMNode** outNewNode) 00313 { 00314 domelem *This = impl_from_IXMLDOMElement( iface ); 00315 return IXMLDOMNode_appendChild( IXMLDOMNode_from_impl(&This->node), newNode, outNewNode ); 00316 } 00317 00318 static HRESULT WINAPI domelem_hasChildNodes( 00319 IXMLDOMElement *iface, 00320 VARIANT_BOOL* pbool) 00321 { 00322 domelem *This = impl_from_IXMLDOMElement( iface ); 00323 return IXMLDOMNode_hasChildNodes( IXMLDOMNode_from_impl(&This->node), pbool ); 00324 } 00325 00326 static HRESULT WINAPI domelem_get_ownerDocument( 00327 IXMLDOMElement *iface, 00328 IXMLDOMDocument** domDocument) 00329 { 00330 domelem *This = impl_from_IXMLDOMElement( iface ); 00331 return IXMLDOMNode_get_ownerDocument( IXMLDOMNode_from_impl(&This->node), domDocument ); 00332 } 00333 00334 static HRESULT WINAPI domelem_cloneNode( 00335 IXMLDOMElement *iface, 00336 VARIANT_BOOL pbool, IXMLDOMNode** outNode) 00337 { 00338 domelem *This = impl_from_IXMLDOMElement( iface ); 00339 return IXMLDOMNode_cloneNode( IXMLDOMNode_from_impl(&This->node), pbool, outNode ); 00340 } 00341 00342 static HRESULT WINAPI domelem_get_nodeTypeString( 00343 IXMLDOMElement *iface, 00344 BSTR* p) 00345 { 00346 domelem *This = impl_from_IXMLDOMElement( iface ); 00347 return IXMLDOMNode_get_nodeTypeString( IXMLDOMNode_from_impl(&This->node), p ); 00348 } 00349 00350 static HRESULT WINAPI domelem_get_text( 00351 IXMLDOMElement *iface, 00352 BSTR* p) 00353 { 00354 domelem *This = impl_from_IXMLDOMElement( iface ); 00355 return IXMLDOMNode_get_text( IXMLDOMNode_from_impl(&This->node), p ); 00356 } 00357 00358 static HRESULT WINAPI domelem_put_text( 00359 IXMLDOMElement *iface, 00360 BSTR p) 00361 { 00362 domelem *This = impl_from_IXMLDOMElement( iface ); 00363 return IXMLDOMNode_put_text( IXMLDOMNode_from_impl(&This->node), p ); 00364 } 00365 00366 static HRESULT WINAPI domelem_get_specified( 00367 IXMLDOMElement *iface, 00368 VARIANT_BOOL* pbool) 00369 { 00370 domelem *This = impl_from_IXMLDOMElement( iface ); 00371 return IXMLDOMNode_get_specified( IXMLDOMNode_from_impl(&This->node), pbool ); 00372 } 00373 00374 static HRESULT WINAPI domelem_get_definition( 00375 IXMLDOMElement *iface, 00376 IXMLDOMNode** domNode) 00377 { 00378 domelem *This = impl_from_IXMLDOMElement( iface ); 00379 return IXMLDOMNode_get_definition( IXMLDOMNode_from_impl(&This->node), domNode ); 00380 } 00381 00382 static HRESULT WINAPI domelem_get_nodeTypedValue( 00383 IXMLDOMElement *iface, 00384 VARIANT* var1) 00385 { 00386 domelem *This = impl_from_IXMLDOMElement( iface ); 00387 return IXMLDOMNode_get_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 ); 00388 } 00389 00390 static HRESULT WINAPI domelem_put_nodeTypedValue( 00391 IXMLDOMElement *iface, 00392 VARIANT var1) 00393 { 00394 domelem *This = impl_from_IXMLDOMElement( iface ); 00395 return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 ); 00396 } 00397 00398 static HRESULT WINAPI domelem_get_dataType( 00399 IXMLDOMElement *iface, 00400 VARIANT* var1) 00401 { 00402 domelem *This = impl_from_IXMLDOMElement( iface ); 00403 return IXMLDOMNode_get_dataType( IXMLDOMNode_from_impl(&This->node), var1 ); 00404 } 00405 00406 static HRESULT WINAPI domelem_put_dataType( 00407 IXMLDOMElement *iface, 00408 BSTR p) 00409 { 00410 domelem *This = impl_from_IXMLDOMElement( iface ); 00411 return IXMLDOMNode_put_dataType( IXMLDOMNode_from_impl(&This->node), p ); 00412 } 00413 00414 static HRESULT WINAPI domelem_get_xml( 00415 IXMLDOMElement *iface, 00416 BSTR* p) 00417 { 00418 domelem *This = impl_from_IXMLDOMElement( iface ); 00419 return IXMLDOMNode_get_xml( IXMLDOMNode_from_impl(&This->node), p ); 00420 } 00421 00422 static HRESULT WINAPI domelem_transformNode( 00423 IXMLDOMElement *iface, 00424 IXMLDOMNode* domNode, BSTR* p) 00425 { 00426 domelem *This = impl_from_IXMLDOMElement( iface ); 00427 return IXMLDOMNode_transformNode( IXMLDOMNode_from_impl(&This->node), domNode, p ); 00428 } 00429 00430 static HRESULT WINAPI domelem_selectNodes( 00431 IXMLDOMElement *iface, 00432 BSTR p, IXMLDOMNodeList** outList) 00433 { 00434 domelem *This = impl_from_IXMLDOMElement( iface ); 00435 return IXMLDOMNode_selectNodes( IXMLDOMNode_from_impl(&This->node), p, outList ); 00436 } 00437 00438 static HRESULT WINAPI domelem_selectSingleNode( 00439 IXMLDOMElement *iface, 00440 BSTR p, IXMLDOMNode** outNode) 00441 { 00442 domelem *This = impl_from_IXMLDOMElement( iface ); 00443 return IXMLDOMNode_selectSingleNode( IXMLDOMNode_from_impl(&This->node), p, outNode ); 00444 } 00445 00446 static HRESULT WINAPI domelem_get_parsed( 00447 IXMLDOMElement *iface, 00448 VARIANT_BOOL* pbool) 00449 { 00450 domelem *This = impl_from_IXMLDOMElement( iface ); 00451 return IXMLDOMNode_get_parsed( IXMLDOMNode_from_impl(&This->node), pbool ); 00452 } 00453 00454 static HRESULT WINAPI domelem_get_namespaceURI( 00455 IXMLDOMElement *iface, 00456 BSTR* p) 00457 { 00458 domelem *This = impl_from_IXMLDOMElement( iface ); 00459 return IXMLDOMNode_get_namespaceURI( IXMLDOMNode_from_impl(&This->node), p ); 00460 } 00461 00462 static HRESULT WINAPI domelem_get_prefix( 00463 IXMLDOMElement *iface, 00464 BSTR* p) 00465 { 00466 domelem *This = impl_from_IXMLDOMElement( iface ); 00467 return IXMLDOMNode_get_prefix( IXMLDOMNode_from_impl(&This->node), p ); 00468 } 00469 00470 static HRESULT WINAPI domelem_get_baseName( 00471 IXMLDOMElement *iface, 00472 BSTR* p) 00473 { 00474 domelem *This = impl_from_IXMLDOMElement( iface ); 00475 return IXMLDOMNode_get_baseName( IXMLDOMNode_from_impl(&This->node), p ); 00476 } 00477 00478 static HRESULT WINAPI domelem_transformNodeToObject( 00479 IXMLDOMElement *iface, 00480 IXMLDOMNode* domNode, VARIANT var1) 00481 { 00482 domelem *This = impl_from_IXMLDOMElement( iface ); 00483 return IXMLDOMNode_transformNodeToObject( IXMLDOMNode_from_impl(&This->node), domNode, var1 ); 00484 } 00485 00486 static HRESULT WINAPI domelem_get_tagName( 00487 IXMLDOMElement *iface, 00488 BSTR* p) 00489 { 00490 domelem *This = impl_from_IXMLDOMElement( iface ); 00491 xmlNodePtr element; 00492 const xmlChar *prefix; 00493 xmlChar *qname; 00494 00495 TRACE("(%p)->(%p)\n", This, p ); 00496 00497 if (!p) return E_INVALIDARG; 00498 00499 element = get_element( This ); 00500 if ( !element ) 00501 return E_FAIL; 00502 00503 prefix = element->ns ? element->ns->prefix : NULL; 00504 qname = xmlBuildQName(element->name, prefix, NULL, 0); 00505 00506 *p = bstr_from_xmlChar(qname); 00507 if (qname != element->name) xmlFree(qname); 00508 00509 return *p ? S_OK : E_OUTOFMEMORY; 00510 } 00511 00512 static HRESULT WINAPI domelem_getAttribute( 00513 IXMLDOMElement *iface, 00514 BSTR name, VARIANT* value) 00515 { 00516 domelem *This = impl_from_IXMLDOMElement( iface ); 00517 xmlNodePtr element; 00518 xmlChar *xml_name, *xml_value = NULL; 00519 HRESULT hr = S_FALSE; 00520 00521 TRACE("(%p)->(%s %p)\n", This, debugstr_w(name), value); 00522 00523 if(!value || !name) 00524 return E_INVALIDARG; 00525 00526 element = get_element( This ); 00527 if ( !element ) 00528 return E_FAIL; 00529 00530 V_BSTR(value) = NULL; 00531 V_VT(value) = VT_NULL; 00532 00533 xml_name = xmlChar_from_wchar( name ); 00534 00535 if(!xmlValidateNameValue(xml_name)) 00536 hr = E_FAIL; 00537 else 00538 xml_value = xmlGetNsProp(element, xml_name, NULL); 00539 00540 heap_free(xml_name); 00541 if(xml_value) 00542 { 00543 V_VT(value) = VT_BSTR; 00544 V_BSTR(value) = bstr_from_xmlChar( xml_value ); 00545 xmlFree(xml_value); 00546 hr = S_OK; 00547 } 00548 00549 return hr; 00550 } 00551 00552 static HRESULT WINAPI domelem_setAttribute( 00553 IXMLDOMElement *iface, 00554 BSTR name, VARIANT value) 00555 { 00556 domelem *This = impl_from_IXMLDOMElement( iface ); 00557 xmlNodePtr element; 00558 xmlChar *xml_name, *xml_value; 00559 HRESULT hr; 00560 VARIANT var; 00561 00562 TRACE("(%p)->(%s var)\n", This, debugstr_w(name)); 00563 00564 element = get_element( This ); 00565 if ( !element ) 00566 return E_FAIL; 00567 00568 VariantInit(&var); 00569 hr = VariantChangeType(&var, &value, 0, VT_BSTR); 00570 if(hr != S_OK) 00571 { 00572 FIXME("VariantChangeType failed\n"); 00573 return hr; 00574 } 00575 00576 xml_name = xmlChar_from_wchar( name ); 00577 xml_value = xmlChar_from_wchar( V_BSTR(&var) ); 00578 00579 if(!xmlSetNsProp(element, NULL, xml_name, xml_value)) 00580 hr = E_FAIL; 00581 00582 heap_free(xml_value); 00583 heap_free(xml_name); 00584 VariantClear(&var); 00585 00586 return hr; 00587 } 00588 00589 static HRESULT WINAPI domelem_removeAttribute( 00590 IXMLDOMElement *iface, 00591 BSTR p) 00592 { 00593 domelem *This = impl_from_IXMLDOMElement( iface ); 00594 IXMLDOMNamedNodeMap *attr; 00595 HRESULT hr; 00596 00597 TRACE("(%p)->(%s)\n", This, debugstr_w(p)); 00598 00599 hr = IXMLDOMElement_get_attributes(iface, &attr); 00600 if (hr != S_OK) return hr; 00601 00602 hr = IXMLDOMNamedNodeMap_removeNamedItem(attr, p, NULL); 00603 IXMLDOMNamedNodeMap_Release(attr); 00604 00605 return hr; 00606 } 00607 00608 static HRESULT WINAPI domelem_getAttributeNode( 00609 IXMLDOMElement *iface, 00610 BSTR p, IXMLDOMAttribute** attributeNode ) 00611 { 00612 domelem *This = impl_from_IXMLDOMElement( iface ); 00613 xmlChar *xml_name; 00614 xmlNodePtr element; 00615 xmlAttrPtr attr; 00616 IUnknown *unk; 00617 HRESULT hr = S_FALSE; 00618 00619 TRACE("(%p)->(%s %p)\n", This, debugstr_w(p), attributeNode); 00620 00621 if(!attributeNode) 00622 return E_FAIL; 00623 00624 *attributeNode = NULL; 00625 00626 element = get_element( This ); 00627 if ( !element ) 00628 return E_FAIL; 00629 00630 xml_name = xmlChar_from_wchar(p); 00631 00632 if(!xmlValidateNameValue(xml_name)) 00633 { 00634 heap_free(xml_name); 00635 return E_FAIL; 00636 } 00637 00638 attr = xmlHasProp(element, xml_name); 00639 if(attr) { 00640 unk = create_attribute((xmlNodePtr)attr); 00641 hr = IUnknown_QueryInterface(unk, &IID_IXMLDOMAttribute, (void**)attributeNode); 00642 IUnknown_Release(unk); 00643 } 00644 00645 heap_free(xml_name); 00646 00647 return hr; 00648 } 00649 00650 static HRESULT WINAPI domelem_setAttributeNode( 00651 IXMLDOMElement *iface, 00652 IXMLDOMAttribute* domAttribute, 00653 IXMLDOMAttribute** attributeNode) 00654 { 00655 domelem *This = impl_from_IXMLDOMElement( iface ); 00656 FIXME("(%p)->(%p %p)\n", This, domAttribute, attributeNode); 00657 return E_NOTIMPL; 00658 } 00659 00660 static HRESULT WINAPI domelem_removeAttributeNode( 00661 IXMLDOMElement *iface, 00662 IXMLDOMAttribute* domAttribute, 00663 IXMLDOMAttribute** attributeNode) 00664 { 00665 domelem *This = impl_from_IXMLDOMElement( iface ); 00666 FIXME("(%p)->(%p %p)\n", This, domAttribute, attributeNode); 00667 return E_NOTIMPL; 00668 } 00669 00670 static HRESULT WINAPI domelem_getElementsByTagName( 00671 IXMLDOMElement *iface, 00672 BSTR bstrName, IXMLDOMNodeList** resultList) 00673 { 00674 static const WCHAR xpathformat[] = 00675 { '.','/','/','*','[','l','o','c','a','l','-','n','a','m','e','(',')','=','\'','%','s','\'',']',0 }; 00676 domelem *This = impl_from_IXMLDOMElement( iface ); 00677 LPWSTR szPattern; 00678 xmlNodePtr element; 00679 HRESULT hr; 00680 00681 TRACE("(%p)->(%s %p)\n", This, debugstr_w(bstrName), resultList); 00682 00683 if (bstrName[0] == '*' && bstrName[1] == 0) 00684 { 00685 szPattern = heap_alloc(sizeof(WCHAR)*5); 00686 szPattern[0] = '.'; 00687 szPattern[1] = szPattern[2] = '/'; 00688 szPattern[3] = '*'; 00689 szPattern[4] = 0; 00690 } 00691 else 00692 { 00693 szPattern = heap_alloc(sizeof(WCHAR)*(21+lstrlenW(bstrName)+1)); 00694 wsprintfW(szPattern, xpathformat, bstrName); 00695 } 00696 TRACE("%s\n", debugstr_w(szPattern)); 00697 00698 element = get_element(This); 00699 if (!element) 00700 hr = E_FAIL; 00701 else 00702 hr = queryresult_create(element, szPattern, resultList); 00703 heap_free(szPattern); 00704 00705 return hr; 00706 } 00707 00708 static HRESULT WINAPI domelem_normalize( 00709 IXMLDOMElement *iface ) 00710 { 00711 domelem *This = impl_from_IXMLDOMElement( iface ); 00712 FIXME("%p\n", This); 00713 return E_NOTIMPL; 00714 } 00715 00716 static const struct IXMLDOMElementVtbl domelem_vtbl = 00717 { 00718 domelem_QueryInterface, 00719 domelem_AddRef, 00720 domelem_Release, 00721 domelem_GetTypeInfoCount, 00722 domelem_GetTypeInfo, 00723 domelem_GetIDsOfNames, 00724 domelem_Invoke, 00725 domelem_get_nodeName, 00726 domelem_get_nodeValue, 00727 domelem_put_nodeValue, 00728 domelem_get_nodeType, 00729 domelem_get_parentNode, 00730 domelem_get_childNodes, 00731 domelem_get_firstChild, 00732 domelem_get_lastChild, 00733 domelem_get_previousSibling, 00734 domelem_get_nextSibling, 00735 domelem_get_attributes, 00736 domelem_insertBefore, 00737 domelem_replaceChild, 00738 domelem_removeChild, 00739 domelem_appendChild, 00740 domelem_hasChildNodes, 00741 domelem_get_ownerDocument, 00742 domelem_cloneNode, 00743 domelem_get_nodeTypeString, 00744 domelem_get_text, 00745 domelem_put_text, 00746 domelem_get_specified, 00747 domelem_get_definition, 00748 domelem_get_nodeTypedValue, 00749 domelem_put_nodeTypedValue, 00750 domelem_get_dataType, 00751 domelem_put_dataType, 00752 domelem_get_xml, 00753 domelem_transformNode, 00754 domelem_selectNodes, 00755 domelem_selectSingleNode, 00756 domelem_get_parsed, 00757 domelem_get_namespaceURI, 00758 domelem_get_prefix, 00759 domelem_get_baseName, 00760 domelem_transformNodeToObject, 00761 domelem_get_tagName, 00762 domelem_getAttribute, 00763 domelem_setAttribute, 00764 domelem_removeAttribute, 00765 domelem_getAttributeNode, 00766 domelem_setAttributeNode, 00767 domelem_removeAttributeNode, 00768 domelem_getElementsByTagName, 00769 domelem_normalize, 00770 }; 00771 00772 static const tid_t domelem_iface_tids[] = { 00773 IXMLDOMElement_tid, 00774 0 00775 }; 00776 00777 static dispex_static_data_t domelem_dispex = { 00778 NULL, 00779 IXMLDOMElement_tid, 00780 NULL, 00781 domelem_iface_tids 00782 }; 00783 00784 IUnknown* create_element( xmlNodePtr element ) 00785 { 00786 domelem *This; 00787 00788 This = heap_alloc( sizeof *This ); 00789 if ( !This ) 00790 return NULL; 00791 00792 This->lpVtbl = &domelem_vtbl; 00793 This->ref = 1; 00794 00795 init_xmlnode(&This->node, element, (IUnknown*)&This->lpVtbl, &domelem_dispex); 00796 00797 return (IUnknown*) &This->lpVtbl; 00798 } 00799 00800 #endif Generated on Sun May 27 2012 04:25:24 for ReactOS by
1.7.6.1
|