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();
132 const CZipString& GetFileName(
bool bClearBuffer =
true);
158 bool SetFileName(LPCTSTR lpszFileName,
bool bInCentralOnly =
false);
177 const CZipString& GetComment(
bool bClearBuffer =
false);
193 bool SetComment(LPCTSTR lpszComment);
216 return GetDataDescriptorSize(NeedsSignatureInDataDescriptor(pStorage));
230 WORD GetDataDescriptorSize(
bool bConsiderSignature =
false)
const;
245 ZIP_SIZE_TYPE GetDataSize(
bool bReal)
const
247 DWORD uEncrSize = GetEncryptedInfoSize();
248 return bReal ? (m_uComprSize - uEncrSize) : (m_uComprSize + uEncrSize);
257 DWORD GetEncryptedInfoSize()
const
268 DWORD GetSize()
const;
281 DWORD GetLocalSize(
bool bReal)
const;
290 bool CompressionEfficient()
292 ZIP_SIZE_TYPE uBefore = m_uUncomprSize;
294 ZIP_SIZE_TYPE uAfter = GetDataSize(
true);
295 return uAfter <= uBefore;
304 float GetCompressionRatio()
306 #if _MSC_VER >= 1300 || !defined(_ZIP_ZIP64)
307 return m_uUncomprSize ? ((float)m_uComprSize * 100 ) / m_uUncomprSize: 0;
309 return m_uUncomprSize ? ((float)(__int64)(m_uComprSize) / (
float)(__int64)m_uUncomprSize) * 100: 0;
359 void SetModificationTime(
const time_t& ttime,
bool bFullResolution =
false,
bool bUseUtcTime =
false );
370 time_t GetModificationTime()
const;
414 return (
int)m_iSystemCompatibility;
430 DWORD GetSystemAttr();
445 bool SetSystemAttr(DWORD uAttr);
473 #ifdef _ZIP_UNICODE_CUSTOM
518 bool IsWinZipAesEncryption()
const
529 int GetCompressionLevel()
const;
539 return m_uModTime != 0 || m_uModDate != 0;
553 return m_state.IsSetAny(sfModified);
568 static char m_gszSignature[];
569 static char m_gszLocalSignature[];
595 DWORD m_uLocalHeaderSize;
617 if ((
int)m_iSystemCompatibility != iSystemID)
619 DWORD uAttr = GetSystemAttr();
620 m_iSystemCompatibility = (char)(iSystemID & 0xFF);
621 SetSystemAttr(uAttr & 0xFFFF);
625 m_iSystemCompatibility = (char)(iSystemID & 0xFF);
631 void PrepareStringBuffers()
633 if (!m_fileName.HasBuffer())
635 ConvertFileName(m_fileName.m_buffer);
637 if (!m_comment.HasBuffer())
639 ConvertComment(m_comment.m_buffer);
652 bool CheckDataDescriptor(
CZipStorage* pStorage)
const;
665 void PrepareData(
int iLevel,
bool bSegm);
715 bool Read(
bool bReadSignature);
725 bool CheckLengths(
bool local)
const
727 if (m_comment.GetBufferSize() > (int)USHRT_MAX || m_fileName.GetBufferSize() > (int)USHRT_MAX)
730 return m_aLocalExtraData.Validate();
732 return m_aCentralExtraData.Validate();
741 void WriteCrc32(
char* pBuf)
const;
751 bool NeedsDataDescriptor()
const;
763 void WriteSmallDataDescriptor(
char* pDest,
bool bLocal =
true);
782 bool NeedsSignatureInDataDescriptor(
const CZipStorage* pStorage)
const
798 void AdjustLocalComprSize()
800 AdjustLocalComprSize(m_uLocalComprSize);
809 void AdjustLocalComprSize(ZIP_SIZE_TYPE& uLocalComprSize)
811 uLocalComprSize += GetEncryptedInfoSize();
823 static bool VerifySignature(CZipAutoBuffer& buf)
825 return memcmp(buf, m_gszSignature, 4) == 0;
834 void UpdateFlag(
bool bSegm)
846 struct StringWithBuffer
852 CZipAutoBuffer m_buffer;
853 StringWithBuffer& operator = (
const StringWithBuffer& original)
855 if (original.HasString())
857 SetString(original.GetString());
863 m_buffer = original.m_buffer;
866 void AllocateString()
869 m_pString =
new CZipString(_T(
""));
871 bool HasString()
const
873 return m_pString != NULL;
875 bool HasBuffer()
const
877 return m_buffer.IsAllocated() && m_buffer.GetSize() > 0;
892 const CZipString& GetString()
const
898 CZipString& GetString()
904 void SetString(LPCTSTR value)
911 int GetBufferSize()
const
913 return m_buffer.GetSize();
920 CZipString* m_pString;
927 void SetModified(
bool bModified =
true)
929 m_state.Change(sfModified, bModified);
932 void ConvertFileName(CZipAutoBuffer& buffer)
const;
933 void ConvertFileName(CZipString& szFileName)
const;
934 void ConvertComment(CZipAutoBuffer& buffer)
const;
935 void ConvertComment(CZipString& szComment)
const;
937 bool UpdateFileNameFlags(
const CZipString* szNewFileName,
bool bAllowRemoveCDir);
938 bool UpdateCommentFlags(
const CZipString* szNewComment);
939 bool UpdateStringsFlags(
bool bAllowRemoveCDir)
941 return UpdateFileNameFlags(NULL, bAllowRemoveCDir) | UpdateCommentFlags(NULL);
944 UINT GetDefaultFileNameCodePage()
const
954 void ClearFileName();
956 void GetCrcAndSizes(
char* pBuffer)
const;
958 bool NeedsZip64()
const
960 return m_uComprSize >= UINT_MAX || m_uUncomprSize >= UINT_MAX || m_uVolumeStart >= USHRT_MAX || m_uOffset >= UINT_MAX;
963 time_t ReadFileTime(
const char* buffer);
964 void WriteFileTime(
const time_t& ttime,
char* buffer,
bool bUseUtcTime);
969 UpdateLocalHeader(pStorage);
970 WriteDataDescriptor(pStorage);
974 #ifdef _ZIP_UNICODE_CUSTOM
977 StringWithBuffer m_fileName;
978 StringWithBuffer m_comment;
979 char m_iSystemCompatibility;
982 #endif // !defined(ZIPARCHIVE_ZIPFILEHEADER_DOT_H)