ReactOS 0.4.16-dev-2208-g6350669
CZipFolder.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Zip Shell Extension
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Main class
5 * COPYRIGHT: Copyright 2017 Mark Jansen (mark.jansen@reactos.org)
6 * Copyright 2023-2026 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
7 */
8
9#include "precomp.h"
10
12{
20};
21
23{
24}
25
27{
28 Close();
29}
30
32{
33 if (m_UnzipFile)
36}
37
38STDMETHODIMP_(unzFile) CZipFolder::getZip()
39{
40 if (!m_UnzipFile)
42 return m_UnzipFile;
43}
44
46{
48 m_ZipDir = zipDir;
49
50 m_CurDir.Attach(ILCombine(curDir, pidl));
51 return S_OK;
52}
53
55{
56 CComBSTR ZipFile;
57 ZipFile.Attach((BSTR)arg);
58
60
62 return 0;
63}
64
65// Adapted from CFileDefExt::GetFileTimeString
66BOOL CZipFolder::_GetFileTimeString(LPFILETIME lpFileTime, PWSTR pwszResult, UINT cchResult)
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}
93
95{
96 if (!pcsFlags || iColumn >= _countof(g_ColumnDefs))
97 return E_INVALIDARG;
98 *pcsFlags = g_ColumnDefs[iColumn].dwDefaultState;
99 return S_OK;
100}
101
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}
182
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}
206
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}
236
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}
274
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}
310
312 IShellFolder *psf, HWND hwnd, IDataObject *pdtobj,
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) };
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}
350
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}
394
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}
413
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}
442
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}
463
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}
481
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}
526
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}
540
542{
543 return S_FALSE;
544}
545
547{
549
552 if (SUCCEEDED(hr))
553 {
554 m_CurDir.Attach(pidl.Detach());
555 }
556
557 return S_OK;
558}
559
561{
562 return E_NOTIMPL;
563}
564
566{
567 return S_OK;
568}
569
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}
587
589{
590 *pdwEffect &= DROPEFFECT_COPY;
591 return S_OK;
592}
593
595{
596 *pdwEffect &= DROPEFFECT_COPY;
597 return S_OK;
598}
599
601{
602 return S_OK;
603}
604
605STDMETHODIMP CZipFolder::Drop(IDataObject* pDataObj, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect)
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}
LONG g_ModuleRefCnt
Definition: ACPPage.cpp:13
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:4823
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)
HRESULT _CExplorerCommandProvider_CreateInstance(IContextMenu *zipObject, REFIID riid, LPVOID *ppvOut)
EXTERN_C HRESULT WINAPI SHCreateFileExtractIconW(_In_ LPCWSTR pszFile, _In_ DWORD dwFileAttributes, _In_ REFIID riid, _Outptr_ void **ppv)
HRESULT _CFolderViewCB_CreateInstance(REFIID riid, LPVOID *ppvOut)
static FolderViewColumns g_ColumnDefs[]
Definition: CFontExt.cpp:34
void _CZipExtract_runWizard(PCWSTR Filename)
static FolderViewColumns g_ColumnDefs[]
Definition: CZipFolder.cpp:11
@ COL_COMPRSIZE
Definition: CZipFolder.hpp:15
@ COL_PASSWORD
Definition: CZipFolder.hpp:16
@ COL_RATIO
Definition: CZipFolder.hpp:18
@ COL_NAME
Definition: CZipFolder.hpp:13
@ COL_DATE_MOD
Definition: CZipFolder.hpp:19
@ COL_TYPE
Definition: CZipFolder.hpp:14
@ COL_SIZE
Definition: CZipFolder.hpp:17
WCHAR * guid2string(REFCLSID iid)
Definition: Debug.cpp:21
UINT cchMax
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define I_ID(Itype)
Definition: atlcomcli.h:215
#define IDS_YES
Definition: resource.h:16
#define IDS_NO
Definition: resource.h:17
#define IDS_COL_TYPE
Definition: resource.h:9
#define CF_HDROP
Definition: constants.h:410
#define DPRINT1
Definition: precomp.h:8
#define STDMETHODIMP
Definition: basetyps.h:43
#define STDMETHODIMP_(t)
Definition: basetyps.h:44
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
void Attach(BSTR bstr)
Definition: atlcomcli.h:379
bool IsEmpty() const noexcept
Definition: atlsimpstr.h:394
int GetLength() const noexcept
Definition: atlsimpstr.h:362
BSTR AllocSysString() const
Definition: cstringt.h:1063
Definition: bufpool.h:45
T * Detach()
Definition: atlalloc.h:168
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)
CStringW m_ZipFile
Definition: CZipFolder.hpp:42
STDMETHODIMP Save(LPCOLESTR pszFileName, BOOL fRemember) override
Definition: CZipFolder.cpp:560
STDMETHODIMP DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) override
Definition: CZipFolder.cpp:594
STDMETHODIMP CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) override
Definition: CZipFolder.cpp:207
STDMETHODIMP GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override
Definition: CZipFolder.cpp:102
STDMETHODIMP IsDirty() override
Definition: CZipFolder.cpp:541
STDMETHODIMP DragEnter(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) override
Definition: CZipFolder.cpp:588
STDMETHODIMP SaveCompleted(LPCOLESTR pszFileName) override
Definition: CZipFolder.cpp:565
STDMETHODIMP DragLeave() override
Definition: CZipFolder.cpp:600
STDMETHODIMP GetCurFile(LPOLESTR *ppszFileName) override
Definition: CZipFolder.cpp:570
static HRESULT CALLBACK ZipFolderMenuCallback(IShellFolder *psf, HWND hwnd, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: CZipFolder.cpp:311
STDMETHODIMP QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) override
Definition: CZipFolder.cpp:464
void Close()
Definition: CZipFolder.cpp:31
STDMETHODIMP Load(LPCOLESTR pszFileName, DWORD dwMode) override
Definition: CZipFolder.cpp:546
STDMETHODIMP GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override
Definition: CZipFolder.cpp:275
STDMETHODIMP GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
Definition: CZipFolder.cpp:395
STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO pici) override
Definition: CZipFolder.cpp:443
CComHeapPtr< ITEMIDLIST > m_CurDir
Definition: CZipFolder.hpp:44
unzFile m_UnzipFile
Definition: CZipFolder.hpp:45
STDMETHODIMP GetCommandString(UINT_PTR idCmd, UINT uFlags, UINT *pwReserved, LPSTR pszName, UINT cchMax) override
Definition: CZipFolder.cpp:414
HRESULT Initialize(PCWSTR zipFile, PCWSTR zipDir, PCUIDLIST_ABSOLUTE curDir, PCUIDLIST_RELATIVE pidl)
Definition: CZipFolder.cpp:45
STDMETHODIMP CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override
Definition: CZipFolder.cpp:237
STDMETHODIMP GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) override
Definition: CZipFolder.cpp:351
CStringW m_ZipDir
Definition: CZipFolder.hpp:43
STDMETHODIMP BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
Definition: CZipFolder.cpp:183
static DWORD WINAPI s_ExtractProc(LPVOID arg)
Definition: CZipFolder.cpp:54
STDMETHODIMP Drop(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) override
Definition: CZipFolder.cpp:605
BOOL _GetFileTimeString(LPFILETIME lpFileTime, PWSTR pwszResult, UINT cchResult)
Definition: CZipFolder.cpp:66
STDMETHODIMP GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags) override
Definition: CZipFolder.cpp:94
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define ERROR_SUCCESS
Definition: deptool.c:10
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define IDS_COL_NAME
Definition: resource.h:17
#define IDS_COL_SIZE
Definition: resource.h:18
#define DFM_GETDEFSTATICID
Definition: precomp.h:47
#define DFM_MERGECONTEXTMENU
Definition: precomp.h:44
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
zlib_filefunc64_def g_FFunc
Definition: zipfldr.cpp:44
#define EXTRACT_VERBA
Definition: precomp.h:25
#define EXTRACT_VERBW
Definition: precomp.h:26
#define IDS_COL_DATE_MOD
Definition: resource.h:44
#define IDS_COL_RATIO
Definition: resource.h:43
#define IDS_MENUITEM
Definition: resource.h:73
#define IDS_COL_COMPRSIZE
Definition: resource.h:40
#define IDS_COL_PASSWORD
Definition: resource.h:41
#define IDS_HELPTEXT
Definition: resource.h:74
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
UINT uFlags
Definition: api.c:59
#define CloseHandle
Definition: compat.h:739
OLECHAR * BSTR
Definition: compat.h:2293
#define MAX_PATH
Definition: compat.h:34
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define CALLBACK
Definition: compat.h:35
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
BOOL WINAPI FileTimeToSystemTime(IN CONST FILETIME *lpFileTime, OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:188
BOOL WINAPI DosDateTimeToFileTime(IN WORD wFatDate, IN WORD wFatTime, OUT LPFILETIME lpFileTime)
Definition: time.c:75
const UINT * keys
Definition: locale.c:416
int WINAPI StrCmpIW(const WCHAR *str, const WCHAR *comp)
Definition: string.c:456
_ACRTIMP int __cdecl strcmp(const char *, const char *)
Definition: string.c:3319
void WINAPI ReleaseStgMedium(STGMEDIUM *pmedium)
Definition: ole2.c:2033
UINT WINAPI DragQueryFileW(HDROP hDrop, UINT lFile, LPWSTR lpszwFile, UINT lLength)
Definition: shellole.c:666
LPWSTR WINAPI StrFormatByteSizeW(LONGLONG llBytes, LPWSTR lpszDest, UINT cchMax)
Definition: string.c:2524
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:30
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
#define MAKE_HRESULT(sev, fac, code)
Definition: dmerror.h:29
#define pt(x, y)
Definition: drawing.c:79
#define L(x)
Definition: resources.c:13
#define __FUNCTION__
Definition: types.h:116
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint res
Definition: glext.h:9613
GLuint64EXT * result
Definition: glext.h:11304
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
#define DbgPrint
Definition: hal.h:12
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426
REFIID riid
Definition: atlbase.h:39
static TfClientId tid
HRESULT GetData([in, unique] FORMATETC *pformatetcIn, [out] STGMEDIUM *pmedium)
const DWORD DROPEFFECT_COPY
Definition: oleidl.idl:930
ULONG AddRef()
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
static ERESOURCE GlobalLock
Definition: sys_arch.c:8
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
LONG_PTR LPARAM
Definition: minwindef.h:175
UINT_PTR WPARAM
Definition: minwindef.h:174
unsigned __int64 ULONG64
Definition: imports.h:198
static LPOLESTR
Definition: stg_prop.c:27
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
static HMENU hmenu
Definition: win.c:66
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
unsigned int UINT
Definition: ndis.h:50
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
HANDLE hThread
Definition: wizard.c:28
#define KEY_READ
Definition: nt_native.h:1026
#define KEY_QUERY_VALUE
Definition: nt_native.h:1019
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
#define LOCALE_USER_DEFAULT
interface IBindCtx * LPBC
Definition: objfwd.h:18
interface IDataObject * LPDATAOBJECT
Definition: objfwd.h:21
const GUID IID_IDataObject
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:238
HRESULT WINAPI SHParseDisplayName(LPCWSTR pszName, IBindCtx *pbc, LPITEMIDLIST *ppidl, SFGAOF sfgaoIn, SFGAOF *psfgaoOut)
Definition: pidl.c:1548
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:817
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1496
LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
Definition: pidl.c:977
#define LVCFMT_LEFT
Definition: commctrl.h:2603
#define LVCFMT_RIGHT
Definition: commctrl.h:2604
#define REFIID
Definition: guiddef.h:118
static WCHAR szFilePath[]
Definition: qotd.c:14
wcscpy
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
HRESULT WINAPI CIDLData_CreateFromIDArray(PCIDLIST_ABSOLUTE pidlFolder, UINT cpidlFiles, PCUIDLIST_RELATIVE_ARRAY lppidlFiles, LPDATAOBJECT *ppdataObject)
Definition: shellord.c:2419
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:678
HRESULT hr
Definition: shlfolder.c:183
struct _SFV_CREATE SFV_CREATE
const ITEMIDLIST_ABSOLUTE UNALIGNED * PCUIDLIST_ABSOLUTE
Definition: shtypes.idl:63
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
Definition: shtypes.idl:71
const ITEMID_CHILD UNALIGNED * PCUITEMID_CHILD
Definition: shtypes.idl:70
@ SHCOLSTATE_TYPE_DATE
Definition: shtypes.idl:123
@ SHCOLSTATE_TYPE_STR
Definition: shtypes.idl:121
@ SHCOLSTATE_ONBYDEFAULT
Definition: shtypes.idl:125
const ITEMIDLIST_RELATIVE UNALIGNED * PCUIDLIST_RELATIVE
Definition: shtypes.idl:57
#define _countof(array)
Definition: sndvol32.h:70
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
STRSAFEAPI StringCchCopyExW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc, STRSAFE_LPWSTR *ppszDestEnd, size_t *pcchRemaining, STRSAFE_DWORD dwFlags)
Definition: strsafe.h:184
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
DWORD dwDefaultState
Definition: CFontExt.cpp:20
STRRET str
Definition: shtypes.idl:108
WCHAR Name[1]
Definition: zippidl.hpp:28
ULONG64 UncompressedSize
Definition: zippidl.hpp:25
BOOLEAN Password
Definition: zippidl.hpp:21
ZipPidlType ZipType
Definition: zippidl.hpp:22
ULONG DosDate
Definition: zippidl.hpp:26
ULONG64 CompressedSize
Definition: zippidl.hpp:24
HMENU hmenu
Definition: shlobj.h:1395
UINT idCmdLast
Definition: shlobj.h:1398
UINT idCmdFirst
Definition: shlobj.h:1397
UINT indexMenu
Definition: shlobj.h:1396
IShellFolderViewCB * psfvcb
Definition: shlobj.h:1365
WCHAR szTypeName[80]
Definition: shellapi.h:388
uint16_t * PWSTR
Definition: typedefs.h:56
const uint16_t * PCWSTR
Definition: typedefs.h:57
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define HIWORD(l)
Definition: typedefs.h:247
unzFile ZEXPORT unzOpen2_64(const void *path, zlib_filefunc64_def *pzlib_filefunc_def)
Definition: unzip.c:783
int ZEXPORT unzClose(unzFile file)
Definition: unzip.c:813
voidp unzFile
Definition: unzip.h:70
DWORD dwAttributes
Definition: vdmdbg.h:34
WORD WORD PSZ PSZ pszFileName
Definition: vdmdbg.h:44
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define WINAPI
Definition: msvc.h:6
#define FACILITY_NULL
Definition: winerror.h:24
#define S_FALSE
Definition: winerror.h:3451
#define E_NOINTERFACE
Definition: winerror.h:3479
#define SEVERITY_SUCCESS
Definition: winerror.h:177
#define HRESULT_CODE(hr)
Definition: winerror.h:188
#define DATE_SHORTDATE
Definition: winnls.h:209
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
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 MAKEINTRESOURCEA(i)
Definition: winuser.h:581
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
static void Initialize()
Definition: xlate.c:212
#define IID_PPV_ARG(Itype, ppType)
__wchar_t WCHAR
Definition: xmlstorage.h:180
char * LPSTR
Definition: xmlstorage.h:182
voidp zipFile
Definition: zip.h:69
const ZipPidlEntry * _ZipFromIL(LPCITEMIDLIST pidl)
Definition: zippidl.cpp:41
@ ZIP_PIDL_FILE
Definition: zippidl.hpp:13
@ ZIP_PIDL_DIRECTORY
Definition: zippidl.hpp:12