ReactOS 0.4.16-dev-2284-g3529151
CZipFolder.hpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Zip Shell Extension
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Main class
5 * COPYRIGHT: Copyright 2017 Mark Jansen (mark.jansen@reactos.org)
6 * Copyright 2023-2026 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
7 */
8
9#pragma once
10
12{
20};
21
23{
24 int iResource;
26 int cxChar;
27 int fmt;
28};
29
31 public CComCoClass<CZipFolder, &CLSID_ZipFolderStorageHandler>,
32 public CComObjectRootEx<CComMultiThreadModelNoCS>,
33 public IShellFolder2,
34 //public IStorage,
35 public IContextMenu,
36 public IShellExtInit,
37 public IPersistFile,
38 public IPersistFolder2,
39 public IDropTarget, // FIXME: This IDropTarget is a HACK. Must be CZipFolderDropHandler. See com_apitest:zipfldr.
40 public IZip
41{
42 CStringW m_ZipFile;
43 CStringW m_ZipDir;
44 CComHeapPtr<ITEMIDLIST> m_CurDir;
46 CComPtr<IDataObject> m_pDataObj;
47 HWND m_hwnd = nullptr;
48
49 HRESULT DeleteItems(CComPtr<IDataObject> pDataObj);
50 HRESULT DoDeleteItems(CComPtr<IDataObject> pDataObj);
53 BOOL _GetFileTimeString(LPFILETIME lpFileTime, PWSTR pwszResult, UINT cchResult);
56
57public:
58 CZipFolder();
60
62 void Close();
63
64 // *** IZip methods ***
66
67 // *** IShellFolder2 methods ***
69 {
71 return E_NOTIMPL;
72 }
74 {
76 return E_NOTIMPL;
77 }
78 STDMETHODIMP GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay) override
79 {
80 if (pSort)
81 *pSort = COL_NAME;
82 if (pDisplay)
83 *pDisplay = COL_NAME;
84 return S_OK;
85 }
86 STDMETHODIMP GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags) override;
88 {
90 return E_NOTIMPL;
91 }
92 STDMETHODIMP GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override;
94 {
96 return E_NOTIMPL;
97 }
98
99 // *** IShellFolder methods ***
100 STDMETHODIMP ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes) override
101 {
103 return E_NOTIMPL;
104 }
105 STDMETHODIMP EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override
106 {
108 }
109 STDMETHODIMP BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override;
110 STDMETHODIMP BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
111 {
113 return E_NOTIMPL;
114 }
116 STDMETHODIMP CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override;
117 STDMETHODIMP GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override;
118 STDMETHODIMP GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) override;
120 STDMETHODIMP SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) override
121 {
123 return E_NOTIMPL;
124 }
126 //STDMETHODIMP CreateStream(LPCOLESTR pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStream **ppstm);
127 //STDMETHODIMP OpenStream(LPCOLESTR pwcsName, void *reserved1, DWORD grfMode, DWORD reserved2, IStream **ppstm);
128 //STDMETHODIMP CreateStorage(LPCOLESTR pwcsName, DWORD grfMode, DWORD dwStgFmt, DWORD reserved2, IStorage **ppstg);
129 //STDMETHODIMP OpenStorage(LPCOLESTR pwcsName, IStorage *pstgPriority, DWORD grfMode, SNB snbExclude, DWORD reserved, IStorage **ppstg);
130 //STDMETHODIMP CopyTo(DWORD ciidExclude, const IID *rgiidExclude, SNB snbExclude, IStorage *pstgDest);
131 //STDMETHODIMP MoveElementTo(LPCOLESTR pwcsName, IStorage *pstgDest, LPCOLESTR pwcsNewName, DWORD grfFlags);
132 //STDMETHODIMP Commit(DWORD grfCommitFlags);
133 //STDMETHODIMP Revert();
134 //STDMETHODIMP EnumElements(DWORD reserved1, void *reserved2, DWORD reserved3, IEnumSTATSTG **ppenum);
135 //STDMETHODIMP DestroyElement(LPCOLESTR pwcsName);
136 //STDMETHODIMP RenameElement(LPCOLESTR pwcsOldName, LPCOLESTR pwcsNewName);
137 //STDMETHODIMP SetElementTimes(LPCOLESTR pwcsName, const FILETIME *pctime, const FILETIME *patime, const FILETIME *pmtime);
138 //STDMETHODIMP SetClass(REFCLSID clsid);
139 //STDMETHODIMP SetStateBits(DWORD grfStateBits, DWORD grfMask);
140 //STDMETHODIMP Stat(STATSTG *pstatstg, DWORD grfStatFlag);
141
142 // *** IContextMenu methods ***
143 STDMETHODIMP GetCommandString(UINT_PTR idCmd, UINT uFlags, UINT *pwReserved, LPSTR pszName, UINT cchMax) override;
145 STDMETHODIMP QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) override;
146
147 // *** IShellExtInit methods ***
148 STDMETHODIMP Initialize(PCIDLIST_ABSOLUTE pidlFolder, LPDATAOBJECT pDataObj, HKEY hkeyProgID) override;
149
150 // *** IPersistFile methods ***
151 STDMETHODIMP IsDirty() override;
152 STDMETHODIMP Load(LPCOLESTR pszFileName, DWORD dwMode) override;
153 STDMETHODIMP Save(LPCOLESTR pszFileName, BOOL fRemember) override;
154 STDMETHODIMP SaveCompleted(LPCOLESTR pszFileName) override;
155 STDMETHODIMP GetCurFile(LPOLESTR *ppszFileName) override;
156
159 {
160 *pidl = ILClone(m_CurDir);
161 return S_OK;
162 }
163
164 // *** IPersistFolder methods ***
166
167 // *** IPersist methods ***
168 STDMETHODIMP GetClassID(CLSID *lpClassId) override
169 {
171 return S_OK;
172 }
173
174 // *** IDropTarget methods *** // FIXME: This is a HACK. Must be CZipFolderDropHandler. See com_apitest:zipfldr.
175 STDMETHODIMP DragEnter(IDataObject* pDataObj, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect) override;
176 STDMETHODIMP DragOver(DWORD grfKeyState, POINTL pt, DWORD* pdwEffect) override;
177 STDMETHODIMP DragLeave() override;
178 STDMETHODIMP Drop(IDataObject* pDataObj, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect) override;
179
180public:
181 DECLARE_NO_REGISTRY() // Handled manually because this object is exposed via multiple clsid's
183
185
187 COM_INTERFACE_ENTRY_IID(IID_IShellFolder2, IShellFolder2)
188 COM_INTERFACE_ENTRY_IID(IID_IShellFolder, IShellFolder)
189// COM_INTERFACE_ENTRY_IID(IID_IStorage, IStorage)
190 COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
191 COM_INTERFACE_ENTRY_IID(IID_IShellExtInit, IShellExtInit)
193 COM_INTERFACE_ENTRY_IID(IID_IPersistFolder2, IPersistFolder2)
194 COM_INTERFACE_ENTRY_IID(IID_IPersistFolder, IPersistFolder)
195 COM_INTERFACE_ENTRY_IID(IID_IDropTarget, IDropTarget) // FIXME: This is a HACK. Must be CZipFolderDropHandler. See com_apitest:zipfldr.
198};
HRESULT _CEnumZipContents_CreateInstance(IZip *zip, DWORD flags, PCWSTR prefix, REFIID riid, LPVOID *ppvOut)
@ COL_COMPRSIZE
Definition: CZipFolder.hpp:15
@ COL_PASSWORD
Definition: CZipFolder.hpp:16
@ COL_RATIO
Definition: CZipFolder.hpp:18
@ COL_NAME
Definition: CZipFolder.hpp:13
@ COL_DATE_MOD
Definition: CZipFolder.hpp:19
@ COL_TYPE
Definition: CZipFolder.hpp:14
@ COL_SIZE
Definition: CZipFolder.hpp:17
UINT cchMax
#define STDMETHODIMP
Definition: basetyps.h:43
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
STDMETHODIMP GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) override
Definition: CZipFolder.hpp:87
STDMETHODIMP MapColumnToSCID(UINT column, SHCOLUMNID *pscid) override
Definition: CZipFolder.hpp:93
HRESULT DeleteItems(CComPtr< IDataObject > pDataObj)
Definition: CZipFolder.cpp:111
CStringW m_ZipFile
Definition: CZipFolder.hpp:42
STDMETHODIMP GetCurFolder(PIDLIST_ABSOLUTE *pidl) override
Definition: CZipFolder.hpp:158
STDMETHODIMP Save(LPCOLESTR pszFileName, BOOL fRemember) override
Definition: CZipFolder.cpp:782
STDMETHODIMP EnumSearches(IEnumExtraSearch **ppenum) override
Definition: CZipFolder.hpp:73
STDMETHODIMP DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) override
Definition: CZipFolder.cpp:816
STDMETHODIMP BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
Definition: CZipFolder.hpp:110
STDMETHODIMP CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) override
Definition: CZipFolder.cpp:392
STDMETHODIMP_(unzFile) getZip()
HRESULT CopyZipEntry(unzFile uf, zipFile zf, unz_file_info64 *info, LPCSTR nameA)
Definition: CZipFolder.cpp:230
STDMETHODIMP GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override
Definition: CZipFolder.cpp:287
STDMETHODIMP IsDirty() override
Definition: CZipFolder.cpp:763
STDMETHODIMP EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override
Definition: CZipFolder.hpp:105
STDMETHODIMP DragEnter(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) override
Definition: CZipFolder.cpp:810
STDMETHODIMP SaveCompleted(LPCOLESTR pszFileName) override
Definition: CZipFolder.cpp:787
STDMETHODIMP SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) override
Definition: CZipFolder.hpp:120
STDMETHODIMP ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes) override
Definition: CZipFolder.hpp:100
STDMETHODIMP DragLeave() override
Definition: CZipFolder.cpp:822
STDMETHODIMP GetCurFile(LPOLESTR *ppszFileName) override
Definition: CZipFolder.cpp:792
static HRESULT CALLBACK ZipFolderMenuCallback(IShellFolder *psf, HWND hwnd, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: CZipFolder.cpp:499
STDMETHODIMP QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) override
Definition: CZipFolder.cpp:688
HRESULT DoDeleteItems(CComPtr< IDataObject > pDataObj)
Definition: CZipFolder.cpp:94
void Close()
Definition: CZipFolder.cpp:31
STDMETHODIMP GetClassID(CLSID *lpClassId) override
Definition: CZipFolder.hpp:168
STDMETHODIMP Load(LPCOLESTR pszFileName, DWORD dwMode) override
Definition: CZipFolder.cpp:768
STDMETHODIMP GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override
Definition: CZipFolder.cpp:462
STDMETHODIMP GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
Definition: CZipFolder.cpp:611
STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO pici) override
Definition: CZipFolder.cpp:659
CComHeapPtr< ITEMIDLIST > m_CurDir
Definition: CZipFolder.hpp:44
unzFile m_UnzipFile
Definition: CZipFolder.hpp:45
STDMETHODIMP GetCommandString(UINT_PTR idCmd, UINT uFlags, UINT *pwReserved, LPSTR pszName, UINT cchMax) override
Definition: CZipFolder.cpp:630
CComPtr< IDataObject > m_pDataObj
Definition: CZipFolder.hpp:46
STDMETHODIMP CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override
Definition: CZipFolder.cpp:422
STDMETHODIMP GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) override
Definition: CZipFolder.cpp:566
STDMETHODIMP GetDefaultSearchGUID(GUID *pguid) override
Definition: CZipFolder.hpp:68
CStringW m_ZipDir
Definition: CZipFolder.hpp:43
STDMETHODIMP BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
Definition: CZipFolder.cpp:368
STDMETHODIMP GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay) override
Definition: CZipFolder.hpp:78
static DWORD WINAPI s_ExtractProc(LPVOID arg)
Definition: CZipFolder.cpp:54
STDMETHODIMP Drop(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) override
Definition: CZipFolder.cpp:827
BOOL _GetFileTimeString(LPFILETIME lpFileTime, PWSTR pwszResult, UINT cchResult)
Definition: CZipFolder.cpp:66
STDMETHODIMP GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags) override
Definition: CZipFolder.cpp:279
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define E_NOTIMPL
Definition: ddrawi.h:99
EXTERN_C const GUID CLSID_ZipFolderStorageHandler
Definition: precomp.h:28
UINT uFlags
Definition: api.c:59
#define CALLBACK
Definition: compat.h:35
#define pt(x, y)
Definition: drawing.c:79
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
REFIID riid
Definition: atlbase.h:39
struct IContextMenu::tagCMINVOKECOMMANDINFO * LPCMINVOKECOMMANDINFO
#define S_OK
Definition: intsafe.h:52
#define BEGIN_COM_MAP(x)
Definition: atlcom.h:581
#define COM_INTERFACE_ENTRY_IID(iid, x)
Definition: atlcom.h:601
#define DECLARE_PROTECT_FINAL_CONSTRUCT()
Definition: atlcom.h:679
#define DECLARE_NOT_AGGREGATABLE(x)
Definition: atlcom.h:651
#define END_COM_MAP()
Definition: atlcom.h:592
#define DECLARE_NO_REGISTRY()
Definition: atlcom.h:639
LONG_PTR LPARAM
Definition: minwindef.h:175
UINT_PTR WPARAM
Definition: minwindef.h:174
static LPOLESTR
Definition: stg_prop.c:27
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
static HMENU hmenu
Definition: win.c:66
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
unsigned int UINT
Definition: ndis.h:50
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
interface IBindCtx * LPBC
Definition: objfwd.h:18
interface IDataObject * LPDATAOBJECT
Definition: objfwd.h:21
const GUID IID_IPersistFile
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:238
const GUID IID_IPersist
Definition: proxy.cpp:14
#define REFIID
Definition: guiddef.h:118
const ITEMIDLIST_ABSOLUTE UNALIGNED * PCUIDLIST_ABSOLUTE
Definition: shtypes.idl:63
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
Definition: shtypes.idl:71
const ITEMID_CHILD UNALIGNED * PCUITEMID_CHILD
Definition: shtypes.idl:70
const ITEMIDLIST_RELATIVE UNALIGNED * PCUIDLIST_RELATIVE
Definition: shtypes.idl:57
DWORD dwDefaultState
Definition: CFontExt.cpp:20
Definition: IZip.hpp:9
uint16_t * PWSTR
Definition: typedefs.h:56
const uint16_t * PCWSTR
Definition: typedefs.h:57
uint32_t ULONG
Definition: typedefs.h:59
voidp unzFile
Definition: unzip.h:70
WORD WORD PSZ PSZ pszFileName
Definition: vdmdbg.h:44
_In_ LPCSTR lpName
Definition: winbase.h:2543
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define WINAPI
Definition: msvc.h:6
static void Initialize()
Definition: xlate.c:212
#define IID_PPV_ARG(Itype, ppType)
const char * LPCSTR
Definition: xmlstorage.h:183
char * LPSTR
Definition: xmlstorage.h:182
voidp zipFile
Definition: zip.h:69