shdocvw: Move OpenURL() from shdocvw_main.c into intshcut.c, and implement it.
authorAndrew Bogott <andrew@CodeWeavers.com>
Thu, 4 Nov 2010 22:26:34 +0000 (17:26 -0500)
committerAlexandre Julliard <julliard@winehq.org>
Fri, 12 Nov 2010 10:58:51 +0000 (11:58 +0100)
dlls/shdocvw/intshcut.c
dlls/shdocvw/shdocvw_main.c

index 2f1cad81d80620e103abdbf9e21ab227ed29cc8b..202a523d1f32a216d9d02d078eb8f458397395bc 100644 (file)
@@ -27,6 +27,9 @@
  * The installer for the Zuma Deluxe Popcap game is good for testing.
  */
 
+#include <stdarg.h>
+#include <stdio.h>
+
 #include "wine/debug.h"
 #include "shdocvw.h"
 #include "objidl.h"
@@ -34,6 +37,7 @@
 #include "intshcut.h"
 #include "shellapi.h"
 #include "winreg.h"
+#include "shlwapi.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
 
@@ -565,6 +569,22 @@ static const IPersistFileVtbl persistFileVtbl = {
     PersistFile_GetCurFile
 };
 
+static InternetShortcut *create_shortcut(void)
+{
+    InternetShortcut *newshortcut;
+
+    newshortcut = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(InternetShortcut));
+    if (newshortcut)
+    {
+        newshortcut->uniformResourceLocatorA.lpVtbl = &uniformResourceLocatorAVtbl;
+        newshortcut->uniformResourceLocatorW.lpVtbl = &uniformResourceLocatorWVtbl;
+        newshortcut->persistFile.lpVtbl = &persistFileVtbl;
+        newshortcut->refCount = 0;
+    }
+
+    return newshortcut;
+}
+
 HRESULT InternetShortcut_Create(IUnknown *pOuter, REFIID riid, void **ppv)
 {
     InternetShortcut *This;
@@ -577,13 +597,9 @@ HRESULT InternetShortcut_Create(IUnknown *pOuter, REFIID riid, void **ppv)
     if(pOuter)
         return CLASS_E_NOAGGREGATION;
 
-    This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(InternetShortcut));
+    This = create_shortcut();
     if (This)
     {
-        This->uniformResourceLocatorA.lpVtbl = &uniformResourceLocatorAVtbl;
-        This->uniformResourceLocatorW.lpVtbl = &uniformResourceLocatorWVtbl;
-        This->persistFile.lpVtbl = &persistFileVtbl;
-        This->refCount = 0;
         hr = Unknown_QueryInterface(This, riid, ppv);
         if (SUCCEEDED(hr))
             SHDOCVW_LockModule();
@@ -594,3 +610,39 @@ HRESULT InternetShortcut_Create(IUnknown *pOuter, REFIID riid, void **ppv)
     else
         return E_OUTOFMEMORY;
 }
+
+
+/**********************************************************************
+ * OpenURL  (SHDOCVW.@)
+ */
+void WINAPI OpenURL(HWND hWnd, HINSTANCE hInst, LPCSTR lpcstrUrl, int nShowCmd)
+{
+    InternetShortcut *shortcut;
+    WCHAR* urlfilepath = NULL;
+    shortcut = create_shortcut();
+
+    if (shortcut)
+    {
+        int len;
+
+        len = MultiByteToWideChar(CP_ACP, 0, lpcstrUrl, -1, NULL, 0);
+        urlfilepath = heap_alloc(len * sizeof(WCHAR));
+        MultiByteToWideChar(CP_ACP, 0, lpcstrUrl, -1, urlfilepath, len);
+
+        if(SUCCEEDED(IPersistFile_Load(&shortcut->persistFile, urlfilepath, 0)))
+        {
+            URLINVOKECOMMANDINFOW ici;
+
+            memset( &ici, 0, sizeof ici );
+            ici.dwcbSize = sizeof ici;
+            ici.dwFlags = IURL_INVOKECOMMAND_FL_USE_DEFAULT_VERB;
+            ici.hwndParent = hWnd;
+
+            if FAILED(UniformResourceLocatorW_InvokeCommand(&shortcut->uniformResourceLocatorW, (PURLINVOKECOMMANDINFOW) &ici))
+                    TRACE("failed to open URL: %s\n.",debugstr_a(lpcstrUrl));
+        }
+
+        heap_free(shortcut);
+        heap_free(urlfilepath);
+    }
+}
index f0fa0f6c1d459b2f7303a118e62d4992e3a71298..a0070b489d4245c41226ac04b763e36ae3d95890 100644 (file)
@@ -218,14 +218,6 @@ DWORD WINAPI SetQueryNetSessionCount(DWORD arg)
     return 0;
 }
 
-/**********************************************************************
- * OpenURL  (SHDOCVW.@)
- */
-void WINAPI OpenURL(HWND hWnd, HINSTANCE hInst, LPCSTR lpcstrUrl, int nShowCmd)
-{
-    FIXME("%p %p %s %d\n", hWnd, hInst, debugstr_a(lpcstrUrl), nShowCmd);
-}
-
 /**********************************************************************
  * Some forwards (by ordinal) to SHLWAPI
  */