From: Thomas Faber Date: Fri, 8 Apr 2016 08:30:09 +0000 (+0000) Subject: [SHELL32] X-Git-Tag: ReactOS-0.4.1~108 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=78a727d095a6cedc195a54d9299ef5f685f33f31 [SHELL32] - Add stubs for the shell dispatch object, CShell, and its relatives. Patch by Mark Jansen. [SHELL32_WINETEST] - We no longer need to skip test_ParseName and test_Verbs thanks to Mark's work. CORE-6892 ROSTESTS-209 svn path=/trunk/; revision=71116 --- diff --git a/reactos/dll/win32/shell32/CFolder.cpp b/reactos/dll/win32/shell32/CFolder.cpp new file mode 100644 index 00000000000..1d86b307e78 --- /dev/null +++ b/reactos/dll/win32/shell32/CFolder.cpp @@ -0,0 +1,186 @@ +/* + * Folder implementation + * + * Copyright 2015 Mark Jansen + * + * 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" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + + +CFolder::CFolder() +{ +} + +CFolder::~CFolder() +{ +} + +void CFolder::Init(LPITEMIDLIST idlist) +{ + m_idlist.Attach(idlist); +} + +// *** IDispatch methods *** +HRESULT STDMETHODCALLTYPE CFolder::GetTypeInfoCount(UINT *pctinfo) +{ + TRACE("(%p, %p)\n", this, pctinfo); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolder::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) +{ + TRACE("(%p, %lu, %lu, %p)\n", this, iTInfo, lcid, ppTInfo); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolder::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) +{ + TRACE("(%p, %s, %p, %lu, %lu, %p)\n", this, wine_dbgstr_guid(&riid), rgszNames, cNames, lcid, rgDispId); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolder::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + TRACE("(%p, %lu, %s, %lu, %lu, %p, %p, %p, %p)\n", this, dispIdMember, wine_dbgstr_guid(&riid), lcid, (DWORD)wFlags, + pDispParams, pVarResult, pExcepInfo, puArgErr); + return E_NOTIMPL; +} + + +// *** Folder methods *** +HRESULT STDMETHODCALLTYPE CFolder::get_Title(BSTR *pbs) +{ + TRACE("(%p, %p)\n", this, pbs); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolder::get_Application(IDispatch **ppid) +{ + TRACE("(%p, %p)\n", this, ppid); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolder::get_Parent(IDispatch **ppid) +{ + TRACE("(%p %p)\n", this, ppid); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolder::get_ParentFolder(Folder **ppsf) +{ + TRACE("(%p, %p)\n", this); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolder::Items(FolderItems **ppid) +{ + TRACE("(%p, %p)\n", this, ppid); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolder::ParseName(BSTR bName, FolderItem **ppid) +{ + TRACE("(%p, %s, %p)\n", this, wine_dbgstr_w(bName), ppid); + + CComPtr psfDesktop; + + HRESULT hr = SHGetDesktopFolder(&psfDesktop); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + CComPtr psfCurrent; + hr = psfDesktop->BindToObject(m_idlist, NULL, IID_PPV_ARG(IShellFolder, &psfCurrent)); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + CComHeapPtr relativePidl; + hr = psfCurrent->ParseDisplayName(NULL, NULL, bName, NULL, &relativePidl, NULL); + if (!SUCCEEDED(hr)) + return S_FALSE; + + CFolderItem* item = new CComObject(); + item->AddRef(); + item->Init(ILCombine(m_idlist, relativePidl)); + *ppid = item; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CFolder::NewFolder(BSTR bName, VARIANT vOptions) +{ + TRACE("(%p, %s, %s)\n", this, wine_dbgstr_w(bName), wine_dbgstr_variant(&vOptions)); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolder::MoveHere(VARIANT vItem, VARIANT vOptions) +{ + TRACE("(%p, %s, %s)\n", this, wine_dbgstr_variant(&vItem), wine_dbgstr_variant(&vOptions)); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolder::CopyHere(VARIANT vItem, VARIANT vOptions) +{ + TRACE("(%p, %s, %s)\n", this, wine_dbgstr_variant(&vItem), wine_dbgstr_variant(&vOptions)); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolder::GetDetailsOf(VARIANT vItem, int iColumn, BSTR *pbs) +{ + TRACE("(%p, %s, %i, %p)\n", this, wine_dbgstr_variant(&vItem), iColumn, pbs); + return E_NOTIMPL; +} + + +// *** Folder2 methods *** +HRESULT STDMETHODCALLTYPE CFolder::get_Self(FolderItem **ppfi) +{ + TRACE("(%p, %p)\n", this, ppfi); + if (!ppfi) + return E_POINTER; + CFolderItem* item = new CComObject(); + item->AddRef(); + item->Init(ILClone(m_idlist)); + *ppfi = item; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CFolder::get_OfflineStatus(LONG *pul) +{ + TRACE("(%p, %p)\n", this, pul); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolder::Synchronize() +{ + TRACE("(%p)\n", this); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolder::get_HaveToShowWebViewBarricade(VARIANT_BOOL *pbHaveToShowWebViewBarricade) +{ + TRACE("(%p, %p)\n", this, pbHaveToShowWebViewBarricade); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolder::DismissedWebViewBarricade() +{ + TRACE("(%p)\n", this); + return E_NOTIMPL; +} + + diff --git a/reactos/dll/win32/shell32/CFolder.h b/reactos/dll/win32/shell32/CFolder.h new file mode 100644 index 00000000000..b510461903d --- /dev/null +++ b/reactos/dll/win32/shell32/CFolder.h @@ -0,0 +1,77 @@ +/* + * Folder implementation + * + * Copyright 2015 Mark Jansen + * + * 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 + */ + +#ifndef _FOLDER_H_ +#define _FOLDER_H_ + + +class CFolder: + public CComCoClass, + public CComObjectRootEx, + public Folder2 +{ +private: + CComHeapPtr m_idlist; + +public: + CFolder(); + ~CFolder(); + + void Init(LPITEMIDLIST idlist); + + // *** IDispatch methods *** + virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo); + virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo); + virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId); + virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr); + + + // *** Folder methods *** + virtual HRESULT STDMETHODCALLTYPE get_Title(BSTR *pbs); + virtual HRESULT STDMETHODCALLTYPE get_Application(IDispatch **ppid); + virtual HRESULT STDMETHODCALLTYPE get_Parent(IDispatch **ppid); + virtual HRESULT STDMETHODCALLTYPE get_ParentFolder(Folder **ppsf); + virtual HRESULT STDMETHODCALLTYPE Items(FolderItems **ppid); + virtual HRESULT STDMETHODCALLTYPE ParseName(BSTR bName, FolderItem **ppid); + virtual HRESULT STDMETHODCALLTYPE NewFolder(BSTR bName, VARIANT vOptions); + virtual HRESULT STDMETHODCALLTYPE MoveHere(VARIANT vItem, VARIANT vOptions); + virtual HRESULT STDMETHODCALLTYPE CopyHere(VARIANT vItem, VARIANT vOptions); + virtual HRESULT STDMETHODCALLTYPE GetDetailsOf(VARIANT vItem, int iColumn, BSTR *pbs); + + // *** Folder2 methods *** + virtual HRESULT STDMETHODCALLTYPE get_Self(FolderItem **ppfi); + virtual HRESULT STDMETHODCALLTYPE get_OfflineStatus(LONG *pul); + virtual HRESULT STDMETHODCALLTYPE Synchronize(); + virtual HRESULT STDMETHODCALLTYPE get_HaveToShowWebViewBarricade(VARIANT_BOOL *pbHaveToShowWebViewBarricade); + virtual HRESULT STDMETHODCALLTYPE DismissedWebViewBarricade(); + +DECLARE_NOT_AGGREGATABLE(CFolder) +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CFolder) + COM_INTERFACE_ENTRY_IID(IID_Folder2, Folder2) + COM_INTERFACE_ENTRY_IID(IID_Folder, Folder) + COM_INTERFACE_ENTRY_IID(IID_IDispatch, IDispatch) +END_COM_MAP() + +}; + + +#endif diff --git a/reactos/dll/win32/shell32/CFolderItemVerbs.cpp b/reactos/dll/win32/shell32/CFolderItemVerbs.cpp new file mode 100644 index 00000000000..896e4de8e43 --- /dev/null +++ b/reactos/dll/win32/shell32/CFolderItemVerbs.cpp @@ -0,0 +1,181 @@ +/* + * FolderItemVerb(s) implementation + * + * Copyright 2015 Mark Jansen + * + * 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" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + + +CFolderItemVerb::CFolderItemVerb() +{ +} + +CFolderItemVerb::~CFolderItemVerb() +{ +} + +//void CFolderItemVerb::Init(LPITEMIDLIST idlist) +//{ +// m_idlist.Attach(idlist); +//} + +// *** IDispatch methods *** +HRESULT STDMETHODCALLTYPE CFolderItemVerb::GetTypeInfoCount(UINT *pctinfo) +{ + TRACE("(%p, %p)\n", this, pctinfo); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItemVerb::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) +{ + TRACE("(%p, %lu, %lu, %p)\n", this, iTInfo, lcid, ppTInfo); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItemVerb::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) +{ + TRACE("(%p, %s, %p, %lu, %lu, %p)\n", this, wine_dbgstr_guid(&riid), rgszNames, cNames, lcid, rgDispId); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItemVerb::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + TRACE("(%p, %lu, %s, %lu, %lu, %p, %p, %p, %p)\n", this, dispIdMember, wine_dbgstr_guid(&riid), lcid, (DWORD)wFlags, + pDispParams, pVarResult, pExcepInfo, puArgErr); + return E_NOTIMPL; +} + +// *** FolderItemVerb methods *** + +HRESULT STDMETHODCALLTYPE CFolderItemVerb::get_Application(IDispatch **ppid) +{ + TRACE("(%p, %p)\n", this, ppid); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItemVerb::get_Parent(IDispatch **ppid) +{ + TRACE("(%p, %p)\n", this, ppid); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItemVerb::get_Name(BSTR *pbs) +{ + TRACE("(%p, %p)\n", this, pbs); + if (!pbs) + return E_POINTER; + // Terminating item: + *pbs = SysAllocString(L""); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItemVerb::DoIt() +{ + TRACE("(%p, %p)\n", this); + return E_NOTIMPL; +} + + + + + + +CFolderItemVerbs::CFolderItemVerbs() +{ +} + +CFolderItemVerbs::~CFolderItemVerbs() +{ +} + +//void CFolderItemVerbs::Init(LPITEMIDLIST idlist) +//{ +// m_idlist.Attach(idlist); +//} + +// *** IDispatch methods *** +HRESULT STDMETHODCALLTYPE CFolderItemVerbs::GetTypeInfoCount(UINT *pctinfo) +{ + TRACE("(%p, %p)\n", this, pctinfo); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItemVerbs::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) +{ + TRACE("(%p, %lu, %lu, %p)\n", this, iTInfo, lcid, ppTInfo); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItemVerbs::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) +{ + TRACE("(%p, %s, %p, %lu, %lu, %p)\n", this, wine_dbgstr_guid(&riid), rgszNames, cNames, lcid, rgDispId); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItemVerbs::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + TRACE("(%p, %lu, %s, %lu, %lu, %p, %p, %p, %p)\n", this, dispIdMember, wine_dbgstr_guid(&riid), lcid, (DWORD)wFlags, + pDispParams, pVarResult, pExcepInfo, puArgErr); + return E_NOTIMPL; +} + +// *** FolderItemVerbs methods *** +HRESULT STDMETHODCALLTYPE CFolderItemVerbs::get_Count(LONG *plCount) +{ + TRACE("(%p, %p)\n", this, plCount); + if (!plCount) + return E_POINTER; + *plCount = 0; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItemVerbs::get_Application(IDispatch **ppid) +{ + TRACE("(%p, %p)\n", this, ppid); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItemVerbs::get_Parent(IDispatch **ppid) +{ + TRACE("(%p, %p)\n", this, ppid); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItemVerbs::Item(VARIANT index, FolderItemVerb **ppid) +{ + TRACE("(%p, %s, %p)\n", this, wine_dbgstr_variant(&index), ppid); + if (!ppid) + return E_POINTER; + + /* FIXME! */ + CFolderItemVerb* verb = new CComObject(); + verb->AddRef(); + *ppid = verb; + + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItemVerbs::_NewEnum(IUnknown **ppunk) +{ + TRACE("(%p, %p)\n", this, ppunk); + return E_NOTIMPL; +} + + diff --git a/reactos/dll/win32/shell32/CFolderItemVerbs.h b/reactos/dll/win32/shell32/CFolderItemVerbs.h new file mode 100644 index 00000000000..f398ea75e2b --- /dev/null +++ b/reactos/dll/win32/shell32/CFolderItemVerbs.h @@ -0,0 +1,97 @@ +/* + * FolderItemVerb(s) implementation + * + * Copyright 2015 Mark Jansen + * + * 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 + */ + +#ifndef _FOLDERITEMVERBS_H_ +#define _FOLDERITEMVERBS_H_ + +class CFolderItemVerb: + public CComCoClass, + public CComObjectRootEx, + public FolderItemVerb +{ +private: + +public: + CFolderItemVerb(); + ~CFolderItemVerb(); + + //void Init(LPITEMIDLIST idlist); + + + // *** IDispatch methods *** + virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo); + virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo); + virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId); + virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr); + + // *** FolderItemVerb methods *** + virtual HRESULT STDMETHODCALLTYPE get_Application(IDispatch **ppid); + virtual HRESULT STDMETHODCALLTYPE get_Parent(IDispatch **ppid); + virtual HRESULT STDMETHODCALLTYPE get_Name(BSTR *pbs); + virtual HRESULT STDMETHODCALLTYPE DoIt(); + + +DECLARE_NOT_AGGREGATABLE(CFolderItemVerb) +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CFolderItemVerb) + COM_INTERFACE_ENTRY_IID(IID_FolderItemVerb, FolderItemVerb) + COM_INTERFACE_ENTRY_IID(IID_IDispatch, IDispatch) +END_COM_MAP() +}; + + +class CFolderItemVerbs: + public CComCoClass, + public CComObjectRootEx, + public FolderItemVerbs +{ +private: + +public: + CFolderItemVerbs(); + ~CFolderItemVerbs(); + + //void Init(LPITEMIDLIST idlist); + + + // *** IDispatch methods *** + virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo); + virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo); + virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId); + virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr); + + // *** FolderItemVerbs methods *** + virtual HRESULT STDMETHODCALLTYPE get_Count(LONG *plCount); + virtual HRESULT STDMETHODCALLTYPE get_Application(IDispatch **ppid); + virtual HRESULT STDMETHODCALLTYPE get_Parent(IDispatch **ppid); + virtual HRESULT STDMETHODCALLTYPE Item(VARIANT index, FolderItemVerb **ppid); + virtual HRESULT STDMETHODCALLTYPE _NewEnum(IUnknown **ppunk); + +DECLARE_NOT_AGGREGATABLE(CFolderItemVerbs) +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CFolderItemVerbs) + COM_INTERFACE_ENTRY_IID(IID_FolderItemVerbs, FolderItemVerbs) + COM_INTERFACE_ENTRY_IID(IID_IDispatch, IDispatch) +END_COM_MAP() +}; + +#endif diff --git a/reactos/dll/win32/shell32/CFolderItems.cpp b/reactos/dll/win32/shell32/CFolderItems.cpp new file mode 100644 index 00000000000..5c5e298a25a --- /dev/null +++ b/reactos/dll/win32/shell32/CFolderItems.cpp @@ -0,0 +1,250 @@ +/* + * FolderItem(s) implementation + * + * Copyright 2015 Mark Jansen + * + * 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" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + + +CFolderItem::CFolderItem() +{ +} + +CFolderItem::~CFolderItem() +{ +} + +void CFolderItem::Init(LPITEMIDLIST idlist) +{ + m_idlist.Attach(idlist); +} + +// *** IDispatch methods *** +HRESULT STDMETHODCALLTYPE CFolderItem::GetTypeInfoCount(UINT *pctinfo) +{ + TRACE("(%p, %p)\n", this, pctinfo); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItem::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) +{ + TRACE("(%p, %lu, %lu, %p)\n", this, iTInfo, lcid, ppTInfo); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItem::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) +{ + TRACE("(%p, %s, %p, %lu, %lu, %p)\n", this, wine_dbgstr_guid(&riid), rgszNames, cNames, lcid, rgDispId); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItem::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + TRACE("(%p, %lu, %s, %lu, %lu, %p, %p, %p, %p)\n", this, dispIdMember, wine_dbgstr_guid(&riid), lcid, (DWORD)wFlags, + pDispParams, pVarResult, pExcepInfo, puArgErr); + return E_NOTIMPL; +} + +// *** FolderItem methods *** +HRESULT STDMETHODCALLTYPE CFolderItem::get_Application(IDispatch **ppid) +{ + TRACE("(%p, %p)\n", this, ppid); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItem::get_Parent(IDispatch **ppid) +{ + TRACE("(%p, %p)\n", this, ppid); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItem::get_Name(BSTR *pbs) +{ + TRACE("(%p, %p)\n", this, pbs); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItem::put_Name(BSTR bs) +{ + TRACE("(%p, %s)\n", this, wine_dbgstr_w(bs)); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItem::get_Path(BSTR *pbs) +{ + CComPtr psfDesktop; + + HRESULT hr = SHGetDesktopFolder(&psfDesktop); + if (!SUCCEEDED(hr)) + return hr; + + STRRET strret; + hr = psfDesktop->GetDisplayNameOf(m_idlist, SHGDN_FORPARSING, &strret); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + return StrRetToBSTR(&strret, NULL, pbs); +} + +HRESULT STDMETHODCALLTYPE CFolderItem::get_GetLink(IDispatch **ppid) +{ + TRACE("(%p, %p)\n", this, ppid); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItem::get_GetFolder(IDispatch **ppid) +{ + TRACE("(%p, %p)\n", this, ppid); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItem::get_IsLink(VARIANT_BOOL *pb) +{ + TRACE("(%p, %p)\n", this, pb); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItem::get_IsFolder(VARIANT_BOOL *pb) +{ + TRACE("(%p, %p)\n", this, pb); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItem::get_IsFileSystem(VARIANT_BOOL *pb) +{ + TRACE("(%p, %p)\n", this, pb); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItem::get_IsBrowsable(VARIANT_BOOL *pb) +{ + TRACE("(%p, %p)\n", this, pb); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItem::get_ModifyDate(DATE *pdt) +{ + TRACE("(%p, %p)\n", this, pdt); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItem::put_ModifyDate(DATE dt) +{ + TRACE("(%p, %f)\n", this, dt); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItem::get_Size(LONG *pul) +{ + TRACE("(%p, %p)\n", this, pul); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItem::get_Type(BSTR *pbs) +{ + TRACE("(%p, %p)\n", this, pbs); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItem::Verbs(FolderItemVerbs **ppfic) +{ + if(!ppfic) + return E_POINTER; + CFolderItemVerbs* verbs = new CComObject(); + verbs->AddRef(); + *ppfic = verbs; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CFolderItem::InvokeVerb(VARIANT vVerb) +{ + TRACE("(%p, %s)\n", this, wine_dbgstr_variant(&vVerb)); + return E_NOTIMPL; +} + + + + + +CFolderItems::CFolderItems() +{ +} + +CFolderItems::~CFolderItems() +{ +} + +// *** IDispatch methods *** +HRESULT STDMETHODCALLTYPE CFolderItems::GetTypeInfoCount(UINT *pctinfo) +{ + TRACE("(%p, %p)\n", this, pctinfo); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItems::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) +{ + TRACE("(%p, %lu, %lu, %p)\n", this, iTInfo, lcid, ppTInfo); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItems::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) +{ + TRACE("(%p, %s, %p, %lu, %lu, %p)\n", this, wine_dbgstr_guid(&riid), rgszNames, cNames, lcid, rgDispId); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItems::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + TRACE("(%p, %lu, %s, %lu, %lu, %p, %p, %p, %p)\n", this, dispIdMember, wine_dbgstr_guid(&riid), lcid, (DWORD)wFlags, + pDispParams, pVarResult, pExcepInfo, puArgErr); + return E_NOTIMPL; +} + +// *** FolderItems methods *** +HRESULT STDMETHODCALLTYPE CFolderItems::get_Count(long *plCount) +{ + TRACE("(%p, %p)\n", this, plCount); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItems::get_Application(IDispatch **ppid) +{ + TRACE("(%p, %p)\n", this, ppid); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItems::get_Parent(IDispatch **ppid) +{ + TRACE("(%p, %p)\n", this, ppid); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItems::Item(VARIANT index, FolderItem **ppid) +{ + TRACE("(%p, %s, %p)\n", this, wine_dbgstr_variant(&index), ppid); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CFolderItems::_NewEnum(IUnknown **ppunk) +{ + TRACE("(%p, %p)\n", this, ppunk); + return E_NOTIMPL; +} + diff --git a/reactos/dll/win32/shell32/CFolderItems.h b/reactos/dll/win32/shell32/CFolderItems.h new file mode 100644 index 00000000000..6364f601397 --- /dev/null +++ b/reactos/dll/win32/shell32/CFolderItems.h @@ -0,0 +1,108 @@ +/* + * FolderItem(s) implementation + * + * Copyright 2015 Mark Jansen + * + * 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 + */ + +#ifndef _FOLDERITEM_H_ +#define _FOLDERITEM_H_ + + +class CFolderItem: + public CComCoClass, + public CComObjectRootEx, + public FolderItem +{ +private: + CComHeapPtr m_idlist; + +public: + CFolderItem(); + ~CFolderItem(); + + void Init(LPITEMIDLIST idlist); + + + // *** IDispatch methods *** + virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo); + virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo); + virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId); + virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr); + + // *** FolderItem methods *** + virtual HRESULT STDMETHODCALLTYPE get_Application(IDispatch **ppid); + virtual HRESULT STDMETHODCALLTYPE get_Parent(IDispatch **ppid); + virtual HRESULT STDMETHODCALLTYPE get_Name(BSTR *pbs); + virtual HRESULT STDMETHODCALLTYPE put_Name(BSTR bs); + virtual HRESULT STDMETHODCALLTYPE get_Path(BSTR *pbs); + virtual HRESULT STDMETHODCALLTYPE get_GetLink(IDispatch **ppid); + virtual HRESULT STDMETHODCALLTYPE get_GetFolder(IDispatch **ppid); + virtual HRESULT STDMETHODCALLTYPE get_IsLink(VARIANT_BOOL *pb); + virtual HRESULT STDMETHODCALLTYPE get_IsFolder(VARIANT_BOOL *pb); + virtual HRESULT STDMETHODCALLTYPE get_IsFileSystem(VARIANT_BOOL *pb); + virtual HRESULT STDMETHODCALLTYPE get_IsBrowsable(VARIANT_BOOL *pb); + virtual HRESULT STDMETHODCALLTYPE get_ModifyDate(DATE *pdt); + virtual HRESULT STDMETHODCALLTYPE put_ModifyDate(DATE dt); + virtual HRESULT STDMETHODCALLTYPE get_Size(LONG *pul); + virtual HRESULT STDMETHODCALLTYPE get_Type(BSTR *pbs); + virtual HRESULT STDMETHODCALLTYPE Verbs(FolderItemVerbs **ppfic); + virtual HRESULT STDMETHODCALLTYPE InvokeVerb(VARIANT vVerb); + + +DECLARE_NOT_AGGREGATABLE(CFolderItem) +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CFolderItem) + COM_INTERFACE_ENTRY_IID(IID_FolderItem, FolderItem) + COM_INTERFACE_ENTRY_IID(IID_IDispatch, IDispatch) +END_COM_MAP() +}; + +class CFolderItems: + public CComCoClass, + public CComObjectRootEx, + public FolderItems +{ +private: + +public: + CFolderItems(); + ~CFolderItems(); + + // *** IDispatch methods *** + virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo); + virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo); + virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId); + virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr); + + // *** FolderItems methods *** + virtual HRESULT STDMETHODCALLTYPE get_Count(long *plCount); + virtual HRESULT STDMETHODCALLTYPE get_Application(IDispatch **ppid); + virtual HRESULT STDMETHODCALLTYPE get_Parent(IDispatch **ppid); + virtual HRESULT STDMETHODCALLTYPE Item(VARIANT index, FolderItem **ppid); + virtual HRESULT STDMETHODCALLTYPE _NewEnum(IUnknown **ppunk); + +DECLARE_NOT_AGGREGATABLE(CFolderItems) +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CFolderItems) + COM_INTERFACE_ENTRY_IID(IID_FolderItems, FolderItems) + COM_INTERFACE_ENTRY_IID(IID_IDispatch, IDispatch) +END_COM_MAP() +}; + +#endif diff --git a/reactos/dll/win32/shell32/CMakeLists.txt b/reactos/dll/win32/shell32/CMakeLists.txt index aca6d60136b..b17e98a5e1b 100644 --- a/reactos/dll/win32/shell32/CMakeLists.txt +++ b/reactos/dll/win32/shell32/CMakeLists.txt @@ -58,6 +58,10 @@ list(APPEND SOURCE CDefaultContextMenu.cpp COpenWithMenu.cpp CNewMenu.cpp + CShell.cpp + CFolder.cpp + CFolderItems.cpp + CFolderItemVerbs.cpp precomp.h) add_library(shell32 SHARED @@ -83,7 +87,7 @@ add_library(shell32 SHARED set_module_type(shell32 win32dll UNICODE) target_link_libraries(shell32 shellmenu shelldesktop atlnew wine uuid recyclebin) -add_delay_importlibs(shell32 uxtheme ole32 userenv version fmifs shdocvw comctl32 browseui shlwapi comdlg32) +add_delay_importlibs(shell32 uxtheme ole32 oleaut32 userenv version fmifs shdocvw comctl32 browseui shlwapi comdlg32) add_importlibs(shell32 advapi32 gdi32 user32 powrprof devmgr winspool winmm mpr msvcrt kernel32 ntdll) add_pch(shell32 precomp.h SOURCE) add_cd_file(TARGET shell32 DESTINATION reactos/system32 FOR all) diff --git a/reactos/dll/win32/shell32/CShell.cpp b/reactos/dll/win32/shell32/CShell.cpp new file mode 100644 index 00000000000..f9e3b1c5634 --- /dev/null +++ b/reactos/dll/win32/shell32/CShell.cpp @@ -0,0 +1,344 @@ +/* + * IShellDispatch implementation + * + * Copyright 2015 Mark Jansen + * + * 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" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + + +CShell::CShell() +{ +} + +CShell::~CShell() +{ +} + + +// *** IDispatch methods *** +HRESULT STDMETHODCALLTYPE CShell::GetTypeInfoCount(UINT *pctinfo) +{ + TRACE("(%p, %p)\n", this, pctinfo); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) +{ + TRACE("(%p, %lu, %lu, %p)\n", this, iTInfo, lcid, ppTInfo); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) +{ + TRACE("(%p, %s, %p, %lu, %lu, %p)\n", this, wine_dbgstr_guid(&riid), rgszNames, cNames, lcid, rgDispId); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + TRACE("(%p, %lu, %s, %lu, %lu, %p, %p, %p, %p)\n", this, dispIdMember, wine_dbgstr_guid(&riid), lcid, (DWORD)wFlags, + pDispParams, pVarResult, pExcepInfo, puArgErr); + return E_NOTIMPL; +} + + +// *** IShellDispatch methods *** +HRESULT STDMETHODCALLTYPE CShell::get_Application(IDispatch **ppid) +{ + TRACE("(%p, %p)\n", this, ppid); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::get_Parent(IDispatch **ppid) +{ + TRACE("(%p, %p)\n", this, ppid); + return E_NOTIMPL; +} + +HRESULT VariantToIdlist(VARIANT* var, LPITEMIDLIST* idlist) +{ + HRESULT hr = S_FALSE; + if(V_VT(var) == VT_I4) + { + hr = SHGetSpecialFolderLocation(NULL, V_I4(var), idlist); + } + else if(V_VT(var) == VT_BSTR) + { + hr = SHILCreateFromPathW(V_BSTR(var), idlist, NULL); + } + return hr; +} + +HRESULT STDMETHODCALLTYPE CShell::NameSpace(VARIANT vDir, Folder **ppsdf) +{ + TRACE("(%p, %s, %p)\n", this, debugstr_variant(&vDir), ppsdf); + if (!ppsdf) + return E_POINTER; + *ppsdf = NULL; + LPITEMIDLIST idlist = NULL; + HRESULT hr = VariantToIdlist(&vDir, &idlist); + if (!SUCCEEDED(hr) || !idlist) + return S_FALSE; + CFolder* fld = new CComObject(); + fld->Init(idlist); + *ppsdf = fld; + fld->AddRef(); + return hr; +} + +HRESULT STDMETHODCALLTYPE CShell::BrowseForFolder(LONG Hwnd, BSTR Title, LONG Options, VARIANT RootFolder, Folder **ppsdf) +{ + TRACE("(%p, %lu, %ls, %lu, %s, %p)\n", this, Hwnd, Title, Options, debugstr_variant(&RootFolder), ppsdf); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::Windows(IDispatch **ppid) +{ + TRACE("(%p, %p)\n", this, ppid); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::Open(VARIANT vDir) +{ + TRACE("(%p, %s)\n", this, debugstr_variant(&vDir)); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::Explore(VARIANT vDir) +{ + TRACE("(%p, %s)\n", this, debugstr_variant(&vDir)); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::MinimizeAll() +{ + TRACE("(%p)\n", this); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::UndoMinimizeALL() +{ + TRACE("(%p)\n", this); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::FileRun() +{ + TRACE("(%p)\n", this); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::CascadeWindows() +{ + TRACE("(%p)\n", this); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::TileVertically() +{ + TRACE("(%p)\n", this); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::TileHorizontally() +{ + TRACE("(%p)\n", this); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::ShutdownWindows() +{ + TRACE("(%p)\n", this); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::Suspend() +{ + TRACE("(%p)\n", this); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::EjectPC() +{ + TRACE("(%p)\n", this); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::SetTime() +{ + TRACE("(%p)\n", this); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::TrayProperties() +{ + TRACE("(%p)\n", this); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::Help() +{ + TRACE("(%p)\n", this); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::FindFiles() +{ + TRACE("(%p)\n", this); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::FindComputer() +{ + TRACE("(%p)\n", this); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::RefreshMenu() +{ + TRACE("(%p)\n", this); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::ControlPanelItem(BSTR szDir) +{ + TRACE("(%p, %ls)\n", this, szDir); + return E_NOTIMPL; +} + + +// *** IShellDispatch2 methods *** +HRESULT STDMETHODCALLTYPE CShell::IsRestricted(BSTR group, BSTR restriction, LONG *value) +{ + TRACE("(%p, %ls, %ls, %p)\n", this, group, restriction, value); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::ShellExecute(BSTR file, VARIANT args, VARIANT dir, VARIANT op, VARIANT show) +{ + TRACE("(%p, %ls, %s, %s, %s, %s)\n", this, file, debugstr_variant(&args), debugstr_variant(&dir), debugstr_variant(&op), debugstr_variant(&show)); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::FindPrinter(BSTR name, BSTR location, BSTR model) +{ + TRACE("(%p, %ls, %ls, %ls)\n", this, name, location, model); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::GetSystemInformation(BSTR name, VARIANT *ret) +{ + TRACE("(%p, %ls, %p)\n", this, name, ret); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::ServiceStart(BSTR service, VARIANT persistent, VARIANT *ret) +{ + TRACE("(%p, %ls, %s, %p)\n", this, service, wine_dbgstr_variant(&persistent), ret); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::ServiceStop(BSTR service, VARIANT persistent, VARIANT *ret) +{ + TRACE("(%p, %ls, %s, %p)\n", this, service, wine_dbgstr_variant(&persistent), ret); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::IsServiceRunning(BSTR service, VARIANT *running) +{ + TRACE("(%p, %ls, %p)\n", this, service, running); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::CanStartStopService(BSTR service, VARIANT *ret) +{ + TRACE("(%p, %ls, %p)\n", this, service, ret); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::ShowBrowserBar(BSTR clsid, VARIANT show, VARIANT *ret) +{ + TRACE("(%p, %ls, %s, %p)\n", this, clsid, wine_dbgstr_variant(&show), ret); + return E_NOTIMPL; +} + + +// *** IShellDispatch3 methods *** +HRESULT STDMETHODCALLTYPE CShell::AddToRecent(VARIANT file, BSTR category) +{ + TRACE("(%p, %s, %ls)\n", this, wine_dbgstr_variant(&file), category); + return E_NOTIMPL; +} + + +// *** IShellDispatch4 methods *** +HRESULT STDMETHODCALLTYPE CShell::WindowsSecurity() +{ + TRACE("(%p)\n", this); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::ToggleDesktop() +{ + TRACE("(%p)\n", this); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::ExplorerPolicy(BSTR policy, VARIANT *value) +{ + TRACE("(%p, %ls, %p)\n", this, policy, value); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::GetSetting(LONG setting, VARIANT_BOOL *result) +{ + TRACE("(%p, %lu, %p)\n", this, setting, result); + return E_NOTIMPL; +} + + +// *** IObjectSafety methods *** +HRESULT STDMETHODCALLTYPE CShell::GetInterfaceSafetyOptions(REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions) +{ + TRACE("(%p, %s, %p, %p)\n", this, wine_dbgstr_guid(&riid), pdwSupportedOptions, pdwEnabledOptions); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::SetInterfaceSafetyOptions(REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions) +{ + TRACE("(%p, %s, %lu, %lu)\n", this, wine_dbgstr_guid(&riid), dwOptionSetMask, dwEnabledOptions); + return E_NOTIMPL; +} + + +// *** IObjectWithSite methods *** +HRESULT STDMETHODCALLTYPE CShell::SetSite(IUnknown *pUnkSite) +{ + TRACE("(%p, %p)\n", this, pUnkSite); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShell::GetSite(REFIID riid, PVOID *ppvSite) +{ + TRACE("(%p, %s, %p)\n", this, wine_dbgstr_guid(&riid), ppvSite); + return E_NOTIMPL; +} + + diff --git a/reactos/dll/win32/shell32/CShell.h b/reactos/dll/win32/shell32/CShell.h new file mode 100644 index 00000000000..97e7ad646ae --- /dev/null +++ b/reactos/dll/win32/shell32/CShell.h @@ -0,0 +1,115 @@ +/* + * IShellDispatch implementation + * + * Copyright 2015 Mark Jansen + * + * 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 + */ + +#ifndef _SHELL_H_ +#define _SHELL_H_ + +#undef ShellExecute + +class CShell: + public CComCoClass, + public CComObjectRootEx, + public IShellDispatch4, + public IObjectSafety, + public IObjectWithSite +{ +private: + +public: + CShell(); + ~CShell(); + + // *** IDispatch methods *** + virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo); + virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo); + virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId); + virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr); + + // *** IShellDispatch methods *** + virtual HRESULT STDMETHODCALLTYPE get_Application(IDispatch **ppid); + virtual HRESULT STDMETHODCALLTYPE get_Parent(IDispatch **ppid); + virtual HRESULT STDMETHODCALLTYPE NameSpace(VARIANT vDir, Folder **ppsdf); + virtual HRESULT STDMETHODCALLTYPE BrowseForFolder(LONG Hwnd, BSTR Title, LONG Options, VARIANT RootFolder, Folder **ppsdf); + virtual HRESULT STDMETHODCALLTYPE Windows(IDispatch **ppid); + virtual HRESULT STDMETHODCALLTYPE Open(VARIANT vDir); + virtual HRESULT STDMETHODCALLTYPE Explore(VARIANT vDir); + virtual HRESULT STDMETHODCALLTYPE MinimizeAll(); + virtual HRESULT STDMETHODCALLTYPE UndoMinimizeALL(); + virtual HRESULT STDMETHODCALLTYPE FileRun(); + virtual HRESULT STDMETHODCALLTYPE CascadeWindows(); + virtual HRESULT STDMETHODCALLTYPE TileVertically(); + virtual HRESULT STDMETHODCALLTYPE TileHorizontally(); + virtual HRESULT STDMETHODCALLTYPE ShutdownWindows(); + virtual HRESULT STDMETHODCALLTYPE Suspend(); + virtual HRESULT STDMETHODCALLTYPE EjectPC(); + virtual HRESULT STDMETHODCALLTYPE SetTime(); + virtual HRESULT STDMETHODCALLTYPE TrayProperties(); + virtual HRESULT STDMETHODCALLTYPE Help(); + virtual HRESULT STDMETHODCALLTYPE FindFiles(); + virtual HRESULT STDMETHODCALLTYPE FindComputer(); + virtual HRESULT STDMETHODCALLTYPE RefreshMenu(); + virtual HRESULT STDMETHODCALLTYPE ControlPanelItem(BSTR szDir); + + // *** IShellDispatch2 methods *** + virtual HRESULT STDMETHODCALLTYPE IsRestricted(BSTR group, BSTR restriction, LONG *value); + virtual HRESULT STDMETHODCALLTYPE ShellExecute(BSTR file, VARIANT args, VARIANT dir, VARIANT op, VARIANT show); + virtual HRESULT STDMETHODCALLTYPE FindPrinter(BSTR name, BSTR location, BSTR model); + virtual HRESULT STDMETHODCALLTYPE GetSystemInformation(BSTR name, VARIANT *ret); + virtual HRESULT STDMETHODCALLTYPE ServiceStart(BSTR service, VARIANT persistent, VARIANT *ret); + virtual HRESULT STDMETHODCALLTYPE ServiceStop(BSTR service, VARIANT persistent, VARIANT *ret); + virtual HRESULT STDMETHODCALLTYPE IsServiceRunning(BSTR service, VARIANT *running); + virtual HRESULT STDMETHODCALLTYPE CanStartStopService(BSTR service, VARIANT *ret); + virtual HRESULT STDMETHODCALLTYPE ShowBrowserBar(BSTR clsid, VARIANT show, VARIANT *ret); + + // *** IShellDispatch3 methods *** + virtual HRESULT STDMETHODCALLTYPE AddToRecent(VARIANT file, BSTR category); + + // *** IShellDispatch4 methods *** + virtual HRESULT STDMETHODCALLTYPE WindowsSecurity(); + virtual HRESULT STDMETHODCALLTYPE ToggleDesktop(); + virtual HRESULT STDMETHODCALLTYPE ExplorerPolicy(BSTR policy, VARIANT *value); + virtual HRESULT STDMETHODCALLTYPE GetSetting(LONG setting, VARIANT_BOOL *result); + + // *** IObjectSafety methods *** + virtual HRESULT STDMETHODCALLTYPE GetInterfaceSafetyOptions(REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions); + virtual HRESULT STDMETHODCALLTYPE SetInterfaceSafetyOptions(REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions); + + // *** IObjectWithSite methods *** + virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite); + virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, PVOID *ppvSite); + + +DECLARE_REGISTRY_RESOURCEID(IDR_SHELL) +DECLARE_NOT_AGGREGATABLE(CShell) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CShell) + COM_INTERFACE_ENTRY_IID(IID_IShellDispatch4, IShellDispatch4) + COM_INTERFACE_ENTRY_IID(IID_IShellDispatch3, IShellDispatch3) + COM_INTERFACE_ENTRY_IID(IID_IShellDispatch2, IShellDispatch2) + COM_INTERFACE_ENTRY_IID(IID_IShellDispatch, IShellDispatch) + COM_INTERFACE_ENTRY_IID(IID_IDispatch, IDispatch) + COM_INTERFACE_ENTRY_IID(IID_IObjectSafety, IObjectSafety) + COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite) +END_COM_MAP() +}; + +#endif /* _SHELL_H_ */ diff --git a/reactos/dll/win32/shell32/precomp.h b/reactos/dll/win32/shell32/precomp.h index d24f83adf86..89c223c8474 100644 --- a/reactos/dll/win32/shell32/precomp.h +++ b/reactos/dll/win32/shell32/precomp.h @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -49,6 +50,10 @@ #include "shfldr.h" #include "CShellItem.h" #include "CShellLink.h" +#include "CFolderItemVerbs.h" +#include "CFolderItems.h" +#include "CFolder.h" +#include "CShell.h" #include "CDropTargetHelper.h" #include "folders/CFSFolder.h" #include "folders/CDrivesFolder.h" diff --git a/reactos/dll/win32/shell32/res/rgs/shell.rgs b/reactos/dll/win32/shell32/res/rgs/shell.rgs new file mode 100644 index 00000000000..6ee359c1d1c --- /dev/null +++ b/reactos/dll/win32/shell32/res/rgs/shell.rgs @@ -0,0 +1,13 @@ +HKCR +{ + NoRemove CLSID + { + ForceRemove {13709620-C279-11CE-A49E-444553540000} = s 'Shell Automation Service' + { + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + } + } +} diff --git a/reactos/dll/win32/shell32/rgs_res.rc b/reactos/dll/win32/shell32/rgs_res.rc index 275ff591030..118eb51e016 100644 --- a/reactos/dll/win32/shell32/rgs_res.rc +++ b/reactos/dll/win32/shell32/rgs_res.rc @@ -26,3 +26,4 @@ IDR_DRVDEFEXT REGISTRY "res/rgs/shelldrvdefext.rgs" IDR_EXEDROPHANDLER REGISTRY "res/rgs/exedrophandler.rgs" IDR_MERGEDFOLDER REGISTRY "res/rgs/mergedfolder.rgs" IDR_REBARBANDSITE REGISTRY "res/rgs/rebarbandsite.rgs" +IDR_SHELL REGISTRY "res/rgs/shell.rgs" diff --git a/reactos/dll/win32/shell32/shell32.cpp b/reactos/dll/win32/shell32/shell32.cpp index 2038cbd856f..ff802f92fe6 100644 --- a/reactos/dll/win32/shell32/shell32.cpp +++ b/reactos/dll/win32/shell32/shell32.cpp @@ -196,6 +196,7 @@ BEGIN_OBJECT_MAP(ObjectMap) OBJECT_ENTRY(CLSID_ShellDesktop, CDesktopFolder) OBJECT_ENTRY(CLSID_ShellItem, CShellItem) OBJECT_ENTRY(CLSID_ShellLink, CShellLink) + OBJECT_ENTRY(CLSID_Shell, CShell) OBJECT_ENTRY(CLSID_DragDropHelper, CDropTargetHelper) OBJECT_ENTRY(CLSID_ControlPanel, CControlPanelFolder) OBJECT_ENTRY(CLSID_MyDocuments, CMyDocsFolder) diff --git a/reactos/dll/win32/shell32/shresdef.h b/reactos/dll/win32/shell32/shresdef.h index c9fc51ac010..12c44cd4db1 100644 --- a/reactos/dll/win32/shell32/shresdef.h +++ b/reactos/dll/win32/shell32/shresdef.h @@ -649,3 +649,4 @@ #define IDR_QUERYASSOCIATIONS 152 #define IDR_MERGEDFOLDER 153 #define IDR_REBARBANDSITE 154 +#define IDR_SHELL 155 diff --git a/rostests/winetests/shell32/shelldispatch.c b/rostests/winetests/shell32/shelldispatch.c index d7834f3c299..8897e527953 100644 --- a/rostests/winetests/shell32/shelldispatch.c +++ b/rostests/winetests/shell32/shelldispatch.c @@ -880,16 +880,19 @@ START_TEST(shelldispatch) init_function_pointers(); test_namespace(); test_service(); - +#ifdef __REACTOS__ if (!winetest_interactive) - skip("ROSTESTS-209: Skipping test_ShellFolderViewDual(), test_ShellWindows(), test_ParseName() and test_Verbs().\n"); + skip("ROSTESTS-209: Skipping test_ShellFolderViewDual() and test_ShellWindows().\n"); else { - test_ShellFolderViewDual(); - test_ShellWindows(); - test_ParseName(); - test_Verbs(); +#endif + test_ShellFolderViewDual(); + test_ShellWindows(); +#ifdef __REACTOS__ } +#endif + test_ParseName(); + test_Verbs(); test_ShellExecute();