[SHDOCVW]
authorChristoph von Wittich <christoph_vw@reactos.org>
Tue, 2 Mar 2010 19:38:02 +0000 (19:38 +0000)
committerChristoph von Wittich <christoph_vw@reactos.org>
Tue, 2 Mar 2010 19:38:02 +0000 (19:38 +0000)
sync shdocvw to wine 1.1.39

svn path=/trunk/; revision=45764

reactos/dll/win32/shdocvw/dochost.c
reactos/dll/win32/shdocvw/intshcut.c
reactos/dll/win32/shdocvw/oleobject.c
reactos/dll/win32/shdocvw/shdocvw.h
reactos/dll/win32/shdocvw/shdocvw.inf
reactos/dll/win32/shdocvw/shdocvw_main.c
reactos/dll/win32/shdocvw/webbrowser.c

index f3035e1..e8982e4 100644 (file)
@@ -362,6 +362,29 @@ void deactivate_document(DocHost *This)
     This->document = NULL;
 }
 
+void release_dochost_client(DocHost *This)
+{
+    if(This->hwnd) {
+        DestroyWindow(This->hwnd);
+        This->hwnd = NULL;
+    }
+
+    if(This->hostui) {
+        IDocHostUIHandler_Release(This->hostui);
+        This->hostui = NULL;
+    }
+
+    if(This->client_disp) {
+        IDispatch_Release(This->client_disp);
+        This->client_disp = NULL;
+    }
+
+    if(This->frame) {
+        IOleInPlaceFrame_Release(This->frame);
+        This->frame = NULL;
+    }
+}
+
 #define OLECMD_THIS(iface) DEFINE_THIS(DocHost, OleCommandTarget, iface)
 
 static HRESULT WINAPI ClOleCommandTarget_QueryInterface(IOleCommandTarget *iface,
@@ -387,8 +410,13 @@ static HRESULT WINAPI ClOleCommandTarget_QueryStatus(IOleCommandTarget *iface,
         const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
 {
     DocHost *This = OLECMD_THIS(iface);
+    ULONG i= 0;
     FIXME("(%p)->(%s %u %p %p)\n", This, debugstr_guid(pguidCmdGroup), cCmds, prgCmds,
           pCmdText);
+    while (prgCmds && (cCmds > i)) {
+        FIXME("command_%u: %u, 0x%x\n", i, prgCmds[i].cmdID, prgCmds[i].cmdf);
+        i++;
+    }
     return E_NOTIMPL;
 }
 
@@ -744,14 +772,10 @@ void DocHost_Init(DocHost *This, IDispatch *disp)
 
 void DocHost_Release(DocHost *This)
 {
-    if(This->client_disp)
-        IDispatch_Release(This->client_disp);
-    if(This->frame)
-        IOleInPlaceFrame_Release(This->frame);
-
+    release_dochost_client(This);
     DocHost_ClientSite_Release(This);
 
     ConnectionPointContainer_Destroy(&This->cps);
 
-    SysFreeString(This->url);
+    CoTaskMemFree(This->url);
 }
index 86bc543..b389ec3 100644 (file)
@@ -65,32 +65,35 @@ static inline InternetShortcut* impl_from_IPersistFile(IPersistFile *iface)
     return (InternetShortcut*)((char*)iface - FIELD_OFFSET(InternetShortcut, persistFile));
 }
 
-static BOOL StartLinkProcessor(LPCOLESTR szLink)
+static BOOL run_winemenubuilder( const WCHAR *args )
 {
-    static const WCHAR szFormat[] = {
-        'w','i','n','e','m','e','n','u','b','u','i','l','d','e','r','.','e','x','e',
-        ' ','-','w',' ','-','u',' ','"','%','s','"',0 };
+    static const WCHAR menubuilder[] = {'\\','w','i','n','e','m','e','n','u','b','u','i','l','d','e','r','.','e','x','e',0};
     LONG len;
     LPWSTR buffer;
     STARTUPINFOW si;
     PROCESS_INFORMATION pi;
     BOOL ret;
+    WCHAR app[MAX_PATH];
 
-    len = sizeof(szFormat) + lstrlenW( szLink ) * sizeof(WCHAR);
+    GetSystemDirectoryW( app, MAX_PATH - sizeof(menubuilder)/sizeof(WCHAR) );
+    strcatW( app, menubuilder );
+
+    len = (strlenW( app ) + strlenW( args ) + 1) * sizeof(WCHAR);
     buffer = heap_alloc( len );
     if( !buffer )
         return FALSE;
 
-    wsprintfW( buffer, szFormat, szLink );
+    strcpyW( buffer, app );
+    strcatW( buffer, args );
 
     TRACE("starting %s\n",debugstr_w(buffer));
 
     memset(&si, 0, sizeof(si));
     si.cb = sizeof(si);
 
-    ret = CreateProcessW( NULL, buffer, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi );
+    ret = CreateProcessW( app, buffer, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi );
 
-    HeapFree( GetProcessHeap(), 0, buffer );
+    heap_free( buffer );
 
     if (ret)
     {
@@ -101,6 +104,24 @@ static BOOL StartLinkProcessor(LPCOLESTR szLink)
     return ret;
 }
 
+static BOOL StartLinkProcessor( LPCOLESTR szLink )
+{
+    static const WCHAR szFormat[] = { ' ','-','w',' ','-','u',' ','"','%','s','"',0 };
+    LONG len;
+    LPWSTR buffer;
+    BOOL ret;
+
+    len = sizeof(szFormat) + lstrlenW( szLink ) * sizeof(WCHAR);
+    buffer = heap_alloc( len );
+    if( !buffer )
+        return FALSE;
+
+    wsprintfW( buffer, szFormat, szLink );
+    ret = run_winemenubuilder( buffer );
+    heap_free( buffer );
+    return ret;
+}
+
 /* interface functions */
 
 static HRESULT Unknown_QueryInterface(InternetShortcut *This, REFIID riid, PVOID *ppvObject)
index 3657a7a..f67edb7 100644 (file)
@@ -255,6 +255,36 @@ static HRESULT on_silent_change(WebBrowser *This)
     return S_OK;
 }
 
+static void release_client_site(WebBrowser *This)
+{
+    release_dochost_client(&This->doc_host);
+
+    if(This->shell_embedding_hwnd) {
+        DestroyWindow(This->shell_embedding_hwnd);
+        This->shell_embedding_hwnd = NULL;
+    }
+
+    if(This->inplace) {
+        IOleInPlaceSite_Release(This->inplace);
+        This->inplace = NULL;
+    }
+
+    if(This->container) {
+        IOleContainer_Release(This->container);
+        This->container = NULL;
+    }
+
+    if(This->uiwindow) {
+        IOleInPlaceUIWindow_Release(This->uiwindow);
+        This->uiwindow = NULL;
+    }
+
+    if(This->client) {
+        IOleClientSite_Release(This->client);
+        This->client = NULL;
+    }
+}
+
 /**********************************************************************
  * Implement the IOleObject interface for the WebBrowser control
  */
@@ -282,7 +312,9 @@ static ULONG WINAPI OleObject_Release(IOleObject *iface)
 static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, LPOLECLIENTSITE pClientSite)
 {
     WebBrowser *This = OLEOBJ_THIS(iface);
+    IDocHostUIHandler *hostui;
     IOleContainer *container;
+    IDispatch *disp;
     HRESULT hres;
 
     TRACE("(%p)->(%p)\n", This, pClientSite);
@@ -290,29 +322,7 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, LPOLECLIENTSITE
     if(This->client == pClientSite)
         return S_OK;
 
-    if(This->doc_host.hwnd) {
-        DestroyWindow(This->doc_host.hwnd);
-        This->doc_host.hwnd = NULL;
-    }
-    if(This->shell_embedding_hwnd) {
-        DestroyWindow(This->shell_embedding_hwnd);
-        This->shell_embedding_hwnd = NULL;
-    }
-
-    if(This->inplace) {
-        IOleInPlaceSite_Release(This->inplace);
-        This->inplace = NULL;
-    }
-
-    if(This->doc_host.hostui) {
-        IDocHostUIHandler_Release(This->doc_host.hostui);
-        This->doc_host.hostui = NULL;
-    }
-
-    if(This->client)
-        IOleClientSite_Release(This->client);
-
-    This->client = pClientSite;
+    release_client_site(This);
 
     if(!pClientSite) {
         if(This->doc_host.document)
@@ -321,12 +331,17 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, LPOLECLIENTSITE
     }
 
     IOleClientSite_AddRef(pClientSite);
+    This->client = pClientSite;
 
-    IOleClientSite_QueryInterface(This->client, &IID_IDispatch,
-                                  (void**)&This->doc_host.client_disp);
+    hres = IOleClientSite_QueryInterface(This->client, &IID_IDispatch,
+            (void**)&disp);
+    if(SUCCEEDED(hres))
+        This->doc_host.client_disp = disp;
 
-    IOleClientSite_QueryInterface(This->client, &IID_IDocHostUIHandler,
-                                  (void**)&This->doc_host.hostui);
+    hres = IOleClientSite_QueryInterface(This->client, &IID_IDocHostUIHandler,
+            (void**)&hostui);
+    if(SUCCEEDED(hres))
+        This->doc_host.hostui = hostui;
 
     hres = IOleClientSite_GetContainer(This->client, &container);
     if(SUCCEEDED(hres)) {
@@ -963,10 +978,5 @@ void WebBrowser_OleObject_Init(WebBrowser *This)
 
 void WebBrowser_OleObject_Destroy(WebBrowser *This)
 {
-    if(This->client)
-        IOleObject_SetClientSite(OLEOBJ(This), NULL);
-    if(This->container)
-        IOleContainer_Release(This->container);
-    if(This->uiwindow)
-        IOleInPlaceUIWindow_Release(This->uiwindow);
+    release_client_site(This);
 }
index 9a51121..c5b9c9a 100644 (file)
@@ -205,6 +205,7 @@ void WebBrowser_OleObject_Destroy(WebBrowser*);
 void DocHost_Init(DocHost*,IDispatch*);
 void DocHost_ClientSite_Init(DocHost*);
 void DocHost_Frame_Init(DocHost*);
+void release_dochost_client(DocHost*);
 
 void DocHost_Release(DocHost*);
 void DocHost_ClientSite_Release(DocHost*);
@@ -252,6 +253,8 @@ HRESULT register_class_object(BOOL);
 HRESULT get_typeinfo(ITypeInfo**);
 DWORD register_iexplore(BOOL);
 
+const char *debugstr_variant(const VARIANT*);
+
 /* memory allocation functions */
 
 static inline void *heap_alloc(size_t len)
index 92e7884..932c9be 100644 (file)
@@ -34,10 +34,10 @@ HKCR,"CLSID\%CLSID_SearchAssistantOC%\InProcServer32",,,"%MODULE%"
 HKCR,"CLSID\%CLSID_SearchAssistantOC%\InProcServer32","ThreadingModel",,"Apartment"
 HKCR,"CLSID\%CLSID_SearchAssistantOC%\ProgID",,,"SearchAssistantOC.SearchAssistantOC.1"
 HKCR,"CLSID\%CLSID_SearchAssistantOC%\VersionIndependentProgID",,,"SearchAssistantOC.SearchAssistantOC"
-HKCR,"SearchAssistantOC.SearchAssistantOC",,,""
+HKCR,"SearchAssistantOC.SearchAssistantOC",,,"SearchAssistantOC"
 HKCR,"SearchAssistantOC.SearchAssistantOC\CLSID",,,"%CLSID_SearchAssistantOC%"
 HKCR,"SearchAssistantOC.SearchAssistantOC\CurVer",,,"SearchAssistantOC.SearchAssistantOC.1"
-HKCR,"SearchAssistantOC.SearchAssistantOC.1",,,""
+HKCR,"SearchAssistantOC.SearchAssistantOC.1",,,"SearchAssistantOC"
 HKCR,"SearchAssistantOC.SearchAssistantOC.1\CLSID",,,"%CLSID_SearchAssistantOC%"
 
 HKCR,"CLSID\%CLSID_ShellNameSpace%",,,"Shell Name Space"
@@ -67,7 +67,7 @@ HKCR,"CLSID\%CLSID_ShellUIHelper%\ProgID",,,"Shell.UIHelper.1"
 HKCR,"Shell.UIHelper",,,"Microsoft Shell UI Helper"
 HKCR,"Shell.UIHelper\CLSID",,,"%CLSID_ShellUIHelper%"
 HKCR,"Shell.UIHelper\CurVer",,,"Shell.UIHelper.2"
-HKCR,"Shell.UIHelper.1",,,""
+HKCR,"Shell.UIHelper.1",,,"Microsoft Shell UI Helper"
 HKCR,"Shell.UIHelper.1\CLSID",,,"%CLSID_ShellUIHelper%"
 
 HKCR,"CLSID\%CLSID_Internet%\DefaultIcon",,,"shdoclc.dll,-190"
@@ -86,7 +86,7 @@ HKCR,"CLSID\%CLSID_WebBrowser%\VersionIndependentProgID",,,"Shell.Explorer"
 HKCR,"Shell.Explorer",,,"Microsoft Web Browser"
 HKCR,"Shell.Explorer\CLSID",,,"%CLSID_WebBrowser%"
 HKCR,"Shell.Explorer\CurVer",,,"Shell.Explorer.2"
-HKCR,"Shell.Explorer.2",,,""
+HKCR,"Shell.Explorer.2",,,"Microsoft Web Browser"
 HKCR,"Shell.Explorer.2\CLSID",,,"%CLSID_WebBrowser%"
 
 HKCR,"CLSID\%CLSID_ShellWindows%",,,"ShellWindows"
@@ -108,14 +108,14 @@ HKCR,"CLSID\%CLSID_WebBrowser_V1%\InProcServer32",,,"%MODULE%"
 HKCR,"CLSID\%CLSID_WebBrowser_V1%\InProcServer32","ThreadingModel",,"Apartment"
 HKCR,"CLSID\%CLSID_WebBrowser_V1%\ProgID",,,"Shell.Explorer.1"
 HKCR,"CLSID\%CLSID_WebBrowser_V1%\VersionIndependentProgID",,,"Shell.Explorer"
-HKCR,"Shell.Explorer.1",,,""
+HKCR,"Shell.Explorer.1",,,"Microsoft Web Browser"
 HKCR,"Shell.Explorer.1\CLSID",,,"%CLSID_WebBrowser_V1%"
 
 HKCR,"CLSID\%CLSID_InternetShortcut%",,,"Internet Shortcut"
 HKCR,"CLSID\%CLSID_InternetShortcut%\InProcServer32",,,"%MODULE%"
 HKCR,"CLSID\%CLSID_InternetShortcut%\InProcServer32","ThreadingModel",,"Apartment"
 HKCR,"CLSID\%CLSID_InternetShortcut%\ProgID",,,"InternetShortcut"
-HKCR,"CLSID\%CLSID_InternetShortcut%\shellex\MayChangeDefaultMenu",,,
+HKCR,"CLSID\%CLSID_InternetShortcut%\shellex\MayChangeDefaultMenu",,16
 HKCR,"InternetShortcut",,,"Internet Shortcut"
 HKCR,"InternetShortcut","EditFlags",2,"2"
 HKCR,"InternetShortcut","IsShortcut",,
index 9090b7d..746753f 100644 (file)
@@ -67,6 +67,31 @@ HRESULT get_typeinfo(ITypeInfo **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));
+    }
+}
+
 /*************************************************************************
  * SHDOCVW DllMain
  */
index 323e9ad..b0633b0 100644 (file)
@@ -269,8 +269,9 @@ static HRESULT WINAPI WebBrowser_Navigate(IWebBrowser2 *iface, BSTR szUrl,
 {
     WebBrowser *This = WEBBROWSER_THIS(iface);
 
-    TRACE("(%p)->(%s %p %p %p %p)\n", This, debugstr_w(szUrl), Flags, TargetFrameName,
-          PostData, Headers);
+    TRACE("(%p)->(%s %s %s %s %s)\n", This, debugstr_w(szUrl), debugstr_variant(Flags),
+          debugstr_variant(TargetFrameName), debugstr_variant(PostData),
+          debugstr_variant(Headers));
 
     return navigate_url(&This->doc_host, szUrl, Flags, TargetFrameName, PostData, Headers);
 }
@@ -285,7 +286,7 @@ static HRESULT WINAPI WebBrowser_Refresh(IWebBrowser2 *iface)
 static HRESULT WINAPI WebBrowser_Refresh2(IWebBrowser2 *iface, VARIANT *Level)
 {
     WebBrowser *This = WEBBROWSER_THIS(iface);
-    FIXME("(%p)->(%p)\n", This, Level);
+    FIXME("(%p)->(%s)\n", This, debugstr_variant(Level));
     return E_NOTIMPL;
 }
 
@@ -516,22 +517,28 @@ static HRESULT WINAPI WebBrowser_ClientToWindow(IWebBrowser2 *iface, int *pcx, i
 static HRESULT WINAPI WebBrowser_PutProperty(IWebBrowser2 *iface, BSTR szProperty, VARIANT vtValue)
 {
     WebBrowser *This = WEBBROWSER_THIS(iface);
-    FIXME("(%p)->(%s)\n", This, debugstr_w(szProperty));
+    FIXME("(%p)->(%s %s)\n", This, debugstr_w(szProperty), debugstr_variant(&vtValue));
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI WebBrowser_GetProperty(IWebBrowser2 *iface, BSTR szProperty, VARIANT *pvtValue)
 {
     WebBrowser *This = WEBBROWSER_THIS(iface);
-    FIXME("(%p)->(%s %p)\n", This, debugstr_w(szProperty), pvtValue);
+    FIXME("(%p)->(%s %s)\n", This, debugstr_w(szProperty), debugstr_variant(pvtValue));
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI WebBrowser_get_Name(IWebBrowser2 *iface, BSTR *Name)
 {
+    static const WCHAR sName[] = {'M','i','c','r','o','s','o','f','t',' ','W','e','b',
+                                  ' ','B','r','o','w','s','e','r',' ','C','o','n','t','r','o','l',0};
     WebBrowser *This = WEBBROWSER_THIS(iface);
-    FIXME("(%p)->(%p)\n", This, Name);
-    return E_NOTIMPL;
+
+    TRACE("(%p)->(%p)\n", This, Name);
+
+    *Name = SysAllocString(sName);
+
+    return S_OK;
 }
 
 static HRESULT WINAPI WebBrowser_get_HWND(IWebBrowser2 *iface, LONG *pHWND)
@@ -726,7 +733,8 @@ static HRESULT WINAPI WebBrowser_Navigate2(IWebBrowser2 *iface, VARIANT *URL, VA
     WebBrowser *This = WEBBROWSER_THIS(iface);
     LPCWSTR url;
 
-    TRACE("(%p)->(%p %p %p %p %p)\n", This, URL, Flags, TargetFrameName, PostData, Headers);
+    TRACE("(%p)->(%s %s %s %s %s)\n", This, debugstr_variant(URL), debugstr_variant(Flags),
+          debugstr_variant(TargetFrameName), debugstr_variant(PostData), debugstr_variant(Headers));
 
     if(!This->client)
         return E_FAIL;
@@ -761,7 +769,7 @@ static HRESULT WINAPI WebBrowser_ExecWB(IWebBrowser2 *iface, OLECMDID cmdID,
         OLECMDEXECOPT cmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
 {
     WebBrowser *This = WEBBROWSER_THIS(iface);
-    FIXME("(%p)->(%d %d %p %p)\n", This, cmdID, cmdexecopt, pvaIn, pvaOut);
+    FIXME("(%p)->(%d %d %s %p)\n", This, cmdID, cmdexecopt, debugstr_variant(pvaIn), pvaOut);
     return E_NOTIMPL;
 }
 
@@ -769,7 +777,8 @@ static HRESULT WINAPI WebBrowser_ShowBrowserBar(IWebBrowser2 *iface, VARIANT *pv
         VARIANT *pvarShow, VARIANT *pvarSize)
 {
     WebBrowser *This = WEBBROWSER_THIS(iface);
-    FIXME("(%p)->(%p %p %p)\n", This, pvaClsid, pvarShow, pvarSize);
+    FIXME("(%p)->(%s %s %s)\n", This, debugstr_variant(pvaClsid), debugstr_variant(pvarShow),
+          debugstr_variant(pvarSize));
     return E_NOTIMPL;
 }