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