ieframe: Moved WebBrowser and InternetExplorer objects implementations to ieframe.
[wine/testsucceed.git] / dlls / ieframe / ieframe_main.c
blob4f4aaf8ab2b5b57b685ea1c155668354ba7e720a
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 "shlguid.h"
22 #include "isguids.h"
24 #include "wine/debug.h"
26 WINE_DEFAULT_DEBUG_CHANNEL(ieframe);
28 LONG module_ref = 0;
29 HINSTANCE ieframe_instance;
31 const char *debugstr_variant(const VARIANT *v)
33 if(!v)
34 return "(null)";
36 switch(V_VT(v)) {
37 case VT_EMPTY:
38 return "{VT_EMPTY}";
39 case VT_NULL:
40 return "{VT_NULL}";
41 case VT_I4:
42 return wine_dbg_sprintf("{VT_I4: %d}", V_I4(v));
43 case VT_R8:
44 return wine_dbg_sprintf("{VT_R8: %lf}", V_R8(v));
45 case VT_BSTR:
46 return wine_dbg_sprintf("{VT_BSTR: %s}", debugstr_w(V_BSTR(v)));
47 case VT_DISPATCH:
48 return wine_dbg_sprintf("{VT_DISPATCH: %p}", V_DISPATCH(v));
49 case VT_BOOL:
50 return wine_dbg_sprintf("{VT_BOOL: %x}", V_BOOL(v));
51 default:
52 return wine_dbg_sprintf("{vt %d}", V_VT(v));
56 static ITypeInfo *wb_typeinfo = NULL;
58 HRESULT get_typeinfo(ITypeInfo **typeinfo)
60 ITypeLib *typelib;
61 HRESULT hres;
63 if(wb_typeinfo) {
64 *typeinfo = wb_typeinfo;
65 return S_OK;
68 hres = LoadRegTypeLib(&LIBID_SHDocVw, 1, 1, LOCALE_SYSTEM_DEFAULT, &typelib);
69 if(FAILED(hres)) {
70 ERR("LoadRegTypeLib failed: %08x\n", hres);
71 return hres;
74 hres = ITypeLib_GetTypeInfoOfGuid(typelib, &IID_IWebBrowser2, &wb_typeinfo);
75 ITypeLib_Release(typelib);
77 *typeinfo = wb_typeinfo;
78 return hres;
81 static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv)
83 *ppv = NULL;
85 if(IsEqualGUID(&IID_IUnknown, riid)) {
86 TRACE("(%p)->(IID_IUnknown %p)\n", iface, ppv);
87 *ppv = iface;
88 }else if(IsEqualGUID(&IID_IClassFactory, riid)) {
89 TRACE("(%p)->(IID_IClassFactory %p)\n", iface, ppv);
90 *ppv = iface;
93 if(*ppv) {
94 IUnknown_AddRef((IUnknown*)*ppv);
95 return S_OK;
98 FIXME("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv);
99 return E_NOINTERFACE;
102 static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface)
104 TRACE("(%p)\n", iface);
105 return 2;
108 static ULONG WINAPI ClassFactory_Release(IClassFactory *iface)
110 TRACE("(%p)\n", iface);
111 return 1;
114 static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock)
116 TRACE("(%p)->(%x)\n", iface, fLock);
117 return S_OK;
120 static const IClassFactoryVtbl WebBrowserFactoryVtbl = {
121 ClassFactory_QueryInterface,
122 ClassFactory_AddRef,
123 ClassFactory_Release,
124 WebBrowser_Create,
125 ClassFactory_LockServer
128 static IClassFactory WebBrowserFactory = { &WebBrowserFactoryVtbl };
130 static const IClassFactoryVtbl WebBrowserV1FactoryVtbl = {
131 ClassFactory_QueryInterface,
132 ClassFactory_AddRef,
133 ClassFactory_Release,
134 WebBrowserV1_Create,
135 ClassFactory_LockServer
138 static IClassFactory WebBrowserV1Factory = { &WebBrowserV1FactoryVtbl };
140 static const IClassFactoryVtbl InternetShortcutFactoryVtbl = {
141 ClassFactory_QueryInterface,
142 ClassFactory_AddRef,
143 ClassFactory_Release,
144 InternetShortcut_Create,
145 ClassFactory_LockServer
148 static IClassFactory InternetShortcutFactory = { &InternetShortcutFactoryVtbl };
150 static const IClassFactoryVtbl CUrlHistoryFactoryVtbl = {
151 ClassFactory_QueryInterface,
152 ClassFactory_AddRef,
153 ClassFactory_Release,
154 CUrlHistory_Create,
155 ClassFactory_LockServer
158 static IClassFactory CUrlHistoryFactory = { &CUrlHistoryFactoryVtbl };
160 static const IClassFactoryVtbl TaskbarListFactoryVtbl = {
161 ClassFactory_QueryInterface,
162 ClassFactory_AddRef,
163 ClassFactory_Release,
164 TaskbarList_Create,
165 ClassFactory_LockServer
168 static IClassFactory TaskbarListFactory = { &TaskbarListFactoryVtbl };
170 /******************************************************************
171 * DllMain (ieframe.@)
173 BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
175 TRACE("(%p %d %p)\n", hInstDLL, fdwReason, lpv);
177 switch(fdwReason)
179 case DLL_WINE_PREATTACH:
180 return FALSE; /* prefer native version */
181 case DLL_PROCESS_ATTACH:
182 ieframe_instance = hInstDLL;
183 register_iewindow_class();
184 DisableThreadLibraryCalls(ieframe_instance);
185 break;
186 case DLL_PROCESS_DETACH:
187 unregister_iewindow_class();
188 if(wb_typeinfo)
189 ITypeInfo_Release(wb_typeinfo);
192 return TRUE;
195 /***********************************************************************
196 * DllGetClassObject (ieframe.@)
198 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
200 if(IsEqualGUID(&CLSID_WebBrowser, rclsid)) {
201 TRACE("(CLSID_WebBrowser %s %p)\n", debugstr_guid(riid), ppv);
202 return IClassFactory_QueryInterface(&WebBrowserFactory, riid, ppv);
205 if(IsEqualGUID(&CLSID_WebBrowser_V1, rclsid)) {
206 TRACE("(CLSID_WebBrowser_V1 %s %p)\n", debugstr_guid(riid), ppv);
207 return IClassFactory_QueryInterface(&WebBrowserV1Factory, riid, ppv);
211 if(IsEqualGUID(rclsid, &CLSID_InternetShortcut)) {
212 TRACE("(CLSID_InternetShortcut %s %p)\n", debugstr_guid(riid), ppv);
213 return IClassFactory_QueryInterface(&InternetShortcutFactory, riid, ppv);
216 if(IsEqualGUID(&CLSID_CUrlHistory, rclsid)) {
217 TRACE("(CLSID_CUrlHistory %s %p)\n", debugstr_guid(riid), ppv);
218 return IClassFactory_QueryInterface(&CUrlHistoryFactory, riid, ppv);
221 if(IsEqualGUID(&CLSID_TaskbarList, rclsid)) {
222 TRACE("(CLSID_TaskbarList %s %p)\n", debugstr_guid(riid), ppv);
223 return IClassFactory_QueryInterface(&TaskbarListFactory, riid, ppv);
227 FIXME("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
228 return CLASS_E_CLASSNOTAVAILABLE;
231 static const IClassFactoryVtbl InternetExplorerFactoryVtbl = {
232 ClassFactory_QueryInterface,
233 ClassFactory_AddRef,
234 ClassFactory_Release,
235 InternetExplorer_Create,
236 ClassFactory_LockServer
239 static IClassFactory InternetExplorerFactory = { &InternetExplorerFactoryVtbl };
241 HRESULT register_class_object(BOOL do_reg)
243 HRESULT hres;
245 static DWORD cookie;
247 if(do_reg) {
248 hres = CoRegisterClassObject(&CLSID_InternetExplorer,
249 (IUnknown*)&InternetExplorerFactory, CLSCTX_SERVER,
250 REGCLS_MULTIPLEUSE|REGCLS_SUSPENDED, &cookie);
251 if (FAILED(hres)) {
252 ERR("failed to register object %08x\n", hres);
253 return hres;
256 hres = CoResumeClassObjects();
257 if(SUCCEEDED(hres))
258 return hres;
260 ERR("failed to resume object %08x\n", hres);
263 return CoRevokeClassObject(cookie);
266 /***********************************************************************
267 * DllCanUnloadNow (ieframe.@)
269 HRESULT WINAPI DllCanUnloadNow(void)
271 TRACE("()\n");
272 return module_ref ? S_FALSE : S_OK;
275 /***********************************************************************
276 * DllRegisterServer (ieframe.@)
278 HRESULT WINAPI DllRegisterServer(void)
280 FIXME("()\n");
281 return S_OK;
284 /***********************************************************************
285 * DllUnregisterServer (ieframe.@)
287 HRESULT WINAPI DllUnregisterServer(void)
289 FIXME("()\n");
290 return S_OK;