Module: wine Branch: master Commit: 9dcceab0618114f5c40332ed6bb32d6246b54d43 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9dcceab0618114f5c40332ed6b...
Author: Jacek Caban jacek@codeweavers.com Date: Tue May 31 12:19:40 2011 +0200
mshtml: Added IOmNavigator::get_mimeTypes implementation.
---
dlls/mshtml/omnavigator.c | 146 ++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 144 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/omnavigator.c b/dlls/mshtml/omnavigator.c index f5a3573..95e8930 100644 --- a/dlls/mshtml/omnavigator.c +++ b/dlls/mshtml/omnavigator.c @@ -32,6 +32,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
typedef struct HTMLPluginsCollection HTMLPluginsCollection; +typedef struct HTMLMimeTypesCollection HTMLMimeTypesCollection;
typedef struct { DispatchEx dispex; @@ -40,6 +41,7 @@ typedef struct { LONG ref;
HTMLPluginsCollection *plugins; + HTMLMimeTypesCollection *mime_types; } OmNavigator;
static inline OmNavigator *impl_from_IOmNavigator(IOmNavigator *iface) @@ -196,6 +198,131 @@ static HRESULT create_plugins_collection(OmNavigator *navigator, HTMLPluginsColl return S_OK; }
+struct HTMLMimeTypesCollection { + IHTMLMimeTypesCollection IHTMLMimeTypesCollection_iface; + + LONG ref; + + OmNavigator *navigator; +}; + +static inline HTMLMimeTypesCollection *impl_from_IHTMLMimeTypesCollection(IHTMLMimeTypesCollection *iface) +{ + return CONTAINING_RECORD(iface, HTMLMimeTypesCollection, IHTMLMimeTypesCollection_iface); +} + +static HRESULT WINAPI HTMLMimeTypesCollection_QueryInterface(IHTMLMimeTypesCollection *iface, REFIID riid, void **ppv) +{ + HTMLMimeTypesCollection *This = impl_from_IHTMLMimeTypesCollection(iface); + + if(IsEqualGUID(&IID_IUnknown, riid)) { + TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); + *ppv = &This->IHTMLMimeTypesCollection_iface; + }else if(IsEqualGUID(&IID_IHTMLMimeTypesCollection, riid)) { + TRACE("(%p)->(IID_IHTMLMimeTypesCollection %p)\n", This, ppv); + *ppv = &This->IHTMLMimeTypesCollection_iface; + }else { + *ppv = NULL; + WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static ULONG WINAPI HTMLMimeTypesCollection_AddRef(IHTMLMimeTypesCollection *iface) +{ + HTMLMimeTypesCollection *This = impl_from_IHTMLMimeTypesCollection(iface); + LONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + return ref; +} + +static ULONG WINAPI HTMLMimeTypesCollection_Release(IHTMLMimeTypesCollection *iface) +{ + HTMLMimeTypesCollection *This = impl_from_IHTMLMimeTypesCollection(iface); + LONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + if(!ref) { + if(This->navigator) + This->navigator->mime_types = NULL; + heap_free(This); + } + + return ref; +} + +static HRESULT WINAPI HTMLMimeTypesCollection_GetTypeInfoCount(IHTMLMimeTypesCollection *iface, UINT *pctinfo) +{ + HTMLMimeTypesCollection *This = impl_from_IHTMLMimeTypesCollection(iface); + FIXME("%p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLMimeTypesCollection_GetTypeInfo(IHTMLMimeTypesCollection *iface, UINT iTInfo, + LCID lcid, ITypeInfo **ppTInfo) +{ + HTMLMimeTypesCollection *This = impl_from_IHTMLMimeTypesCollection(iface); + FIXME("%p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLMimeTypesCollection_GetIDsOfNames(IHTMLMimeTypesCollection *iface, REFIID riid, + LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) +{ + HTMLMimeTypesCollection *This = impl_from_IHTMLMimeTypesCollection(iface); + FIXME("%p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLMimeTypesCollection_Invoke(IHTMLMimeTypesCollection *iface, DISPID dispIdMember, + REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, + EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + HTMLMimeTypesCollection *This = impl_from_IHTMLMimeTypesCollection(iface); + FIXME("%p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLMimeTypesCollection_get_length(IHTMLMimeTypesCollection *iface, LONG *p) +{ + HTMLMimeTypesCollection *This = impl_from_IHTMLMimeTypesCollection(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static const IHTMLMimeTypesCollectionVtbl HTMLMimeTypesCollectionVtbl = { + HTMLMimeTypesCollection_QueryInterface, + HTMLMimeTypesCollection_AddRef, + HTMLMimeTypesCollection_Release, + HTMLMimeTypesCollection_GetTypeInfoCount, + HTMLMimeTypesCollection_GetTypeInfo, + HTMLMimeTypesCollection_GetIDsOfNames, + HTMLMimeTypesCollection_Invoke, + HTMLMimeTypesCollection_get_length +}; + +static HRESULT create_mime_types_collection(OmNavigator *navigator, HTMLMimeTypesCollection **ret) +{ + HTMLMimeTypesCollection *col; + + col = heap_alloc_zero(sizeof(*col)); + if(!col) + return E_OUTOFMEMORY; + + col->IHTMLMimeTypesCollection_iface.lpVtbl = &HTMLMimeTypesCollectionVtbl; + col->ref = 1; + col->navigator = navigator; + + *ret = col; + return S_OK; +} + static HRESULT WINAPI OmNavigator_QueryInterface(IOmNavigator *iface, REFIID riid, void **ppv) { OmNavigator *This = impl_from_IOmNavigator(iface); @@ -243,6 +370,8 @@ static ULONG WINAPI OmNavigator_Release(IOmNavigator *iface) This->plugins->navigator = NULL; IHTMLPluginsCollection_Release(&This->plugins->IHTMLPluginsCollection_iface); } + if(This->mime_types) + This->mime_types->navigator = NULL; release_dispex(&This->dispex); heap_free(This); } @@ -387,8 +516,21 @@ static HRESULT WINAPI OmNavigator_taintEnabled(IOmNavigator *iface, VARIANT_BOOL static HRESULT WINAPI OmNavigator_get_mimeTypes(IOmNavigator *iface, IHTMLMimeTypesCollection **p) { OmNavigator *This = impl_from_IOmNavigator(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, p); + + if(!This->mime_types) { + HRESULT hres; + + hres = create_mime_types_collection(This, &This->mime_types); + if(FAILED(hres)) + return hres; + }else { + IHTMLMimeTypesCollection_AddRef(&This->mime_types->IHTMLMimeTypesCollection_iface); + } + + *p = &This->mime_types->IHTMLMimeTypesCollection_iface; + return S_OK; }
static HRESULT WINAPI OmNavigator_get_plugins(IOmNavigator *iface, IHTMLPluginsCollection **p)