ReactOS  0.4.15-dev-483-ga77a65a
CZipExtract Class Reference
Inheritance diagram for CZipExtract:
Collaboration diagram for CZipExtract:

Classes

class  CCompleteSettingsPage
 
class  CExtractSettingsPage
 

Public Member Functions

 CZipExtract (PCWSTR Filename)
 
 ~CZipExtract ()
 
void Close ()
 
STDMETHODIMP QueryInterface (REFIID riid, void **ppvObject)
 
 STDMETHODIMP_ (ULONG) AddRef(void)
 
 STDMETHODIMP_ (ULONG) Release(void)
 
 STDMETHODIMP_ (unzFile) getZip()
 
void runWizard ()
 
bool Extract (HWND hDlg, HWND hProgress, const bool *bCancel)
 
- Public Member Functions inherited from IUnknown
ULONG AddRef ()
 
ULONG Release ()
 

Private Attributes

CStringW m_Filename
 
CStringW m_Directory
 
CStringA m_Password
 
bool m_DirectoryChanged
 
unzFile uf
 

Additional Inherited Members

- Public Types inherited from IUnknown
typedef IUnknownLPUNKNOWN
 

Detailed Description

Definition at line 10 of file CZipExtract.cpp.

Constructor & Destructor Documentation

◆ CZipExtract()

CZipExtract::CZipExtract ( PCWSTR  Filename)
inline

Definition at line 19 of file CZipExtract.cpp.

20  :m_DirectoryChanged(false)
21  ,uf(NULL)
22  {
25  PWSTR Dir = m_Directory.GetBuffer();
28  }
CStringW m_Filename
Definition: CZipExtract.cpp:13
uint16_t * PWSTR
Definition: typedefs.h:55
IN PVCB IN PBCB OUT PDIRENT IN USHORT IN POEM_STRING Filename
Definition: fatprocs.h:934
bool m_DirectoryChanged
Definition: CZipExtract.cpp:16
CStringW m_Directory
Definition: CZipExtract.cpp:14
void ReleaseBuffer(_In_ int nNewLength=-1)
Definition: atlsimpstr.h:372
void WINAPI PathRemoveExtensionW(LPWSTR lpszPath)
Definition: path.c:818
smooth NULL
Definition: ftsmooth.c:416
unzFile uf
Definition: CZipExtract.cpp:17

◆ ~CZipExtract()

CZipExtract::~CZipExtract ( )
inline

Definition at line 30 of file CZipExtract.cpp.

31  {
32  if (uf)
33  {
34  DPRINT1("WARNING: uf not closed!\n");
35  Close();
36  }
37  }
void Close()
Definition: CZipExtract.cpp:39
unzFile uf
Definition: CZipExtract.cpp:17
#define DPRINT1
Definition: precomp.h:8

Member Function Documentation

◆ Close()

void CZipExtract::Close ( )
inline

Definition at line 39 of file CZipExtract.cpp.

40  {
41  if (uf)
42  unzClose(uf);
43  uf = NULL;
44  }
int ZEXPORT unzClose(unzFile file)
Definition: unzip.c:808
smooth NULL
Definition: ftsmooth.c:416
unzFile uf
Definition: CZipExtract.cpp:17

Referenced by Extract(), and ~CZipExtract().

◆ Extract()

bool CZipExtract::Extract ( HWND  hDlg,
HWND  hProgress,
const bool bCancel 
)
inline

Definition at line 345 of file CZipExtract.cpp.

346  {
349  int err = unzGetGlobalInfo64(uf, &gi);
350  if (err != UNZ_OK)
351  {
352  DPRINT1("ERROR, unzGetGlobalInfo64: 0x%x\n", err);
353  Close();
354  return false;
355  }
356 
357  CZipEnumerator zipEnum;
358  if (!zipEnum.initialize(this))
359  {
360  DPRINT1("ERROR, zipEnum.initialize\n");
361  Close();
362  return false;
363  }
364 
365  CWindow Progress(hProgress);
366  Progress.SendMessage(PBM_SETRANGE32, 0, gi.number_entry);
367  Progress.SendMessage(PBM_SETPOS, 0, 0);
368 
369  BYTE Buffer[2048];
370  CStringA BaseDirectory = m_Directory;
371  CStringA Name;
374  int CurrentFile = 0;
375  bool bOverwriteAll = false;
376  while (zipEnum.next(Name, Info))
377  {
378  if (*bCancel)
379  {
380  Close();
381  return false;
382  }
383 
384  bool is_dir = Name.GetLength() > 0 && Name[Name.GetLength()-1] == '/';
385 
386  char CombinedPath[MAX_PATH * 2] = { 0 };
387  PathCombineA(CombinedPath, BaseDirectory, Name);
388  CStringA FullPath = CombinedPath;
389  FullPath.Replace('/', '\\'); /* SHPathPrepareForWriteA does not handle '/' */
391  HRESULT hr = SHPathPrepareForWriteA(hDlg, NULL, FullPath, dwFlags);
392  if (FAILED_UNEXPECTEDLY(hr))
393  {
394  Close();
395  return false;
396  }
397  CurrentFile++;
398  if (is_dir)
399  continue;
400 
401  if (Info.flag & MINIZIP_PASSWORD_FLAG)
402  {
404  do
405  {
406  /* If there is a password set, try it */
407  if (!Password.IsEmpty())
408  {
410  if (err == UNZ_OK)
411  {
412  /* Try to read some bytes, because unzOpenCurrentFilePassword does not return failure */
413  char Buf[10];
414  err = unzReadCurrentFile(uf, Buf, sizeof(Buf));
416  if (err >= UNZ_OK)
417  {
418  /* 're'-open the file so that we can begin to extract */
420  break;
421  }
422  }
423  }
425  } while (Response == eAccept);
426 
427  if (Response == eSkip)
428  {
429  Progress.SendMessage(PBM_SETPOS, CurrentFile, 0);
430  continue;
431  }
432  else if (Response == eAbort)
433  {
434  Close();
435  return false;
436  }
437  }
438  else
439  {
441  }
442 
443  if (err != UNZ_OK)
444  {
445  DPRINT1("ERROR, unzOpenCurrentFilePassword: 0x%x\n", err);
446  Close();
447  return false;
448  }
449 
452  {
454  if (dwErr == ERROR_FILE_EXISTS)
455  {
456  bool bOverwrite = bOverwriteAll;
457  if (!bOverwriteAll)
458  {
459  eZipConfirmResponse Result = _CZipAskReplace(hDlg, FullPath);
460  switch (Result)
461  {
462  case eYesToAll:
463  bOverwriteAll = true;
464  case eYes:
465  bOverwrite = true;
466  break;
467  case eNo:
468  break;
469  case eCancel:
471  Close();
472  return false;
473  }
474  }
475 
476  if (bOverwrite)
477  {
480  {
481  dwErr = GetLastError();
482  }
483  }
484  else
485  {
487  continue;
488  }
489  }
491  {
493  DPRINT1("ERROR, CreateFileA: 0x%x (%s)\n", dwErr, bOverwriteAll ? "Y" : "N");
494  Close();
495  return false;
496  }
497  }
498 
499  do
500  {
501  if (*bCancel)
502  {
504  BOOL deleteResult = DeleteFileA(FullPath);
505  if (deleteResult == 0)
506  DPRINT1("ERROR, DeleteFileA: 0x%x\n", GetLastError());
507  Close();
508  return false;
509  }
510 
511  err = unzReadCurrentFile(uf, Buffer, sizeof(Buffer));
512 
513  if (err < 0)
514  {
515  DPRINT1("ERROR, unzReadCurrentFile: 0x%x\n", err);
516  break;
517  }
518  else if (err > 0)
519  {
520  DWORD dwWritten;
521  if (!WriteFile(hFile, Buffer, err, &dwWritten, NULL))
522  {
523  DPRINT1("ERROR, WriteFile: 0x%x\n", GetLastError());
524  break;
525  }
526  if (dwWritten != (DWORD)err)
527  {
528  DPRINT1("ERROR, WriteFile: dwWritten:%d err:%d\n", dwWritten, err);
529  break;
530  }
531  }
532 
533  } while (err > 0);
534 
535  /* Update Filetime */
536  FILETIME LocalFileTime;
537  DosDateTimeToFileTime((WORD)(Info.dosDate >> 16), (WORD)Info.dosDate, &LocalFileTime);
538  FILETIME FileTime;
539  LocalFileTimeToFileTime(&LocalFileTime, &FileTime);
540  SetFileTime(hFile, &FileTime, &FileTime, &FileTime);
541 
542  /* Done */
544 
545  if (err)
546  {
548  DPRINT1("ERROR, unzReadCurrentFile2: 0x%x\n", err);
549  Close();
550  return false;
551  }
552  else
553  {
555  if (err != UNZ_OK)
556  {
557  DPRINT1("ERROR(non-fatal), unzCloseCurrentFile: 0x%x\n", err);
558  }
559  }
560  Progress.SendMessage(PBM_SETPOS, CurrentFile, 0);
561  }
562 
563  Close();
564  return true;
565  }
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
#define ERROR_FILE_EXISTS
Definition: winerror.h:165
#define PBM_SETRANGE32
Definition: commctrl.h:2184
#define CloseHandle
Definition: compat.h:407
HRESULT hr
Definition: shlfolder.c:183
CStringW m_Filename
Definition: CZipExtract.cpp:13
eZipPasswordResponse _CZipAskPassword(HWND hDlg, const char *filename, CStringA &Password)
Definition: precomp.h:71
#define UNZ_OK
Definition: unzip.h:74
#define INVALID_HANDLE_VALUE
Definition: compat.h:400
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
CStringA m_Password
Definition: CZipExtract.cpp:15
#define PBM_SETPOS
Definition: commctrl.h:2180
bool initialize(IZip *zip)
void Close()
Definition: CZipExtract.cpp:39
struct TraceInfo Info
CStringW m_Directory
Definition: CZipExtract.cpp:14
BOOL WINAPI SetFileTime(IN HANDLE hFile, CONST FILETIME *lpCreationTime OPTIONAL, CONST FILETIME *lpLastAccessTime OPTIONAL, CONST FILETIME *lpLastWriteTime OPTIONAL)
Definition: fileinfo.c:1098
BOOL WINAPI LocalFileTimeToFileTime(IN CONST FILETIME *lpLocalFileTime, OUT LPFILETIME lpFileTime)
Definition: time.c:253
int ZEXPORT unzOpenCurrentFile(unzFile file)
Definition: unzip.c:1641
int ZEXPORT unzGetGlobalInfo64(unzFile file, unz_global_info64 *pglobal_info)
Definition: unzip.c:828
#define SHPPFW_DIRCREATE
Definition: shlobj.h:303
unsigned int BOOL
Definition: ntddk_ex.h:94
#define GENERIC_WRITE
Definition: nt_native.h:90
eZipConfirmResponse _CZipAskReplace(HWND hDlg, PCSTR FullPath)
struct NameRec_ * Name
Definition: cdprocs.h:459
Definition: precomp.h:63
eZipConfirmResponse
Definition: precomp.h:69
smooth NULL
Definition: ftsmooth.c:416
int ZEXPORT unzReadCurrentFile(unzFile file, voidp buf, unsigned len)
Definition: unzip.c:1684
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
Definition: precomp.h:73
Definition: bufpool.h:45
DWORD dwErr
Definition: service.c:36
unzFile uf
Definition: CZipExtract.cpp:17
int ZEXPORT unzCloseCurrentFile(unzFile file)
Definition: unzip.c:2004
BOOL WINAPI DosDateTimeToFileTime(IN WORD wFatDate, IN WORD wFatTime, OUT LPFILETIME lpFileTime)
Definition: time.c:75
LONG HRESULT
Definition: typedefs.h:78
#define FAILED_UNEXPECTEDLY(hr)
Definition: shellutils.h:71
unzFile ZEXPORT unzOpen2_64(const void *path, zlib_filefunc64_def *pzlib_filefunc_def)
Definition: unzip.c:778
#define MAX_PATH
Definition: compat.h:26
zlib_filefunc64_def g_FFunc
Definition: zipfldr.cpp:43
PCXSTR GetString() const
Definition: atlsimpstr.h:361
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned long DWORD
Definition: ntddk_ex.h:95
LPSTR WINAPI PathCombineA(LPSTR lpszDest, LPCSTR lpszDir, LPCSTR lpszFile)
Definition: path.c:154
int ZEXPORT unzOpenCurrentFilePassword(unzFile file, const char *password)
Definition: unzip.c:1646
Definition: ncftp.h:89
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:126
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
#define MINIZIP_PASSWORD_FLAG
Definition: precomp.h:43
#define err(...)
_In_ HANDLE hFile
Definition: mswsock.h:90
unsigned char BYTE
Definition: xxhash.c:193
EXTERN_C HRESULT WINAPI SHPathPrepareForWriteA(HWND hwnd, IUnknown *modless, LPCSTR path, DWORD flags)
Definition: shlfileop.cpp:2223
int Replace(PCXSTR pszOld, PCXSTR pszNew)
Definition: cstringt.h:746
#define CREATE_ALWAYS
Definition: disk.h:72
bool next(CStringA &name, unz_file_info64 &info)
eZipPasswordResponse
Definition: precomp.h:60
#define DPRINT1
Definition: precomp.h:8
Definition: precomp.h:62
#define SHPPFW_NONE
Definition: shlobj.h:302
#define SHPPFW_IGNOREFILENAME
Definition: shlobj.h:306
#define CREATE_NEW
Definition: disk.h:69
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:408
ZPOS64_T number_entry
Definition: unzip.h:98

Referenced by CZipExtract::CExtractSettingsPage::ExtractEntry().

◆ QueryInterface()

STDMETHODIMP CZipExtract::QueryInterface ( REFIID  riid,
void **  ppvObject 
)
inline

Implements IUnknown.

Definition at line 47 of file CZipExtract.cpp.

48  {
49  if (riid == IID_IUnknown)
50  {
51  *ppvObject = this;
52  AddRef();
53  return S_OK;
54  }
55  return E_NOINTERFACE;
56  }
#define E_NOINTERFACE
Definition: winerror.h:2364
REFIID riid
Definition: precomp.h:44
const GUID IID_IUnknown
ULONG AddRef()
REFIID LPVOID * ppvObject
Definition: precomp.h:44
#define S_OK
Definition: intsafe.h:59

◆ runWizard()

void CZipExtract::runWizard ( )
inline

Definition at line 325 of file CZipExtract.cpp.

326  {
327  PROPSHEETHEADERW psh = { sizeof(psh), 0 };
328  psh.dwFlags = PSH_WIZARD97 | PSH_HEADER;
329  psh.hInstance = _AtlBaseModule.GetResourceInstance();
330 
331  CExtractSettingsPage extractPage(this, &m_Password);
332  CCompleteSettingsPage completePage(this);
333  HPROPSHEETPAGE hpsp[] =
334  {
335  extractPage.Create(),
336  completePage.Create()
337  };
338 
339  psh.phpage = hpsp;
340  psh.nPages = _countof(hpsp);
341 
342  PropertySheetW(&psh);
343  }
CStringA m_Password
Definition: CZipExtract.cpp:15
struct _PSP * HPROPSHEETPAGE
Definition: mstask.idl:90
INT_PTR WINAPI PropertySheetW(LPCPROPSHEETHEADERW lppsh)
Definition: propsheet.c:2905
HINSTANCE hInstance
Definition: prsht.h:296
#define _countof(array)
Definition: sndvol32.h:68
DWORD dwFlags
Definition: prsht.h:294
HPROPSHEETPAGE * phpage
Definition: prsht.h:309

Referenced by _CZipExtract_runWizard().

◆ STDMETHODIMP_() [1/3]

CZipExtract::STDMETHODIMP_ ( ULONG  )
inline

Definition at line 57 of file CZipExtract.cpp.

58  {
59  return 2;
60  }

◆ STDMETHODIMP_() [2/3]

CZipExtract::STDMETHODIMP_ ( ULONG  )
inline

Definition at line 61 of file CZipExtract.cpp.

62  {
63  return 1;
64  }

◆ STDMETHODIMP_() [3/3]

CZipExtract::STDMETHODIMP_ ( unzFile  )
inlinevirtual

Reimplemented from IZip.

Definition at line 65 of file CZipExtract.cpp.

66  {
67  return uf;
68  }
unzFile uf
Definition: CZipExtract.cpp:17

Member Data Documentation

◆ m_Directory

◆ m_DirectoryChanged

◆ m_Filename

CStringW CZipExtract::m_Filename
private

Definition at line 13 of file CZipExtract.cpp.

Referenced by CZipExtract(), and Extract().

◆ m_Password

CStringA CZipExtract::m_Password
private

Definition at line 15 of file CZipExtract.cpp.

Referenced by Extract(), and runWizard().

◆ uf

unzFile CZipExtract::uf
private

Definition at line 17 of file CZipExtract.cpp.

Referenced by Close(), Extract(), STDMETHODIMP_(), and ~CZipExtract().


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