1*f6dc9357SAndroid Build Coastguard Worker // ZipOut.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_ZIP_OUT_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_ZIP_OUT_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyCom.h" 7*f6dc9357SAndroid Build Coastguard Worker 8*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/OutBuffer.h" 9*f6dc9357SAndroid Build Coastguard Worker 10*f6dc9357SAndroid Build Coastguard Worker #include "ZipItem.h" 11*f6dc9357SAndroid Build Coastguard Worker 12*f6dc9357SAndroid Build Coastguard Worker namespace NArchive { 13*f6dc9357SAndroid Build Coastguard Worker namespace NZip { 14*f6dc9357SAndroid Build Coastguard Worker 15*f6dc9357SAndroid Build Coastguard Worker class CItemOut: public CItem 16*f6dc9357SAndroid Build Coastguard Worker { 17*f6dc9357SAndroid Build Coastguard Worker public: 18*f6dc9357SAndroid Build Coastguard Worker FILETIME Ntfs_MTime; 19*f6dc9357SAndroid Build Coastguard Worker FILETIME Ntfs_ATime; 20*f6dc9357SAndroid Build Coastguard Worker FILETIME Ntfs_CTime; 21*f6dc9357SAndroid Build Coastguard Worker bool Write_NtfsTime; 22*f6dc9357SAndroid Build Coastguard Worker bool Write_UnixTime; 23*f6dc9357SAndroid Build Coastguard Worker 24*f6dc9357SAndroid Build Coastguard Worker // It's possible that NtfsTime is not defined, but there is NtfsTime in Extra. 25*f6dc9357SAndroid Build Coastguard Worker 26*f6dc9357SAndroid Build Coastguard Worker CByteBuffer Name_Utf; // for Info-Zip (kIzUnicodeName) Extra 27*f6dc9357SAndroid Build Coastguard Worker Get_UtfName_ExtraSize()28*f6dc9357SAndroid Build Coastguard Worker size_t Get_UtfName_ExtraSize() const 29*f6dc9357SAndroid Build Coastguard Worker { 30*f6dc9357SAndroid Build Coastguard Worker const size_t size = Name_Utf.Size(); 31*f6dc9357SAndroid Build Coastguard Worker if (size == 0) 32*f6dc9357SAndroid Build Coastguard Worker return 0; 33*f6dc9357SAndroid Build Coastguard Worker return 4 + 5 + size; 34*f6dc9357SAndroid Build Coastguard Worker } 35*f6dc9357SAndroid Build Coastguard Worker CItemOut()36*f6dc9357SAndroid Build Coastguard Worker CItemOut(): 37*f6dc9357SAndroid Build Coastguard Worker Write_NtfsTime(false), 38*f6dc9357SAndroid Build Coastguard Worker Write_UnixTime(false) 39*f6dc9357SAndroid Build Coastguard Worker {} 40*f6dc9357SAndroid Build Coastguard Worker }; 41*f6dc9357SAndroid Build Coastguard Worker 42*f6dc9357SAndroid Build Coastguard Worker 43*f6dc9357SAndroid Build Coastguard Worker // COutArchive can throw CSystemException and COutBufferException 44*f6dc9357SAndroid Build Coastguard Worker 45*f6dc9357SAndroid Build Coastguard Worker class COutArchive 46*f6dc9357SAndroid Build Coastguard Worker { 47*f6dc9357SAndroid Build Coastguard Worker COutBuffer m_OutBuffer; 48*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IOutStream> m_Stream; 49*f6dc9357SAndroid Build Coastguard Worker 50*f6dc9357SAndroid Build Coastguard Worker UInt64 m_Base; // Base of archive (offset in output Stream) 51*f6dc9357SAndroid Build Coastguard Worker UInt64 m_CurPos; // Curent position in archive (relative from m_Base) 52*f6dc9357SAndroid Build Coastguard Worker UInt64 m_LocalHeaderPos; // LocalHeaderPos (relative from m_Base) for last WriteLocalHeader() call 53*f6dc9357SAndroid Build Coastguard Worker 54*f6dc9357SAndroid Build Coastguard Worker UInt32 m_LocalFileHeaderSize; 55*f6dc9357SAndroid Build Coastguard Worker UInt32 m_ExtraSize; 56*f6dc9357SAndroid Build Coastguard Worker bool m_IsZip64; 57*f6dc9357SAndroid Build Coastguard Worker 58*f6dc9357SAndroid Build Coastguard Worker void WriteBytes(const void *data, size_t size); 59*f6dc9357SAndroid Build Coastguard Worker void Write8(Byte b); 60*f6dc9357SAndroid Build Coastguard Worker void Write16(UInt16 val); 61*f6dc9357SAndroid Build Coastguard Worker void Write32(UInt32 val); 62*f6dc9357SAndroid Build Coastguard Worker void Write64(UInt64 val); WriteNtfsTime(const FILETIME & ft)63*f6dc9357SAndroid Build Coastguard Worker void WriteNtfsTime(const FILETIME &ft) 64*f6dc9357SAndroid Build Coastguard Worker { 65*f6dc9357SAndroid Build Coastguard Worker Write32(ft.dwLowDateTime); 66*f6dc9357SAndroid Build Coastguard Worker Write32(ft.dwHighDateTime); 67*f6dc9357SAndroid Build Coastguard Worker } 68*f6dc9357SAndroid Build Coastguard Worker 69*f6dc9357SAndroid Build Coastguard Worker void WriteTimeExtra(const CItemOut &item, bool writeNtfs); 70*f6dc9357SAndroid Build Coastguard Worker void WriteUtfName(const CItemOut &item); 71*f6dc9357SAndroid Build Coastguard Worker void WriteExtra(const CExtraBlock &extra); 72*f6dc9357SAndroid Build Coastguard Worker void WriteCommonItemInfo(const CLocalItem &item, bool isZip64); 73*f6dc9357SAndroid Build Coastguard Worker void WriteCentralHeader(const CItemOut &item); 74*f6dc9357SAndroid Build Coastguard Worker 75*f6dc9357SAndroid Build Coastguard Worker void SeekToCurPos(); 76*f6dc9357SAndroid Build Coastguard Worker public: 77*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IStreamSetRestriction> SetRestriction; 78*f6dc9357SAndroid Build Coastguard Worker 79*f6dc9357SAndroid Build Coastguard Worker HRESULT ClearRestriction(); 80*f6dc9357SAndroid Build Coastguard Worker HRESULT SetRestrictionFromCurrent(); 81*f6dc9357SAndroid Build Coastguard Worker HRESULT Create(IOutStream *outStream); 82*f6dc9357SAndroid Build Coastguard Worker GetCurPos()83*f6dc9357SAndroid Build Coastguard Worker UInt64 GetCurPos() const { return m_CurPos; } 84*f6dc9357SAndroid Build Coastguard Worker MoveCurPos(UInt64 distanceToMove)85*f6dc9357SAndroid Build Coastguard Worker void MoveCurPos(UInt64 distanceToMove) 86*f6dc9357SAndroid Build Coastguard Worker { 87*f6dc9357SAndroid Build Coastguard Worker m_CurPos += distanceToMove; 88*f6dc9357SAndroid Build Coastguard Worker } 89*f6dc9357SAndroid Build Coastguard Worker 90*f6dc9357SAndroid Build Coastguard Worker void WriteLocalHeader(CItemOut &item, bool needCheck = false); 91*f6dc9357SAndroid Build Coastguard Worker void WriteLocalHeader_Replace(CItemOut &item); 92*f6dc9357SAndroid Build Coastguard Worker 93*f6dc9357SAndroid Build Coastguard Worker void WriteDescriptor(const CItemOut &item); 94*f6dc9357SAndroid Build Coastguard Worker 95*f6dc9357SAndroid Build Coastguard Worker HRESULT WriteCentralDir(const CObjectVector<CItemOut> &items, const CByteBuffer *comment); 96*f6dc9357SAndroid Build Coastguard Worker 97*f6dc9357SAndroid Build Coastguard Worker void CreateStreamForCompressing(CMyComPtr<IOutStream> &outStream); 98*f6dc9357SAndroid Build Coastguard Worker void CreateStreamForCopying(CMyComPtr<ISequentialOutStream> &outStream); 99*f6dc9357SAndroid Build Coastguard Worker }; 100*f6dc9357SAndroid Build Coastguard Worker 101*f6dc9357SAndroid Build Coastguard Worker }} 102*f6dc9357SAndroid Build Coastguard Worker 103*f6dc9357SAndroid Build Coastguard Worker #endif 104