ReactOS 0.4.16-dev-2293-g4d8327b
CZipFolder Class Reference

#include <CZipFolder.hpp>

Inheritance diagram for CZipFolder:
Collaboration diagram for CZipFolder:

Public Member Functions

 CZipFolder ()
 
 ~CZipFolder ()
 
HRESULT Initialize (PCWSTR zipFile, PCWSTR zipDir, PCUIDLIST_ABSOLUTE curDir, PCUIDLIST_RELATIVE pidl)
 
void Close ()
 
 STDMETHODIMP_ (unzFile) getZip()
 
STDMETHODIMP GetDefaultSearchGUID (GUID *pguid) override
 
STDMETHODIMP EnumSearches (IEnumExtraSearch **ppenum) override
 
STDMETHODIMP GetDefaultColumn (DWORD dwRes, ULONG *pSort, ULONG *pDisplay) override
 
STDMETHODIMP GetDefaultColumnState (UINT iColumn, DWORD *pcsFlags) override
 
STDMETHODIMP GetDetailsEx (PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) override
 
STDMETHODIMP GetDetailsOf (PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override
 
STDMETHODIMP MapColumnToSCID (UINT column, SHCOLUMNID *pscid) override
 
STDMETHODIMP ParseDisplayName (HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes) override
 
STDMETHODIMP EnumObjects (HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override
 
STDMETHODIMP BindToObject (PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
 
STDMETHODIMP BindToStorage (PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
 
STDMETHODIMP CompareIDs (LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) override
 
STDMETHODIMP CreateViewObject (HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override
 
STDMETHODIMP GetAttributesOf (UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override
 
STDMETHODIMP GetUIObjectOf (HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) override
 
STDMETHODIMP GetDisplayNameOf (PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
 
STDMETHODIMP SetNameOf (HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) override
 
STDMETHODIMP GetCommandString (UINT_PTR idCmd, UINT uFlags, UINT *pwReserved, LPSTR pszName, UINT cchMax) override
 
STDMETHODIMP InvokeCommand (LPCMINVOKECOMMANDINFO pici) override
 
STDMETHODIMP QueryContextMenu (HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) override
 
STDMETHODIMP Initialize (PCIDLIST_ABSOLUTE pidlFolder, LPDATAOBJECT pDataObj, HKEY hkeyProgID) override
 
STDMETHODIMP IsDirty () override
 
STDMETHODIMP Load (LPCOLESTR pszFileName, DWORD dwMode) override
 
STDMETHODIMP Save (LPCOLESTR pszFileName, BOOL fRemember) override
 
STDMETHODIMP SaveCompleted (LPCOLESTR pszFileName) override
 
STDMETHODIMP GetCurFile (LPOLESTR *ppszFileName) override
 
STDMETHODIMP GetCurFolder (PIDLIST_ABSOLUTE *pidl) override
 
STDMETHODIMP Initialize (PCIDLIST_ABSOLUTE pidl) override
 
STDMETHODIMP GetClassID (CLSID *lpClassId) override
 
STDMETHODIMP DragEnter (IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) override
 
STDMETHODIMP DragOver (DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) override
 
STDMETHODIMP DragLeave () override
 
STDMETHODIMP Drop (IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) override
 
- Public Member Functions inherited from ATL::CComObjectRootEx< CComMultiThreadModelNoCS >
 ~CComObjectRootEx ()
 
ULONG InternalAddRef ()
 
ULONG InternalRelease ()
 
void Lock ()
 
void Unlock ()
 
HRESULT _AtlInitialConstruct ()
 
- Public Member Functions inherited from ATL::CComObjectRootBase
 CComObjectRootBase ()
 
 ~CComObjectRootBase ()
 
void SetVoid (void *)
 
HRESULT _AtlFinalConstruct ()
 
HRESULT FinalConstruct ()
 
void InternalFinalConstructAddRef ()
 
void InternalFinalConstructRelease ()
 
void FinalRelease ()
 
HRESULT GetDefaultSearchGUID ([out] GUID *lpguid)
 
HRESULT EnumSearches ([out] IEnumExtraSearch **ppenum)
 
HRESULT GetDefaultColumn ([in] DWORD dwReserved, [out] ULONG *pSort, [out] ULONG *pDisplay)
 
HRESULT GetDefaultColumnState ([in] UINT iColumn, [out] SHCOLSTATEF *pcsFlags)
 
HRESULT GetDetailsEx ([in] PCUITEMID_CHILD pidl, [in] const SHCOLUMNID *pscid, [out] VARIANT *pv)
 
HRESULT GetDetailsOf ([in] PCUITEMID_CHILD pidl, [in] UINT iColumn, [out] SHELLDETAILS *psd)
 
HRESULT MapColumnToSCID ([in] UINT iColumn, [in] SHCOLUMNID *pscid)
 
- Public Member Functions inherited from IShellFolder
HRESULT ParseDisplayName ([in] HWND hwndOwner, [in] LPBC pbcReserved, [in, string] LPOLESTR lpszDisplayName, [out] ULONG *pchEaten, [out] PIDLIST_RELATIVE *ppidl, [in, out, unique] ULONG *pdwAttributes)
 
HRESULT EnumObjects ([in] HWND hwndOwner, [in] SHCONTF grfFlags, [out] IEnumIDList **ppenumIDList)
 
HRESULT BindToObject ([in] PCUIDLIST_RELATIVE pidl, [in] LPBC pbcReserved, [in] REFIID riid, [out, iid_is(riid)] void **ppvOut)
 
HRESULT BindToStorage ([in] PCUIDLIST_RELATIVE pidl, [in] LPBC pbcReserved, [in] REFIID riid, [out, iid_is(riid)] void **ppvObj)
 
HRESULT CompareIDs ([in] LPARAM lParam, [in] PCUIDLIST_RELATIVE pidl1, [in] PCUIDLIST_RELATIVE pidl2)
 
HRESULT CreateViewObject ([in] HWND hwndOwner, [in] REFIID riid, [out, iid_is(riid)] void **ppvOut)
 
HRESULT GetAttributesOf ([in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in, out] SFGAOF *rgfInOut)
 
HRESULT GetUIObjectOf ([in] HWND hwndOwner, [in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in] REFIID riid, [in, out, unique] UINT *prgfInOut, [out, iid_is(riid)] void **ppvOut)
 
HRESULT GetDisplayNameOf ([in] PCUITEMID_CHILD pidl, [in] SHGDNF uFlags, [out] STRRET *lpName)
 
HRESULT SetNameOf ([in] HWND hwnd, [in] PCUITEMID_CHILD pidl, [in, string] LPCOLESTR lpszName, [in] SHGDNF uFlags, [out] PITEMID_CHILD *ppidlOut)
 
- Public Member Functions inherited from IUnknown
HRESULT QueryInterface ([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
 
ULONG AddRef ()
 
ULONG Release ()
 
HRESULT QueryContextMenu ([in] HMENU hmenu, [in] UINT indexMenu, [in] UINT idCmdFirst, [in] UINT idCmdLast, [in] UINT uFlags)
 
HRESULT InvokeCommand ([in] LPCMINVOKECOMMANDINFO lpici)
 
HRESULT GetCommandString ([in] UINT_PTR idCmd, [in] UINT uType, [out] UINT *pwReserved, [out, size_is(cchMax)] LPSTR pszName, [in] UINT cchMax)
 
- Public Member Functions inherited from IShellExtInit
HRESULT Initialize ([in] PCIDLIST_ABSOLUTE pidlFolder, [in] IDataObject *pdtobj, [in] HKEY hkeyProgID)
 
HRESULT IsDirty ()
 
HRESULT Load ([in] LPCOLESTR pszFileName, [in] DWORD dwMode)
 
HRESULT Save ([in, unique] LPCOLESTR pszFileName, [in] BOOL fRemember)
 
HRESULT SaveCompleted ([in, unique] LPCOLESTR pszFileName)
 
HRESULT GetCurFile ([out] LPOLESTR *ppszFileName)
 
HRESULT GetClassID ([out] CLSID *pClassID)
 
HRESULT GetCurFolder ([out] PIDLIST_ABSOLUTE *ppidl)
 
HRESULT Initialize ([in] PCIDLIST_ABSOLUTE pidl)
 
HRESULT DragEnter ([in, unique] IDataObject *pDataObj, [in] DWORD grfKeyState, [in] POINTL pt, [in, out] DWORD *pdwEffect)
 
HRESULT DragOver ([in] DWORD grfKeyState, [in] POINTL pt, [in, out] DWORD *pdwEffect)
 
HRESULT DragLeave ()
 
HRESULT Drop ([in, unique] IDataObject *pDataObj, [in] DWORD grfKeyState, [in] POINTL pt, [in, out] DWORD *pdwEffect)
 
virtual STDMETHODIMP_ (unzFile) getZip() PURE
 

Private Member Functions

HRESULT DeleteItems (CComPtr< IDataObject > pDataObj)
 
HRESULT DoDeleteItems (CComPtr< IDataObject > pDataObj)
 
HRESULT CopyZipEntry (unzFile uf, zipFile zf, unz_file_info64 *info, LPCSTR nameA)
 
BOOL _GetFileTimeString (LPFILETIME lpFileTime, PWSTR pwszResult, UINT cchResult)
 

Static Private Member Functions

static DWORD WINAPI s_ExtractProc (LPVOID arg)
 
static HRESULT CALLBACK ZipFolderMenuCallback (IShellFolder *psf, HWND hwnd, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam)
 

Private Attributes

CStringW m_ZipFile
 
CStringW m_ZipDir
 
CComHeapPtr< ITEMIDLISTm_CurDir
 
unzFile m_UnzipFile = nullptr
 
CComPtr< IDataObjectm_pDataObj
 
HWND m_hwnd = nullptr
 

Additional Inherited Members

- Public Types inherited from IShellFolder2
typedef struct IShellFolder2::SHCOLUMNIDLPSHCOLUMNID
 
typedef const SHCOLUMNIDLPCSHCOLUMNID
 
- Public Types inherited from IShellFolder
enum  tagSHGDN {
  SHGDN_NORMAL = 0 , SHGDN_INFOLDER = 1 , SHGDN_FOREDITING = 0x1000 , SHGDN_INCLUDE_NONFILESYS = 0x2000 ,
  SHGDN_FORADDRESSBAR = 0x4000 , SHGDN_FORPARSING = 0x8000
}
 
enum  tagSHCONTF {
  SHCONTF_FOLDERS = 32 , SHCONTF_NONFOLDERS = 64 , SHCONTF_INCLUDEHIDDEN = 128 , SHCONTF_INIT_ON_FIRST_NEXT = 256 ,
  SHCONTF_NETPRINTERSRCH = 512 , SHCONTF_SHAREABLE = 1024 , SHCONTF_STORAGE = 2048 , SHCONTF_NAVIGATION_ENUM = 0x01000 ,
  SHCONTF_FASTITEMS = 0x02000 , SHCONTF_FLATLIST = 0x04000 , SHCONTF_ENABLE_ASYNC = 0x08000 , SHCONTF_INCLUDESUPERHIDDEN = 0x10000
}
 
typedef IShellFolderLPSHELLFOLDER
 
typedef enum IShellFolder::tagSHGDN SHGNO
 
typedef DWORD SHGDNF
 
typedef DWORD SHCONTF
 
typedef ULONG SFGAOF
 
- Public Types inherited from IUnknown
typedef IUnknownLPUNKNOWN
 
- Public Types inherited from IContextMenu
typedef IContextMenuLPCONTEXTMENU
 
typedef struct IContextMenu::tagCMINVOKECOMMANDINFO CMINVOKECOMMANDINFO
 
typedef struct IContextMenu::tagCMINVOKECOMMANDINFOLPCMINVOKECOMMANDINFO
 
typedef struct IContextMenu::tagCMInvokeCommandInfoEx CMINVOKECOMMANDINFOEX
 
typedef struct IContextMenu::tagCMInvokeCommandInfoExLPCMINVOKECOMMANDINFOEX
 
- Public Types inherited from IShellExtInit
typedef IShellExtInitLPSHELLEXTINIT
 
- Public Types inherited from IPersistFile
typedef IPersistFileLPPERSISTFILE
 
- Public Types inherited from IPersist
typedef IPersistLPPERSIST
 
- Public Types inherited from IPersistFolder2
typedef IPersistFolder2LPPERSISTFOLDER2
 
- Public Types inherited from IPersistFolder
typedef IPersistFolderLPPERSISTFOLDER
 
- Public Types inherited from IDropTarget
typedef IDropTargetLPDROPTARGET
 
- Static Public Member Functions inherited from ATL::CComObjectRootBase
static void WINAPI ObjectMain (bool)
 
static const struct _ATL_CATMAP_ENTRYGetCategoryMap ()
 
static HRESULT WINAPI InternalQueryInterface (void *pThis, const _ATL_INTMAP_ENTRY *pEntries, REFIID iid, void **ppvObject)
 
- Public Attributes inherited from ATL::CComObjectRootBase
LONG m_dwRef
 
- Public Attributes inherited from IDropTarget
const DWORD MK_ALT = 0x20
 
const DWORD DROPEFFECT_NONE = 0
 
const DWORD DROPEFFECT_COPY = 1
 
const DWORD DROPEFFECT_MOVE = 2
 
const DWORD DROPEFFECT_LINK = 4
 
const DWORD DROPEFFECT_SCROLL = 0x80000000
 
const DWORD DD_DEFSCROLLINSET = 11
 
const DWORD DD_DEFSCROLLDELAY = 50
 
const DWORD DD_DEFSCROLLINTERVAL = 50
 
const DWORD DD_DEFDRAGDELAY = 200
 
const DWORD DD_DEFDRAGMINDIST = 2
 
- Static Public Attributes inherited from IContextMenu
static const WCHAR CMDSTR_NEWFOLDERW [] = {'N','e','w','F','o','l','d','e','r',0}
 
static const WCHAR CMDSTR_VIEWLISTW [] = {'V','i','e','w','L','i','s','t',0}
 
static const WCHAR CMDSTR_VIEWDETAILSW [] = {'V','i','e','w','D','e','t','a','i','l','s',0}
 

Detailed Description

Definition at line 30 of file CZipFolder.hpp.

Constructor & Destructor Documentation

◆ CZipFolder()

CZipFolder::CZipFolder ( )

Definition at line 22 of file CZipFolder.cpp.

23{
24}

◆ ~CZipFolder()

CZipFolder::~CZipFolder ( )

Definition at line 26 of file CZipFolder.cpp.

27{
28 Close();
29}
void Close()
Definition: CZipFolder.cpp:31

Member Function Documentation

◆ _GetFileTimeString()

BOOL CZipFolder::_GetFileTimeString ( LPFILETIME  lpFileTime,
PWSTR  pwszResult,
UINT  cchResult 
)
private

Definition at line 66 of file CZipFolder.cpp.

67{
68 SYSTEMTIME st;
69
70 if (!FileTimeToSystemTime(lpFileTime, &st))
71 return FALSE;
72
73 size_t cchRemaining = cchResult;
74 PWSTR pwszEnd = pwszResult;
75 int cchWritten = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, pwszEnd, cchRemaining);
76 if (cchWritten)
77 --cchWritten; // GetDateFormatW returns count with terminating zero
78 else
79 return FALSE;
80 cchRemaining -= cchWritten;
81 pwszEnd += cchWritten;
82
83 StringCchCopyExW(pwszEnd, cchRemaining, L" ", &pwszEnd, &cchRemaining, 0);
84
85 cchWritten = GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &st, NULL, pwszEnd, cchRemaining);
86 if (cchWritten)
87 --cchWritten; // GetTimeFormatW returns count with terminating zero
88 else
89 return FALSE;
90
91 return TRUE;
92}
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
BOOL WINAPI FileTimeToSystemTime(IN CONST FILETIME *lpFileTime, OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:188
#define L(x)
Definition: resources.c:13
INT WINAPI GetTimeFormatW(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCWSTR lpFormat, LPWSTR lpTimeStr, INT cchOut)
Definition: lcformat.c:1101
INT WINAPI GetDateFormatW(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCWSTR lpFormat, LPWSTR lpDateStr, INT cchOut)
Definition: lcformat.c:1001
#define LOCALE_USER_DEFAULT
STRSAFEAPI StringCchCopyExW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc, STRSAFE_LPWSTR *ppszDestEnd, size_t *pcchRemaining, STRSAFE_DWORD dwFlags)
Definition: strsafe.h:184
uint16_t * PWSTR
Definition: typedefs.h:56
#define DATE_SHORTDATE
Definition: winnls.h:209

Referenced by GetDetailsOf().

◆ BindToObject()

STDMETHODIMP CZipFolder::BindToObject ( PCUIDLIST_RELATIVE  pidl,
LPBC  pbcReserved,
REFIID  riid,
LPVOID ppvOut 
)
override

Definition at line 368 of file CZipFolder.cpp.

369{
370 if (riid == IID_IShellFolder)
371 {
372 CStringW newZipDir = m_ZipDir;
373 PCUIDLIST_RELATIVE curpidl = pidl;
374 while (curpidl->mkid.cb)
375 {
376 const ZipPidlEntry* zipEntry = _ZipFromIL(curpidl);
377 if (!zipEntry)
378 {
379 return E_FAIL;
380 }
381 newZipDir += zipEntry->Name;
382 newZipDir += L'/';
383
384 curpidl = ILGetNext(curpidl);
385 }
386 return ShellObjectCreatorInit<CZipFolder>(m_ZipFile, newZipDir, m_CurDir, pidl, riid, ppvOut);
387 }
388 DbgPrint("%s(%S) UNHANDLED\n", __FUNCTION__, guid2string(riid));
389 return E_NOTIMPL;
390}
WCHAR * guid2string(REFCLSID iid)
Definition: Debug.cpp:21
CStringW m_ZipFile
Definition: CZipFolder.hpp:42
CComHeapPtr< ITEMIDLIST > m_CurDir
Definition: CZipFolder.hpp:44
CStringW m_ZipDir
Definition: CZipFolder.hpp:43
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define __FUNCTION__
Definition: types.h:116
#define DbgPrint
Definition: hal.h:12
REFIID riid
Definition: atlbase.h:39
LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
Definition: pidl.c:977
const ITEMIDLIST_RELATIVE UNALIGNED * PCUIDLIST_RELATIVE
Definition: shtypes.idl:57
WCHAR Name[1]
Definition: zippidl.hpp:28
const ZipPidlEntry * _ZipFromIL(LPCITEMIDLIST pidl)
Definition: zippidl.cpp:41

◆ BindToStorage()

STDMETHODIMP CZipFolder::BindToStorage ( PCUIDLIST_RELATIVE  pidl,
LPBC  pbcReserved,
REFIID  riid,
LPVOID ppvOut 
)
inlineoverride

Definition at line 110 of file CZipFolder.hpp.

111 {
113 return E_NOTIMPL;
114 }
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15

◆ Close()

void CZipFolder::Close ( )

Definition at line 31 of file CZipFolder.cpp.

32{
33 if (m_UnzipFile)
36}
unzFile m_UnzipFile
Definition: CZipFolder.hpp:45
int ZEXPORT unzClose(unzFile file)
Definition: unzip.c:813

Referenced by DeleteItems(), Drop(), and ~CZipFolder().

◆ CompareIDs()

STDMETHODIMP CZipFolder::CompareIDs ( LPARAM  lParam,
PCUIDLIST_RELATIVE  pidl1,
PCUIDLIST_RELATIVE  pidl2 
)
override

Implements IShellFolder.

Definition at line 392 of file CZipFolder.cpp.

393{
394 const ZipPidlEntry* zipEntry1 = _ZipFromIL(pidl1);
395 const ZipPidlEntry* zipEntry2 = _ZipFromIL(pidl2);
396
397 if (!zipEntry1 || !zipEntry2)
398 return E_INVALIDARG;
399
400 int result = 0;
401 if (zipEntry1->ZipType != zipEntry2->ZipType)
402 result = zipEntry1->ZipType - zipEntry2->ZipType;
403 else
404 result = StrCmpIW(zipEntry1->Name, zipEntry2->Name);
405
406 if (!result && zipEntry1->ZipType == ZIP_PIDL_DIRECTORY)
407 {
408 PCUIDLIST_RELATIVE child1 = ILGetNext(pidl1);
409 PCUIDLIST_RELATIVE child2 = ILGetNext(pidl2);
410
411 if (child1->mkid.cb && child2->mkid.cb)
412 return CompareIDs(lParam, child1, child2);
413 else if (child1->mkid.cb)
414 result = 1;
415 else if (child2->mkid.cb)
416 result = -1;
417 }
418
420}
STDMETHODIMP CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) override
Definition: CZipFolder.cpp:392
LPARAM lParam
Definition: combotst.c:139
#define E_INVALIDARG
Definition: ddrawi.h:101
int WINAPI StrCmpIW(const WCHAR *str, const WCHAR *comp)
Definition: string.c:456
GLuint64EXT * result
Definition: glext.h:11304
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:678
ZipPidlType ZipType
Definition: zippidl.hpp:22
@ ZIP_PIDL_DIRECTORY
Definition: zippidl.hpp:12

Referenced by CompareIDs().

◆ CopyZipEntry()

HRESULT CZipFolder::CopyZipEntry ( unzFile  uf,
zipFile  zf,
unz_file_info64 info,
LPCSTR  nameA 
)
private

Definition at line 230 of file CZipFolder.cpp.

231{
232 // Get extra field
234 if (info->size_file_extra > 0)
235 {
236 extra.SetCount(info->size_file_extra);
237 if (unzGetCurrentFileInfo64(uf, NULL, NULL, 0, extra.GetData(),
238 info->size_file_extra, NULL, 0) != UNZ_OK)
239 {
240 DPRINT1("Cannot get extra fields\n");
241 return E_FAIL;
242 }
243 }
244
245 if (unzOpenCurrentFile(uf) != UNZ_OK)
246 {
247 DPRINT1("Cannot open current file\n");
248 return E_FAIL;
249 }
250
251 zip_fileinfo zi = {0};
252 zi.dosDate = info->dosDate;
253 zi.internal_fa = info->internal_fa;
254 zi.external_fa = info->external_fa;
255
256 INT err = zipOpenNewFileInZip3_64(zf, nameA, &zi,
257 extra.GetData(), (UINT)extra.GetCount(),
258 extra.GetData(), (UINT)extra.GetCount(),
261 NULL, 0, info->flag);
262 if (err)
263 {
264 DPRINT1("err: %d\n", err);
266 return E_FAIL;
267 }
268
269 BYTE buffer[4096];
270 INT read;
271 while ((read = unzReadCurrentFile(uf, buffer, sizeof(buffer))) > 0)
273
276 return S_OK;
277}
#define read
Definition: acwin.h:96
#define DPRINT1
Definition: precomp.h:8
#define Z_DEFLATED
Definition: zlib.h:146
#define Z_DEFAULT_STRATEGY
Definition: zlib.h:137
#define MAX_WBITS
Definition: zlib.h:151
#define Z_DEFAULT_COMPRESSION
Definition: zlib.h:130
#define DEF_MEM_LEVEL
Definition: zutil.h:53
GLuint buffer
Definition: glext.h:5915
@ extra
Definition: id3.c:95
#define S_OK
Definition: intsafe.h:52
unsigned int UINT
Definition: ndis.h:50
#define err(...)
uLong dosDate
Definition: zip.h:102
uLong internal_fa
Definition: zip.h:105
uLong external_fa
Definition: zip.h:106
int32_t INT
Definition: typedefs.h:58
int ZEXPORT unzGetCurrentFileInfo64(unzFile file, unz_file_info64 *pfile_info, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize)
Definition: unzip.c:1129
int ZEXPORT unzOpenCurrentFile(unzFile file)
Definition: unzip.c:1648
int ZEXPORT unzReadCurrentFile(unzFile file, voidp buf, unsigned len)
Definition: unzip.c:1691
int ZEXPORT unzCloseCurrentFile(unzFile file)
Definition: unzip.c:2014
#define UNZ_OK
Definition: unzip.h:74
unsigned char BYTE
Definition: xxhash.c:193
int ZEXPORT zipWriteInFileInZip(zipFile file, const void *buf, unsigned int len)
Definition: zip.c:1408
int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char *filename, const zip_fileinfo *zipfi, const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global, uInt size_extrafield_global, const char *comment, int method, int level, int raw, int windowBits, int memLevel, int strategy, const char *password, uLong crcForCrypting, int zip64)
Definition: zip.c:1302
int ZEXPORT zipCloseFileInZip(zipFile file)
Definition: zip.c:1751

Referenced by DeleteItems().

◆ CreateViewObject()

STDMETHODIMP CZipFolder::CreateViewObject ( HWND  hwndOwner,
REFIID  riid,
LPVOID ppvOut 
)
override

Definition at line 422 of file CZipFolder.cpp.

423{
424 m_hwnd = hwndOwner ? hwndOwner : m_hwnd;
425
426 static const GUID UnknownIID = // {93F81976-6A0D-42C3-94DD-AA258A155470}
427 {0x93F81976, 0x6A0D, 0x42C3, {0x94, 0xDD, 0xAA, 0x25, 0x8A, 0x15, 0x54, 0x70}};
428 if (riid == IID_IShellView)
429 {
430 SFV_CREATE sfvparams = {sizeof(SFV_CREATE), this};
432
433 HRESULT hr = _CFolderViewCB_CreateInstance(IID_PPV_ARG(IShellFolderViewCB, &pcb));
435 return hr;
436
437 sfvparams.psfvcb = pcb;
438 hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut);
439
440 return hr;
441 }
442 else if (riid == IID_IExplorerCommandProvider)
443 {
445 }
446 else if (riid == IID_IContextMenu)
447 {
448 // Folder context menu
449 return QueryInterface(riid, ppvOut);
450 }
451 else if (riid == IID_IDropTarget)
452 {
453 *ppvOut = static_cast<IDropTarget*>(this);
454 AddRef();
455 return S_OK;
456 }
457 if (UnknownIID != riid)
458 DbgPrint("%s(%S) UNHANDLED\n", __FUNCTION__, guid2string(riid));
459 return E_NOTIMPL;
460}
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:4823
HRESULT _CExplorerCommandProvider_CreateInstance(IContextMenu *zipObject, REFIID riid, LPVOID *ppvOut)
HRESULT _CFolderViewCB_CreateInstance(REFIID riid, LPVOID *ppvOut)
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:30
ULONG AddRef()
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
HRESULT hr
Definition: shlfolder.c:183
struct _SFV_CREATE SFV_CREATE
IShellFolderViewCB * psfvcb
Definition: shlobj.h:1367
#define IID_PPV_ARG(Itype, ppType)

◆ DeleteItems()

HRESULT CZipFolder::DeleteItems ( CComPtr< IDataObject pDataObj)
private

Definition at line 111 of file CZipFolder.cpp.

112{
113
114 CDataObjectHIDA cida(pDataObj);
115 if (!cida || cida->cidl <= 0)
116 return E_FAIL;
117
118 // Get the target paths
119 CAtlList<CStringW> targetPaths;
120 for (UINT iFile = 0; iFile < cida->cidl; ++iFile)
121 {
122 PCUIDLIST_RELATIVE pidlRelative = HIDA_GetPIDLItem(cida, iFile);
123 const ZipPidlEntry* pEntry = _ZipFromIL(pidlRelative);
124 if (pEntry)
125 {
126 CStringW fullPath = m_ZipDir + pEntry->Name;
127 // For folders, end with a slash
128 if (pEntry->ZipType == ZIP_PIDL_DIRECTORY && fullPath.Right(1) != L"/")
129 fullPath += L"/";
130 targetPaths.AddTail(fullPath);
131 }
132 }
133
134 // Create a temporary file
135 WCHAR szTempPath[MAX_PATH], szTempFile[MAX_PATH];
137 GetTempFileNameW(szTempPath, L"ZIP", 0, szTempFile);
138
139 // Close the current handle to work with the ZIP file
140 Close();
141
142 zlib_filefunc64_def ffunc = {};
144
145 HRESULT hr = S_OK;
146 unzFile uf = unzOpen2_64(m_ZipFile, &ffunc);
147 zipFile zf = zipOpen2_64(szTempFile, APPEND_STATUS_CREATE, NULL, &ffunc);
148
149 if (!uf || !zf)
150 {
151 DPRINT1("Cannot open file\n");
152 if (uf) unzClose(uf);
153 if (zf) zipClose(zf, NULL);
154 return E_FAIL;
155 }
156
157 // Scan all entries in the original ZIP
158 if (unzGoToFirstFile(uf) == UNZ_OK)
159 {
160 do
161 {
162 // Read file entry
164 char szNameA[MAX_PATH];
165 if (unzGetCurrentFileInfo64(uf, &info, szNameA, sizeof(szNameA), NULL, 0, NULL, 0) != UNZ_OK)
166 continue;
167
168 // Read extra field
170 if (info.size_file_extra > 0)
171 {
172 extra.SetCount(info.size_file_extra);
173 unzGetCurrentFileInfo64(uf, NULL, NULL, 0, extra.GetData(), info.size_file_extra, NULL, 0);
174 }
175
176 CStringA utf8Name = CZipEnumerator::GetUtf8Name(szNameA, extra.GetData(), (DWORD)extra.GetCount());
177 CStringW currentEntryName;
178 if (utf8Name.GetLength() > 0)
179 currentEntryName = (LPWSTR)CA2WEX<MAX_PATH>(utf8Name, CP_UTF8);
180 else if (info.flag & MINIZIP_UTF8_FLAG)
181 currentEntryName = (LPWSTR)CA2WEX<MAX_PATH>(szNameA, CP_UTF8);
182 else
183 currentEntryName = (LPWSTR)CA2WEX<MAX_PATH>(szNameA, CP_ACP);
184
185 currentEntryName.Replace(L'\\', L'/');
186
187 // Check if it is on the deletion target list
188 bool bSkip = false;
189 POSITION pos = targetPaths.GetHeadPosition();
190 while (pos)
191 {
192 const CStringW& target = targetPaths.GetNext(pos);
193 // Check for an exact match (file) or a prefix match (folder)
194 if (currentEntryName == target || currentEntryName.Left(target.GetLength()) == target)
195 {
196 bSkip = true;
197 break;
198 }
199 }
200
201 if (!bSkip)
202 {
203 // If not to be deleted, copy to new ZIP
204 hr = CopyZipEntry(uf, zf, &info, szNameA);
206 break;
207 }
208 } while (unzGoToNextFile(uf) == UNZ_OK);
209 }
210
211 unzClose(uf);
212 zipClose(zf, NULL);
213
214 // Replace the original file with the temporary file
215 if (SUCCEEDED(hr) && ReplaceFileW(m_ZipFile, szTempFile, NULL, 0, NULL, NULL))
216 {
217 // Notify the shell that the folder contents have changed
219 }
220 else
221 {
222 DPRINT1("Failed to replace file\n");
223 DeleteFileW(szTempFile);
224 hr = E_FAIL;
225 }
226
227 return hr;
228}
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
POSITION AddTail(INARGTYPE element)
Definition: atlcoll.h:629
POSITION GetHeadPosition() const
Definition: atlcoll.h:554
E & GetNext(_Inout_ POSITION &pos)
Definition: atlcoll.h:566
int GetLength() const noexcept
Definition: atlsimpstr.h:362
CStringT Right(int nCount) const
Definition: cstringt.h:788
int Replace(PCXSTR pszOld, PCXSTR pszNew)
Definition: cstringt.h:886
CStringT Left(int nCount) const
Definition: cstringt.h:776
HRESULT CopyZipEntry(unzFile uf, zipFile zf, unz_file_info64 *info, LPCSTR nameA)
Definition: CZipFolder.cpp:230
#define MINIZIP_UTF8_FLAG
Definition: precomp.h:43
#define CP_ACP
Definition: compat.h:109
#define MAX_PATH
Definition: compat.h:34
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
Definition: delete.c:39
BOOL WINAPI ReplaceFileW(LPCWSTR lpReplacedFileName, LPCWSTR lpReplacementFileName, LPCWSTR lpBackupFileName, DWORD dwReplaceFlags, LPVOID lpExclude, LPVOID lpReserved)
Definition: move.c:1090
DWORD WINAPI GetTempPathW(IN DWORD count, OUT LPWSTR path)
Definition: path.c:1999
UINT WINAPI GetTempFileNameW(IN LPCWSTR lpPathName, IN LPCWSTR lpPrefixString, IN UINT uUnique, OUT LPWSTR lpTempFileName)
Definition: filename.c:84
unsigned long DWORD
Definition: ntddk_ex.h:95
PLIST_ENTRY pEntry
Definition: fxioqueue.cpp:4484
#define SUCCEEDED(hr)
Definition: intsafe.h:50
void fill_win32_filefunc64W(zlib_filefunc64_def *pzlib_filefunc_def)
Definition: iowin32.c:457
static char szTempPath[MAX_PATH]
Definition: data.c:16
#define CP_UTF8
Definition: nls.h:20
static PCUIDLIST_RELATIVE HIDA_GetPIDLItem(CIDA const *pida, SIZE_T i)
Definition: shellutils.h:713
#define SHCNE_UPDATEDIR
Definition: shlobj.h:1909
#define SHCNF_IDLIST
Definition: shlobj.h:1929
static CStringA GetUtf8Name(PCSTR originalName, const BYTE *extraField, DWORD extraFieldLen)
Definition: tools.h:99
unzFile ZEXPORT unzOpen2_64(const void *path, zlib_filefunc64_def *pzlib_filefunc_def)
Definition: unzip.c:783
int ZEXPORT unzGoToFirstFile(unzFile file)
Definition: unzip.c:1183
int ZEXPORT unzGoToNextFile(unzFile file)
Definition: unzip.c:1204
voidp unzFile
Definition: unzip.h:70
_In_ ULONG_PTR iFile
Definition: winddi.h:3835
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
int ZEXPORT zipClose(zipFile file, const char *global_comment)
Definition: zip.c:1883
zipFile ZEXPORT zipOpen2_64(const void *pathname, int append, zipcharpc *globalcomment, zlib_filefunc64_def *pzlib_filefunc_def)
Definition: zip.c:938
#define APPEND_STATUS_CREATE
Definition: zip.h:112
voidp zipFile
Definition: zip.h:69

Referenced by DoDeleteItems().

◆ DoDeleteItems()

HRESULT CZipFolder::DoDeleteItems ( CComPtr< IDataObject pDataObj)
private

Definition at line 94 of file CZipFolder.cpp.

95{
99 return S_FALSE;
100
101 HRESULT hr = DeleteItems(pDataObj);
103 {
104 message.LoadString(IDS_CANTDELETEFILE);
106 }
107
108 return hr;
109}
HRESULT DeleteItems(CComPtr< IDataObject > pDataObj)
Definition: CZipFolder.cpp:111
#define IDS_CONFIRMDELETE_TEXT
Definition: resource.h:71
#define IDS_FRIENDLYNAME
Definition: resource.h:76
#define IDS_CANTDELETEFILE
Definition: resource.h:56
static char title[]
Definition: ps.c:92
Definition: tftpd.h:60
#define S_FALSE
Definition: winerror.h:3451
int WINAPI MessageBoxW(_In_opt_ HWND hWnd, _In_opt_ LPCWSTR lpText, _In_opt_ LPCWSTR lpCaption, _In_ UINT uType)
#define MB_ICONERROR
Definition: winuser.h:798
#define MB_ICONWARNING
Definition: winuser.h:797
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define IDYES
Definition: winuser.h:846
#define MB_YESNOCANCEL
Definition: winuser.h:829

Referenced by InvokeCommand(), and ZipFolderMenuCallback().

◆ DragEnter()

STDMETHODIMP CZipFolder::DragEnter ( IDataObject pDataObj,
DWORD  grfKeyState,
POINTL  pt,
DWORD pdwEffect 
)
override

Implements IDropTarget.

Definition at line 810 of file CZipFolder.cpp.

811{
812 *pdwEffect &= DROPEFFECT_COPY;
813 return S_OK;
814}
const DWORD DROPEFFECT_COPY
Definition: oleidl.idl:930

◆ DragLeave()

STDMETHODIMP CZipFolder::DragLeave ( void  )
override

Implements IDropTarget.

Definition at line 822 of file CZipFolder.cpp.

823{
824 return S_OK;
825}

◆ DragOver()

STDMETHODIMP CZipFolder::DragOver ( DWORD  grfKeyState,
POINTL  pt,
DWORD pdwEffect 
)
override

Implements IDropTarget.

Definition at line 816 of file CZipFolder.cpp.

817{
818 *pdwEffect &= DROPEFFECT_COPY;
819 return S_OK;
820}

◆ Drop()

STDMETHODIMP CZipFolder::Drop ( IDataObject pDataObj,
DWORD  grfKeyState,
POINTL  pt,
DWORD pdwEffect 
)
override

Implements IDropTarget.

Definition at line 827 of file CZipFolder.cpp.

828{
829 STGMEDIUM sm;
830 FORMATETC fe = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
831 HRESULT hr = pDataObj->GetData(&fe, &sm);
833 return hr;
834
835 HDROP hDrop = (HDROP)GlobalLock(sm.hGlobal);
836 if (hDrop)
837 {
838 // Close the ZIP file before appending (it will be automatically
839 // reopened next time getZip() is called)
840 Close();
841
842 // Create creator
844
845 pCreator->SetNotifyPidl(m_CurDir);
846
847 // Add dropped files
848 UINT fileCount = DragQueryFileW(hDrop, 0xFFFFFFFF, NULL, 0);
849 for (UINT i = 0; i < fileCount; i++)
850 {
853 pCreator->DoAddItem(szFilePath);
854 }
855
856 CZipCreator::runThread(pCreator);
857
858 GlobalUnlock(sm.hGlobal);
859 *pdwEffect = DROPEFFECT_COPY;
860 }
861 ReleaseStgMedium(&sm);
862
863 return S_OK;
864}
#define CF_HDROP
Definition: constants.h:410
static BOOL runThread(CZipCreator *pCreator)
static CZipCreator * DoCreate(PCWSTR pszExistingZip=NULL, PCWSTR pszTargetDir=NULL)
void SetNotifyPidl(PCIDLIST_ABSOLUTE pidl)
Definition: CZipCreator.hpp:26
virtual void DoAddItem(PCWSTR pszFile)
void WINAPI ReleaseStgMedium(STGMEDIUM *pmedium)
Definition: ole2.c:2033
UINT WINAPI DragQueryFileW(HDROP hDrop, UINT lFile, LPWSTR lpszwFile, UINT lLength)
Definition: shellole.c:666
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
HRESULT GetData([in, unique] FORMATETC *pformatetcIn, [out] STGMEDIUM *pmedium)
static ERESOURCE GlobalLock
Definition: sys_arch.c:8
static WCHAR szFilePath[]
Definition: qotd.c:14

◆ EnumObjects()

STDMETHODIMP CZipFolder::EnumObjects ( HWND  hwndOwner,
DWORD  dwFlags,
LPENUMIDLIST *  ppEnumIDList 
)
inlineoverride

Definition at line 105 of file CZipFolder.hpp.

106 {
108 }
HRESULT _CEnumZipContents_CreateInstance(IZip *zip, DWORD flags, PCWSTR prefix, REFIID riid, LPVOID *ppvOut)
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141

◆ EnumSearches()

STDMETHODIMP CZipFolder::EnumSearches ( IEnumExtraSearch **  ppenum)
inlineoverride

Implements IShellFolder2.

Definition at line 73 of file CZipFolder.hpp.

74 {
76 return E_NOTIMPL;
77 }

◆ GetAttributesOf()

STDMETHODIMP CZipFolder::GetAttributesOf ( UINT  cidl,
PCUITEMID_CHILD_ARRAY  apidl,
DWORD rgfInOut 
)
override

Definition at line 462 of file CZipFolder.cpp.

463{
464 if (!rgfInOut || !cidl || !apidl)
465 return E_INVALIDARG;
466
467 *rgfInOut = 0;
468
469 //static DWORD dwFileAttrs = SFGAO_STREAM | SFGAO_HASPROPSHEET | SFGAO_CANDELETE | SFGAO_CANCOPY | SFGAO_CANMOVE;
470 //static DWORD dwFolderAttrs = SFGAO_FOLDER | SFGAO_DROPTARGET | SFGAO_HASPROPSHEET | SFGAO_CANDELETE | SFGAO_STORAGE | SFGAO_CANCOPY | SFGAO_CANMOVE;
471 static DWORD dwFileAttrs = SFGAO_CANDELETE | SFGAO_STREAM;
472 static DWORD dwFolderAttrs = SFGAO_CANDELETE | SFGAO_FOLDER | SFGAO_HASSUBFOLDER | SFGAO_BROWSABLE | SFGAO_DROPTARGET;
473
474 while (cidl > 0 && *apidl)
475 {
476 const ZipPidlEntry* zipEntry = _ZipFromIL(*apidl);
477
478 if (zipEntry)
479 {
480 if (zipEntry->ZipType == ZIP_PIDL_FILE)
481 *rgfInOut |= dwFileAttrs;
482 else
483 *rgfInOut |= dwFolderAttrs;
484 }
485 else
486 {
487 *rgfInOut = 0;
488 }
489
490 apidl++;
491 cidl--;
492 }
493
494 *rgfInOut &= ~SFGAO_FILESYSTEM;
495 *rgfInOut &= ~SFGAO_VALIDATE;
496 return S_OK;
497}
@ ZIP_PIDL_FILE
Definition: zippidl.hpp:13

◆ GetClassID()

STDMETHODIMP CZipFolder::GetClassID ( CLSID lpClassId)
inlineoverride

Implements IPersist.

Definition at line 168 of file CZipFolder.hpp.

169 {
171 return S_OK;
172 }
EXTERN_C const GUID CLSID_ZipFolderStorageHandler
Definition: precomp.h:28

◆ GetCommandString()

STDMETHODIMP CZipFolder::GetCommandString ( UINT_PTR  idCmd,
UINT  uFlags,
UINT pwReserved,
LPSTR  pszName,
UINT  cchMax 
)
override

Implements IContextMenu.

Definition at line 630 of file CZipFolder.cpp.

631{
632 if (idCmd != 0)
633 return E_INVALIDARG;
634
635 switch (uFlags)
636 {
637 case GCS_VERBA:
638 return StringCchCopyA(pszName, cchMax, EXTRACT_VERBA);
639 case GCS_VERBW:
640 return StringCchCopyW((PWSTR)pszName, cchMax, EXTRACT_VERBW);
641 case GCS_HELPTEXTA:
642 {
644 return StringCchCopyA(pszName, cchMax, helpText);
645 }
646 case GCS_HELPTEXTW:
647 {
649 return StringCchCopyW((PWSTR)pszName, cchMax, helpText);
650 }
651 case GCS_VALIDATEA:
652 case GCS_VALIDATEW:
653 return S_OK;
654 }
655
656 return E_INVALIDARG;
657}
UINT cchMax
#define EXTRACT_VERBA
Definition: precomp.h:25
#define EXTRACT_VERBW
Definition: precomp.h:26
#define IDS_HELPTEXT
Definition: resource.h:75
UINT uFlags
Definition: api.c:59
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
STRSAFEAPI StringCchCopyA(STRSAFE_LPSTR pszDest, size_t cchDest, STRSAFE_LPCSTR pszSrc)
Definition: strsafe.h:145
#define MAKEINTRESOURCEA(i)
Definition: winuser.h:581

◆ GetCurFile()

STDMETHODIMP CZipFolder::GetCurFile ( LPOLESTR ppszFileName)
override

Implements IPersistFile.

Definition at line 792 of file CZipFolder.cpp.

793{
794 if (!ppszFileName)
795 return E_INVALIDARG;
796
797 *ppszFileName = NULL;
798
799 if (m_ZipFile.IsEmpty())
800 return S_FALSE;
801
802 *ppszFileName = (LPOLESTR)CoTaskMemAlloc((m_ZipFile.GetLength() + 1) * sizeof(WCHAR));
803 if (!*ppszFileName)
804 return E_OUTOFMEMORY;
805
806 wcscpy(*ppszFileName, m_ZipFile);
807 return S_OK;
808}
bool IsEmpty() const noexcept
Definition: atlsimpstr.h:394
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426
static LPOLESTR
Definition: stg_prop.c:27
wcscpy

◆ GetCurFolder()

STDMETHODIMP CZipFolder::GetCurFolder ( PIDLIST_ABSOLUTE pidl)
inlineoverride

Implements IPersistFolder2.

Definition at line 158 of file CZipFolder.hpp.

159 {
160 *pidl = ILClone(m_CurDir);
161 return S_OK;
162 }
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:238

◆ GetDefaultColumn()

STDMETHODIMP CZipFolder::GetDefaultColumn ( DWORD  dwRes,
ULONG pSort,
ULONG pDisplay 
)
inlineoverride

Implements IShellFolder2.

Definition at line 78 of file CZipFolder.hpp.

79 {
80 if (pSort)
81 *pSort = COL_NAME;
82 if (pDisplay)
83 *pDisplay = COL_NAME;
84 return S_OK;
85 }
@ COL_NAME
Definition: CZipFolder.hpp:13

◆ GetDefaultColumnState()

STDMETHODIMP CZipFolder::GetDefaultColumnState ( UINT  iColumn,
DWORD pcsFlags 
)
override

Implements IShellFolder2.

Definition at line 279 of file CZipFolder.cpp.

280{
281 if (!pcsFlags || iColumn >= _countof(g_ColumnDefs))
282 return E_INVALIDARG;
283 *pcsFlags = g_ColumnDefs[iColumn].dwDefaultState;
284 return S_OK;
285}
static FolderViewColumns g_ColumnDefs[]
Definition: CFontExt.cpp:34
#define _countof(array)
Definition: sndvol32.h:70
DWORD dwDefaultState
Definition: CFontExt.cpp:20

◆ GetDefaultSearchGUID()

STDMETHODIMP CZipFolder::GetDefaultSearchGUID ( GUID pguid)
inlineoverride

Implements IShellFolder2.

Definition at line 68 of file CZipFolder.hpp.

69 {
71 return E_NOTIMPL;
72 }

◆ GetDetailsEx()

STDMETHODIMP CZipFolder::GetDetailsEx ( PCUITEMID_CHILD  pidl,
const SHCOLUMNID pscid,
VARIANT pv 
)
inlineoverride

Implements IShellFolder2.

Definition at line 87 of file CZipFolder.hpp.

88 {
90 return E_NOTIMPL;
91 }

◆ GetDetailsOf()

STDMETHODIMP CZipFolder::GetDetailsOf ( PCUITEMID_CHILD  pidl,
UINT  iColumn,
SHELLDETAILS psd 
)
override

Implements IShellFolder2.

Definition at line 287 of file CZipFolder.cpp.

288{
289 if (iColumn >= _countof(g_ColumnDefs))
290 return E_FAIL;
291
292 psd->cxChar = g_ColumnDefs[iColumn].cxChar;
293 psd->fmt = g_ColumnDefs[iColumn].fmt;
294
295 if (pidl == NULL)
296 {
297 return SHSetStrRet(&psd->str, _AtlBaseModule.GetResourceInstance(), g_ColumnDefs[iColumn].iResource);
298 }
299
300 PCUIDLIST_RELATIVE curpidl = ILGetNext(pidl);
301 if (curpidl->mkid.cb != 0)
302 {
303 DPRINT1("ERROR, unhandled PIDL!\n");
304 return E_FAIL;
305 }
306
307 const ZipPidlEntry* zipEntry = _ZipFromIL(pidl);
308 if (!zipEntry)
309 return E_INVALIDARG;
310
311 WCHAR Buffer[100];
312 bool isDir = zipEntry->ZipType == ZIP_PIDL_DIRECTORY;
313 switch (iColumn)
314 {
315 case COL_NAME:
316 return GetDisplayNameOf(pidl, 0, &psd->str);
317 case COL_TYPE:
318 {
319 SHFILEINFOW shfi;
321 ULONG_PTR firet = SHGetFileInfoW(zipEntry->Name, dwAttributes, &shfi, sizeof(shfi), SHGFI_USEFILEATTRIBUTES | SHGFI_TYPENAME);
322 if (!firet)
323 return E_FAIL;
324 return SHSetStrRet(&psd->str, shfi.szTypeName);
325 }
326 case COL_COMPRSIZE:
327 case COL_SIZE:
328 {
329 if (isDir)
330 return SHSetStrRet(&psd->str, L"");
331
332 ULONG64 Size = iColumn == COL_COMPRSIZE ? zipEntry->CompressedSize : zipEntry->UncompressedSize;
334 return E_FAIL;
335 return SHSetStrRet(&psd->str, Buffer);
336 }
337 case COL_PASSWORD:
338 if (isDir)
339 return SHSetStrRet(&psd->str, L"");
340 return SHSetStrRet(&psd->str, _AtlBaseModule.GetResourceInstance(), zipEntry->Password ? IDS_YES : IDS_NO);
341 case COL_RATIO:
342 {
343 if (isDir)
344 return SHSetStrRet(&psd->str, L"");
345
346 int ratio = 0;
347 if (zipEntry->UncompressedSize)
348 ratio = 100 - (int)((zipEntry->CompressedSize*100)/zipEntry->UncompressedSize);
349 StringCchPrintfW(Buffer, _countof(Buffer), L"%d%%", ratio);
350 return SHSetStrRet(&psd->str, Buffer);
351 }
352 case COL_DATE_MOD:
353 {
354 if (isDir)
355 return SHSetStrRet(&psd->str, L"");
356 FILETIME ftLocal;
357 DosDateTimeToFileTime((WORD)(zipEntry->DosDate>>16), (WORD)zipEntry->DosDate, &ftLocal);
358 if (!_GetFileTimeString(&ftLocal, Buffer, _countof(Buffer)))
359 return E_FAIL;
360 return SHSetStrRet(&psd->str, Buffer);
361 }
362 }
363
365 return E_NOTIMPL;
366}
@ COL_COMPRSIZE
Definition: CZipFolder.hpp:15
@ COL_PASSWORD
Definition: CZipFolder.hpp:16
@ COL_RATIO
Definition: CZipFolder.hpp:18
@ COL_DATE_MOD
Definition: CZipFolder.hpp:19
@ COL_TYPE
Definition: CZipFolder.hpp:14
@ COL_SIZE
Definition: CZipFolder.hpp:17
#define IDS_YES
Definition: resource.h:16
#define IDS_NO
Definition: resource.h:17
Definition: bufpool.h:45
STDMETHODIMP GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
Definition: CZipFolder.cpp:611
BOOL _GetFileTimeString(LPFILETIME lpFileTime, PWSTR pwszResult, UINT cchResult)
Definition: CZipFolder.cpp:66
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
BOOL WINAPI DosDateTimeToFileTime(IN WORD wFatDate, IN WORD wFatTime, OUT LPFILETIME lpFileTime)
Definition: time.c:75
LPWSTR WINAPI StrFormatByteSizeW(LONGLONG llBytes, LPWSTR lpszDest, UINT cchMax)
Definition: string.c:2524
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned __int64 ULONG64
Definition: imports.h:198
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
Definition: shell32_main.c:430
#define SHGFI_TYPENAME
Definition: shellapi.h:167
#define SHGFI_USEFILEATTRIBUTES
Definition: shellapi.h:181
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
STRRET str
Definition: shtypes.idl:108
ULONG64 UncompressedSize
Definition: zippidl.hpp:25
BOOLEAN Password
Definition: zippidl.hpp:21
ULONG DosDate
Definition: zippidl.hpp:26
ULONG64 CompressedSize
Definition: zippidl.hpp:24
WCHAR szTypeName[80]
Definition: shellapi.h:388
uint32_t ULONG_PTR
Definition: typedefs.h:65
DWORD dwAttributes
Definition: vdmdbg.h:34
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539

◆ GetDisplayNameOf()

STDMETHODIMP CZipFolder::GetDisplayNameOf ( PCUITEMID_CHILD  pidl,
DWORD  dwFlags,
LPSTRRET  strRet 
)
override

Definition at line 611 of file CZipFolder.cpp.

612{
613 if (!pidl)
614 return S_FALSE;
615
616 PCUIDLIST_RELATIVE curpidl = ILGetNext(pidl);
617 if (curpidl->mkid.cb != 0)
618 {
619 DPRINT1("ERROR, unhandled PIDL!\n");
620 return E_FAIL;
621 }
622
623 const ZipPidlEntry* zipEntry = _ZipFromIL(pidl);
624 if (!zipEntry)
625 return E_FAIL;
626
627 return SHSetStrRet(strRet, zipEntry->Name);
628}

Referenced by GetDetailsOf().

◆ GetUIObjectOf()

STDMETHODIMP CZipFolder::GetUIObjectOf ( HWND  hwndOwner,
UINT  cidl,
PCUITEMID_CHILD_ARRAY  apidl,
REFIID  riid,
UINT prgfInOut,
LPVOID ppvOut 
)
override

Definition at line 566 of file CZipFolder.cpp.

567{
568 m_hwnd = hwndOwner ? hwndOwner : m_hwnd;
569 if ((riid == IID_IExtractIconA || riid == IID_IExtractIconW) && cidl == 1)
570 {
571 const ZipPidlEntry* zipEntry = _ZipFromIL(*apidl);
572 if (zipEntry)
573 {
575 return SHCreateFileExtractIconW(zipEntry->Name, dwAttributes, riid, ppvOut);
576 }
577 }
578 else if (riid == IID_IContextMenu && cidl >= 0)
579 {
580 // Context menu of an object inside the zip
581 const ZipPidlEntry* zipEntry = _ZipFromIL(*apidl);
582 if (zipEntry)
583 {
584 HKEY keys[1] = {0};
585 int nkeys = 0;
586 if (zipEntry->ZipType == ZIP_PIDL_DIRECTORY)
587 {
589 if (res != ERROR_SUCCESS)
590 return E_FAIL;
591 nkeys++;
592 }
593 return CDefFolderMenu_Create2(NULL, hwndOwner, cidl, apidl, this, ZipFolderMenuCallback, nkeys, keys, (IContextMenu**)ppvOut);
594 }
595 }
596 else if (riid == IID_IDataObject && cidl >= 1)
597 {
598 return CIDLData_CreateFromIDArray(m_CurDir, cidl, apidl, (IDataObject**)ppvOut);
599 }
600 else if (riid == IID_IDropTarget)
601 {
602 AddRef();
603 *ppvOut = static_cast<IDropTarget*>(this);
604 return S_OK;
605 }
606
607 DbgPrint("%s(%S) UNHANDLED\n", __FUNCTION__ , guid2string(riid));
608 return E_NOINTERFACE;
609}
HRESULT WINAPI CDefFolderMenu_Create2(PCIDLIST_ABSOLUTE pidlFolder, HWND hwnd, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, IShellFolder *psf, LPFNDFMCALLBACK lpfn, UINT nKeys, const HKEY *ahkeyClsKeys, IContextMenu **ppcm)
EXTERN_C HRESULT WINAPI SHCreateFileExtractIconW(_In_ LPCWSTR pszFile, _In_ DWORD dwFileAttributes, _In_ REFIID riid, _Outptr_ void **ppv)
static HRESULT CALLBACK ZipFolderMenuCallback(IShellFolder *psf, HWND hwnd, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: CZipFolder.cpp:499
#define ERROR_SUCCESS
Definition: deptool.c:10
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
const UINT * keys
Definition: locale.c:416
GLuint res
Definition: glext.h:9613
#define KEY_READ
Definition: nt_native.h:1026
#define KEY_QUERY_VALUE
Definition: nt_native.h:1019
const GUID IID_IDataObject
HRESULT WINAPI CIDLData_CreateFromIDArray(PCIDLIST_ABSOLUTE pidlFolder, UINT cpidlFiles, PCUIDLIST_RELATIVE_ARRAY lppidlFiles, LPDATAOBJECT *ppdataObject)
Definition: shellord.c:2419
#define E_NOINTERFACE
Definition: winerror.h:3479
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10

◆ Initialize() [1/3]

STDMETHODIMP CZipFolder::Initialize ( PCIDLIST_ABSOLUTE  pidl)
override

Implements IPersistFolder.

Definition at line 749 of file CZipFolder.cpp.

750{
751 WCHAR tmpPath[MAX_PATH];
752
753 if (SHGetPathFromIDListW(pidl, tmpPath))
754 {
755 m_ZipFile = tmpPath;
756 m_CurDir.Attach(ILClone(pidl));
757 return S_OK;
758 }
759 DbgPrint("%s() => Unable to parse pidl\n", __FUNCTION__);
760 return E_INVALIDARG;
761}
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1496

◆ Initialize() [2/3]

STDMETHODIMP CZipFolder::Initialize ( PCIDLIST_ABSOLUTE  pidlFolder,
LPDATAOBJECT  pDataObj,
HKEY  hkeyProgID 
)
override

Definition at line 704 of file CZipFolder.cpp.

705{
706 FORMATETC etc = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
707 STGMEDIUM stg;
708
709 HRESULT hr = pDataObj->GetData(&etc, &stg);
711 return hr;
712
713 hr = E_FAIL;
714 HDROP hdrop = (HDROP)GlobalLock(stg.hGlobal);
715 if (hdrop)
716 {
717 UINT uNumFiles = DragQueryFileW(hdrop, 0xFFFFFFFF, NULL, 0);
718 if (uNumFiles == 1)
719 {
720 WCHAR szFile[MAX_PATH * 2];
721 if (DragQueryFileW(hdrop, 0, szFile, _countof(szFile)))
722 {
724 hr = SHParseDisplayName(szFile, NULL, &pidl, 0, NULL);
726 {
727 hr = Initialize(pidl);
728 }
729 }
730 else
731 {
732 DbgPrint("Failed to query the file.\r\n");
733 }
734 }
735 else
736 {
737 DbgPrint("Invalid number of files: %d\r\n", uNumFiles);
738 }
739 GlobalUnlock(stg.hGlobal);
740 }
741 else
742 {
743 DbgPrint("Could not lock stg.hGlobal\r\n");
744 }
745 ReleaseStgMedium(&stg);
746 return hr;
747}
HRESULT WINAPI SHParseDisplayName(LPCWSTR pszName, IBindCtx *pbc, LPITEMIDLIST *ppidl, SFGAOF sfgaoIn, SFGAOF *psfgaoOut)
Definition: pidl.c:1548
static void Initialize()
Definition: xlate.c:212

◆ Initialize() [3/3]

HRESULT CZipFolder::Initialize ( PCWSTR  zipFile,
PCWSTR  zipDir,
PCUIDLIST_ABSOLUTE  curDir,
PCUIDLIST_RELATIVE  pidl 
)

Definition at line 45 of file CZipFolder.cpp.

46{
48 m_ZipDir = zipDir;
49
50 m_CurDir.Attach(ILCombine(curDir, pidl));
51 return S_OK;
52}
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:817

◆ InvokeCommand()

STDMETHODIMP CZipFolder::InvokeCommand ( LPCMINVOKECOMMANDINFO  pici)
override

Implements IContextMenu.

Definition at line 659 of file CZipFolder.cpp.

660{
661 if (!pici || (pici->cbSize != sizeof(CMINVOKECOMMANDINFO) && pici->cbSize != sizeof(CMINVOKECOMMANDINFOEX)))
662 return E_INVALIDARG;
663
664 if (pici->lpVerb == MAKEINTRESOURCEA(0) ||
665 (!IS_INTRESOURCE(pici->lpVerb) && !strcmp(pici->lpVerb, EXTRACT_VERBA)))
666 {
667 BSTR ZipFile = m_ZipFile.AllocSysString();
669
670 DWORD tid;
672 if (hThread)
673 {
675 return S_OK;
676 }
677 }
678
679 if (pici->lpVerb == MAKEINTRESOURCEA(DFM_CMD_DELETE) ||
680 (!IS_INTRESOURCE(pici->lpVerb) && !strcmp(pici->lpVerb, "delete")))
681 {
683 }
684
685 return E_INVALIDARG;
686}
LONG g_ModuleRefCnt
Definition: ACPPage.cpp:13
#define InterlockedIncrement
Definition: armddk.h:53
BSTR AllocSysString() const
Definition: cstringt.h:1063
HRESULT DoDeleteItems(CComPtr< IDataObject > pDataObj)
Definition: CZipFolder.cpp:94
CComPtr< IDataObject > m_pDataObj
Definition: CZipFolder.hpp:46
static DWORD WINAPI s_ExtractProc(LPVOID arg)
Definition: CZipFolder.cpp:54
#define CloseHandle
Definition: compat.h:739
OLECHAR * BSTR
Definition: compat.h:2293
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
#define IS_INTRESOURCE(x)
Definition: loader.c:613
_ACRTIMP int __cdecl strcmp(const char *, const char *)
Definition: string.c:3319
static TfClientId tid
struct IContextMenu::tagCMINVOKECOMMANDINFO CMINVOKECOMMANDINFO
struct IContextMenu::tagCMInvokeCommandInfoEx CMINVOKECOMMANDINFOEX
HANDLE hThread
Definition: wizard.c:28
#define DFM_CMD_DELETE
Definition: shlobj.h:2616

◆ IsDirty()

STDMETHODIMP CZipFolder::IsDirty ( void  )
override

Implements IPersistFile.

Definition at line 763 of file CZipFolder.cpp.

764{
765 return S_FALSE;
766}

◆ Load()

STDMETHODIMP CZipFolder::Load ( LPCOLESTR  pszFileName,
DWORD  dwMode 
)
override

Implements IPersistFile.

Definition at line 768 of file CZipFolder.cpp.

769{
771
774 if (SUCCEEDED(hr))
775 {
776 m_CurDir.Attach(pidl.Detach());
777 }
778
779 return S_OK;
780}
T * Detach()
Definition: atlalloc.h:168
WORD WORD PSZ PSZ pszFileName
Definition: vdmdbg.h:44

◆ MapColumnToSCID()

STDMETHODIMP CZipFolder::MapColumnToSCID ( UINT  column,
SHCOLUMNID pscid 
)
inlineoverride

Implements IShellFolder2.

Definition at line 93 of file CZipFolder.hpp.

94 {
96 return E_NOTIMPL;
97 }

◆ ParseDisplayName()

STDMETHODIMP CZipFolder::ParseDisplayName ( HWND  hwndOwner,
LPBC  pbc,
LPOLESTR  lpszDisplayName,
ULONG pchEaten,
PIDLIST_RELATIVE ppidl,
ULONG pdwAttributes 
)
inlineoverride

Implements IShellFolder.

Definition at line 100 of file CZipFolder.hpp.

101 {
103 return E_NOTIMPL;
104 }

◆ QueryContextMenu()

STDMETHODIMP CZipFolder::QueryContextMenu ( HMENU  hmenu,
UINT  indexMenu,
UINT  idCmdFirst,
UINT  idCmdLast,
UINT  uFlags 
)
override

Implements IContextMenu.

Definition at line 688 of file CZipFolder.cpp.

689{
690 UINT idCmd = idCmdFirst;
691
692 if (!(uFlags & CMF_DEFAULTONLY))
693 {
695
696 if (indexMenu)
697 InsertMenuW(hmenu, indexMenu++, MF_BYPOSITION | MF_SEPARATOR, 0, NULL);
698 InsertMenuW(hmenu, indexMenu++, MF_BYPOSITION | MF_STRING, idCmd++, menuText); // Command 0
699 }
700
701 return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, idCmd - idCmdFirst);
702}
#define IDS_MENUITEM
Definition: resource.h:74
#define MAKE_HRESULT(sev, fac, code)
Definition: dmerror.h:29
static HMENU hmenu
Definition: win.c:66
#define FACILITY_NULL
Definition: winerror.h:24
#define SEVERITY_SUCCESS
Definition: winerror.h:177
BOOL WINAPI InsertMenuW(_In_ HMENU, _In_ UINT, _In_ UINT, _In_ UINT_PTR, _In_opt_ LPCWSTR)
#define MF_STRING
Definition: winuser.h:138
#define MF_SEPARATOR
Definition: winuser.h:137
#define MF_BYPOSITION
Definition: winuser.h:203

◆ s_ExtractProc()

DWORD WINAPI CZipFolder::s_ExtractProc ( LPVOID  arg)
staticprivate

Definition at line 54 of file CZipFolder.cpp.

55{
56 CComBSTR ZipFile;
57 ZipFile.Attach((BSTR)arg);
58
60
62 return 0;
63}
void _CZipExtract_runWizard(PCWSTR Filename)
#define InterlockedDecrement
Definition: armddk.h:52
void Attach(BSTR bstr)
Definition: atlcomcli.h:379

Referenced by InvokeCommand().

◆ Save()

STDMETHODIMP CZipFolder::Save ( LPCOLESTR  pszFileName,
BOOL  fRemember 
)
override

Implements IPersistFile.

Definition at line 782 of file CZipFolder.cpp.

783{
784 return E_NOTIMPL;
785}

◆ SaveCompleted()

STDMETHODIMP CZipFolder::SaveCompleted ( LPCOLESTR  pszFileName)
override

Implements IPersistFile.

Definition at line 787 of file CZipFolder.cpp.

788{
789 return S_OK;
790}

◆ SetNameOf()

STDMETHODIMP CZipFolder::SetNameOf ( HWND  hwndOwner,
PCUITEMID_CHILD  pidl,
LPCOLESTR  lpName,
DWORD  dwFlags,
PITEMID_CHILD pPidlOut 
)
inlineoverride

Implements IShellFolder.

Definition at line 120 of file CZipFolder.hpp.

121 {
123 return E_NOTIMPL;
124 }

◆ STDMETHODIMP_()

CZipFolder::STDMETHODIMP_ ( unzFile  )
virtual

Reimplemented from IZip.

◆ ZipFolderMenuCallback()

HRESULT CALLBACK CZipFolder::ZipFolderMenuCallback ( IShellFolder psf,
HWND  hwnd,
IDataObject pdtobj,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)
staticprivate

Definition at line 499 of file CZipFolder.cpp.

502{
503 CZipFolder* pThis = static_cast<CZipFolder*>(psf);
504 if (!pThis)
505 return E_FAIL;
506
507 pThis->m_pDataObj = pdtobj;
508
509 switch (uMsg)
510 {
512 {
513 CComQIIDPtr<I_ID(IContextMenu)> spContextMenu(psf);
514 if (!spContextMenu)
515 {
516 DPRINT1("E_NOINTERFACE\n");
517 return E_NOINTERFACE;
518 }
519
520 QCMINFO *pqcminfo = (QCMINFO *)lParam;
521 HRESULT hr = spContextMenu->QueryContextMenu(pqcminfo->hmenu,
522 pqcminfo->indexMenu,
523 pqcminfo->idCmdFirst,
524 pqcminfo->idCmdLast,
525 CMF_NORMAL);
527 return hr;
528
529 pqcminfo->idCmdFirst += HRESULT_CODE(hr);
530 return S_OK;
531 }
533 return E_NOTIMPL;
535 {
536 if (wParam == DFM_CMD_DELETE)
537 return pThis->DoDeleteItems(pdtobj);
538
539 CComQIIDPtr<I_ID(IContextMenu)> spContextMenu(psf);
540 if (!spContextMenu)
541 {
542 DPRINT1("E_NOINTERFACE\n");
543 return E_NOINTERFACE;
544 }
545
546 CMINVOKECOMMANDINFO ici = { sizeof(ici) };
547 ici.hwnd = hwnd;
548 ici.lpVerb = (LPSTR)wParam;
549 ici.nShow = SW_SHOWNORMAL;
550
551 return spContextMenu->InvokeCommand(&ici);
552 }
553 case DFM_GETDEFSTATICID: // Required for Windows 7 to pick a default
554 return S_FALSE;
555 case DFM_WM_INITMENUPOPUP: // FIXME: Make it effective in `CDefViewBckgrndMenu`
556 {
557 // Disable [Paste] / [Paste link] menu items
560 break;
561 }
562 }
563 return E_NOTIMPL;
564}
#define I_ID(Itype)
Definition: atlcomcli.h:215
WPARAM wParam
Definition: combotst.c:138
#define DFM_GETDEFSTATICID
Definition: precomp.h:47
#define DFM_INVOKECOMMANDEX
Definition: precomp.h:46
#define DFM_MERGECONTEXTMENU
Definition: precomp.h:44
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
#define DFM_WM_INITMENUPOPUP
Definition: shlobj.h:2605
#define FCIDM_SHVIEW_INSERTLINK
Definition: shresdef.h:875
#define FCIDM_SHVIEW_INSERT
Definition: shresdef.h:873
HMENU hmenu
Definition: shlobj.h:1397
UINT idCmdLast
Definition: shlobj.h:1400
UINT idCmdFirst
Definition: shlobj.h:1399
UINT indexMenu
Definition: shlobj.h:1398
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define HRESULT_CODE(hr)
Definition: winerror.h:188
#define SW_SHOWNORMAL
Definition: winuser.h:781
#define MF_BYCOMMAND
Definition: winuser.h:202
BOOL WINAPI EnableMenuItem(_In_ HMENU, _In_ UINT, _In_ UINT)
#define MF_GRAYED
Definition: winuser.h:129
char * LPSTR
Definition: xmlstorage.h:182

Referenced by GetUIObjectOf().

Member Data Documentation

◆ m_CurDir

CComHeapPtr<ITEMIDLIST> CZipFolder::m_CurDir
private

◆ m_hwnd

HWND CZipFolder::m_hwnd = nullptr
private

Definition at line 47 of file CZipFolder.hpp.

Referenced by CreateViewObject(), DoDeleteItems(), and GetUIObjectOf().

◆ m_pDataObj

CComPtr<IDataObject> CZipFolder::m_pDataObj
private

Definition at line 46 of file CZipFolder.hpp.

Referenced by InvokeCommand(), and ZipFolderMenuCallback().

◆ m_UnzipFile

unzFile CZipFolder::m_UnzipFile = nullptr
private

Definition at line 45 of file CZipFolder.hpp.

Referenced by Close(), and STDMETHODIMP_().

◆ m_ZipDir

CStringW CZipFolder::m_ZipDir
private

Definition at line 43 of file CZipFolder.hpp.

Referenced by BindToObject(), DeleteItems(), Drop(), EnumObjects(), and Initialize().

◆ m_ZipFile

CStringW CZipFolder::m_ZipFile
private

The documentation for this class was generated from the following files: