xref: /reactos/dll/win32/ieframe/ieframe_main.c (revision c3cabdbf)
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 
21fc19c80dSAmine Khaldi #include "initguid.h"
22fc19c80dSAmine Khaldi #include "rpcproxy.h"
23fc19c80dSAmine Khaldi #include "shlguid.h"
24fc19c80dSAmine Khaldi #include "isguids.h"
25fc19c80dSAmine Khaldi #include "ieautomation.h"
26fc19c80dSAmine Khaldi 
27fc19c80dSAmine Khaldi #include "wine/debug.h"
28fc19c80dSAmine Khaldi 
29fc19c80dSAmine Khaldi WINE_DEFAULT_DEBUG_CHANNEL(ieframe);
30c2c66affSColin Finck 
31c2c66affSColin Finck LONG module_ref = 0;
32c2c66affSColin Finck HINSTANCE ieframe_instance;
33c2c66affSColin Finck 
34c2c66affSColin Finck static ITypeLib *typelib;
35c2c66affSColin Finck static ITypeInfo *typeinfos[LAST_tid];
36c2c66affSColin Finck 
37c2c66affSColin Finck static REFIID tid_ids[] = {
38c2c66affSColin Finck #define XIID(iface) &IID_ ## iface,
39c2c66affSColin Finck #define XCLSID(class) &CLSID_ ## class,
40c2c66affSColin Finck TID_LIST
41c2c66affSColin Finck #undef XIID
42c2c66affSColin Finck #undef XCLSID
43c2c66affSColin Finck };
44c2c66affSColin Finck 
load_typelib(void)45c2c66affSColin Finck static HRESULT load_typelib(void)
46c2c66affSColin Finck {
47c2c66affSColin Finck     HRESULT hres;
48c2c66affSColin Finck     ITypeLib *tl;
49c2c66affSColin Finck 
50c2c66affSColin Finck     hres = LoadRegTypeLib(&LIBID_SHDocVw, 1, 1, LOCALE_SYSTEM_DEFAULT, &tl);
51c2c66affSColin Finck     if(FAILED(hres)) {
52c2c66affSColin Finck         ERR("LoadRegTypeLib failed: %08x\n", hres);
53c2c66affSColin Finck         return hres;
54c2c66affSColin Finck     }
55c2c66affSColin Finck 
56c2c66affSColin Finck     if(InterlockedCompareExchangePointer((void**)&typelib, tl, NULL))
57c2c66affSColin Finck         ITypeLib_Release(tl);
58c2c66affSColin Finck     return hres;
59c2c66affSColin Finck }
60c2c66affSColin Finck 
get_typeinfo(tid_t tid,ITypeInfo ** typeinfo)61c2c66affSColin Finck HRESULT get_typeinfo(tid_t tid, ITypeInfo **typeinfo)
62c2c66affSColin Finck {
63c2c66affSColin Finck     HRESULT hres;
64c2c66affSColin Finck 
65c2c66affSColin Finck     if(!typelib)
66c2c66affSColin Finck         hres = load_typelib();
67c2c66affSColin Finck     if(!typelib)
68c2c66affSColin Finck         return hres;
69c2c66affSColin Finck 
70c2c66affSColin Finck     if(!typeinfos[tid]) {
71c2c66affSColin Finck         ITypeInfo *ti;
72c2c66affSColin Finck 
73c2c66affSColin Finck         hres = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid], &ti);
74c2c66affSColin Finck         if(FAILED(hres)) {
75c2c66affSColin Finck             ERR("GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(tid_ids[tid]), hres);
76c2c66affSColin Finck             return hres;
77c2c66affSColin Finck         }
78c2c66affSColin Finck 
79c2c66affSColin Finck         if(InterlockedCompareExchangePointer((void**)(typeinfos+tid), ti, NULL))
80c2c66affSColin Finck             ITypeInfo_Release(ti);
81c2c66affSColin Finck     }
82c2c66affSColin Finck 
83c2c66affSColin Finck     *typeinfo = typeinfos[tid];
84c2c66affSColin Finck     return S_OK;
85c2c66affSColin Finck }
86c2c66affSColin Finck 
release_typelib(void)87c2c66affSColin Finck static void release_typelib(void)
88c2c66affSColin Finck {
89c2c66affSColin Finck     unsigned i;
90c2c66affSColin Finck 
91c2c66affSColin Finck     if(!typelib)
92c2c66affSColin Finck         return;
93c2c66affSColin Finck 
94*336b2a45SAmine Khaldi     for(i=0; i < ARRAY_SIZE(typeinfos); i++) {
95c2c66affSColin Finck         if(typeinfos[i])
96c2c66affSColin Finck             ITypeInfo_Release(typeinfos[i]);
97c2c66affSColin Finck     }
98c2c66affSColin Finck 
99c2c66affSColin Finck     ITypeLib_Release(typelib);
100c2c66affSColin Finck }
101c2c66affSColin Finck 
ClassFactory_QueryInterface(IClassFactory * iface,REFIID riid,void ** ppv)102c2c66affSColin Finck static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv)
103c2c66affSColin Finck {
104c2c66affSColin Finck     *ppv = NULL;
105c2c66affSColin Finck 
106c2c66affSColin Finck     if(IsEqualGUID(&IID_IUnknown, riid)) {
107c2c66affSColin Finck         TRACE("(%p)->(IID_IUnknown %p)\n", iface, ppv);
108c2c66affSColin Finck         *ppv = iface;
109c2c66affSColin Finck     }else if(IsEqualGUID(&IID_IClassFactory, riid)) {
110c2c66affSColin Finck         TRACE("(%p)->(IID_IClassFactory %p)\n", iface, ppv);
111c2c66affSColin Finck         *ppv = iface;
112c2c66affSColin Finck     }
113c2c66affSColin Finck 
114c2c66affSColin Finck     if(*ppv) {
115c2c66affSColin Finck         IUnknown_AddRef((IUnknown*)*ppv);
116c2c66affSColin Finck         return S_OK;
117c2c66affSColin Finck     }
118c2c66affSColin Finck 
119c2c66affSColin Finck     FIXME("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv);
120c2c66affSColin Finck     return E_NOINTERFACE;
121c2c66affSColin Finck }
122c2c66affSColin Finck 
ClassFactory_AddRef(IClassFactory * iface)123c2c66affSColin Finck static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface)
124c2c66affSColin Finck {
125c2c66affSColin Finck     TRACE("(%p)\n", iface);
126c2c66affSColin Finck     return 2;
127c2c66affSColin Finck }
128c2c66affSColin Finck 
ClassFactory_Release(IClassFactory * iface)129c2c66affSColin Finck static ULONG WINAPI ClassFactory_Release(IClassFactory *iface)
130c2c66affSColin Finck {
131c2c66affSColin Finck     TRACE("(%p)\n", iface);
132c2c66affSColin Finck     return 1;
133c2c66affSColin Finck }
134c2c66affSColin Finck 
ClassFactory_LockServer(IClassFactory * iface,BOOL fLock)135c2c66affSColin Finck static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock)
136c2c66affSColin Finck {
137c2c66affSColin Finck     TRACE("(%p)->(%x)\n", iface, fLock);
138c2c66affSColin Finck     return S_OK;
139c2c66affSColin Finck }
140c2c66affSColin Finck 
141c2c66affSColin Finck static const IClassFactoryVtbl WebBrowserFactoryVtbl = {
142c2c66affSColin Finck     ClassFactory_QueryInterface,
143c2c66affSColin Finck     ClassFactory_AddRef,
144c2c66affSColin Finck     ClassFactory_Release,
145c2c66affSColin Finck     WebBrowser_Create,
146c2c66affSColin Finck     ClassFactory_LockServer
147c2c66affSColin Finck };
148c2c66affSColin Finck 
149c2c66affSColin Finck static IClassFactory WebBrowserFactory = { &WebBrowserFactoryVtbl };
150c2c66affSColin Finck 
151c2c66affSColin Finck static const IClassFactoryVtbl WebBrowserV1FactoryVtbl = {
152c2c66affSColin Finck     ClassFactory_QueryInterface,
153c2c66affSColin Finck     ClassFactory_AddRef,
154c2c66affSColin Finck     ClassFactory_Release,
155c2c66affSColin Finck     WebBrowserV1_Create,
156c2c66affSColin Finck     ClassFactory_LockServer
157c2c66affSColin Finck };
158c2c66affSColin Finck 
159c2c66affSColin Finck static IClassFactory WebBrowserV1Factory = { &WebBrowserV1FactoryVtbl };
160c2c66affSColin Finck 
161c2c66affSColin Finck static const IClassFactoryVtbl InternetShortcutFactoryVtbl = {
162c2c66affSColin Finck     ClassFactory_QueryInterface,
163c2c66affSColin Finck     ClassFactory_AddRef,
164c2c66affSColin Finck     ClassFactory_Release,
165c2c66affSColin Finck     InternetShortcut_Create,
166c2c66affSColin Finck     ClassFactory_LockServer
167c2c66affSColin Finck };
168c2c66affSColin Finck 
169c2c66affSColin Finck static IClassFactory InternetShortcutFactory = { &InternetShortcutFactoryVtbl };
170c2c66affSColin Finck 
171c2c66affSColin Finck static const IClassFactoryVtbl CUrlHistoryFactoryVtbl = {
172c2c66affSColin Finck     ClassFactory_QueryInterface,
173c2c66affSColin Finck     ClassFactory_AddRef,
174c2c66affSColin Finck     ClassFactory_Release,
175c2c66affSColin Finck     CUrlHistory_Create,
176c2c66affSColin Finck     ClassFactory_LockServer
177c2c66affSColin Finck };
178c2c66affSColin Finck 
179c2c66affSColin Finck static IClassFactory CUrlHistoryFactory = { &CUrlHistoryFactoryVtbl };
180c2c66affSColin Finck 
181c2c66affSColin Finck /******************************************************************
182c2c66affSColin Finck  *              DllMain (ieframe.@)
183c2c66affSColin Finck  */
DllMain(HINSTANCE hInstDLL,DWORD fdwReason,LPVOID lpv)184c2c66affSColin Finck BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
185c2c66affSColin Finck {
186c2c66affSColin Finck     TRACE("(%p %d %p)\n", hInstDLL, fdwReason, lpv);
187c2c66affSColin Finck 
188c2c66affSColin Finck     switch(fdwReason)
189c2c66affSColin Finck     {
190c2c66affSColin Finck     case DLL_PROCESS_ATTACH:
191c2c66affSColin Finck         ieframe_instance = hInstDLL;
192c2c66affSColin Finck         register_iewindow_class();
193c2c66affSColin Finck         DisableThreadLibraryCalls(ieframe_instance);
194c2c66affSColin Finck         break;
195c2c66affSColin Finck     case DLL_PROCESS_DETACH:
196c2c66affSColin Finck         if (lpv) break;
197c2c66affSColin Finck         unregister_iewindow_class();
198c2c66affSColin Finck         release_typelib();
199c2c66affSColin Finck     }
200c2c66affSColin Finck 
201c2c66affSColin Finck     return TRUE;
202c2c66affSColin Finck }
203c2c66affSColin Finck 
204c2c66affSColin Finck /***********************************************************************
205c2c66affSColin Finck  *		DllGetClassObject	(ieframe.@)
206c2c66affSColin Finck  */
DllGetClassObject(REFCLSID rclsid,REFIID riid,LPVOID * ppv)207c2c66affSColin Finck HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
208c2c66affSColin Finck {
209c2c66affSColin Finck     if(IsEqualGUID(&CLSID_WebBrowser, rclsid)) {
210c2c66affSColin Finck         TRACE("(CLSID_WebBrowser %s %p)\n", debugstr_guid(riid), ppv);
211c2c66affSColin Finck         return IClassFactory_QueryInterface(&WebBrowserFactory, riid, ppv);
212c2c66affSColin Finck     }
213c2c66affSColin Finck 
214c2c66affSColin Finck     if(IsEqualGUID(&CLSID_WebBrowser_V1, rclsid)) {
215c2c66affSColin Finck         TRACE("(CLSID_WebBrowser_V1 %s %p)\n", debugstr_guid(riid), ppv);
216c2c66affSColin Finck         return IClassFactory_QueryInterface(&WebBrowserV1Factory, riid, ppv);
217c2c66affSColin Finck     }
218c2c66affSColin Finck 
219c2c66affSColin Finck     if(IsEqualGUID(rclsid, &CLSID_InternetShortcut)) {
220c2c66affSColin Finck         TRACE("(CLSID_InternetShortcut %s %p)\n", debugstr_guid(riid), ppv);
221c2c66affSColin Finck         return IClassFactory_QueryInterface(&InternetShortcutFactory, riid, ppv);
222c2c66affSColin Finck     }
223c2c66affSColin Finck 
224c2c66affSColin Finck     if(IsEqualGUID(&CLSID_CUrlHistory, rclsid)) {
225c2c66affSColin Finck         TRACE("(CLSID_CUrlHistory %s %p)\n", debugstr_guid(riid), ppv);
226c2c66affSColin Finck         return IClassFactory_QueryInterface(&CUrlHistoryFactory, riid, ppv);
227c2c66affSColin Finck     }
228c2c66affSColin Finck 
229c2c66affSColin Finck     FIXME("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
230c2c66affSColin Finck     return CLASS_E_CLASSNOTAVAILABLE;
231c2c66affSColin Finck }
232c2c66affSColin Finck 
233c2c66affSColin Finck static const IClassFactoryVtbl InternetExplorerFactoryVtbl = {
234c2c66affSColin Finck     ClassFactory_QueryInterface,
235c2c66affSColin Finck     ClassFactory_AddRef,
236c2c66affSColin Finck     ClassFactory_Release,
237c2c66affSColin Finck     InternetExplorer_Create,
238c2c66affSColin Finck     ClassFactory_LockServer
239c2c66affSColin Finck };
240c2c66affSColin Finck 
241c4b0f215SAmine Khaldi IClassFactory InternetExplorerFactory = { &InternetExplorerFactoryVtbl };
242c2c66affSColin Finck 
243c4b0f215SAmine Khaldi static const IClassFactoryVtbl InternetExplorerManagerFactoryVtbl = {
244c4b0f215SAmine Khaldi     ClassFactory_QueryInterface,
245c4b0f215SAmine Khaldi     ClassFactory_AddRef,
246c4b0f215SAmine Khaldi     ClassFactory_Release,
247c4b0f215SAmine Khaldi     InternetExplorerManager_Create,
248c4b0f215SAmine Khaldi     ClassFactory_LockServer
249c4b0f215SAmine Khaldi };
250c2c66affSColin Finck 
251c4b0f215SAmine Khaldi IClassFactory InternetExplorerManagerFactory = { &InternetExplorerManagerFactoryVtbl };
252c2c66affSColin Finck 
253c2c66affSColin Finck /***********************************************************************
254c2c66affSColin Finck  *          DllCanUnloadNow (ieframe.@)
255c2c66affSColin Finck  */
DllCanUnloadNow(void)256c2c66affSColin Finck HRESULT WINAPI DllCanUnloadNow(void)
257c2c66affSColin Finck {
258c2c66affSColin Finck     TRACE("()\n");
259c2c66affSColin Finck     return module_ref ? S_FALSE : S_OK;
260c2c66affSColin Finck }
261c2c66affSColin Finck 
262c2c66affSColin Finck /***********************************************************************
263c2c66affSColin Finck  *          DllRegisterServer (ieframe.@)
264c2c66affSColin Finck  */
DllRegisterServer(void)265c2c66affSColin Finck HRESULT WINAPI DllRegisterServer(void)
266c2c66affSColin Finck {
267c2c66affSColin Finck     TRACE("()\n");
268c2c66affSColin Finck     return __wine_register_resources(ieframe_instance);
269c2c66affSColin Finck }
270c2c66affSColin Finck 
271c2c66affSColin Finck /***********************************************************************
272c2c66affSColin Finck  *          DllUnregisterServer (ieframe.@)
273c2c66affSColin Finck  */
DllUnregisterServer(void)274c2c66affSColin Finck HRESULT WINAPI DllUnregisterServer(void)
275c2c66affSColin Finck {
276c2c66affSColin Finck     TRACE("()\n");
277c2c66affSColin Finck     return __wine_unregister_resources(ieframe_instance);
278c2c66affSColin Finck }
279c2c66affSColin Finck 
280c2c66affSColin Finck /***********************************************************************
281c2c66affSColin Finck  *          IEGetWriteableHKCU (ieframe.@)
282c2c66affSColin Finck  */
IEGetWriteableHKCU(HKEY * pkey)283c2c66affSColin Finck HRESULT WINAPI IEGetWriteableHKCU(HKEY *pkey)
284c2c66affSColin Finck {
285c2c66affSColin Finck     FIXME("(%p) stub\n", pkey);
286c2c66affSColin Finck     return E_NOTIMPL;
287c2c66affSColin Finck }
288