//===- 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