static HRESULT WINAPI domcomment_get_nodeType( IXMLDOMComment *iface, DOMNodeType* domNodeType ) { domcomment *This = impl_from_IXMLDOMComment( iface ); TRACE("(%p)->(%p)\n", This, domNodeType); *domNodeType = NODE_COMMENT; return S_OK; }
static HRESULT WINAPI domcomment_insertBefore( IXMLDOMComment *iface, IXMLDOMNode* newNode, VARIANT refChild, IXMLDOMNode** outOldNode) { domcomment *This = impl_from_IXMLDOMComment( iface ); FIXME("(%p)->(%p x%d %p) needs test\n", This, newNode, V_VT(&refChild), outOldNode); return node_insert_before(&This->node, newNode, &refChild, outOldNode); }
static HRESULT WINAPI domcomment_get_nodeName( IXMLDOMComment *iface, BSTR* p ) { domcomment *This = impl_from_IXMLDOMComment( iface ); static const WCHAR commentW[] = {'#','c','o','m','m','e','n','t',0}; TRACE("(%p)->(%p)\n", This, p); return return_bstr(commentW, p); }
static HRESULT WINAPI domcomment_replaceChild( IXMLDOMComment *iface, IXMLDOMNode* newNode, IXMLDOMNode* oldNode, IXMLDOMNode** outOldNode) { domcomment *This = impl_from_IXMLDOMComment( iface ); FIXME("(%p)->(%p %p %p) needs tests\n", This, newNode, oldNode, outOldNode); return node_replace_child(&This->node, newNode, oldNode, outOldNode); }
static HRESULT WINAPI domcomment_GetTypeInfoCount( IXMLDOMComment *iface, UINT* pctinfo ) { domcomment *This = impl_from_IXMLDOMComment( iface ); TRACE("(%p)->(%p)\n", This, pctinfo); *pctinfo = 1; return S_OK; }
static HRESULT WINAPI domcomment_put_data( IXMLDOMComment *iface, BSTR data) { domcomment *This = impl_from_IXMLDOMComment( iface ); VARIANT val; TRACE("(%p)->(%s)\n", This, debugstr_w(data) ); V_VT(&val) = VT_BSTR; V_BSTR(&val) = data; return node_put_value(&This->node, &val); }
static HRESULT WINAPI domcomment_GetTypeInfo( IXMLDOMComment *iface, UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo ) { domcomment *This = impl_from_IXMLDOMComment( iface ); HRESULT hr; TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo); hr = get_typeinfo(IXMLDOMComment_tid, ppTInfo); return hr; }
static HRESULT WINAPI domcomment_appendData( IXMLDOMComment *iface, BSTR p) { domcomment *This = impl_from_IXMLDOMComment( iface ); xmlnode *pDOMNode = impl_from_IXMLDOMNode( This->node ); xmlChar *pContent; HRESULT hr = S_FALSE; TRACE("%p\n", iface); /* Nothing to do if NULL or an Empty string passed in. */ if(p == NULL || SysStringLen(p) == 0) return S_OK; pContent = xmlChar_from_wchar( (WCHAR*)p ); if(pContent) { /* Older versions of libxml < 2.6.27 didn't correctly support xmlTextConcat on Comment nodes. Fallback to setting the contents directly if xmlTextConcat fails. NOTE: if xmlTextConcat fails, pContent is destroyed. */ if(xmlTextConcat(pDOMNode->node, pContent, SysStringLen(p) ) == 0) hr = S_OK; else { xmlChar *pNew; pContent = xmlChar_from_wchar( (WCHAR*)p ); if(pContent) { pNew = xmlStrcat(xmlNodeGetContent(pDOMNode->node), pContent); if(pNew) { xmlNodeSetContent(pDOMNode->node, pNew); hr = S_OK; } else hr = E_FAIL; } else hr = E_FAIL; } } else hr = E_FAIL; return hr; }
static ULONG WINAPI domcomment_Release( IXMLDOMComment *iface ) { domcomment *This = impl_from_IXMLDOMComment( iface ); ULONG ref = InterlockedDecrement( &This->ref ); TRACE("(%p)->(%d)\n", This, ref); if ( ref == 0 ) { destroy_xmlnode(&This->node); heap_free( This ); } return ref; }
static ULONG WINAPI domcomment_Release( IXMLDOMComment *iface ) { domcomment *This = impl_from_IXMLDOMComment( iface ); ULONG ref; ref = InterlockedDecrement( &This->ref ); if ( ref == 0 ) { IUnknown_Release( This->node_unk ); HeapFree( GetProcessHeap(), 0, This ); } return ref; }
static HRESULT WINAPI domcomment_replaceData( IXMLDOMComment *iface, LONG offset, LONG count, BSTR p) { 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 HRESULT WINAPI domcomment_insertData( IXMLDOMComment *iface, LONG offset, BSTR p) { domcomment *This = impl_from_IXMLDOMComment( iface ); HRESULT hr; BSTR data; LONG p_len; TRACE("(%p)->(%d %s)\n", This, offset, debugstr_w(p)); /* If have a NULL or empty string, don't do anything. */ if((p_len = SysStringLen(p)) == 0) return S_OK; if(offset < 0) { return E_INVALIDARG; } hr = IXMLDOMComment_get_data(iface, &data); if(hr == S_OK) { LONG len = SysStringLen(data); BSTR str; if(len < offset) { SysFreeString(data); return E_INVALIDARG; } 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; hr = IXMLDOMComment_put_data(iface, str); SysFreeString(str); SysFreeString(data); } return hr; }
static HRESULT WINAPI domcomment_put_data( IXMLDOMComment *iface, BSTR data) { domcomment *This = impl_from_IXMLDOMComment( iface ); HRESULT hr = E_FAIL; VARIANT val; TRACE("%p %s\n", This, debugstr_w(data) ); V_VT(&val) = VT_BSTR; V_BSTR(&val) = data; hr = IXMLDOMNode_put_nodeValue( This->node, val ); return hr; }
static HRESULT WINAPI domcomment_substringData( IXMLDOMComment *iface, long offset, long count, BSTR *p) { domcomment *This = impl_from_IXMLDOMComment( iface ); xmlnode *pDOMNode = impl_from_IXMLDOMNode( This->node ); xmlChar *pContent; long nLength = 0; HRESULT hr = S_FALSE; TRACE("%p\n", iface); if(!p) return E_INVALIDARG; *p = NULL; if(offset < 0 || count < 0) return E_INVALIDARG; if(count == 0) return hr; pContent = xmlNodeGetContent(pDOMNode->node); if(pContent) { nLength = xmlStrlen(pContent); if( offset < nLength) { BSTR sContent = bstr_from_xmlChar(pContent); if(offset + count > nLength) *p = SysAllocString(&sContent[offset]); else *p = SysAllocStringLen(&sContent[offset], count); SysFreeString(sContent); hr = S_OK; } xmlFree(pContent); } return hr; }
static HRESULT WINAPI domcomment_get_data( IXMLDOMComment *iface, BSTR *p) { domcomment *This = impl_from_IXMLDOMComment( iface ); HRESULT hr = E_FAIL; VARIANT vRet; if(!p) return E_INVALIDARG; hr = IXMLDOMNode_get_nodeValue( This->node, &vRet ); if(hr == S_OK) { *p = V_BSTR(&vRet); } return hr; }
static HRESULT WINAPI domcomment_get_data( IXMLDOMComment *iface, BSTR *p) { domcomment *This = impl_from_IXMLDOMComment( iface ); HRESULT hr; VARIANT vRet; TRACE("(%p)->(%p)\n", This, p); if(!p) return E_INVALIDARG; hr = IXMLDOMComment_get_nodeValue( iface, &vRet ); if(hr == S_OK) { *p = V_BSTR(&vRet); } return hr; }
static HRESULT WINAPI domcomment_substringData( IXMLDOMComment *iface, LONG offset, LONG count, BSTR *p) { domcomment *This = impl_from_IXMLDOMComment( iface ); HRESULT hr; BSTR data; TRACE("(%p)->(%d %d %p)\n", This, offset, count, p); if(!p) return E_INVALIDARG; *p = NULL; if(offset < 0 || count < 0) return E_INVALIDARG; if(count == 0) return S_FALSE; hr = IXMLDOMComment_get_data(iface, &data); if(hr == S_OK) { LONG len = SysStringLen(data); if(offset < len) { if(offset + count > len) *p = SysAllocString(&data[offset]); else *p = SysAllocStringLen(&data[offset], count); } else hr = S_FALSE; SysFreeString(data); } return hr; }
static HRESULT WINAPI domcomment_get_length( IXMLDOMComment *iface, LONG *len) { domcomment *This = impl_from_IXMLDOMComment( iface ); HRESULT hr; BSTR data; TRACE("(%p)->(%p)\n", This, len); if(!len) return E_INVALIDARG; hr = IXMLDOMComment_get_data(iface, &data); if(hr == S_OK) { *len = SysStringLen(data); SysFreeString(data); } return hr; }
static HRESULT WINAPI domcomment_Invoke( IXMLDOMComment *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr ) { domcomment *This = impl_from_IXMLDOMComment( iface ); ITypeInfo *typeinfo; HRESULT hr; TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid), lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); hr = get_typeinfo(IXMLDOMComment_tid, &typeinfo); if(SUCCEEDED(hr)) { hr = ITypeInfo_Invoke(typeinfo, &(This->lpVtbl), dispIdMember, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); ITypeInfo_Release(typeinfo); } return hr; }
static HRESULT WINAPI domcomment_GetIDsOfNames( IXMLDOMComment *iface, REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispId ) { domcomment *This = impl_from_IXMLDOMComment( iface ); ITypeInfo *typeinfo; HRESULT hr; TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId); if(!rgszNames || cNames == 0 || !rgDispId) return E_INVALIDARG; hr = get_typeinfo(IXMLDOMComment_tid, &typeinfo); if(SUCCEEDED(hr)) { hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId); ITypeInfo_Release(typeinfo); } return hr; }
} static HRESULT WINAPI domcomment_put_nodeTypedValue( IXMLDOMComment *iface, VARIANT typedValue) { domcomment *This = impl_from_IXMLDOMComment( iface ); FIXME("(%p)->(%s)\n", This, debugstr_variant(&typedValue)); return E_NOTIMPL; } static HRESULT WINAPI domcomment_get_dataType( IXMLDOMComment *iface, VARIANT* typename) { domcomment *This = impl_from_IXMLDOMComment( iface ); TRACE("(%p)->(%p)\n", This, typename); return return_null_var( typename ); } static HRESULT WINAPI domcomment_put_dataType( IXMLDOMComment *iface, BSTR p) { domcomment *This = impl_from_IXMLDOMComment( iface ); TRACE("(%p)->(%s)\n", This, debugstr_w(p)); if(!p) return E_INVALIDARG;
static ULONG WINAPI domcomment_AddRef( IXMLDOMComment *iface ) { domcomment *This = impl_from_IXMLDOMComment( iface ); return InterlockedIncrement( &This->ref ); }
static HRESULT WINAPI domcomment_insertData( IXMLDOMComment *iface, long offset, BSTR p) { domcomment *This = impl_from_IXMLDOMComment( iface ); xmlnode *pDOMNode = impl_from_IXMLDOMNode( This->node ); xmlChar *pXmlContent; BSTR sNewString; HRESULT hr = S_FALSE; long nLength = 0, nLengthP = 0; xmlChar *str = NULL; TRACE("%p\n", This); /* If have a NULL or empty string, don't do anything. */ if(SysStringLen(p) == 0) return S_OK; if(offset < 0) { return E_INVALIDARG; } pXmlContent = xmlNodeGetContent(pDOMNode->node); if(pXmlContent) { BSTR sContent = bstr_from_xmlChar( pXmlContent ); nLength = SysStringLen(sContent); nLengthP = SysStringLen(p); if(nLength < offset) { SysFreeString(sContent); xmlFree(pXmlContent); 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((WCHAR*)sNewString); if(str) { xmlNodeSetContent(pDOMNode->node, str); hr = S_OK; } SysFreeString(sNewString); } SysFreeString(sContent); xmlFree(pXmlContent); } return hr; }