F´ Flight Software - C/C++ Documentation
A framework for building embedded system applications to NASA flight quality standards.
File.hpp
Go to the documentation of this file.
1 // ======================================================================
2 // \title Os/File.hpp
3 // \brief common function definitions for Os::File
4 // ======================================================================
5 #ifndef Os_File_hpp_
6 #define Os_File_hpp_
7 
9 #include <Os/Os.hpp>
10 
11 namespace Os {
14 struct FileHandle {};
15 
16 // This class encapsulates a very simple file interface that has the most often-used features
18  public:
19  enum Mode {
27  };
28 
29  enum Status {
43  };
44 
49  };
50 
51  enum SeekType {
55  };
56 
57  enum WaitType {
59  WAIT,
61  };
62 
63  virtual ~FileInterface() = default;
64 
81  virtual Status open(const char* path, Mode mode, OverwriteType overwrite) = 0;
82 
88  virtual void close() = 0;
89 
96  virtual Status size(FwSizeType& size_result) = 0;
97 
104  virtual Status position(FwSizeType& position_result) = 0;
105 
118  virtual Status preallocate(FwSizeType offset, FwSizeType length) = 0;
119 
129  virtual Status seek(FwSignedSizeType offset, SeekType seekType) = 0;
130 
138  virtual Status flush() = 0;
139 
158  virtual Status read(U8* buffer, FwSizeType& size, WaitType wait) = 0;
159 
178  virtual Status write(const U8* buffer, FwSizeType& size, WaitType wait) = 0;
179 
187  virtual FileHandle* getHandle() = 0;
188 
211  static FileInterface* getDelegate(FileHandleStorage& aligned_placement_new_memory,
212  const FileInterface* to_copy = nullptr);
213 };
214 
215 class File final : public FileInterface {
216  public:
219  File();
223  ~File() final;
224 
226  File(const File& other);
227 
229  File& operator=(const File& other);
230 
234  bool isOpen() const;
235 
236  // ------------------------------------
237  // Functions supplying default values
238  // ------------------------------------
239 
253  Os::FileInterface::Status open(const char* path, Mode mode);
254 
271  Status read(U8* buffer, FwSizeType& size);
272 
288  Status write(const U8* buffer, FwSizeType& size);
289 
290  // ------------------------------------
291  // Functions overrides
292  // ------------------------------------
293 
310  Os::FileInterface::Status open(const char* path, Mode mode, OverwriteType overwrite) override;
311 
317  void close() override;
318 
325  Status size(FwSizeType& size_result) override;
326 
333  Status position(FwSizeType& position_result) override;
334 
347  Status preallocate(FwSizeType offset, FwSizeType length) override;
348 
358  Status seek(FwSignedSizeType offset, SeekType seekType) override;
359 
371  Status seek_absolute(FwSizeType offset_unsigned);
372 
380  Status flush() override;
381 
398 
400  Status read(U8* buffer, FwSizeType& size, WaitType wait) override;
401 
418  Status readline(U8* buffer, FwSizeType& size, WaitType wait);
419 
438  Status write(const U8* buffer, FwSizeType& size, WaitType wait) override;
439 
447  FileHandle* getHandle() override;
448 
474  Status calculateCrc(U32& crc);
475 
492 
504  Status finalizeCrc(U32& crc);
505 
506  private:
507  PRIVATE : static const U32 INITIAL_CRC = 0xFFFFFFFF;
508  Mode m_mode = Mode::OPEN_NO_MODE;
509  const CHAR* m_path = nullptr;
510 
511  U32 m_crc = File::INITIAL_CRC;
512  U8 m_crc_buffer[FW_FILE_CHUNK_SIZE];
513 
514  // This section is used to store the implementation-defined file handle. To Os::File and fprime, this type is
515  // opaque and thus normal allocation cannot be done. Instead, we allow the implementor to store then handle in
516  // the byte-array here and set `handle` to that address for storage.
517  //
518  alignas(FW_HANDLE_ALIGNMENT) FileHandleStorage m_handle_storage;
519  FileInterface& m_delegate;
520 };
521 } // namespace Os
522 #endif
virtual Status open(const char *path, Mode mode, OverwriteType overwrite)=0
open file with supplied path and mode
Status incrementalCrc(FwSizeType &size)
calculate the CRC32 of the next section of data
Definition: File.cpp:230
base implementation of FileHandle
Definition: File.hpp:14
Status calculateCrc(U32 &crc)
calculate the CRC32 of the entire file
Definition: File.cpp:212
PlatformSizeType FwSizeType
File mode not yet selected.
Definition: File.hpp:20
No more available resources.
Definition: File.hpp:40
Status preallocate(FwSizeType offset, FwSizeType length) override
pre-allocate file storage
Definition: File.cpp:104
Status position(FwSizeType &position_result) override
get file pointer position of the currently open file
Definition: File.cpp:94
Open file for writing; writes don&#39;t return until data is on disk.
Definition: File.hpp:24
Status seek_absolute(FwSizeType offset_unsigned)
seek the file pointer to the given offset absolutely with the full range
Definition: File.cpp:129
virtual void close()=0
close the file, if not opened then do nothing
Status size(FwSizeType &size_result) override
get size of currently open file
Definition: File.cpp:85
No permission to read/write file.
Definition: File.hpp:33
Overwrite file when it exists and creation was requested.
Definition: File.hpp:47
Open file for writing.
Definition: File.hpp:23
PlatformSignedSizeType FwSignedSizeType
Maximum value of status.
Definition: File.hpp:42
Os::FileInterface::Status open(const char *path, Mode mode)
open file with supplied path and mode
char CHAR
Definition: BasicTypes.h:62
virtual FileHandle * getHandle()=0
returns the raw file handle
#define FW_HANDLE_ALIGNMENT
Alignment of handle storage.
Definition: FpConfig.h:346
virtual ~FileInterface()=default
#define FW_FILE_CHUNK_SIZE
Chunk size for working with files in the OSAL layer.
Definition: FpConfig.h:351
virtual Status size(FwSizeType &size_result)=0
get size of currently open file
virtual Status flush()=0
flush file contents to storage
virtual Status seek(FwSignedSizeType offset, SeekType seekType)=0
seek the file pointer to the given offset
Open file for appending.
Definition: File.hpp:25
No space left.
Definition: File.hpp:32
Do not wait for read/write operation to finish.
Definition: File.hpp:58
Do wait for read/write operation to finish.
Definition: File.hpp:59
Invalid argument passed in.
Definition: File.hpp:39
Maximum value of mode.
Definition: File.hpp:26
Absolute seek from beginning of file.
Definition: File.hpp:53
Status seek(FwSignedSizeType offset, SeekType seekType) override
seek the file pointer to the given offset
Definition: File.cpp:116
File doesn&#39;t exist (for read)
Definition: File.hpp:31
FileHandle * getHandle() override
returns the raw file handle
Definition: File.cpp:207
Mode for file access is invalid for current operation.
Definition: File.hpp:38
Kernel or file system does not support operation.
Definition: File.hpp:37
void close() override
close the file, if not opened then do nothing
Definition: File.cpp:70
Status write(const U8 *buffer, FwSizeType &size)
write data to this file from the supplied buffer bounded by size
Definition: File.cpp:187
Relative seek from current file offset.
Definition: File.hpp:52
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.h:56
Status read(U8 *buffer, FwSizeType &size)
read data from this file into supplied buffer bounded by size
Definition: File.cpp:168
Status flush() override
flush file contents to storage
Definition: File.cpp:156
U8 FileHandleStorage[FW_FILE_HANDLE_MAX_SIZE]
Definition: Os.hpp:13
Do NOT overwrite existing files.
Definition: File.hpp:46
virtual Status write(const U8 *buffer, FwSizeType &size, WaitType wait)=0
read data from this file into supplied buffer bounded by size
Status readline(U8 *buffer, FwSizeType &size, WaitType wait)
read a line from the file using \n as the delimiter
Definition: File.cpp:259
file hasn&#39;t been opened yet
Definition: File.hpp:35
Operation was successful.
Definition: File.hpp:30
A catch-all for other errors. Have to look in implementation-specific code.
Definition: File.hpp:41
Status finalizeCrc(U32 &crc)
finalize and retrieve the CRC value
Definition: File.cpp:252
Open file for reading.
Definition: File.hpp:21
~File() final
destructor
Definition: File.cpp:17
File()
constructor
Definition: File.cpp:13
static FileInterface * getDelegate(FileHandleStorage &aligned_placement_new_memory, const FileInterface *to_copy=nullptr)
provide a pointer to a file delegate object
Definition: DefaultFile.cpp:14
virtual Status preallocate(FwSizeType offset, FwSizeType length)=0
pre-allocate file storage
Invalid size parameter.
Definition: File.hpp:34
file already exist (for CREATE with O_EXCL enabled)
Definition: File.hpp:36
File & operator=(const File &other)
assignment operator that copies the internal representation
Definition: File.cpp:35
virtual Status position(FwSizeType &position_result)=0
get file pointer position of the currently open file
bool isOpen() const
determine if the file is open
Definition: File.cpp:79
virtual Status read(U8 *buffer, FwSizeType &size, WaitType wait)=0
read data from this file into supplied buffer bounded by size
Open file for writing and truncates file if it exists, ie same flags as creat()
Definition: File.hpp:22