2 * PROJECT: ReactOS Zip Shell Extension
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: IExplorerCommand implementation
5 * COPYRIGHT: Copyright 2017 Mark Jansen (mark.jansen@reactos.org)
10 class CExplorerCommand
:
11 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
12 public IExplorerCommand
15 CComPtr
<IContextMenu
> m_pZipObject
;
19 STDMETHODIMP
Initialize(IContextMenu
* zipObject
)
21 m_pZipObject
= zipObject
;
25 // *** IExplorerCommand methods ***
26 STDMETHODIMP
GetTitle(IShellItemArray
*psiItemArray
, LPWSTR
*ppszName
)
28 CStringW
Title(MAKEINTRESOURCEW(IDS_MENUITEM
));
29 return SHStrDup(Title
, ppszName
);
31 STDMETHODIMP
GetIcon(IShellItemArray
*psiItemArray
, LPWSTR
*ppszIcon
)
33 CStringW IconName
= L
"zipfldr.dll,-1";
34 return SHStrDup(IconName
, ppszIcon
);
36 STDMETHODIMP
GetToolTip(IShellItemArray
*psiItemArray
, LPWSTR
*ppszInfotip
)
38 CStringW
HelpText(MAKEINTRESOURCEW(IDS_HELPTEXT
));
39 return SHStrDup(HelpText
, ppszInfotip
);
41 STDMETHODIMP
GetCanonicalName(GUID
*pguidCommandName
)
43 *pguidCommandName
= CLSID_ZipFolderExtractAllCommand
;
46 STDMETHODIMP
GetState(IShellItemArray
*psiItemArray
, BOOL fOkToBeSlow
, EXPCMDSTATE
*pCmdState
)
48 *pCmdState
= ECS_ENABLED
;
51 STDMETHODIMP
Invoke(IShellItemArray
*psiItemArray
, IBindCtx
*pbc
)
53 CMINVOKECOMMANDINFO cm
= { sizeof(cm
), 0 };
54 cm
.lpVerb
= EXTRACT_VERBA
;
56 return m_pZipObject
->InvokeCommand(&cm
);
58 STDMETHODIMP
GetFlags(EXPCMDFLAGS
*pFlags
)
60 *pFlags
= ECF_DEFAULT
;
63 STDMETHODIMP
EnumSubCommands(IEnumExplorerCommand
**ppEnum
)
65 DbgPrint("%s\n", __FUNCTION__
);
70 DECLARE_NOT_AGGREGATABLE(CExplorerCommand
)
71 DECLARE_PROTECT_FINAL_CONSTRUCT()
73 BEGIN_COM_MAP(CExplorerCommand
)
74 COM_INTERFACE_ENTRY_IID(IID_IExplorerCommand
, IExplorerCommand
)
79 class CEnumExplorerCommand
:
80 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
81 public IEnumExplorerCommand
85 CComPtr
<IContextMenu
> m_pZipObject
;
89 CEnumExplorerCommand()
94 STDMETHODIMP
Initialize(IContextMenu
* zipObject
)
96 m_pZipObject
= zipObject
;
100 // *** IEnumExplorerCommand methods ***
101 STDMETHODIMP
Next(ULONG celt
, IExplorerCommand
**pUICommand
, ULONG
*pceltFetched
)
108 if (m_bFirst
&& celt
)
112 HRESULT hr
= ShellObjectCreatorInit
<CExplorerCommand
>(m_pZipObject
, IID_PPV_ARG(IExplorerCommand
, pUICommand
));
122 STDMETHODIMP
Skip(ULONG celt
)
136 STDMETHODIMP
Clone(IEnumExplorerCommand
**ppenum
)
142 DECLARE_NOT_AGGREGATABLE(CEnumExplorerCommand
)
143 DECLARE_PROTECT_FINAL_CONSTRUCT()
145 BEGIN_COM_MAP(CEnumExplorerCommand
)
146 COM_INTERFACE_ENTRY_IID(IID_IEnumExplorerCommand
, IEnumExplorerCommand
)
150 class CExplorerCommandProvider
:
151 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
152 public IExplorerCommandProvider
155 CComPtr
<IContextMenu
> m_pZipObject
;
158 STDMETHODIMP
Initialize(IContextMenu
* zipObject
)
160 m_pZipObject
= zipObject
;
164 // *** IExplorerCommandProvider methods ***
165 STDMETHODIMP
GetCommands(IUnknown
*punkSite
, REFIID riid
, void **ppv
)
167 return ShellObjectCreatorInit
<CEnumExplorerCommand
>(m_pZipObject
, riid
, ppv
);
169 STDMETHODIMP
GetCommand(REFGUID rguidCommandId
, REFIID riid
, void **ppv
)
177 DECLARE_NOT_AGGREGATABLE(CExplorerCommandProvider
)
178 DECLARE_PROTECT_FINAL_CONSTRUCT()
180 BEGIN_COM_MAP(CExplorerCommandProvider
)
181 COM_INTERFACE_ENTRY_IID(IID_IExplorerCommandProvider
, IExplorerCommandProvider
)
186 HRESULT
_CExplorerCommandProvider_CreateInstance(IContextMenu
* zipObject
, REFIID riid
, LPVOID
* ppvOut
)
188 return ShellObjectCreatorInit
<CExplorerCommandProvider
>(zipObject
, riid
, ppvOut
);