OLD | NEW |
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 #include "net/base/file_stream_context.h" | 5 #include "net/base/file_stream_context.h" |
6 | 6 |
7 #include "base/location.h" | 7 #include "base/location.h" |
8 #include "base/message_loop/message_loop_proxy.h" | 8 #include "base/message_loop/message_loop_proxy.h" |
9 #include "base/task_runner_util.h" | 9 #include "base/task_runner_util.h" |
10 #include "base/threading/thread_restrictions.h" | 10 #include "base/threading/thread_restrictions.h" |
11 #include "net/base/file_stream_net_log_parameters.h" | 11 #include "net/base/file_stream_net_log_parameters.h" |
12 #include "net/base/net_errors.h" | 12 #include "net/base/net_errors.h" |
13 | 13 |
14 #if defined(OS_ANDROID) | |
15 #include "base/android/content_uri_utils.h" | |
16 #endif | |
17 | |
18 namespace { | 14 namespace { |
19 | 15 |
20 void CallInt64ToInt(const net::CompletionCallback& callback, int64 result) { | 16 void CallInt64ToInt(const net::CompletionCallback& callback, int64 result) { |
21 callback.Run(static_cast<int>(result)); | 17 callback.Run(static_cast<int>(result)); |
22 } | 18 } |
23 | 19 |
24 } | 20 } |
25 | 21 |
26 namespace net { | 22 namespace net { |
27 | 23 |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 } | 186 } |
191 | 187 |
192 void FileStream::Context::BeginOpenEvent(const base::FilePath& path) { | 188 void FileStream::Context::BeginOpenEvent(const base::FilePath& path) { |
193 std::string file_name = path.AsUTF8Unsafe(); | 189 std::string file_name = path.AsUTF8Unsafe(); |
194 bound_net_log_.BeginEvent(NetLog::TYPE_FILE_STREAM_OPEN, | 190 bound_net_log_.BeginEvent(NetLog::TYPE_FILE_STREAM_OPEN, |
195 NetLog::StringCallback("file_name", &file_name)); | 191 NetLog::StringCallback("file_name", &file_name)); |
196 } | 192 } |
197 | 193 |
198 FileStream::Context::OpenResult FileStream::Context::OpenFileImpl( | 194 FileStream::Context::OpenResult FileStream::Context::OpenFileImpl( |
199 const base::FilePath& path, int open_flags) { | 195 const base::FilePath& path, int open_flags) { |
200 base::PlatformFile file; | 196 // FileStream::Context actually closes the file asynchronously, independently |
201 #if defined(OS_ANDROID) | 197 // from FileStream's destructor. It can cause problems for users wanting to |
202 if (path.IsContentUri()) { | 198 // delete the file right after FileStream deletion. Thus we are always |
203 // Check that only Read flags are set. | 199 // adding SHARE_DELETE flag to accommodate such use case. |
204 DCHECK_EQ(open_flags & ~base::PLATFORM_FILE_ASYNC, | 200 open_flags |= base::PLATFORM_FILE_SHARE_DELETE; |
205 base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ); | 201 base::PlatformFile file = |
206 file = base::OpenContentUriForRead(path); | 202 base::CreatePlatformFile(path, open_flags, NULL, NULL); |
207 } else { | |
208 #endif // defined(OS_ANDROID) | |
209 // FileStream::Context actually closes the file asynchronously, | |
210 // independently from FileStream's destructor. It can cause problems for | |
211 // users wanting to delete the file right after FileStream deletion. Thus | |
212 // we are always adding SHARE_DELETE flag to accommodate such use case. | |
213 open_flags |= base::PLATFORM_FILE_SHARE_DELETE; | |
214 file = base::CreatePlatformFile(path, open_flags, NULL, NULL); | |
215 #if defined(OS_ANDROID) | |
216 } | |
217 #endif // defined(OS_ANDROID) | |
218 if (file == base::kInvalidPlatformFileValue) | 203 if (file == base::kInvalidPlatformFileValue) |
219 return OpenResult(file, IOResult::FromOSError(GetLastErrno())); | 204 return OpenResult(file, IOResult::FromOSError(GetLastErrno())); |
220 | 205 |
221 return OpenResult(file, IOResult(OK, 0)); | 206 return OpenResult(file, IOResult(OK, 0)); |
222 } | 207 } |
223 | 208 |
224 void FileStream::Context::ProcessOpenError(const IOResult& error_code) { | 209 void FileStream::Context::ProcessOpenError(const IOResult& error_code) { |
225 bound_net_log_.EndEvent(NetLog::TYPE_FILE_STREAM_OPEN); | 210 bound_net_log_.EndEvent(NetLog::TYPE_FILE_STREAM_OPEN); |
226 RecordError(error_code, FILE_ERROR_SOURCE_OPEN); | 211 RecordError(error_code, FILE_ERROR_SOURCE_OPEN); |
227 } | 212 } |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 // operation is in progress. | 261 // operation is in progress. |
277 async_in_progress_ = false; | 262 async_in_progress_ = false; |
278 if (orphaned_) | 263 if (orphaned_) |
279 CloseAndDelete(); | 264 CloseAndDelete(); |
280 else | 265 else |
281 callback.Run(result); | 266 callback.Run(result); |
282 } | 267 } |
283 | 268 |
284 } // namespace net | 269 } // namespace net |
285 | 270 |
OLD | NEW |