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