20 #if !defined(ZIPARCHIVE_ZIPFILEHEADER_DOT_H)
21 #define ZIPARCHIVE_ZIPFILEHEADER_DOT_H
27 #include "ZipExport.h"
29 #include "ZipAutoBuffer.h"
30 #include "sys/types.h"
32 #include "ZipCollections.h"
60 #ifdef _ZIP_UNICODE_CUSTOM
61 sfCustomUnicode = 0x10,
67 #pragma warning(suppress: 26495)
81 int PredictFileNameSize()
const
83 if (m_fileName.HasBuffer())
85 return m_fileName.GetBufferSize();
87 CZipAutoBuffer buffer;
88 ConvertFileName(buffer);
89 return buffer.GetSize();
98 int PredictCommentSize()
const
100 if (m_comment.HasBuffer())
102 return m_comment.GetBufferSize();
104 CZipAutoBuffer buffer;
105 ConvertComment(buffer);
106 return buffer.GetSize();
136 const CZipString& GetFileName(
bool bClearBuffer =
true);
166 CZipString GetFileTitle(
bool bLowerCase =
false,
bool bClearBuffer =
true);
197 CZipString GetFileExtension(
bool bLowerCase =
false,
bool bClearBuffer =
true);
227 bool SetFileName(LPCTSTR lpszFileName,
bool bInCentralOnly =
false);
246 const CZipString& GetComment(
bool bClearBuffer =
false);
262 bool SetComment(LPCTSTR lpszComment);
285 return GetDataDescriptorSize(NeedsSignatureInDataDescriptor(pStorage));
299 WORD GetDataDescriptorSize(
bool bConsiderSignature =
false)
const;
314 ZIP_SIZE_TYPE GetDataSize(
bool bReal)
const
316 DWORD uEncrSize = GetEncryptedInfoSize();
317 return bReal ? (m_uComprSize - uEncrSize) : (m_uComprSize + uEncrSize);
326 DWORD GetEncryptedInfoSize()
const
337 DWORD GetSize()
const;
350 DWORD GetLocalSize(
bool bReal)
const;
359 bool CompressionEfficient()
361 ZIP_SIZE_TYPE uBefore = m_uUncomprSize;
363 ZIP_SIZE_TYPE uAfter = GetDataSize(
true);
364 return uAfter <= uBefore;
373 float GetCompressionRatio()
375 #if _MSC_VER >= 1300 || !defined(_ZIP_ZIP64)
376 return m_uUncomprSize ? ((float)m_uComprSize * 100 ) / m_uUncomprSize: 0;
378 return m_uUncomprSize ? ((float)(__int64)(m_uComprSize) / (
float)(__int64)m_uUncomprSize) * 100: 0;
428 void SetModificationTime(
const time_t& ttime,
bool bFullResolution =
false,
bool bUseUtcTime =
false );
439 time_t GetModificationTime()
const;
483 return (
int)m_iSystemCompatibility;
499 DWORD GetSystemAttr();
514 bool SetSystemAttr(DWORD uAttr);
542 #ifdef _ZIP_UNICODE_CUSTOM
587 bool IsWinZipAesEncryption()
const
598 int GetCompressionLevel()
const;
608 return m_uModTime != 0 || m_uModDate != 0;
622 return m_state.IsSetAny(sfModified);
637 static char m_gszSignature[];
638 static char m_gszLocalSignature[];
664 DWORD m_uLocalHeaderSize;
686 if ((
int)m_iSystemCompatibility != iSystemID)
688 DWORD uAttr = GetSystemAttr();
689 m_iSystemCompatibility = (char)(iSystemID & 0xFF);
690 SetSystemAttr(uAttr & 0xFFFF);
694 m_iSystemCompatibility = (char)(iSystemID & 0xFF);
700 void PrepareStringBuffers()
702 if (!m_fileName.HasBuffer())
704 ConvertFileName(m_fileName.m_buffer);
706 if (!m_comment.HasBuffer())
708 ConvertComment(m_comment.m_buffer);
721 bool CheckDataDescriptor(
CZipStorage* pStorage)
const;
734 void PrepareData(
int iLevel,
bool bSegm);
784 bool Read(
bool bReadSignature);
794 bool CheckLengths(
bool local)
const
796 if (m_comment.GetBufferSize() > (int)USHRT_MAX || m_fileName.GetBufferSize() > (int)USHRT_MAX)
799 return m_aLocalExtraData.Validate();
801 return m_aCentralExtraData.Validate();
810 void WriteCrc32(
char* pBuf)
const;
820 bool NeedsDataDescriptor()
const;
832 void WriteSmallDataDescriptor(
char* pDest,
bool bLocal =
true);
851 bool NeedsSignatureInDataDescriptor(
const CZipStorage* pStorage)
const
867 void AdjustLocalComprSize()
869 AdjustLocalComprSize(m_uLocalComprSize);
878 void AdjustLocalComprSize(ZIP_SIZE_TYPE& uLocalComprSize)
880 uLocalComprSize += GetEncryptedInfoSize();
892 static bool VerifySignature(CZipAutoBuffer& buf)
894 return memcmp(buf, m_gszSignature, 4) == 0;
903 void UpdateFlag(
bool bSegm)
915 struct StringWithBuffer
921 CZipAutoBuffer m_buffer;
922 StringWithBuffer& operator = (
const StringWithBuffer& original)
924 if (original.HasString())
926 SetString(original.GetString());
932 m_buffer = original.m_buffer;
935 void AllocateString()
938 m_pString =
new CZipString(_T(
""));
940 bool HasString()
const
942 return m_pString != NULL;
944 bool HasBuffer()
const
946 return m_buffer.IsAllocated() && m_buffer.GetSize() > 0;
961 const CZipString& GetString()
const
967 CZipString& GetString()
973 void SetString(LPCTSTR value)
980 int GetBufferSize()
const
982 return m_buffer.GetSize();
989 CZipString* m_pString;
996 void SetModified(
bool bModified =
true)
998 m_state.Change(sfModified, bModified);
1001 void ConvertFileName(CZipAutoBuffer& buffer)
const;
1002 void ConvertFileName(CZipString& szFileName)
const;
1003 void ConvertComment(CZipAutoBuffer& buffer)
const;
1004 void ConvertComment(CZipString& szComment)
const;
1006 bool UpdateFileNameFlags(
const CZipString* szNewFileName,
bool bAllowRemoveCDir);
1007 bool UpdateCommentFlags(
const CZipString* szNewComment);
1008 bool UpdateStringsFlags(
bool bAllowRemoveCDir)
1010 return UpdateFileNameFlags(NULL, bAllowRemoveCDir) | UpdateCommentFlags(NULL);
1013 UINT GetDefaultFileNameCodePage()
const
1023 void ClearFileName();
1025 void GetCrcAndSizes(
char* pBuffer)
const;
1027 bool NeedsZip64()
const
1029 return m_uComprSize >= UINT_MAX || m_uUncomprSize >= UINT_MAX || m_uVolumeStart >= USHRT_MAX || m_uOffset >= UINT_MAX;
1032 time_t ReadFileTime(
const char* buffer);
1033 void WriteFileTime(
const time_t& ttime,
char* buffer,
bool bUseUtcTime);
1038 UpdateLocalHeader(pStorage);
1039 WriteDataDescriptor(pStorage);
1043 #ifdef _ZIP_UNICODE_CUSTOM
1046 StringWithBuffer m_fileName;
1047 StringWithBuffer m_comment;
1048 char m_iSystemCompatibility;
1051 #endif // !defined(ZIPARCHIVE_ZIPFILEHEADER_DOT_H)