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

cdata.c
Go to the documentation of this file.
00001 /*
00002  *    DOM CDATA node implementation
00003  *
00004  * Copyright 2007 Alistair Leslie-Hughes
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 "ole2.h"
00030 #include "msxml2.h"
00031 
00032 #include "msxml_private.h"
00033 
00034 #include "wine/debug.h"
00035 
00036 WINE_DEFAULT_DEBUG_CHANNEL(msxml);
00037 
00038 #ifdef HAVE_LIBXML2
00039 
00040 typedef struct _domcdata
00041 {
00042     xmlnode node;
00043     const struct IXMLDOMCDATASectionVtbl *lpVtbl;
00044     LONG ref;
00045 } domcdata;
00046 
00047 static inline domcdata *impl_from_IXMLDOMCDATASection( IXMLDOMCDATASection *iface )
00048 {
00049     return (domcdata *)((char*)iface - FIELD_OFFSET(domcdata, lpVtbl));
00050 }
00051 
00052 static HRESULT WINAPI domcdata_QueryInterface(
00053     IXMLDOMCDATASection *iface,
00054     REFIID riid,
00055     void** ppvObject )
00056 {
00057     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00058     TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
00059 
00060     if ( IsEqualGUID( riid, &IID_IXMLDOMCDATASection ) ||
00061          IsEqualGUID( riid, &IID_IXMLDOMCharacterData) ||
00062          IsEqualGUID( riid, &IID_IDispatch ) ||
00063          IsEqualGUID( riid, &IID_IUnknown ) )
00064     {
00065         *ppvObject = iface;
00066     }
00067     else if ( IsEqualGUID( riid, &IID_IXMLDOMNode ) )
00068     {
00069         *ppvObject = IXMLDOMNode_from_impl(&This->node);
00070     }
00071     else if ( IsEqualGUID( riid, &IID_IXMLDOMText ) ||
00072               IsEqualGUID( riid, &IID_IXMLDOMElement ) )
00073     {
00074         TRACE("Unsupported interface\n");
00075         return E_NOINTERFACE;
00076     }
00077     else
00078     {
00079         FIXME("Unsupported interface %s\n", debugstr_guid(riid));
00080         return E_NOINTERFACE;
00081     }
00082 
00083     IXMLDOMText_AddRef((IUnknown*)*ppvObject);
00084     return S_OK;
00085 }
00086 
00087 static ULONG WINAPI domcdata_AddRef(
00088     IXMLDOMCDATASection *iface )
00089 {
00090     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00091     return InterlockedIncrement( &This->ref );
00092 }
00093 
00094 static ULONG WINAPI domcdata_Release(
00095     IXMLDOMCDATASection *iface )
00096 {
00097     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00098     ULONG ref;
00099 
00100     ref = InterlockedDecrement( &This->ref );
00101     if ( ref == 0 )
00102     {
00103         destroy_xmlnode(&This->node);
00104         heap_free( This );
00105     }
00106 
00107     return ref;
00108 }
00109 
00110 static HRESULT WINAPI domcdata_GetTypeInfoCount(
00111     IXMLDOMCDATASection *iface,
00112     UINT* pctinfo )
00113 {
00114     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00115 
00116     TRACE("(%p)->(%p)\n", This, pctinfo);
00117 
00118     *pctinfo = 1;
00119 
00120     return S_OK;
00121 }
00122 
00123 static HRESULT WINAPI domcdata_GetTypeInfo(
00124     IXMLDOMCDATASection *iface,
00125     UINT iTInfo, LCID lcid,
00126     ITypeInfo** ppTInfo )
00127 {
00128     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00129     HRESULT hr;
00130 
00131     TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
00132 
00133     hr = get_typeinfo(IXMLDOMCDATASection_tid, ppTInfo);
00134 
00135     return hr;
00136 }
00137 
00138 static HRESULT WINAPI domcdata_GetIDsOfNames(
00139     IXMLDOMCDATASection *iface,
00140     REFIID riid, LPOLESTR* rgszNames,
00141     UINT cNames, LCID lcid, DISPID* rgDispId )
00142 {
00143     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00144     ITypeInfo *typeinfo;
00145     HRESULT hr;
00146 
00147     TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
00148           lcid, rgDispId);
00149 
00150     if(!rgszNames || cNames == 0 || !rgDispId)
00151         return E_INVALIDARG;
00152 
00153     hr = get_typeinfo(IXMLDOMCDATASection_tid, &typeinfo);
00154     if(SUCCEEDED(hr))
00155     {
00156         hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
00157         ITypeInfo_Release(typeinfo);
00158     }
00159 
00160     return hr;
00161 }
00162 
00163 static HRESULT WINAPI domcdata_Invoke(
00164     IXMLDOMCDATASection *iface,
00165     DISPID dispIdMember, REFIID riid, LCID lcid,
00166     WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
00167     EXCEPINFO* pExcepInfo, UINT* puArgErr )
00168 {
00169     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00170     ITypeInfo *typeinfo;
00171     HRESULT hr;
00172 
00173     TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
00174           lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
00175 
00176     hr = get_typeinfo(IXMLDOMCDATASection_tid, &typeinfo);
00177     if(SUCCEEDED(hr))
00178     {
00179         hr = ITypeInfo_Invoke(typeinfo, &(This->lpVtbl), dispIdMember, wFlags, pDispParams,
00180                 pVarResult, pExcepInfo, puArgErr);
00181         ITypeInfo_Release(typeinfo);
00182     }
00183 
00184     return hr;
00185 }
00186 
00187 static HRESULT WINAPI domcdata_get_nodeName(
00188     IXMLDOMCDATASection *iface,
00189     BSTR* p )
00190 {
00191     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00192     return IXMLDOMNode_get_nodeName( IXMLDOMNode_from_impl(&This->node), p );
00193 }
00194 
00195 static HRESULT WINAPI domcdata_get_nodeValue(
00196     IXMLDOMCDATASection *iface,
00197     VARIANT* var1 )
00198 {
00199     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00200     return IXMLDOMNode_get_nodeValue( IXMLDOMNode_from_impl(&This->node), var1 );
00201 }
00202 
00203 static HRESULT WINAPI domcdata_put_nodeValue(
00204     IXMLDOMCDATASection *iface,
00205     VARIANT var1 )
00206 {
00207     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00208     return IXMLDOMNode_put_nodeValue( IXMLDOMNode_from_impl(&This->node), var1 );
00209 }
00210 
00211 static HRESULT WINAPI domcdata_get_nodeType(
00212     IXMLDOMCDATASection *iface,
00213     DOMNodeType* domNodeType )
00214 {
00215     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00216     return IXMLDOMNode_get_nodeType( IXMLDOMNode_from_impl(&This->node), domNodeType );
00217 }
00218 
00219 static HRESULT WINAPI domcdata_get_parentNode(
00220     IXMLDOMCDATASection *iface,
00221     IXMLDOMNode** parent )
00222 {
00223     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00224     return IXMLDOMNode_get_parentNode( IXMLDOMNode_from_impl(&This->node), parent );
00225 }
00226 
00227 static HRESULT WINAPI domcdata_get_childNodes(
00228     IXMLDOMCDATASection *iface,
00229     IXMLDOMNodeList** outList)
00230 {
00231     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00232     return IXMLDOMNode_get_childNodes( IXMLDOMNode_from_impl(&This->node), outList );
00233 }
00234 
00235 static HRESULT WINAPI domcdata_get_firstChild(
00236     IXMLDOMCDATASection *iface,
00237     IXMLDOMNode** domNode)
00238 {
00239     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00240     return IXMLDOMNode_get_firstChild( IXMLDOMNode_from_impl(&This->node), domNode );
00241 }
00242 
00243 static HRESULT WINAPI domcdata_get_lastChild(
00244     IXMLDOMCDATASection *iface,
00245     IXMLDOMNode** domNode)
00246 {
00247     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00248     return IXMLDOMNode_get_lastChild( IXMLDOMNode_from_impl(&This->node), domNode );
00249 }
00250 
00251 static HRESULT WINAPI domcdata_get_previousSibling(
00252     IXMLDOMCDATASection *iface,
00253     IXMLDOMNode** domNode)
00254 {
00255     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00256     return IXMLDOMNode_get_previousSibling( IXMLDOMNode_from_impl(&This->node), domNode );
00257 }
00258 
00259 static HRESULT WINAPI domcdata_get_nextSibling(
00260     IXMLDOMCDATASection *iface,
00261     IXMLDOMNode** domNode)
00262 {
00263     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00264     return IXMLDOMNode_get_nextSibling( IXMLDOMNode_from_impl(&This->node), domNode );
00265 }
00266 
00267 static HRESULT WINAPI domcdata_get_attributes(
00268     IXMLDOMCDATASection *iface,
00269     IXMLDOMNamedNodeMap** attributeMap)
00270 {
00271     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00272     return IXMLDOMNode_get_attributes( IXMLDOMNode_from_impl(&This->node), attributeMap );
00273 }
00274 
00275 static HRESULT WINAPI domcdata_insertBefore(
00276     IXMLDOMCDATASection *iface,
00277     IXMLDOMNode* newNode, VARIANT var1,
00278     IXMLDOMNode** outOldNode)
00279 {
00280     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00281     return IXMLDOMNode_insertBefore( IXMLDOMNode_from_impl(&This->node), newNode, var1, outOldNode );
00282 }
00283 
00284 static HRESULT WINAPI domcdata_replaceChild(
00285     IXMLDOMCDATASection *iface,
00286     IXMLDOMNode* newNode,
00287     IXMLDOMNode* oldNode,
00288     IXMLDOMNode** outOldNode)
00289 {
00290     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00291     return IXMLDOMNode_replaceChild( IXMLDOMNode_from_impl(&This->node), newNode, oldNode, outOldNode );
00292 }
00293 
00294 static HRESULT WINAPI domcdata_removeChild(
00295     IXMLDOMCDATASection *iface,
00296     IXMLDOMNode* domNode, IXMLDOMNode** oldNode)
00297 {
00298     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00299     return IXMLDOMNode_removeChild( IXMLDOMNode_from_impl(&This->node), domNode, oldNode );
00300 }
00301 
00302 static HRESULT WINAPI domcdata_appendChild(
00303     IXMLDOMCDATASection *iface,
00304     IXMLDOMNode* newNode, IXMLDOMNode** outNewNode)
00305 {
00306     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00307     return IXMLDOMNode_appendChild( IXMLDOMNode_from_impl(&This->node), newNode, outNewNode );
00308 }
00309 
00310 static HRESULT WINAPI domcdata_hasChildNodes(
00311     IXMLDOMCDATASection *iface,
00312     VARIANT_BOOL* pbool)
00313 {
00314     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00315     return IXMLDOMNode_hasChildNodes( IXMLDOMNode_from_impl(&This->node), pbool );
00316 }
00317 
00318 static HRESULT WINAPI domcdata_get_ownerDocument(
00319     IXMLDOMCDATASection *iface,
00320     IXMLDOMDocument** domDocument)
00321 {
00322     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00323     return IXMLDOMNode_get_ownerDocument( IXMLDOMNode_from_impl(&This->node), domDocument );
00324 }
00325 
00326 static HRESULT WINAPI domcdata_cloneNode(
00327     IXMLDOMCDATASection *iface,
00328     VARIANT_BOOL pbool, IXMLDOMNode** outNode)
00329 {
00330     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00331     return IXMLDOMNode_cloneNode( IXMLDOMNode_from_impl(&This->node), pbool, outNode );
00332 }
00333 
00334 static HRESULT WINAPI domcdata_get_nodeTypeString(
00335     IXMLDOMCDATASection *iface,
00336     BSTR* p)
00337 {
00338     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00339     return IXMLDOMNode_get_nodeTypeString( IXMLDOMNode_from_impl(&This->node), p );
00340 }
00341 
00342 static HRESULT WINAPI domcdata_get_text(
00343     IXMLDOMCDATASection *iface,
00344     BSTR* p)
00345 {
00346     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00347     return IXMLDOMNode_get_text( IXMLDOMNode_from_impl(&This->node), p );
00348 }
00349 
00350 static HRESULT WINAPI domcdata_put_text(
00351     IXMLDOMCDATASection *iface,
00352     BSTR p)
00353 {
00354     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00355     return IXMLDOMNode_put_text( IXMLDOMNode_from_impl(&This->node), p );
00356 }
00357 
00358 static HRESULT WINAPI domcdata_get_specified(
00359     IXMLDOMCDATASection *iface,
00360     VARIANT_BOOL* pbool)
00361 {
00362     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00363     return IXMLDOMNode_get_specified( IXMLDOMNode_from_impl(&This->node), pbool );
00364 }
00365 
00366 static HRESULT WINAPI domcdata_get_definition(
00367     IXMLDOMCDATASection *iface,
00368     IXMLDOMNode** domNode)
00369 {
00370     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00371     return IXMLDOMNode_get_definition( IXMLDOMNode_from_impl(&This->node), domNode );
00372 }
00373 
00374 static HRESULT WINAPI domcdata_get_nodeTypedValue(
00375     IXMLDOMCDATASection *iface,
00376     VARIANT* var1)
00377 {
00378     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00379     return IXMLDOMNode_get_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
00380 }
00381 
00382 static HRESULT WINAPI domcdata_put_nodeTypedValue(
00383     IXMLDOMCDATASection *iface,
00384     VARIANT var1)
00385 {
00386     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00387     return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
00388 }
00389 
00390 static HRESULT WINAPI domcdata_get_dataType(
00391     IXMLDOMCDATASection *iface,
00392     VARIANT* var1)
00393 {
00394     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00395     return IXMLDOMNode_get_dataType( IXMLDOMNode_from_impl(&This->node), var1 );
00396 }
00397 
00398 static HRESULT WINAPI domcdata_put_dataType(
00399     IXMLDOMCDATASection *iface,
00400     BSTR p)
00401 {
00402     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00403     return IXMLDOMNode_put_dataType( IXMLDOMNode_from_impl(&This->node), p );
00404 }
00405 
00406 static HRESULT WINAPI domcdata_get_xml(
00407     IXMLDOMCDATASection *iface,
00408     BSTR* p)
00409 {
00410     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00411     return IXMLDOMNode_get_xml( IXMLDOMNode_from_impl(&This->node), p );
00412 }
00413 
00414 static HRESULT WINAPI domcdata_transformNode(
00415     IXMLDOMCDATASection *iface,
00416     IXMLDOMNode* domNode, BSTR* p)
00417 {
00418     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00419     return IXMLDOMNode_transformNode( IXMLDOMNode_from_impl(&This->node), domNode, p );
00420 }
00421 
00422 static HRESULT WINAPI domcdata_selectNodes(
00423     IXMLDOMCDATASection *iface,
00424     BSTR p, IXMLDOMNodeList** outList)
00425 {
00426     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00427     return IXMLDOMNode_selectNodes( IXMLDOMNode_from_impl(&This->node), p, outList );
00428 }
00429 
00430 static HRESULT WINAPI domcdata_selectSingleNode(
00431     IXMLDOMCDATASection *iface,
00432     BSTR p, IXMLDOMNode** outNode)
00433 {
00434     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00435     return IXMLDOMNode_selectSingleNode( IXMLDOMNode_from_impl(&This->node), p, outNode );
00436 }
00437 
00438 static HRESULT WINAPI domcdata_get_parsed(
00439     IXMLDOMCDATASection *iface,
00440     VARIANT_BOOL* pbool)
00441 {
00442     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00443     return IXMLDOMNode_get_parsed( IXMLDOMNode_from_impl(&This->node), pbool );
00444 }
00445 
00446 static HRESULT WINAPI domcdata_get_namespaceURI(
00447     IXMLDOMCDATASection *iface,
00448     BSTR* p)
00449 {
00450     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00451     return IXMLDOMNode_get_namespaceURI( IXMLDOMNode_from_impl(&This->node), p );
00452 }
00453 
00454 static HRESULT WINAPI domcdata_get_prefix(
00455     IXMLDOMCDATASection *iface,
00456     BSTR* p)
00457 {
00458     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00459     return IXMLDOMNode_get_prefix( IXMLDOMNode_from_impl(&This->node), p );
00460 }
00461 
00462 static HRESULT WINAPI domcdata_get_baseName(
00463     IXMLDOMCDATASection *iface,
00464     BSTR* p)
00465 {
00466     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00467     return IXMLDOMNode_get_baseName( IXMLDOMNode_from_impl(&This->node), p );
00468 }
00469 
00470 static HRESULT WINAPI domcdata_transformNodeToObject(
00471     IXMLDOMCDATASection *iface,
00472     IXMLDOMNode* domNode, VARIANT var1)
00473 {
00474     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00475     return IXMLDOMNode_transformNodeToObject( IXMLDOMNode_from_impl(&This->node), domNode, var1 );
00476 }
00477 
00478 static HRESULT WINAPI domcdata_get_data(
00479     IXMLDOMCDATASection *iface,
00480     BSTR *p)
00481 {
00482     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00483     HRESULT hr;
00484     VARIANT vRet;
00485 
00486     if(!p)
00487         return E_INVALIDARG;
00488 
00489     hr = IXMLDOMNode_get_nodeValue( IXMLDOMNode_from_impl(&This->node), &vRet );
00490     if(hr == S_OK)
00491     {
00492         *p = V_BSTR(&vRet);
00493     }
00494 
00495     return hr;
00496 }
00497 
00498 static HRESULT WINAPI domcdata_put_data(
00499     IXMLDOMCDATASection *iface,
00500     BSTR data)
00501 {
00502     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00503     VARIANT val;
00504 
00505     TRACE("(%p)->(%s)\n", This, debugstr_w(data) );
00506 
00507     V_VT(&val) = VT_BSTR;
00508     V_BSTR(&val) = data;
00509 
00510     return IXMLDOMNode_put_nodeValue( IXMLDOMNode_from_impl(&This->node), val );
00511 }
00512 
00513 static HRESULT WINAPI domcdata_get_length(
00514     IXMLDOMCDATASection *iface,
00515     LONG *len)
00516 {
00517     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00518     HRESULT hr;
00519     BSTR data;
00520 
00521     TRACE("(%p)->(%p)\n", This, len);
00522 
00523     if(!len)
00524         return E_INVALIDARG;
00525 
00526     hr = IXMLDOMCDATASection_get_data(iface, &data);
00527     if(hr == S_OK)
00528     {
00529         *len = SysStringLen(data);
00530         SysFreeString(data);
00531     }
00532 
00533     return S_OK;
00534 }
00535 
00536 static HRESULT WINAPI domcdata_substringData(
00537     IXMLDOMCDATASection *iface,
00538     LONG offset, LONG count, BSTR *p)
00539 {
00540     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00541     HRESULT hr;
00542     BSTR data;
00543 
00544     TRACE("(%p)->(%d %d %p)\n", This, offset, count, p);
00545 
00546     if(!p)
00547         return E_INVALIDARG;
00548 
00549     *p = NULL;
00550     if(offset < 0 || count < 0)
00551         return E_INVALIDARG;
00552 
00553     if(count == 0)
00554         return S_FALSE;
00555 
00556     hr = IXMLDOMCDATASection_get_data(iface, &data);
00557     if(hr == S_OK)
00558     {
00559         LONG len = SysStringLen(data);
00560 
00561         if(offset < len)
00562         {
00563             if(offset + count > len)
00564                 *p = SysAllocString(&data[offset]);
00565             else
00566                 *p = SysAllocStringLen(&data[offset], count);
00567         }
00568         else
00569             hr = S_FALSE;
00570 
00571         SysFreeString(data);
00572     }
00573 
00574     return hr;
00575 }
00576 
00577 static HRESULT WINAPI domcdata_appendData(
00578     IXMLDOMCDATASection *iface,
00579     BSTR p)
00580 {
00581     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00582     HRESULT hr;
00583     BSTR data;
00584     LONG p_len;
00585 
00586     TRACE("(%p)->(%s)\n", This, debugstr_w(p));
00587 
00588     /* Nothing to do if NULL or an Empty string passed in. */
00589     if((p_len = SysStringLen(p)) == 0) return S_OK;
00590 
00591     hr = IXMLDOMCDATASection_get_data(iface, &data);
00592     if(hr == S_OK)
00593     {
00594         LONG len = SysStringLen(data);
00595         BSTR str = SysAllocStringLen(NULL, p_len + len);
00596 
00597         memcpy(str, data, len*sizeof(WCHAR));
00598         memcpy(&str[len], p, p_len*sizeof(WCHAR));
00599         str[len+p_len] = 0;
00600 
00601         hr = IXMLDOMCDATASection_put_data(iface, str);
00602 
00603         SysFreeString(str);
00604         SysFreeString(data);
00605     }
00606 
00607     return hr;
00608 }
00609 
00610 static HRESULT WINAPI domcdata_insertData(
00611     IXMLDOMCDATASection *iface,
00612     LONG offset, BSTR p)
00613 {
00614     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00615     HRESULT hr;
00616     BSTR data;
00617     LONG p_len;
00618 
00619     TRACE("(%p)->(%d %s)\n", This, offset, debugstr_w(p));
00620 
00621     /* If have a NULL or empty string, don't do anything. */
00622     if((p_len = SysStringLen(p)) == 0)
00623         return S_OK;
00624 
00625     if(offset < 0)
00626     {
00627         return E_INVALIDARG;
00628     }
00629 
00630     hr = IXMLDOMCDATASection_get_data(iface, &data);
00631     if(hr == S_OK)
00632     {
00633         LONG len = SysStringLen(data);
00634         BSTR str;
00635 
00636         if(len < offset)
00637         {
00638             SysFreeString(data);
00639             return E_INVALIDARG;
00640         }
00641 
00642         str = SysAllocStringLen(NULL, len + p_len);
00643         /* start part, supplied string and end part */
00644         memcpy(str, data, offset*sizeof(WCHAR));
00645         memcpy(&str[offset], p, p_len*sizeof(WCHAR));
00646         memcpy(&str[offset+p_len], &data[offset], (len-offset)*sizeof(WCHAR));
00647         str[len+p_len] = 0;
00648 
00649         hr = IXMLDOMCDATASection_put_data(iface, str);
00650 
00651         SysFreeString(str);
00652         SysFreeString(data);
00653     }
00654 
00655     return hr;
00656 }
00657 
00658 static HRESULT WINAPI domcdata_deleteData(
00659     IXMLDOMCDATASection *iface,
00660     LONG offset, LONG count)
00661 {
00662     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00663     HRESULT hr;
00664     LONG len = -1;
00665     BSTR str;
00666 
00667     TRACE("(%p)->(%d %d)\n", This, offset, count);
00668 
00669     hr = IXMLDOMCDATASection_get_length(iface, &len);
00670     if(hr != S_OK) return hr;
00671 
00672     if((offset < 0) || (offset > len) || (count < 0))
00673         return E_INVALIDARG;
00674 
00675     if(len == 0) return S_OK;
00676 
00677     /* cutting start or end */
00678     if((offset == 0) || ((count + offset) >= len))
00679     {
00680         if(offset == 0)
00681             IXMLDOMCDATASection_substringData(iface, count, len - count, &str);
00682         else
00683             IXMLDOMCDATASection_substringData(iface, 0, offset, &str);
00684         hr = IXMLDOMCDATASection_put_data(iface, str);
00685     }
00686     else
00687     /* cutting from the inside */
00688     {
00689         BSTR str_end;
00690 
00691         IXMLDOMCDATASection_substringData(iface, 0, offset, &str);
00692         IXMLDOMCDATASection_substringData(iface, offset + count, len - count, &str_end);
00693 
00694         hr = IXMLDOMCDATASection_put_data(iface, str);
00695         if(hr == S_OK)
00696             hr = IXMLDOMCDATASection_appendData(iface, str_end);
00697 
00698         SysFreeString(str_end);
00699     }
00700 
00701     SysFreeString(str);
00702 
00703     return hr;
00704 }
00705 
00706 static HRESULT WINAPI domcdata_replaceData(
00707     IXMLDOMCDATASection *iface,
00708     LONG offset, LONG count, BSTR p)
00709 {
00710     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00711     HRESULT hr;
00712 
00713     TRACE("(%p)->(%d %d %s)\n", This, offset, count, debugstr_w(p));
00714 
00715     hr = IXMLDOMCDATASection_deleteData(iface, offset, count);
00716 
00717     if (hr == S_OK)
00718        hr = IXMLDOMCDATASection_insertData(iface, offset, p);
00719 
00720     return hr;
00721 }
00722 
00723 static HRESULT WINAPI domcdata_splitText(
00724     IXMLDOMCDATASection *iface,
00725     LONG offset, IXMLDOMText **txtNode)
00726 {
00727     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
00728     FIXME("(%p)->(%d %p)\n", This, offset, txtNode);
00729     return E_NOTIMPL;
00730 }
00731 
00732 
00733 static const struct IXMLDOMCDATASectionVtbl domcdata_vtbl =
00734 {
00735     domcdata_QueryInterface,
00736     domcdata_AddRef,
00737     domcdata_Release,
00738     domcdata_GetTypeInfoCount,
00739     domcdata_GetTypeInfo,
00740     domcdata_GetIDsOfNames,
00741     domcdata_Invoke,
00742     domcdata_get_nodeName,
00743     domcdata_get_nodeValue,
00744     domcdata_put_nodeValue,
00745     domcdata_get_nodeType,
00746     domcdata_get_parentNode,
00747     domcdata_get_childNodes,
00748     domcdata_get_firstChild,
00749     domcdata_get_lastChild,
00750     domcdata_get_previousSibling,
00751     domcdata_get_nextSibling,
00752     domcdata_get_attributes,
00753     domcdata_insertBefore,
00754     domcdata_replaceChild,
00755     domcdata_removeChild,
00756     domcdata_appendChild,
00757     domcdata_hasChildNodes,
00758     domcdata_get_ownerDocument,
00759     domcdata_cloneNode,
00760     domcdata_get_nodeTypeString,
00761     domcdata_get_text,
00762     domcdata_put_text,
00763     domcdata_get_specified,
00764     domcdata_get_definition,
00765     domcdata_get_nodeTypedValue,
00766     domcdata_put_nodeTypedValue,
00767     domcdata_get_dataType,
00768     domcdata_put_dataType,
00769     domcdata_get_xml,
00770     domcdata_transformNode,
00771     domcdata_selectNodes,
00772     domcdata_selectSingleNode,
00773     domcdata_get_parsed,
00774     domcdata_get_namespaceURI,
00775     domcdata_get_prefix,
00776     domcdata_get_baseName,
00777     domcdata_transformNodeToObject,
00778     domcdata_get_data,
00779     domcdata_put_data,
00780     domcdata_get_length,
00781     domcdata_substringData,
00782     domcdata_appendData,
00783     domcdata_insertData,
00784     domcdata_deleteData,
00785     domcdata_replaceData,
00786     domcdata_splitText
00787 };
00788 
00789 IUnknown* create_cdata( xmlNodePtr text )
00790 {
00791     domcdata *This;
00792 
00793     This = heap_alloc( sizeof *This );
00794     if ( !This )
00795         return NULL;
00796 
00797     This->lpVtbl = &domcdata_vtbl;
00798     This->ref = 1;
00799 
00800     init_xmlnode(&This->node, text, (IUnknown*)&This->lpVtbl, NULL);
00801 
00802     return (IUnknown*) &This->lpVtbl;
00803 }
00804 
00805 #endif

Generated on Sat May 26 2012 04:23:54 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.