[SHDOCVW] Sync with Wine 3.0. CORE-14225
[reactos.git] / dll / win32 / shdocvw / shdocvw_main.c
index a0070b4..8a4c8c0 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#include "config.h"
+#include "shdocvw.h"
 
-#include <stdarg.h>
-#include <stdio.h>
+#include <shlwapi.h>
+#include <wininet.h>
 
-#include "wine/unicode.h"
-#include "wine/debug.h"
+LONG SHDOCVW_refCount = 0;
 
-#include "shdocvw.h"
+static HMODULE SHDOCVW_hshell32 = 0;
+static HINSTANCE ieframe_instance;
 
-#include "winreg.h"
-#include "shlwapi.h"
-#include "wininet.h"
+static HINSTANCE get_ieframe_instance(void)
+{
+    static const WCHAR ieframe_dllW[] = {'i','e','f','r','a','m','e','.','d','l','l',0};
 
-#include "initguid.h"
+    if(!ieframe_instance)
+        ieframe_instance = LoadLibraryW(ieframe_dllW);
 
-WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
+    return ieframe_instance;
+}
 
-LONG SHDOCVW_refCount = 0;
+static HRESULT get_ieframe_object(REFCLSID rclsid, REFIID riid, void **ppv)
+{
+    HINSTANCE ieframe_instance;
 
-HINSTANCE shdocvw_hinstance = 0;
-static HMODULE SHDOCVW_hshell32 = 0;
-static ITypeInfo *wb_typeinfo = NULL;
+    static HRESULT (WINAPI *ieframe_DllGetClassObject)(REFCLSID,REFIID,void**);
 
-HRESULT get_typeinfo(ITypeInfo **typeinfo)
-{
-    ITypeLib *typelib;
-    HRESULT hres;
+    if(!ieframe_DllGetClassObject) {
+        ieframe_instance = get_ieframe_instance();
+        if(!ieframe_instance)
+            return CLASS_E_CLASSNOTAVAILABLE;
 
-    if(wb_typeinfo) {
-        *typeinfo = wb_typeinfo;
-        return S_OK;
+        ieframe_DllGetClassObject = (void*)GetProcAddress(ieframe_instance, "DllGetClassObject");
+        if(!ieframe_DllGetClassObject)
+            return CLASS_E_CLASSNOTAVAILABLE;
     }
 
-    hres = LoadRegTypeLib(&LIBID_SHDocVw, 1, 1, LOCALE_SYSTEM_DEFAULT, &typelib);
-    if(FAILED(hres)) {
-        ERR("LoadRegTypeLib failed: %08x\n", hres);
-        return hres;
-    }
+    return ieframe_DllGetClassObject(rclsid, riid, ppv);
+}
 
-    hres = ITypeLib_GetTypeInfoOfGuid(typelib, &IID_IWebBrowser2, &wb_typeinfo);
-    ITypeLib_Release(typelib);
-
-    *typeinfo = wb_typeinfo;
-    return hres;
-}
-
-const char *debugstr_variant(const VARIANT *v)
-{
-    if(!v)
-        return "(null)";
-
-    switch(V_VT(v)) {
-    case VT_EMPTY:
-        return "{VT_EMPTY}";
-    case VT_NULL:
-        return "{VT_NULL}";
-    case VT_I4:
-        return wine_dbg_sprintf("{VT_I4: %d}", V_I4(v));
-    case VT_R8:
-        return wine_dbg_sprintf("{VT_R8: %lf}", V_R8(v));
-    case VT_BSTR:
-        return wine_dbg_sprintf("{VT_BSTR: %s}", debugstr_w(V_BSTR(v)));
-    case VT_DISPATCH:
-        return wine_dbg_sprintf("{VT_DISPATCH: %p}", V_DISPATCH(v));
-    case VT_BOOL:
-        return wine_dbg_sprintf("{VT_BOOL: %x}", V_BOOL(v));
-    default:
-        return wine_dbg_sprintf("{vt %d}", V_VT(v));
-    }
+/*************************************************************************
+ *              DllGetClassObject (SHDOCVW.@)
+ */
+HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
+{
+    TRACE("(%s %s %p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
+
+    if(IsEqualGUID(&CLSID_WebBrowser, rclsid)
+       || IsEqualGUID(&CLSID_WebBrowser_V1, rclsid)
+       || IsEqualGUID(&CLSID_InternetShortcut, rclsid)
+       || IsEqualGUID(&CLSID_CUrlHistory, rclsid)
+       || IsEqualGUID(&CLSID_TaskbarList, rclsid))
+        return get_ieframe_object(rclsid, riid, ppv);
+
+    /* As a last resort, figure if the CLSID belongs to a 'Shell Instance Object' */
+    return SHDOCVW_GetShellInstanceObjectClassObject(rclsid, riid, ppv);
+}
+
+/***********************************************************************
+ *          DllRegisterServer (shdocvw.@)
+ */
+HRESULT WINAPI DllRegisterServer(void)
+{
+    TRACE("\n");
+    return S_OK;
+}
+
+/***********************************************************************
+ *          DllUnregisterServer (shdocvw.@)
+ */
+HRESULT WINAPI DllUnregisterServer(void)
+{
+    TRACE("\n");
+    return S_OK;
+}
+
+/******************************************************************
+ *             IEWinMain            (SHDOCVW.101)
+ *
+ * Only returns on error.
+ */
+DWORD WINAPI IEWinMain(LPSTR szCommandLine, int nShowWindow)
+{
+    DWORD (WINAPI *pIEWinMain)(const WCHAR*,int);
+    WCHAR *cmdline;
+    DWORD ret, len;
+
+    TRACE("%s %d\n", debugstr_a(szCommandLine), nShowWindow);
+
+    pIEWinMain = (void*)GetProcAddress(get_ieframe_instance(), MAKEINTRESOURCEA(101));
+    if(!pIEWinMain)
+        ExitProcess(1);
+
+    len = MultiByteToWideChar(CP_ACP, 0, szCommandLine, -1, NULL, 0);
+    cmdline = heap_alloc(len*sizeof(WCHAR));
+    if(!cmdline)
+        ExitProcess(1);
+    MultiByteToWideChar(CP_ACP, 0, szCommandLine, -1, cmdline, len);
+
+    ret = pIEWinMain(cmdline, nShowWindow);
+
+    heap_free(cmdline);
+    return ret;
 }
 
 /*************************************************************************
@@ -100,15 +132,13 @@ BOOL WINAPI DllMain(HINSTANCE hinst, DWORD fdwReason, LPVOID fImpLoad)
     TRACE("%p 0x%x %p\n", hinst, fdwReason, fImpLoad);
     switch (fdwReason)
     {
-        case DLL_PROCESS_ATTACH:
-        shdocvw_hinstance = hinst;
-        register_iewindow_class();
+    case DLL_PROCESS_ATTACH:
+        DisableThreadLibraryCalls(hinst);
         break;
     case DLL_PROCESS_DETACH:
+        if (fImpLoad) break;
         if (SHDOCVW_hshell32) FreeLibrary(SHDOCVW_hshell32);
-        unregister_iewindow_class();
-        if(wb_typeinfo)
-            ITypeInfo_Release(wb_typeinfo);
+        if (ieframe_instance) FreeLibrary(ieframe_instance);
         break;
     }
     return TRUE;
@@ -209,6 +239,17 @@ DWORD WINAPI RunInstallUninstallStubs(void)
     return 0x0deadbee;
 }
 
+/***********************************************************************
+ *              @ (SHDOCVW.130)
+ *
+ * Called by Emerge Desktop (alternative Windows Shell).
+ */
+DWORD WINAPI RunInstallUninstallStubs2(int arg)
+{
+    FIXME("(%d), stub!\n", arg);
+    return 0x0deadbee;
+}
+
 /***********************************************************************
  *              SetQueryNetSessionCount (SHDOCVW.@)
  */
@@ -263,12 +304,12 @@ void WINAPI StopWatchFlushFORWARD(void)
 }
 
 /******************************************************************
- *             StopWatchWFORWARD            (SHDOCVW.@)
+ *             StopWatchAFORWARD            (SHDOCVW.@)
  */
-DWORD WINAPI StopWatchWFORWARD(DWORD dwClass, LPCWSTR lpszStr, DWORD dwUnknown,
+DWORD WINAPI StopWatchAFORWARD(DWORD dwClass, LPCSTR lpszStr, DWORD dwUnknown,
                                DWORD dwMode, DWORD dwTimeStamp)
 {
-    static DWORD (WINAPI *p)(DWORD, LPCWSTR, DWORD, DWORD, DWORD);
+    static DWORD (WINAPI *p)(DWORD, LPCSTR, DWORD, DWORD, DWORD);
 
     if (p || (p = fetch_shlwapi_ordinal(243)))
         return p(dwClass, lpszStr, dwUnknown, dwMode, dwTimeStamp);
@@ -276,12 +317,12 @@ DWORD WINAPI StopWatchWFORWARD(DWORD dwClass, LPCWSTR lpszStr, DWORD dwUnknown,
 }
 
 /******************************************************************
- *             StopWatchAFORWARD            (SHDOCVW.@)
+ *             StopWatchWFORWARD            (SHDOCVW.@)
  */
-DWORD WINAPI StopWatchAFORWARD(DWORD dwClass, LPCSTR lpszStr, DWORD dwUnknown,
+DWORD WINAPI StopWatchWFORWARD(DWORD dwClass, LPCWSTR lpszStr, DWORD dwUnknown,
                                DWORD dwMode, DWORD dwTimeStamp)
 {
-    static DWORD (WINAPI *p)(DWORD, LPCSTR, DWORD, DWORD, DWORD);
+    static DWORD (WINAPI *p)(DWORD, LPCWSTR, DWORD, DWORD, DWORD);
 
     if (p || (p = fetch_shlwapi_ordinal(244)))
         return p(dwClass, lpszStr, dwUnknown, dwMode, dwTimeStamp);
@@ -333,14 +374,8 @@ DWORD WINAPI ParseURLFromOutsideSourceW(LPCWSTR url, LPWSTR out, LPDWORD plen, L
     if (!PathIsURLW(ptr)) {
         len = sizeof(buffer_in) / sizeof(buffer_in[0]);
         buffer_in[0] = 0;
-        hr = UrlApplySchemeW(ptr, buffer_in, &len, URL_APPLY_GUESSSCHEME);
+        hr = UrlApplySchemeW(ptr, buffer_in, &len, URL_APPLY_GUESSSCHEME | URL_APPLY_DEFAULT);
         TRACE("got 0x%x with %s\n", hr, debugstr_w(buffer_in));
-        if (hr != S_OK) {
-            /* when we can't guess the scheme, use the default scheme */
-            len = sizeof(buffer_in) / sizeof(buffer_in[0]);
-            hr = UrlApplySchemeW(ptr, buffer_in, &len, URL_APPLY_DEFAULT);
-        }
-
         if (hr == S_OK) {
             /* we parsed the url to buffer_in */
             ptr = buffer_in;
@@ -394,7 +429,7 @@ DWORD WINAPI ParseURLFromOutsideSourceA(LPCSTR url, LPSTR out, LPDWORD plen, LPD
     }
 
     len = sizeof(buffer) / sizeof(buffer[0]);
-    res = ParseURLFromOutsideSourceW(urlW, buffer, &len, unknown);
+    ParseURLFromOutsideSourceW(urlW, buffer, &len, unknown);
     HeapFree(GetProcessHeap(), 0, urlW);
 
     needed = WideCharToMultiByte(CP_ACP, 0, buffer, -1, NULL, 0, NULL, NULL);
@@ -485,3 +520,29 @@ BOOL WINAPI ImportPrivacySettings(LPCWSTR filename, BOOL *pGlobalPrefs, BOOL * p
 
     return TRUE;
 }
+
+/******************************************************************
+ * ResetProfileSharing (SHDOCVW.164)
+ */
+HRESULT WINAPI ResetProfileSharing(HWND hwnd)
+{
+    FIXME("(%p) stub\n", hwnd);
+    return E_NOTIMPL;
+}
+
+/******************************************************************
+ * InstallReg_RunDLL (SHDOCVW.@)
+ */
+void WINAPI InstallReg_RunDLL(HWND hwnd, HINSTANCE handle, LPCSTR cmdline, INT show)
+{
+    FIXME("(%p %p %s %x)\n", hwnd, handle, debugstr_a(cmdline), show);
+}
+
+/******************************************************************
+ * DoFileDownload (SHDOCVW.@)
+ */
+BOOL WINAPI DoFileDownload(LPWSTR filename)
+{
+    FIXME("(%s) stub\n", debugstr_w(filename));
+    return FALSE;
+}