Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cFile.h
Go to the documentation of this file.
1 //
4 //
5 
6 #ifndef _INC_cFile_H
7 #define _INC_cFile_H
8 #ifndef NO_PRAGMA_ONCE
9 #pragma once
10 #endif
11 
12 #include "cObject.h"
13 #include "cStream.h"
14 #include "cTimeInt.h"
15 #include "cFilePath.h"
16 #include "cFileStatus.h"
17 #include "cOSHandle.h"
18 #include "cException.h"
19 
20 #if defined(__linux__)
21 //#include <sys/types.h>
22 #include <fcntl.h> // O_RDONLY
23 //#include <unistd.h>
24 struct _SECURITY_ATTRIBUTES; // stub this out
25 #endif
26 
27 namespace Gray
28 {
29  UNITTEST2_PREDEF(cFile);
30 
32  {
35 #if defined(__linux__)
36  OF_READ = O_RDONLY,
37  OF_WRITE = O_WRONLY,
38  OF_READWRITE = O_RDWR,
39  OF_APPEND = O_APPEND,
40  OF_CREATE = O_CREAT,
41 
42  OF_SHARE_COMPAT = 0x00000000,
43  OF_SHARE_EXCLUSIVE = 0x00000000,
44  OF_SHARE_DENY_WRITE = 0x00000000,
45  OF_SHARE_DENY_READ = 0x00000000,
46  OF_SHARE_DENY_NONE = 0x00000000,
47 
48  OF_EXIST = 0x00000000,
49 #endif
50 
51 #if defined(UNDER_CE)
52  OF_READ = 0x0000,
53  OF_WRITE = 0x0001,
54  OF_READWRITE = 0x0002,
55  OF_APPEND = 0x0008,
56  OF_CREATE = 0x0100,
57 
58  OF_SHARE_COMPAT = 0x00000000,
59  OF_SHARE_EXCLUSIVE = 0x00000010,
60  OF_SHARE_DENY_WRITE = 0x00000020,
61  OF_SHARE_DENY_READ = 0x00000030,
62  OF_SHARE_DENY_NONE = 0x00000040,
63 
64  OF_EXIST = 0x00004000,
65 #endif
66 
68  OF_OPEN_MASK = 0x00FFFFFF,
69  // OF_CACHE_RAND = 0x04000000,
70  OF_CACHE_SEQ = 0x08000000,
71  OF_BINARY = 0x10000000,
72  OF_TEXT = 0x20000000,
73  OF_NONCRIT = 0x40000000,
74  // OF_TEXT_W = 0x80000000, //!< UNICODE text file. (set by use of wchar_t Read/WriteString functions)
75  };
76 
77  typedef UINT32 OF_FLAGS_t;
78 
80 
81 #ifndef _MFC_VER
83  class GRAYCORE_LINK CFile : public CObject // replace the MFC version
84  {
88 
89  public:
91  protected:
93 
94  protected:
95  bool isFileOpen() const noexcept
96  {
97  return m_hFile.isValidHandle();
98  }
99 
100  // virtual BOOL Open( const TCHAR* lpszFileName, UINT nOpenFlags, CFileException* pError = nullptr ) = 0; // MFC def.
101  HRESULT OpenCreate(cStringF sFilePath = "", OF_FLAGS_t nOpenFlags = OF_CREATE | OF_WRITE, _SECURITY_ATTRIBUTES* pSa = nullptr);
102  public:
103  virtual ~CFile()
104  {
105  Close();
106  }
107 
108  // virtual CString GetFilePath() const // DO NOT USE this. It conflicts with the messed up version of MFC.
109 
110 #if defined(__linux__)
111  HRESULT GetStatusSys(OUT cFileStatusSys& statusSys);
112 #endif
113 
114  // File Access
115  virtual STREAM_SEEKRET_t Seek(STREAM_OFFSET_t lOffset = 0, SEEK_ORIGIN_TYPE eSeekOrigin = SEEK_Set); // should be const ? but not in MFC !
116  virtual STREAM_POS_t GetPosition() const;
117  virtual STREAM_POS_t GetLength() const;
118 
119  virtual void SetLength(STREAM_SEEKRET_t dwNewLen);
120  virtual void Close()
121  {
122  m_hFile.CloseHandle();
123  }
124 
125  HRESULT Write(const void* pData, size_t nDataSize);
126  HRESULT Read(void* pData, size_t nDataSize)
127  {
128  // don't call this directly use ReadX
129  return m_hFile.ReadX(pData, nDataSize);
130  }
131  };
132 #endif // _MFC_VER
133 
135  : public CFile
136  , public cStream
137  {
142 
143  typedef CFile SUPER_t;
144 
145  protected:
148 
149  protected:
150  HRESULT OpenSetup(cStringF sFilePath, OF_FLAGS_t uModeFlags);
151 
152  public:
154  : m_nOpenFlags(0)
155  {
156  }
157  cFile(cStringF sFilePath, OF_FLAGS_t nOpenFlags)
158  {
159  OpenX(sFilePath, nOpenFlags);
160  }
161  virtual ~cFile()
162  {
163  Close();
164  }
165 
166  virtual bool isValidCheck() const noexcept
167  {
168 #ifndef _MFC_VER
169  if (!CObject::isValidCheck())
170  return false;
171 #endif
172  if (!IS_TYPE_OF(CFile, this)) // structure definitions are valid..
173  return false;
174  return true;
175  }
176 
177  virtual STREAM_SEEKRET_t Seek(STREAM_OFFSET_t lOffset = 0, SEEK_ORIGIN_TYPE eSeekOrigin = SEEK_Set) override
178  {
183  return CFile::Seek(lOffset, eSeekOrigin);
184  }
185  virtual STREAM_POS_t GetPosition() const override
186  {
189  return CFile::GetPosition();
190  }
191  virtual STREAM_POS_t GetLength() const override
192  {
195  return CFile::GetLength();
196  }
197 
198 #ifdef _MFC_VER
199  void SeekToBegin()
200  {
202  CFile::SeekToBegin();
203  }
204  STREAM_POS_t SeekToEnd()
205  {
207  return CFile::SeekToEnd();
208  }
209 #else
210  int Read(void* pData, size_t nDataSize)
211  {
212  // Emulate MFC. Try not to call this directly. use ReadX.
213  return ReadX(pData, nDataSize);
214  }
215  void Write(const void* pData, size_t nDataSize)
216  {
217  // Emulate MFC
218  WriteX(pData, nDataSize);
219  }
220 #endif
221 
223  {
228  return cStringF(m_strFileName);
229  }
230  cStringF get_FileTitleX() const; // MFC is CString return
231  cStringF get_FileExt() const;
232  bool IsFileExt(const FILECHAR_t* pszExt) const;
233 
234  // File Mode stuff.
235  OF_FLAGS_t get_Mode() const noexcept
236  {
238  return m_nOpenFlags & 0x00FFFFFF; //
239  }
240  OF_FLAGS_t get_ModeFlags() const noexcept
241  {
243  return m_nOpenFlags;
244  }
245  bool isModeWrite() const noexcept
246  {
247  // Can i write ?
248  const OF_FLAGS_t nFlagsDir = (m_nOpenFlags & (OF_WRITE | OF_READ | OF_READWRITE));
249  return nFlagsDir == OF_WRITE || nFlagsDir == OF_READWRITE;
250  }
251  bool isModeRead() const noexcept
252  {
253  // Can i read ?
254  const OF_FLAGS_t nFlagsDir = (m_nOpenFlags & (OF_WRITE | OF_READ | OF_READWRITE));
255  return nFlagsDir == OF_READ || nFlagsDir == OF_READWRITE; // assume OF_READ = 0
256  }
257 
258  // File Open/Close
259  virtual bool isFileOpen() const
260  {
261 #ifdef _MFC_VER
262  return m_hFile != CFile::hFileNull;
263 #else
264  return CFile::isFileOpen();
265 #endif
266  }
267 
268  // MFC Open is BOOL return type.
269  virtual HRESULT OpenX(cStringF sFilePath = "", OF_FLAGS_t nOpenFlags = OF_READ | OF_SHARE_DENY_NONE);
270  virtual void Close(void) override;
271 
272  HANDLE DetachFileHandle();
273 
274  HRESULT OpenWait(cStringF sFilePath = "", OF_FLAGS_t nOpenFlags = OF_READ | OF_SHARE_DENY_NONE, TIMESYSD_t nWaitTime = 100);
275  HRESULT OpenCreate(cStringF sFilePath = "", OF_FLAGS_t nOpenFlags = OF_CREATE | OF_WRITE, _SECURITY_ATTRIBUTES* pSa = nullptr);
276 
277  // File Access
278  bool SetFileTime(const cTimeFile* lpCreationTime, const cTimeFile* lpAccessTime, const cTimeFile* lpLastWriteTime);
279  bool SetFileTime(cTimeInt timeCreation, cTimeInt timeLastWrite);
280  HRESULT GetFileStatus(OUT cFileStatus& attr) const;
281 
282  // cStream
283  virtual HRESULT ReadX(void* pData, size_t nDataSize) override;
284  virtual HRESULT WriteX(const void* pData, size_t nDataSize) override; // disambiguate.
285  virtual HRESULT FlushX() override;
286 
287  static HRESULT GRAYCALL DeletePath(const FILECHAR_t* pszFileName); // NOTE: MFC Remove() returns void
288  static HRESULT GRAYCALL DeletePathX(const FILECHAR_t* pszFilePath, DWORD nFileFlags = 0);
289  static HRESULT GRAYCALL LoadFile(const FILECHAR_t* pszFilePath, OUT cHeapBlock& block, size_t nSizeExtra = 0);
290 
292  };
293 }
294 
295 #endif // _INC_CFile_H
#define GRAYCORE_LINK
Definition: GrayCore.h:47
#define GRAYCALL
declare calling convention for static functions so everyone knows the arg passing scheme....
Definition: GrayCore.h:36
#define IS_TYPE_OF(t, p)
Definition: PtrCast.h:23
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
struct stat cFileStatusSys
Definition: cFileStatus.h:23
#define UNITTEST2_PREDEF(x)
Definition: cUnitTestDecl.h:19
#define UNITTEST_FRIEND(n)
Define this in the class body to be unit tested. Allow the unit test to access private/protected stuf...
Definition: cUnitTestDecl.h:17
Definition: cFile.h:84
cOSHandle m_hFile
OSHandle for the open file.
Definition: cFile.h:90
bool isFileOpen() const noexcept
Definition: cFile.h:95
virtual void Close()
Definition: cFile.h:120
virtual STREAM_POS_t GetLength() const
Definition: cFile.cpp:179
cStringF m_strFileName
store a copy of the full file path. MFC defined name.
Definition: cFile.h:92
virtual ~CFile()
Definition: cFile.h:103
virtual STREAM_SEEKRET_t Seek(STREAM_OFFSET_t lOffset=0, SEEK_ORIGIN_TYPE eSeekOrigin=SEEK_Set)
Definition: cFile.cpp:140
HRESULT Read(void *pData, size_t nDataSize)
Definition: cFile.h:126
virtual STREAM_POS_t GetPosition() const
Definition: cFile.cpp:154
Definition: cObject.h:67
virtual bool isValidCheck() const noexcept
< memory allocation and structure definitions are valid.
Definition: cObject.h:77
Definition: cException.h:130
Definition: cFileStatus.h:58
Definition: cFile.h:137
OF_FLAGS_t get_Mode() const noexcept
Definition: cFile.h:235
cFile()
Definition: cFile.h:153
static ITERATE_t sm_iFilesOpen
global count of all open files for this process.
Definition: cFile.h:146
OF_FLAGS_t get_ModeFlags() const noexcept
Definition: cFile.h:240
cStringF get_FilePath() const
Definition: cFile.h:222
cFile(cStringF sFilePath, OF_FLAGS_t nOpenFlags)
Definition: cFile.h:157
virtual STREAM_POS_t GetPosition() const override
Definition: cFile.h:185
virtual STREAM_SEEKRET_t Seek(STREAM_OFFSET_t lOffset=0, SEEK_ORIGIN_TYPE eSeekOrigin=SEEK_Set) override
Definition: cFile.h:177
int Read(void *pData, size_t nDataSize)
Definition: cFile.h:210
virtual STREAM_POS_t GetLength() const override
Definition: cFile.h:191
bool isModeWrite() const noexcept
Definition: cFile.h:245
virtual ~cFile()
Definition: cFile.h:161
bool isModeRead() const noexcept
Definition: cFile.h:251
virtual bool isFileOpen() const
Definition: cFile.h:259
void Write(const void *pData, size_t nDataSize)
Definition: cFile.h:215
virtual bool isValidCheck() const noexcept
< memory allocation and structure definitions are valid.
Definition: cFile.h:166
OF_FLAGS_t m_nOpenFlags
MMSYSTEM uses high bits of 32 bit flags. OF_FLAGS_TYPE_ OF_READ etc.
Definition: cFile.h:147
Definition: cHeap.h:156
Definition: cOSHandle.h:59
HRESULT ReadX(void *pData, size_t nDataSize) const
Definition: cOSHandle.h:200
bool isValidHandle() const noexcept
Definition: cOSHandle.h:125
static bool CloseHandle(HANDLE h) noexcept
Definition: cOSHandle.h:130
Definition: cStream.h:456
Definition: cTimeFile.h:31
< similar to the MFC CTime and cTimeSpan, not as accurate or large ranged as COleDateTime
Definition: cTimeInt.h:101
< The main namespace for all Core functions.
Definition: GrayCore.cpp:14
LONG_PTR STREAM_OFFSET_t
Might be 64 or 32 bit. TODO SET USE_FILE_POS64.
Definition: cOSHandle.h:52
UINT32 OF_FLAGS_t
Mask of file open flags OF_FLAGS_TYPE_.
Definition: cFile.h:77
LONG_PTR STREAM_SEEKRET_t
return from Seek()
Definition: cOSHandle.h:53
cStringT< FILECHAR_t > cStringF
A file name. checks USE_UNICODE_FN. related to cFilePath.
Definition: cFilePath.h:17
INT32 TIMESYSD_t
Time delta. signed milli-Seconds Span. cTimeSys::k_DMAX, cTimeSys::k_INF = MAILSLOT_WAIT_FOREVER.
Definition: cTimeSys.h:28
cExceptionHResult CFileException
Definition: cFile.h:82
int ITERATE_t
like size_t but signed
Definition: Index.h:28
char FILECHAR_t
a UTF8 char in a file name. like TCHAR
Definition: FileName.h:22
OF_FLAGS_TYPE_
Definition: cFile.h:32
@ OF_OPEN_MASK
High flags not supported by POSIX open().
Definition: cFile.h:68
@ OF_TEXT
UTF8 or plain ASCII text file. (set by use of char Read/WriteString functions)
Definition: cFile.h:72
@ OF_CACHE_SEQ
O_DIRECT for linux ??
Definition: cFile.h:70
@ OF_BINARY
for using FILE* in non text mode. (Default)
Definition: cFile.h:71
@ OF_NONCRIT
Not a real failure if it doesn't exist.
Definition: cFile.h:73
ULONG_PTR STREAM_POS_t
NOT same as FILE_SIZE_t in 32 bit. Why not ?
Definition: cOSHandle.h:54
SEEK_ORIGIN_TYPE
Definition: cOSHandle.h:34
@ SEEK_Set
SEEK_SET = FILE_BEGIN = STREAM_SEEK_SET = 0 = relative to the start of the file.
Definition: cOSHandle.h:39