blob: bbd6b57b9ec288d700a319b2fc66b9ed7a571897 [file] [log] [blame]
Torne (Richard Coles)58218062012-11-14 11:43:16 +00001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef PPAPI_CPP_FILE_IO_H_
6#define PPAPI_CPP_FILE_IO_H_
7
8#include "ppapi/c/pp_time.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +00009#include "ppapi/cpp/completion_callback.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000010#include "ppapi/cpp/resource.h"
11
12/// @file
13/// This file defines the API to create a file i/o object.
14
15struct PP_FileInfo;
16
17namespace pp {
18
Torne (Richard Coles)58218062012-11-14 11:43:16 +000019class FileRef;
20class InstanceHandle;
21
22/// The <code>FileIO</code> class represents a regular file.
23class FileIO : public Resource {
24 public:
25 /// Default constructor for creating an is_null() <code>FileIO</code>
26 /// object.
27 FileIO();
28
29 /// A constructor used to create a <code>FileIO</code> and associate it with
30 /// the provided <code>Instance</code>.
31 ///
32 /// @param[in] instance The instance with which this resource will be
33 /// associated.
34 explicit FileIO(const InstanceHandle& instance);
35
36 /// The copy constructor for <code>FileIO</code>.
37 ///
Torne (Richard Coles)b2df76e2013-05-13 16:52:09 +010038 /// @param[in] other A reference to a <code>FileIO</code>.
Torne (Richard Coles)58218062012-11-14 11:43:16 +000039 FileIO(const FileIO& other);
40
41 /// Open() opens the specified regular file for I/O according to the given
42 /// open flags, which is a bit-mask of the PP_FileOpenFlags values. Upon
43 /// success, the corresponding file is classified as "in use" by this FileIO
44 /// object until such time as the FileIO object is closed or destroyed.
45 ///
46 /// @param[in] file_ref A <code>PP_Resource</code> corresponding to a file
47 /// reference.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000048 ///
Torne (Richard Coles)58218062012-11-14 11:43:16 +000049 /// @param[in] open_flags A bit-mask of the <code>PP_FileOpenFlags</code>
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000050 /// values. Valid values are:
51 /// - PP_FILEOPENFLAG_READ
52 /// - PP_FILEOPENFLAG_WRITE
53 /// - PP_FILEOPENFLAG_CREATE
54 /// - PP_FILEOPENFLAG_TRUNCATE
55 /// - PP_FILEOPENFLAG_EXCLUSIVE
56 /// See <code>PP_FileOpenFlags</code> in <code>ppb_file_io.h</code> for more
57 /// details on these flags.
58 ///
Torne (Richard Coles)58218062012-11-14 11:43:16 +000059 /// @param[in] cc A <code>CompletionCallback</code> to be called upon
60 /// completion of Open().
61 ///
62 /// @return An int32_t containing an error code from
63 /// <code>pp_errors.h</code>.
64 int32_t Open(const FileRef& file_ref,
65 int32_t open_flags,
66 const CompletionCallback& cc);
67
68 /// Query() queries info about the file opened by this FileIO object. This
69 /// function will fail if the FileIO object has not been opened.
70 ///
71 /// @param[in] result_buf The <code>PP_FileInfo</code> structure representing
72 /// all information about the file.
73 /// @param[in] cc A <code>CompletionCallback</code> to be called upon
Torne (Richard Coles)1e9bf3e2013-10-31 11:16:26 +000074 /// completion of Query(). <code>result_buf</code> must remain valid until
75 /// after the callback runs. If you pass a blocking callback,
76 /// <code>result_buf</code> must remain valid until after Query() returns.
Torne (Richard Coles)58218062012-11-14 11:43:16 +000077 ///
78 /// @return An int32_t containing an error code from
79 /// <code>pp_errors.h</code>.
80 int32_t Query(PP_FileInfo* result_buf,
81 const CompletionCallback& cc);
82
83 /// Touch() Updates time stamps for the file opened by this FileIO object.
84 /// This function will fail if the FileIO object has not been opened.
85 ///
86 /// @param[in] last_access_time The last time the FileIO was accessed.
87 /// @param[in] last_modified_time The last time the FileIO was modified.
88 /// @param[in] cc A <code>CompletionCallback</code> to be called upon
89 /// completion of Touch().
90 ///
91 /// @return An int32_t containing an error code from
92 /// <code>pp_errors.h</code>.
93 int32_t Touch(PP_Time last_access_time,
94 PP_Time last_modified_time,
95 const CompletionCallback& cc);
96
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000097 /// Reads from an offset in the file.
98 ///
99 /// The size of the buffer must be large enough to hold the specified number
100 /// of bytes to read. This function might perform a partial read, meaning
101 /// that all the requested bytes might not be returned, even if the end of the
102 /// file has not been reached.
103 ///
104 /// This function reads into a buffer that the caller supplies. This buffer
105 /// must remain valid as long as the FileIO resource is alive. If you use
106 /// a completion callback factory and it goes out of scope, it will not issue
107 /// the callback on your class, BUT the callback factory can NOT cancel
108 /// the request from the browser's perspective. This means that the browser
109 /// will still try to write to your buffer even if the callback factory is
110 /// destroyed!
111 ///
112 /// So you must ensure that your buffer outlives the FileIO resource. If you
113 /// have one class and use the FileIO resource exclusively from that class
114 /// and never make any copies, this will be fine: the resource will be
115 /// destroyed when your class is. But keep in mind that copying a pp::FileIO
116 /// object just creates a second reference to the original resource. For
117 /// example, if you have a function like this:
118 /// pp::FileIO MyClass::GetFileIO();
119 /// where a copy of your FileIO resource could outlive your class, the
120 /// callback will still be pending when your class goes out of scope, creating
121 /// the possibility of writing into invalid memory. So it's recommended to
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100122 /// keep your FileIO resource and any output buffers tightly controlled in
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000123 /// the same scope.
124 ///
125 /// <strong>Caveat:</strong> This Read() is potentially unsafe if you're using
126 /// a CompletionCallbackFactory to scope callbacks to the lifetime of your
127 /// class. When your class goes out of scope, the callback factory will not
128 /// actually cancel the callback, but will rather just skip issuing the
129 /// callback on your class. This means that if the FileIO object outlives
130 /// your class (if you made a copy saved somewhere else, for example), then
131 /// the browser will still try to write into your buffer when the
132 /// asynchronous read completes, potentially causing a crash.
133 ///
134 /// See the other version of Read() which avoids this problem by writing into
135 /// CompletionCallbackWithOutput, where the output buffer is automatically
136 /// managed by the callback.
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000137 ///
138 /// @param[in] offset The offset into the file.
139 /// @param[in] buffer The buffer to hold the specified number of bytes read.
140 /// @param[in] bytes_to_read The number of bytes to read from
141 /// <code>offset</code>.
142 /// @param[in] cc A <code>CompletionCallback</code> to be called upon
Torne (Richard Coles)1e9bf3e2013-10-31 11:16:26 +0000143 /// completion of Read(). <code>buffer</code> must remain valid until after
144 /// the callback runs. If you pass a blocking callback, <code>buffer</code>
145 /// must remain valid until after Read() returns.
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000146 ///
147 /// @return An The number of bytes read an error code from
148 /// <code>pp_errors.h</code>. If the return value is 0, then end-of-file was
149 /// reached. It is valid to call Read() multiple times with a completion
150 /// callback to queue up parallel reads from the file at different offsets.
151 int32_t Read(int64_t offset,
152 char* buffer,
153 int32_t bytes_to_read,
154 const CompletionCallback& cc);
155
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000156 /// Read() reads from an offset in the file. A PP_ArrayOutput must be
157 /// provided so that output will be stored in its allocated buffer. This
158 /// function might perform a partial read.
159 ///
160 /// @param[in] file_io A <code>PP_Resource</code> corresponding to a file
161 /// FileIO.
162 /// @param[in] offset The offset into the file.
163 /// @param[in] max_read_length The maximum number of bytes to read from
164 /// <code>offset</code>.
165 /// @param[in] output A <code>PP_ArrayOutput</code> to hold the output data.
166 /// @param[in] callback A <code>PP_CompletionCallback</code> to be called upon
167 /// completion of Read().
168 ///
169 /// @return The number of bytes read or an error code from
170 /// <code>pp_errors.h</code>. If the return value is 0, then end-of-file was
171 /// reached. It is valid to call Read() multiple times with a completion
172 /// callback to queue up parallel reads from the file, but pending reads
173 /// cannot be interleaved with other operations.
174 int32_t Read(int32_t offset,
175 int32_t max_read_length,
176 const CompletionCallbackWithOutput< std::vector<char> >& cc);
177
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000178 /// Write() writes to an offset in the file. This function might perform a
179 /// partial write. The FileIO object must have been opened with write access.
180 ///
181 /// @param[in] offset The offset into the file.
182 /// @param[in] buffer The buffer to hold the specified number of bytes read.
183 /// @param[in] bytes_to_write The number of bytes to write to
184 /// <code>offset</code>.
185 /// @param[in] cc A <code>CompletionCallback</code> to be called upon
186 /// completion of Write().
187 ///
188 /// @return An The number of bytes written or an error code from
189 /// <code>pp_errors.h</code>. If the return value is 0, then end-of-file was
190 /// reached. It is valid to call Write() multiple times with a completion
191 /// callback to queue up parallel writes to the file at different offsets.
192 int32_t Write(int64_t offset,
193 const char* buffer,
194 int32_t bytes_to_write,
195 const CompletionCallback& cc);
196
197 /// SetLength() sets the length of the file. If the file size is extended,
198 /// then the extended area of the file is zero-filled. The FileIO object must
199 /// have been opened with write access.
200 ///
201 /// @param[in] length The length of the file to be set.
202 /// @param[in] cc A <code>CompletionCallback</code> to be called upon
203 /// completion of SetLength().
204 ///
205 /// @return An int32_t containing an error code from
206 /// <code>pp_errors.h</code>.
207 int32_t SetLength(int64_t length,
208 const CompletionCallback& cc);
209
210 /// Flush() flushes changes to disk. This call can be very expensive!
211 ///
212 /// @param[in] cc A <code>CompletionCallback</code> to be called upon
213 /// completion of Flush().
214 ///
215 /// @return An int32_t containing an error code from
216 /// <code>pp_errors.h</code>.
217 int32_t Flush(const CompletionCallback& cc);
218
219 /// Close() cancels any IO that may be pending, and closes the FileIO object.
220 /// Any pending callbacks will still run, reporting
221 /// <code>PP_ERROR_ABORTED</code> if pending IO was interrupted. It is not
222 /// valid to call Open() again after a call to this method.
223 ///
224 /// <strong>Note:</strong> If the FileIO object is destroyed, and it is still
225 /// open, then it will be implicitly closed, so you are not required to call
226 /// Close().
227 void Close();
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000228
229 private:
230 struct CallbackData1_0 {
231 PP_ArrayOutput output;
232 char* temp_buffer;
233 PP_CompletionCallback original_callback;
234 };
235
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100236 // Provide backwards-compatibility for older Read versions. Converts the
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000237 // old-style "char*" output buffer of 1.0 to the new "PP_ArrayOutput"
238 // interface in 1.1.
239 //
240 // This takes a heap-allocated CallbackData1_0 struct passed as the user data
241 // and deletes it when the call completes.
242 static void CallbackConverter(void* user_data, int32_t result);
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000243};
244
245} // namespace pp
246
247#endif // PPAPI_CPP_FILE_IO_H_