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

text.c
Go to the documentation of this file.
00001 /*
00002  *    DOM text node implementation
00003  *
00004  * Copyright 2006 Huw Davies
00005  * Copyright 2007-2008 Alistair Leslie-Hughes
00006  *
00007  * This library is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Lesser General Public
00009  * License as published by the Free Software Foundation; either
00010  * version 2.1 of the License, or (at your option) any later version.
00011  *
00012  * This library is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  * Lesser General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Lesser General Public
00018  * License along with this library; if not, write to the Free Software
00019  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00020  */
00021 
00022 #define COBJMACROS
00023 
00024 #include "config.h"
00025 
00026 #include <stdarg.h>
00027 #include "windef.h"
00028 #include "winbase.h"
00029 #include "winuser.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 _domtext
00042 {
00043     xmlnode node;
00044     const struct IXMLDOMTextVtbl *lpVtbl;
00045     LONG ref;
00046 } domtext;
00047 
00048 static inline domtext *impl_from_IXMLDOMText( IXMLDOMText *iface )
00049 {
00050     return (domtext *)((char*)iface - FIELD_OFFSET(domtext, lpVtbl));
00051 }
00052 
00053 static HRESULT WINAPI domtext_QueryInterface(
00054     IXMLDOMText *iface,
00055     REFIID riid,
00056     void** ppvObject )
00057 {
00058     domtext *This = impl_from_IXMLDOMText( iface );
00059     TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
00060 
00061     if ( IsEqualGUID( riid, &IID_IXMLDOMText ) ||
00062          IsEqualGUID( riid, &IID_IXMLDOMCharacterData) ||
00063          IsEqualGUID( riid, &IID_IDispatch ) ||
00064          IsEqualGUID( riid, &IID_IUnknown ) )
00065     {
00066         *ppvObject = iface;
00067     }
00068     else if ( IsEqualGUID( riid, &IID_IXMLDOMNode ) )
00069     {
00070         *ppvObject = IXMLDOMNode_from_impl(&This->node);
00071     }
00072     else if ( IsEqualGUID( riid, &IID_IXMLDOMElement ) ||
00073               IsEqualGUID( riid, &IID_IXMLDOMCDATASection ) )
00074     {
00075         /* IXMLDOMText is known to be correct in not implementing these */
00076         TRACE("Unsupported interface\n");
00077         return E_NOINTERFACE;
00078     }
00079     else
00080     {
00081         FIXME("Unsupported interface %s\n", debugstr_guid(riid));
00082         return E_NOINTERFACE;
00083     }
00084 
00085     IXMLDOMText_AddRef((IUnknown*)*ppvObject);
00086     return S_OK;
00087 }
00088 
00089 static ULONG WINAPI domtext_AddRef(
00090     IXMLDOMText *iface )
00091 {
00092     domtext *This = impl_from_IXMLDOMText( iface );
00093     return InterlockedIncrement( &This->ref );
00094 }
00095 
00096 static ULONG WINAPI domtext_Release(
00097     IXMLDOMText *iface )
00098 {
00099     domtext *This = impl_from_IXMLDOMText( iface );
00100     ULONG ref;
00101 
00102     ref = InterlockedDecrement( &This->ref );
00103     if ( ref == 0 )
00104     {
00105         destroy_xmlnode(&This->node);
00106         heap_free( This );
00107     }
00108 
00109     return ref;
00110 }
00111 
00112 static HRESULT WINAPI domtext_GetTypeInfoCount(
00113     IXMLDOMText *iface,
00114     UINT* pctinfo )
00115 {
00116     domtext *This = impl_from_IXMLDOMText( iface );
00117 
00118     TRACE("(%p)->(%p)\n", This, pctinfo);
00119 
00120     *pctinfo = 1;
00121 
00122     return S_OK;
00123 }
00124 
00125 static HRESULT WINAPI domtext_GetTypeInfo(
00126     IXMLDOMText *iface,
00127     UINT iTInfo, LCID lcid,
00128     ITypeInfo** ppTInfo )
00129 {
00130     domtext *This = impl_from_IXMLDOMText( iface );
00131     HRESULT hr;
00132 
00133     TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
00134 
00135     hr = get_typeinfo(IXMLDOMText_tid, ppTInfo);
00136 
00137     return hr;
00138 }
00139 
00140 static HRESULT WINAPI domtext_GetIDsOfNames(
00141     IXMLDOMText *iface,
00142     REFIID riid, LPOLESTR* rgszNames,
00143     UINT cNames, LCID lcid, DISPID* rgDispId )
00144 {
00145     domtext *This = impl_from_IXMLDOMText( iface );
00146     ITypeInfo *typeinfo;
00147     HRESULT hr;
00148 
00149     TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
00150           lcid, rgDispId);
00151 
00152     if(!rgszNames || cNames == 0 || !rgDispId)
00153         return E_INVALIDARG;
00154 
00155     hr = get_typeinfo(IXMLDOMText_tid, &typeinfo);
00156     if(SUCCEEDED(hr))
00157     {
00158         hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
00159         ITypeInfo_Release(typeinfo);
00160     }
00161 
00162     return hr;
00163 }
00164 
00165 static HRESULT WINAPI domtext_Invoke(
00166     IXMLDOMText *iface,
00167     DISPID dispIdMember, REFIID riid, LCID lcid,
00168     WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
00169     EXCEPINFO* pExcepInfo, UINT* puArgErr )
00170 {
00171     domtext *This = impl_from_IXMLDOMText( iface );
00172     ITypeInfo *typeinfo;
00173     HRESULT hr;
00174 
00175     TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
00176           lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
00177 
00178     hr = get_typeinfo(IXMLDOMText_tid, &typeinfo);
00179     if(SUCCEEDED(hr))
00180     {
00181         hr = ITypeInfo_Invoke(typeinfo, &(This->lpVtbl), dispIdMember, wFlags, pDispParams,
00182                 pVarResult, pExcepInfo, puArgErr);
00183         ITypeInfo_Release(typeinfo);
00184     }
00185 
00186     return hr;
00187 }
00188 
00189 static HRESULT WINAPI domtext_get_nodeName(
00190     IXMLDOMText *iface,
00191     BSTR* p )
00192 {
00193     domtext *This = impl_from_IXMLDOMText( iface );
00194     return IXMLDOMNode_get_nodeName( IXMLDOMNode_from_impl(&This->node), p );
00195 }
00196 
00197 static HRESULT WINAPI domtext_get_nodeValue(
00198     IXMLDOMText *iface,
00199     VARIANT* var1 )
00200 {
00201     domtext *This = impl_from_IXMLDOMText( iface );
00202     return IXMLDOMNode_get_nodeValue( IXMLDOMNode_from_impl(&This->node), var1 );
00203 }
00204 
00205 static HRESULT WINAPI domtext_put_nodeValue(
00206     IXMLDOMText *iface,
00207     VARIANT var1 )
00208 {
00209     domtext *This = impl_from_IXMLDOMText( iface );
00210     return IXMLDOMNode_put_nodeValue( IXMLDOMNode_from_impl(&This->node), var1 );
00211 }
00212 
00213 static HRESULT WINAPI domtext_get_nodeType(
00214     IXMLDOMText *iface,
00215     DOMNodeType* domNodeType )
00216 {
00217     domtext *This = impl_from_IXMLDOMText( iface );
00218     return IXMLDOMNode_get_nodeType( IXMLDOMNode_from_impl(&This->node), domNodeType );
00219 }
00220 
00221 static HRESULT WINAPI domtext_get_parentNode(
00222     IXMLDOMText *iface,
00223     IXMLDOMNode** parent )
00224 {
00225     domtext *This = impl_from_IXMLDOMText( iface );
00226     return IXMLDOMNode_get_parentNode( IXMLDOMNode_from_impl(&This->node), parent );
00227 }
00228 
00229 static HRESULT WINAPI domtext_get_childNodes(
00230     IXMLDOMText *iface,
00231     IXMLDOMNodeList** outList)
00232 {
00233     domtext *This = impl_from_IXMLDOMText( iface );
00234     return IXMLDOMNode_get_childNodes( IXMLDOMNode_from_impl(&This->node), outList );
00235 }
00236 
00237 static HRESULT WINAPI domtext_get_firstChild(
00238     IXMLDOMText *iface,
00239     IXMLDOMNode** domNode)
00240 {
00241     domtext *This = impl_from_IXMLDOMText( iface );
00242     return IXMLDOMNode_get_firstChild( IXMLDOMNode_from_impl(&This->node), domNode );
00243 }
00244 
00245 static HRESULT WINAPI domtext_get_lastChild(
00246     IXMLDOMText *iface,
00247     IXMLDOMNode** domNode)
00248 {
00249     domtext *This = impl_from_IXMLDOMText( iface );
00250     return IXMLDOMNode_get_lastChild( IXMLDOMNode_from_impl(&This->node), domNode );
00251 }
00252 
00253 static HRESULT WINAPI domtext_get_previousSibling(
00254     IXMLDOMText *iface,
00255     IXMLDOMNode** domNode)
00256 {
00257     domtext *This = impl_from_IXMLDOMText( iface );
00258     return IXMLDOMNode_get_previousSibling( IXMLDOMNode_from_impl(&This->node), domNode );
00259 }
00260 
00261 static HRESULT WINAPI domtext_get_nextSibling(
00262     IXMLDOMText *iface,
00263     IXMLDOMNode** domNode)
00264 {
00265     domtext *This = impl_from_IXMLDOMText( iface );
00266     return IXMLDOMNode_get_nextSibling( IXMLDOMNode_from_impl(&This->node), domNode );
00267 }
00268 
00269 static HRESULT WINAPI domtext_get_attributes(
00270     IXMLDOMText *iface,
00271     IXMLDOMNamedNodeMap** attributeMap)
00272 {
00273     domtext *This = impl_from_IXMLDOMText( iface );
00274     return IXMLDOMNode_get_attributes( IXMLDOMNode_from_impl(&This->node), attributeMap );
00275 }
00276 
00277 static HRESULT WINAPI domtext_insertBefore(
00278     IXMLDOMText *iface,
00279     IXMLDOMNode* newNode, VARIANT var1,
00280     IXMLDOMNode** outOldNode)
00281 {
00282     domtext *This = impl_from_IXMLDOMText( iface );
00283     return IXMLDOMNode_insertBefore( IXMLDOMNode_from_impl(&This->node), newNode, var1, outOldNode );
00284 }
00285 
00286 static HRESULT WINAPI domtext_replaceChild(
00287     IXMLDOMText *iface,
00288     IXMLDOMNode* newNode,
00289     IXMLDOMNode* oldNode,
00290     IXMLDOMNode** outOldNode)
00291 {
00292     domtext *This = impl_from_IXMLDOMText( iface );
00293     return IXMLDOMNode_replaceChild( IXMLDOMNode_from_impl(&This->node), newNode, oldNode, outOldNode );
00294 }
00295 
00296 static HRESULT WINAPI domtext_removeChild(
00297     IXMLDOMText *iface,
00298     IXMLDOMNode* domNode, IXMLDOMNode** oldNode)
00299 {
00300     domtext *This = impl_from_IXMLDOMText( iface );
00301     return IXMLDOMNode_removeChild( IXMLDOMNode_from_impl(&This->node), domNode, oldNode );
00302 }
00303 
00304 static HRESULT WINAPI domtext_appendChild(
00305     IXMLDOMText *iface,
00306     IXMLDOMNode* newNode, IXMLDOMNode** outNewNode)
00307 {
00308     domtext *This = impl_from_IXMLDOMText( iface );
00309     return IXMLDOMNode_appendChild( IXMLDOMNode_from_impl(&This->node), newNode, outNewNode );
00310 }
00311 
00312 static HRESULT WINAPI domtext_hasChildNodes(
00313     IXMLDOMText *iface,
00314     VARIANT_BOOL* pbool)
00315 {
00316     domtext *This = impl_from_IXMLDOMText( iface );
00317     return IXMLDOMNode_hasChildNodes( IXMLDOMNode_from_impl(&This->node), pbool );
00318 }
00319 
00320 static HRESULT WINAPI domtext_get_ownerDocument(
00321     IXMLDOMText *iface,
00322     IXMLDOMDocument** domDocument)
00323 {
00324     domtext *This = impl_from_IXMLDOMText( iface );
00325     return IXMLDOMNode_get_ownerDocument( IXMLDOMNode_from_impl(&This->node), domDocument );
00326 }
00327 
00328 static HRESULT WINAPI domtext_cloneNode(
00329     IXMLDOMText *iface,
00330     VARIANT_BOOL pbool, IXMLDOMNode** outNode)
00331 {
00332     domtext *This = impl_from_IXMLDOMText( iface );
00333     return IXMLDOMNode_cloneNode( IXMLDOMNode_from_impl(&This->node), pbool, outNode );
00334 }
00335 
00336 static HRESULT WINAPI domtext_get_nodeTypeString(
00337     IXMLDOMText *iface,
00338     BSTR* p)
00339 {
00340     domtext *This = impl_from_IXMLDOMText( iface );
00341     return IXMLDOMNode_get_nodeTypeString( IXMLDOMNode_from_impl(&This->node), p );
00342 }
00343 
00344 static HRESULT WINAPI domtext_get_text(
00345     IXMLDOMText *iface,
00346     BSTR* p)
00347 {
00348     domtext *This = impl_from_IXMLDOMText( iface );
00349     return IXMLDOMNode_get_text( IXMLDOMNode_from_impl(&This->node), p );
00350 }
00351 
00352 static HRESULT WINAPI domtext_put_text(
00353     IXMLDOMText *iface,
00354     BSTR p)
00355 {
00356     domtext *This = impl_from_IXMLDOMText( iface );
00357     return IXMLDOMNode_put_text( IXMLDOMNode_from_impl(&This->node), p );
00358 }
00359 
00360 static HRESULT WINAPI domtext_get_specified(
00361     IXMLDOMText *iface,
00362     VARIANT_BOOL* pbool)
00363 {
00364     domtext *This = impl_from_IXMLDOMText( iface );
00365     return IXMLDOMNode_get_specified( IXMLDOMNode_from_impl(&This->node), pbool );
00366 }
00367 
00368 static HRESULT WINAPI domtext_get_definition(
00369     IXMLDOMText *iface,
00370     IXMLDOMNode** domNode)
00371 {
00372     domtext *This = impl_from_IXMLDOMText( iface );
00373     return IXMLDOMNode_get_definition( IXMLDOMNode_from_impl(&This->node), domNode );
00374 }
00375 
00376 static HRESULT WINAPI domtext_get_nodeTypedValue(
00377     IXMLDOMText *iface,
00378     VARIANT* var1)
00379 {
00380     domtext *This = impl_from_IXMLDOMText( iface );
00381     return IXMLDOMNode_get_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
00382 }
00383 
00384 static HRESULT WINAPI domtext_put_nodeTypedValue(
00385     IXMLDOMText *iface,
00386     VARIANT var1)
00387 {
00388     domtext *This = impl_from_IXMLDOMText( iface );
00389     return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
00390 }
00391 
00392 static HRESULT WINAPI domtext_get_dataType(
00393     IXMLDOMText *iface,
00394     VARIANT* var1)
00395 {
00396     domtext *This = impl_from_IXMLDOMText( iface );
00397     return IXMLDOMNode_get_dataType( IXMLDOMNode_from_impl(&This->node), var1 );
00398 }
00399 
00400 static HRESULT WINAPI domtext_put_dataType(
00401     IXMLDOMText *iface,
00402     BSTR p)
00403 {
00404     domtext *This = impl_from_IXMLDOMText( iface );
00405     return IXMLDOMNode_put_dataType( IXMLDOMNode_from_impl(&This->node), p );
00406 }
00407 
00408 static HRESULT WINAPI domtext_get_xml(
00409     IXMLDOMText *iface,
00410     BSTR* p)
00411 {
00412     domtext *This = impl_from_IXMLDOMText( iface );
00413     return IXMLDOMNode_get_xml( IXMLDOMNode_from_impl(&This->node), p );
00414 }
00415 
00416 static HRESULT WINAPI domtext_transformNode(
00417     IXMLDOMText *iface,
00418     IXMLDOMNode* domNode, BSTR* p)
00419 {
00420     domtext *This = impl_from_IXMLDOMText( iface );
00421     return IXMLDOMNode_transformNode( IXMLDOMNode_from_impl(&This->node), domNode, p );
00422 }
00423 
00424 static HRESULT WINAPI domtext_selectNodes(
00425     IXMLDOMText *iface,
00426     BSTR p, IXMLDOMNodeList** outList)
00427 {
00428     domtext *This = impl_from_IXMLDOMText( iface );
00429     return IXMLDOMNode_selectNodes( IXMLDOMNode_from_impl(&This->node), p, outList );
00430 }
00431 
00432 static HRESULT WINAPI domtext_selectSingleNode(
00433     IXMLDOMText *iface,
00434     BSTR p, IXMLDOMNode** outNode)
00435 {
00436     domtext *This = impl_from_IXMLDOMText( iface );
00437     return IXMLDOMNode_selectSingleNode( IXMLDOMNode_from_impl(&This->node), p, outNode );
00438 }
00439 
00440 static HRESULT WINAPI domtext_get_parsed(
00441     IXMLDOMText *iface,
00442     VARIANT_BOOL* pbool)
00443 {
00444     domtext *This = impl_from_IXMLDOMText( iface );
00445     return IXMLDOMNode_get_parsed( IXMLDOMNode_from_impl(&This->node), pbool );
00446 }
00447 
00448 static HRESULT WINAPI domtext_get_namespaceURI(
00449     IXMLDOMText *iface,
00450     BSTR* p)
00451 {
00452     domtext *This = impl_from_IXMLDOMText( iface );
00453     return IXMLDOMNode_get_namespaceURI( IXMLDOMNode_from_impl(&This->node), p );
00454 }
00455 
00456 static HRESULT WINAPI domtext_get_prefix(
00457     IXMLDOMText *iface,
00458     BSTR* p)
00459 {
00460     domtext *This = impl_from_IXMLDOMText( iface );
00461     return IXMLDOMNode_get_prefix( IXMLDOMNode_from_impl(&This->node), p );
00462 }
00463 
00464 static HRESULT WINAPI domtext_get_baseName(
00465     IXMLDOMText *iface,
00466     BSTR* p)
00467 {
00468     domtext *This = impl_from_IXMLDOMText( iface );
00469     return IXMLDOMNode_get_baseName( IXMLDOMNode_from_impl(&This->node), p );
00470 }
00471 
00472 static HRESULT WINAPI domtext_transformNodeToObject(
00473     IXMLDOMText *iface,
00474     IXMLDOMNode* domNode, VARIANT var1)
00475 {
00476     domtext *This = impl_from_IXMLDOMText( iface );
00477     return IXMLDOMNode_transformNodeToObject( IXMLDOMNode_from_impl(&This->node), domNode, var1 );
00478 }
00479 
00480 static HRESULT WINAPI domtext_get_data(
00481     IXMLDOMText *iface,
00482     BSTR *p)
00483 {
00484     domtext *This = impl_from_IXMLDOMText( iface );
00485     HRESULT hr;
00486     VARIANT vRet;
00487 
00488     if(!p)
00489         return E_INVALIDARG;
00490 
00491     hr = IXMLDOMNode_get_nodeValue( IXMLDOMNode_from_impl(&This->node), &vRet );
00492     if(hr == S_OK)
00493     {
00494         *p = V_BSTR(&vRet);
00495     }
00496 
00497     return hr;
00498 }
00499 
00500 static HRESULT WINAPI domtext_put_data(
00501     IXMLDOMText *iface,
00502     BSTR data)
00503 {
00504     domtext *This = impl_from_IXMLDOMText( iface );
00505     VARIANT val;
00506 
00507     TRACE("(%p)->(%s)\n", This, debugstr_w(data) );
00508 
00509     V_VT(&val) = VT_BSTR;
00510     V_BSTR(&val) = data;
00511 
00512     return IXMLDOMNode_put_nodeValue( IXMLDOMNode_from_impl(&This->node), val );
00513 }
00514 
00515 static HRESULT WINAPI domtext_get_length(
00516     IXMLDOMText *iface,
00517     LONG *len)
00518 {
00519     domtext *This = impl_from_IXMLDOMText( iface );
00520     HRESULT hr;
00521     BSTR data;
00522 
00523     TRACE("(%p)->(%p)\n", This, len);
00524 
00525     if(!len)
00526         return E_INVALIDARG;
00527 
00528     hr = IXMLDOMText_get_data(iface, &data);
00529     if(hr == S_OK)
00530     {
00531         *len = SysStringLen(data);
00532         SysFreeString(data);
00533     }
00534 
00535     return hr;
00536 }
00537 
00538 static HRESULT WINAPI domtext_substringData(
00539     IXMLDOMText *iface,
00540     LONG offset, LONG count, BSTR *p)
00541 {
00542     domtext *This = impl_from_IXMLDOMText( iface );
00543     HRESULT hr;
00544     BSTR data;
00545 
00546     TRACE("(%p)->(%d %d %p)\n", This, offset, count, p);
00547 
00548     if(!p)
00549         return E_INVALIDARG;
00550 
00551     *p = NULL;
00552     if(offset < 0 || count < 0)
00553         return E_INVALIDARG;
00554 
00555     if(count == 0)
00556         return S_FALSE;
00557 
00558     hr = IXMLDOMText_get_data(iface, &data);
00559     if(hr == S_OK)
00560     {
00561         LONG len = SysStringLen(data);
00562 
00563         if(offset < len)
00564         {
00565             if(offset + count > len)
00566                 *p = SysAllocString(&data[offset]);
00567             else
00568                 *p = SysAllocStringLen(&data[offset], count);
00569         }
00570         else
00571             hr = S_FALSE;
00572 
00573         SysFreeString(data);
00574     }
00575 
00576     return hr;
00577 }
00578 
00579 static HRESULT WINAPI domtext_appendData(
00580     IXMLDOMText *iface,
00581     BSTR p)
00582 {
00583     domtext *This = impl_from_IXMLDOMText( iface );
00584     HRESULT hr;
00585     BSTR data;
00586     LONG p_len;
00587 
00588     TRACE("(%p)->(%s)\n", This, debugstr_w(p));
00589 
00590     /* Nothing to do if NULL or an Empty string passed in. */
00591     if((p_len = SysStringLen(p)) == 0) return S_OK;
00592 
00593     hr = IXMLDOMText_get_data(iface, &data);
00594     if(hr == S_OK)
00595     {
00596         LONG len = SysStringLen(data);
00597         BSTR str = SysAllocStringLen(NULL, p_len + len);
00598 
00599         memcpy(str, data, len*sizeof(WCHAR));
00600         memcpy(&str[len], p, p_len*sizeof(WCHAR));
00601         str[len+p_len] = 0;
00602 
00603         hr = IXMLDOMText_put_data(iface, str);
00604 
00605         SysFreeString(str);
00606         SysFreeString(data);
00607     }
00608 
00609     return hr;
00610 }
00611 
00612 static HRESULT WINAPI domtext_insertData(
00613     IXMLDOMText *iface,
00614     LONG offset, BSTR p)
00615 {
00616     domtext *This = impl_from_IXMLDOMText( iface );
00617     HRESULT hr;
00618     BSTR data;
00619     LONG p_len;
00620 
00621     TRACE("(%p)->(%d %s)\n", This, offset, debugstr_w(p));
00622 
00623     /* If have a NULL or empty string, don't do anything. */
00624     if((p_len = SysStringLen(p)) == 0)
00625         return S_OK;
00626 
00627     if(offset < 0)
00628     {
00629         return E_INVALIDARG;
00630     }
00631 
00632     hr = IXMLDOMText_get_data(iface, &data);
00633     if(hr == S_OK)
00634     {
00635         LONG len = SysStringLen(data);
00636         BSTR str;
00637 
00638         if(len < offset)
00639         {
00640             SysFreeString(data);
00641             return E_INVALIDARG;
00642         }
00643 
00644         str = SysAllocStringLen(NULL, len + p_len);
00645         /* start part, supplied string and end part */
00646         memcpy(str, data, offset*sizeof(WCHAR));
00647         memcpy(&str[offset], p, p_len*sizeof(WCHAR));
00648         memcpy(&str[offset+p_len], &data[offset], (len-offset)*sizeof(WCHAR));
00649         str[len+p_len] = 0;
00650 
00651         hr = IXMLDOMText_put_data(iface, str);
00652 
00653         SysFreeString(str);
00654         SysFreeString(data);
00655     }
00656 
00657     return hr;
00658 }
00659 
00660 static HRESULT WINAPI domtext_deleteData(
00661     IXMLDOMText *iface,
00662     LONG offset, LONG count)
00663 {
00664     HRESULT hr;
00665     LONG len = -1;
00666     BSTR str;
00667 
00668     TRACE("(%p)->(%d %d)\n", iface, offset, count);
00669 
00670     hr = IXMLDOMText_get_length(iface, &len);
00671     if(hr != S_OK) return hr;
00672 
00673     if((offset < 0) || (offset > len) || (count < 0))
00674         return E_INVALIDARG;
00675 
00676     if(len == 0) return S_OK;
00677 
00678     /* cutting start or end */
00679     if((offset == 0) || ((count + offset) >= len))
00680     {
00681         if(offset == 0)
00682             IXMLDOMText_substringData(iface, count, len - count, &str);
00683         else
00684             IXMLDOMText_substringData(iface, 0, offset, &str);
00685         hr = IXMLDOMText_put_data(iface, str);
00686     }
00687     else
00688     /* cutting from the inside */
00689     {
00690         BSTR str_end;
00691 
00692         IXMLDOMText_substringData(iface, 0, offset, &str);
00693         IXMLDOMText_substringData(iface, offset + count, len - count, &str_end);
00694 
00695         hr = IXMLDOMText_put_data(iface, str);
00696         if(hr == S_OK)
00697             hr = IXMLDOMText_appendData(iface, str_end);
00698 
00699         SysFreeString(str_end);
00700     }
00701 
00702     SysFreeString(str);
00703 
00704     return hr;
00705 }
00706 
00707 static HRESULT WINAPI domtext_replaceData(
00708     IXMLDOMText *iface,
00709     LONG offset, LONG count, BSTR p)
00710 {
00711     domtext *This = impl_from_IXMLDOMText( iface );
00712     HRESULT hr;
00713 
00714     TRACE("(%p)->(%d %d %s)\n", This, offset, count, debugstr_w(p));
00715 
00716     hr = IXMLDOMText_deleteData(iface, offset, count);
00717 
00718     if (hr == S_OK)
00719        hr = IXMLDOMText_insertData(iface, offset, p);
00720 
00721     return hr;
00722 }
00723 
00724 static HRESULT WINAPI domtext_splitText(
00725     IXMLDOMText *iface,
00726     LONG offset, IXMLDOMText **txtNode)
00727 {
00728     domtext *This = impl_from_IXMLDOMText( iface );
00729     FIXME("(%p)->(%d %p)\n", This, offset, txtNode);
00730     return E_NOTIMPL;
00731 }
00732 
00733 
00734 static const struct IXMLDOMTextVtbl domtext_vtbl =
00735 {
00736     domtext_QueryInterface,
00737     domtext_AddRef,
00738     domtext_Release,
00739     domtext_GetTypeInfoCount,
00740     domtext_GetTypeInfo,
00741     domtext_GetIDsOfNames,
00742     domtext_Invoke,
00743     domtext_get_nodeName,
00744     domtext_get_nodeValue,
00745     domtext_put_nodeValue,
00746     domtext_get_nodeType,
00747     domtext_get_parentNode,
00748     domtext_get_childNodes,
00749     domtext_get_firstChild,
00750     domtext_get_lastChild,
00751     domtext_get_previousSibling,
00752     domtext_get_nextSibling,
00753     domtext_get_attributes,
00754     domtext_insertBefore,
00755     domtext_replaceChild,
00756     domtext_removeChild,
00757     domtext_appendChild,
00758     domtext_hasChildNodes,
00759     domtext_get_ownerDocument,
00760     domtext_cloneNode,
00761     domtext_get_nodeTypeString,
00762     domtext_get_text,
00763     domtext_put_text,
00764     domtext_get_specified,
00765     domtext_get_definition,
00766     domtext_get_nodeTypedValue,
00767     domtext_put_nodeTypedValue,
00768     domtext_get_dataType,
00769     domtext_put_dataType,
00770     domtext_get_xml,
00771     domtext_transformNode,
00772     domtext_selectNodes,
00773     domtext_selectSingleNode,
00774     domtext_get_parsed,
00775     domtext_get_namespaceURI,
00776     domtext_get_prefix,
00777     domtext_get_baseName,
00778     domtext_transformNodeToObject,
00779     domtext_get_data,
00780     domtext_put_data,
00781     domtext_get_length,
00782     domtext_substringData,
00783     domtext_appendData,
00784     domtext_insertData,
00785     domtext_deleteData,
00786     domtext_replaceData,
00787     domtext_splitText
00788 };
00789 
00790 IUnknown* create_text( xmlNodePtr text )
00791 {
00792     domtext *This;
00793 
00794     This = heap_alloc( sizeof *This );
00795     if ( !This )
00796         return NULL;
00797 
00798     This->lpVtbl = &domtext_vtbl;
00799     This->ref = 1;
00800 
00801     init_xmlnode(&This->node, text, (IUnknown*)&This->lpVtbl, NULL);
00802 
00803     return (IUnknown*) &This->lpVtbl;
00804 }
00805 
00806 #endif

Generated on Sun May 27 2012 04:17:18 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.