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