ieframe: Added InternetExplore::get_HWND implementation.
[wine/multimedia.git] / dlls / ieframe / ieframe_main.c
blob4793ee316cb35aeaa1b642d4e69967319e8c8e17
1 /*
2 * Copyright 2011 Jacek Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #include "ieframe.h"
21 #include "rpcproxy.h"
22 #include "shlguid.h"
23 #include "isguids.h"
25 #include "wine/debug.h"
27 WINE_DEFAULT_DEBUG_CHANNEL(ieframe);
29 LONG module_ref = 0;
30 HINSTANCE ieframe_instance;
32 const char *debugstr_variant(const VARIANT *v)
34 if(!v)
35 return "(null)";
37 switch(V_VT(v)) {
38 case VT_EMPTY:
39 return "{VT_EMPTY}";
40 case VT_NULL:
41 return "{VT_NULL}";
42 case VT_I4:
43 return wine_dbg_sprintf("{VT_I4: %d}", V_I4(v));
44 case VT_R8:
45 return wine_dbg_sprintf("{VT_R8: %lf}", V_R8(v));
46 case VT_BSTR:
47 return wine_dbg_sprintf("{VT_BSTR: %s}", debugstr_w(V_BSTR(v)));
48 case VT_DISPATCH:
49 return wine_dbg_sprintf("{VT_DISPATCH: %p}", V_DISPATCH(v));
50 case VT_BOOL:
51 return wine_dbg_sprintf("{VT_BOOL: %x}", V_BOOL(v));
52 case VT_ERROR:
53 return wine_dbg_sprintf("{VT_ERROR: %08x}", V_ERROR(v));
54 default:
55 return wine_dbg_sprintf("{vt %d}", V_VT(v));
59 static ITypeLib *typelib;
60 static ITypeInfo *typeinfos[LAST_tid];
62 static REFIID tid_ids[] = {
63 #define XIID(iface) &IID_ ## iface,
64 #define XCLSID(class) &CLSID_ ## class,
65 TID_LIST
66 #undef XIID
67 #undef XCLSID
70 static HRESULT load_typelib(void)
72 HRESULT hres;
73 ITypeLib *tl;
75 hres = LoadRegTypeLib(&LIBID_SHDocVw, 1, 1, LOCALE_SYSTEM_DEFAULT, &tl);
76 if(FAILED(hres)) {
77 ERR("LoadRegTypeLib failed: %08x\n", hres);
78 return hres;
81 if(InterlockedCompareExchangePointer((void**)&typelib, tl, NULL))
82 ITypeLib_Release(tl);
83 return hres;
86 HRESULT get_typeinfo(tid_t tid, ITypeInfo **typeinfo)
88 HRESULT hres;
90 if(!typelib)
91 hres = load_typelib();
92 if(!typelib)
93 return hres;
95 if(!typeinfos[tid]) {
96 ITypeInfo *ti;
98 hres = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid], &ti);
99 if(FAILED(hres)) {
100 ERR("GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(tid_ids[tid]), hres);
101 return hres;
104 if(InterlockedCompareExchangePointer((void**)(typeinfos+tid), ti, NULL))
105 ITypeInfo_Release(ti);
108 *typeinfo = typeinfos[tid];
109 return S_OK;
112 static void release_typelib(void)
114 unsigned i;
116 if(!typelib)
117 return;
119 for(i=0; i < sizeof(typeinfos)/sizeof(*typeinfos); i++) {
120 if(typeinfos[i])
121 ITypeInfo_Release(typeinfos[i]);
124 ITypeLib_Release(typelib);
127 static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv)
129 *ppv = NULL;
131 if(IsEqualGUID(&IID_IUnknown, riid)) {
132 TRACE("(%p)->(IID_IUnknown %p)\n", iface, ppv);
133 *ppv = iface;
134 }else if(IsEqualGUID(&IID_IClassFactory, riid)) {
135 TRACE("(%p)->(IID_IClassFactory %p)\n", iface, ppv);
136 *ppv = iface;
139 if(*ppv) {
140 IUnknown_AddRef((IUnknown*)*ppv);
141 return S_OK;
144 FIXME("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv);
145 return E_NOINTERFACE;
148 static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface)
150 TRACE("(%p)\n", iface);
151 return 2;
154 static ULONG WINAPI ClassFactory_Release(IClassFactory *iface)
156 TRACE("(%p)\n", iface);
157 return 1;
160 static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock)
162 TRACE("(%p)->(%x)\n", iface, fLock);
163 return S_OK;
166 static const IClassFactoryVtbl WebBrowserFactoryVtbl = {
167 ClassFactory_QueryInterface,
168 ClassFactory_AddRef,
169 ClassFactory_Release,
170 WebBrowser_Create,
171 ClassFactory_LockServer
174 static IClassFactory WebBrowserFactory = { &WebBrowserFactoryVtbl };
176 static const IClassFactoryVtbl WebBrowserV1FactoryVtbl = {
177 ClassFactory_QueryInterface,
178 ClassFactory_AddRef,
179 ClassFactory_Release,
180 WebBrowserV1_Create,
181 ClassFactory_LockServer
184 static IClassFactory WebBrowserV1Factory = { &WebBrowserV1FactoryVtbl };
186 static const IClassFactoryVtbl InternetShortcutFactoryVtbl = {
187 ClassFactory_QueryInterface,
188 ClassFactory_AddRef,
189 ClassFactory_Release,
190 InternetShortcut_Create,
191 ClassFactory_LockServer
194 static IClassFactory InternetShortcutFactory = { &InternetShortcutFactoryVtbl };
196 static const IClassFactoryVtbl CUrlHistoryFactoryVtbl = {
197 ClassFactory_QueryInterface,
198 ClassFactory_AddRef,
199 ClassFactory_Release,
200 CUrlHistory_Create,
201 ClassFactory_LockServer
204 static IClassFactory CUrlHistoryFactory = { &CUrlHistoryFactoryVtbl };
206 /******************************************************************
207 * DllMain (ieframe.@)
209 BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
211 TRACE("(%p %d %p)\n", hInstDLL, fdwReason, lpv);
213 switch(fdwReason)
215 case DLL_WINE_PREATTACH:
216 return FALSE; /* prefer native version */
217 case DLL_PROCESS_ATTACH:
218 ieframe_instance = hInstDLL;
219 register_iewindow_class();
220 DisableThreadLibraryCalls(ieframe_instance);
221 break;
222 case DLL_PROCESS_DETACH:
223 if (lpv) break;
224 unregister_iewindow_class();
225 release_typelib();
228 return TRUE;
231 /***********************************************************************
232 * DllGetClassObject (ieframe.@)
234 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
236 if(IsEqualGUID(&CLSID_WebBrowser, rclsid)) {
237 TRACE("(CLSID_WebBrowser %s %p)\n", debugstr_guid(riid), ppv);
238 return IClassFactory_QueryInterface(&WebBrowserFactory, riid, ppv);
241 if(IsEqualGUID(&CLSID_WebBrowser_V1, rclsid)) {
242 TRACE("(CLSID_WebBrowser_V1 %s %p)\n", debugstr_guid(riid), ppv);
243 return IClassFactory_QueryInterface(&WebBrowserV1Factory, riid, ppv);
246 if(IsEqualGUID(rclsid, &CLSID_InternetShortcut)) {
247 TRACE("(CLSID_InternetShortcut %s %p)\n", debugstr_guid(riid), ppv);
248 return IClassFactory_QueryInterface(&InternetShortcutFactory, riid, ppv);
251 if(IsEqualGUID(&CLSID_CUrlHistory, rclsid)) {
252 TRACE("(CLSID_CUrlHistory %s %p)\n", debugstr_guid(riid), ppv);
253 return IClassFactory_QueryInterface(&CUrlHistoryFactory, riid, ppv);
256 FIXME("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
257 return CLASS_E_CLASSNOTAVAILABLE;
260 static const IClassFactoryVtbl InternetExplorerFactoryVtbl = {
261 ClassFactory_QueryInterface,
262 ClassFactory_AddRef,
263 ClassFactory_Release,
264 InternetExplorer_Create,
265 ClassFactory_LockServer
268 static IClassFactory InternetExplorerFactory = { &InternetExplorerFactoryVtbl };
270 HRESULT register_class_object(BOOL do_reg)
272 HRESULT hres;
274 static DWORD cookie;
276 if(do_reg) {
277 hres = CoRegisterClassObject(&CLSID_InternetExplorer,
278 (IUnknown*)&InternetExplorerFactory, CLSCTX_SERVER,
279 REGCLS_MULTIPLEUSE|REGCLS_SUSPENDED, &cookie);
280 if (FAILED(hres)) {
281 ERR("failed to register object %08x\n", hres);
282 return hres;
285 hres = CoResumeClassObjects();
286 if(SUCCEEDED(hres))
287 return hres;
289 ERR("failed to resume object %08x\n", hres);
292 return CoRevokeClassObject(cookie);
295 /***********************************************************************
296 * DllCanUnloadNow (ieframe.@)
298 HRESULT WINAPI DllCanUnloadNow(void)
300 TRACE("()\n");
301 return module_ref ? S_FALSE : S_OK;
304 /***********************************************************************
305 * DllRegisterServer (ieframe.@)
307 HRESULT WINAPI DllRegisterServer(void)
309 TRACE("()\n");
310 return __wine_register_resources(ieframe_instance);
313 /***********************************************************************
314 * DllUnregisterServer (ieframe.@)
316 HRESULT WINAPI DllUnregisterServer(void)
318 TRACE("()\n");
319 return __wine_unregister_resources(ieframe_instance);
322 /***********************************************************************
323 * IEGetWriteableHKCU (ieframe.@)
325 HRESULT WINAPI IEGetWriteableHKCU(HKEY *pkey)
327 FIXME("(%p) stub\n", pkey);
328 return E_NOTIMPL;