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

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

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