Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygencomment.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
1.7.6.1
|