C++程序  |  145行  |  3.06 KB

//===- FileHandle.h -------------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_FILE_HANDLE_H
#define MCLD_FILE_HANDLE_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif
#include <mcld/Support/Path.h>
#include <mcld/ADT/Flags.h>

#include <errno.h>

namespace mcld {

/** \class FileHandle
 *  \brief FileHandle class provides an interface for reading from and writing
 *  to files.
 *
 *  Operators of FileHandle should neither throw exceptions nor call expressive
 *  diagnostic output.
 */
class FileHandle
{
public:
  enum IOState
  {
    GoodBit    = 0,       // no error
    BadBit     = 1L << 0, // error due to the inappropriate operation
    EOFBit     = 1L << 1, // reached End-Of-File
    FailBit    = 1L << 2, // internal logic fail
    DeputedBit = 1L << 3, // the file descriptor is delegated
    IOStateEnd = 1L << 16
  };

  enum OpenModeEnum
  {
    NotOpen   = 0x00,
    ReadOnly  = 0x01,
    WriteOnly = 0x02,
    ReadWrite = ReadOnly | WriteOnly,
    Append    = 0x04,
    Create    = 0x08,
    Truncate  = 0x10,
    Unknown   = 0xFF
  };

  typedef Flags<OpenModeEnum> OpenMode;

  enum PermissionEnum
  {
    ReadOwner   = 0x0400,
    WriteOwner  = 0x0200,
    ExeOwner    = 0x0100,
    ReadGroup   = 0x0040,
    WriteGroup  = 0x0020,
    ExeGroup    = 0x0010,
    ReadOther   = 0x0004,
    WriteOther  = 0x0002,
    ExeOther    = 0x0001,
    System      = 0xFFFF
  };

  typedef Flags<PermissionEnum> Permission;

public:
  FileHandle();

  ~FileHandle();

  /// open - open the file.
  /// @return if we meet any trouble during opening the file, return false.
  ///         use rdstate() to see what happens.
  bool open(const sys::fs::Path& pPath,
            OpenMode pMode,
            Permission pPerm = System);

  bool delegate(int pFD, OpenMode pMode = Unknown);

  bool close();

  void setState(IOState pState);

  void cleanState(IOState pState = GoodBit);

  // truncate - truncate the file up to the pSize.
  bool truncate(size_t pSize);

  bool read(void* pMemBuffer, size_t pStartOffset, size_t pLength);

  bool write(const void* pMemBuffer, size_t pStartOffset, size_t pLength);

  bool mmap(void*& pMemBuffer, size_t pStartOffset, size_t pLength);

  bool munmap(void* pMemBuffer, size_t pLength);

  // -----  observers  ----- //
  const sys::fs::Path& path() const
  { return m_Path; }

  size_t size() const
  { return m_Size; }

  int handler() const
  { return m_Handler; }

  uint16_t rdstate() const
  { return m_State; }

  bool isOpened() const;

  bool isGood() const;

  bool isBad() const;

  bool isFailed() const;

  bool isOwned() const;

  bool isReadable() const;

  bool isWritable() const;

  bool isReadWrite() const;

  int error() const { return errno; }

private:
  sys::fs::Path m_Path;
  int m_Handler;
  unsigned int m_Size;
  uint16_t m_State;
  OpenMode m_OpenMode;
};

} // namespace of mcld

#endif