xref: /reactos/dll/win32/ieframe/ieframe_main.c (revision c4b0f215)
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