ReactOS 0.4.17-dev-470-gf9e3448
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 42 of file CZipFolder.hpp.

Constructor & Destructor Documentation

◆ CZipFolder()

CZipFolder::CZipFolder ( )

Definition at line 49 of file CZipFolder.cpp.

50{
51}

◆ ~CZipFolder()

CZipFolder::~CZipFolder ( )

Definition at line 53 of file CZipFolder.cpp.

54{
55 Close();
56}
void Close()
Definition: CZipFolder.cpp:58

Member Function Documentation

◆ _GetFileTimeString()

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

Definition at line 93 of file CZipFolder.cpp.

94{
95 SYSTEMTIME st;
96
97 if (!FileTimeToSystemTime(lpFileTime, &st))
98 return FALSE;
99
100 size_t cchRemaining = cchResult;
101 PWSTR pwszEnd = pwszResult;
102 int cchWritten = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, pwszEnd, cchRemaining);
103 if (cchWritten)
104 --cchWritten; // GetDateFormatW returns count with terminating zero
105 else
106 return FALSE;
107 cchRemaining -= cchWritten;
108 pwszEnd += cchWritten;
109
110 StringCchCopyExW(pwszEnd, cchRemaining, L" ", &pwszEnd, &cchRemaining, 0);
111
112 cchWritten = GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &st, NULL, pwszEnd, cchRemaining);
113 if (cchWritten)
114 --cchWritten; // GetTimeFormatW returns count with terminating zero
115 else
116 return FALSE;
117
118 return TRUE;
119}
#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:183
#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:216

Referenced by GetDetailsOf().

◆ BindToObject()

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

Definition at line 488 of file CZipFolder.cpp.

489{
490 if (riid == IID_IShellFolder)
491 {
492 CStringW newZipDir = m_ZipDir;
493 PCUIDLIST_RELATIVE curpidl = pidl;
494 while (curpidl->mkid.cb)
495 {
496 const ZipPidlEntry* zipEntry = _ZipFromIL(curpidl);
497 if (!zipEntry)
498 {
499 return E_FAIL;
500 }
501 newZipDir += zipEntry->Name;
502 newZipDir += L'/';
503
504 curpidl = ILGetNext(curpidl);
505 }
506 return ShellObjectCreatorInit<CZipFolder>(m_ZipFile, newZipDir, m_CurDir, pidl, riid, ppvOut);
507 }
508 DbgPrint("%s(%S) UNHANDLED\n", __FUNCTION__, guid2string(riid));
509 return E_NOTIMPL;
510}
WCHAR * guid2string(REFCLSID iid)
Definition: Debug.cpp:21
CStringW m_ZipFile
Definition: CZipFolder.hpp:54
CComHeapPtr< ITEMIDLIST > m_CurDir
Definition: CZipFolder.hpp:56
CStringW m_ZipDir
Definition: CZipFolder.hpp:55
#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:27
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 111 of file CZipFolder.hpp.

112 {
114 return E_NOTIMPL;
115 }
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15

◆ Close()

void CZipFolder::Close ( )

Definition at line 58 of file CZipFolder.cpp.

59{
60 if (m_UnzipFile)
63}
unzFile m_UnzipFile
Definition: CZipFolder.hpp:57
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 512 of file CZipFolder.cpp.

513{
514 const ZipPidlEntry* zipEntry1 = _ZipFromIL(pidl1);
515 const ZipPidlEntry* zipEntry2 = _ZipFromIL(pidl2);
516
517 if (!zipEntry1 || !zipEntry2)
518 return E_INVALIDARG;
519
520 int result = 0;
521 if (zipEntry1->ZipType != zipEntry2->ZipType)
522 result = zipEntry1->ZipType - zipEntry2->ZipType;
523 else
524 result = StrCmpIW(zipEntry1->Name, zipEntry2->Name);
525
526 if (!result && zipEntry1->ZipType == ZIP_PIDL_DIRECTORY)
527 {
528 PCUIDLIST_RELATIVE child1 = ILGetNext(pidl1);
529 PCUIDLIST_RELATIVE child2 = ILGetNext(pidl2);
530
531 if (child1->mkid.cb && child2->mkid.cb)
532 return CompareIDs(lParam, child1, child2);
533 else if (child1->mkid.cb)
534 result = 1;
535 else if (child2->mkid.cb)
536 result = -1;
537 }
538
540}
STDMETHODIMP CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) override
Definition: CZipFolder.cpp:512
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:464
GLuint64EXT * result
Definition: glext.h:11304
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:686
ZipPidlType ZipType
Definition: zippidl.hpp:21
@ ZIP_PIDL_DIRECTORY
Definition: zippidl.hpp:11

Referenced by CompareIDs().

◆ CopyZipEntry()

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

Definition at line 257 of file CZipFolder.cpp.

258{
259 // Get extra field
261 if (info->size_file_extra > 0)
262 {
263 extra.SetCount(info->size_file_extra);
264 if (unzGetCurrentFileInfo64(uf, NULL, NULL, 0, extra.GetData(),
265 info->size_file_extra, NULL, 0) != UNZ_OK)
266 {
267 DPRINT1("Cannot get extra fields\n");
268 return E_FAIL;
269 }
270 }
271
272 if (unzOpenCurrentFile(uf) != UNZ_OK)
273 {
274 DPRINT1("Cannot open current file\n");
275 return E_FAIL;
276 }
277
278 zip_fileinfo zi = {0};
279 zi.dosDate = info->dosDate;
280 zi.internal_fa = info->internal_fa;
281 zi.external_fa = info->external_fa;
282
283 INT err = zipOpenNewFileInZip3_64(zf, nameA, &zi,
284 extra.GetData(), (UINT)extra.GetCount(),
285 extra.GetData(), (UINT)extra.GetCount(),
288 NULL, 0, info->flag);
289 if (err)
290 {
291 DPRINT1("err: %d\n", err);
293 return E_FAIL;
294 }
295
296 BYTE buffer[4096];
297 INT read;
298 while ((read = unzReadCurrentFile(uf, buffer, sizeof(buffer))) > 0)
300
303 return S_OK;
304}
#define read
Definition: acwin.h:97
#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
unsigned int UINT
Definition: sysinfo.c:13
@ extra
Definition: id3.c:95
#define S_OK
Definition: intsafe.h:52
#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 542 of file CZipFolder.cpp.

543{
544 m_hwnd = hwndOwner ? hwndOwner : m_hwnd;
545
546 static const GUID UnknownIID = // {93F81976-6A0D-42C3-94DD-AA258A155470}
547 {0x93F81976, 0x6A0D, 0x42C3, {0x94, 0xDD, 0xAA, 0x25, 0x8A, 0x15, 0x54, 0x70}};
548 if (riid == IID_IShellView)
549 {
550 SFV_CREATE sfvparams = {sizeof(SFV_CREATE), this};
552
553 HRESULT hr = _CFolderViewCB_CreateInstance(IID_PPV_ARG(IShellFolderViewCB, &pcb));
555 return hr;
556
557 sfvparams.psfvcb = pcb;
558 hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut);
559
560 return hr;
561 }
562 else if (riid == IID_IExplorerCommandProvider)
563 {
565 }
566 else if (riid == IID_IContextMenu)
567 {
568 // Folder context menu
569 return QueryInterface(riid, ppvOut);
570 }
571 else if (riid == IID_IDropTarget)
572 {
573 *ppvOut = static_cast<IDropTarget*>(this);
574 AddRef();
575 return S_OK;
576 }
577 if (UnknownIID != riid)
578 DbgPrint("%s(%S) UNHANDLED\n", __FUNCTION__, guid2string(riid));
579 return E_NOTIMPL;
580}
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:4824
HRESULT _CExplorerCommandProvider_CreateInstance(IContextMenu *zipObject, REFIID riid, LPVOID *ppvOut)
HRESULT _CFolderViewCB_CreateInstance(REFIID riid, LPVOID *ppvOut)
HRESULT hr
Definition: delayimp.cpp:582
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:33
ULONG AddRef()
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
struct _SFV_CREATE SFV_CREATE
IShellFolderViewCB * psfvcb
Definition: shlobj.h:1376
#define IID_PPV_ARG(Itype, ppType)

◆ DeleteItems()

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

Definition at line 138 of file CZipFolder.cpp.

139{
140
141 CDataObjectHIDA cida(pDataObj);
142 if (!cida || cida->cidl <= 0)
143 return E_FAIL;
144
145 // Get the target paths
146 CAtlList<CStringW> targetPaths;
147 for (UINT iFile = 0; iFile < cida->cidl; ++iFile)
148 {
149 PCUIDLIST_RELATIVE pidlRelative = HIDA_GetPIDLItem(cida, iFile);
150 const ZipPidlEntry* pEntry = _ZipFromIL(pidlRelative);
151 if (pEntry)
152 {
153 CStringW fullPath = m_ZipDir + pEntry->Name;
154 // For folders, end with a slash
155 if (pEntry->ZipType == ZIP_PIDL_DIRECTORY && fullPath.Right(1) != L"/")
156 fullPath += L"/";
157 targetPaths.AddTail(fullPath);
158 }
159 }
160
161 // Create a temporary file
162 WCHAR szTempPath[MAX_PATH], szTempFile[MAX_PATH];
164 GetTempFileNameW(szTempPath, L"ZIP", 0, szTempFile);
165
166 // Close the current handle to work with the ZIP file
167 Close();
168
169 zlib_filefunc64_def ffunc = {};
171
172 HRESULT hr = S_OK;
173 unzFile uf = unzOpen2_64(m_ZipFile, &ffunc);
174 zipFile zf = zipOpen2_64(szTempFile, APPEND_STATUS_CREATE, NULL, &ffunc);
175
176 if (!uf || !zf)
177 {
178 DPRINT1("Cannot open file\n");
179 if (uf) unzClose(uf);
180 if (zf) zipClose(zf, NULL);
181 return E_FAIL;
182 }
183
184 // Scan all entries in the original ZIP
185 if (unzGoToFirstFile(uf) == UNZ_OK)
186 {
187 do
188 {
189 // Read file entry
191 char szNameA[MAX_PATH];
192 if (unzGetCurrentFileInfo64(uf, &info, szNameA, sizeof(szNameA), NULL, 0, NULL, 0) != UNZ_OK)
193 continue;
194
195 // Read extra field
197 if (info.size_file_extra > 0)
198 {
199 extra.SetCount(info.size_file_extra);
200 unzGetCurrentFileInfo64(uf, NULL, NULL, 0, extra.GetData(), info.size_file_extra, NULL, 0);
201 }
202
203 CStringA utf8Name = CZipEnumerator::GetUtf8Name(szNameA, extra.GetData(), (DWORD)extra.GetCount());
204 CStringW currentEntryName;
205 if (utf8Name.GetLength() > 0)
206 currentEntryName = (LPWSTR)CA2WEX<MAX_PATH>(utf8Name, CP_UTF8);
207 else if (info.flag & MINIZIP_UTF8_FLAG)
208 currentEntryName = (LPWSTR)CA2WEX<MAX_PATH>(szNameA, CP_UTF8);
209 else
210 currentEntryName = (LPWSTR)CA2WEX<MAX_PATH>(szNameA, CP_ACP);
211
212 currentEntryName.Replace(L'\\', L'/');
213
214 // Check if it is on the deletion target list
215 bool bSkip = false;
216 POSITION pos = targetPaths.GetHeadPosition();
217 while (pos)
218 {
219 const CStringW& target = targetPaths.GetNext(pos);
220 // Check for an exact match (file) or a prefix match (folder)
221 if (currentEntryName == target || currentEntryName.Left(target.GetLength()) == target)
222 {
223 bSkip = true;
224 break;
225 }
226 }
227
228 if (!bSkip)
229 {
230 // If not to be deleted, copy to new ZIP
231 hr = CopyZipEntry(uf, zf, &info, szNameA);
233 break;
234 }
235 } while (unzGoToNextFile(uf) == UNZ_OK);
236 }
237
238 unzClose(uf);
239 zipClose(zf, NULL);
240
241 // Replace the original file with the temporary file
242 if (SUCCEEDED(hr) && ReplaceFileW(m_ZipFile, szTempFile, NULL, 0, NULL, NULL))
243 {
244 // Notify the shell that the folder contents have changed
246 }
247 else
248 {
249 DPRINT1("Failed to replace file\n");
250 DeleteFileW(szTempFile);
251 hr = E_FAIL;
252 }
253
254 return hr;
255}
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:257
#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
short WCHAR
Definition: pedump.c:58
#define CP_UTF8
Definition: nls.h:20
static PCUIDLIST_RELATIVE HIDA_GetPIDLItem(CIDA const *pida, SIZE_T i)
Definition: shellutils.h:721
#define SHCNE_UPDATEDIR
Definition: shlobj.h:1918
#define SHCNF_IDLIST
Definition: shlobj.h:1938
static CStringA GetUtf8Name(PCSTR originalName, const BYTE *extraField, DWORD extraFieldLen)
Definition: tools.h:99
uint16_t * LPWSTR
Definition: typedefs.h:56
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
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 121 of file CZipFolder.cpp.

122{
126 return S_FALSE;
127
128 HRESULT hr = DeleteItems(pDataObj);
130 {
131 message.LoadString(IDS_CANTDELETEFILE);
133 }
134
135 return hr;
136}
HRESULT DeleteItems(CComPtr< IDataObject > pDataObj)
Definition: CZipFolder.cpp:138
#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 952 of file CZipFolder.cpp.

953{
954 *pdwEffect &= DROPEFFECT_COPY;
955 return S_OK;
956}
const DWORD DROPEFFECT_COPY
Definition: oleidl.idl:930

◆ DragLeave()

STDMETHODIMP CZipFolder::DragLeave ( )
override

Implements IDropTarget.

Definition at line 964 of file CZipFolder.cpp.

965{
966 return S_OK;
967}

◆ DragOver()

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

Implements IDropTarget.

Definition at line 958 of file CZipFolder.cpp.

959{
960 *pdwEffect &= DROPEFFECT_COPY;
961 return S_OK;
962}

◆ Drop()

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

Implements IDropTarget.

Definition at line 969 of file CZipFolder.cpp.

970{
971 STGMEDIUM sm;
972 FORMATETC fe = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
973 HRESULT hr = pDataObj->GetData(&fe, &sm);
975 return hr;
976
977 HDROP hDrop = (HDROP)GlobalLock(sm.hGlobal);
978 if (hDrop)
979 {
980 // Close the ZIP file before appending (it will be automatically
981 // reopened next time getZip() is called)
982 Close();
983
984 // Create creator
986
987 pCreator->SetNotifyPidl(m_CurDir);
988
989 // Add dropped files
990 UINT fileCount = DragQueryFileW(hDrop, 0xFFFFFFFF, NULL, 0);
991 for (UINT i = 0; i < fileCount; i++)
992 {
995 pCreator->DoAddItem(szFilePath);
996 }
997
998 CZipCreator::runThread(pCreator);
999
1000 GlobalUnlock(sm.hGlobal);
1001 *pdwEffect = DROPEFFECT_COPY;
1002 }
1003 ReleaseStgMedium(&sm);
1004
1005 return S_OK;
1006}
#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:2014
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 106 of file CZipFolder.hpp.

107 {
109 }
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

Referenced by ParseDisplayName().

◆ EnumSearches()

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

Implements IShellFolder2.

Definition at line 85 of file CZipFolder.hpp.

86 {
88 return E_NOTIMPL;
89 }

◆ GetAttributesOf()

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

Definition at line 582 of file CZipFolder.cpp.

583{
584 if (!rgfInOut || !cidl || !apidl)
585 return E_INVALIDARG;
586
587 *rgfInOut = 0;
588
589 //static DWORD dwFileAttrs = SFGAO_STREAM | SFGAO_HASPROPSHEET | SFGAO_CANDELETE | SFGAO_CANCOPY | SFGAO_CANMOVE;
590 //static DWORD dwFolderAttrs = SFGAO_FOLDER | SFGAO_DROPTARGET | SFGAO_HASPROPSHEET | SFGAO_CANDELETE | SFGAO_STORAGE | SFGAO_CANCOPY | SFGAO_CANMOVE;
591 static DWORD dwFileAttrs = SFGAO_CANDELETE | SFGAO_STREAM;
592 static DWORD dwFolderAttrs = SFGAO_CANDELETE | SFGAO_FOLDER | SFGAO_HASSUBFOLDER | SFGAO_BROWSABLE | SFGAO_DROPTARGET;
593
594 while (cidl > 0 && *apidl)
595 {
596 const ZipPidlEntry* zipEntry = _ZipFromIL(*apidl);
597
598 if (zipEntry)
599 {
600 if (zipEntry->ZipType == ZIP_PIDL_FILE)
601 *rgfInOut |= dwFileAttrs;
602 else
603 *rgfInOut |= dwFolderAttrs;
604 }
605 else
606 {
607 *rgfInOut = 0;
608 }
609
610 apidl++;
611 cidl--;
612 }
613
614 *rgfInOut &= ~SFGAO_FILESYSTEM;
615 *rgfInOut &= ~SFGAO_VALIDATE;
616 return S_OK;
617}
@ ZIP_PIDL_FILE
Definition: zippidl.hpp:12

Referenced by ParseDisplayName().

◆ GetClassID()

STDMETHODIMP CZipFolder::GetClassID ( CLSID lpClassId)
inlineoverride

Implements IPersist.

Definition at line 169 of file CZipFolder.hpp.

170 {
172 return S_OK;
173 }
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 772 of file CZipFolder.cpp.

773{
774 if (idCmd != 0)
775 return E_INVALIDARG;
776
777 switch (uFlags)
778 {
779 case GCS_VERBA:
780 return StringCchCopyA(pszName, cchMax, EXTRACT_VERBA);
781 case GCS_VERBW:
782 return StringCchCopyW((PWSTR)pszName, cchMax, EXTRACT_VERBW);
783 case GCS_HELPTEXTA:
784 {
786 return StringCchCopyA(pszName, cchMax, helpText);
787 }
788 case GCS_HELPTEXTW:
789 {
791 return StringCchCopyW((PWSTR)pszName, cchMax, helpText);
792 }
793 case GCS_VALIDATEA:
794 case GCS_VALIDATEW:
795 return S_OK;
796 }
797
798 return E_INVALIDARG;
799}
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 934 of file CZipFolder.cpp.

935{
936 if (!ppszFileName)
937 return E_INVALIDARG;
938
939 *ppszFileName = NULL;
940
941 if (m_ZipFile.IsEmpty())
942 return S_FALSE;
943
944 *ppszFileName = (LPOLESTR)CoTaskMemAlloc((m_ZipFile.GetLength() + 1) * sizeof(WCHAR));
945 if (!*ppszFileName)
946 return E_OUTOFMEMORY;
947
948 wcscpy(*ppszFileName, m_ZipFile);
949 return S_OK;
950}
bool IsEmpty() const noexcept
Definition: atlsimpstr.h:394
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
void *WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: malloc.c:381
wcscpy

◆ GetCurFolder()

STDMETHODIMP CZipFolder::GetCurFolder ( PIDLIST_ABSOLUTE pidl)
inlineoverride

Implements IPersistFolder2.

Definition at line 159 of file CZipFolder.hpp.

160 {
161 *pidl = ILClone(m_CurDir);
162 return S_OK;
163 }
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 90 of file CZipFolder.hpp.

91 {
92 if (pSort)
93 *pSort = COL_NAME;
94 if (pDisplay)
95 *pDisplay = COL_NAME;
96 return S_OK;
97 }
@ COL_NAME
Definition: CZipFolder.hpp:13

◆ GetDefaultColumnState()

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

Implements IShellFolder2.

Definition at line 306 of file CZipFolder.cpp.

307{
308 if (!pcsFlags || iColumn >= _countof(g_ColumnDefs))
309 return E_INVALIDARG;
310 *pcsFlags = g_ColumnDefs[iColumn].ColumnFlags;
311 return S_OK;
312}
static FolderViewColumns g_ColumnDefs[]
Definition: CFontExt.cpp:34
#define _countof(array)
Definition: sndvol32.h:70

◆ GetDefaultSearchGUID()

STDMETHODIMP CZipFolder::GetDefaultSearchGUID ( GUID pguid)
inlineoverride

Implements IShellFolder2.

Definition at line 80 of file CZipFolder.hpp.

81 {
83 return E_NOTIMPL;
84 }

◆ GetDetailsEx()

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

Implements IShellFolder2.

Definition at line 314 of file CZipFolder.cpp.

315{
316 if (!pidl || !pscid || !pv)
317 return E_INVALIDARG;
318
319 V_VT(pv) = VT_EMPTY;
320
321 PCUIDLIST_RELATIVE curpidl = ILGetNext(pidl);
322 if (curpidl->mkid.cb != 0)
323 {
324 DPRINT1("ERROR, unhandled PIDL!\n");
325 return E_FAIL;
326 }
327 const ZipPidlEntry* zipEntry = _ZipFromIL(pidl);
328 if (!zipEntry)
329 return E_INVALIDARG;
330 bool isDir = zipEntry->IsDirectory();
331
332 // Handle the non-string columns here so the caller gets the correct variant type
333 if (!isDir && IsEqual(*pscid, g_ColumnDefs[COL_SIZE]))
334 {
335 V_VT(pv) = VT_UI8;
336 V_UI8(pv) = zipEntry->UncompressedSize;
337 return S_OK;
338 }
339 else if (!isDir && IsEqual(*pscid, g_ColumnDefs[COL_COMPRSIZE]))
340 {
341 V_VT(pv) = VT_UI8;
342 V_UI8(pv) = zipEntry->CompressedSize;
343 return S_OK;
344 }
345 else if (!isDir && IsEqual(*pscid, g_ColumnDefs[COL_DATE_MOD]))
346 {
347 if (DosDateTimeToVariantTime(HIWORD(zipEntry->DosDate), LOWORD(zipEntry->DosDate), &V_DATE(pv)))
348 {
349 V_VT(pv) = VT_DATE;
350 return S_OK;
351 }
352 }
353
354 HRESULT hr = E_FAIL;
355 int col = MapScidToColumn(*pscid);
356 if (col >= 0)
357 {
359 if (SUCCEEDED(hr = GetDetailsOf(pidl, col, &sd)))
360 {
362 if (SUCCEEDED(hr = StrRetToStrW(&sd.str, pidl, &str)))
363 {
365 if (SUCCEEDED(hr))
366 V_VT(pv) = VT_BSTR;
367 }
368 }
369 }
370 return hr;
371}
static int MapScidToColumn(const SHCOLUMNID &scid)
Definition: CZipFolder.cpp:27
@ COL_COMPRSIZE
Definition: CZipFolder.hpp:15
@ COL_DATE_MOD
Definition: CZipFolder.hpp:19
@ COL_SIZE
Definition: CZipFolder.hpp:17
STDMETHODIMP GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override
Definition: CZipFolder.cpp:373
@ VT_UI8
Definition: compat.h:2315
@ VT_BSTR
Definition: compat.h:2303
@ VT_DATE
Definition: compat.h:2302
@ VT_EMPTY
Definition: compat.h:2295
HRESULT WINAPI StrRetToStrW(LPSTRRET lpStrRet, const ITEMIDLIST *pidl, LPWSTR *ppszName)
Definition: string.c:349
@ IsEqual
Definition: fatprocs.h:1887
static const WCHAR sd[]
Definition: suminfo.c:286
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:238
#define V_VT(A)
Definition: oleauto.h:211
#define V_BSTR(A)
Definition: oleauto.h:226
#define V_DATE(A)
Definition: oleauto.h:231
#define V_UI8(A)
Definition: oleauto.h:272
#define LOWORD(l)
Definition: pedump.c:82
const WCHAR * str
ULONG64 UncompressedSize
Definition: zippidl.hpp:24
ULONG DosDate
Definition: zippidl.hpp:25
ULONG64 CompressedSize
Definition: zippidl.hpp:23
bool IsDirectory() const
Definition: zippidl.hpp:29
#define HIWORD(l)
Definition: typedefs.h:247
INT WINAPI DosDateTimeToVariantTime(USHORT wDosDate, USHORT wDosTime, double *pDateOut)
Definition: variant.c:1211

◆ GetDetailsOf()

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

Implements IShellFolder2.

Definition at line 373 of file CZipFolder.cpp.

374{
375 if (iColumn >= _countof(g_ColumnDefs))
376 return E_FAIL;
377
378 psd->cxChar = g_ColumnDefs[iColumn].cxChar;
379 psd->fmt = g_ColumnDefs[iColumn].fmt;
380
381 if (pidl == NULL)
382 {
383 return SHSetStrRet(&psd->str, _AtlBaseModule.GetResourceInstance(), g_ColumnDefs[iColumn].iResource);
384 }
385
386 PCUIDLIST_RELATIVE curpidl = ILGetNext(pidl);
387 if (curpidl->mkid.cb != 0)
388 {
389 DPRINT1("ERROR, unhandled PIDL!\n");
390 return E_FAIL;
391 }
392
393 const ZipPidlEntry* zipEntry = _ZipFromIL(pidl);
394 if (!zipEntry)
395 return E_INVALIDARG;
396
397 WCHAR Buffer[100];
398 bool isDir = zipEntry->ZipType == ZIP_PIDL_DIRECTORY;
399 switch (iColumn)
400 {
401 case COL_NAME:
402 return GetDisplayNameOf(pidl, SHGDN_INFOLDER, &psd->str);
403 case COL_TYPE:
404 {
405 SHFILEINFOW shfi;
407 ULONG_PTR firet = SHGetFileInfoW(zipEntry->Name, dwAttributes, &shfi, sizeof(shfi), SHGFI_USEFILEATTRIBUTES | SHGFI_TYPENAME);
408 if (!firet)
409 return E_FAIL;
410 return SHSetStrRet(&psd->str, shfi.szTypeName);
411 }
412 case COL_COMPRSIZE:
413 case COL_SIZE:
414 {
415 if (isDir)
416 return SHSetStrRet(&psd->str, L"");
417
418 ULONG64 Size = iColumn == COL_COMPRSIZE ? zipEntry->CompressedSize : zipEntry->UncompressedSize;
420 return E_FAIL;
421 return SHSetStrRet(&psd->str, Buffer);
422 }
423 case COL_PASSWORD:
424 if (isDir)
425 return SHSetStrRet(&psd->str, L"");
426 return SHSetStrRet(&psd->str, _AtlBaseModule.GetResourceInstance(), zipEntry->Password ? IDS_YES : IDS_NO);
427 case COL_RATIO:
428 {
429 if (isDir)
430 return SHSetStrRet(&psd->str, L"");
431
432 int ratio = 0;
433 if (zipEntry->UncompressedSize)
434 ratio = 100 - (int)((zipEntry->CompressedSize*100)/zipEntry->UncompressedSize);
435 StringCchPrintfW(Buffer, _countof(Buffer), L"%d%%", ratio);
436 return SHSetStrRet(&psd->str, Buffer);
437 }
438 case COL_DATE_MOD:
439 {
440 if (isDir)
441 return SHSetStrRet(&psd->str, L"");
442 FILETIME ftLocal;
443 DosDateTimeToFileTime((WORD)(zipEntry->DosDate>>16), (WORD)zipEntry->DosDate, &ftLocal);
444 if (!_GetFileTimeString(&ftLocal, Buffer, _countof(Buffer)))
445 return E_FAIL;
446 return SHSetStrRet(&psd->str, Buffer);
447 }
448 }
449
451 return E_NOTIMPL;
452}
@ COL_PASSWORD
Definition: CZipFolder.hpp:16
@ COL_RATIO
Definition: CZipFolder.hpp:18
@ COL_TYPE
Definition: CZipFolder.hpp:14
#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:731
BOOL _GetFileTimeString(LPFILETIME lpFileTime, PWSTR pwszResult, UINT cchResult)
Definition: CZipFolder.cpp:93
#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:854
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
BOOLEAN Password
Definition: zippidl.hpp:20
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

Referenced by GetDetailsEx().

◆ GetDisplayNameOf()

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

Definition at line 731 of file CZipFolder.cpp.

732{
733 if (!pidl)
734 return S_FALSE;
735
736 PCUIDLIST_RELATIVE curpidl = ILGetNext(pidl);
737 if (curpidl->mkid.cb != 0)
738 {
739 DPRINT1("ERROR, unhandled PIDL!\n");
740 return E_FAIL;
741 }
742
743 const ZipPidlEntry* zipEntry = _ZipFromIL(pidl);
744 if (!zipEntry)
745 return E_FAIL;
746
748 {
750 return SHSetStrRet(strRet, zipEntry->Name);
751
754 return E_FAIL;
755 UINT cch = lstrlenW(parent) + 1 + lstrlenW(zipEntry->Name) + 1;
756 strRet->uType = STRRET_WSTR;
757 strRet->pOleStr = (LPWSTR)SHAlloc(cch * sizeof(WCHAR));
758 if (!strRet->pOleStr)
759 return E_OUTOFMEMORY;
760 lstrcpyW(strRet->pOleStr, parent);
761 PathAppendW(strRet->pOleStr, zipEntry->Name);
762 return S_OK;
763 }
764
765 SHFILEINFOW fi;
767 if (SHGetFileInfoW(zipEntry->Name, attr, &fi, sizeof(fi), SHGFI_DISPLAYNAME | SHGFI_USEFILEATTRIBUTES))
768 return SHSetStrRet(strRet, fi.szDisplayName);
769 return SHSetStrRet(strRet, zipEntry->Name);
770}
#define lstrcpyW
Definition: compat.h:749
#define lstrlenW
Definition: compat.h:750
LPVOID WINAPI SHAlloc(SIZE_T len)
Definition: shellole.c:348
r parent
Definition: btrfs.c:3010
#define PathAppendW
Definition: pathcch.h:310
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1496
_In_ UINT _In_ UINT cch
Definition: shellapi.h:432
#define SHGFI_DISPLAYNAME
Definition: shellapi.h:166
@ STRRET_WSTR
Definition: shtypes.idl:85
WCHAR szDisplayName[MAX_PATH]
Definition: shellapi.h:387
UINT uType
Definition: shtypes.idl:93
LPWSTR pOleStr
Definition: shtypes.idl:96
Definition: cookie.c:202

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 686 of file CZipFolder.cpp.

687{
688 m_hwnd = hwndOwner ? hwndOwner : m_hwnd;
689 if ((riid == IID_IExtractIconA || riid == IID_IExtractIconW) && cidl == 1)
690 {
691 const ZipPidlEntry* zipEntry = _ZipFromIL(*apidl);
692 if (zipEntry)
693 {
695 return SHCreateFileExtractIconW(zipEntry->Name, dwAttributes, riid, ppvOut);
696 }
697 }
698 else if (riid == IID_IContextMenu && cidl >= 0)
699 {
700 // Context menu of an object inside the zip
701 const ZipPidlEntry* zipEntry = _ZipFromIL(*apidl);
702 if (zipEntry)
703 {
704 HKEY keys[1] = {0};
705 int nkeys = 0;
706 if (zipEntry->ZipType == ZIP_PIDL_DIRECTORY)
707 {
709 if (res != ERROR_SUCCESS)
710 return E_FAIL;
711 nkeys++;
712 }
713 return CDefFolderMenu_Create2(NULL, hwndOwner, cidl, apidl, this, ZipFolderMenuCallback, nkeys, keys, (IContextMenu**)ppvOut);
714 }
715 }
716 else if (riid == IID_IDataObject && cidl >= 1)
717 {
718 return CIDLData_CreateFromIDArray(m_CurDir, cidl, apidl, (IDataObject**)ppvOut);
719 }
720 else if (riid == IID_IDropTarget)
721 {
722 AddRef();
723 *ppvOut = static_cast<IDropTarget*>(this);
724 return S_OK;
725 }
726
727 DbgPrint("%s(%S) UNHANDLED\n", __FUNCTION__ , guid2string(riid));
728 return E_NOINTERFACE;
729}
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:619
#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:418
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:2436
#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 891 of file CZipFolder.cpp.

892{
893 WCHAR tmpPath[MAX_PATH];
894
895 if (SHGetPathFromIDListW(pidl, tmpPath))
896 {
897 m_ZipFile = tmpPath;
898 m_CurDir.Attach(ILClone(pidl));
899 return S_OK;
900 }
901 DbgPrint("%s() => Unable to parse pidl\n", __FUNCTION__);
902 return E_INVALIDARG;
903}

◆ Initialize() [2/3]

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

Definition at line 846 of file CZipFolder.cpp.

847{
848 FORMATETC etc = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
849 STGMEDIUM stg;
850
851 HRESULT hr = pDataObj->GetData(&etc, &stg);
853 return hr;
854
855 hr = E_FAIL;
856 HDROP hdrop = (HDROP)GlobalLock(stg.hGlobal);
857 if (hdrop)
858 {
859 UINT uNumFiles = DragQueryFileW(hdrop, 0xFFFFFFFF, NULL, 0);
860 if (uNumFiles == 1)
861 {
862 WCHAR szFile[MAX_PATH * 2];
863 if (DragQueryFileW(hdrop, 0, szFile, _countof(szFile)))
864 {
866 hr = SHParseDisplayName(szFile, NULL, &pidl, 0, NULL);
868 {
869 hr = Initialize(pidl);
870 }
871 }
872 else
873 {
874 DbgPrint("Failed to query the file.\r\n");
875 }
876 }
877 else
878 {
879 DbgPrint("Invalid number of files: %d\r\n", uNumFiles);
880 }
881 GlobalUnlock(stg.hGlobal);
882 }
883 else
884 {
885 DbgPrint("Could not lock stg.hGlobal\r\n");
886 }
887 ReleaseStgMedium(&stg);
888 return hr;
889}
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 72 of file CZipFolder.cpp.

73{
75 m_ZipDir = zipDir;
76
77 m_CurDir.Attach(ILCombine(curDir, pidl));
78 return S_OK;
79}
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:817

◆ InvokeCommand()

STDMETHODIMP CZipFolder::InvokeCommand ( LPCMINVOKECOMMANDINFO  pici)
override

Implements IContextMenu.

Definition at line 801 of file CZipFolder.cpp.

802{
803 if (!pici || (pici->cbSize != sizeof(CMINVOKECOMMANDINFO) && pici->cbSize != sizeof(CMINVOKECOMMANDINFOEX)))
804 return E_INVALIDARG;
805
806 if (pici->lpVerb == MAKEINTRESOURCEA(0) ||
807 (!IS_INTRESOURCE(pici->lpVerb) && !strcmp(pici->lpVerb, EXTRACT_VERBA)))
808 {
809 BSTR ZipFile = m_ZipFile.AllocSysString();
811
812 DWORD tid;
814 if (hThread)
815 {
817 return S_OK;
818 }
819 }
820
821 if (pici->lpVerb == MAKEINTRESOURCEA(DFM_CMD_DELETE) ||
822 (!IS_INTRESOURCE(pici->lpVerb) && !strcmp(pici->lpVerb, "delete")))
823 {
825 }
826
827 return E_INVALIDARG;
828}
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:121
CComPtr< IDataObject > m_pDataObj
Definition: CZipFolder.hpp:58
static DWORD WINAPI s_ExtractProc(LPVOID arg)
Definition: CZipFolder.cpp:81
#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:3324
static TfClientId tid
struct IContextMenu::tagCMINVOKECOMMANDINFO CMINVOKECOMMANDINFO
struct IContextMenu::tagCMInvokeCommandInfoEx CMINVOKECOMMANDINFOEX
HANDLE hThread
Definition: wizard.c:28
#define DFM_CMD_DELETE
Definition: shlobj.h:2625

◆ IsDirty()

STDMETHODIMP CZipFolder::IsDirty ( void  )
override

Implements IPersistFile.

Definition at line 905 of file CZipFolder.cpp.

906{
907 return S_FALSE;
908}

◆ Load()

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

Implements IPersistFile.

Definition at line 910 of file CZipFolder.cpp.

911{
913
916 if (SUCCEEDED(hr))
917 {
918 m_CurDir.Attach(pidl.Detach());
919 }
920
921 return S_OK;
922}
T * Detach()
Definition: atlalloc.h:168
WORD WORD PSZ PSZ pszFileName
Definition: vdmdbg.h:44

◆ MapColumnToSCID()

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

Implements IShellFolder2.

Definition at line 454 of file CZipFolder.cpp.

455{
457 {
458 pscid->fmtid = *g_ColumnDefs[column].pkg;
459 pscid->pid = g_ColumnDefs[column].pki;
460 return S_OK;
461 }
462 return E_FAIL;
463}

◆ ParseDisplayName()

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

Implements IShellFolder.

Definition at line 465 of file CZipFolder.cpp.

466{
467 if (pchEaten)
468 *pchEaten = 0;
469
472 HRESULT hr = EnumObjects(hwndOwner, dwFlags, &pEnum);
473 if (FAILED(hr))
474 return hr;
475
476 PIDLIST_RELATIVE pidl = FindItem(*pEnum, lpszDisplayName);
477 if (!pidl)
479
480 *ppidl = pidl;
481 if (pchEaten)
482 *pchEaten = lstrlenW(lpszDisplayName);
483 if (pdwAttributes)
484 GetAttributesOf(1, ppidl, (SFGAOF*)pdwAttributes);
485 return S_OK;
486}
static PIDLIST_RELATIVE FindItem(IEnumIDList &List, PCWSTR Path)
Definition: CZipFolder.cpp:37
STDMETHODIMP EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override
Definition: CZipFolder.hpp:106
STDMETHODIMP GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override
Definition: CZipFolder.cpp:582
ULONG SFGAOF
Definition: shobjidl.idl:222
@ SHCONTF_INCLUDESUPERHIDDEN
Definition: shobjidl.idl:184
@ SHCONTF_INCLUDEHIDDEN
Definition: shobjidl.idl:175
@ SHCONTF_NONFOLDERS
Definition: shobjidl.idl:174
#define FAILED(hr)
Definition: intsafe.h:51
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210

◆ QueryContextMenu()

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

Implements IContextMenu.

Definition at line 830 of file CZipFolder.cpp.

831{
832 UINT idCmd = idCmdFirst;
833
834 if (!(uFlags & CMF_DEFAULTONLY))
835 {
837
838 if (indexMenu)
839 InsertMenuW(hmenu, indexMenu++, MF_BYPOSITION | MF_SEPARATOR, 0, NULL);
840 InsertMenuW(hmenu, indexMenu++, MF_BYPOSITION | MF_STRING, idCmd++, menuText); // Command 0
841 }
842
843 return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, idCmd - idCmdFirst);
844}
#define IDS_MENUITEM
Definition: resource.h:74
#define MAKE_HRESULT(sev, fac, code)
Definition: dmerror.h:29
static HMENU hmenu
Definition: win.c:78
#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 81 of file CZipFolder.cpp.

82{
83 CComBSTR ZipFile;
84 ZipFile.Attach((BSTR)arg);
85
87
89 return 0;
90}
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 924 of file CZipFolder.cpp.

925{
926 return E_NOTIMPL;
927}

◆ SaveCompleted()

STDMETHODIMP CZipFolder::SaveCompleted ( LPCOLESTR  pszFileName)
override

Implements IPersistFile.

Definition at line 929 of file CZipFolder.cpp.

930{
931 return S_OK;
932}

◆ SetNameOf()

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

Implements IShellFolder.

Definition at line 121 of file CZipFolder.hpp.

122 {
124 return E_NOTIMPL;
125 }

◆ 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 619 of file CZipFolder.cpp.

622{
623 CZipFolder* pThis = static_cast<CZipFolder*>(psf);
624 if (!pThis)
625 return E_FAIL;
626
627 pThis->m_pDataObj = pdtobj;
628
629 switch (uMsg)
630 {
632 {
633 CComQIIDPtr<I_ID(IContextMenu)> spContextMenu(psf);
634 if (!spContextMenu)
635 {
636 DPRINT1("E_NOINTERFACE\n");
637 return E_NOINTERFACE;
638 }
639
640 QCMINFO *pqcminfo = (QCMINFO *)lParam;
641 HRESULT hr = spContextMenu->QueryContextMenu(pqcminfo->hmenu,
642 pqcminfo->indexMenu,
643 pqcminfo->idCmdFirst,
644 pqcminfo->idCmdLast,
645 CMF_NORMAL);
647 return hr;
648
649 pqcminfo->idCmdFirst += HRESULT_CODE(hr);
650 return S_OK;
651 }
653 return E_NOTIMPL;
655 {
656 if (wParam == DFM_CMD_DELETE)
657 return pThis->DoDeleteItems(pdtobj);
658
659 CComQIIDPtr<I_ID(IContextMenu)> spContextMenu(psf);
660 if (!spContextMenu)
661 {
662 DPRINT1("E_NOINTERFACE\n");
663 return E_NOINTERFACE;
664 }
665
666 CMINVOKECOMMANDINFO ici = { sizeof(ici) };
667 ici.hwnd = hwnd;
668 ici.lpVerb = (LPSTR)wParam;
669 ici.nShow = SW_SHOWNORMAL;
670
671 return spContextMenu->InvokeCommand(&ici);
672 }
673 case DFM_GETDEFSTATICID: // Required for Windows 7 to pick a default
674 return S_FALSE;
675 case DFM_WM_INITMENUPOPUP: // FIXME: Make it effective in `CDefViewBckgrndMenu`
676 {
677 // Disable [Paste] / [Paste link] menu items
680 break;
681 }
682 }
683 return E_NOTIMPL;
684}
#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:2614
#define FCIDM_SHVIEW_INSERTLINK
Definition: shresdef.h:875
#define FCIDM_SHVIEW_INSERT
Definition: shresdef.h:873
HMENU hmenu
Definition: shlobj.h:1406
UINT idCmdLast
Definition: shlobj.h:1409
UINT idCmdFirst
Definition: shlobj.h:1408
UINT indexMenu
Definition: shlobj.h:1407
char * LPSTR
Definition: typedefs.h:51
_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

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 59 of file CZipFolder.hpp.

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

◆ m_pDataObj

CComPtr<IDataObject> CZipFolder::m_pDataObj
private

Definition at line 58 of file CZipFolder.hpp.

Referenced by InvokeCommand(), and ZipFolderMenuCallback().

◆ m_UnzipFile

unzFile CZipFolder::m_UnzipFile = nullptr
private

Definition at line 57 of file CZipFolder.hpp.

Referenced by Close(), and STDMETHODIMP_().

◆ m_ZipDir

CStringW CZipFolder::m_ZipDir
private

Definition at line 55 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: