ReactOS 0.4.16-dev-2208-g6350669
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

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
 

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:1089
INT WINAPI GetDateFormatW(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCWSTR lpFormat, LPWSTR lpDateStr, INT cchOut)
Definition: lcformat.c:989
#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 183 of file CZipFolder.cpp.

184{
185 if (riid == IID_IShellFolder)
186 {
187 CStringW newZipDir = m_ZipDir;
188 PCUIDLIST_RELATIVE curpidl = pidl;
189 while (curpidl->mkid.cb)
190 {
191 const ZipPidlEntry* zipEntry = _ZipFromIL(curpidl);
192 if (!zipEntry)
193 {
194 return E_FAIL;
195 }
196 newZipDir += zipEntry->Name;
197 newZipDir += L'/';
198
199 curpidl = ILGetNext(curpidl);
200 }
201 return ShellObjectCreatorInit<CZipFolder>(m_ZipFile, newZipDir, m_CurDir, pidl, riid, ppvOut);
202 }
203 DbgPrint("%s(%S) UNHANDLED\n", __FUNCTION__, guid2string(riid));
204 return E_NOTIMPL;
205}
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 105 of file CZipFolder.hpp.

106 {
108 return E_NOTIMPL;
109 }
#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 Drop(), and ~CZipFolder().

◆ CompareIDs()

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

Implements IShellFolder.

Definition at line 207 of file CZipFolder.cpp.

208{
209 const ZipPidlEntry* zipEntry1 = _ZipFromIL(pidl1);
210 const ZipPidlEntry* zipEntry2 = _ZipFromIL(pidl2);
211
212 if (!zipEntry1 || !zipEntry2)
213 return E_INVALIDARG;
214
215 int result = 0;
216 if (zipEntry1->ZipType != zipEntry2->ZipType)
217 result = zipEntry1->ZipType - zipEntry2->ZipType;
218 else
219 result = StrCmpIW(zipEntry1->Name, zipEntry2->Name);
220
221 if (!result && zipEntry1->ZipType == ZIP_PIDL_DIRECTORY)
222 {
223 PCUIDLIST_RELATIVE child1 = ILGetNext(pidl1);
224 PCUIDLIST_RELATIVE child2 = ILGetNext(pidl2);
225
226 if (child1->mkid.cb && child2->mkid.cb)
227 return CompareIDs(lParam, child1, child2);
228 else if (child1->mkid.cb)
229 result = 1;
230 else if (child2->mkid.cb)
231 result = -1;
232 }
233
235}
STDMETHODIMP CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) override
Definition: CZipFolder.cpp:207
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().

◆ CreateViewObject()

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

Definition at line 237 of file CZipFolder.cpp.

238{
239 static const GUID UnknownIID = // {93F81976-6A0D-42C3-94DD-AA258A155470}
240 {0x93F81976, 0x6A0D, 0x42C3, {0x94, 0xDD, 0xAA, 0x25, 0x8A, 0x15, 0x54, 0x70}};
241 if (riid == IID_IShellView)
242 {
243 SFV_CREATE sfvparams = {sizeof(SFV_CREATE), this};
245
246 HRESULT hr = _CFolderViewCB_CreateInstance(IID_PPV_ARG(IShellFolderViewCB, &pcb));
248 return hr;
249
250 sfvparams.psfvcb = pcb;
251 hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut);
252
253 return hr;
254 }
255 else if (riid == IID_IExplorerCommandProvider)
256 {
258 }
259 else if (riid == IID_IContextMenu)
260 {
261 // Folder context menu
262 return QueryInterface(riid, ppvOut);
263 }
264 else if (riid == IID_IDropTarget)
265 {
266 *ppvOut = static_cast<IDropTarget*>(this);
267 AddRef();
268 return S_OK;
269 }
270 if (UnknownIID != riid)
271 DbgPrint("%s(%S) UNHANDLED\n", __FUNCTION__, guid2string(riid));
272 return E_NOTIMPL;
273}
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)
#define S_OK
Definition: intsafe.h:52
HRESULT hr
Definition: shlfolder.c:183
struct _SFV_CREATE SFV_CREATE
IShellFolderViewCB * psfvcb
Definition: shlobj.h:1365
#define IID_PPV_ARG(Itype, ppType)

◆ DragEnter()

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

Implements IDropTarget.

Definition at line 588 of file CZipFolder.cpp.

589{
590 *pdwEffect &= DROPEFFECT_COPY;
591 return S_OK;
592}
const DWORD DROPEFFECT_COPY
Definition: oleidl.idl:930

◆ DragLeave()

STDMETHODIMP CZipFolder::DragLeave ( void  )
override

Implements IDropTarget.

Definition at line 600 of file CZipFolder.cpp.

601{
602 return S_OK;
603}

◆ DragOver()

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

Implements IDropTarget.

Definition at line 594 of file CZipFolder.cpp.

595{
596 *pdwEffect &= DROPEFFECT_COPY;
597 return S_OK;
598}

◆ Drop()

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

Implements IDropTarget.

Definition at line 605 of file CZipFolder.cpp.

606{
607 STGMEDIUM sm;
608 FORMATETC fe = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
609 HRESULT hr = pDataObj->GetData(&fe, &sm);
611 return hr;
612
613 HDROP hDrop = (HDROP)GlobalLock(sm.hGlobal);
614 if (hDrop)
615 {
616 // Close the ZIP file before appending (it will be automatically
617 // reopened next time getZip() is called)
618 Close();
619
620 // Create creator
622
623 pCreator->SetNotifyPidl(m_CurDir);
624
625 // Add dropped files
626 UINT fileCount = DragQueryFileW(hDrop, 0xFFFFFFFF, NULL, 0);
627 for (UINT i = 0; i < fileCount; i++)
628 {
631 pCreator->DoAddItem(szFilePath);
632 }
633
634 CZipCreator::runThread(pCreator);
635
636 GlobalUnlock(sm.hGlobal);
637 *pdwEffect = DROPEFFECT_COPY;
638 }
639 ReleaseStgMedium(&sm);
640
641 return S_OK;
642}
#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)
#define MAX_PATH
Definition: compat.h:34
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
unsigned int UINT
Definition: ndis.h:50
static WCHAR szFilePath[]
Definition: qotd.c:14
__wchar_t WCHAR
Definition: xmlstorage.h:180

◆ EnumObjects()

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

Definition at line 100 of file CZipFolder.hpp.

101 {
103 }
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 68 of file CZipFolder.hpp.

69 {
71 return E_NOTIMPL;
72 }

◆ GetAttributesOf()

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

Definition at line 275 of file CZipFolder.cpp.

276{
277 if (!rgfInOut || !cidl || !apidl)
278 return E_INVALIDARG;
279
280 *rgfInOut = 0;
281
282 //static DWORD dwFileAttrs = SFGAO_STREAM | SFGAO_HASPROPSHEET | SFGAO_CANDELETE | SFGAO_CANCOPY | SFGAO_CANMOVE;
283 //static DWORD dwFolderAttrs = SFGAO_FOLDER | SFGAO_DROPTARGET | SFGAO_HASPROPSHEET | SFGAO_CANDELETE | SFGAO_STORAGE | SFGAO_CANCOPY | SFGAO_CANMOVE;
284 static DWORD dwFileAttrs = SFGAO_STREAM;
285 static DWORD dwFolderAttrs = SFGAO_FOLDER | SFGAO_HASSUBFOLDER | SFGAO_BROWSABLE | SFGAO_DROPTARGET;
286
287 while (cidl > 0 && *apidl)
288 {
289 const ZipPidlEntry* zipEntry = _ZipFromIL(*apidl);
290
291 if (zipEntry)
292 {
293 if (zipEntry->ZipType == ZIP_PIDL_FILE)
294 *rgfInOut |= dwFileAttrs;
295 else
296 *rgfInOut |= dwFolderAttrs;
297 }
298 else
299 {
300 *rgfInOut = 0;
301 }
302
303 apidl++;
304 cidl--;
305 }
306
307 *rgfInOut &= ~SFGAO_VALIDATE;
308 return S_OK;
309}
unsigned long DWORD
Definition: ntddk_ex.h:95
@ ZIP_PIDL_FILE
Definition: zippidl.hpp:13

◆ GetClassID()

STDMETHODIMP CZipFolder::GetClassID ( CLSID lpClassId)
inlineoverride

Implements IPersist.

Definition at line 163 of file CZipFolder.hpp.

164 {
166 return S_OK;
167 }
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 414 of file CZipFolder.cpp.

415{
416 if (idCmd != 0)
417 return E_INVALIDARG;
418
419 switch (uFlags)
420 {
421 case GCS_VERBA:
422 return StringCchCopyA(pszName, cchMax, EXTRACT_VERBA);
423 case GCS_VERBW:
424 return StringCchCopyW((PWSTR)pszName, cchMax, EXTRACT_VERBW);
425 case GCS_HELPTEXTA:
426 {
428 return StringCchCopyA(pszName, cchMax, helpText);
429 }
430 case GCS_HELPTEXTW:
431 {
433 return StringCchCopyW((PWSTR)pszName, cchMax, helpText);
434 }
435 case GCS_VALIDATEA:
436 case GCS_VALIDATEW:
437 return S_OK;
438 }
439
440 return E_INVALIDARG;
441}
UINT cchMax
#define EXTRACT_VERBA
Definition: precomp.h:25
#define EXTRACT_VERBW
Definition: precomp.h:26
#define IDS_HELPTEXT
Definition: resource.h:74
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 570 of file CZipFolder.cpp.

571{
572 if (!ppszFileName)
573 return E_INVALIDARG;
574
575 *ppszFileName = NULL;
576
577 if (m_ZipFile.IsEmpty())
578 return S_FALSE;
579
580 *ppszFileName = (LPOLESTR)CoTaskMemAlloc((m_ZipFile.GetLength() + 1) * sizeof(WCHAR));
581 if (!*ppszFileName)
582 return E_OUTOFMEMORY;
583
584 wcscpy(*ppszFileName, m_ZipFile);
585 return S_OK;
586}
bool IsEmpty() const noexcept
Definition: atlsimpstr.h:394
int GetLength() const noexcept
Definition: atlsimpstr.h:362
#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
#define S_FALSE
Definition: winerror.h:3451

◆ GetCurFolder()

STDMETHODIMP CZipFolder::GetCurFolder ( PIDLIST_ABSOLUTE pidl)
inlineoverride

Implements IPersistFolder2.

Definition at line 153 of file CZipFolder.hpp.

154 {
155 *pidl = ILClone(m_CurDir);
156 return S_OK;
157 }
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 73 of file CZipFolder.hpp.

74 {
75 if (pSort)
76 *pSort = COL_NAME;
77 if (pDisplay)
78 *pDisplay = COL_NAME;
79 return S_OK;
80 }
@ COL_NAME
Definition: CZipFolder.hpp:13

◆ GetDefaultColumnState()

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

Implements IShellFolder2.

Definition at line 94 of file CZipFolder.cpp.

95{
96 if (!pcsFlags || iColumn >= _countof(g_ColumnDefs))
97 return E_INVALIDARG;
98 *pcsFlags = g_ColumnDefs[iColumn].dwDefaultState;
99 return S_OK;
100}
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 63 of file CZipFolder.hpp.

64 {
66 return E_NOTIMPL;
67 }

◆ GetDetailsEx()

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

Implements IShellFolder2.

Definition at line 82 of file CZipFolder.hpp.

83 {
85 return E_NOTIMPL;
86 }

◆ GetDetailsOf()

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

Implements IShellFolder2.

Definition at line 102 of file CZipFolder.cpp.

103{
104 if (iColumn >= _countof(g_ColumnDefs))
105 return E_FAIL;
106
107 psd->cxChar = g_ColumnDefs[iColumn].cxChar;
108 psd->fmt = g_ColumnDefs[iColumn].fmt;
109
110 if (pidl == NULL)
111 {
112 return SHSetStrRet(&psd->str, _AtlBaseModule.GetResourceInstance(), g_ColumnDefs[iColumn].iResource);
113 }
114
115 PCUIDLIST_RELATIVE curpidl = ILGetNext(pidl);
116 if (curpidl->mkid.cb != 0)
117 {
118 DPRINT1("ERROR, unhandled PIDL!\n");
119 return E_FAIL;
120 }
121
122 const ZipPidlEntry* zipEntry = _ZipFromIL(pidl);
123 if (!zipEntry)
124 return E_INVALIDARG;
125
126 WCHAR Buffer[100];
127 bool isDir = zipEntry->ZipType == ZIP_PIDL_DIRECTORY;
128 switch (iColumn)
129 {
130 case COL_NAME:
131 return GetDisplayNameOf(pidl, 0, &psd->str);
132 case COL_TYPE:
133 {
134 SHFILEINFOW shfi;
136 ULONG_PTR firet = SHGetFileInfoW(zipEntry->Name, dwAttributes, &shfi, sizeof(shfi), SHGFI_USEFILEATTRIBUTES | SHGFI_TYPENAME);
137 if (!firet)
138 return E_FAIL;
139 return SHSetStrRet(&psd->str, shfi.szTypeName);
140 }
141 case COL_COMPRSIZE:
142 case COL_SIZE:
143 {
144 if (isDir)
145 return SHSetStrRet(&psd->str, L"");
146
147 ULONG64 Size = iColumn == COL_COMPRSIZE ? zipEntry->CompressedSize : zipEntry->UncompressedSize;
149 return E_FAIL;
150 return SHSetStrRet(&psd->str, Buffer);
151 }
152 case COL_PASSWORD:
153 if (isDir)
154 return SHSetStrRet(&psd->str, L"");
155 return SHSetStrRet(&psd->str, _AtlBaseModule.GetResourceInstance(), zipEntry->Password ? IDS_YES : IDS_NO);
156 case COL_RATIO:
157 {
158 if (isDir)
159 return SHSetStrRet(&psd->str, L"");
160
161 int ratio = 0;
162 if (zipEntry->UncompressedSize)
163 ratio = 100 - (int)((zipEntry->CompressedSize*100)/zipEntry->UncompressedSize);
164 StringCchPrintfW(Buffer, _countof(Buffer), L"%d%%", ratio);
165 return SHSetStrRet(&psd->str, Buffer);
166 }
167 case COL_DATE_MOD:
168 {
169 if (isDir)
170 return SHSetStrRet(&psd->str, L"");
171 FILETIME ftLocal;
172 DosDateTimeToFileTime((WORD)(zipEntry->DosDate>>16), (WORD)zipEntry->DosDate, &ftLocal);
173 if (!_GetFileTimeString(&ftLocal, Buffer, _countof(Buffer)))
174 return E_FAIL;
175 return SHSetStrRet(&psd->str, Buffer);
176 }
177 }
178
180 return E_NOTIMPL;
181}
@ 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
#define DPRINT1
Definition: precomp.h:8
Definition: bufpool.h:45
STDMETHODIMP GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
Definition: CZipFolder.cpp:395
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 395 of file CZipFolder.cpp.

396{
397 if (!pidl)
398 return S_FALSE;
399
400 PCUIDLIST_RELATIVE curpidl = ILGetNext(pidl);
401 if (curpidl->mkid.cb != 0)
402 {
403 DPRINT1("ERROR, unhandled PIDL!\n");
404 return E_FAIL;
405 }
406
407 const ZipPidlEntry* zipEntry = _ZipFromIL(pidl);
408 if (!zipEntry)
409 return E_FAIL;
410
411 return SHSetStrRet(strRet, zipEntry->Name);
412}

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

352{
353 if ((riid == IID_IExtractIconA || riid == IID_IExtractIconW) && cidl == 1)
354 {
355 const ZipPidlEntry* zipEntry = _ZipFromIL(*apidl);
356 if (zipEntry)
357 {
359 return SHCreateFileExtractIconW(zipEntry->Name, dwAttributes, riid, ppvOut);
360 }
361 }
362 else if (riid == IID_IContextMenu && cidl >= 0)
363 {
364 // Context menu of an object inside the zip
365 const ZipPidlEntry* zipEntry = _ZipFromIL(*apidl);
366 if (zipEntry)
367 {
368 HKEY keys[1] = {0};
369 int nkeys = 0;
370 if (zipEntry->ZipType == ZIP_PIDL_DIRECTORY)
371 {
373 if (res != ERROR_SUCCESS)
374 return E_FAIL;
375 nkeys++;
376 }
377 return CDefFolderMenu_Create2(NULL, hwndOwner, cidl, apidl, this, ZipFolderMenuCallback, nkeys, keys, (IContextMenu**)ppvOut);
378 }
379 }
380 else if (riid == IID_IDataObject && cidl >= 1)
381 {
382 return CIDLData_CreateFromIDArray(m_CurDir, cidl, apidl, (IDataObject**)ppvOut);
383 }
384 else if (riid == IID_IDropTarget)
385 {
386 AddRef();
387 *ppvOut = static_cast<IDropTarget*>(this);
388 return S_OK;
389 }
390
391 DbgPrint("%s(%S) UNHANDLED\n", __FUNCTION__ , guid2string(riid));
392 return E_NOINTERFACE;
393}
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:311
#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 527 of file CZipFolder.cpp.

528{
529 WCHAR tmpPath[MAX_PATH];
530
531 if (SHGetPathFromIDListW(pidl, tmpPath))
532 {
533 m_ZipFile = tmpPath;
534 m_CurDir.Attach(ILClone(pidl));
535 return S_OK;
536 }
537 DbgPrint("%s() => Unable to parse pidl\n", __FUNCTION__);
538 return E_INVALIDARG;
539}
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 482 of file CZipFolder.cpp.

483{
484 FORMATETC etc = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
485 STGMEDIUM stg;
486
487 HRESULT hr = pDataObj->GetData(&etc, &stg);
489 return hr;
490
491 hr = E_FAIL;
492 HDROP hdrop = (HDROP)GlobalLock(stg.hGlobal);
493 if (hdrop)
494 {
495 UINT uNumFiles = DragQueryFileW(hdrop, 0xFFFFFFFF, NULL, 0);
496 if (uNumFiles == 1)
497 {
498 WCHAR szFile[MAX_PATH * 2];
499 if (DragQueryFileW(hdrop, 0, szFile, _countof(szFile)))
500 {
502 hr = SHParseDisplayName(szFile, NULL, &pidl, 0, NULL);
504 {
505 hr = Initialize(pidl);
506 }
507 }
508 else
509 {
510 DbgPrint("Failed to query the file.\r\n");
511 }
512 }
513 else
514 {
515 DbgPrint("Invalid number of files: %d\r\n", uNumFiles);
516 }
517 GlobalUnlock(stg.hGlobal);
518 }
519 else
520 {
521 DbgPrint("Could not lock stg.hGlobal\r\n");
522 }
523 ReleaseStgMedium(&stg);
524 return hr;
525}
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
voidp zipFile
Definition: zip.h:69

◆ InvokeCommand()

STDMETHODIMP CZipFolder::InvokeCommand ( LPCMINVOKECOMMANDINFO  pici)
override

Implements IContextMenu.

Definition at line 443 of file CZipFolder.cpp.

444{
445 if (!pici || (pici->cbSize != sizeof(CMINVOKECOMMANDINFO) && pici->cbSize != sizeof(CMINVOKECOMMANDINFOEX)))
446 return E_INVALIDARG;
447
448 if (pici->lpVerb == MAKEINTRESOURCEA(0) || (HIWORD(pici->lpVerb) && !strcmp(pici->lpVerb, EXTRACT_VERBA)))
449 {
450 BSTR ZipFile = m_ZipFile.AllocSysString();
452
453 DWORD tid;
455 if (hThread)
456 {
458 return S_OK;
459 }
460 }
461 return E_INVALIDARG;
462}
LONG g_ModuleRefCnt
Definition: ACPPage.cpp:13
#define InterlockedIncrement
Definition: armddk.h:53
BSTR AllocSysString() const
Definition: cstringt.h:1063
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
_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 HIWORD(l)
Definition: typedefs.h:247

◆ IsDirty()

STDMETHODIMP CZipFolder::IsDirty ( void  )
override

Implements IPersistFile.

Definition at line 541 of file CZipFolder.cpp.

542{
543 return S_FALSE;
544}

◆ Load()

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

Implements IPersistFile.

Definition at line 546 of file CZipFolder.cpp.

547{
549
552 if (SUCCEEDED(hr))
553 {
554 m_CurDir.Attach(pidl.Detach());
555 }
556
557 return S_OK;
558}
T * Detach()
Definition: atlalloc.h:168
#define SUCCEEDED(hr)
Definition: intsafe.h:50
WORD WORD PSZ PSZ pszFileName
Definition: vdmdbg.h:44

◆ MapColumnToSCID()

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

Implements IShellFolder2.

Definition at line 88 of file CZipFolder.hpp.

89 {
91 return E_NOTIMPL;
92 }

◆ ParseDisplayName()

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

Implements IShellFolder.

Definition at line 95 of file CZipFolder.hpp.

96 {
98 return E_NOTIMPL;
99 }

◆ QueryContextMenu()

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

Implements IContextMenu.

Definition at line 464 of file CZipFolder.cpp.

465{
466 UINT idCmd = idCmdFirst;
467
468 if (!(uFlags & CMF_DEFAULTONLY))
469 {
471
472 if (indexMenu)
473 {
474 InsertMenuW(hmenu, indexMenu++, MF_BYPOSITION | MF_SEPARATOR, 0, NULL);
475 }
476 InsertMenuW(hmenu, indexMenu++, MF_BYPOSITION | MF_STRING, idCmd++, menuText);
477 }
478
479 return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, idCmd - idCmdFirst);
480}
#define IDS_MENUITEM
Definition: resource.h:73
#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
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582

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

561{
562 return E_NOTIMPL;
563}

◆ SaveCompleted()

STDMETHODIMP CZipFolder::SaveCompleted ( LPCOLESTR  pszFileName)
override

Implements IPersistFile.

Definition at line 565 of file CZipFolder.cpp.

566{
567 return S_OK;
568}

◆ SetNameOf()

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

Implements IShellFolder.

Definition at line 115 of file CZipFolder.hpp.

116 {
118 return E_NOTIMPL;
119 }

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

314{
315 switch (uMsg)
316 {
318 {
319 CComQIIDPtr<I_ID(IContextMenu)> spContextMenu(psf);
320 if (!spContextMenu)
321 return E_NOINTERFACE;
322
323 QCMINFO *pqcminfo = (QCMINFO *)lParam;
324 HRESULT hr = spContextMenu->QueryContextMenu(pqcminfo->hmenu,
325 pqcminfo->indexMenu,
326 pqcminfo->idCmdFirst,
327 pqcminfo->idCmdLast,
328 CMF_NORMAL);
330 return hr;
331
332 pqcminfo->idCmdFirst += HRESULT_CODE(hr);
333 return S_OK;
334 }
336 {
337 CComQIIDPtr<I_ID(IContextMenu)> spContextMenu(psf);
338 if (!spContextMenu)
339 return E_NOINTERFACE;
340
341 CMINVOKECOMMANDINFO ici = { sizeof(ici) };
342 ici.lpVerb = MAKEINTRESOURCEA(wParam);
343 return spContextMenu->InvokeCommand(&ici);
344 }
345 case DFM_GETDEFSTATICID: // Required for Windows 7 to pick a default
346 return S_FALSE;
347 }
348 return E_NOTIMPL;
349}
#define I_ID(Itype)
Definition: atlcomcli.h:215
WPARAM wParam
Definition: combotst.c:138
#define DFM_GETDEFSTATICID
Definition: precomp.h:47
#define DFM_MERGECONTEXTMENU
Definition: precomp.h:44
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
HMENU hmenu
Definition: shlobj.h:1395
UINT idCmdLast
Definition: shlobj.h:1398
UINT idCmdFirst
Definition: shlobj.h:1397
UINT indexMenu
Definition: shlobj.h:1396
#define HRESULT_CODE(hr)
Definition: winerror.h:188

Referenced by GetUIObjectOf().

Member Data Documentation

◆ m_CurDir

CComHeapPtr<ITEMIDLIST> CZipFolder::m_CurDir
private

Definition at line 44 of file CZipFolder.hpp.

Referenced by BindToObject(), Drop(), GetCurFolder(), GetUIObjectOf(), Initialize(), and Load().

◆ 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(), Drop(), EnumObjects(), and Initialize().

◆ m_ZipFile

CStringW CZipFolder::m_ZipFile
private

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