Blame view

mbed/FileHandle.h 3.43 KB
f7c9a8e1   jdenecha   Feat : Firt dump
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
  /* mbed Microcontroller Library

   * Copyright (c) 2006-2013 ARM Limited

   *

   * Licensed under the Apache License, Version 2.0 (the "License");

   * you may not use this file except in compliance with the License.

   * You may obtain a copy of the License at

   *

   *     http://www.apache.org/licenses/LICENSE-2.0

   *

   * Unless required by applicable law or agreed to in writing, software

   * distributed under the License is distributed on an "AS IS" BASIS,

   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

   * See the License for the specific language governing permissions and

   * limitations under the License.

   */

  #ifndef MBED_FILEHANDLE_H

  #define MBED_FILEHANDLE_H

  

  typedef int FILEHANDLE;

  

  #include <stdio.h>

  

  #if defined(__ARMCC_VERSION) || defined(__ICCARM__)

  typedef int ssize_t;

  typedef long off_t;

  

  #else

  #   include <sys/types.h>

  #endif

  

  namespace mbed {

  

  /** An OO equivalent of the internal FILEHANDLE variable

   *  and associated _sys_* functions.

   *

   * FileHandle is an abstract class, needing at least sys_write and

   *  sys_read to be implmented for a simple interactive device.

   *

   * No one ever directly tals to/instanciates a FileHandle - it gets

   *  created by FileSystem, and wrapped up by stdio.

   */

  class FileHandle {

  

  public:

      /** Write the contents of a buffer to the file

       *

       *  @param buffer the buffer to write from

       *  @param length the number of characters to write

       *

       *  @returns

       *  The number of characters written (possibly 0) on success, -1 on error.

       */

      virtual ssize_t write(const void* buffer, size_t length) = 0;

  

      /** Close the file

       *

       *  @returns

       *  Zero on success, -1 on error.

       */

      virtual int close() = 0;

  

      /** Function read

       *  Reads the contents of the file into a buffer

       *

       *  @param buffer the buffer to read in to

       *  @param length the number of characters to read

       *

       *  @returns

       *  The number of characters read (zero at end of file) on success, -1 on error.

       */

      virtual ssize_t read(void* buffer, size_t length) = 0;

  

      /** Check if the handle is for a interactive terminal device.

       * If so, line buffered behaviour is used by default

       *

       *  @returns

       *    1 if it is a terminal,

       *    0 otherwise

       */

      virtual int isatty() = 0;

  

      /** Move the file position to a given offset from a given location.

       *

       *  @param offset The offset from whence to move to

       *  @param whence SEEK_SET for the start of the file, SEEK_CUR for the

       *   current file position, or SEEK_END for the end of the file.

       *

       *  @returns

       *    new file position on success,

       *    -1 on failure or unsupported

       */

      virtual off_t lseek(off_t offset, int whence) = 0;

  

      /** Flush any buffers associated with the FileHandle, ensuring it

       *  is up to date on disk

       *

       *  @returns

       *    0 on success or un-needed,

       *   -1 on error

       */

      virtual int fsync() = 0;

  

      virtual off_t flen() {

          /* remember our current position */

          off_t pos = lseek(0, SEEK_CUR);

          if(pos == -1) return -1;

          /* seek to the end to get the file length */

          off_t res = lseek(0, SEEK_END);

          /* return to our old position */

          lseek(pos, SEEK_SET);

          return res;

      }

  

      virtual ~FileHandle();

  };

  

  } // namespace mbed

  

  #endif