void CZipPathComponent::SetFullPath(LPCTSTR lpszFullPath) { TCHAR szDrive[_MAX_DRIVE]; TCHAR szDir[_MAX_DIR]; TCHAR szFname[_MAX_FNAME]; TCHAR szExt[_MAX_EXT]; CZipString szTempPath(lpszFullPath); const CZipString szPrefix = _T("\\\\?\\unc\\"); int i = -1, iLen = szPrefix.GetLength(); if (iLen > szTempPath.GetLength()) iLen = szTempPath.GetLength(); CZipString szPossiblePrefix = szTempPath.Left(iLen); szPossiblePrefix.MakeLower(); // must perform case insensitive comparison while (++i < iLen && szPossiblePrefix[i] == szPrefix[i]); if (i == 2 || i == 4 || i == 8) // unc path, unicode path or unc path meeting windows file name conventions { m_szPrefix = szTempPath.Left(i); szTempPath = szTempPath.Mid(i); } else m_szPrefix.Empty(); _tsplitpath(szTempPath, szDrive , szDir, szFname, szExt); m_szDrive = szDrive; m_szDirectory = szDir; m_szDirectory.TrimLeft(m_cSeparator); m_szDirectory.TrimRight(m_cSeparator); SetExtension(szExt); m_szFileTitle = szFname; }
BOOL CZipException::GetErrorMessage(LPTSTR lpszError, UINT nMaxError, UINT* ) { if (!lpszError || !nMaxError) return FALSE; CZipString sz = GetErrorDescription(); if (sz.IsEmpty()) return FALSE; UINT iLen = sz.GetLength(); if (nMaxError - 1 < iLen) iLen = nMaxError - 1; LPTSTR lpsz = sz.GetBuffer(iLen); #if _MSC_VER >= 1400 #ifdef _UNICODE wcsncpy_s(lpszError, nMaxError, lpsz, iLen); #else strncpy_s(lpszError, nMaxError, lpsz, iLen); #endif #else #ifdef _UNICODE wcsncpy(lpszError, lpsz, iLen); #else strncpy(lpszError, lpsz, iLen); #endif #endif lpszError[iLen] = _T('\0'); return TRUE; }
bool CheckOrder(const CZipString& sz1, const CZipString& sz2, int iSep1, int iSep2, bool bCheckTheBeginning = false) const { if (iSep1) { if (iSep2) { if (iSep1 == iSep2) return (sz1.*pZipComp)(sz2) < 0; if (bCheckTheBeginning) { int is = sz1.GetLength() > sz2.GetLength() ? sz2.GetLength() : sz1.GetLength(); int iSeparators = 0; // find the common path beginning int iLastSepPos = -1; for (int i = 0; i < is; i++) { CZipString sz = sz2.Mid(i, 1); if ((sz1.Mid(i, 1).*pZipComp)(sz) != 0) // must be Mid 'cos of case sens. here break; else if (CZipPathComponent::IsSeparator(sz[0])) { iLastSepPos = i; iSeparators++; } } // if necessary remove the common path beginning and check again if (iLastSepPos != -1) return CheckOrder(sz1.Mid(iLastSepPos), sz2.Mid(iLastSepPos), iSep1 - iSeparators, iSep2 - iSeparators); } return (sz1.*pZipComp)(sz2) < 0; } else return false; } else if (iSep2) return true; else return (sz1.*pZipComp)(sz2) < 0; }
CZipAddFileInfo(const CZipString& szFilePath, const CZipString& szFileNameInZip) :m_szFilePath(szFilePath), m_szFileNameInZip(szFileNameInZip) { int is = szFileNameInZip.GetLength(); m_iSeparators = 0; for (int i = 0; i < is; i++) if (CZipPathComponent::IsSeparator(szFileNameInZip[i])) m_iSeparators++; }
void CZipPathComponent::SetFullPath(LPCTSTR lpszFullPath) { CZipString szTempPath(lpszFullPath); const CZipString szPrefix = _T("\\\\?\\unc\\"); int i = -1, iLen = szPrefix.GetLength(); if (iLen > szTempPath.GetLength()) iLen = szTempPath.GetLength(); CZipString szPossiblePrefix = szTempPath.Left(iLen); szPossiblePrefix.MakeLower(); // must perform case insensitive comparison while (++i < iLen && szPossiblePrefix[i] == szPrefix[i]); if (i == 2 || i == 4 || i == 8) // unc path, Unicode path or unc path meeting windows file name conventions { m_szPrefix = szTempPath.Left(i); szTempPath = szTempPath.Mid(i); } else m_szPrefix.Empty(); m_szDrive.Empty(); m_szFileTitle.Empty(); m_szDirectory.Empty(); m_szFileExt.Empty(); int p; for (p = szTempPath.GetLength() - 1; p >= 0; p--) if (szTempPath[p] == m_cSeparator) break; if (p != -1) { m_szDirectory = szTempPath.Left(p); if (p == szTempPath.GetLength() - 1 ) return; // no filename present else p++; } else p = 0; // p points at the beginning of the filename m_szFileTitle = szTempPath.Mid(p); for (p = m_szFileTitle.GetLength() - 1; p >= 0; p--) if (m_szFileTitle[p] == _T('.')) break; if (p != -1) { m_szFileExt = m_szFileTitle.Mid(p+1); m_szFileTitle = m_szFileTitle.Left(p); } }
ZIP_API bool ZipArchiveLib::IsStringAscii(const CZipString& value) { for (int i = 0; i < value.GetLength(); i++) #if !defined __GNUC__ || defined __MINGW32__ if (!_istascii(value[i])) #else if (!isascii(value[i])) #endif return false; return true; }
int CZipPathComponent::IsPrefixed(const CZipString& path) { int i = -1, iLen = PathPrefix.GetLength(); int pathLen = path.GetLength(); if (iLen > pathLen) iLen = pathLen; CZipString szPossiblePrefix = path.Left(iLen); szPossiblePrefix.MakeLower(); // must perform case insensitive comparison while (++i < iLen && szPossiblePrefix[i] == PathPrefix[i]); return i; }
CZipString ZipPlatform::GetTmpFileName(LPCTSTR lpszPath, ZIP_U32_U64 uSizeNeeded) { TCHAR empty[] = _T(""), prefix [] = _T("zar"); TCHAR* buf = NULL; CZipString tempPath = lpszPath; if (tempPath.IsEmpty()) tempPath = "/tmp"; if (ZipPlatform::GetDeviceFreeSpace(tempPath) < uSizeNeeded) return empty; CZipPathComponent::AppendSeparator(tempPath); tempPath += prefix; tempPath += _T("XXXXXX"); int handle = mkstemp(tempPath.GetBuffer(tempPath.GetLength())); tempPath.ReleaseBuffer(); if (handle != -1) { close(handle); // we just create the file and open it later return tempPath; } else return empty; }
ZIPINLINE bool ZipPlatform::RemoveFile(LPCTSTR lpszFileName, bool bThrow, int iMode) { if ((iMode & ZipPlatform::dfmRemoveReadOnly) != 0) { DWORD attr; if (ZipPlatform::GetFileAttr(lpszFileName, attr) && (ZipCompatibility::GetAsInternalAttributes(attr, ZipPlatform::GetSystemID()) & ZipCompatibility::attROnly) != 0) { ZipPlatform::SetFileAttr(lpszFileName, ZipPlatform::GetDefaultAttributes()); } } #ifdef SHFileOperation if ((iMode & ZipPlatform::dfmRecycleBin) == 0) { #endif if (::DeleteFile((LPTSTR)(LPCTSTR)CZipPathComponent::AddPrefix(lpszFileName, false))) return true; #ifdef SHFileOperation } else { CZipString file = lpszFileName; #if defined _UNICODE && _MSC_VER >= 1400 if (file.GetLength() >= MAX_PATH) { // cannot prefix for SHFileOperation, use short path CZipString temp = CZipPathComponent::AddPrefix(lpszFileName, false); DWORD size = ::GetShortPathName(temp, NULL, 0); if (size != 0) { size = ::GetShortPathName(temp, file.GetBuffer(size), size); file.ReleaseBuffer(); } if (size == 0) { if (bThrow) CZipException::Throw(CZipException::notRemoved, lpszFileName); return false; } // GetShortPathName keeps the prefix - remove it int prefixLength = CZipPathComponent::IsPrefixed(file); if (prefixLength > 0) { file = file.Mid(prefixLength); } } #endif int length = file.GetLength(); CZipAutoBuffer buffer((length + 2) * sizeof(TCHAR), true); // double NULL is required memcpy(buffer, (LPCTSTR)file, length * sizeof(TCHAR)); SHFILEOPSTRUCT shFileOp = {0}; shFileOp.wFunc = FO_DELETE; shFileOp.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_SILENT | FOF_NOERRORUI; shFileOp.pFrom = (LPCTSTR)(char*)buffer; if (SHFileOperation(&shFileOp) == 0 && !shFileOp.fAnyOperationsAborted) return true; } #endif if (bThrow) CZipException::Throw(CZipException::notRemoved, lpszFileName); return false; }