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,
80 int PredictFileNameSize()
const
82 if (m_fileName.HasBuffer())
84 return m_fileName.GetBufferSize();
86 CZipAutoBuffer buffer;
87 ConvertFileName(buffer);
88 return buffer.GetSize();
97 int PredictCommentSize()
const
99 if (m_comment.HasBuffer())
101 return m_comment.GetBufferSize();
103 CZipAutoBuffer buffer;
104 ConvertComment(buffer);
105 return buffer.GetSize();
131 const CZipString& GetFileName(
bool bClearBuffer =
true);
157 bool SetFileName(LPCTSTR lpszFileName,
bool bInCentralOnly =
false);
176 const CZipString& GetComment(
bool bClearBuffer =
false);
192 bool SetComment(LPCTSTR lpszComment);
215 return GetDataDescriptorSize(NeedsSignatureInDataDescriptor(pStorage));
229 WORD GetDataDescriptorSize(
bool bConsiderSignature =
false)
const;
244 ZIP_SIZE_TYPE GetDataSize(
bool bReal)
const
246 DWORD uEncrSize = GetEncryptedInfoSize();
247 return bReal ? (m_uComprSize - uEncrSize) : (m_uComprSize + uEncrSize);
256 DWORD GetEncryptedInfoSize()
const
267 DWORD GetSize()
const;
280 DWORD GetLocalSize(
bool bReal)
const;
289 bool CompressionEfficient()
291 ZIP_SIZE_TYPE uBefore = m_uUncomprSize;
293 ZIP_SIZE_TYPE uAfter = GetDataSize(
true);
294 return uAfter <= uBefore;
303 float GetCompressionRatio()
305 #if _MSC_VER >= 1300 || !defined(_ZIP_ZIP64)
306 return m_uUncomprSize ? ((float)m_uComprSize * 100 ) / m_uUncomprSize: 0;
308 return m_uUncomprSize ? ((float)(__int64)(m_uComprSize) / (
float)(__int64)m_uUncomprSize) * 100: 0;
356 void SetModificationTime(
const time_t& ttime,
bool bFullResolution =
false );
367 time_t GetModificationTime()
const;
411 return (
int)m_iSystemCompatibility;
427 DWORD GetSystemAttr();
442 bool SetSystemAttr(DWORD uAttr);
470 #ifdef _ZIP_UNICODE_CUSTOM
515 bool IsWinZipAesEncryption()
const
526 int GetCompressionLevel()
const;
536 return m_uModTime != 0 || m_uModDate != 0;
550 return m_state.IsSetAny(sfModified);
565 static char m_gszSignature[];
566 static char m_gszLocalSignature[];
592 DWORD m_uLocalHeaderSize;
614 if ((
int)m_iSystemCompatibility != iSystemID)
616 DWORD uAttr = GetSystemAttr();
617 m_iSystemCompatibility = (char)(iSystemID & 0xFF);
618 SetSystemAttr(uAttr & 0xFFFF);
622 m_iSystemCompatibility = (char)(iSystemID & 0xFF);
628 void PrepareStringBuffers()
630 if (!m_fileName.HasBuffer())
632 ConvertFileName(m_fileName.m_buffer);
634 if (!m_comment.HasBuffer())
636 ConvertComment(m_comment.m_buffer);
649 bool CheckDataDescriptor(
CZipStorage* pStorage)
const;
662 void PrepareData(
int iLevel,
bool bSegm);
712 bool Read(
bool bReadSignature);
722 bool CheckLengths(
bool local)
const
724 if (m_comment.GetBufferSize() > (int)USHRT_MAX || m_fileName.GetBufferSize() > (int)USHRT_MAX)
727 return m_aLocalExtraData.Validate();
729 return m_aCentralExtraData.Validate();
738 void WriteCrc32(
char* pBuf)
const;
748 bool NeedsDataDescriptor()
const;
760 void WriteSmallDataDescriptor(
char* pDest,
bool bLocal =
true);
779 bool NeedsSignatureInDataDescriptor(
const CZipStorage* pStorage)
const
795 void AdjustLocalComprSize()
797 AdjustLocalComprSize(m_uLocalComprSize);
806 void AdjustLocalComprSize(ZIP_SIZE_TYPE& uLocalComprSize)
808 uLocalComprSize += GetEncryptedInfoSize();
820 static bool VerifySignature(CZipAutoBuffer& buf)
822 return memcmp(buf, m_gszSignature, 4) == 0;
831 void UpdateFlag(
bool bSegm)
843 struct StringWithBuffer
849 CZipAutoBuffer m_buffer;
850 StringWithBuffer& operator = (
const StringWithBuffer& original)
852 if (original.HasString())
854 SetString(original.GetString());
860 m_buffer = original.m_buffer;
863 void AllocateString()
866 m_pString =
new CZipString(_T(
""));
868 bool HasString()
const
870 return m_pString != NULL;
872 bool HasBuffer()
const
874 return m_buffer.IsAllocated() && m_buffer.GetSize() > 0;
889 const CZipString& GetString()
const
895 CZipString& GetString()
901 void SetString(LPCTSTR value)
908 int GetBufferSize()
const
910 return m_buffer.GetSize();
917 CZipString* m_pString;
924 void SetModified(
bool bModified =
true)
926 m_state.Change(sfModified, bModified);
929 void ConvertFileName(CZipAutoBuffer& buffer)
const;
930 void ConvertFileName(CZipString& szFileName)
const;
931 void ConvertComment(CZipAutoBuffer& buffer)
const;
932 void ConvertComment(CZipString& szComment)
const;
934 bool UpdateFileNameFlags(
const CZipString* szNewFileName,
bool bAllowRemoveCDir);
935 bool UpdateCommentFlags(
const CZipString* szNewComment);
936 bool UpdateStringsFlags(
bool bAllowRemoveCDir)
938 return UpdateFileNameFlags(NULL, bAllowRemoveCDir) | UpdateCommentFlags(NULL);
941 UINT GetDefaultFileNameCodePage()
const
951 void ClearFileName();
953 void GetCrcAndSizes(
char* pBuffer)
const;
955 bool NeedsZip64()
const
957 return m_uComprSize >= UINT_MAX || m_uUncomprSize >= UINT_MAX || m_uVolumeStart >= USHRT_MAX || m_uOffset >= UINT_MAX;
960 time_t ReadFileTime(
const char* buffer);
961 void WriteFileTime(
const time_t& ttime,
char* buffer);
966 UpdateLocalHeader(pStorage);
967 WriteDataDescriptor(pStorage);
971 #ifdef _ZIP_UNICODE_CUSTOM
974 StringWithBuffer m_fileName;
975 StringWithBuffer m_comment;
976 char m_iSystemCompatibility;
979 #endif // !defined(ZIPARCHIVE_ZIPFILEHEADER_DOT_H)