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