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