Jacek Caban : mshtml: Added IHTMLWindow2::get_option implementation.
Alexandre Julliard
julliard at winehq.org
Mon Oct 15 11:27:51 CDT 2007
Module: wine
Branch: master
Commit: 954d4477b5054498282c039dcdcc7f3b205165e3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=954d4477b5054498282c039dcdcc7f3b205165e3
Author: Jacek Caban <jacek at codeweavers.com>
Date: Sat Oct 13 03:58:55 2007 +0200
mshtml: Added IHTMLWindow2::get_option implementation.
---
dlls/mshtml/htmldoc.c | 8 +++-
dlls/mshtml/htmloption.c | 121 ++++++++++++++++++++++++++++++++++++++++++
dlls/mshtml/htmlwindow.c | 12 ++++-
dlls/mshtml/mshtml_private.h | 13 +++++
4 files changed, 151 insertions(+), 3 deletions(-)
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 4faeb6e..e6c16a7 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -174,6 +174,11 @@ static ULONG WINAPI HTMLDocument_Release(IHTMLDocument2 *iface)
if(This->hwnd)
DestroyWindow(This->hwnd);
+ if(This->option_factory) {
+ This->option_factory->doc = NULL;
+ IHTMLOptionElementFactory_Release(HTMLOPTFACTORY(This->option_factory));
+ }
+
if(This->window)
IHTMLWindow2_Release(HTMLWINDOW2(This->window));
@@ -736,7 +741,7 @@ static HRESULT WINAPI HTMLDocument_execCommandShowHelp(IHTMLDocument2 *iface, BS
}
static HRESULT WINAPI HTMLDocument_createElement(IHTMLDocument2 *iface, BSTR eTag,
- IHTMLElement **newElem)
+ IHTMLElement **newElem)
{
FIXME("(%p)->(%s %p)\n", iface, debugstr_w(eTag), newElem);
return E_NOTIMPL;
@@ -1175,6 +1180,7 @@ HRESULT HTMLDocument_Create(IUnknown *pUnkOuter, REFIID riid, void** ppvObject)
ret->nodes = NULL;
ret->readystate = READYSTATE_UNINITIALIZED;
ret->window = NULL;
+ ret->option_factory = NULL;
list_init(&ret->selection_list);
list_init(&ret->range_list);
diff --git a/dlls/mshtml/htmloption.c b/dlls/mshtml/htmloption.c
index 5e707ad..5a0293b 100644
--- a/dlls/mshtml/htmloption.c
+++ b/dlls/mshtml/htmloption.c
@@ -251,3 +251,124 @@ HTMLElement *HTMLOptionElement_Create(nsIDOMHTMLElement *nselem)
return &ret->element;
}
+
+#define HTMLOPTFACTORY_THIS(iface) DEFINE_THIS(HTMLOptionElementFactory, HTMLOptionElementFactory, iface)
+
+static HRESULT WINAPI HTMLOptionElementFactory_QueryInterface(IHTMLOptionElementFactory *iface,
+ REFIID riid, void **ppv)
+{
+ HTMLOptionElementFactory *This = HTMLOPTFACTORY_THIS(iface);
+
+ *ppv = NULL;
+
+ if(IsEqualGUID(&IID_IUnknown, riid)) {
+ TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
+ *ppv = HTMLOPTFACTORY(This);
+ }else if(IsEqualGUID(&IID_IDispatch, riid)) {
+ TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
+ *ppv = HTMLOPTFACTORY(This);
+ }else if(IsEqualGUID(&IID_IHTMLOptionElementFactory, riid)) {
+ TRACE("(%p)->(IID_IHTMLOptionElementFactory %p)\n", This, ppv);
+ *ppv = HTMLOPTFACTORY(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 HTMLOptionElementFactory_AddRef(IHTMLOptionElementFactory *iface)
+{
+ HTMLOptionElementFactory *This = HTMLOPTFACTORY_THIS(iface);
+ LONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) ref=%d\n", This, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI HTMLOptionElementFactory_Release(IHTMLOptionElementFactory *iface)
+{
+ HTMLOptionElementFactory *This = HTMLOPTFACTORY_THIS(iface);
+ LONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) ref=%d\n", This, ref);
+
+ if(!ref)
+ mshtml_free(This);
+
+ return ref;
+}
+
+static HRESULT WINAPI HTMLOptionElementFactory_GetTypeInfoCount(IHTMLOptionElementFactory *iface, UINT *pctinfo)
+{
+ HTMLOptionElementFactory *This = HTMLOPTFACTORY_THIS(iface);
+ FIXME("(%p)->(%p)\n", This, pctinfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLOptionElementFactory_GetTypeInfo(IHTMLOptionElementFactory *iface, UINT iTInfo,
+ LCID lcid, ITypeInfo **ppTInfo)
+{
+ HTMLOptionElementFactory *This = HTMLOPTFACTORY_THIS(iface);
+ FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLOptionElementFactory_GetIDsOfNames(IHTMLOptionElementFactory *iface, REFIID riid,
+ LPOLESTR *rgszNames, UINT cNames,
+ LCID lcid, DISPID *rgDispId)
+{
+ HTMLOptionElementFactory *This = HTMLOPTFACTORY_THIS(iface);
+ FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
+ lcid, rgDispId);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLOptionElementFactory_Invoke(IHTMLOptionElementFactory *iface, DISPID dispIdMember,
+ REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
+ VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
+{
+ HTMLOptionElementFactory *This = HTMLOPTFACTORY_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 HTMLOptionElementFactory_create(IHTMLOptionElementFactory *iface,
+ VARIANT text, VARIANT value, VARIANT defaultselected, VARIANT selected,
+ IHTMLOptionElement **optelem)
+{
+ HTMLOptionElementFactory *This = HTMLOPTFACTORY_THIS(iface);
+ FIXME("(%p)->(v v v v %p)\n", This, optelem);
+ return E_NOTIMPL;
+}
+
+#undef HTMLOPTFACTORY_THIS
+
+static const IHTMLOptionElementFactoryVtbl HTMLOptionElementFactoryVtbl = {
+ HTMLOptionElementFactory_QueryInterface,
+ HTMLOptionElementFactory_AddRef,
+ HTMLOptionElementFactory_Release,
+ HTMLOptionElementFactory_GetTypeInfoCount,
+ HTMLOptionElementFactory_GetTypeInfo,
+ HTMLOptionElementFactory_GetIDsOfNames,
+ HTMLOptionElementFactory_Invoke,
+ HTMLOptionElementFactory_create
+};
+
+HTMLOptionElementFactory *HTMLOptionElementFactory_Create(HTMLDocument *doc)
+{
+ HTMLOptionElementFactory *ret;
+
+ ret = mshtml_alloc(sizeof(HTMLOptionElementFactory));
+ ret->lpHTMLOptionElementFactoryVtbl = &HTMLOptionElementFactoryVtbl;
+ ret->ref = 1;
+ ret->doc = doc;
+
+ return ret;
+}
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index 369a09c..fee2297 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -534,8 +534,16 @@ static HRESULT WINAPI HTMLWindow2_get_screen(IHTMLWindow2 *iface, IHTMLScreen **
static HRESULT WINAPI HTMLWindow2_get_Option(IHTMLWindow2 *iface, IHTMLOptionElementFactory **p)
{
HTMLWindow *This = HTMLWINDOW2_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ if(!This->doc->option_factory)
+ This->doc->option_factory = HTMLOptionElementFactory_Create(This->doc);
+
+ *p = HTMLOPTFACTORY(This->doc->option_factory);
+ IHTMLOptionElementFactory_AddRef(*p);
+
+ return S_OK;
}
static HRESULT WINAPI HTMLWindow2_focus(IHTMLWindow2 *iface)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 68e7e14..48e0d4c 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -94,6 +94,14 @@ struct ConnectionPoint {
ConnectionPoint *next;
};
+typedef struct {
+ const IHTMLOptionElementFactoryVtbl *lpHTMLOptionElementFactoryVtbl;
+
+ LONG ref;
+
+ HTMLDocument *doc;
+} HTMLOptionElementFactory;
+
struct HTMLDocument {
const IHTMLDocument2Vtbl *lpHTMLDocument2Vtbl;
const IHTMLDocument3Vtbl *lpHTMLDocument3Vtbl;
@@ -152,6 +160,8 @@ struct HTMLDocument {
ConnectionPoint cp_htmldocevents2;
ConnectionPoint cp_propnotif;
+ HTMLOptionElementFactory *option_factory;
+
struct list selection_list;
struct list range_list;
@@ -330,6 +340,8 @@ typedef struct {
#define HTMLTEXTCONT(x) ((IHTMLTextContainer*) &(x)->lpHTMLTextContainerVtbl)
+#define HTMLOPTFACTORY(x) ((IHTMLOptionElementFactory*) &(x)->lpHTMLOptionElementFactoryVtbl)
+
#define DEFINE_THIS2(cls,ifc,iface) ((cls*)((BYTE*)(iface)-offsetof(cls,ifc)))
#define DEFINE_THIS(cls,ifc,iface) DEFINE_THIS2(cls,lp ## ifc ## Vtbl,iface)
@@ -338,6 +350,7 @@ HRESULT HTMLLoadOptions_Create(IUnknown*,REFIID,void**);
HTMLWindow *HTMLWindow_Create(HTMLDocument*);
HTMLWindow *nswindow_to_window(const nsIDOMWindow*);
+HTMLOptionElementFactory *HTMLOptionElementFactory_Create(HTMLDocument*);
void setup_nswindow(HTMLWindow*);
void HTMLDocument_HTMLDocument3_Init(HTMLDocument*);
More information about the wine-cvs
mailing list