void** ppvObject )
{
domcomment *This = impl_from_IXMLDOMComment( iface );
- TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
+ TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
if ( IsEqualGUID( riid, &IID_IXMLDOMComment ) ||
IsEqualGUID( riid, &IID_IXMLDOMCharacterData) ||
BSTR *p)
{
domcomment *This = impl_from_IXMLDOMComment( iface );
- HRESULT hr = E_FAIL;
+ HRESULT hr;
VARIANT vRet;
+ TRACE("(%p)->(%p)\n", This, p);
+
if(!p)
return E_INVALIDARG;
BSTR data)
{
domcomment *This = impl_from_IXMLDOMComment( iface );
- HRESULT hr = E_FAIL;
VARIANT val;
- TRACE("%p %s\n", This, debugstr_w(data) );
+ TRACE("(%p)->(%s)\n", This, debugstr_w(data) );
V_VT(&val) = VT_BSTR;
V_BSTR(&val) = data;
- hr = IXMLDOMNode_put_nodeValue( IXMLDOMNode_from_impl(&This->node), val );
-
- return hr;
+ return IXMLDOMNode_put_nodeValue( IXMLDOMNode_from_impl(&This->node), val );
}
static HRESULT WINAPI domcomment_get_length(
LONG *len)
{
domcomment *This = impl_from_IXMLDOMComment( iface );
- xmlChar *pContent;
- LONG nLength = 0;
+ HRESULT hr;
+ BSTR data;
- TRACE("%p\n", iface);
+ TRACE("(%p)->(%p)\n", This, len);
if(!len)
return E_INVALIDARG;
- pContent = xmlNodeGetContent(This->node.node);
- if(pContent)
+ hr = IXMLDOMComment_get_data(iface, &data);
+ if(hr == S_OK)
{
- nLength = xmlStrlen(pContent);
- xmlFree(pContent);
+ *len = SysStringLen(data);
+ SysFreeString(data);
}
- *len = nLength;
-
- return S_OK;
+ return hr;
}
static HRESULT WINAPI domcomment_substringData(
LONG offset, LONG count, BSTR *p)
{
domcomment *This = impl_from_IXMLDOMComment( iface );
- xmlChar *pContent;
- LONG nLength = 0;
- HRESULT hr = S_FALSE;
+ HRESULT hr;
+ BSTR data;
- TRACE("%p %d %d %p\n", iface, offset, count, p);
+ TRACE("(%p)->(%d %d %p)\n", This, offset, count, p);
if(!p)
return E_INVALIDARG;
if(count == 0)
return S_FALSE;
- pContent = xmlNodeGetContent(This->node.node);
- if(pContent)
+ hr = IXMLDOMComment_get_data(iface, &data);
+ if(hr == S_OK)
{
- nLength = xmlStrlen(pContent);
+ LONG len = SysStringLen(data);
- if( offset < nLength)
+ if(offset < len)
{
- BSTR sContent = bstr_from_xmlChar(pContent);
- if(offset + count > nLength)
- *p = SysAllocString(&sContent[offset]);
+ if(offset + count > len)
+ *p = SysAllocString(&data[offset]);
else
- *p = SysAllocStringLen(&sContent[offset], count);
-
- SysFreeString(sContent);
- hr = S_OK;
+ *p = SysAllocStringLen(&data[offset], count);
}
+ else
+ hr = S_FALSE;
- xmlFree(pContent);
+ SysFreeString(data);
}
return hr;
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;
}
LONG offset, BSTR p)
{
domcomment *This = impl_from_IXMLDOMComment( iface );
- xmlChar *pXmlContent;
- BSTR sNewString;
- HRESULT hr = S_FALSE;
- LONG nLength = 0, nLengthP = 0;
- xmlChar *str = NULL;
+ HRESULT hr;
+ BSTR data;
+ LONG p_len;
- TRACE("%p %d %p\n", iface, offset, p);
+ TRACE("(%p)->(%d %s)\n", This, offset, debugstr_w(p));
/* If have a NULL or empty string, don't do anything. */
- if(SysStringLen(p) == 0)
+ if((p_len = SysStringLen(p)) == 0)
return S_OK;
if(offset < 0)
return E_INVALIDARG;
}
- pXmlContent = xmlNodeGetContent(This->node.node);
- if(pXmlContent)
+ hr = IXMLDOMComment_get_data(iface, &data);
+ if(hr == S_OK)
{
- BSTR sContent = bstr_from_xmlChar( pXmlContent );
- nLength = SysStringLen(sContent);
- nLengthP = SysStringLen(p);
+ LONG len = SysStringLen(data);
+ BSTR str;
- if(nLength < offset)
+ if(len < offset)
{
- SysFreeString(sContent);
- xmlFree(pXmlContent);
-
+ SysFreeString(data);
return E_INVALIDARG;
}
- sNewString = SysAllocStringLen(NULL, nLength + nLengthP + 1);
- if(sNewString)
- {
- if(offset > 0)
- memcpy(sNewString, sContent, offset * sizeof(WCHAR));
-
- memcpy(&sNewString[offset], p, nLengthP * sizeof(WCHAR));
-
- if(offset+nLengthP < nLength)
- memcpy(&sNewString[offset+nLengthP], &sContent[offset], (nLength-offset) * sizeof(WCHAR));
-
- sNewString[nLengthP + nLength] = 0;
-
- str = xmlChar_from_wchar(sNewString);
- if(str)
- {
- xmlNodeSetContent(This->node.node, str);
- hr = S_OK;
- }
- HeapFree( GetProcessHeap(), 0, str );
+ str = SysAllocStringLen(NULL, len + p_len);
+ /* start part, supplied string and end part */
+ memcpy(str, data, offset*sizeof(WCHAR));
+ memcpy(&str[offset], p, p_len*sizeof(WCHAR));
+ memcpy(&str[offset+p_len], &data[offset], (len-offset)*sizeof(WCHAR));
+ str[len+p_len] = 0;
- SysFreeString(sNewString);
- }
-
- SysFreeString(sContent);
+ hr = IXMLDOMComment_put_data(iface, str);
- xmlFree(pXmlContent);
+ SysFreeString(str);
+ SysFreeString(data);
}
return hr;
LONG len = -1;
BSTR str;
- TRACE("%p %d %d\n", iface, offset, count);
+ TRACE("(%p)->(%d %d)\n", iface, offset, count);
hr = IXMLDOMComment_get_length(iface, &len);
if(hr != S_OK) return hr;
IXMLDOMComment *iface,
LONG offset, LONG count, BSTR p)
{
- FIXME("\n");
- return E_NOTIMPL;
+ domcomment *This = impl_from_IXMLDOMComment( iface );
+ HRESULT hr;
+
+ TRACE("(%p)->(%d %d %s)\n", This, offset, count, debugstr_w(p));
+
+ hr = IXMLDOMComment_deleteData(iface, offset, count);
+
+ if (hr == S_OK)
+ hr = IXMLDOMComment_insertData(iface, offset, p);
+
+ return hr;
}
static const struct IXMLDOMCommentVtbl domcomment_vtbl =