From 02d6107c97b48888362e7c6a70dcac323c89d741 Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Sun, 17 Dec 2023 21:23:58 +0100 Subject: ZipArchive: Update to the 4.6.9 release --- zip/ZipArchive/ZipPlatformComm.cpp | 73 +++++++++++++++++++++++++++----------- 1 file changed, 53 insertions(+), 20 deletions(-) (limited to 'zip/ZipArchive/ZipPlatformComm.cpp') diff --git a/zip/ZipArchive/ZipPlatformComm.cpp b/zip/ZipArchive/ZipPlatformComm.cpp index 62469e2..1034ae3 100644 --- a/zip/ZipArchive/ZipPlatformComm.cpp +++ b/zip/ZipArchive/ZipPlatformComm.cpp @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// -// This source file is part of the ZipArchive library source distribution and -// is Copyrighted 2000 - 2007 by Artpol Software - Tadeusz Dracz +// This source file is part of the ZipArchive Library Open Source distribution +// and is Copyrighted 2000 - 2022 by Artpol Software - Tadeusz Dracz // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -9,27 +9,17 @@ // // For the licensing details refer to the License.txt file. // -// Web Site: http://www.artpol-software.com +// Web Site: https://www.artpol-software.com //////////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "ZipFile.h" #include "ZipPlatform.h" #include "ZipException.h" +#include "ZipAutoBuffer.h" using namespace ZipPlatform; -bool ZipPlatform::DirectoryExists(LPCTSTR lpszDir) -{ - CZipString sz; - if (!GetCurrentDirectory(sz)) - return false; - if (!ChangeDirectory(lpszDir)) - return false; - ChangeDirectory(sz); - return true; -} - bool ZipPlatform::ForceDirectory(LPCTSTR lpDirectory) { ASSERT(lpDirectory); @@ -41,7 +31,7 @@ bool ZipPlatform::ForceDirectory(LPCTSTR lpDirectory) return true; if (!ForceDirectory(zpc.GetFilePath())) return false; - if (!CreateDirectory(szDirectory)) + if (!CreateNewDirectory(szDirectory)) return false; return true; } @@ -49,7 +39,7 @@ bool ZipPlatform::ForceDirectory(LPCTSTR lpDirectory) bool ZipPlatform::GetFileSize(LPCTSTR lpszFileName, ZIP_SIZE_TYPE& dSize) { CZipFile f; - if (!f.Open(lpszFileName, CZipFile::modeRead | CZipFile::shareDenyWrite, false)) + if (!f.Open(lpszFileName, CZipFile::modeRead | CZipFile::shareDenyNone, false)) return false; bool ret; try @@ -60,14 +50,14 @@ bool ZipPlatform::GetFileSize(LPCTSTR lpszFileName, ZIP_SIZE_TYPE& dSize) if (ret) dSize = (ZIP_SIZE_TYPE)size; } -#ifdef ZIP_ARCHIVE_MFC +#ifdef _ZIP_IMPL_MFC catch(CZipBaseException* e) { e->Delete(); ret = false; } #else - catch(CZipBaseException e) + catch(CZipBaseException&) { ret = false; } @@ -77,13 +67,13 @@ bool ZipPlatform::GetFileSize(LPCTSTR lpszFileName, ZIP_SIZE_TYPE& dSize) { f.Close(); } -#ifdef ZIP_ARCHIVE_MFC +#ifdef _ZIP_IMPL_MFC catch(CZipBaseException* e) { e->Delete(); } #else - catch(CZipBaseException e) + catch(CZipBaseException&) { } #endif @@ -91,4 +81,47 @@ bool ZipPlatform::GetFileSize(LPCTSTR lpszFileName, ZIP_SIZE_TYPE& dSize) return ret; } +void ZipPlatform::ConvertTimeToFileTime(const time_t& ttime, ZFILETIME& fileTime) +{ + time_t t = ttime > 0 ? ttime : time(NULL); + LONGLONG val = ((LONGLONG)t * 10000000) + SUFFIX_I64(116444736000000000); + fileTime.dwLowDateTime = (DWORD)(val & 0xFFFFFFFF); + fileTime.dwHighDateTime = (DWORD)((val >> 32) & 0xFFFFFFFF); +} + +bool ZipPlatform::ConvertFileTimeToTime(const ZFILETIME& fileTime, time_t& ttime) +{ + if ( fileTime.dwLowDateTime == 0 && fileTime.dwHighDateTime == 0) + { + ttime = 0; + return false; + } + LONGLONG val = (fileTime.dwLowDateTime & 0xFFFFFFFF); + + val |= ((LONGLONG)fileTime.dwHighDateTime << 32) & SUFFIX_I64(0xFFFFFFFF00000000); + val -= SUFFIX_I64(116444736000000000); + + ttime = (time_t)(val / 10000000); + return ttime > 0; +} + +#ifdef _UNICODE + +int ZipPlatform::WideToMultiByte(LPCWSTR lpszIn, CZipAutoBuffer &szOut, UINT uCodePage) +{ + return WideToMultiByte(lpszIn, szOut, false, uCodePage); +} + +int ZipPlatform::MultiByteToWide(const CZipAutoBuffer &szIn, CZipString& szOut, UINT uCodePage) +{ + int singleLen = szIn.GetSize(); + if (singleLen == 0) + { + szOut.Empty(); + return 0; + } + return MultiByteToWide(szIn, singleLen, szOut, uCodePage); +} + +#endif -- cgit v1.2.3