Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(177)

Side by Side Diff: net/base/file_stream_context.h

Issue 12320003: Fix net::FileStream to handle POSIX errors correctly. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | net/base/file_stream_context.cc » ('j') | net/base/file_stream_context.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // This file defines FileStream::Context class. 5 // This file defines FileStream::Context class.
6 // The general design of FileStream is as follows: file_stream.h defines 6 // The general design of FileStream is as follows: file_stream.h defines
7 // FileStream class which basically is just an "wrapper" not containing any 7 // FileStream class which basically is just an "wrapper" not containing any
8 // specific implementation details. It re-routes all its method calls to 8 // specific implementation details. It re-routes all its method calls to
9 // the instance of FileStream::Context (FileStream holds a scoped_ptr to 9 // the instance of FileStream::Context (FileStream holds a scoped_ptr to
10 // FileStream::Context instance). Context was extracted into a different class 10 // FileStream::Context instance). Context was extracted into a different class
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 void SeekAsync(Whence whence, 109 void SeekAsync(Whence whence,
110 int64 offset, 110 int64 offset,
111 const Int64CompletionCallback& callback); 111 const Int64CompletionCallback& callback);
112 int64 SeekSync(Whence whence, int64 offset); 112 int64 SeekSync(Whence whence, int64 offset);
113 113
114 void FlushAsync(const CompletionCallback& callback); 114 void FlushAsync(const CompletionCallback& callback);
115 int FlushSync(); 115 int FlushSync();
116 116
117 private: 117 private:
118 //////////////////////////////////////////////////////////////////////////// 118 ////////////////////////////////////////////////////////////////////////////
119 // Error code that is platform-dependent but is used in the platform-
120 // independent code implemented in file_stream_context.cc.
121 ////////////////////////////////////////////////////////////////////////////
122 enum {
123 #if defined(OS_WIN)
124 ERROR_BAD_FILE = ERROR_INVALID_HANDLE
125 #elif defined(OS_POSIX)
126 ERROR_BAD_FILE = EBADF
127 #endif
128 };
129
130 ////////////////////////////////////////////////////////////////////////////
131 // Platform-independent methods implemented in file_stream_context.cc. 119 // Platform-independent methods implemented in file_stream_context.cc.
132 //////////////////////////////////////////////////////////////////////////// 120 ////////////////////////////////////////////////////////////////////////////
133 121
134 struct OpenResult { 122 struct IOResult {
135 base::PlatformFile file; 123 IOResult();
136 int error_code; 124 IOResult(int64 result, int os_error);
125 static IOResult FromOSError(int64 os_error);
126
127 int64 result;
128 int os_error; // Set only when result < 0.
137 }; 129 };
138 130
139 // Map system error into network error code and log it with |bound_net_log_|. 131 struct OpenResult {
140 int RecordAndMapError(int error, FileErrorSource source) const; 132 OpenResult();
133 OpenResult(base::PlatformFile file, IOResult error_code);
134 base::PlatformFile file;
135 IOResult error_code;
136 };
137
138 // Log the error from |result| to |bound_net_log_|.
139 void RecordError(const IOResult& result, FileErrorSource source) const;
141 140
142 void BeginOpenEvent(const base::FilePath& path); 141 void BeginOpenEvent(const base::FilePath& path);
143 142
144 OpenResult OpenFileImpl(const base::FilePath& path, int open_flags); 143 OpenResult OpenFileImpl(const base::FilePath& path, int open_flags);
145 144
146 int ProcessOpenError(int error_code); 145 void ProcessOpenError(const IOResult& result);
147 void OnOpenCompleted(const CompletionCallback& callback, OpenResult result); 146 void OnOpenCompleted(const CompletionCallback& callback, OpenResult result);
148 147
149 void CloseAndDelete(); 148 void CloseAndDelete();
150 void OnCloseCompleted(); 149 void OnCloseCompleted();
151 150
152 Int64CompletionCallback IntToInt64(const CompletionCallback& callback); 151 Int64CompletionCallback IntToInt64(const CompletionCallback& callback);
153 152
154 // Checks for IO error that probably happened in async methods.
155 // If there was error reports it.
156 void CheckForIOError(int64* result, FileErrorSource source);
157
158 // Called when asynchronous Seek() is completed. 153 // Called when asynchronous Seek() is completed.
159 // Reports error if needed and calls callback. 154 // Reports error if needed and calls callback.
160 void ProcessAsyncResult(const Int64CompletionCallback& callback, 155 void ProcessAsyncResult(const Int64CompletionCallback& callback,
161 FileErrorSource source, 156 FileErrorSource source,
162 int64 result); 157 const IOResult& result);
163 158
164 // Called when asynchronous Open() or Seek() 159 // Called when asynchronous Open() or Seek()
165 // is completed. |result| contains the result or a network error code. 160 // is completed. |result| contains the result or a network error code.
166 void OnAsyncCompleted(const Int64CompletionCallback& callback, int64 result); 161 void OnAsyncCompleted(const Int64CompletionCallback& callback, int64 result);
167 162
168 //////////////////////////////////////////////////////////////////////////// 163 ////////////////////////////////////////////////////////////////////////////
169 // Helper stuff which is platform-dependent but is used in the platform- 164 // Helper stuff which is platform-dependent but is used in the platform-
170 // independent code implemented in file_stream_context.cc. These helpers were 165 // independent code implemented in file_stream_context.cc. These helpers were
171 // introduced solely to implement as much of the Context methods as 166 // introduced solely to implement as much of the Context methods as
172 // possible independently from platform. 167 // possible independently from platform.
173 //////////////////////////////////////////////////////////////////////////// 168 ////////////////////////////////////////////////////////////////////////////
174 169
175 #if defined(OS_WIN) 170 #if defined(OS_WIN)
176 int GetLastErrno() { return GetLastError(); } 171 int GetLastErrno() { return GetLastError(); }
177 void OnAsyncFileOpened(); 172 void OnAsyncFileOpened();
178 #elif defined(OS_POSIX) 173 #elif defined(OS_POSIX)
179 int GetLastErrno() { return errno; } 174 int GetLastErrno() { return errno; }
180 void OnAsyncFileOpened() {} 175 void OnAsyncFileOpened() {}
181 void CancelIo(base::PlatformFile) {} 176 void CancelIo(base::PlatformFile) {}
182 #endif 177 #endif
183 178
184 //////////////////////////////////////////////////////////////////////////// 179 ////////////////////////////////////////////////////////////////////////////
185 // Platform-dependent methods implemented in 180 // Platform-dependent methods implemented in
186 // file_stream_context_{win,posix}.cc. 181 // file_stream_context_{win,posix}.cc.
187 //////////////////////////////////////////////////////////////////////////// 182 ////////////////////////////////////////////////////////////////////////////
188 183
189 // Adjusts the position from where the data is read. 184 // Adjusts the position from where the data is read.
190 int64 SeekFileImpl(Whence whence, int64 offset); 185 IOResult SeekFileImpl(Whence whence, int64 offset);
191 186
192 // Flushes all data written to the stream. 187 // Flushes all data written to the stream.
193 int64 FlushFileImpl(); 188 IOResult FlushFileImpl();
194 189
195 #if defined(OS_WIN) 190 #if defined(OS_WIN)
196 void IOCompletionIsPending(const CompletionCallback& callback, IOBuffer* buf); 191 void IOCompletionIsPending(const CompletionCallback& callback, IOBuffer* buf);
197 192
198 // Implementation of MessageLoopForIO::IOHandler 193 // Implementation of MessageLoopForIO::IOHandler.
199 virtual void OnIOCompleted(MessageLoopForIO::IOContext* context, 194 virtual void OnIOCompleted(MessageLoopForIO::IOContext* context,
200 DWORD bytes_read, 195 DWORD bytes_read,
201 DWORD error) OVERRIDE; 196 DWORD error) OVERRIDE;
202 #elif defined(OS_POSIX) 197 #elif defined(OS_POSIX)
203 // ReadFileImpl() is a simple wrapper around read() that handles EINTR 198 // ReadFileImpl() is a simple wrapper around read() that handles EINTR
204 // signals and calls RecordAndMapError() to map errno to net error codes. 199 // signals and calls RecordAndMapError() to map errno to net error codes.
205 int64 ReadFileImpl(scoped_refptr<IOBuffer> buf, int buf_len); 200 IOResult ReadFileImpl(scoped_refptr<IOBuffer> buf, int buf_len);
206 201
207 // WriteFileImpl() is a simple wrapper around write() that handles EINTR 202 // WriteFileImpl() is a simple wrapper around write() that handles EINTR
208 // signals and calls MapSystemError() to map errno to net error codes. 203 // signals and calls MapSystemError() to map errno to net error codes.
209 // It tries to write to completion. 204 // It tries to write to completion.
210 int64 WriteFileImpl(scoped_refptr<IOBuffer> buf, int buf_len); 205 IOResult WriteFileImpl(scoped_refptr<IOBuffer> buf, int buf_len);
211 #endif 206 #endif
212 207
213 base::PlatformFile file_; 208 base::PlatformFile file_;
214 bool record_uma_; 209 bool record_uma_;
215 bool async_in_progress_; 210 bool async_in_progress_;
216 bool orphaned_; 211 bool orphaned_;
217 BoundNetLog bound_net_log_; 212 BoundNetLog bound_net_log_;
218 213
219 #if defined(OS_WIN) 214 #if defined(OS_WIN)
220 MessageLoopForIO::IOContext io_context_; 215 MessageLoopForIO::IOContext io_context_;
221 CompletionCallback callback_; 216 CompletionCallback callback_;
222 scoped_refptr<IOBuffer> in_flight_buf_; 217 scoped_refptr<IOBuffer> in_flight_buf_;
223 FileErrorSource error_source_; 218 FileErrorSource error_source_;
224 #endif 219 #endif
225 220
226 DISALLOW_COPY_AND_ASSIGN(Context); 221 DISALLOW_COPY_AND_ASSIGN(Context);
227 }; 222 };
228 223
229 } // namespace net 224 } // namespace net
230 225
231 #endif // NET_BASE_FILE_STREAM_CONTEXT_H_ 226 #endif // NET_BASE_FILE_STREAM_CONTEXT_H_
232 227
OLDNEW
« no previous file with comments | « no previous file | net/base/file_stream_context.cc » ('j') | net/base/file_stream_context.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698