msxml3: Simplify ::appendData() for Text, Comment and CDATA nodes.

oldstable
Nikolay Sivov 2010-02-16 02:40:16 +03:00 committed by Alexandre Julliard
parent 02066602b6
commit 19c30897d4
3 changed files with 53 additions and 54 deletions

View File

@ -582,26 +582,30 @@ static HRESULT WINAPI domcdata_appendData(
BSTR p)
{
domcdata *This = impl_from_IXMLDOMCDATASection( iface );
xmlChar *pContent;
HRESULT hr = S_FALSE;
HRESULT hr;
BSTR data;
LONG p_len;
TRACE("%p %p\n", This, debugstr_w(p));
/* Nothing to do if NULL or an Empty string passed in. */
if(SysStringLen(p) == 0)
return S_OK;
if((p_len = SysStringLen(p)) == 0) return S_OK;
pContent = xmlChar_from_wchar( p );
if(pContent)
hr = IXMLDOMCDATASection_get_data(iface, &data);
if(hr == S_OK)
{
if(xmlTextConcat(This->node.node, pContent, SysStringLen(p) ) == 0)
hr = S_OK;
else
hr = E_FAIL;
LONG len = SysStringLen(data);
BSTR str = SysAllocStringLen(NULL, p_len + len);
memcpy(str, data, len*sizeof(WCHAR));
memcpy(&str[len], p, p_len*sizeof(WCHAR));
str[len+p_len] = 0;
hr = IXMLDOMCDATASection_put_data(iface, str);
SysFreeString(str);
SysFreeString(data);
}
else
hr = E_FAIL;
heap_free(pContent);
return hr;
}

View File

@ -576,40 +576,30 @@ static HRESULT WINAPI domcomment_appendData(
BSTR p)
{
domcomment *This = impl_from_IXMLDOMComment( iface );
xmlChar *pContent;
HRESULT hr = S_FALSE;
HRESULT hr;
BSTR data;
LONG p_len;
TRACE("%p\n", iface);
TRACE("%p %s\n", This, debugstr_w(p));
/* Nothing to do if NULL or an Empty string passed in. */
if(p == NULL || SysStringLen(p) == 0)
return S_OK;
if((p_len = SysStringLen(p)) == 0) return S_OK;
pContent = xmlChar_from_wchar( p );
if(pContent)
hr = IXMLDOMComment_get_data(iface, &data);
if(hr == S_OK)
{
/* Older versions of libxml < 2.6.27 didn't correctly support
xmlTextConcat on Comment nodes. Fallback to setting the
contents directly if xmlTextConcat fails.
*/
if(xmlTextConcat(This->node.node, pContent, SysStringLen(p) ) == 0)
hr = S_OK;
else
{
xmlChar *pNew;
pNew = xmlStrcat(xmlNodeGetContent(This->node.node), pContent);
if(pNew)
{
xmlNodeSetContent(This->node.node, pNew);
hr = S_OK;
}
else
hr = E_FAIL;
}
HeapFree( GetProcessHeap(), 0, pContent );
LONG len = SysStringLen(data);
BSTR str = SysAllocStringLen(NULL, p_len + len);
memcpy(str, data, len*sizeof(WCHAR));
memcpy(&str[len], p, p_len*sizeof(WCHAR));
str[len+p_len] = 0;
hr = IXMLDOMComment_put_data(iface, str);
SysFreeString(str);
SysFreeString(data);
}
else
hr = E_FAIL;
return hr;
}

View File

@ -584,25 +584,30 @@ static HRESULT WINAPI domtext_appendData(
BSTR p)
{
domtext *This = impl_from_IXMLDOMText( iface );
xmlChar *pContent;
HRESULT hr = S_FALSE;
HRESULT hr;
BSTR data;
LONG p_len;
TRACE("%p\n", iface);
TRACE("%p %s\n", This, debugstr_w(p));
/* Nothing to do if NULL or an Empty string passed in. */
if(SysStringLen(p) == 0) return S_OK;
if((p_len = SysStringLen(p)) == 0) return S_OK;
pContent = xmlChar_from_wchar( p );
if(pContent)
hr = IXMLDOMText_get_data(iface, &data);
if(hr == S_OK)
{
if(xmlTextConcat(This->node.node, pContent, SysStringLen(p)) == 0)
hr = S_OK;
else
hr = E_FAIL;
heap_free( pContent );
LONG len = SysStringLen(data);
BSTR str = SysAllocStringLen(NULL, p_len + len);
memcpy(str, data, len*sizeof(WCHAR));
memcpy(&str[len], p, p_len*sizeof(WCHAR));
str[len+p_len] = 0;
hr = IXMLDOMText_put_data(iface, str);
SysFreeString(str);
SysFreeString(data);
}
else
hr = E_FAIL;
return hr;
}