[SHELL32] Implement support for IID_IDropTarget in CDesktopFolder::GetUIObjectOf...
[reactos.git] / reactos / dll / win32 / msxml3 / cdata.c
1 /*
2 * DOM CDATA node implementation
3 *
4 * Copyright 2007 Alistair Leslie-Hughes
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21 #include "precomp.h"
22
23 #ifdef HAVE_LIBXML2
24
25 typedef struct
26 {
27 xmlnode node;
28 IXMLDOMCDATASection IXMLDOMCDATASection_iface;
29 LONG ref;
30 } domcdata;
31
32 static const tid_t domcdata_se_tids[] = {
33 IXMLDOMNode_tid,
34 IXMLDOMCDATASection_tid,
35 NULL_tid
36 };
37
38 static inline domcdata *impl_from_IXMLDOMCDATASection( IXMLDOMCDATASection *iface )
39 {
40 return CONTAINING_RECORD(iface, domcdata, IXMLDOMCDATASection_iface);
41 }
42
43 static HRESULT WINAPI domcdata_QueryInterface(
44 IXMLDOMCDATASection *iface,
45 REFIID riid,
46 void** ppvObject )
47 {
48 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
49 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
50
51 if ( IsEqualGUID( riid, &IID_IXMLDOMCDATASection ) ||
52 IsEqualGUID( riid, &IID_IXMLDOMCharacterData) ||
53 IsEqualGUID( riid, &IID_IXMLDOMNode ) ||
54 IsEqualGUID( riid, &IID_IDispatch ) ||
55 IsEqualGUID( riid, &IID_IUnknown ) )
56 {
57 *ppvObject = iface;
58 }
59 else if(node_query_interface(&This->node, riid, ppvObject))
60 {
61 return *ppvObject ? S_OK : E_NOINTERFACE;
62 }
63 else if(IsEqualGUID( riid, &IID_ISupportErrorInfo ))
64 {
65 return node_create_supporterrorinfo(domcdata_se_tids, ppvObject);
66 }
67 else
68 {
69 TRACE("Unsupported interface %s\n", debugstr_guid(riid));
70 *ppvObject = NULL;
71 return E_NOINTERFACE;
72 }
73
74 IXMLDOMCDATASection_AddRef(iface);
75 return S_OK;
76 }
77
78 static ULONG WINAPI domcdata_AddRef(
79 IXMLDOMCDATASection *iface )
80 {
81 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
82 ULONG ref = InterlockedIncrement( &This->ref );
83 TRACE("(%p)->(%d)\n", This, ref);
84 return ref;
85 }
86
87 static ULONG WINAPI domcdata_Release(
88 IXMLDOMCDATASection *iface )
89 {
90 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
91 ULONG ref = InterlockedDecrement( &This->ref );
92
93 TRACE("(%p)->(%d)\n", This, ref);
94 if ( ref == 0 )
95 {
96 destroy_xmlnode(&This->node);
97 heap_free( This );
98 }
99
100 return ref;
101 }
102
103 static HRESULT WINAPI domcdata_GetTypeInfoCount(
104 IXMLDOMCDATASection *iface,
105 UINT* pctinfo )
106 {
107 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
108 return IDispatchEx_GetTypeInfoCount(&This->node.dispex.IDispatchEx_iface, pctinfo);
109 }
110
111 static HRESULT WINAPI domcdata_GetTypeInfo(
112 IXMLDOMCDATASection *iface,
113 UINT iTInfo, LCID lcid,
114 ITypeInfo** ppTInfo )
115 {
116 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
117 return IDispatchEx_GetTypeInfo(&This->node.dispex.IDispatchEx_iface,
118 iTInfo, lcid, ppTInfo);
119 }
120
121 static HRESULT WINAPI domcdata_GetIDsOfNames(
122 IXMLDOMCDATASection *iface,
123 REFIID riid, LPOLESTR* rgszNames,
124 UINT cNames, LCID lcid, DISPID* rgDispId )
125 {
126 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
127 return IDispatchEx_GetIDsOfNames(&This->node.dispex.IDispatchEx_iface,
128 riid, rgszNames, cNames, lcid, rgDispId);
129 }
130
131 static HRESULT WINAPI domcdata_Invoke(
132 IXMLDOMCDATASection *iface,
133 DISPID dispIdMember, REFIID riid, LCID lcid,
134 WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
135 EXCEPINFO* pExcepInfo, UINT* puArgErr )
136 {
137 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
138 return IDispatchEx_Invoke(&This->node.dispex.IDispatchEx_iface,
139 dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
140 }
141
142 static HRESULT WINAPI domcdata_get_nodeName(
143 IXMLDOMCDATASection *iface,
144 BSTR* p )
145 {
146 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
147
148 static const WCHAR cdata_sectionW[] =
149 {'#','c','d','a','t','a','-','s','e','c','t','i','o','n',0};
150
151 TRACE("(%p)->(%p)\n", This, p);
152
153 return return_bstr(cdata_sectionW, p);
154 }
155
156 static HRESULT WINAPI domcdata_get_nodeValue(
157 IXMLDOMCDATASection *iface,
158 VARIANT* value)
159 {
160 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
161
162 TRACE("(%p)->(%p)\n", This, value);
163
164 return node_get_content(&This->node, value);
165 }
166
167 static HRESULT WINAPI domcdata_put_nodeValue(
168 IXMLDOMCDATASection *iface,
169 VARIANT value)
170 {
171 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
172
173 TRACE("(%p)->(%s)\n", This, debugstr_variant(&value));
174
175 return node_put_value(&This->node, &value);
176 }
177
178 static HRESULT WINAPI domcdata_get_nodeType(
179 IXMLDOMCDATASection *iface,
180 DOMNodeType* domNodeType )
181 {
182 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
183
184 TRACE("(%p)->(%p)\n", This, domNodeType);
185
186 *domNodeType = NODE_CDATA_SECTION;
187 return S_OK;
188 }
189
190 static HRESULT WINAPI domcdata_get_parentNode(
191 IXMLDOMCDATASection *iface,
192 IXMLDOMNode** parent )
193 {
194 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
195
196 TRACE("(%p)->(%p)\n", This, parent);
197
198 return node_get_parent(&This->node, parent);
199 }
200
201 static HRESULT WINAPI domcdata_get_childNodes(
202 IXMLDOMCDATASection *iface,
203 IXMLDOMNodeList** outList)
204 {
205 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
206
207 TRACE("(%p)->(%p)\n", This, outList);
208
209 return node_get_child_nodes(&This->node, outList);
210 }
211
212 static HRESULT WINAPI domcdata_get_firstChild(
213 IXMLDOMCDATASection *iface,
214 IXMLDOMNode** domNode)
215 {
216 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
217
218 TRACE("(%p)->(%p)\n", This, domNode);
219
220 return return_null_node(domNode);
221 }
222
223 static HRESULT WINAPI domcdata_get_lastChild(
224 IXMLDOMCDATASection *iface,
225 IXMLDOMNode** domNode)
226 {
227 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
228
229 TRACE("(%p)->(%p)\n", This, domNode);
230
231 return return_null_node(domNode);
232 }
233
234 static HRESULT WINAPI domcdata_get_previousSibling(
235 IXMLDOMCDATASection *iface,
236 IXMLDOMNode** domNode)
237 {
238 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
239
240 TRACE("(%p)->(%p)\n", This, domNode);
241
242 return node_get_previous_sibling(&This->node, domNode);
243 }
244
245 static HRESULT WINAPI domcdata_get_nextSibling(
246 IXMLDOMCDATASection *iface,
247 IXMLDOMNode** domNode)
248 {
249 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
250
251 TRACE("(%p)->(%p)\n", This, domNode);
252
253 return node_get_next_sibling(&This->node, domNode);
254 }
255
256 static HRESULT WINAPI domcdata_get_attributes(
257 IXMLDOMCDATASection *iface,
258 IXMLDOMNamedNodeMap** attributeMap)
259 {
260 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
261
262 TRACE("(%p)->(%p)\n", This, attributeMap);
263
264 return return_null_ptr((void**)attributeMap);
265 }
266
267 static HRESULT WINAPI domcdata_insertBefore(
268 IXMLDOMCDATASection *iface,
269 IXMLDOMNode* newNode, VARIANT refChild,
270 IXMLDOMNode** outOldNode)
271 {
272 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
273 TRACE("(%p)->(%p %s %p)\n", This, newNode, debugstr_variant(&refChild), outOldNode);
274 if (outOldNode) *outOldNode = NULL;
275 return E_FAIL;
276 }
277
278 static HRESULT WINAPI domcdata_replaceChild(
279 IXMLDOMCDATASection *iface,
280 IXMLDOMNode* newNode,
281 IXMLDOMNode* oldNode,
282 IXMLDOMNode** outOldNode)
283 {
284 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
285 TRACE("(%p)->(%p %p %p)\n", This, newNode, oldNode, outOldNode);
286 if (outOldNode) *outOldNode = NULL;
287 return E_FAIL;
288 }
289
290 static HRESULT WINAPI domcdata_removeChild(
291 IXMLDOMCDATASection *iface,
292 IXMLDOMNode *child, IXMLDOMNode **oldChild)
293 {
294 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
295 TRACE("(%p)->(%p %p)\n", This, child, oldChild);
296 if (oldChild) *oldChild = NULL;
297 return E_FAIL;
298 }
299
300 static HRESULT WINAPI domcdata_appendChild(
301 IXMLDOMCDATASection *iface,
302 IXMLDOMNode *child, IXMLDOMNode **outChild)
303 {
304 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
305 TRACE("(%p)->(%p %p)\n", This, child, outChild);
306 if (outChild) *outChild = NULL;
307 return E_FAIL;
308 }
309
310 static HRESULT WINAPI domcdata_hasChildNodes(
311 IXMLDOMCDATASection *iface,
312 VARIANT_BOOL *ret)
313 {
314 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
315 TRACE("(%p)->(%p)\n", This, ret);
316 return return_var_false(ret);
317 }
318
319 static HRESULT WINAPI domcdata_get_ownerDocument(
320 IXMLDOMCDATASection *iface,
321 IXMLDOMDocument **doc)
322 {
323 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
324 TRACE("(%p)->(%p)\n", This, doc);
325 return node_get_owner_doc(&This->node, doc);
326 }
327
328 static HRESULT WINAPI domcdata_cloneNode(
329 IXMLDOMCDATASection *iface,
330 VARIANT_BOOL deep, IXMLDOMNode** outNode)
331 {
332 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
333 TRACE("(%p)->(%d %p)\n", This, deep, outNode);
334 return node_clone( &This->node, deep, outNode );
335 }
336
337 static HRESULT WINAPI domcdata_get_nodeTypeString(
338 IXMLDOMCDATASection *iface,
339 BSTR* p)
340 {
341 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
342 static const WCHAR cdatasectionW[] = {'c','d','a','t','a','s','e','c','t','i','o','n',0};
343
344 TRACE("(%p)->(%p)\n", This, p);
345
346 return return_bstr(cdatasectionW, p);
347 }
348
349 static HRESULT WINAPI domcdata_get_text(
350 IXMLDOMCDATASection *iface,
351 BSTR* p)
352 {
353 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
354 TRACE("(%p)->(%p)\n", This, p);
355 return node_get_text(&This->node, p);
356 }
357
358 static HRESULT WINAPI domcdata_put_text(
359 IXMLDOMCDATASection *iface,
360 BSTR p)
361 {
362 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
363 TRACE("(%p)->(%s)\n", This, debugstr_w(p));
364 return node_put_text( &This->node, p );
365 }
366
367 static HRESULT WINAPI domcdata_get_specified(
368 IXMLDOMCDATASection *iface,
369 VARIANT_BOOL* isSpecified)
370 {
371 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
372 FIXME("(%p)->(%p) stub!\n", This, isSpecified);
373 *isSpecified = VARIANT_TRUE;
374 return S_OK;
375 }
376
377 static HRESULT WINAPI domcdata_get_definition(
378 IXMLDOMCDATASection *iface,
379 IXMLDOMNode** definitionNode)
380 {
381 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
382 FIXME("(%p)->(%p)\n", This, definitionNode);
383 return E_NOTIMPL;
384 }
385
386 static HRESULT WINAPI domcdata_get_nodeTypedValue(
387 IXMLDOMCDATASection *iface,
388 VARIANT* v)
389 {
390 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
391 TRACE("(%p)->(%p)\n", This, v);
392 return node_get_content(&This->node, v);
393 }
394
395 static HRESULT WINAPI domcdata_put_nodeTypedValue(
396 IXMLDOMCDATASection *iface,
397 VARIANT typedValue)
398 {
399 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
400 FIXME("(%p)->(%s)\n", This, debugstr_variant(&typedValue));
401 return E_NOTIMPL;
402 }
403
404 static HRESULT WINAPI domcdata_get_dataType(
405 IXMLDOMCDATASection *iface,
406 VARIANT* typename)
407 {
408 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
409 TRACE("(%p)->(%p)\n", This, typename);
410 return return_null_var( typename );
411 }
412
413 static HRESULT WINAPI domcdata_put_dataType(
414 IXMLDOMCDATASection *iface,
415 BSTR p)
416 {
417 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
418
419 TRACE("(%p)->(%s)\n", This, debugstr_w(p));
420
421 if(!p)
422 return E_INVALIDARG;
423
424 return E_FAIL;
425 }
426
427 static HRESULT WINAPI domcdata_get_xml(
428 IXMLDOMCDATASection *iface,
429 BSTR* p)
430 {
431 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
432
433 TRACE("(%p)->(%p)\n", This, p);
434
435 return node_get_xml(&This->node, FALSE, p);
436 }
437
438 static HRESULT WINAPI domcdata_transformNode(
439 IXMLDOMCDATASection *iface,
440 IXMLDOMNode *node, BSTR *p)
441 {
442 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
443 TRACE("(%p)->(%p %p)\n", This, node, p);
444 return node_transform_node(&This->node, node, p);
445 }
446
447 static HRESULT WINAPI domcdata_selectNodes(
448 IXMLDOMCDATASection *iface,
449 BSTR p, IXMLDOMNodeList** outList)
450 {
451 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
452 TRACE("(%p)->(%s %p)\n", This, debugstr_w(p), outList);
453 return node_select_nodes(&This->node, p, outList);
454 }
455
456 static HRESULT WINAPI domcdata_selectSingleNode(
457 IXMLDOMCDATASection *iface,
458 BSTR p, IXMLDOMNode** outNode)
459 {
460 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
461 TRACE("(%p)->(%s %p)\n", This, debugstr_w(p), outNode);
462 return node_select_singlenode(&This->node, p, outNode);
463 }
464
465 static HRESULT WINAPI domcdata_get_parsed(
466 IXMLDOMCDATASection *iface,
467 VARIANT_BOOL* isParsed)
468 {
469 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
470 FIXME("(%p)->(%p) stub!\n", This, isParsed);
471 *isParsed = VARIANT_TRUE;
472 return S_OK;
473 }
474
475 static HRESULT WINAPI domcdata_get_namespaceURI(
476 IXMLDOMCDATASection *iface,
477 BSTR* p)
478 {
479 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
480 TRACE("(%p)->(%p)\n", This, p);
481 return node_get_namespaceURI(&This->node, p);
482 }
483
484 static HRESULT WINAPI domcdata_get_prefix(
485 IXMLDOMCDATASection *iface,
486 BSTR* prefix)
487 {
488 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
489 TRACE("(%p)->(%p)\n", This, prefix);
490 return return_null_bstr( prefix );
491 }
492
493 static HRESULT WINAPI domcdata_get_baseName(
494 IXMLDOMCDATASection *iface,
495 BSTR* name)
496 {
497 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
498 FIXME("(%p)->(%p): needs test\n", This, name);
499 return return_null_bstr( name );
500 }
501
502 static HRESULT WINAPI domcdata_transformNodeToObject(
503 IXMLDOMCDATASection *iface,
504 IXMLDOMNode* domNode, VARIANT var1)
505 {
506 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
507 FIXME("(%p)->(%p %s)\n", This, domNode, debugstr_variant(&var1));
508 return E_NOTIMPL;
509 }
510
511 static HRESULT WINAPI domcdata_get_data(
512 IXMLDOMCDATASection *iface,
513 BSTR *p)
514 {
515 HRESULT hr;
516 VARIANT vRet;
517
518 if(!p)
519 return E_INVALIDARG;
520
521 hr = IXMLDOMCDATASection_get_nodeValue( iface, &vRet );
522 if(hr == S_OK)
523 {
524 *p = V_BSTR(&vRet);
525 }
526
527 return hr;
528 }
529
530 static HRESULT WINAPI domcdata_put_data(
531 IXMLDOMCDATASection *iface,
532 BSTR data)
533 {
534 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
535 TRACE("(%p)->(%s)\n", This, debugstr_w(data));
536 return node_set_content(&This->node, data);
537 }
538
539 static HRESULT WINAPI domcdata_get_length(
540 IXMLDOMCDATASection *iface,
541 LONG *len)
542 {
543 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
544 HRESULT hr;
545 BSTR data;
546
547 TRACE("(%p)->(%p)\n", This, len);
548
549 if(!len)
550 return E_INVALIDARG;
551
552 hr = IXMLDOMCDATASection_get_data(iface, &data);
553 if(hr == S_OK)
554 {
555 *len = SysStringLen(data);
556 SysFreeString(data);
557 }
558
559 return S_OK;
560 }
561
562 static HRESULT WINAPI domcdata_substringData(
563 IXMLDOMCDATASection *iface,
564 LONG offset, LONG count, BSTR *p)
565 {
566 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
567 HRESULT hr;
568 BSTR data;
569
570 TRACE("(%p)->(%d %d %p)\n", This, offset, count, p);
571
572 if(!p)
573 return E_INVALIDARG;
574
575 *p = NULL;
576 if(offset < 0 || count < 0)
577 return E_INVALIDARG;
578
579 if(count == 0)
580 return S_FALSE;
581
582 hr = IXMLDOMCDATASection_get_data(iface, &data);
583 if(hr == S_OK)
584 {
585 LONG len = SysStringLen(data);
586
587 if(offset < len)
588 {
589 if(offset + count > len)
590 *p = SysAllocString(&data[offset]);
591 else
592 *p = SysAllocStringLen(&data[offset], count);
593 }
594 else
595 hr = S_FALSE;
596
597 SysFreeString(data);
598 }
599
600 return hr;
601 }
602
603 static HRESULT WINAPI domcdata_appendData(
604 IXMLDOMCDATASection *iface,
605 BSTR p)
606 {
607 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
608 HRESULT hr;
609 BSTR data;
610 LONG p_len;
611
612 TRACE("(%p)->(%s)\n", This, debugstr_w(p));
613
614 /* Nothing to do if NULL or an Empty string passed in. */
615 if((p_len = SysStringLen(p)) == 0) return S_OK;
616
617 hr = IXMLDOMCDATASection_get_data(iface, &data);
618 if(hr == S_OK)
619 {
620 LONG len = SysStringLen(data);
621 BSTR str = SysAllocStringLen(NULL, p_len + len);
622
623 memcpy(str, data, len*sizeof(WCHAR));
624 memcpy(&str[len], p, p_len*sizeof(WCHAR));
625 str[len+p_len] = 0;
626
627 hr = IXMLDOMCDATASection_put_data(iface, str);
628
629 SysFreeString(str);
630 SysFreeString(data);
631 }
632
633 return hr;
634 }
635
636 static HRESULT WINAPI domcdata_insertData(
637 IXMLDOMCDATASection *iface,
638 LONG offset, BSTR p)
639 {
640 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
641 HRESULT hr;
642 BSTR data;
643 LONG p_len;
644
645 TRACE("(%p)->(%d %s)\n", This, offset, debugstr_w(p));
646
647 /* If have a NULL or empty string, don't do anything. */
648 if((p_len = SysStringLen(p)) == 0)
649 return S_OK;
650
651 if(offset < 0)
652 {
653 return E_INVALIDARG;
654 }
655
656 hr = IXMLDOMCDATASection_get_data(iface, &data);
657 if(hr == S_OK)
658 {
659 LONG len = SysStringLen(data);
660 BSTR str;
661
662 if(len < offset)
663 {
664 SysFreeString(data);
665 return E_INVALIDARG;
666 }
667
668 str = SysAllocStringLen(NULL, len + p_len);
669 /* start part, supplied string and end part */
670 memcpy(str, data, offset*sizeof(WCHAR));
671 memcpy(&str[offset], p, p_len*sizeof(WCHAR));
672 memcpy(&str[offset+p_len], &data[offset], (len-offset)*sizeof(WCHAR));
673 str[len+p_len] = 0;
674
675 hr = IXMLDOMCDATASection_put_data(iface, str);
676
677 SysFreeString(str);
678 SysFreeString(data);
679 }
680
681 return hr;
682 }
683
684 static HRESULT WINAPI domcdata_deleteData(
685 IXMLDOMCDATASection *iface,
686 LONG offset, LONG count)
687 {
688 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
689 HRESULT hr;
690 LONG len = -1;
691 BSTR str;
692
693 TRACE("(%p)->(%d %d)\n", This, offset, count);
694
695 hr = IXMLDOMCDATASection_get_length(iface, &len);
696 if(hr != S_OK) return hr;
697
698 if((offset < 0) || (offset > len) || (count < 0))
699 return E_INVALIDARG;
700
701 if(len == 0) return S_OK;
702
703 /* cutting start or end */
704 if((offset == 0) || ((count + offset) >= len))
705 {
706 if(offset == 0)
707 IXMLDOMCDATASection_substringData(iface, count, len - count, &str);
708 else
709 IXMLDOMCDATASection_substringData(iface, 0, offset, &str);
710 hr = IXMLDOMCDATASection_put_data(iface, str);
711 }
712 else
713 /* cutting from the inside */
714 {
715 BSTR str_end;
716
717 IXMLDOMCDATASection_substringData(iface, 0, offset, &str);
718 IXMLDOMCDATASection_substringData(iface, offset + count, len - count, &str_end);
719
720 hr = IXMLDOMCDATASection_put_data(iface, str);
721 if(hr == S_OK)
722 hr = IXMLDOMCDATASection_appendData(iface, str_end);
723
724 SysFreeString(str_end);
725 }
726
727 SysFreeString(str);
728
729 return hr;
730 }
731
732 static HRESULT WINAPI domcdata_replaceData(
733 IXMLDOMCDATASection *iface,
734 LONG offset, LONG count, BSTR p)
735 {
736 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
737 HRESULT hr;
738
739 TRACE("(%p)->(%d %d %s)\n", This, offset, count, debugstr_w(p));
740
741 hr = IXMLDOMCDATASection_deleteData(iface, offset, count);
742
743 if (hr == S_OK)
744 hr = IXMLDOMCDATASection_insertData(iface, offset, p);
745
746 return hr;
747 }
748
749 static HRESULT WINAPI domcdata_splitText(
750 IXMLDOMCDATASection *iface,
751 LONG offset, IXMLDOMText **txtNode)
752 {
753 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
754 IXMLDOMDocument *doc;
755 LONG length = 0;
756 HRESULT hr;
757
758 TRACE("(%p)->(%d %p)\n", This, offset, txtNode);
759
760 if (!txtNode || offset < 0) return E_INVALIDARG;
761
762 *txtNode = NULL;
763
764 IXMLDOMCDATASection_get_length(iface, &length);
765
766 if (offset > length) return E_INVALIDARG;
767 if (offset == length) return S_FALSE;
768
769 hr = IXMLDOMCDATASection_get_ownerDocument(iface, &doc);
770 if (hr == S_OK)
771 {
772 BSTR data;
773
774 hr = IXMLDOMCDATASection_substringData(iface, offset, length - offset, &data);
775 if (hr == S_OK)
776 {
777 hr = IXMLDOMDocument_createTextNode(doc, data, txtNode);
778 if (hr == S_OK)
779 {
780 IXMLDOMNode *parent;
781
782 hr = IXMLDOMCDATASection_get_parentNode(iface, &parent);
783 if (hr == S_OK)
784 {
785 IXMLDOMCDATASection_deleteData(iface, 0, offset);
786 hr = IXMLDOMNode_appendChild(parent, (IXMLDOMNode*)*txtNode, NULL);
787 IXMLDOMNode_Release(parent);
788 }
789 }
790 SysFreeString(data);
791 }
792 IXMLDOMDocument_Release(doc);
793 }
794
795 return hr;
796 }
797
798 static const struct IXMLDOMCDATASectionVtbl domcdata_vtbl =
799 {
800 domcdata_QueryInterface,
801 domcdata_AddRef,
802 domcdata_Release,
803 domcdata_GetTypeInfoCount,
804 domcdata_GetTypeInfo,
805 domcdata_GetIDsOfNames,
806 domcdata_Invoke,
807 domcdata_get_nodeName,
808 domcdata_get_nodeValue,
809 domcdata_put_nodeValue,
810 domcdata_get_nodeType,
811 domcdata_get_parentNode,
812 domcdata_get_childNodes,
813 domcdata_get_firstChild,
814 domcdata_get_lastChild,
815 domcdata_get_previousSibling,
816 domcdata_get_nextSibling,
817 domcdata_get_attributes,
818 domcdata_insertBefore,
819 domcdata_replaceChild,
820 domcdata_removeChild,
821 domcdata_appendChild,
822 domcdata_hasChildNodes,
823 domcdata_get_ownerDocument,
824 domcdata_cloneNode,
825 domcdata_get_nodeTypeString,
826 domcdata_get_text,
827 domcdata_put_text,
828 domcdata_get_specified,
829 domcdata_get_definition,
830 domcdata_get_nodeTypedValue,
831 domcdata_put_nodeTypedValue,
832 domcdata_get_dataType,
833 domcdata_put_dataType,
834 domcdata_get_xml,
835 domcdata_transformNode,
836 domcdata_selectNodes,
837 domcdata_selectSingleNode,
838 domcdata_get_parsed,
839 domcdata_get_namespaceURI,
840 domcdata_get_prefix,
841 domcdata_get_baseName,
842 domcdata_transformNodeToObject,
843 domcdata_get_data,
844 domcdata_put_data,
845 domcdata_get_length,
846 domcdata_substringData,
847 domcdata_appendData,
848 domcdata_insertData,
849 domcdata_deleteData,
850 domcdata_replaceData,
851 domcdata_splitText
852 };
853
854 static const tid_t domcdata_iface_tids[] = {
855 IXMLDOMCDATASection_tid,
856 0
857 };
858
859 static dispex_static_data_t domcdata_dispex = {
860 NULL,
861 IXMLDOMCDATASection_tid,
862 NULL,
863 domcdata_iface_tids
864 };
865
866 IUnknown* create_cdata( xmlNodePtr text )
867 {
868 domcdata *This;
869
870 This = heap_alloc( sizeof *This );
871 if ( !This )
872 return NULL;
873
874 This->IXMLDOMCDATASection_iface.lpVtbl = &domcdata_vtbl;
875 This->ref = 1;
876
877 init_xmlnode(&This->node, text, (IXMLDOMNode*)&This->IXMLDOMCDATASection_iface, &domcdata_dispex);
878
879 return (IUnknown*)&This->IXMLDOMCDATASection_iface;
880 }
881
882 #endif