/* * Copyright 2006 Jacek Caban for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include "config.h" #include #include #define COBJMACROS #include "windef.h" #include "winbase.h" #include "winuser.h" #include "winnls.h" #include "ole2.h" #include "wine/debug.h" #include "wine/unicode.h" #include "mshtml_private.h" WINE_DEFAULT_DEBUG_CHANNEL(mshtml); typedef struct { const IHTMLTxtRangeVtbl *lpHTMLTxtRangeVtbl; LONG ref; nsIDOMRange *nsrange; HTMLDocument *doc; struct list entry; } HTMLTxtRange; #define HTMLTXTRANGE(x) ((IHTMLTxtRange*) &(x)->lpHTMLTxtRangeVtbl) #define HTMLTXTRANGE_THIS(iface) DEFINE_THIS(HTMLTxtRange, HTMLTxtRange, iface) static HRESULT WINAPI HTMLTxtRange_QueryInterface(IHTMLTxtRange *iface, REFIID riid, void **ppv) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); *ppv = NULL; if(IsEqualGUID(&IID_IUnknown, riid)) { TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); *ppv = HTMLTXTRANGE(This); }else if(IsEqualGUID(&IID_IDispatch, riid)) { TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); *ppv = HTMLTXTRANGE(This); }else if(IsEqualGUID(&IID_IHTMLTxtRange, riid)) { TRACE("(%p)->(IID_IHTMLTxtRange %p)\n", This, ppv); *ppv = HTMLTXTRANGE(This); } if(*ppv) { IUnknown_AddRef((IUnknown*)*ppv); return S_OK; } WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); return E_NOINTERFACE; } static ULONG WINAPI HTMLTxtRange_AddRef(IHTMLTxtRange *iface) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); LONG ref = InterlockedIncrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); return ref; } static ULONG WINAPI HTMLTxtRange_Release(IHTMLTxtRange *iface) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); LONG ref = InterlockedDecrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); if(!ref) { if(This->nsrange) nsISelection_Release(This->nsrange); if(This->doc) list_remove(&This->entry); mshtml_free(This); } return ref; } static HRESULT WINAPI HTMLTxtRange_GetTypeInfoCount(IHTMLTxtRange *iface, UINT *pctinfo) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%p)\n", This, pctinfo); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_GetTypeInfo(IHTMLTxtRange *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_GetIDsOfNames(IHTMLTxtRange *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_Invoke(IHTMLTxtRange *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid), lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_get_htmlText(IHTMLTxtRange *iface, BSTR *p) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); TRACE("(%p)->(%p)\n", This, p); *p = NULL; if(This->nsrange) { nsIDOMDocumentFragment *fragment; nsresult nsres; nsres = nsIDOMRange_CloneContents(This->nsrange, &fragment); if(NS_SUCCEEDED(nsres)) { const PRUnichar *nstext; nsAString nsstr; nsAString_Init(&nsstr, NULL); nsnode_to_nsstring((nsIDOMNode*)fragment, &nsstr); nsIDOMDocumentFragment_Release(fragment); nsAString_GetData(&nsstr, &nstext, NULL); *p = SysAllocString(nstext); nsAString_Finish(&nsstr); } } if(!*p) { const WCHAR emptyW[] = {0}; *p = SysAllocString(emptyW); } TRACE("return %s\n", debugstr_w(*p)); return S_OK; } static HRESULT WINAPI HTMLTxtRange_put_text(IHTMLTxtRange *iface, BSTR v) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%s)\n", This, debugstr_w(v)); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_get_text(IHTMLTxtRange *iface, BSTR *p) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); TRACE("(%p)->(%p)\n", This, p); *p = NULL; if(This->nsrange) { nsAString text_str; nsresult nsres; nsAString_Init(&text_str, NULL); nsres = nsIDOMRange_ToString(This->nsrange, &text_str); if(NS_SUCCEEDED(nsres)) { const PRUnichar *nstext; nsAString_GetData(&text_str, &nstext, NULL); *p = SysAllocString(nstext); }else { ERR("ToString failed: %08x\n", nsres); } nsAString_Finish(&text_str); } if(!*p) { static const WCHAR empty[] = {0}; *p = SysAllocString(empty); } return S_OK; } static HRESULT WINAPI HTMLTxtRange_parentElement(IHTMLTxtRange *iface, IHTMLElement **parent) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%p)\n", This, parent); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_duplicate(IHTMLTxtRange *iface, IHTMLTxtRange **Duplicate) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); nsIDOMRange *nsrange = NULL; TRACE("(%p)->(%p)\n", This, Duplicate); nsIDOMRange_CloneRange(This->nsrange, &nsrange); *Duplicate = HTMLTxtRange_Create(This->doc, nsrange); nsIDOMRange_Release(nsrange); return S_OK; } static HRESULT WINAPI HTMLTxtRange_inRange(IHTMLTxtRange *iface, IHTMLTxtRange *Range, VARIANT_BOOL *InRange) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%p %p)\n", This, Range, InRange); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_isEqual(IHTMLTxtRange *iface, IHTMLTxtRange *Range, VARIANT_BOOL *IsEqual) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%p %p)\n", This, Range, IsEqual); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_scrollIntoView(IHTMLTxtRange *iface, VARIANT_BOOL fStart) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%x)\n", This, fStart); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_collapse(IHTMLTxtRange *iface, VARIANT_BOOL Start) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); TRACE("(%p)->(%x)\n", This, Start); nsIDOMRange_Collapse(This->nsrange, Start != VARIANT_FALSE); return S_OK; } static HRESULT WINAPI HTMLTxtRange_expand(IHTMLTxtRange *iface, BSTR Unit, VARIANT_BOOL *Success) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%s %p)\n", This, debugstr_w(Unit), Success); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_move(IHTMLTxtRange *iface, BSTR Unit, long Count, long *ActualCount) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%s %ld %p)\n", This, debugstr_w(Unit), Count, ActualCount); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_moveStart(IHTMLTxtRange *iface, BSTR Unit, long Count, long *ActualCount) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%s %ld %p)\n", This, debugstr_w(Unit), Count, ActualCount); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_moveEnd(IHTMLTxtRange *iface, BSTR Unit, long Count, long *ActualCount) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%s %ld %p)\n", This, debugstr_w(Unit), Count, ActualCount); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_select(IHTMLTxtRange *iface) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->()\n", This); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_pasteHTML(IHTMLTxtRange *iface, BSTR html) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%s)\n", This, debugstr_w(html)); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_moveToElementText(IHTMLTxtRange *iface, IHTMLElement *element) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%p)\n", This, element); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_setEndPoint(IHTMLTxtRange *iface, BSTR how, IHTMLTxtRange *SourceRange) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%s %p)\n", This, debugstr_w(how), SourceRange); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_compareEndPoints(IHTMLTxtRange *iface, BSTR how, IHTMLTxtRange *SourceRange, long *ret) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(how), SourceRange, ret); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_findText(IHTMLTxtRange *iface, BSTR String, long count, long Flags, VARIANT_BOOL *Success) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%s %ld %08lx %p)\n", This, debugstr_w(String), count, Flags, Success); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_moveToPoint(IHTMLTxtRange *iface, long x, long y) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%ld %ld)\n", This, x, y); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_getBookmark(IHTMLTxtRange *iface, BSTR *Bookmark) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%p)\n", This, Bookmark); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_moveToBookmark(IHTMLTxtRange *iface, BSTR Bookmark, VARIANT_BOOL *Success) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%s %p)\n", This, debugstr_w(Bookmark), Success); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_queryCommandSupported(IHTMLTxtRange *iface, BSTR cmdID, VARIANT_BOOL *pfRet) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pfRet); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_queryCommandEnabled(IHTMLTxtRange *iface, BSTR cmdID, VARIANT_BOOL *pfRet) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pfRet); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_queryCommandState(IHTMLTxtRange *iface, BSTR cmdID, VARIANT_BOOL *pfRet) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pfRet); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_queryCommandIndeterm(IHTMLTxtRange *iface, BSTR cmdID, VARIANT_BOOL *pfRet) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pfRet); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_queryCommandText(IHTMLTxtRange *iface, BSTR cmdID, BSTR *pcmdText) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pcmdText); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_queryCommandValue(IHTMLTxtRange *iface, BSTR cmdID, VARIANT *pcmdValue) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pcmdValue); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_execCommand(IHTMLTxtRange *iface, BSTR cmdID, VARIANT_BOOL showUI, VARIANT value, VARIANT_BOOL *pfRet) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%s %x v %p)\n", This, debugstr_w(cmdID), showUI, pfRet); return E_NOTIMPL; } static HRESULT WINAPI HTMLTxtRange_execCommandShowHelp(IHTMLTxtRange *iface, BSTR cmdID, VARIANT_BOOL *pfRet) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pfRet); return E_NOTIMPL; } #undef HTMLTXTRANGE_THIS static const IHTMLTxtRangeVtbl HTMLTxtRangeVtbl = { HTMLTxtRange_QueryInterface, HTMLTxtRange_AddRef, HTMLTxtRange_Release, HTMLTxtRange_GetTypeInfoCount, HTMLTxtRange_GetTypeInfo, HTMLTxtRange_GetIDsOfNames, HTMLTxtRange_Invoke, HTMLTxtRange_get_htmlText, HTMLTxtRange_put_text, HTMLTxtRange_get_text, HTMLTxtRange_parentElement, HTMLTxtRange_duplicate, HTMLTxtRange_inRange, HTMLTxtRange_isEqual, HTMLTxtRange_scrollIntoView, HTMLTxtRange_collapse, HTMLTxtRange_expand, HTMLTxtRange_move, HTMLTxtRange_moveStart, HTMLTxtRange_moveEnd, HTMLTxtRange_select, HTMLTxtRange_pasteHTML, HTMLTxtRange_moveToElementText, HTMLTxtRange_setEndPoint, HTMLTxtRange_compareEndPoints, HTMLTxtRange_findText, HTMLTxtRange_moveToPoint, HTMLTxtRange_getBookmark, HTMLTxtRange_moveToBookmark, HTMLTxtRange_queryCommandSupported, HTMLTxtRange_queryCommandEnabled, HTMLTxtRange_queryCommandState, HTMLTxtRange_queryCommandIndeterm, HTMLTxtRange_queryCommandText, HTMLTxtRange_queryCommandValue, HTMLTxtRange_execCommand, HTMLTxtRange_execCommandShowHelp }; IHTMLTxtRange *HTMLTxtRange_Create(HTMLDocument *doc, nsIDOMRange *nsrange) { HTMLTxtRange *ret = mshtml_alloc(sizeof(HTMLTxtRange)); ret->lpHTMLTxtRangeVtbl = &HTMLTxtRangeVtbl; ret->ref = 1; if(nsrange) nsIDOMRange_AddRef(nsrange); ret->nsrange = nsrange; ret->doc = doc; list_add_head(&doc->range_list, &ret->entry); return HTMLTXTRANGE(ret); } void detach_ranges(HTMLDocument *This) { HTMLTxtRange *iter; LIST_FOR_EACH_ENTRY(iter, &This->range_list, HTMLTxtRange, entry) { iter->doc = NULL; } }