Module: wine Branch: master Commit: be59368dd1176becfd582d0d959e16b23430b97d URL: http://source.winehq.org/git/wine.git/?a=commit;h=be59368dd1176becfd582d0d95...
Author: Jacek Caban jacek@codeweavers.com Date: Thu Apr 17 02:32:18 2008 +0200
mshtml: Move get_typeinfo to dispex.c.
---
dlls/mshtml/dispex.c | 55 ++++++++++++++++++++++++++++++++++++++++++ dlls/mshtml/main.c | 52 +-------------------------------------- dlls/mshtml/mshtml_private.h | 15 ++++++----- 3 files changed, 64 insertions(+), 58 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index f665c8f..6596f76 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -31,6 +31,61 @@
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
+static ITypeLib *typelib; +static ITypeInfo *typeinfos[LAST_tid]; + +static REFIID tid_ids[] = { + &IID_IHTMLWindow2, +}; + +HRESULT get_typeinfo(tid_t tid, ITypeInfo **typeinfo) +{ + HRESULT hres; + + if(!typelib) { + ITypeLib *tl; + + hres = LoadRegTypeLib(&LIBID_MSHTML, 4, 0, LOCALE_SYSTEM_DEFAULT, &tl); + if(FAILED(hres)) { + ERR("LoadRegTypeLib failed: %08x\n", hres); + return hres; + } + + if(InterlockedCompareExchangePointer((void**)&typelib, tl, NULL)) + ITypeLib_Release(tl); + } + + if(!typeinfos[tid]) { + ITypeInfo *typeinfo; + + hres = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid], &typeinfo); + if(FAILED(hres)) { + ERR("GetTypeInfoOfGuid failed: %08x\n", hres); + return hres; + } + + if(InterlockedCompareExchangePointer((void**)(typeinfos+tid), typeinfo, NULL)) + ITypeInfo_Release(typeinfo); + } + + *typeinfo = typeinfos[tid]; + return S_OK; +} + +void release_typelib(void) +{ + unsigned i; + + if(!typelib) + return; + + for(i=0; i < sizeof(typeinfos)/sizeof(*typeinfos); i++) + if(typeinfos[i]) + ITypeInfo_Release(typeinfos[i]); + + ITypeLib_Release(typelib); +} + #define DISPATCHEX_THIS(iface) DEFINE_THIS(DispatchEx, IDispatchEx, iface)
static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv) diff --git a/dlls/mshtml/main.c b/dlls/mshtml/main.c index 0389833..1c52c5a 100644 --- a/dlls/mshtml/main.c +++ b/dlls/mshtml/main.c @@ -49,47 +49,6 @@ DWORD mshtml_tls = 0;
static HINSTANCE shdoclc = NULL;
-static ITypeLib *typelib; -static ITypeInfo *typeinfos[LAST_tid]; - -static REFIID tid_ids[] = { - &IID_IHTMLWindow2 -}; - -HRESULT get_typeinfo(enum tid_t tid, ITypeInfo **typeinfo) -{ - HRESULT hres; - - if(!typelib) { - ITypeLib *tl; - - hres = LoadRegTypeLib(&LIBID_MSHTML, 4, 0, LOCALE_SYSTEM_DEFAULT, &tl); - if(FAILED(hres)) { - ERR("LoadRegTypeLib failed: %08x\n", hres); - return hres; - } - - if(InterlockedCompareExchangePointer((void**)&typelib, tl, NULL)) - ITypeLib_Release(tl); - } - - if(!typeinfos[tid]) { - ITypeInfo *typeinfo; - - hres = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid], &typeinfo); - if(FAILED(hres)) { - ERR("GetTypeInfoOfGuid failed: %08x\n", hres); - return hres; - } - - if(InterlockedCompareExchangePointer((void**)(typeinfos+tid), typeinfo, NULL)) - ITypeInfo_Release(typeinfo); - } - - *typeinfo = typeinfos[tid]; - return S_OK; -} - static void thread_detach(void) { thread_data_t *thread_data; @@ -107,16 +66,7 @@ static void thread_detach(void) static void process_detach(void) { close_gecko(); - - if(typelib) { - unsigned i; - - for(i=0; i < sizeof(typeinfos)/sizeof(*typeinfos); i++) - if(typeinfos[i]) - ITypeInfo_Release(typeinfos[i]); - - ITypeLib_Release(typelib); - } + release_typelib();
if(shdoclc) FreeLibrary(shdoclc); diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 1bd4bb1..67e27a4 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -57,6 +57,12 @@ typedef struct ConnectionPoint ConnectionPoint; typedef struct BSCallback BSCallback; typedef struct nsChannelBSC nsChannelBSC;
+/* NOTE: make sure to keep in sync with dispex.c */ +typedef enum { + IHTMLWindow2_tid, + LAST_tid +} tid_t; + typedef struct { const IDispatchExVtbl *lpIDispatchExVtbl;
@@ -524,13 +530,8 @@ HWND get_thread_hwnd(void); void push_task(task_t*); void remove_doc_tasks(const HTMLDocument*);
-/* typelibs */ -enum tid_t { - IHTMLWindow2_tid, - LAST_tid -}; - -HRESULT get_typeinfo(enum tid_t, ITypeInfo**); +HRESULT get_typeinfo(tid_t,ITypeInfo**); +void release_typelib(void);
DEFINE_GUID(CLSID_AboutProtocol, 0x3050F406, 0x98B5, 0x11CF, 0xBB,0x82, 0x00,0xAA,0x00,0xBD,0xCE,0x0B); DEFINE_GUID(CLSID_JSProtocol, 0x3050F3B2, 0x98B5, 0x11CF, 0xBB,0x82, 0x00,0xAA,0x00,0xBD,0xCE,0x0B);