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//===----------------------------------------------------------------------===// 987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifndef MCLD_SUPPORT_FILEHANDLE_H 1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_SUPPORT_FILEHANDLE_H 11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/Path.h> 12affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/ADT/Flags.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 */ 25affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass FileHandle 26affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 27affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic: 28affc150dc44fab1911775a49636d0ce85333b634Zonr Chang enum IOState 29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { 30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang GoodBit = 0, // no error 31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang BadBit = 1L << 0, // error due to the inappropriate operation 32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang EOFBit = 1L << 1, // reached End-Of-File 33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang FailBit = 1L << 2, // internal logic fail 346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines DeputedBit = 1L << 3, // the file descriptor is delegated 35affc150dc44fab1911775a49636d0ce85333b634Zonr Chang IOStateEnd = 1L << 16 36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang }; 37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 38affc150dc44fab1911775a49636d0ce85333b634Zonr Chang enum OpenModeEnum 39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { 40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang NotOpen = 0x00, 41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ReadOnly = 0x01, 42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang WriteOnly = 0x02, 43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ReadWrite = ReadOnly | WriteOnly, 44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang Append = 0x04, 45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang Create = 0x08, 46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang Truncate = 0x10, 47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang Unknown = 0xFF 48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang }; 49affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 50affc150dc44fab1911775a49636d0ce85333b634Zonr Chang typedef Flags<OpenModeEnum> OpenMode; 51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 52affc150dc44fab1911775a49636d0ce85333b634Zonr Chang enum PermissionEnum 53affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { 54f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ReadOwner = 0x0400, 55f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines WriteOwner = 0x0200, 56f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ExeOwner = 0x0100, 57f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ReadGroup = 0x0040, 58f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines WriteGroup = 0x0020, 59f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ExeGroup = 0x0010, 60f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ReadOther = 0x0004, 61f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines WriteOther = 0x0002, 62f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ExeOther = 0x0001, 63f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines System = 0xFFFF 64affc150dc44fab1911775a49636d0ce85333b634Zonr Chang }; 65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang typedef Flags<PermissionEnum> Permission; 67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 68affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic: 69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang FileHandle(); 70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ~FileHandle(); 72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// open - open the file. 7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @return if we meet any trouble during opening the file, return false. 7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// use rdstate() to see what happens. 76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool open(const sys::fs::Path& pPath, 77affc150dc44fab1911775a49636d0ce85333b634Zonr Chang OpenMode pMode, 7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Permission pPerm = System); 79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool delegate(int pFD, OpenMode pMode = Unknown); 81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool close(); 83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang void setState(IOState pState); 85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang void cleanState(IOState pState = GoodBit); 87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // truncate - truncate the file up to the pSize. 89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool truncate(size_t pSize); 90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool read(void* pMemBuffer, size_t pStartOffset, size_t pLength); 92affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool write(const void* pMemBuffer, size_t pStartOffset, size_t pLength); 94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool mmap(void*& pMemBuffer, size_t pStartOffset, size_t pLength); 96affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool munmap(void* pMemBuffer, size_t pLength); 98affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 99affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // ----- observers ----- // 100affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const sys::fs::Path& path() const 101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { return m_Path; } 102affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 103affc150dc44fab1911775a49636d0ce85333b634Zonr Chang size_t size() const 104affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { return m_Size; } 105affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 106affc150dc44fab1911775a49636d0ce85333b634Zonr Chang int handler() const 107affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { return m_Handler; } 108affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 109affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint16_t rdstate() const 110affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { return m_State; } 111affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 112affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool isOpened() const; 113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 114affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool isGood() const; 115affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 116affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool isBad() const; 117affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 118affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool isFailed() const; 119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 1206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines bool isOwned() const; 1216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 122affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool isReadable() const; 123affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 124affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool isWritable() const; 125affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 126affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool isReadWrite() const; 127affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 1286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines int error() const { return errno; } 129affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 130affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate: 131affc150dc44fab1911775a49636d0ce85333b634Zonr Chang sys::fs::Path m_Path; 132affc150dc44fab1911775a49636d0ce85333b634Zonr Chang int m_Handler; 133affc150dc44fab1911775a49636d0ce85333b634Zonr Chang unsigned int m_Size; 134affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint16_t m_State; 135affc150dc44fab1911775a49636d0ce85333b634Zonr Chang OpenMode m_OpenMode; 136affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}; 137affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 138affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} // namespace of mcld 139affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 140affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif 141affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 142