xref: /aosp_15_r20/external/lzma/CPP/Windows/FileIO.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Windows/FileIO.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_WINDOWS_FILE_IO_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_WINDOWS_FILE_IO_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../Common/MyWindows.h"
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #define Z7_WIN_IO_REPARSE_TAG_MOUNT_POINT  (0xA0000003L)
9*f6dc9357SAndroid Build Coastguard Worker #define Z7_WIN_IO_REPARSE_TAG_SYMLINK      (0xA000000CL)
10*f6dc9357SAndroid Build Coastguard Worker #define Z7_WIN_IO_REPARSE_TAG_LX_SYMLINK   (0xA000001DL)
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker #define Z7_WIN_SYMLINK_FLAG_RELATIVE 1
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker // what the meaning of that FLAG or field (2)?
15*f6dc9357SAndroid Build Coastguard Worker #define Z7_WIN_LX_SYMLINK_FLAG 2
16*f6dc9357SAndroid Build Coastguard Worker 
17*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
18*f6dc9357SAndroid Build Coastguard Worker 
19*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(UNDER_CE)
20*f6dc9357SAndroid Build Coastguard Worker #include <winioctl.h>
21*f6dc9357SAndroid Build Coastguard Worker #endif
22*f6dc9357SAndroid Build Coastguard Worker 
23*f6dc9357SAndroid Build Coastguard Worker #else
24*f6dc9357SAndroid Build Coastguard Worker 
25*f6dc9357SAndroid Build Coastguard Worker #include <sys/types.h>
26*f6dc9357SAndroid Build Coastguard Worker #include <sys/stat.h>
27*f6dc9357SAndroid Build Coastguard Worker 
28*f6dc9357SAndroid Build Coastguard Worker #endif
29*f6dc9357SAndroid Build Coastguard Worker 
30*f6dc9357SAndroid Build Coastguard Worker #include "../Common/MyString.h"
31*f6dc9357SAndroid Build Coastguard Worker #include "../Common/MyBuffer.h"
32*f6dc9357SAndroid Build Coastguard Worker 
33*f6dc9357SAndroid Build Coastguard Worker #include "../Windows/TimeUtils.h"
34*f6dc9357SAndroid Build Coastguard Worker 
35*f6dc9357SAndroid Build Coastguard Worker #include "Defs.h"
36*f6dc9357SAndroid Build Coastguard Worker 
37*f6dc9357SAndroid Build Coastguard Worker HRESULT GetLastError_noZero_HRESULT();
38*f6dc9357SAndroid Build Coastguard Worker 
39*f6dc9357SAndroid Build Coastguard Worker #define my_FSCTL_SET_REPARSE_POINT     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 41, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) // REPARSE_DATA_BUFFER
40*f6dc9357SAndroid Build Coastguard Worker #define my_FSCTL_GET_REPARSE_POINT     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS)     // REPARSE_DATA_BUFFER
41*f6dc9357SAndroid Build Coastguard Worker #define my_FSCTL_DELETE_REPARSE_POINT  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 43, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) // REPARSE_DATA_BUFFER
42*f6dc9357SAndroid Build Coastguard Worker 
43*f6dc9357SAndroid Build Coastguard Worker namespace NWindows {
44*f6dc9357SAndroid Build Coastguard Worker namespace NFile {
45*f6dc9357SAndroid Build Coastguard Worker 
46*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(UNDER_CE)
47*f6dc9357SAndroid Build Coastguard Worker bool FillLinkData(CByteBuffer &dest, const wchar_t *path, bool isSymLink, bool isWSL);
48*f6dc9357SAndroid Build Coastguard Worker #endif
49*f6dc9357SAndroid Build Coastguard Worker 
50*f6dc9357SAndroid Build Coastguard Worker struct CReparseShortInfo
51*f6dc9357SAndroid Build Coastguard Worker {
52*f6dc9357SAndroid Build Coastguard Worker   unsigned Offset;
53*f6dc9357SAndroid Build Coastguard Worker   unsigned Size;
54*f6dc9357SAndroid Build Coastguard Worker 
55*f6dc9357SAndroid Build Coastguard Worker   bool Parse(const Byte *p, size_t size);
56*f6dc9357SAndroid Build Coastguard Worker };
57*f6dc9357SAndroid Build Coastguard Worker 
58*f6dc9357SAndroid Build Coastguard Worker struct CReparseAttr
59*f6dc9357SAndroid Build Coastguard Worker {
60*f6dc9357SAndroid Build Coastguard Worker   UInt32 Tag;
61*f6dc9357SAndroid Build Coastguard Worker   UInt32 Flags;
62*f6dc9357SAndroid Build Coastguard Worker   UString SubsName;
63*f6dc9357SAndroid Build Coastguard Worker   UString PrintName;
64*f6dc9357SAndroid Build Coastguard Worker 
65*f6dc9357SAndroid Build Coastguard Worker   AString WslName;
66*f6dc9357SAndroid Build Coastguard Worker 
67*f6dc9357SAndroid Build Coastguard Worker   bool HeaderError;
68*f6dc9357SAndroid Build Coastguard Worker   bool TagIsUnknown;
69*f6dc9357SAndroid Build Coastguard Worker   bool MinorError;
70*f6dc9357SAndroid Build Coastguard Worker   DWORD ErrorCode;
71*f6dc9357SAndroid Build Coastguard Worker 
CReparseAttrCReparseAttr72*f6dc9357SAndroid Build Coastguard Worker   CReparseAttr(): Tag(0), Flags(0) {}
73*f6dc9357SAndroid Build Coastguard Worker 
74*f6dc9357SAndroid Build Coastguard Worker   // Parse()
75*f6dc9357SAndroid Build Coastguard Worker   // returns (true) and (ErrorCode = 0), if (it'a correct known link)
76*f6dc9357SAndroid Build Coastguard Worker   // returns (false) and (ErrorCode = ERROR_REPARSE_TAG_INVALID), if unknown tag
77*f6dc9357SAndroid Build Coastguard Worker   bool Parse(const Byte *p, size_t size);
78*f6dc9357SAndroid Build Coastguard Worker 
IsMountPointCReparseAttr79*f6dc9357SAndroid Build Coastguard Worker   bool IsMountPoint()  const { return Tag == Z7_WIN_IO_REPARSE_TAG_MOUNT_POINT; } // it's Junction
IsSymLink_WinCReparseAttr80*f6dc9357SAndroid Build Coastguard Worker   bool IsSymLink_Win() const { return Tag == Z7_WIN_IO_REPARSE_TAG_SYMLINK; }
IsSymLink_WSLCReparseAttr81*f6dc9357SAndroid Build Coastguard Worker   bool IsSymLink_WSL() const { return Tag == Z7_WIN_IO_REPARSE_TAG_LX_SYMLINK; }
82*f6dc9357SAndroid Build Coastguard Worker 
IsRelative_WinCReparseAttr83*f6dc9357SAndroid Build Coastguard Worker   bool IsRelative_Win() const { return Flags == Z7_WIN_SYMLINK_FLAG_RELATIVE; }
84*f6dc9357SAndroid Build Coastguard Worker 
IsRelative_WSLCReparseAttr85*f6dc9357SAndroid Build Coastguard Worker   bool IsRelative_WSL() const
86*f6dc9357SAndroid Build Coastguard Worker   {
87*f6dc9357SAndroid Build Coastguard Worker     if (WslName.IsEmpty())
88*f6dc9357SAndroid Build Coastguard Worker       return true;
89*f6dc9357SAndroid Build Coastguard Worker     char c = WslName[0];
90*f6dc9357SAndroid Build Coastguard Worker     return !IS_PATH_SEPAR(c);
91*f6dc9357SAndroid Build Coastguard Worker   }
92*f6dc9357SAndroid Build Coastguard Worker 
93*f6dc9357SAndroid Build Coastguard Worker   // bool IsVolume() const;
94*f6dc9357SAndroid Build Coastguard Worker 
95*f6dc9357SAndroid Build Coastguard Worker   bool IsOkNamePair() const;
96*f6dc9357SAndroid Build Coastguard Worker   UString GetPath() const;
97*f6dc9357SAndroid Build Coastguard Worker };
98*f6dc9357SAndroid Build Coastguard Worker 
99*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
100*f6dc9357SAndroid Build Coastguard Worker #define CFiInfo BY_HANDLE_FILE_INFORMATION
101*f6dc9357SAndroid Build Coastguard Worker #define ST_MTIME(st) (st).ftLastWriteTime
102*f6dc9357SAndroid Build Coastguard Worker #else
103*f6dc9357SAndroid Build Coastguard Worker #define CFiInfo stat
104*f6dc9357SAndroid Build Coastguard Worker #endif
105*f6dc9357SAndroid Build Coastguard Worker 
106*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
107*f6dc9357SAndroid Build Coastguard Worker 
108*f6dc9357SAndroid Build Coastguard Worker namespace NIO {
109*f6dc9357SAndroid Build Coastguard Worker 
110*f6dc9357SAndroid Build Coastguard Worker bool GetReparseData(CFSTR path, CByteBuffer &reparseData, BY_HANDLE_FILE_INFORMATION *fileInfo = NULL);
111*f6dc9357SAndroid Build Coastguard Worker bool SetReparseData(CFSTR path, bool isDir, const void *data, DWORD size);
112*f6dc9357SAndroid Build Coastguard Worker bool DeleteReparseData(CFSTR path);
113*f6dc9357SAndroid Build Coastguard Worker 
114*f6dc9357SAndroid Build Coastguard Worker class CFileBase  MY_UNCOPYABLE
115*f6dc9357SAndroid Build Coastguard Worker {
116*f6dc9357SAndroid Build Coastguard Worker protected:
117*f6dc9357SAndroid Build Coastguard Worker   HANDLE _handle;
118*f6dc9357SAndroid Build Coastguard Worker 
119*f6dc9357SAndroid Build Coastguard Worker   bool Create(CFSTR path, DWORD desiredAccess,
120*f6dc9357SAndroid Build Coastguard Worker       DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes);
121*f6dc9357SAndroid Build Coastguard Worker 
122*f6dc9357SAndroid Build Coastguard Worker public:
123*f6dc9357SAndroid Build Coastguard Worker 
124*f6dc9357SAndroid Build Coastguard Worker   bool DeviceIoControl(DWORD controlCode, LPVOID inBuffer, DWORD inSize,
125*f6dc9357SAndroid Build Coastguard Worker       LPVOID outBuffer, DWORD outSize, LPDWORD bytesReturned, LPOVERLAPPED overlapped = NULL) const
126*f6dc9357SAndroid Build Coastguard Worker   {
127*f6dc9357SAndroid Build Coastguard Worker     return BOOLToBool(::DeviceIoControl(_handle, controlCode, inBuffer, inSize,
128*f6dc9357SAndroid Build Coastguard Worker         outBuffer, outSize, bytesReturned, overlapped));
129*f6dc9357SAndroid Build Coastguard Worker   }
130*f6dc9357SAndroid Build Coastguard Worker 
DeviceIoControlOut(DWORD controlCode,LPVOID outBuffer,DWORD outSize,LPDWORD bytesReturned)131*f6dc9357SAndroid Build Coastguard Worker   bool DeviceIoControlOut(DWORD controlCode, LPVOID outBuffer, DWORD outSize, LPDWORD bytesReturned) const
132*f6dc9357SAndroid Build Coastguard Worker   {
133*f6dc9357SAndroid Build Coastguard Worker     return DeviceIoControl(controlCode, NULL, 0, outBuffer, outSize, bytesReturned);
134*f6dc9357SAndroid Build Coastguard Worker   }
135*f6dc9357SAndroid Build Coastguard Worker 
DeviceIoControlOut(DWORD controlCode,LPVOID outBuffer,DWORD outSize)136*f6dc9357SAndroid Build Coastguard Worker   bool DeviceIoControlOut(DWORD controlCode, LPVOID outBuffer, DWORD outSize) const
137*f6dc9357SAndroid Build Coastguard Worker   {
138*f6dc9357SAndroid Build Coastguard Worker     DWORD bytesReturned;
139*f6dc9357SAndroid Build Coastguard Worker     return DeviceIoControlOut(controlCode, outBuffer, outSize, &bytesReturned);
140*f6dc9357SAndroid Build Coastguard Worker   }
141*f6dc9357SAndroid Build Coastguard Worker 
142*f6dc9357SAndroid Build Coastguard Worker public:
143*f6dc9357SAndroid Build Coastguard Worker   bool PreserveATime;
144*f6dc9357SAndroid Build Coastguard Worker #if 0
145*f6dc9357SAndroid Build Coastguard Worker   bool IsStdStream;
146*f6dc9357SAndroid Build Coastguard Worker   bool IsStdPipeStream;
147*f6dc9357SAndroid Build Coastguard Worker #endif
148*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_DEVICE_FILE
149*f6dc9357SAndroid Build Coastguard Worker   bool IsDeviceFile;
150*f6dc9357SAndroid Build Coastguard Worker   bool SizeDefined;
151*f6dc9357SAndroid Build Coastguard Worker   UInt64 Size; // it can be larger than real available size
152*f6dc9357SAndroid Build Coastguard Worker #endif
153*f6dc9357SAndroid Build Coastguard Worker 
CFileBase()154*f6dc9357SAndroid Build Coastguard Worker   CFileBase():
155*f6dc9357SAndroid Build Coastguard Worker     _handle(INVALID_HANDLE_VALUE),
156*f6dc9357SAndroid Build Coastguard Worker     PreserveATime(false)
157*f6dc9357SAndroid Build Coastguard Worker #if 0
158*f6dc9357SAndroid Build Coastguard Worker     , IsStdStream(false),
159*f6dc9357SAndroid Build Coastguard Worker     , IsStdPipeStream(false)
160*f6dc9357SAndroid Build Coastguard Worker #endif
161*f6dc9357SAndroid Build Coastguard Worker     {}
~CFileBase()162*f6dc9357SAndroid Build Coastguard Worker   ~CFileBase() { Close(); }
163*f6dc9357SAndroid Build Coastguard Worker 
GetHandle()164*f6dc9357SAndroid Build Coastguard Worker   HANDLE GetHandle() const { return _handle; }
165*f6dc9357SAndroid Build Coastguard Worker 
166*f6dc9357SAndroid Build Coastguard Worker   // void Detach() { _handle = INVALID_HANDLE_VALUE; }
167*f6dc9357SAndroid Build Coastguard Worker 
168*f6dc9357SAndroid Build Coastguard Worker   bool Close() throw();
169*f6dc9357SAndroid Build Coastguard Worker 
170*f6dc9357SAndroid Build Coastguard Worker   bool GetPosition(UInt64 &position) const throw();
171*f6dc9357SAndroid Build Coastguard Worker   bool GetLength(UInt64 &length) const throw();
172*f6dc9357SAndroid Build Coastguard Worker 
173*f6dc9357SAndroid Build Coastguard Worker   bool Seek(Int64 distanceToMove, DWORD moveMethod, UInt64 &newPosition) const throw();
174*f6dc9357SAndroid Build Coastguard Worker   bool Seek(UInt64 position, UInt64 &newPosition) const throw();
175*f6dc9357SAndroid Build Coastguard Worker   bool SeekToBegin() const throw();
176*f6dc9357SAndroid Build Coastguard Worker   bool SeekToEnd(UInt64 &newPosition) const throw();
177*f6dc9357SAndroid Build Coastguard Worker 
GetFileInformation(BY_HANDLE_FILE_INFORMATION * info)178*f6dc9357SAndroid Build Coastguard Worker   bool GetFileInformation(BY_HANDLE_FILE_INFORMATION *info) const
179*f6dc9357SAndroid Build Coastguard Worker     { return BOOLToBool(GetFileInformationByHandle(_handle, info)); }
180*f6dc9357SAndroid Build Coastguard Worker 
GetFileInformation(CFSTR path,BY_HANDLE_FILE_INFORMATION * info)181*f6dc9357SAndroid Build Coastguard Worker   static bool GetFileInformation(CFSTR path, BY_HANDLE_FILE_INFORMATION *info)
182*f6dc9357SAndroid Build Coastguard Worker   {
183*f6dc9357SAndroid Build Coastguard Worker     // probably it can work for complex paths: unsupported by another things
184*f6dc9357SAndroid Build Coastguard Worker     NIO::CFileBase file;
185*f6dc9357SAndroid Build Coastguard Worker     if (!file.Create(path, 0, FILE_SHARE_READ, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS))
186*f6dc9357SAndroid Build Coastguard Worker       return false;
187*f6dc9357SAndroid Build Coastguard Worker     return file.GetFileInformation(info);
188*f6dc9357SAndroid Build Coastguard Worker   }
189*f6dc9357SAndroid Build Coastguard Worker };
190*f6dc9357SAndroid Build Coastguard Worker 
191*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
192*f6dc9357SAndroid Build Coastguard Worker #define IOCTL_CDROM_BASE  FILE_DEVICE_CD_ROM
193*f6dc9357SAndroid Build Coastguard Worker #define IOCTL_CDROM_GET_DRIVE_GEOMETRY  CTL_CODE(IOCTL_CDROM_BASE, 0x0013, METHOD_BUFFERED, FILE_READ_ACCESS)
194*f6dc9357SAndroid Build Coastguard Worker // #define IOCTL_CDROM_MEDIA_REMOVAL  CTL_CODE(IOCTL_CDROM_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)
195*f6dc9357SAndroid Build Coastguard Worker 
196*f6dc9357SAndroid Build Coastguard Worker // IOCTL_DISK_GET_DRIVE_GEOMETRY_EX works since WinXP
197*f6dc9357SAndroid Build Coastguard Worker #define my_IOCTL_DISK_GET_DRIVE_GEOMETRY_EX  CTL_CODE(IOCTL_DISK_BASE, 0x0028, METHOD_BUFFERED, FILE_ANY_ACCESS)
198*f6dc9357SAndroid Build Coastguard Worker 
199*f6dc9357SAndroid Build Coastguard Worker struct my_DISK_GEOMETRY_EX
200*f6dc9357SAndroid Build Coastguard Worker {
201*f6dc9357SAndroid Build Coastguard Worker   DISK_GEOMETRY Geometry;
202*f6dc9357SAndroid Build Coastguard Worker   LARGE_INTEGER DiskSize;
203*f6dc9357SAndroid Build Coastguard Worker   BYTE Data[1];
204*f6dc9357SAndroid Build Coastguard Worker };
205*f6dc9357SAndroid Build Coastguard Worker #endif
206*f6dc9357SAndroid Build Coastguard Worker 
207*f6dc9357SAndroid Build Coastguard Worker class CInFile: public CFileBase
208*f6dc9357SAndroid Build Coastguard Worker {
209*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_DEVICE_FILE
210*f6dc9357SAndroid Build Coastguard Worker 
211*f6dc9357SAndroid Build Coastguard Worker   #ifndef UNDER_CE
212*f6dc9357SAndroid Build Coastguard Worker 
GetGeometry(DISK_GEOMETRY * res)213*f6dc9357SAndroid Build Coastguard Worker   bool GetGeometry(DISK_GEOMETRY *res) const
214*f6dc9357SAndroid Build Coastguard Worker     { return DeviceIoControlOut(IOCTL_DISK_GET_DRIVE_GEOMETRY, res, sizeof(*res)); }
215*f6dc9357SAndroid Build Coastguard Worker 
GetGeometryEx(my_DISK_GEOMETRY_EX * res)216*f6dc9357SAndroid Build Coastguard Worker   bool GetGeometryEx(my_DISK_GEOMETRY_EX *res) const
217*f6dc9357SAndroid Build Coastguard Worker     { return DeviceIoControlOut(my_IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, res, sizeof(*res)); }
218*f6dc9357SAndroid Build Coastguard Worker 
GetCdRomGeometry(DISK_GEOMETRY * res)219*f6dc9357SAndroid Build Coastguard Worker   bool GetCdRomGeometry(DISK_GEOMETRY *res) const
220*f6dc9357SAndroid Build Coastguard Worker     { return DeviceIoControlOut(IOCTL_CDROM_GET_DRIVE_GEOMETRY, res, sizeof(*res)); }
221*f6dc9357SAndroid Build Coastguard Worker 
GetPartitionInfo(PARTITION_INFORMATION * res)222*f6dc9357SAndroid Build Coastguard Worker   bool GetPartitionInfo(PARTITION_INFORMATION *res)
223*f6dc9357SAndroid Build Coastguard Worker     { return DeviceIoControlOut(IOCTL_DISK_GET_PARTITION_INFO, LPVOID(res), sizeof(*res)); }
224*f6dc9357SAndroid Build Coastguard Worker 
225*f6dc9357SAndroid Build Coastguard Worker   #endif
226*f6dc9357SAndroid Build Coastguard Worker 
227*f6dc9357SAndroid Build Coastguard Worker   void CorrectDeviceSize();
228*f6dc9357SAndroid Build Coastguard Worker   void CalcDeviceSize(CFSTR name);
229*f6dc9357SAndroid Build Coastguard Worker 
230*f6dc9357SAndroid Build Coastguard Worker   #endif
231*f6dc9357SAndroid Build Coastguard Worker 
232*f6dc9357SAndroid Build Coastguard Worker public:
233*f6dc9357SAndroid Build Coastguard Worker   bool Open(CFSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes);
234*f6dc9357SAndroid Build Coastguard Worker   bool OpenShared(CFSTR fileName, bool shareForWrite);
235*f6dc9357SAndroid Build Coastguard Worker   bool Open(CFSTR fileName);
236*f6dc9357SAndroid Build Coastguard Worker 
237*f6dc9357SAndroid Build Coastguard Worker #if 0
238*f6dc9357SAndroid Build Coastguard Worker   bool AttachStdIn()
239*f6dc9357SAndroid Build Coastguard Worker   {
240*f6dc9357SAndroid Build Coastguard Worker     IsDeviceFile = false;
241*f6dc9357SAndroid Build Coastguard Worker     const HANDLE h = GetStdHandle(STD_INPUT_HANDLE);
242*f6dc9357SAndroid Build Coastguard Worker     if (h == INVALID_HANDLE_VALUE || !h)
243*f6dc9357SAndroid Build Coastguard Worker       return false;
244*f6dc9357SAndroid Build Coastguard Worker     IsStdStream = true;
245*f6dc9357SAndroid Build Coastguard Worker     IsStdPipeStream = true;
246*f6dc9357SAndroid Build Coastguard Worker     _handle = h;
247*f6dc9357SAndroid Build Coastguard Worker     return true;
248*f6dc9357SAndroid Build Coastguard Worker   }
249*f6dc9357SAndroid Build Coastguard Worker #endif
250*f6dc9357SAndroid Build Coastguard Worker 
251*f6dc9357SAndroid Build Coastguard Worker   #ifndef UNDER_CE
252*f6dc9357SAndroid Build Coastguard Worker 
Open_for_ReadAttributes(CFSTR fileName)253*f6dc9357SAndroid Build Coastguard Worker   bool Open_for_ReadAttributes(CFSTR fileName)
254*f6dc9357SAndroid Build Coastguard Worker   {
255*f6dc9357SAndroid Build Coastguard Worker     return Create(fileName, FILE_READ_ATTRIBUTES,
256*f6dc9357SAndroid Build Coastguard Worker         FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
257*f6dc9357SAndroid Build Coastguard Worker         OPEN_EXISTING,
258*f6dc9357SAndroid Build Coastguard Worker         FILE_FLAG_BACKUP_SEMANTICS);
259*f6dc9357SAndroid Build Coastguard Worker     // we must use (FILE_FLAG_BACKUP_SEMANTICS) to open handle of directory.
260*f6dc9357SAndroid Build Coastguard Worker   }
261*f6dc9357SAndroid Build Coastguard Worker 
Open_for_FileRenameInformation(CFSTR fileName)262*f6dc9357SAndroid Build Coastguard Worker   bool Open_for_FileRenameInformation(CFSTR fileName)
263*f6dc9357SAndroid Build Coastguard Worker   {
264*f6dc9357SAndroid Build Coastguard Worker     return Create(fileName, DELETE | SYNCHRONIZE | GENERIC_READ,
265*f6dc9357SAndroid Build Coastguard Worker         FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
266*f6dc9357SAndroid Build Coastguard Worker         OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL);
267*f6dc9357SAndroid Build Coastguard Worker     // we must use (FILE_FLAG_BACKUP_SEMANTICS) to open handle of directory.
268*f6dc9357SAndroid Build Coastguard Worker   }
269*f6dc9357SAndroid Build Coastguard Worker 
OpenReparse(CFSTR fileName)270*f6dc9357SAndroid Build Coastguard Worker   bool OpenReparse(CFSTR fileName)
271*f6dc9357SAndroid Build Coastguard Worker   {
272*f6dc9357SAndroid Build Coastguard Worker     // 17.02 fix: to support Windows XP compatibility junctions:
273*f6dc9357SAndroid Build Coastguard Worker     //   we use Create() with (desiredAccess = 0) instead of Open() with GENERIC_READ
274*f6dc9357SAndroid Build Coastguard Worker     return
275*f6dc9357SAndroid Build Coastguard Worker         Create(fileName, 0,
276*f6dc9357SAndroid Build Coastguard Worker         // Open(fileName,
277*f6dc9357SAndroid Build Coastguard Worker         FILE_SHARE_READ, OPEN_EXISTING,
278*f6dc9357SAndroid Build Coastguard Worker         FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS);
279*f6dc9357SAndroid Build Coastguard Worker   }
280*f6dc9357SAndroid Build Coastguard Worker 
281*f6dc9357SAndroid Build Coastguard Worker   #endif
282*f6dc9357SAndroid Build Coastguard Worker 
283*f6dc9357SAndroid Build Coastguard Worker   bool Read1(void *data, UInt32 size, UInt32 &processedSize) throw();
284*f6dc9357SAndroid Build Coastguard Worker   bool ReadPart(void *data, UInt32 size, UInt32 &processedSize) throw();
285*f6dc9357SAndroid Build Coastguard Worker   bool Read(void *data, UInt32 size, UInt32 &processedSize) throw();
286*f6dc9357SAndroid Build Coastguard Worker   bool ReadFull(void *data, size_t size, size_t &processedSize) throw();
287*f6dc9357SAndroid Build Coastguard Worker };
288*f6dc9357SAndroid Build Coastguard Worker 
289*f6dc9357SAndroid Build Coastguard Worker class COutFile: public CFileBase
290*f6dc9357SAndroid Build Coastguard Worker {
291*f6dc9357SAndroid Build Coastguard Worker   bool Open_Disposition(CFSTR fileName, DWORD creationDisposition);
292*f6dc9357SAndroid Build Coastguard Worker public:
293*f6dc9357SAndroid Build Coastguard Worker   bool Open(CFSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes);
Open_EXISTING(CFSTR fileName)294*f6dc9357SAndroid Build Coastguard Worker   bool Open_EXISTING(CFSTR fileName)
295*f6dc9357SAndroid Build Coastguard Worker     { return Open_Disposition(fileName, OPEN_EXISTING); }
Create_ALWAYS_or_Open_ALWAYS(CFSTR fileName,bool createAlways)296*f6dc9357SAndroid Build Coastguard Worker   bool Create_ALWAYS_or_Open_ALWAYS(CFSTR fileName, bool createAlways)
297*f6dc9357SAndroid Build Coastguard Worker     { return Open_Disposition(fileName, createAlways ? CREATE_ALWAYS : OPEN_ALWAYS); }
Create_ALWAYS_or_NEW(CFSTR fileName,bool createAlways)298*f6dc9357SAndroid Build Coastguard Worker   bool Create_ALWAYS_or_NEW(CFSTR fileName, bool createAlways)
299*f6dc9357SAndroid Build Coastguard Worker     { return Open_Disposition(fileName, createAlways ? CREATE_ALWAYS : CREATE_NEW); }
Create_ALWAYS(CFSTR fileName)300*f6dc9357SAndroid Build Coastguard Worker   bool Create_ALWAYS(CFSTR fileName)
301*f6dc9357SAndroid Build Coastguard Worker     { return Open_Disposition(fileName, CREATE_ALWAYS); }
Create_NEW(CFSTR fileName)302*f6dc9357SAndroid Build Coastguard Worker   bool Create_NEW(CFSTR fileName)
303*f6dc9357SAndroid Build Coastguard Worker     { return Open_Disposition(fileName, CREATE_NEW); }
304*f6dc9357SAndroid Build Coastguard Worker 
305*f6dc9357SAndroid Build Coastguard Worker   bool Create_ALWAYS_with_Attribs(CFSTR fileName, DWORD flagsAndAttributes);
306*f6dc9357SAndroid Build Coastguard Worker 
307*f6dc9357SAndroid Build Coastguard Worker   bool SetTime(const CFiTime *cTime, const CFiTime *aTime, const CFiTime *mTime) throw();
308*f6dc9357SAndroid Build Coastguard Worker   bool SetMTime(const CFiTime *mTime) throw();
309*f6dc9357SAndroid Build Coastguard Worker   bool WritePart(const void *data, UInt32 size, UInt32 &processedSize) throw();
310*f6dc9357SAndroid Build Coastguard Worker   bool Write(const void *data, UInt32 size, UInt32 &processedSize) throw();
311*f6dc9357SAndroid Build Coastguard Worker   bool WriteFull(const void *data, size_t size) throw();
312*f6dc9357SAndroid Build Coastguard Worker   bool SetEndOfFile() throw();
313*f6dc9357SAndroid Build Coastguard Worker   bool SetLength(UInt64 length) throw();
314*f6dc9357SAndroid Build Coastguard Worker   bool SetLength_KeepPosition(UInt64 length) throw();
315*f6dc9357SAndroid Build Coastguard Worker };
316*f6dc9357SAndroid Build Coastguard Worker 
317*f6dc9357SAndroid Build Coastguard Worker }
318*f6dc9357SAndroid Build Coastguard Worker 
319*f6dc9357SAndroid Build Coastguard Worker 
320*f6dc9357SAndroid Build Coastguard Worker #else // _WIN32
321*f6dc9357SAndroid Build Coastguard Worker 
322*f6dc9357SAndroid Build Coastguard Worker namespace NIO {
323*f6dc9357SAndroid Build Coastguard Worker 
324*f6dc9357SAndroid Build Coastguard Worker bool GetReparseData(CFSTR path, CByteBuffer &reparseData);
325*f6dc9357SAndroid Build Coastguard Worker // bool SetReparseData(CFSTR path, bool isDir, const void *data, DWORD size);
326*f6dc9357SAndroid Build Coastguard Worker 
327*f6dc9357SAndroid Build Coastguard Worker // parameters are in reverse order of symlink() function !!!
328*f6dc9357SAndroid Build Coastguard Worker bool SetSymLink(CFSTR from, CFSTR to);
329*f6dc9357SAndroid Build Coastguard Worker bool SetSymLink_UString(CFSTR from, const UString &to);
330*f6dc9357SAndroid Build Coastguard Worker 
331*f6dc9357SAndroid Build Coastguard Worker 
332*f6dc9357SAndroid Build Coastguard Worker class CFileBase
333*f6dc9357SAndroid Build Coastguard Worker {
334*f6dc9357SAndroid Build Coastguard Worker protected:
335*f6dc9357SAndroid Build Coastguard Worker   int _handle;
336*f6dc9357SAndroid Build Coastguard Worker 
337*f6dc9357SAndroid Build Coastguard Worker   /*
338*f6dc9357SAndroid Build Coastguard Worker   bool IsDeviceFile;
339*f6dc9357SAndroid Build Coastguard Worker   bool SizeDefined;
340*f6dc9357SAndroid Build Coastguard Worker   UInt64 Size; // it can be larger than real available size
341*f6dc9357SAndroid Build Coastguard Worker   */
342*f6dc9357SAndroid Build Coastguard Worker 
343*f6dc9357SAndroid Build Coastguard Worker   bool OpenBinary(const char *name, int flags, mode_t mode = 0666);
344*f6dc9357SAndroid Build Coastguard Worker public:
345*f6dc9357SAndroid Build Coastguard Worker   bool PreserveATime;
346*f6dc9357SAndroid Build Coastguard Worker #if 0
347*f6dc9357SAndroid Build Coastguard Worker   bool IsStdStream;
348*f6dc9357SAndroid Build Coastguard Worker #endif
349*f6dc9357SAndroid Build Coastguard Worker 
CFileBase()350*f6dc9357SAndroid Build Coastguard Worker   CFileBase(): _handle(-1), PreserveATime(false)
351*f6dc9357SAndroid Build Coastguard Worker #if 0
352*f6dc9357SAndroid Build Coastguard Worker     , IsStdStream(false)
353*f6dc9357SAndroid Build Coastguard Worker #endif
354*f6dc9357SAndroid Build Coastguard Worker   {}
~CFileBase()355*f6dc9357SAndroid Build Coastguard Worker   ~CFileBase() { Close(); }
356*f6dc9357SAndroid Build Coastguard Worker   // void Detach() { _handle = -1; }
357*f6dc9357SAndroid Build Coastguard Worker   bool Close();
358*f6dc9357SAndroid Build Coastguard Worker   bool GetLength(UInt64 &length) const;
359*f6dc9357SAndroid Build Coastguard Worker   off_t seek(off_t distanceToMove, int moveMethod) const;
360*f6dc9357SAndroid Build Coastguard Worker   off_t seekToBegin() const throw();
361*f6dc9357SAndroid Build Coastguard Worker   off_t seekToCur() const throw();
362*f6dc9357SAndroid Build Coastguard Worker   // bool SeekToBegin() throw();
my_fstat(struct stat * st)363*f6dc9357SAndroid Build Coastguard Worker   int my_fstat(struct stat *st) const  { return fstat(_handle, st); }
364*f6dc9357SAndroid Build Coastguard Worker   /*
365*f6dc9357SAndroid Build Coastguard Worker   int my_ioctl_BLKGETSIZE64(unsigned long long *val);
366*f6dc9357SAndroid Build Coastguard Worker   int GetDeviceSize_InBytes(UInt64 &size);
367*f6dc9357SAndroid Build Coastguard Worker   void CalcDeviceSize(CFSTR s);
368*f6dc9357SAndroid Build Coastguard Worker   */
369*f6dc9357SAndroid Build Coastguard Worker };
370*f6dc9357SAndroid Build Coastguard Worker 
371*f6dc9357SAndroid Build Coastguard Worker class CInFile: public CFileBase
372*f6dc9357SAndroid Build Coastguard Worker {
373*f6dc9357SAndroid Build Coastguard Worker public:
374*f6dc9357SAndroid Build Coastguard Worker   bool Open(const char *name);
375*f6dc9357SAndroid Build Coastguard Worker   bool OpenShared(const char *name, bool shareForWrite);
376*f6dc9357SAndroid Build Coastguard Worker #if 0
377*f6dc9357SAndroid Build Coastguard Worker   bool AttachStdIn()
378*f6dc9357SAndroid Build Coastguard Worker   {
379*f6dc9357SAndroid Build Coastguard Worker     _handle = GetStdHandle(STD_INPUT_HANDLE);
380*f6dc9357SAndroid Build Coastguard Worker     if (_handle == INVALID_HANDLE_VALUE || !_handle)
381*f6dc9357SAndroid Build Coastguard Worker       return false;
382*f6dc9357SAndroid Build Coastguard Worker     IsStdStream = true;
383*f6dc9357SAndroid Build Coastguard Worker   }
384*f6dc9357SAndroid Build Coastguard Worker #endif
385*f6dc9357SAndroid Build Coastguard Worker   ssize_t read_part(void *data, size_t size) throw();
386*f6dc9357SAndroid Build Coastguard Worker   // ssize_t read_full(void *data, size_t size, size_t &processed);
387*f6dc9357SAndroid Build Coastguard Worker   bool ReadFull(void *data, size_t size, size_t &processedSize) throw();
388*f6dc9357SAndroid Build Coastguard Worker };
389*f6dc9357SAndroid Build Coastguard Worker 
390*f6dc9357SAndroid Build Coastguard Worker class COutFile: public CFileBase
391*f6dc9357SAndroid Build Coastguard Worker {
392*f6dc9357SAndroid Build Coastguard Worker   bool CTime_defined;
393*f6dc9357SAndroid Build Coastguard Worker   bool ATime_defined;
394*f6dc9357SAndroid Build Coastguard Worker   bool MTime_defined;
395*f6dc9357SAndroid Build Coastguard Worker   CFiTime CTime;
396*f6dc9357SAndroid Build Coastguard Worker   CFiTime ATime;
397*f6dc9357SAndroid Build Coastguard Worker   CFiTime MTime;
398*f6dc9357SAndroid Build Coastguard Worker 
399*f6dc9357SAndroid Build Coastguard Worker   AString Path;
400*f6dc9357SAndroid Build Coastguard Worker   ssize_t write_part(const void *data, size_t size) throw();
401*f6dc9357SAndroid Build Coastguard Worker   bool OpenBinary_forWrite_oflag(const char *name, int oflag);
402*f6dc9357SAndroid Build Coastguard Worker public:
403*f6dc9357SAndroid Build Coastguard Worker   mode_t mode_for_Create;
404*f6dc9357SAndroid Build Coastguard Worker 
COutFile()405*f6dc9357SAndroid Build Coastguard Worker   COutFile():
406*f6dc9357SAndroid Build Coastguard Worker       CTime_defined(false),
407*f6dc9357SAndroid Build Coastguard Worker       ATime_defined(false),
408*f6dc9357SAndroid Build Coastguard Worker       MTime_defined(false),
409*f6dc9357SAndroid Build Coastguard Worker       mode_for_Create(0666)
410*f6dc9357SAndroid Build Coastguard Worker       {}
411*f6dc9357SAndroid Build Coastguard Worker 
412*f6dc9357SAndroid Build Coastguard Worker   bool Close();
413*f6dc9357SAndroid Build Coastguard Worker 
414*f6dc9357SAndroid Build Coastguard Worker   bool Open_EXISTING(CFSTR fileName);
415*f6dc9357SAndroid Build Coastguard Worker   bool Create_ALWAYS_or_Open_ALWAYS(CFSTR fileName, bool createAlways);
416*f6dc9357SAndroid Build Coastguard Worker   bool Create_ALWAYS(CFSTR fileName);
417*f6dc9357SAndroid Build Coastguard Worker   bool Create_NEW(CFSTR fileName);
418*f6dc9357SAndroid Build Coastguard Worker   // bool Create_ALWAYS_or_NEW(CFSTR fileName, bool createAlways);
419*f6dc9357SAndroid Build Coastguard Worker   // bool Open_Disposition(const char *name, DWORD creationDisposition);
420*f6dc9357SAndroid Build Coastguard Worker 
421*f6dc9357SAndroid Build Coastguard Worker   ssize_t write_full(const void *data, size_t size, size_t &processed) throw();
422*f6dc9357SAndroid Build Coastguard Worker 
WriteFull(const void * data,size_t size)423*f6dc9357SAndroid Build Coastguard Worker   bool WriteFull(const void *data, size_t size) throw()
424*f6dc9357SAndroid Build Coastguard Worker   {
425*f6dc9357SAndroid Build Coastguard Worker     size_t processed;
426*f6dc9357SAndroid Build Coastguard Worker     ssize_t res = write_full(data, size, processed);
427*f6dc9357SAndroid Build Coastguard Worker     if (res == -1)
428*f6dc9357SAndroid Build Coastguard Worker       return false;
429*f6dc9357SAndroid Build Coastguard Worker     return processed == size;
430*f6dc9357SAndroid Build Coastguard Worker   }
431*f6dc9357SAndroid Build Coastguard Worker 
432*f6dc9357SAndroid Build Coastguard Worker   bool SetLength(UInt64 length) throw();
SetLength_KeepPosition(UInt64 length)433*f6dc9357SAndroid Build Coastguard Worker   bool SetLength_KeepPosition(UInt64 length) throw()
434*f6dc9357SAndroid Build Coastguard Worker   {
435*f6dc9357SAndroid Build Coastguard Worker     return SetLength(length);
436*f6dc9357SAndroid Build Coastguard Worker   }
437*f6dc9357SAndroid Build Coastguard Worker   bool SetTime(const CFiTime *cTime, const CFiTime *aTime, const CFiTime *mTime) throw();
438*f6dc9357SAndroid Build Coastguard Worker   bool SetMTime(const CFiTime *mTime) throw();
439*f6dc9357SAndroid Build Coastguard Worker };
440*f6dc9357SAndroid Build Coastguard Worker 
441*f6dc9357SAndroid Build Coastguard Worker }
442*f6dc9357SAndroid Build Coastguard Worker 
443*f6dc9357SAndroid Build Coastguard Worker #endif  // _WIN32
444*f6dc9357SAndroid Build Coastguard Worker 
445*f6dc9357SAndroid Build Coastguard Worker }}
446*f6dc9357SAndroid Build Coastguard Worker 
447*f6dc9357SAndroid Build Coastguard Worker 
448*f6dc9357SAndroid Build Coastguard Worker #endif
449