00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00014
00021 #if !defined(ZIPARCHIVE_ZIPEXTRAFIELD_DOT_H)
00022 #define ZIPARCHIVE_ZIPEXTRAFIELD_DOT_H
00023
00024 #if _MSC_VER > 1000
00025 #pragma once
00026 #endif
00027
00028 #include "ZipExport.h"
00029 #include "ZipExtraData.h"
00030 #include "ZipCollections.h"
00031 #include "ZipStorage.h"
00032
00033 #define ZIP_EXTRA_PKZIP 0x0001
00034
00035 #define ZIP_EXTRA_ZARCH_NAME 0x5A4C // ZL - ZipArchive Library
00036
00037 #define ZIP_EXTRA_ZARCH_SEEK 0x5A4D
00038
00039 #define ZIP_EXTRA_WINZIP_AES 0x9901
00040
00041 #define ZIP_EXTRA_UNICODE_PATH 0x7075
00042 #define ZIP_EXTRA_UNICODE_COMMENT 0x6375
00043
00044
00045 #if (_MSC_VER > 1000) && (defined ZIP_HAS_DLL)
00046 #pragma warning( disable : 4251 ) // needs to have dll-interface to be used by clients of class
00047 #endif
00048
00058 class ZIP_API CZipExtraField
00059 {
00060 friend class CZipFileHeader;
00061 public:
00062 CZipExtraField()
00063 {
00064 }
00065 CZipExtraField(const CZipExtraField& arr)
00066 {
00067 *this = arr;
00068 }
00069 CZipExtraField& operator=(const CZipExtraField& field)
00070 {
00071 Clear();
00072 for (int i = 0; i < field.GetCount(); i++)
00073 Add(new CZipExtraData(*field.GetAt(i)));
00074 return *this;
00075 }
00076
00083 int GetTotalSize() const;
00084
00091 bool Validate() const
00092 {
00093 return GetTotalSize() <= (int)USHRT_MAX;
00094 }
00095
00102 int GetCount() const
00103 {
00104 return (int)m_aData.GetSize();
00105 }
00106
00116 CZipExtraData* GetAt(int index) const
00117 {
00118 return m_aData.GetAt(index);
00119 }
00120
00127 void RemoveAt(int index)
00128 {
00129 delete (GetAt(index));
00130 m_aData.RemoveAt(index);
00131 }
00132
00142 int Add(CZipExtraData* pExtra)
00143 {
00144 return (int)m_aData.Add(pExtra);
00145 }
00146
00160 CZipExtraData* CreateNew(WORD headerID)
00161 {
00162 int temp;
00163 return CreateNew(headerID, temp);
00164 }
00165
00183 CZipExtraData* CreateNew(WORD headerID, int& idx)
00184 {
00185 CZipExtraData* pData = new CZipExtraData(headerID);
00186 pData->m_bHasSize = HasSize(headerID);
00187 idx = (int)m_aData.Add(pData);
00188 return pData;
00189 }
00190
00195 void RemoveInternalHeaders();
00196
00201 void RemoveInternalLocalHeaders();
00202
00209 void Remove(WORD headerID);
00210
00220 CZipExtraData* Lookup(WORD headerID) const
00221 {
00222 int temp;
00223 return Lookup(headerID, temp);
00224 }
00225
00235 bool HasHeader(WORD headerID)
00236 {
00237 return Lookup(headerID) != NULL;
00238 }
00239
00253 CZipExtraData* Lookup(WORD headerID, int& index) const;
00254 ~CZipExtraField()
00255 {
00256 Clear();
00257 }
00258
00265 static CZipArray<WORD> m_aNoSizeExtraHeadersID;
00266
00279 static bool HasSize(WORD headerID)
00280 {
00281 ZIP_ARRAY_SIZE_TYPE size = m_aNoSizeExtraHeadersID.GetSize();
00282 for (ZIP_ARRAY_SIZE_TYPE i = 0; i < size; i++)
00283 {
00284 if (m_aNoSizeExtraHeadersID.GetAt(i) == headerID)
00285 return false;
00286 }
00287 return true;
00288 }
00289
00290 protected:
00291
00295 void Clear()
00296 {
00297 for (int i = 0; i < GetCount(); i++)
00298 delete (GetAt(i));
00299 m_aData.RemoveAll();
00300 }
00301
00314 bool Read(CZipStorage* pStorage, WORD uSize);
00315
00322 void Write(char* buffer) const;
00323
00324 private:
00325
00326 CZipArray<CZipExtraData*> m_aData;
00327 };
00328
00329
00330 #endif // !defined(ZIPARCHIVE_ZIPEXTRAFIELD_DOT_H)