ReactOS 0.4.17-dev-470-gf9e3448
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{
28 const GUID *pkg;
30};
31
32inline bool IsEqual(const SHCOLUMNID &scid, REFGUID guid, UINT pid)
33{
34 return scid.pid == pid && IsEqualGUID(scid.fmtid, guid);
35}
36
37inline bool IsEqual(const SHCOLUMNID &scid, const FolderViewColumn &col)
38{
39 return col.pkg && IsEqual(scid, *col.pkg, col.pki);
40}
41
43 public CComCoClass<CZipFolder, &CLSID_ZipFolderStorageHandler>,
44 public CComObjectRootEx<CComMultiThreadModelNoCS>,
45 public IShellFolder2,
46 //public IStorage,
47 public IContextMenu,
48 public IShellExtInit,
49 public IPersistFile,
50 public IPersistFolder2,
51 public IDropTarget, // FIXME: This IDropTarget is a HACK. Must be CZipFolderDropHandler. See com_apitest:zipfldr.
52 public IZip
53{
54 CStringW m_ZipFile;
55 CStringW m_ZipDir;
56 CComHeapPtr<ITEMIDLIST> m_CurDir;
58 CComPtr<IDataObject> m_pDataObj;
59 HWND m_hwnd = nullptr;
60
61 HRESULT DeleteItems(CComPtr<IDataObject> pDataObj);
62 HRESULT DoDeleteItems(CComPtr<IDataObject> pDataObj);
65 BOOL _GetFileTimeString(LPFILETIME lpFileTime, PWSTR pwszResult, UINT cchResult);
68
69public:
70 CZipFolder();
72
74 void Close();
75
76 // *** IZip methods ***
78
79 // *** IShellFolder2 methods ***
81 {
83 return E_NOTIMPL;
84 }
86 {
88 return E_NOTIMPL;
89 }
90 STDMETHODIMP GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay) override
91 {
92 if (pSort)
93 *pSort = COL_NAME;
94 if (pDisplay)
95 *pDisplay = COL_NAME;
96 return S_OK;
97 }
98 STDMETHODIMP GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags) override;
99 STDMETHODIMP GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) override;
100 STDMETHODIMP GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override;
101 STDMETHODIMP MapColumnToSCID(UINT column, SHCOLUMNID *pscid) override;
102
103 // *** IShellFolder methods ***
104 STDMETHODIMP ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes) override;
105
106 STDMETHODIMP EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override
107 {
109 }
110 STDMETHODIMP BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override;
111 STDMETHODIMP BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
112 {
114 return E_NOTIMPL;
115 }
117 STDMETHODIMP CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override;
118 STDMETHODIMP GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override;
119 STDMETHODIMP GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) override;
121 STDMETHODIMP SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) override
122 {
124 return E_NOTIMPL;
125 }
127 //STDMETHODIMP CreateStream(LPCOLESTR pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStream **ppstm);
128 //STDMETHODIMP OpenStream(LPCOLESTR pwcsName, void *reserved1, DWORD grfMode, DWORD reserved2, IStream **ppstm);
129 //STDMETHODIMP CreateStorage(LPCOLESTR pwcsName, DWORD grfMode, DWORD dwStgFmt, DWORD reserved2, IStorage **ppstg);
130 //STDMETHODIMP OpenStorage(LPCOLESTR pwcsName, IStorage *pstgPriority, DWORD grfMode, SNB snbExclude, DWORD reserved, IStorage **ppstg);
131 //STDMETHODIMP CopyTo(DWORD ciidExclude, const IID *rgiidExclude, SNB snbExclude, IStorage *pstgDest);
132 //STDMETHODIMP MoveElementTo(LPCOLESTR pwcsName, IStorage *pstgDest, LPCOLESTR pwcsNewName, DWORD grfFlags);
133 //STDMETHODIMP Commit(DWORD grfCommitFlags);
134 //STDMETHODIMP Revert();
135 //STDMETHODIMP EnumElements(DWORD reserved1, void *reserved2, DWORD reserved3, IEnumSTATSTG **ppenum);
136 //STDMETHODIMP DestroyElement(LPCOLESTR pwcsName);
137 //STDMETHODIMP RenameElement(LPCOLESTR pwcsOldName, LPCOLESTR pwcsNewName);
138 //STDMETHODIMP SetElementTimes(LPCOLESTR pwcsName, const FILETIME *pctime, const FILETIME *patime, const FILETIME *pmtime);
139 //STDMETHODIMP SetClass(REFCLSID clsid);
140 //STDMETHODIMP SetStateBits(DWORD grfStateBits, DWORD grfMask);
141 //STDMETHODIMP Stat(STATSTG *pstatstg, DWORD grfStatFlag);
142
143 // *** IContextMenu methods ***
144 STDMETHODIMP GetCommandString(UINT_PTR idCmd, UINT uFlags, UINT *pwReserved, LPSTR pszName, UINT cchMax) override;
146 STDMETHODIMP QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) override;
147
148 // *** IShellExtInit methods ***
149 STDMETHODIMP Initialize(PCIDLIST_ABSOLUTE pidlFolder, LPDATAOBJECT pDataObj, HKEY hkeyProgID) override;
150
151 // *** IPersistFile methods ***
152 STDMETHODIMP IsDirty() override;
153 STDMETHODIMP Load(LPCOLESTR pszFileName, DWORD dwMode) override;
154 STDMETHODIMP Save(LPCOLESTR pszFileName, BOOL fRemember) override;
155 STDMETHODIMP SaveCompleted(LPCOLESTR pszFileName) override;
156 STDMETHODIMP GetCurFile(LPOLESTR *ppszFileName) override;
157
160 {
161 *pidl = ILClone(m_CurDir);
162 return S_OK;
163 }
164
165 // *** IPersistFolder methods ***
167
168 // *** IPersist methods ***
169 STDMETHODIMP GetClassID(CLSID *lpClassId) override
170 {
172 return S_OK;
173 }
174
175 // *** IDropTarget methods *** // FIXME: This is a HACK. Must be CZipFolderDropHandler. See com_apitest:zipfldr.
176 STDMETHODIMP DragEnter(IDataObject* pDataObj, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect) override;
177 STDMETHODIMP DragOver(DWORD grfKeyState, POINTL pt, DWORD* pdwEffect) override;
178 STDMETHODIMP DragLeave() override;
179 STDMETHODIMP Drop(IDataObject* pDataObj, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect) override;
180
181public:
182 DECLARE_NO_REGISTRY() // Handled manually because this object is exposed via multiple clsid's
184
186
188 COM_INTERFACE_ENTRY_IID(IID_IShellFolder2, IShellFolder2)
189 COM_INTERFACE_ENTRY_IID(IID_IShellFolder, IShellFolder)
190// COM_INTERFACE_ENTRY_IID(IID_IStorage, IStorage)
191 COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
192 COM_INTERFACE_ENTRY_IID(IID_IShellExtInit, IShellExtInit)
194 COM_INTERFACE_ENTRY_IID(IID_IPersistFolder2, IPersistFolder2)
195 COM_INTERFACE_ENTRY_IID(IID_IPersistFolder, IPersistFolder)
196 COM_INTERFACE_ENTRY_IID(IID_IDropTarget, IDropTarget) // FIXME: This is a HACK. Must be CZipFolderDropHandler. See com_apitest:zipfldr.
199};
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.cpp:314
STDMETHODIMP MapColumnToSCID(UINT column, SHCOLUMNID *pscid) override
Definition: CZipFolder.cpp:454
HRESULT DeleteItems(CComPtr< IDataObject > pDataObj)
Definition: CZipFolder.cpp:138
CStringW m_ZipFile
Definition: CZipFolder.hpp:54
STDMETHODIMP GetCurFolder(PIDLIST_ABSOLUTE *pidl) override
Definition: CZipFolder.hpp:159
STDMETHODIMP Save(LPCOLESTR pszFileName, BOOL fRemember) override
Definition: CZipFolder.cpp:924
STDMETHODIMP EnumSearches(IEnumExtraSearch **ppenum) override
Definition: CZipFolder.hpp:85
STDMETHODIMP DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) override
Definition: CZipFolder.cpp:958
STDMETHODIMP BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
Definition: CZipFolder.hpp:111
STDMETHODIMP CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) override
Definition: CZipFolder.cpp:512
STDMETHODIMP_(unzFile) getZip()
HRESULT CopyZipEntry(unzFile uf, zipFile zf, unz_file_info64 *info, LPCSTR nameA)
Definition: CZipFolder.cpp:257
STDMETHODIMP GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override
Definition: CZipFolder.cpp:373
STDMETHODIMP IsDirty() override
Definition: CZipFolder.cpp:905
STDMETHODIMP EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override
Definition: CZipFolder.hpp:106
STDMETHODIMP DragEnter(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) override
Definition: CZipFolder.cpp:952
STDMETHODIMP SaveCompleted(LPCOLESTR pszFileName) override
Definition: CZipFolder.cpp:929
STDMETHODIMP SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) override
Definition: CZipFolder.hpp:121
STDMETHODIMP DragLeave() override
Definition: CZipFolder.cpp:964
STDMETHODIMP GetCurFile(LPOLESTR *ppszFileName) override
Definition: CZipFolder.cpp:934
static HRESULT CALLBACK ZipFolderMenuCallback(IShellFolder *psf, HWND hwnd, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: CZipFolder.cpp:619
STDMETHODIMP QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) override
Definition: CZipFolder.cpp:830
HRESULT DoDeleteItems(CComPtr< IDataObject > pDataObj)
Definition: CZipFolder.cpp:121
void Close()
Definition: CZipFolder.cpp:58
STDMETHODIMP GetClassID(CLSID *lpClassId) override
Definition: CZipFolder.hpp:169
STDMETHODIMP Load(LPCOLESTR pszFileName, DWORD dwMode) override
Definition: CZipFolder.cpp:910
STDMETHODIMP GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override
Definition: CZipFolder.cpp:582
STDMETHODIMP GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
Definition: CZipFolder.cpp:731
STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO pici) override
Definition: CZipFolder.cpp:801
CComHeapPtr< ITEMIDLIST > m_CurDir
Definition: CZipFolder.hpp:56
unzFile m_UnzipFile
Definition: CZipFolder.hpp:57
STDMETHODIMP GetCommandString(UINT_PTR idCmd, UINT uFlags, UINT *pwReserved, LPSTR pszName, UINT cchMax) override
Definition: CZipFolder.cpp:772
CComPtr< IDataObject > m_pDataObj
Definition: CZipFolder.hpp:58
STDMETHODIMP CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override
Definition: CZipFolder.cpp:542
STDMETHODIMP GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) override
Definition: CZipFolder.cpp:686
STDMETHODIMP GetDefaultSearchGUID(GUID *pguid) override
Definition: CZipFolder.hpp:80
CStringW m_ZipDir
Definition: CZipFolder.hpp:55
STDMETHODIMP BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
Definition: CZipFolder.cpp:488
STDMETHODIMP GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay) override
Definition: CZipFolder.hpp:90
static DWORD WINAPI s_ExtractProc(LPVOID arg)
Definition: CZipFolder.cpp:81
STDMETHODIMP Drop(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) override
Definition: CZipFolder.cpp:969
BOOL _GetFileTimeString(LPFILETIME lpFileTime, PWSTR pwszResult, UINT cchResult)
Definition: CZipFolder.cpp:93
STDMETHODIMP GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags) override
Definition: CZipFolder.cpp:306
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
GUID guid
Definition: version.c:147
#define pt(x, y)
Definition: drawing.c:79
@ IsEqual
Definition: fatprocs.h:1887
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned int UINT
Definition: sysinfo.c:13
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 IParseDisplayName ParseDisplayName
Definition: moniker.c:1141
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:78
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
_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 IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#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
const GUID * pkg
Definition: CZipFolder.hpp:28
Definition: IZip.hpp:9
Definition: scsiwmi.h:51
uint16_t * PWSTR
Definition: typedefs.h:56
const char * LPCSTR
Definition: typedefs.h:52
const uint16_t * PCWSTR
Definition: typedefs.h:57
char * LPSTR
Definition: typedefs.h:51
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:2519
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
_In_ ULONG_PTR _In_ ULONG _Out_ ULONG_PTR * pid
Definition: winddi.h:3837
#define WINAPI
Definition: msvc.h:6
static void Initialize()
Definition: xlate.c:212
#define IID_PPV_ARG(Itype, ppType)
unsigned char BYTE
Definition: xxhash.c:193
voidp zipFile
Definition: zip.h:69