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