Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "chrome/browser/chromeos/file_system_provider/fileapi/file_stream_reade r.h" | 5 #include "chrome/browser/chromeos/file_system_provider/fileapi/file_stream_reade r.h" |
| 6 | 6 |
| 7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
| 8 #include "base/files/file.h" | 8 #include "base/files/file.h" |
| 9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
| 10 #include "chrome/browser/chromeos/file_system_provider/fileapi/provider_async_fi le_util.h" | 10 #include "chrome/browser/chromeos/file_system_provider/fileapi/provider_async_fi le_util.h" |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 23 // Dicards the callback from CloseFile(). | 23 // Dicards the callback from CloseFile(). |
| 24 void EmptyStatusCallback(base::File::Error /* result */) { | 24 void EmptyStatusCallback(base::File::Error /* result */) { |
| 25 } | 25 } |
| 26 | 26 |
| 27 // Converts net::CompletionCallback to net::Int64CompletionCallback. | 27 // Converts net::CompletionCallback to net::Int64CompletionCallback. |
| 28 void Int64ToIntCompletionCallback(net::CompletionCallback callback, | 28 void Int64ToIntCompletionCallback(net::CompletionCallback callback, |
| 29 int64 result) { | 29 int64 result) { |
| 30 callback.Run(static_cast<int>(result)); | 30 callback.Run(static_cast<int>(result)); |
| 31 } | 31 } |
| 32 | 32 |
| 33 // Opens a file for reading and calls the completion callback. Must be called | |
| 34 // on UI thread. | |
| 35 void OpenFileOnUIThread( | |
| 36 const fileapi::FileSystemURL& url, | |
| 37 const FileStreamReader::OpenFileCompletedCallback& callback) { | |
| 38 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 39 | |
| 40 util::FileSystemURLParser parser(url); | |
| 41 if (!parser.Parse()) { | |
| 42 callback.Run(base::WeakPtr<ProvidedFileSystemInterface>(), | |
| 43 base::FilePath(), | |
| 44 0 /* file_handle */, | |
| 45 base::File::FILE_ERROR_SECURITY); | |
| 46 return; | |
| 47 } | |
| 48 | |
| 49 parser.file_system()->OpenFile( | |
| 50 parser.file_path(), | |
| 51 ProvidedFileSystemInterface::OPEN_FILE_MODE_READ, | |
| 52 base::Bind( | |
| 53 callback, parser.file_system()->GetWeakPtr(), parser.file_path())); | |
| 54 } | |
| 55 | |
| 56 // Forwards results of calling OpenFileOnUIThread back to the IO thread. | |
| 57 void OnOpenFileCompletedOnUIThread( | |
| 58 const FileStreamReader::OpenFileCompletedCallback& callback, | |
| 59 base::WeakPtr<ProvidedFileSystemInterface> file_system, | |
| 60 const base::FilePath& file_path, | |
| 61 int file_handle, | |
| 62 base::File::Error result) { | |
| 63 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 64 BrowserThread::PostTask( | |
| 65 BrowserThread::IO, | |
| 66 FROM_HERE, | |
| 67 base::Bind(callback, file_system, file_path, file_handle, result)); | |
| 68 } | |
| 69 | |
| 70 // Closes a file. Ignores result, since it is called from a constructor. | |
| 71 // Must be called on UI thread. | |
| 72 void CloseFileOnUIThread(base::WeakPtr<ProvidedFileSystemInterface> file_system, | |
| 73 int file_handle) { | |
| 74 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 75 if (file_system.get()) | |
| 76 file_system->CloseFile(file_handle, base::Bind(&EmptyStatusCallback)); | |
| 77 } | |
| 78 | |
| 79 // Requests reading contents of a file. In case of either success or a failure | |
| 80 // |callback| is executed. It can be called many times, until |has_more| is set | |
| 81 // to false. This function guarantees that it will succeed only if the file has | |
| 82 // not been changed while reading. Must be called on UI thread. | |
| 83 void ReadFileOnUIThread( | |
| 84 base::WeakPtr<ProvidedFileSystemInterface> file_system, | |
| 85 int file_handle, | |
| 86 scoped_refptr<net::IOBuffer> buffer, | |
| 87 int64 offset, | |
| 88 int length, | |
| 89 const ProvidedFileSystemInterface::ReadChunkReceivedCallback& callback) { | |
| 90 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 91 | |
| 92 // If the file system got unmounted, then abort the reading operation. | |
| 93 if (!file_system.get()) { | |
| 94 callback.Run(0, false /* has_more */, base::File::FILE_ERROR_ABORT); | |
| 95 return; | |
| 96 } | |
| 97 | |
| 98 file_system->ReadFile(file_handle, buffer, offset, length, callback); | |
| 99 } | |
| 100 | |
| 101 // Forward the completion callback to IO thread. | |
| 102 void OnReadChunkReceivedOnUIThread( | |
| 103 const ProvidedFileSystemInterface::ReadChunkReceivedCallback& | |
| 104 chunk_received_callback, | |
| 105 int chunk_length, | |
| 106 bool has_more, | |
| 107 base::File::Error result) { | |
| 108 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 109 BrowserThread::PostTask( | |
| 110 BrowserThread::IO, | |
| 111 FROM_HERE, | |
| 112 base::Bind(chunk_received_callback, chunk_length, has_more, result)); | |
| 113 } | |
| 114 | |
| 115 // Requests metadata of a file. In case of either succes or a failure, | |
| 116 // |callback is executed. Must be called on UI thread. | |
| 117 void GetMetadataOnUIThread( | |
| 118 base::WeakPtr<ProvidedFileSystemInterface> file_system, | |
| 119 const base::FilePath& file_path, | |
| 120 const ProvidedFileSystemInterface::GetMetadataCallback& callback) { | |
| 121 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 122 | |
| 123 // If the file system got unmounted, then abort the get length operation. | |
| 124 if (!file_system.get()) { | |
| 125 callback.Run(EntryMetadata(), base::File::FILE_ERROR_ABORT); | |
| 126 return; | |
| 127 } | |
| 128 | |
| 129 file_system->GetMetadata(file_path, callback); | |
| 130 } | |
| 131 | |
| 132 // Forward the completion callback to IO thread. | |
| 133 void OnGetMetadataReceivedOnUIThread( | |
| 134 const ProvidedFileSystemInterface::GetMetadataCallback& callback, | |
| 135 const EntryMetadata& metadata, | |
| 136 base::File::Error result) { | |
| 137 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 138 BrowserThread::PostTask( | |
| 139 BrowserThread::IO, FROM_HERE, base::Bind(callback, metadata, result)); | |
| 140 } | |
| 141 | |
| 142 } // namespace | 33 } // namespace |
| 143 | 34 |
| 35 class FileStreamReader::OperationRunner | |
| 36 : public base::RefCountedThreadSafe<FileStreamReader::OperationRunner> { | |
| 37 public: | |
| 38 OperationRunner() : file_handle_(-1) {} | |
| 39 | |
| 40 // Opens a file for reading and calls the completion callback. Must be called | |
| 41 // on UI thread. | |
| 42 void OpenFileOnUIThread( | |
| 43 const fileapi::FileSystemURL& url, | |
| 44 const fileapi::AsyncFileUtil::StatusCallback& callback) { | |
| 45 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 46 | |
| 47 util::FileSystemURLParser parser(url); | |
| 48 if (!parser.Parse()) { | |
| 49 BrowserThread::PostTask( | |
| 50 BrowserThread::IO, | |
| 51 FROM_HERE, | |
| 52 base::Bind(callback, base::File::FILE_ERROR_SECURITY)); | |
| 53 return; | |
| 54 } | |
| 55 | |
| 56 file_system_ = parser.file_system()->GetWeakPtr(); | |
| 57 file_path_ = parser.file_path(); | |
| 58 abort_callback_ = parser.file_system()->OpenFile( | |
| 59 file_path_, | |
| 60 ProvidedFileSystemInterface::OPEN_FILE_MODE_READ, | |
| 61 base::Bind( | |
| 62 &OperationRunner::OnOpenFileCompletedOnUIThread, this, callback)); | |
| 63 } | |
| 64 | |
| 65 // Closes a file. Ignores result, since it is called from a constructor. | |
| 66 // Must be called on UI thread. | |
| 67 void CloseFileOnUIThread() { | |
| 68 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 69 if (file_system_.get() && file_handle_ != -1) { | |
| 70 file_system_->CloseFile(file_handle_, base::Bind(&EmptyStatusCallback)); | |
| 71 // Closing a file must not be aborted, since we could end up on files | |
| 72 // which | |
| 73 // are never closed. | |
| 74 abort_callback_ = ProvidedFileSystemInterface::AbortCallback(); | |
|
hirono
2014/08/22 06:44:55
If file_system_.get() == NULL, does not it update
mtomasz
2014/08/22 08:25:19
Hm. The aborting logic has serious flaws. Let me r
mtomasz
2014/08/25 00:46:32
The abort_callback_ should store the callback to t
| |
| 75 } | |
| 76 } | |
| 77 | |
| 78 // Requests reading contents of a file. In case of either success or a failure | |
| 79 // |callback| is executed. It can be called many times, until |has_more| is | |
| 80 // set | |
| 81 // to false. This function guarantees that it will succeed only if the file | |
| 82 // has | |
| 83 // not been changed while reading. Must be called on UI thread. | |
| 84 void ReadFileOnUIThread( | |
| 85 scoped_refptr<net::IOBuffer> buffer, | |
| 86 int64 offset, | |
| 87 int length, | |
| 88 const ProvidedFileSystemInterface::ReadChunkReceivedCallback& callback) { | |
| 89 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 90 | |
| 91 // If the file system got unmounted, then abort the reading operation. | |
| 92 if (!file_system_.get()) { | |
| 93 BrowserThread::PostTask( | |
| 94 BrowserThread::IO, | |
| 95 FROM_HERE, | |
| 96 base::Bind( | |
| 97 callback, 0, false /* has_more */, base::File::FILE_ERROR_ABORT)); | |
| 98 return; | |
| 99 } | |
| 100 | |
| 101 abort_callback_ = file_system_->ReadFile( | |
| 102 file_handle_, | |
| 103 buffer, | |
| 104 offset, | |
| 105 length, | |
| 106 base::Bind( | |
| 107 &OperationRunner::OnReadFileCompletedOnUIThread, this, callback)); | |
| 108 } | |
| 109 | |
| 110 // Requests metadata of a file. In case of either succes or a failure, | |
| 111 // |callback is executed. Must be called on UI thread. | |
| 112 void GetMetadataOnUIThread( | |
| 113 const ProvidedFileSystemInterface::GetMetadataCallback& callback) { | |
| 114 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 115 | |
| 116 // If the file system got unmounted, then abort the get length operation. | |
| 117 if (!file_system_.get()) { | |
| 118 BrowserThread::PostTask( | |
| 119 BrowserThread::IO, | |
| 120 FROM_HERE, | |
| 121 base::Bind(callback, EntryMetadata(), base::File::FILE_ERROR_ABORT)); | |
| 122 return; | |
| 123 } | |
| 124 | |
| 125 abort_callback_ = file_system_->GetMetadata( | |
| 126 file_path_, | |
| 127 base::Bind(&OperationRunner::OnGetMetadataCompletedOnUIThread, | |
| 128 this, | |
| 129 callback)); | |
| 130 } | |
| 131 | |
| 132 // Aborts the most recent operation (if exists), and calls the callback. | |
| 133 void AbortOnUIThread(const fileapi::AsyncFileUtil::StatusCallback& callback) { | |
| 134 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 135 | |
| 136 if (abort_callback_.is_null()) { | |
| 137 // No operation to be cancelled. At most a callback call, which will be | |
| 138 // discarded. | |
| 139 BrowserThread::PostTask(BrowserThread::IO, | |
| 140 FROM_HERE, | |
| 141 base::Bind(callback, base::File::FILE_OK)); | |
| 142 return; | |
| 143 } | |
| 144 | |
| 145 const ProvidedFileSystemInterface::AbortCallback abort_callback = | |
| 146 abort_callback_; | |
| 147 abort_callback_ = ProvidedFileSystemInterface::AbortCallback(); | |
| 148 abort_callback.Run(base::Bind( | |
| 149 &OperationRunner::OnAbortCompletedOnUIThread, this, callback)); | |
| 150 } | |
| 151 | |
| 152 private: | |
| 153 friend class base::RefCountedThreadSafe<OperationRunner>; | |
| 154 | |
| 155 virtual ~OperationRunner() {} | |
| 156 | |
| 157 // Remembers a file handle for further operations and forwards the result to | |
| 158 // the IO thread. | |
| 159 void OnOpenFileCompletedOnUIThread( | |
| 160 const fileapi::AsyncFileUtil::StatusCallback& callback, | |
| 161 int file_handle, | |
| 162 base::File::Error result) { | |
| 163 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 164 | |
| 165 file_handle_ = file_handle; | |
|
hirono
2014/08/22 06:44:55
The complete callback does not clear abort_callbac
| |
| 166 BrowserThread::PostTask( | |
| 167 BrowserThread::IO, FROM_HERE, base::Bind(callback, result)); | |
| 168 } | |
| 169 | |
| 170 // Forwards a metadata to the IO thread. | |
| 171 void OnGetMetadataCompletedOnUIThread( | |
| 172 const ProvidedFileSystemInterface::GetMetadataCallback& callback, | |
| 173 const EntryMetadata& metadata, | |
| 174 base::File::Error result) { | |
| 175 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 176 BrowserThread::PostTask( | |
| 177 BrowserThread::IO, FROM_HERE, base::Bind(callback, metadata, result)); | |
| 178 } | |
| 179 | |
| 180 // Forwards a response of reading from a file to the IO thread. | |
| 181 void OnReadFileCompletedOnUIThread( | |
| 182 const ProvidedFileSystemInterface::ReadChunkReceivedCallback& | |
| 183 chunk_received_callback, | |
| 184 int chunk_length, | |
| 185 bool has_more, | |
| 186 base::File::Error result) { | |
| 187 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 188 BrowserThread::PostTask( | |
| 189 BrowserThread::IO, | |
| 190 FROM_HERE, | |
| 191 base::Bind(chunk_received_callback, chunk_length, has_more, result)); | |
| 192 } | |
| 193 | |
| 194 // Forwards a response of aborting an operation to the IO thread. | |
| 195 void OnAbortCompletedOnUIThread( | |
| 196 const fileapi::AsyncFileUtil::StatusCallback& callback, | |
| 197 base::File::Error result) { | |
| 198 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 199 BrowserThread::PostTask( | |
| 200 BrowserThread::IO, FROM_HERE, base::Bind(callback, result)); | |
| 201 } | |
| 202 | |
| 203 ProvidedFileSystemInterface::AbortCallback abort_callback_; | |
| 204 base::WeakPtr<ProvidedFileSystemInterface> file_system_; | |
| 205 base::FilePath file_path_; | |
| 206 int file_handle_; | |
| 207 | |
| 208 DISALLOW_COPY_AND_ASSIGN(OperationRunner); | |
| 209 }; | |
| 210 | |
| 144 FileStreamReader::FileStreamReader(fileapi::FileSystemContext* context, | 211 FileStreamReader::FileStreamReader(fileapi::FileSystemContext* context, |
| 145 const fileapi::FileSystemURL& url, | 212 const fileapi::FileSystemURL& url, |
| 146 int64 initial_offset, | 213 int64 initial_offset, |
| 147 const base::Time& expected_modification_time) | 214 const base::Time& expected_modification_time) |
| 148 : url_(url), | 215 : url_(url), |
| 149 current_offset_(initial_offset), | 216 current_offset_(initial_offset), |
| 150 current_length_(0), | 217 current_length_(0), |
| 151 expected_modification_time_(expected_modification_time), | 218 expected_modification_time_(expected_modification_time), |
| 219 runner_(new OperationRunner), | |
| 152 state_(NOT_INITIALIZED), | 220 state_(NOT_INITIALIZED), |
| 153 file_handle_(0), | |
| 154 weak_ptr_factory_(this) { | 221 weak_ptr_factory_(this) { |
| 155 } | 222 } |
| 156 | 223 |
| 157 FileStreamReader::~FileStreamReader() { | 224 FileStreamReader::~FileStreamReader() { |
| 225 // FileStreamReader doesn't have a Cancel() method like in FileStreamWriter. | |
| 226 // Therefore, aborting is done from the destructor. | |
| 227 BrowserThread::PostTask(BrowserThread::UI, | |
| 228 FROM_HERE, | |
| 229 base::Bind(&OperationRunner::AbortOnUIThread, | |
| 230 runner_, | |
| 231 base::Bind(&EmptyStatusCallback))); | |
| 232 | |
| 158 BrowserThread::PostTask( | 233 BrowserThread::PostTask( |
| 159 BrowserThread::UI, | 234 BrowserThread::UI, |
| 160 FROM_HERE, | 235 FROM_HERE, |
| 161 base::Bind(&CloseFileOnUIThread, file_system_, file_handle_)); | 236 base::Bind(&OperationRunner::CloseFileOnUIThread, runner_)); |
| 162 } | 237 } |
| 163 | 238 |
| 164 void FileStreamReader::Initialize( | 239 void FileStreamReader::Initialize( |
| 165 const base::Closure& pending_closure, | 240 const base::Closure& pending_closure, |
| 166 const net::Int64CompletionCallback& error_callback) { | 241 const net::Int64CompletionCallback& error_callback) { |
| 167 DCHECK_EQ(NOT_INITIALIZED, state_); | 242 DCHECK_EQ(NOT_INITIALIZED, state_); |
| 168 state_ = INITIALIZING; | 243 state_ = INITIALIZING; |
| 169 | 244 |
| 170 BrowserThread::PostTask( | 245 BrowserThread::PostTask( |
| 171 BrowserThread::UI, | 246 BrowserThread::UI, |
| 172 FROM_HERE, | 247 FROM_HERE, |
| 173 base::Bind(&OpenFileOnUIThread, | 248 base::Bind(&OperationRunner::OpenFileOnUIThread, |
| 249 runner_, | |
| 174 url_, | 250 url_, |
| 175 base::Bind(&OnOpenFileCompletedOnUIThread, | 251 base::Bind(&FileStreamReader::OnOpenFileCompleted, |
| 176 base::Bind(&FileStreamReader::OnOpenFileCompleted, | 252 weak_ptr_factory_.GetWeakPtr(), |
| 177 weak_ptr_factory_.GetWeakPtr(), | 253 pending_closure, |
| 178 pending_closure, | 254 error_callback))); |
| 179 error_callback)))); | |
| 180 } | 255 } |
| 181 | 256 |
| 182 void FileStreamReader::OnOpenFileCompleted( | 257 void FileStreamReader::OnOpenFileCompleted( |
| 183 const base::Closure& pending_closure, | 258 const base::Closure& pending_closure, |
| 184 const net::Int64CompletionCallback& error_callback, | 259 const net::Int64CompletionCallback& error_callback, |
| 185 base::WeakPtr<ProvidedFileSystemInterface> file_system, | |
| 186 const base::FilePath& file_path, | |
| 187 int file_handle, | |
| 188 base::File::Error result) { | 260 base::File::Error result) { |
| 189 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 261 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 190 DCHECK_EQ(INITIALIZING, state_); | 262 DCHECK_EQ(INITIALIZING, state_); |
| 191 | 263 |
| 192 // In case of an error, return immediately using the |error_callback| of the | 264 // In case of an error, return immediately using the |error_callback| of the |
| 193 // Read() or GetLength() pending request. | 265 // Read() or GetLength() pending request. |
| 194 if (result != base::File::FILE_OK) { | 266 if (result != base::File::FILE_OK) { |
| 195 state_ = FAILED; | 267 state_ = FAILED; |
| 196 error_callback.Run(net::FileErrorToNetError(result)); | 268 error_callback.Run(net::FileErrorToNetError(result)); |
| 197 return; | 269 return; |
| 198 } | 270 } |
| 199 | 271 |
| 200 file_system_ = file_system; | 272 DCHECK_EQ(base::File::FILE_OK, result); |
| 201 file_path_ = file_path; | |
| 202 file_handle_ = file_handle; | |
| 203 DCHECK_LT(0, file_handle); | |
| 204 | 273 |
| 205 // Verify the last modification time. | 274 // Verify the last modification time. |
| 206 BrowserThread::PostTask( | 275 BrowserThread::PostTask( |
| 207 BrowserThread::UI, | 276 BrowserThread::UI, |
| 208 FROM_HERE, | 277 FROM_HERE, |
| 209 base::Bind(&GetMetadataOnUIThread, | 278 base::Bind(&OperationRunner::GetMetadataOnUIThread, |
| 210 file_system_, | 279 runner_, |
| 211 file_path_, | 280 base::Bind(&FileStreamReader::OnInitializeCompleted, |
| 212 base::Bind(&OnGetMetadataReceivedOnUIThread, | 281 weak_ptr_factory_.GetWeakPtr(), |
| 213 base::Bind(&FileStreamReader::OnInitializeCompleted, | 282 pending_closure, |
| 214 weak_ptr_factory_.GetWeakPtr(), | 283 error_callback))); |
| 215 pending_closure, | |
| 216 error_callback)))); | |
| 217 } | 284 } |
| 218 | 285 |
| 219 void FileStreamReader::OnInitializeCompleted( | 286 void FileStreamReader::OnInitializeCompleted( |
| 220 const base::Closure& pending_closure, | 287 const base::Closure& pending_closure, |
| 221 const net::Int64CompletionCallback& error_callback, | 288 const net::Int64CompletionCallback& error_callback, |
| 222 const EntryMetadata& metadata, | 289 const EntryMetadata& metadata, |
| 223 base::File::Error result) { | 290 base::File::Error result) { |
| 224 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 291 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 225 DCHECK_EQ(INITIALIZING, state_); | 292 DCHECK_EQ(INITIALIZING, state_); |
| 226 | 293 |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 334 scoped_refptr<net::IOBuffer> buffer, | 401 scoped_refptr<net::IOBuffer> buffer, |
| 335 int buffer_length, | 402 int buffer_length, |
| 336 const net::CompletionCallback& callback) { | 403 const net::CompletionCallback& callback) { |
| 337 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 404 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 338 DCHECK_EQ(INITIALIZED, state_); | 405 DCHECK_EQ(INITIALIZED, state_); |
| 339 | 406 |
| 340 current_length_ = 0; | 407 current_length_ = 0; |
| 341 BrowserThread::PostTask( | 408 BrowserThread::PostTask( |
| 342 BrowserThread::UI, | 409 BrowserThread::UI, |
| 343 FROM_HERE, | 410 FROM_HERE, |
| 344 base::Bind(&ReadFileOnUIThread, | 411 base::Bind(&OperationRunner::ReadFileOnUIThread, |
| 345 file_system_, | 412 runner_, |
| 346 file_handle_, | |
| 347 buffer, | 413 buffer, |
| 348 current_offset_, | 414 current_offset_, |
| 349 buffer_length, | 415 buffer_length, |
| 350 base::Bind(&OnReadChunkReceivedOnUIThread, | 416 base::Bind(&FileStreamReader::OnReadChunkReceived, |
| 351 base::Bind(&FileStreamReader::OnReadChunkReceived, | 417 weak_ptr_factory_.GetWeakPtr(), |
| 352 weak_ptr_factory_.GetWeakPtr(), | 418 callback))); |
| 353 callback)))); | |
| 354 } | 419 } |
| 355 | 420 |
| 356 void FileStreamReader::GetLengthAfterInitialized( | 421 void FileStreamReader::GetLengthAfterInitialized( |
| 357 const net::Int64CompletionCallback& callback) { | 422 const net::Int64CompletionCallback& callback) { |
| 358 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 423 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 359 DCHECK_EQ(INITIALIZED, state_); | 424 DCHECK_EQ(INITIALIZED, state_); |
| 360 | 425 |
| 361 BrowserThread::PostTask( | 426 BrowserThread::PostTask( |
| 362 BrowserThread::UI, | 427 BrowserThread::UI, |
| 363 FROM_HERE, | 428 FROM_HERE, |
| 364 base::Bind( | 429 base::Bind( |
| 365 &GetMetadataOnUIThread, | 430 &OperationRunner::GetMetadataOnUIThread, |
| 366 file_system_, | 431 runner_, |
| 367 file_path_, | 432 base::Bind(&FileStreamReader::OnGetMetadataForGetLengthReceived, |
| 368 base::Bind( | 433 weak_ptr_factory_.GetWeakPtr(), |
| 369 &OnGetMetadataReceivedOnUIThread, | 434 callback))); |
| 370 base::Bind(&FileStreamReader::OnGetMetadataForGetLengthReceived, | |
| 371 weak_ptr_factory_.GetWeakPtr(), | |
| 372 callback)))); | |
| 373 } | 435 } |
| 374 | 436 |
| 375 void FileStreamReader::OnReadChunkReceived( | 437 void FileStreamReader::OnReadChunkReceived( |
| 376 const net::CompletionCallback& callback, | 438 const net::CompletionCallback& callback, |
| 377 int chunk_length, | 439 int chunk_length, |
| 378 bool has_more, | 440 bool has_more, |
| 379 base::File::Error result) { | 441 base::File::Error result) { |
| 380 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 442 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 381 DCHECK_EQ(INITIALIZED, state_); | 443 DCHECK_EQ(INITIALIZED, state_); |
| 382 | 444 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 422 callback.Run(net::ERR_UPLOAD_FILE_CHANGED); | 484 callback.Run(net::ERR_UPLOAD_FILE_CHANGED); |
| 423 return; | 485 return; |
| 424 } | 486 } |
| 425 | 487 |
| 426 DCHECK_EQ(base::File::FILE_OK, result); | 488 DCHECK_EQ(base::File::FILE_OK, result); |
| 427 callback.Run(metadata.size); | 489 callback.Run(metadata.size); |
| 428 } | 490 } |
| 429 | 491 |
| 430 } // namespace file_system_provider | 492 } // namespace file_system_provider |
| 431 } // namespace chromeos | 493 } // namespace chromeos |
| OLD | NEW |