home *** CD-ROM | disk | FTP | other *** search
/ Xentax forum attachments archive / xentax.7z / 7662 / gttool_src_bin.7z / gttool / src / file.h < prev    next >
Encoding:
C/C++ Source or Header  |  2014-08-01  |  2.1 KB  |  74 lines

  1. #pragma once
  2.  
  3. #include "common.h"
  4. #include "stream.h"
  5.  
  6. struct OpenMode
  7. {
  8.     typedef uint32_t Flags;
  9.  
  10.     static const Flags kREAD          = (1u << 0);
  11.     static const Flags kWRITE         = (1u << 1);
  12.     static const Flags kAPPEND        = (1u << 2);
  13.     static const Flags kRECREATE      = (1u << 3);
  14.     static const Flags kSHARE         = (1u << 4);
  15.     static const Flags kRANDOM_ACCESS = (1u << 5);
  16.     static const Flags kWRITE_THROUGH = (1u << 6);
  17.     static const Flags kASYNC         = (1u << 7);
  18. };
  19.  
  20. class File
  21.     : public IStream
  22. {
  23. public:
  24.     File();
  25.     File(const char* const file_path, const OpenMode::Flags mode);
  26.     ~File();
  27.  
  28.     bool open(const char* const file_path, const OpenMode::Flags mode);
  29.     void close();
  30.  
  31.     bool read(void* const data, const uint32_t size, uint32_t* const num_read = nullptr);
  32.     bool write(const void* const data, const uint32_t size, uint32_t* const num_written = nullptr);
  33.  
  34.     inline bool read_at(void* const data, const uint64_t offset, const uint32_t size, uint32_t* const num_read = nullptr)
  35.     {
  36.         uint64_t pos = tell();
  37.         if (!seek(offset, SeekMode::kBEGIN))
  38.             return false;
  39.         const bool result = read(data, size, num_read);
  40.         if (!seek(pos, SeekMode::kBEGIN))
  41.             return false;
  42.         return result;
  43.     }
  44.  
  45.     inline bool write_at(const void* const data, const uint64_t offset, const uint32_t size, uint32_t* const num_written = nullptr)
  46.     {
  47.         uint64_t pos = tell();
  48.         if (!seek(offset, SeekMode::kBEGIN))
  49.             return false;
  50.         const bool result = write(data, size, num_written);
  51.         if (!seek(pos, SeekMode::kBEGIN))
  52.             return false;
  53.         return result;
  54.     }
  55.  
  56.     bool seek(const uint64_t offset, const SeekMode::Enum mode = SeekMode::kBEGIN, uint64_t* const position = nullptr);
  57.  
  58.     uint64_t file_size() const;
  59.  
  60.     bool is_valid() const;
  61.  
  62.     inline operator bool() const
  63.     {
  64.         return is_valid();
  65.     }
  66.  
  67. private:
  68.     class Impl;
  69.     std::unique_ptr<Impl> impl_;
  70. };
  71.  
  72. bool read_file(const char* const file_path, char** const data, uint32_t* const size, const uint64_t offset = 0);
  73. bool write_file(const char* const file_path, const char* const data, const uint32_t size, const uint64_t offset = 0);
  74.