1c2c66affSColin Finck /* 2c2c66affSColin Finck * Copyright 2011 Jacek Caban for CodeWeavers 3c2c66affSColin Finck * 4c2c66affSColin Finck * This library is free software; you can redistribute it and/or 5c2c66affSColin Finck * modify it under the terms of the GNU Lesser General Public 6c2c66affSColin Finck * License as published by the Free Software Foundation; either 7c2c66affSColin Finck * version 2.1 of the License, or (at your option) any later version. 8c2c66affSColin Finck * 9c2c66affSColin Finck * This library is distributed in the hope that it will be useful, 10c2c66affSColin Finck * but WITHOUT ANY WARRANTY; without even the implied warranty of 11c2c66affSColin Finck * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12c2c66affSColin Finck * Lesser General Public License for more details. 13c2c66affSColin Finck * 14c2c66affSColin Finck * You should have received a copy of the GNU Lesser General Public 15c2c66affSColin Finck * License along with this library; if not, write to the Free Software 16c2c66affSColin Finck * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 17c2c66affSColin Finck */ 18c2c66affSColin Finck 19c2c66affSColin Finck #include "ieframe.h" 20c2c66affSColin Finck 21c2c66affSColin Finck #include <rpcproxy.h> 22c2c66affSColin Finck 23c2c66affSColin Finck LONG module_ref = 0; 24c2c66affSColin Finck HINSTANCE ieframe_instance; 25c2c66affSColin Finck 26c2c66affSColin Finck static ITypeLib *typelib; 27c2c66affSColin Finck static ITypeInfo *typeinfos[LAST_tid]; 28c2c66affSColin Finck 29c2c66affSColin Finck static REFIID tid_ids[] = { 30c2c66affSColin Finck #define XIID(iface) &IID_ ## iface, 31c2c66affSColin Finck #define XCLSID(class) &CLSID_ ## class, 32c2c66affSColin Finck TID_LIST 33c2c66affSColin Finck #undef XIID 34c2c66affSColin Finck #undef XCLSID 35c2c66affSColin Finck }; 36c2c66affSColin Finck 37c2c66affSColin Finck static HRESULT load_typelib(void) 38c2c66affSColin Finck { 39c2c66affSColin Finck HRESULT hres; 40c2c66affSColin Finck ITypeLib *tl; 41c2c66affSColin Finck 42c2c66affSColin Finck hres = LoadRegTypeLib(&LIBID_SHDocVw, 1, 1, LOCALE_SYSTEM_DEFAULT, &tl); 43c2c66affSColin Finck if(FAILED(hres)) { 44c2c66affSColin Finck ERR("LoadRegTypeLib failed: %08x\n", hres); 45c2c66affSColin Finck return hres; 46c2c66affSColin Finck } 47c2c66affSColin Finck 48c2c66affSColin Finck if(InterlockedCompareExchangePointer((void**)&typelib, tl, NULL)) 49c2c66affSColin Finck ITypeLib_Release(tl); 50c2c66affSColin Finck return hres; 51c2c66affSColin Finck } 52c2c66affSColin Finck 53c2c66affSColin Finck HRESULT get_typeinfo(tid_t tid, ITypeInfo **typeinfo) 54c2c66affSColin Finck { 55c2c66affSColin Finck HRESULT hres; 56c2c66affSColin Finck 57c2c66affSColin Finck if(!typelib) 58c2c66affSColin Finck hres = load_typelib(); 59c2c66affSColin Finck if(!typelib) 60c2c66affSColin Finck return hres; 61c2c66affSColin Finck 62c2c66affSColin Finck if(!typeinfos[tid]) { 63c2c66affSColin Finck ITypeInfo *ti; 64c2c66affSColin Finck 65c2c66affSColin Finck hres = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid], &ti); 66c2c66affSColin Finck if(FAILED(hres)) { 67c2c66affSColin Finck ERR("GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(tid_ids[tid]), hres); 68c2c66affSColin Finck return hres; 69c2c66affSColin Finck } 70c2c66affSColin Finck 71c2c66affSColin Finck if(InterlockedCompareExchangePointer((void**)(typeinfos+tid), ti, NULL)) 72c2c66affSColin Finck ITypeInfo_Release(ti); 73c2c66affSColin Finck } 74c2c66affSColin Finck 75c2c66affSColin Finck *typeinfo = typeinfos[tid]; 76c2c66affSColin Finck return S_OK; 77c2c66affSColin Finck } 78c2c66affSColin Finck 79c2c66affSColin Finck static void release_typelib(void) 80c2c66affSColin Finck { 81c2c66affSColin Finck unsigned i; 82c2c66affSColin Finck 83c2c66affSColin Finck if(!typelib) 84c2c66affSColin Finck return; 85c2c66affSColin Finck 86c2c66affSColin Finck for(i=0; i < sizeof(typeinfos)/sizeof(*typeinfos); i++) { 87c2c66affSColin Finck if(typeinfos[i]) 88c2c66affSColin Finck ITypeInfo_Release(typeinfos[i]); 89c2c66affSColin Finck } 90c2c66affSColin Finck 91c2c66affSColin Finck ITypeLib_Release(typelib); 92c2c66affSColin Finck } 93c2c66affSColin Finck 94c2c66affSColin Finck static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv) 95c2c66affSColin Finck { 96c2c66affSColin Finck *ppv = NULL; 97c2c66affSColin Finck 98c2c66affSColin Finck if(IsEqualGUID(&IID_IUnknown, riid)) { 99c2c66affSColin Finck TRACE("(%p)->(IID_IUnknown %p)\n", iface, ppv); 100c2c66affSColin Finck *ppv = iface; 101c2c66affSColin Finck }else if(IsEqualGUID(&IID_IClassFactory, riid)) { 102c2c66affSColin Finck TRACE("(%p)->(IID_IClassFactory %p)\n", iface, ppv); 103c2c66affSColin Finck *ppv = iface; 104c2c66affSColin Finck } 105c2c66affSColin Finck 106c2c66affSColin Finck if(*ppv) { 107c2c66affSColin Finck IUnknown_AddRef((IUnknown*)*ppv); 108c2c66affSColin Finck return S_OK; 109c2c66affSColin Finck } 110c2c66affSColin Finck 111c2c66affSColin Finck FIXME("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv); 112c2c66affSColin Finck return E_NOINTERFACE; 113c2c66affSColin Finck } 114c2c66affSColin Finck 115c2c66affSColin Finck static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface) 116c2c66affSColin Finck { 117c2c66affSColin Finck TRACE("(%p)\n", iface); 118c2c66affSColin Finck return 2; 119c2c66affSColin Finck } 120c2c66affSColin Finck 121c2c66affSColin Finck static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) 122c2c66affSColin Finck { 123c2c66affSColin Finck TRACE("(%p)\n", iface); 124c2c66affSColin Finck return 1; 125c2c66affSColin Finck } 126c2c66affSColin Finck 127c2c66affSColin Finck static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock) 128c2c66affSColin Finck { 129c2c66affSColin Finck TRACE("(%p)->(%x)\n", iface, fLock); 130c2c66affSColin Finck return S_OK; 131c2c66affSColin Finck } 132c2c66affSColin Finck 133c2c66affSColin Finck static const IClassFactoryVtbl WebBrowserFactoryVtbl = { 134c2c66affSColin Finck ClassFactory_QueryInterface, 135c2c66affSColin Finck ClassFactory_AddRef, 136c2c66affSColin Finck ClassFactory_Release, 137c2c66affSColin Finck WebBrowser_Create, 138c2c66affSColin Finck ClassFactory_LockServer 139c2c66affSColin Finck }; 140c2c66affSColin Finck 141c2c66affSColin Finck static IClassFactory WebBrowserFactory = { &WebBrowserFactoryVtbl }; 142c2c66affSColin Finck 143c2c66affSColin Finck static const IClassFactoryVtbl WebBrowserV1FactoryVtbl = { 144c2c66affSColin Finck ClassFactory_QueryInterface, 145c2c66affSColin Finck ClassFactory_AddRef, 146c2c66affSColin Finck ClassFactory_Release, 147c2c66affSColin Finck WebBrowserV1_Create, 148c2c66affSColin Finck ClassFactory_LockServer 149c2c66affSColin Finck }; 150c2c66affSColin Finck 151c2c66affSColin Finck static IClassFactory WebBrowserV1Factory = { &WebBrowserV1FactoryVtbl }; 152c2c66affSColin Finck 153c2c66affSColin Finck static const IClassFactoryVtbl InternetShortcutFactoryVtbl = { 154c2c66affSColin Finck ClassFactory_QueryInterface, 155c2c66affSColin Finck ClassFactory_AddRef, 156c2c66affSColin Finck ClassFactory_Release, 157c2c66affSColin Finck InternetShortcut_Create, 158c2c66affSColin Finck ClassFactory_LockServer 159c2c66affSColin Finck }; 160c2c66affSColin Finck 161c2c66affSColin Finck static IClassFactory InternetShortcutFactory = { &InternetShortcutFactoryVtbl }; 162c2c66affSColin Finck 163c2c66affSColin Finck static const IClassFactoryVtbl CUrlHistoryFactoryVtbl = { 164c2c66affSColin Finck ClassFactory_QueryInterface, 165c2c66affSColin Finck ClassFactory_AddRef, 166c2c66affSColin Finck ClassFactory_Release, 167c2c66affSColin Finck CUrlHistory_Create, 168c2c66affSColin Finck ClassFactory_LockServer 169c2c66affSColin Finck }; 170c2c66affSColin Finck 171c2c66affSColin Finck static IClassFactory CUrlHistoryFactory = { &CUrlHistoryFactoryVtbl }; 172c2c66affSColin Finck 173c2c66affSColin Finck /****************************************************************** 174c2c66affSColin Finck * DllMain (ieframe.@) 175c2c66affSColin Finck */ 176c2c66affSColin Finck BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) 177c2c66affSColin Finck { 178c2c66affSColin Finck TRACE("(%p %d %p)\n", hInstDLL, fdwReason, lpv); 179c2c66affSColin Finck 180c2c66affSColin Finck switch(fdwReason) 181c2c66affSColin Finck { 182c2c66affSColin Finck case DLL_WINE_PREATTACH: 183c2c66affSColin Finck return FALSE; /* prefer native version */ 184c2c66affSColin Finck case DLL_PROCESS_ATTACH: 185c2c66affSColin Finck ieframe_instance = hInstDLL; 186c2c66affSColin Finck register_iewindow_class(); 187c2c66affSColin Finck DisableThreadLibraryCalls(ieframe_instance); 188c2c66affSColin Finck break; 189c2c66affSColin Finck case DLL_PROCESS_DETACH: 190c2c66affSColin Finck if (lpv) break; 191c2c66affSColin Finck unregister_iewindow_class(); 192c2c66affSColin Finck release_typelib(); 193c2c66affSColin Finck } 194c2c66affSColin Finck 195c2c66affSColin Finck return TRUE; 196c2c66affSColin Finck } 197c2c66affSColin Finck 198c2c66affSColin Finck /*********************************************************************** 199c2c66affSColin Finck * DllGetClassObject (ieframe.@) 200c2c66affSColin Finck */ 201c2c66affSColin Finck HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) 202c2c66affSColin Finck { 203c2c66affSColin Finck if(IsEqualGUID(&CLSID_WebBrowser, rclsid)) { 204c2c66affSColin Finck TRACE("(CLSID_WebBrowser %s %p)\n", debugstr_guid(riid), ppv); 205c2c66affSColin Finck return IClassFactory_QueryInterface(&WebBrowserFactory, riid, ppv); 206c2c66affSColin Finck } 207c2c66affSColin Finck 208c2c66affSColin Finck if(IsEqualGUID(&CLSID_WebBrowser_V1, rclsid)) { 209c2c66affSColin Finck TRACE("(CLSID_WebBrowser_V1 %s %p)\n", debugstr_guid(riid), ppv); 210c2c66affSColin Finck return IClassFactory_QueryInterface(&WebBrowserV1Factory, riid, ppv); 211c2c66affSColin Finck } 212c2c66affSColin Finck 213c2c66affSColin Finck if(IsEqualGUID(rclsid, &CLSID_InternetShortcut)) { 214c2c66affSColin Finck TRACE("(CLSID_InternetShortcut %s %p)\n", debugstr_guid(riid), ppv); 215c2c66affSColin Finck return IClassFactory_QueryInterface(&InternetShortcutFactory, riid, ppv); 216c2c66affSColin Finck } 217c2c66affSColin Finck 218c2c66affSColin Finck if(IsEqualGUID(&CLSID_CUrlHistory, rclsid)) { 219c2c66affSColin Finck TRACE("(CLSID_CUrlHistory %s %p)\n", debugstr_guid(riid), ppv); 220c2c66affSColin Finck return IClassFactory_QueryInterface(&CUrlHistoryFactory, riid, ppv); 221c2c66affSColin Finck } 222c2c66affSColin Finck 223c2c66affSColin Finck FIXME("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); 224c2c66affSColin Finck return CLASS_E_CLASSNOTAVAILABLE; 225c2c66affSColin Finck } 226c2c66affSColin Finck 227c2c66affSColin Finck static const IClassFactoryVtbl InternetExplorerFactoryVtbl = { 228c2c66affSColin Finck ClassFactory_QueryInterface, 229c2c66affSColin Finck ClassFactory_AddRef, 230c2c66affSColin Finck ClassFactory_Release, 231c2c66affSColin Finck InternetExplorer_Create, 232c2c66affSColin Finck ClassFactory_LockServer 233c2c66affSColin Finck }; 234c2c66affSColin Finck 235*c4b0f215SAmine Khaldi IClassFactory InternetExplorerFactory = { &InternetExplorerFactoryVtbl }; 236c2c66affSColin Finck 237*c4b0f215SAmine Khaldi static const IClassFactoryVtbl InternetExplorerManagerFactoryVtbl = { 238*c4b0f215SAmine Khaldi ClassFactory_QueryInterface, 239*c4b0f215SAmine Khaldi ClassFactory_AddRef, 240*c4b0f215SAmine Khaldi ClassFactory_Release, 241*c4b0f215SAmine Khaldi InternetExplorerManager_Create, 242*c4b0f215SAmine Khaldi ClassFactory_LockServer 243*c4b0f215SAmine Khaldi }; 244c2c66affSColin Finck 245*c4b0f215SAmine Khaldi IClassFactory InternetExplorerManagerFactory = { &InternetExplorerManagerFactoryVtbl }; 246c2c66affSColin Finck 247c2c66affSColin Finck /*********************************************************************** 248c2c66affSColin Finck * DllCanUnloadNow (ieframe.@) 249c2c66affSColin Finck */ 250c2c66affSColin Finck HRESULT WINAPI DllCanUnloadNow(void) 251c2c66affSColin Finck { 252c2c66affSColin Finck TRACE("()\n"); 253c2c66affSColin Finck return module_ref ? S_FALSE : S_OK; 254c2c66affSColin Finck } 255c2c66affSColin Finck 256c2c66affSColin Finck /*********************************************************************** 257c2c66affSColin Finck * DllRegisterServer (ieframe.@) 258c2c66affSColin Finck */ 259c2c66affSColin Finck HRESULT WINAPI DllRegisterServer(void) 260c2c66affSColin Finck { 261c2c66affSColin Finck TRACE("()\n"); 262c2c66affSColin Finck return __wine_register_resources(ieframe_instance); 263c2c66affSColin Finck } 264c2c66affSColin Finck 265c2c66affSColin Finck /*********************************************************************** 266c2c66affSColin Finck * DllUnregisterServer (ieframe.@) 267c2c66affSColin Finck */ 268c2c66affSColin Finck HRESULT WINAPI DllUnregisterServer(void) 269c2c66affSColin Finck { 270c2c66affSColin Finck TRACE("()\n"); 271c2c66affSColin Finck return __wine_unregister_resources(ieframe_instance); 272c2c66affSColin Finck } 273c2c66affSColin Finck 274c2c66affSColin Finck /*********************************************************************** 275c2c66affSColin Finck * IEGetWriteableHKCU (ieframe.@) 276c2c66affSColin Finck */ 277c2c66affSColin Finck HRESULT WINAPI IEGetWriteableHKCU(HKEY *pkey) 278c2c66affSColin Finck { 279c2c66affSColin Finck FIXME("(%p) stub\n", pkey); 280c2c66affSColin Finck return E_NOTIMPL; 281c2c66affSColin Finck } 282