ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

element.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.