1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- FileHandle.h -------------------------------------------------------===// 2affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// 3affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// The MCLinker Project 4affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// 5affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// This file is distributed under the University of Illinois Open Source 6affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// License. See LICENSE.TXT for details. 7affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// 8affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_SUPPORT_FILEHANDLE_H_ 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_SUPPORT_FILEHANDLE_H_ 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/ADT/Flags.h" 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/Path.h" 1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 14affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <errno.h> 15affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld { 17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** \class FileHandle 19affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * \brief FileHandle class provides an interface for reading from and writing 20affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * to files. 21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * 22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * Operators of FileHandle should neither throw exceptions nor call expressive 23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * diagnostic output. 24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang */ 2537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass FileHandle { 2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines enum IOState { 2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines GoodBit = 0, // no error 2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines BadBit = 1L << 0, // error due to the inappropriate operation 3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines EOFBit = 1L << 1, // reached End-Of-File 3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines FailBit = 1L << 2, // internal logic fail 3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines DeputedBit = 1L << 3, // the file descriptor is delegated 33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang IOStateEnd = 1L << 16 34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang }; 35affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines enum OpenModeEnum { 3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines NotOpen = 0x00, 3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines ReadOnly = 0x01, 39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang WriteOnly = 0x02, 40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ReadWrite = ReadOnly | WriteOnly, 4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines Append = 0x04, 4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines Create = 0x08, 4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines Truncate = 0x10, 4437b74a387bb3993387029859c2d9d051c41c724eStephen Hines Unknown = 0xFF 45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang }; 46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang typedef Flags<OpenModeEnum> OpenMode; 48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 4937b74a387bb3993387029859c2d9d051c41c724eStephen Hines enum PermissionEnum { 5037b74a387bb3993387029859c2d9d051c41c724eStephen Hines ReadOwner = 0x0400, 5137b74a387bb3993387029859c2d9d051c41c724eStephen Hines WriteOwner = 0x0200, 5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines ExeOwner = 0x0100, 5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines ReadGroup = 0x0040, 5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines WriteGroup = 0x0020, 5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines ExeGroup = 0x0010, 5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines ReadOther = 0x0004, 5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines WriteOther = 0x0002, 5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines ExeOther = 0x0001, 5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines System = 0xFFFF 60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang }; 61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang typedef Flags<PermissionEnum> Permission; 63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang FileHandle(); 66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ~FileHandle(); 68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// open - open the file. 7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @return if we meet any trouble during opening the file, return false. 7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// use rdstate() to see what happens. 7237b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool open(const sys::fs::Path& pPath, OpenMode pMode, Permission pPerm); 73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool delegate(int pFD, OpenModeEnum pMode = Unknown); 75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool close(); 77affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang void setState(IOState pState); 79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang void cleanState(IOState pState = GoodBit); 81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // truncate - truncate the file up to the pSize. 83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool truncate(size_t pSize); 84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool read(void* pMemBuffer, size_t pStartOffset, size_t pLength); 86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool write(const void* pMemBuffer, size_t pStartOffset, size_t pLength); 88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool mmap(void*& pMemBuffer, size_t pStartOffset, size_t pLength); 90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool munmap(void* pMemBuffer, size_t pLength); 92affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // ----- observers ----- // 9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines const sys::fs::Path& path() const { return m_Path; } 95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 9637b74a387bb3993387029859c2d9d051c41c724eStephen Hines size_t size() const { return m_Size; } 97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 9837b74a387bb3993387029859c2d9d051c41c724eStephen Hines int handler() const { return m_Handler; } 99affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 10037b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint16_t rdstate() const { return m_State; } 101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 102affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool isOpened() const; 103affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 104affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool isGood() const; 105affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 106affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool isBad() const; 107affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 108affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool isFailed() const; 109affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 1106f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines bool isOwned() const; 1116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 112affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool isReadable() const; 113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 114affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool isWritable() const; 115affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 116affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool isReadWrite() const; 117affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 1186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines int error() const { return errno; } 119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 12037b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 121affc150dc44fab1911775a49636d0ce85333b634Zonr Chang sys::fs::Path m_Path; 122affc150dc44fab1911775a49636d0ce85333b634Zonr Chang int m_Handler; 123affc150dc44fab1911775a49636d0ce85333b634Zonr Chang unsigned int m_Size; 124affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint16_t m_State; 125affc150dc44fab1911775a49636d0ce85333b634Zonr Chang OpenMode m_OpenMode; 126affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}; 127affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 12837b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 129affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 13037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // MCLD_SUPPORT_FILEHANDLE_H_ 131