| 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 "webkit/blob/local_file_reader.h" | 5 #include "webkit/blob/local_file_stream_reader.h" |
| 6 | 6 |
| 7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
| 8 #include "base/file_util_proxy.h" | 8 #include "base/file_util_proxy.h" |
| 9 #include "base/location.h" | 9 #include "base/location.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/platform_file.h" | 11 #include "base/platform_file.h" |
| 12 #include "base/task_runner.h" | 12 #include "base/task_runner.h" |
| 13 #include "net/base/file_stream.h" | 13 #include "net/base/file_stream.h" |
| 14 #include "net/base/io_buffer.h" | 14 #include "net/base/io_buffer.h" |
| 15 #include "net/base/net_errors.h" | 15 #include "net/base/net_errors.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 26 bool VerifySnapshotTime(const base::Time& expected_modification_time, | 26 bool VerifySnapshotTime(const base::Time& expected_modification_time, |
| 27 const base::PlatformFileInfo& file_info) { | 27 const base::PlatformFileInfo& file_info) { |
| 28 return expected_modification_time.is_null() || | 28 return expected_modification_time.is_null() || |
| 29 expected_modification_time.ToTimeT() == | 29 expected_modification_time.ToTimeT() == |
| 30 file_info.last_modified.ToTimeT(); | 30 file_info.last_modified.ToTimeT(); |
| 31 } | 31 } |
| 32 | 32 |
| 33 } // namespace | 33 } // namespace |
| 34 | 34 |
| 35 // static | 35 // static |
| 36 int LocalFileReader::PlatformFileErrorToNetError( | 36 int LocalFileStreamReader::PlatformFileErrorToNetError( |
| 37 base::PlatformFileError file_error) { | 37 base::PlatformFileError file_error) { |
| 38 switch (file_error) { | 38 switch (file_error) { |
| 39 case base::PLATFORM_FILE_OK: | 39 case base::PLATFORM_FILE_OK: |
| 40 return net::OK; | 40 return net::OK; |
| 41 case base::PLATFORM_FILE_ERROR_NOT_FOUND: | 41 case base::PLATFORM_FILE_ERROR_NOT_FOUND: |
| 42 return net::ERR_FILE_NOT_FOUND; | 42 return net::ERR_FILE_NOT_FOUND; |
| 43 case base::PLATFORM_FILE_ERROR_ACCESS_DENIED: | 43 case base::PLATFORM_FILE_ERROR_ACCESS_DENIED: |
| 44 return net::ERR_ACCESS_DENIED; | 44 return net::ERR_ACCESS_DENIED; |
| 45 default: | 45 default: |
| 46 return net::ERR_FAILED; | 46 return net::ERR_FAILED; |
| 47 } | 47 } |
| 48 } | 48 } |
| 49 | 49 |
| 50 LocalFileReader::LocalFileReader( | 50 LocalFileStreamReader::LocalFileStreamReader( |
| 51 base::TaskRunner* task_runner, | 51 base::TaskRunner* task_runner, |
| 52 const FilePath& file_path, | 52 const FilePath& file_path, |
| 53 int64 initial_offset, | 53 int64 initial_offset, |
| 54 const base::Time& expected_modification_time) | 54 const base::Time& expected_modification_time) |
| 55 : task_runner_(task_runner), | 55 : task_runner_(task_runner), |
| 56 file_path_(file_path), | 56 file_path_(file_path), |
| 57 initial_offset_(initial_offset), | 57 initial_offset_(initial_offset), |
| 58 expected_modification_time_(expected_modification_time), | 58 expected_modification_time_(expected_modification_time), |
| 59 has_pending_open_(false), | 59 has_pending_open_(false), |
| 60 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {} | 60 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {} |
| 61 | 61 |
| 62 LocalFileReader::~LocalFileReader() { | 62 LocalFileStreamReader::~LocalFileStreamReader() { |
| 63 } | 63 } |
| 64 | 64 |
| 65 int LocalFileReader::Read(net::IOBuffer* buf, int buf_len, | 65 int LocalFileStreamReader::Read(net::IOBuffer* buf, int buf_len, |
| 66 const net::CompletionCallback& callback) { | 66 const net::CompletionCallback& callback) { |
| 67 DCHECK(!has_pending_open_); | 67 DCHECK(!has_pending_open_); |
| 68 if (stream_impl_.get()) | 68 if (stream_impl_.get()) |
| 69 return stream_impl_->Read(buf, buf_len, callback); | 69 return stream_impl_->Read(buf, buf_len, callback); |
| 70 return Open(base::Bind(&LocalFileReader::DidOpenForRead, | 70 return Open(base::Bind(&LocalFileStreamReader::DidOpenForRead, |
| 71 weak_factory_.GetWeakPtr(), | 71 weak_factory_.GetWeakPtr(), |
| 72 make_scoped_refptr(buf), buf_len, callback)); | 72 make_scoped_refptr(buf), buf_len, callback)); |
| 73 } | 73 } |
| 74 | 74 |
| 75 int LocalFileReader::GetLength(const net::Int64CompletionCallback& callback) { | 75 int LocalFileStreamReader::GetLength( |
| 76 const net::Int64CompletionCallback& callback) { |
| 76 const bool posted = base::FileUtilProxy::GetFileInfo( | 77 const bool posted = base::FileUtilProxy::GetFileInfo( |
| 77 task_runner_, file_path_, | 78 task_runner_, file_path_, |
| 78 base::Bind(&LocalFileReader::DidGetFileInfoForGetLength, | 79 base::Bind(&LocalFileStreamReader::DidGetFileInfoForGetLength, |
| 79 weak_factory_.GetWeakPtr(), callback)); | 80 weak_factory_.GetWeakPtr(), callback)); |
| 80 DCHECK(posted); | 81 DCHECK(posted); |
| 81 return net::ERR_IO_PENDING; | 82 return net::ERR_IO_PENDING; |
| 82 } | 83 } |
| 83 | 84 |
| 84 int LocalFileReader::Open(const net::CompletionCallback& callback) { | 85 int LocalFileStreamReader::Open(const net::CompletionCallback& callback) { |
| 85 DCHECK(!has_pending_open_); | 86 DCHECK(!has_pending_open_); |
| 86 DCHECK(!stream_impl_.get()); | 87 DCHECK(!stream_impl_.get()); |
| 87 has_pending_open_ = true; | 88 has_pending_open_ = true; |
| 88 | 89 |
| 89 // Call GetLength first to make it perform last-modified-time verification, | 90 // Call GetLength first to make it perform last-modified-time verification, |
| 90 // and then call DidVerifyForOpen for do the rest. | 91 // and then call DidVerifyForOpen for do the rest. |
| 91 return GetLength(base::Bind(&LocalFileReader::DidVerifyForOpen, | 92 return GetLength(base::Bind(&LocalFileStreamReader::DidVerifyForOpen, |
| 92 weak_factory_.GetWeakPtr(), callback)); | 93 weak_factory_.GetWeakPtr(), callback)); |
| 93 } | 94 } |
| 94 | 95 |
| 95 void LocalFileReader::DidVerifyForOpen( | 96 void LocalFileStreamReader::DidVerifyForOpen( |
| 96 const net::CompletionCallback& callback, | 97 const net::CompletionCallback& callback, |
| 97 int64 get_length_result) { | 98 int64 get_length_result) { |
| 98 if (get_length_result < 0) { | 99 if (get_length_result < 0) { |
| 99 callback.Run(static_cast<int>(get_length_result)); | 100 callback.Run(static_cast<int>(get_length_result)); |
| 100 return; | 101 return; |
| 101 } | 102 } |
| 102 | 103 |
| 103 stream_impl_.reset(new net::FileStream(NULL)); | 104 stream_impl_.reset(new net::FileStream(NULL)); |
| 104 const int result = stream_impl_->Open( | 105 const int result = stream_impl_->Open( |
| 105 file_path_, kOpenFlagsForRead, | 106 file_path_, kOpenFlagsForRead, |
| 106 base::Bind(&LocalFileReader::DidOpenFileStream, | 107 base::Bind(&LocalFileStreamReader::DidOpenFileStream, |
| 107 weak_factory_.GetWeakPtr(), | 108 weak_factory_.GetWeakPtr(), |
| 108 callback)); | 109 callback)); |
| 109 if (result != net::ERR_IO_PENDING) | 110 if (result != net::ERR_IO_PENDING) |
| 110 callback.Run(result); | 111 callback.Run(result); |
| 111 } | 112 } |
| 112 | 113 |
| 113 void LocalFileReader::DidOpenFileStream( | 114 void LocalFileStreamReader::DidOpenFileStream( |
| 114 const net::CompletionCallback& callback, | 115 const net::CompletionCallback& callback, |
| 115 int result) { | 116 int result) { |
| 116 if (result != net::OK) { | 117 if (result != net::OK) { |
| 117 callback.Run(result); | 118 callback.Run(result); |
| 118 return; | 119 return; |
| 119 } | 120 } |
| 120 result = stream_impl_->Seek(net::FROM_BEGIN, initial_offset_, | 121 result = stream_impl_->Seek( |
| 121 base::Bind(&LocalFileReader::DidSeekFileStream, | 122 net::FROM_BEGIN, initial_offset_, |
| 122 weak_factory_.GetWeakPtr(), | 123 base::Bind(&LocalFileStreamReader::DidSeekFileStream, |
| 123 callback)); | 124 weak_factory_.GetWeakPtr(), |
| 125 callback)); |
| 124 if (result != net::ERR_IO_PENDING) { | 126 if (result != net::ERR_IO_PENDING) { |
| 125 callback.Run(result); | 127 callback.Run(result); |
| 126 } | 128 } |
| 127 } | 129 } |
| 128 | 130 |
| 129 void LocalFileReader::DidSeekFileStream( | 131 void LocalFileStreamReader::DidSeekFileStream( |
| 130 const net::CompletionCallback& callback, | 132 const net::CompletionCallback& callback, |
| 131 int64 seek_result) { | 133 int64 seek_result) { |
| 132 if (seek_result < 0) { | 134 if (seek_result < 0) { |
| 133 callback.Run(static_cast<int>(seek_result)); | 135 callback.Run(static_cast<int>(seek_result)); |
| 134 return; | 136 return; |
| 135 } | 137 } |
| 136 if (seek_result != initial_offset_) { | 138 if (seek_result != initial_offset_) { |
| 137 callback.Run(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE); | 139 callback.Run(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE); |
| 138 return; | 140 return; |
| 139 } | 141 } |
| 140 callback.Run(net::OK); | 142 callback.Run(net::OK); |
| 141 } | 143 } |
| 142 | 144 |
| 143 void LocalFileReader::DidOpenForRead(net::IOBuffer* buf, | 145 void LocalFileStreamReader::DidOpenForRead( |
| 144 int buf_len, | 146 net::IOBuffer* buf, |
| 145 const net::CompletionCallback& callback, | 147 int buf_len, |
| 146 int open_result) { | 148 const net::CompletionCallback& callback, |
| 149 int open_result) { |
| 147 DCHECK(has_pending_open_); | 150 DCHECK(has_pending_open_); |
| 148 has_pending_open_ = false; | 151 has_pending_open_ = false; |
| 149 if (open_result != net::OK) { | 152 if (open_result != net::OK) { |
| 150 stream_impl_.reset(); | 153 stream_impl_.reset(); |
| 151 callback.Run(open_result); | 154 callback.Run(open_result); |
| 152 return; | 155 return; |
| 153 } | 156 } |
| 154 DCHECK(stream_impl_.get()); | 157 DCHECK(stream_impl_.get()); |
| 155 const int read_result = stream_impl_->Read(buf, buf_len, callback); | 158 const int read_result = stream_impl_->Read(buf, buf_len, callback); |
| 156 if (read_result != net::ERR_IO_PENDING) | 159 if (read_result != net::ERR_IO_PENDING) |
| 157 callback.Run(read_result); | 160 callback.Run(read_result); |
| 158 } | 161 } |
| 159 | 162 |
| 160 void LocalFileReader::DidGetFileInfoForGetLength( | 163 void LocalFileStreamReader::DidGetFileInfoForGetLength( |
| 161 const net::Int64CompletionCallback& callback, | 164 const net::Int64CompletionCallback& callback, |
| 162 base::PlatformFileError error, | 165 base::PlatformFileError error, |
| 163 const base::PlatformFileInfo& file_info) { | 166 const base::PlatformFileInfo& file_info) { |
| 164 if (file_info.is_directory) { | 167 if (file_info.is_directory) { |
| 165 callback.Run(net::ERR_FILE_NOT_FOUND); | 168 callback.Run(net::ERR_FILE_NOT_FOUND); |
| 166 return; | 169 return; |
| 167 } | 170 } |
| 168 if (error != base::PLATFORM_FILE_OK) { | 171 if (error != base::PLATFORM_FILE_OK) { |
| 169 callback.Run(LocalFileReader::PlatformFileErrorToNetError(error)); | 172 callback.Run(LocalFileStreamReader::PlatformFileErrorToNetError(error)); |
| 170 return; | 173 return; |
| 171 } | 174 } |
| 172 if (!VerifySnapshotTime(expected_modification_time_, file_info)) { | 175 if (!VerifySnapshotTime(expected_modification_time_, file_info)) { |
| 173 callback.Run(net::ERR_UPLOAD_FILE_CHANGED); | 176 callback.Run(net::ERR_UPLOAD_FILE_CHANGED); |
| 174 return; | 177 return; |
| 175 } | 178 } |
| 176 callback.Run(file_info.size); | 179 callback.Run(file_info.size); |
| 177 } | 180 } |
| 178 | 181 |
| 179 } // namespace webkit_blob | 182 } // namespace webkit_blob |
| OLD | NEW |