1*f6dc9357SAndroid Build Coastguard Worker // FileStreams.h
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_FILE_STREAMS_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_FILE_STREAMS_H
5*f6dc9357SAndroid Build Coastguard Worker
6*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
7*f6dc9357SAndroid Build Coastguard Worker #define Z7_FILE_STREAMS_USE_WIN_FILE
8*f6dc9357SAndroid Build Coastguard Worker #endif
9*f6dc9357SAndroid Build Coastguard Worker
10*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyCom.h"
11*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyString.h"
12*f6dc9357SAndroid Build Coastguard Worker
13*f6dc9357SAndroid Build Coastguard Worker #include "../../Windows/FileIO.h"
14*f6dc9357SAndroid Build Coastguard Worker
15*f6dc9357SAndroid Build Coastguard Worker #include "../IStream.h"
16*f6dc9357SAndroid Build Coastguard Worker
17*f6dc9357SAndroid Build Coastguard Worker #include "UniqBlocks.h"
18*f6dc9357SAndroid Build Coastguard Worker
19*f6dc9357SAndroid Build Coastguard Worker
20*f6dc9357SAndroid Build Coastguard Worker class CInFileStream;
21*f6dc9357SAndroid Build Coastguard Worker
22*f6dc9357SAndroid Build Coastguard Worker Z7_PURE_INTERFACES_BEGIN
DECLARE_INTERFACE(IInFileStream_Callback)23*f6dc9357SAndroid Build Coastguard Worker DECLARE_INTERFACE(IInFileStream_Callback)
24*f6dc9357SAndroid Build Coastguard Worker {
25*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT InFileStream_On_Error(UINT_PTR val, DWORD error) = 0;
26*f6dc9357SAndroid Build Coastguard Worker virtual void InFileStream_On_Destroy(CInFileStream *stream, UINT_PTR val) = 0;
27*f6dc9357SAndroid Build Coastguard Worker };
28*f6dc9357SAndroid Build Coastguard Worker Z7_PURE_INTERFACES_END
29*f6dc9357SAndroid Build Coastguard Worker
30*f6dc9357SAndroid Build Coastguard Worker
31*f6dc9357SAndroid Build Coastguard Worker /*
32*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_COM_5(
33*f6dc9357SAndroid Build Coastguard Worker CInFileStream
34*f6dc9357SAndroid Build Coastguard Worker , IInStream
35*f6dc9357SAndroid Build Coastguard Worker , IStreamGetSize
36*f6dc9357SAndroid Build Coastguard Worker , IStreamGetProps
37*f6dc9357SAndroid Build Coastguard Worker , IStreamGetProps2
38*f6dc9357SAndroid Build Coastguard Worker , IStreamGetProp
39*f6dc9357SAndroid Build Coastguard Worker )
40*f6dc9357SAndroid Build Coastguard Worker */
Z7_class_final(CInFileStream)41*f6dc9357SAndroid Build Coastguard Worker Z7_class_final(CInFileStream) :
42*f6dc9357SAndroid Build Coastguard Worker public IInStream,
43*f6dc9357SAndroid Build Coastguard Worker public IStreamGetSize,
44*f6dc9357SAndroid Build Coastguard Worker public IStreamGetProps,
45*f6dc9357SAndroid Build Coastguard Worker public IStreamGetProps2,
46*f6dc9357SAndroid Build Coastguard Worker public IStreamGetProp,
47*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp
48*f6dc9357SAndroid Build Coastguard Worker {
49*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_6(
50*f6dc9357SAndroid Build Coastguard Worker IInStream,
51*f6dc9357SAndroid Build Coastguard Worker ISequentialInStream,
52*f6dc9357SAndroid Build Coastguard Worker IStreamGetSize,
53*f6dc9357SAndroid Build Coastguard Worker IStreamGetProps,
54*f6dc9357SAndroid Build Coastguard Worker IStreamGetProps2,
55*f6dc9357SAndroid Build Coastguard Worker IStreamGetProp)
56*f6dc9357SAndroid Build Coastguard Worker
57*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(ISequentialInStream)
58*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(IInStream)
59*f6dc9357SAndroid Build Coastguard Worker public:
60*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(IStreamGetSize)
61*f6dc9357SAndroid Build Coastguard Worker private:
62*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(IStreamGetProps)
63*f6dc9357SAndroid Build Coastguard Worker public:
64*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(IStreamGetProps2)
65*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(IStreamGetProp)
66*f6dc9357SAndroid Build Coastguard Worker
67*f6dc9357SAndroid Build Coastguard Worker private:
68*f6dc9357SAndroid Build Coastguard Worker NWindows::NFile::NIO::CInFile File;
69*f6dc9357SAndroid Build Coastguard Worker public:
70*f6dc9357SAndroid Build Coastguard Worker
71*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_FILE_STREAMS_USE_WIN_FILE
72*f6dc9357SAndroid Build Coastguard Worker
73*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_DEVICE_FILE
74*f6dc9357SAndroid Build Coastguard Worker UInt64 VirtPos;
75*f6dc9357SAndroid Build Coastguard Worker UInt64 PhyPos;
76*f6dc9357SAndroid Build Coastguard Worker UInt64 BufStartPos;
77*f6dc9357SAndroid Build Coastguard Worker Byte *Buf;
78*f6dc9357SAndroid Build Coastguard Worker UInt32 BufSize;
79*f6dc9357SAndroid Build Coastguard Worker #endif
80*f6dc9357SAndroid Build Coastguard Worker
81*f6dc9357SAndroid Build Coastguard Worker #endif
82*f6dc9357SAndroid Build Coastguard Worker
83*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
84*f6dc9357SAndroid Build Coastguard Worker BY_HANDLE_FILE_INFORMATION _info;
85*f6dc9357SAndroid Build Coastguard Worker #else
86*f6dc9357SAndroid Build Coastguard Worker struct stat _info;
87*f6dc9357SAndroid Build Coastguard Worker UInt32 _uid;
88*f6dc9357SAndroid Build Coastguard Worker UInt32 _gid;
89*f6dc9357SAndroid Build Coastguard Worker UString OwnerName;
90*f6dc9357SAndroid Build Coastguard Worker UString OwnerGroup;
91*f6dc9357SAndroid Build Coastguard Worker bool StoreOwnerId;
92*f6dc9357SAndroid Build Coastguard Worker bool StoreOwnerName;
93*f6dc9357SAndroid Build Coastguard Worker #endif
94*f6dc9357SAndroid Build Coastguard Worker
95*f6dc9357SAndroid Build Coastguard Worker bool _info_WasLoaded;
96*f6dc9357SAndroid Build Coastguard Worker bool SupportHardLinks;
97*f6dc9357SAndroid Build Coastguard Worker IInFileStream_Callback *Callback;
98*f6dc9357SAndroid Build Coastguard Worker UINT_PTR CallbackRef;
99*f6dc9357SAndroid Build Coastguard Worker
100*f6dc9357SAndroid Build Coastguard Worker CInFileStream();
101*f6dc9357SAndroid Build Coastguard Worker ~CInFileStream();
102*f6dc9357SAndroid Build Coastguard Worker
103*f6dc9357SAndroid Build Coastguard Worker void Set_PreserveATime(bool v)
104*f6dc9357SAndroid Build Coastguard Worker {
105*f6dc9357SAndroid Build Coastguard Worker File.PreserveATime = v;
106*f6dc9357SAndroid Build Coastguard Worker }
107*f6dc9357SAndroid Build Coastguard Worker
108*f6dc9357SAndroid Build Coastguard Worker bool GetLength(UInt64 &length) const throw()
109*f6dc9357SAndroid Build Coastguard Worker {
110*f6dc9357SAndroid Build Coastguard Worker return File.GetLength(length);
111*f6dc9357SAndroid Build Coastguard Worker }
112*f6dc9357SAndroid Build Coastguard Worker
113*f6dc9357SAndroid Build Coastguard Worker #if 0
114*f6dc9357SAndroid Build Coastguard Worker bool OpenStdIn();
115*f6dc9357SAndroid Build Coastguard Worker #endif
116*f6dc9357SAndroid Build Coastguard Worker
117*f6dc9357SAndroid Build Coastguard Worker bool Open(CFSTR fileName)
118*f6dc9357SAndroid Build Coastguard Worker {
119*f6dc9357SAndroid Build Coastguard Worker _info_WasLoaded = false;
120*f6dc9357SAndroid Build Coastguard Worker return File.Open(fileName);
121*f6dc9357SAndroid Build Coastguard Worker }
122*f6dc9357SAndroid Build Coastguard Worker
123*f6dc9357SAndroid Build Coastguard Worker bool OpenShared(CFSTR fileName, bool shareForWrite)
124*f6dc9357SAndroid Build Coastguard Worker {
125*f6dc9357SAndroid Build Coastguard Worker _info_WasLoaded = false;
126*f6dc9357SAndroid Build Coastguard Worker return File.OpenShared(fileName, shareForWrite);
127*f6dc9357SAndroid Build Coastguard Worker }
128*f6dc9357SAndroid Build Coastguard Worker };
129*f6dc9357SAndroid Build Coastguard Worker
130*f6dc9357SAndroid Build Coastguard Worker // bool CreateStdInStream(CMyComPtr<ISequentialInStream> &str);
131*f6dc9357SAndroid Build Coastguard Worker
132*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_NOQIB_1(
133*f6dc9357SAndroid Build Coastguard Worker CStdInFileStream
134*f6dc9357SAndroid Build Coastguard Worker , ISequentialInStream
135*f6dc9357SAndroid Build Coastguard Worker )
136*f6dc9357SAndroid Build Coastguard Worker };
137*f6dc9357SAndroid Build Coastguard Worker
138*f6dc9357SAndroid Build Coastguard Worker
139*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_COM_1(
140*f6dc9357SAndroid Build Coastguard Worker COutFileStream
141*f6dc9357SAndroid Build Coastguard Worker , IOutStream
142*f6dc9357SAndroid Build Coastguard Worker )
143*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(ISequentialOutStream)
144*f6dc9357SAndroid Build Coastguard Worker public:
145*f6dc9357SAndroid Build Coastguard Worker
146*f6dc9357SAndroid Build Coastguard Worker NWindows::NFile::NIO::COutFile File;
147*f6dc9357SAndroid Build Coastguard Worker
148*f6dc9357SAndroid Build Coastguard Worker bool Create_NEW(CFSTR fileName)
149*f6dc9357SAndroid Build Coastguard Worker {
150*f6dc9357SAndroid Build Coastguard Worker ProcessedSize = 0;
151*f6dc9357SAndroid Build Coastguard Worker return File.Create_NEW(fileName);
152*f6dc9357SAndroid Build Coastguard Worker }
153*f6dc9357SAndroid Build Coastguard Worker
154*f6dc9357SAndroid Build Coastguard Worker bool Create_ALWAYS(CFSTR fileName)
155*f6dc9357SAndroid Build Coastguard Worker {
156*f6dc9357SAndroid Build Coastguard Worker ProcessedSize = 0;
157*f6dc9357SAndroid Build Coastguard Worker return File.Create_ALWAYS(fileName);
158*f6dc9357SAndroid Build Coastguard Worker }
159*f6dc9357SAndroid Build Coastguard Worker
160*f6dc9357SAndroid Build Coastguard Worker bool Open_EXISTING(CFSTR fileName)
161*f6dc9357SAndroid Build Coastguard Worker {
162*f6dc9357SAndroid Build Coastguard Worker ProcessedSize = 0;
163*f6dc9357SAndroid Build Coastguard Worker return File.Open_EXISTING(fileName);
164*f6dc9357SAndroid Build Coastguard Worker }
165*f6dc9357SAndroid Build Coastguard Worker
166*f6dc9357SAndroid Build Coastguard Worker bool Create_ALWAYS_or_Open_ALWAYS(CFSTR fileName, bool createAlways)
167*f6dc9357SAndroid Build Coastguard Worker {
168*f6dc9357SAndroid Build Coastguard Worker ProcessedSize = 0;
169*f6dc9357SAndroid Build Coastguard Worker return File.Create_ALWAYS_or_Open_ALWAYS(fileName, createAlways);
170*f6dc9357SAndroid Build Coastguard Worker }
171*f6dc9357SAndroid Build Coastguard Worker
172*f6dc9357SAndroid Build Coastguard Worker HRESULT Close();
173*f6dc9357SAndroid Build Coastguard Worker
174*f6dc9357SAndroid Build Coastguard Worker UInt64 ProcessedSize;
175*f6dc9357SAndroid Build Coastguard Worker
176*f6dc9357SAndroid Build Coastguard Worker bool SetTime(const CFiTime *cTime, const CFiTime *aTime, const CFiTime *mTime)
177*f6dc9357SAndroid Build Coastguard Worker {
178*f6dc9357SAndroid Build Coastguard Worker return File.SetTime(cTime, aTime, mTime);
179*f6dc9357SAndroid Build Coastguard Worker }
180*f6dc9357SAndroid Build Coastguard Worker bool SetMTime(const CFiTime *mTime) { return File.SetMTime(mTime); }
181*f6dc9357SAndroid Build Coastguard Worker
182*f6dc9357SAndroid Build Coastguard Worker bool SeekToBegin_bool()
183*f6dc9357SAndroid Build Coastguard Worker {
184*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_FILE_STREAMS_USE_WIN_FILE
185*f6dc9357SAndroid Build Coastguard Worker return File.SeekToBegin();
186*f6dc9357SAndroid Build Coastguard Worker #else
187*f6dc9357SAndroid Build Coastguard Worker return File.seekToBegin() == 0;
188*f6dc9357SAndroid Build Coastguard Worker #endif
189*f6dc9357SAndroid Build Coastguard Worker }
190*f6dc9357SAndroid Build Coastguard Worker
191*f6dc9357SAndroid Build Coastguard Worker HRESULT GetSize(UInt64 *size);
192*f6dc9357SAndroid Build Coastguard Worker };
193*f6dc9357SAndroid Build Coastguard Worker
194*f6dc9357SAndroid Build Coastguard Worker
195*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_NOQIB_1(
196*f6dc9357SAndroid Build Coastguard Worker CStdOutFileStream
197*f6dc9357SAndroid Build Coastguard Worker , ISequentialOutStream
198*f6dc9357SAndroid Build Coastguard Worker )
199*f6dc9357SAndroid Build Coastguard Worker UInt64 _size;
200*f6dc9357SAndroid Build Coastguard Worker public:
201*f6dc9357SAndroid Build Coastguard Worker UInt64 GetSize() const { return _size; }
202*f6dc9357SAndroid Build Coastguard Worker CStdOutFileStream(): _size(0) {}
203*f6dc9357SAndroid Build Coastguard Worker };
204*f6dc9357SAndroid Build Coastguard Worker
205*f6dc9357SAndroid Build Coastguard Worker #endif
206