From 107ae8ee417b81c720b1fdbbede597e3f8ec2033 Mon Sep 17 00:00:00 2001 From: David Quintana Date: Wed, 26 Feb 2014 14:05:55 +0000 Subject: [PATCH] [RSHELL] * Add a new logging wrapper to record calls from the start menu back to the explorer site. CORE-7586 svn path=/branches/shell-experiments/; revision=62335 --- base/shell/rshell/CMakeLists.txt | 1 + base/shell/rshell/logging/CMenuBandWrap.cpp | 1 - .../shell/rshell/logging/CMenuDeskBarWrap.cpp | 19 +- base/shell/rshell/logging/CMenuSiteWrap.cpp | 1 - .../rshell/logging/CStartMenuSiteWrap.cpp | 190 ++++++++++++++++++ base/shell/rshell/precomp.h | 2 + base/shell/rshell/wraplog.cpp | 2 +- 7 files changed, 212 insertions(+), 4 deletions(-) create mode 100644 base/shell/rshell/logging/CStartMenuSiteWrap.cpp diff --git a/base/shell/rshell/CMakeLists.txt b/base/shell/rshell/CMakeLists.txt index 276a4c1c81e..ae88c160fd8 100644 --- a/base/shell/rshell/CMakeLists.txt +++ b/base/shell/rshell/CMakeLists.txt @@ -20,6 +20,7 @@ list(APPEND SOURCE logging/CMenuBandWrap.cpp logging/CMenuDeskBarWrap.cpp logging/CMenuSiteWrap.cpp + logging/CStartMenuSiteWrap.cpp ${CMAKE_CURRENT_BINARY_DIR}/rshell.def) add_library(rshell SHARED ${SOURCE}) diff --git a/base/shell/rshell/logging/CMenuBandWrap.cpp b/base/shell/rshell/logging/CMenuBandWrap.cpp index 2d2aadca58f..af651221fa2 100644 --- a/base/shell/rshell/logging/CMenuBandWrap.cpp +++ b/base/shell/rshell/logging/CMenuBandWrap.cpp @@ -23,7 +23,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(CMenuBandWrap); class CMenuBandWrap : - public CComCoClass, public CComObjectRootEx, public IDeskBand, public IObjectWithSite, diff --git a/base/shell/rshell/logging/CMenuDeskBarWrap.cpp b/base/shell/rshell/logging/CMenuDeskBarWrap.cpp index 9a4c7a8438b..ed293819dab 100644 --- a/base/shell/rshell/logging/CMenuDeskBarWrap.cpp +++ b/base/shell/rshell/logging/CMenuDeskBarWrap.cpp @@ -21,7 +21,6 @@ #include "wraplog.h" class CMenuDeskBarWrap : - public CComCoClass, public CComObjectRootEx, public IOleCommandTarget, public IServiceProvider, @@ -216,6 +215,24 @@ HRESULT STDMETHODCALLTYPE CMenuDeskBarWrap::ContextSensitiveHelp(BOOL fEnterMode HRESULT STDMETHODCALLTYPE CMenuDeskBarWrap::SetSite(IUnknown *pUnkSite) { WrapLogEnter("CMenuDeskBarWrap<%p>::SetSite(IUnknown *pUnkSite=%p)\n", this, pUnkSite); + +#if WRAP_TRAYPRIV + CComPtr inTp; + HRESULT hr2 = pUnkSite->QueryInterface(IID_PPV_ARG(ITrayPriv, &inTp)); + if (SUCCEEDED(hr2)) + { + ITrayPriv * outTp; + hr2 = CStartMenuSite_Wrapper(inTp, IID_PPV_ARG(ITrayPriv, &outTp)); + if (SUCCEEDED(hr2)) + { + pUnkSite = outTp; + } + else + { + outTp->Release(); + } + } +#endif HRESULT hr = m_IObjectWithSite->SetSite(pUnkSite); WrapLogExit("CMenuDeskBarWrap::SetSite()", hr); return hr; diff --git a/base/shell/rshell/logging/CMenuSiteWrap.cpp b/base/shell/rshell/logging/CMenuSiteWrap.cpp index 99dab9f172b..fc34b9bb4ef 100644 --- a/base/shell/rshell/logging/CMenuSiteWrap.cpp +++ b/base/shell/rshell/logging/CMenuSiteWrap.cpp @@ -24,7 +24,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(menusite); class CMenuSiteWrap : - public CComCoClass, public CComObjectRootEx, public IBandSite, public IDeskBarClient, diff --git a/base/shell/rshell/logging/CStartMenuSiteWrap.cpp b/base/shell/rshell/logging/CStartMenuSiteWrap.cpp new file mode 100644 index 00000000000..7efd82d1262 --- /dev/null +++ b/base/shell/rshell/logging/CStartMenuSiteWrap.cpp @@ -0,0 +1,190 @@ +/* + * Shell Menu Site + * + * Copyright 2014 David Quintana + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "precomp.h" +#include "wraplog.h" + +WINE_DEFAULT_DEBUG_CHANNEL(menusite); + +class CStartMenuSiteWrap : + public CComObjectRootEx, + public IServiceProvider, + public ITrayPriv, + public IOleWindow, + public IOleCommandTarget +{ +public: + CStartMenuSiteWrap() {} + ~CStartMenuSiteWrap(); + + HRESULT InitWrap(ITrayPriv * bandSite); + +private: + CComPtr m_IServiceProvider; + CComPtr m_ITrayPriv; + CComPtr m_IOleWindow; + CComPtr m_IOleCommandTarget; + +public: + // IServiceProvider + virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject); + + // ITrayPriv + virtual HRESULT STDMETHODCALLTYPE Execute(THIS_ IShellFolder*, LPCITEMIDLIST); + virtual HRESULT STDMETHODCALLTYPE Unknown(THIS_ PVOID, PVOID, PVOID, PVOID); + virtual HRESULT STDMETHODCALLTYPE AppendMenu(THIS_ HMENU*); + + // IOleWindow + virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *phwnd); + virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); + + // IOleCommandTarget + virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID * pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText); + virtual HRESULT STDMETHODCALLTYPE Exec(const GUID * pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); + + DECLARE_NOT_AGGREGATABLE(CStartMenuSiteWrap) + DECLARE_PROTECT_FINAL_CONSTRUCT() + BEGIN_COM_MAP(CStartMenuSiteWrap) + COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider) + COM_INTERFACE_ENTRY_IID(IID_ITrayPriv, ITrayPriv) + COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow) + COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget) + END_COM_MAP() +}; + +extern "C" +HRESULT CStartMenuSite_Wrapper(ITrayPriv * trayPriv, REFIID riid, LPVOID *ppv) +{ + HRESULT hr; + + *ppv = NULL; + + CStartMenuSiteWrap * site = new CComObject(); + + if (!site) + return E_OUTOFMEMORY; + + hr = site->InitWrap(trayPriv); + if (FAILED(hr)) + { + site->Release(); + return hr; + } + + hr = site->QueryInterface(riid, ppv); + + if (FAILED(hr)) + site->Release(); + + return hr; +} + +HRESULT CStartMenuSiteWrap::InitWrap(ITrayPriv * bandSite) +{ + HRESULT hr; + + WrapLogOpen(); + + m_ITrayPriv = bandSite; + + hr = bandSite->QueryInterface(IID_PPV_ARG(IServiceProvider, &m_IServiceProvider)); + if (FAILED(hr)) return hr; + hr = bandSite->QueryInterface(IID_PPV_ARG(IOleWindow, &m_IOleWindow)); + if (FAILED(hr)) return hr; + hr = bandSite->QueryInterface(IID_PPV_ARG(IOleCommandTarget, &m_IOleCommandTarget)); + return hr; +} + +CStartMenuSiteWrap::~CStartMenuSiteWrap() +{ + WrapLogClose(); +} + +// *** IServiceProvider methods *** +HRESULT STDMETHODCALLTYPE CStartMenuSiteWrap::QueryService(REFGUID guidService, REFIID riid, void **ppvObject) +{ + WrapLogEnter("CStartMenuSiteWrap<%p>::QueryService(REFGUID guidService=%s, REFIID riid=%s, void **ppvObject=%p)\n", this, Wrap(guidService), Wrap(riid), ppvObject); + HRESULT hr = m_IServiceProvider->QueryService(guidService, riid, ppvObject); + if (ppvObject) WrapLogPost("*ppvObject=%p\n", *ppvObject); + WrapLogExit("CStartMenuSiteWrap::QueryService()", hr); + return hr; +} + +// *** ITrayPriv methods *** +HRESULT STDMETHODCALLTYPE CStartMenuSiteWrap::Execute(IShellFolder* psf, LPCITEMIDLIST pidl) +{ + WrapLogEnter("CStartMenuSiteWrap<%p>::Execute(IShellFolder* psf=%p, LPCITEMIDLIST pidl=%p)\n", this, psf, pidl); + HRESULT hr = m_ITrayPriv->Execute(psf, pidl); + WrapLogExit("CStartMenuSiteWrap::Execute()", hr); + return hr; +} + +HRESULT STDMETHODCALLTYPE CStartMenuSiteWrap::Unknown(PVOID unk1, PVOID unk2, PVOID unk3, PVOID unk4) +{ + WrapLogEnter("CStartMenuSiteWrap<%p>::Unknown(PVOID unk1=%p, PVOID unk2=%p, PVOID unk3=%p, PVOID unk4=%p)\n", this, unk1, unk2, unk3, unk4); + HRESULT hr = m_ITrayPriv->Unknown(unk1, unk2, unk3, unk4); + WrapLogExit("CStartMenuSiteWrap::Unknown()", hr); + return hr; +} + +HRESULT STDMETHODCALLTYPE CStartMenuSiteWrap::AppendMenu(HMENU * phmenu) +{ + WrapLogEnter("CStartMenuSiteWrap<%p>::AppendMenu(HMENU * phmenu=%p)\n", this, phmenu); + HRESULT hr = m_ITrayPriv->AppendMenu(phmenu); + WrapLogExit("CStartMenuSiteWrap::AppendMenu()", hr); + return hr; +} + +// *** IOleWindow methods *** +HRESULT STDMETHODCALLTYPE CStartMenuSiteWrap::GetWindow(HWND *phwnd) +{ + WrapLogEnter("CStartMenuSiteWrap<%p>::GetWindow(HWND *phwnd=%p)\n", this, phwnd); + HRESULT hr = m_IOleWindow->GetWindow(phwnd); + if (phwnd) WrapLogPost("*phwnd=%p\n", *phwnd); + WrapLogExit("CStartMenuSiteWrap::GetWindow()", hr); + return hr; +} + +HRESULT STDMETHODCALLTYPE CStartMenuSiteWrap::ContextSensitiveHelp(BOOL fEnterMode) +{ + WrapLogEnter("CStartMenuSiteWrap<%p>::ContextSensitiveHelp(BOOL fEnterMode=%d)\n", this, fEnterMode); + HRESULT hr = m_IOleWindow->ContextSensitiveHelp(fEnterMode); + WrapLogExit("CStartMenuSiteWrap::ContextSensitiveHelp()", hr); + return hr; +} + +// *** IOleCommandTarget methods *** +HRESULT STDMETHODCALLTYPE CStartMenuSiteWrap::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText) +{ + WrapLogEnter("CStartMenuSiteWrap<%p>::QueryStatus(const GUID *pguidCmdGroup=%p, ULONG cCmds=%u, prgCmds=%p, pCmdText=%p)\n", this, pguidCmdGroup, cCmds, prgCmds, pCmdText); + HRESULT hr = m_IOleCommandTarget->QueryStatus(pguidCmdGroup, cCmds, prgCmds, pCmdText); + if (pguidCmdGroup) WrapLogPost("*pguidCmdGroup=%s\n", Wrap(*pguidCmdGroup)); + WrapLogExit("CStartMenuSiteWrap::QueryStatus()", hr); + return hr; +} + +HRESULT STDMETHODCALLTYPE CStartMenuSiteWrap::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) +{ + WrapLogEnter("CStartMenuSiteWrap<%p>::Exec(const GUID *pguidCmdGroup=%p, DWORD nCmdID=%d, DWORD nCmdexecopt=%d, VARIANT *pvaIn=%p, VARIANT *pvaOut=%p)\n", this, pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut); + if (pguidCmdGroup) WrapLogPre("*pguidCmdGroup=%s\n", Wrap(*pguidCmdGroup)); + HRESULT hr = m_IOleCommandTarget->Exec(pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut); + WrapLogExit("CStartMenuSiteWrap::Exec()", hr); + return hr; +} diff --git a/base/shell/rshell/precomp.h b/base/shell/rshell/precomp.h index d871f35c048..7836d0d1843 100644 --- a/base/shell/rshell/precomp.h +++ b/base/shell/rshell/precomp.h @@ -6,6 +6,7 @@ #define WRAP_MENUDESKBAR 0 #define WRAP_MENUSITE 0 #define WRAP_MENUBAND 0 +#define WRAP_TRAYPRIV 0 #define MERGE_FOLDERS 0 @@ -47,6 +48,7 @@ extern "C" HRESULT CMenuDeskBar_Wrapper(IDeskBar * db, REFIID riid, LPVOID *ppv) extern "C" HRESULT CMenuSite_Wrapper(IBandSite * bs, REFIID riid, LPVOID *ppv); extern "C" HRESULT CMenuBand_Wrapper(IShellMenu * sm, REFIID riid, LPVOID *ppv); extern "C" HRESULT CMergedFolder_Constructor(IShellFolder* userLocal, IShellFolder* allUsers, REFIID riid, LPVOID *ppv); +extern "C" HRESULT CStartMenuSite_Wrapper(ITrayPriv * trayPriv, REFIID riid, LPVOID *ppv); static __inline ULONG Win32DbgPrint(const char *filename, int line, const char *lpFormat, ...) diff --git a/base/shell/rshell/wraplog.cpp b/base/shell/rshell/wraplog.cpp index c2c8c780c17..20aebb6c1b0 100644 --- a/base/shell/rshell/wraplog.cpp +++ b/base/shell/rshell/wraplog.cpp @@ -13,7 +13,7 @@ void WrapLogOpen() { if (openCount == 0) { - log = fopen("\\RShellWrap.log", "w"); + log = fopen("G:\\RShellWrap.log", "w"); nTemps = 0; callLevel = 0; }