xref: /aosp_15_r20/external/lzma/CPP/7zip/Archive/Zip/ZipOut.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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