| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/drive/drive_file_stream_reader.h" | 5 #include "chrome/browser/chromeos/drive/drive_file_stream_reader.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cstring> | 8 #include <cstring> |
| 9 | 9 |
| 10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 return offset; | 89 return offset; |
| 90 } | 90 } |
| 91 | 91 |
| 92 } // namespace | 92 } // namespace |
| 93 | 93 |
| 94 LocalReaderProxy::LocalReaderProxy( | 94 LocalReaderProxy::LocalReaderProxy( |
| 95 scoped_ptr<util::LocalFileReader> file_reader, int64 length) | 95 scoped_ptr<util::LocalFileReader> file_reader, int64 length) |
| 96 : file_reader_(file_reader.Pass()), | 96 : file_reader_(file_reader.Pass()), |
| 97 remaining_length_(length), | 97 remaining_length_(length), |
| 98 weak_ptr_factory_(this) { | 98 weak_ptr_factory_(this) { |
| 99 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 99 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 100 DCHECK(file_reader_); | 100 DCHECK(file_reader_); |
| 101 } | 101 } |
| 102 | 102 |
| 103 LocalReaderProxy::~LocalReaderProxy() { | 103 LocalReaderProxy::~LocalReaderProxy() { |
| 104 } | 104 } |
| 105 | 105 |
| 106 int LocalReaderProxy::Read(net::IOBuffer* buffer, int buffer_length, | 106 int LocalReaderProxy::Read(net::IOBuffer* buffer, int buffer_length, |
| 107 const net::CompletionCallback& callback) { | 107 const net::CompletionCallback& callback) { |
| 108 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 108 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 109 DCHECK(file_reader_); | 109 DCHECK(file_reader_); |
| 110 | 110 |
| 111 if (buffer_length > remaining_length_) { | 111 if (buffer_length > remaining_length_) { |
| 112 // Here, narrowing is safe. | 112 // Here, narrowing is safe. |
| 113 buffer_length = static_cast<int>(remaining_length_); | 113 buffer_length = static_cast<int>(remaining_length_); |
| 114 } | 114 } |
| 115 | 115 |
| 116 if (!buffer_length) | 116 if (!buffer_length) |
| 117 return 0; | 117 return 0; |
| 118 | 118 |
| 119 file_reader_->Read(buffer, buffer_length, | 119 file_reader_->Read(buffer, buffer_length, |
| 120 base::Bind(&LocalReaderProxy::OnReadCompleted, | 120 base::Bind(&LocalReaderProxy::OnReadCompleted, |
| 121 weak_ptr_factory_.GetWeakPtr(), callback)); | 121 weak_ptr_factory_.GetWeakPtr(), callback)); |
| 122 return net::ERR_IO_PENDING; | 122 return net::ERR_IO_PENDING; |
| 123 } | 123 } |
| 124 | 124 |
| 125 void LocalReaderProxy::OnGetContent(scoped_ptr<std::string> data) { | 125 void LocalReaderProxy::OnGetContent(scoped_ptr<std::string> data) { |
| 126 // This method should never be called, because no data should be received | 126 // This method should never be called, because no data should be received |
| 127 // from the network during the reading of local-cache file. | 127 // from the network during the reading of local-cache file. |
| 128 NOTREACHED(); | 128 NOTREACHED(); |
| 129 } | 129 } |
| 130 | 130 |
| 131 void LocalReaderProxy::OnCompleted(FileError error) { | 131 void LocalReaderProxy::OnCompleted(FileError error) { |
| 132 // If this method is called, no network error should be happened. | 132 // If this method is called, no network error should be happened. |
| 133 DCHECK_EQ(FILE_ERROR_OK, error); | 133 DCHECK_EQ(FILE_ERROR_OK, error); |
| 134 } | 134 } |
| 135 | 135 |
| 136 void LocalReaderProxy::OnReadCompleted(const net::CompletionCallback& callback, | 136 void LocalReaderProxy::OnReadCompleted(const net::CompletionCallback& callback, |
| 137 int read_result) { | 137 int read_result) { |
| 138 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 138 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 139 DCHECK(file_reader_); | 139 DCHECK(file_reader_); |
| 140 | 140 |
| 141 if (read_result >= 0) { | 141 if (read_result >= 0) { |
| 142 // |read_result| bytes data is read. | 142 // |read_result| bytes data is read. |
| 143 DCHECK_LE(read_result, remaining_length_); | 143 DCHECK_LE(read_result, remaining_length_); |
| 144 remaining_length_ -= read_result; | 144 remaining_length_ -= read_result; |
| 145 } else { | 145 } else { |
| 146 // An error occurs. Close the |file_reader_|. | 146 // An error occurs. Close the |file_reader_|. |
| 147 file_reader_.reset(); | 147 file_reader_.reset(); |
| 148 } | 148 } |
| 149 callback.Run(read_result); | 149 callback.Run(read_result); |
| 150 } | 150 } |
| 151 | 151 |
| 152 NetworkReaderProxy::NetworkReaderProxy( | 152 NetworkReaderProxy::NetworkReaderProxy( |
| 153 int64 offset, | 153 int64 offset, |
| 154 int64 content_length, | 154 int64 content_length, |
| 155 int64 full_content_length, | 155 int64 full_content_length, |
| 156 const base::Closure& job_canceller) | 156 const base::Closure& job_canceller) |
| 157 : remaining_offset_(offset), | 157 : remaining_offset_(offset), |
| 158 remaining_content_length_(content_length), | 158 remaining_content_length_(content_length), |
| 159 is_full_download_(offset + content_length == full_content_length), | 159 is_full_download_(offset + content_length == full_content_length), |
| 160 error_code_(net::OK), | 160 error_code_(net::OK), |
| 161 buffer_length_(0), | 161 buffer_length_(0), |
| 162 job_canceller_(job_canceller) { | 162 job_canceller_(job_canceller) { |
| 163 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 163 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 164 } | 164 } |
| 165 | 165 |
| 166 NetworkReaderProxy::~NetworkReaderProxy() { | 166 NetworkReaderProxy::~NetworkReaderProxy() { |
| 167 if (!job_canceller_.is_null()) { | 167 if (!job_canceller_.is_null()) { |
| 168 job_canceller_.Run(); | 168 job_canceller_.Run(); |
| 169 } | 169 } |
| 170 } | 170 } |
| 171 | 171 |
| 172 int NetworkReaderProxy::Read(net::IOBuffer* buffer, int buffer_length, | 172 int NetworkReaderProxy::Read(net::IOBuffer* buffer, int buffer_length, |
| 173 const net::CompletionCallback& callback) { | 173 const net::CompletionCallback& callback) { |
| 174 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 174 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 175 // Check if there is no pending Read operation. | 175 // Check if there is no pending Read operation. |
| 176 DCHECK(!buffer_.get()); | 176 DCHECK(!buffer_.get()); |
| 177 DCHECK_EQ(buffer_length_, 0); | 177 DCHECK_EQ(buffer_length_, 0); |
| 178 DCHECK(callback_.is_null()); | 178 DCHECK(callback_.is_null()); |
| 179 // Validate the arguments. | 179 // Validate the arguments. |
| 180 DCHECK(buffer); | 180 DCHECK(buffer); |
| 181 DCHECK_GT(buffer_length, 0); | 181 DCHECK_GT(buffer_length, 0); |
| 182 DCHECK(!callback.is_null()); | 182 DCHECK(!callback.is_null()); |
| 183 | 183 |
| 184 if (error_code_ != net::OK) { | 184 if (error_code_ != net::OK) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 211 // Although OnCompleted() should reset |job_canceller_| when download is done, | 211 // Although OnCompleted() should reset |job_canceller_| when download is done, |
| 212 // due to timing issues the ReaderProxy instance may be destructed before the | 212 // due to timing issues the ReaderProxy instance may be destructed before the |
| 213 // notification. To fix the case we reset here earlier. | 213 // notification. To fix the case we reset here earlier. |
| 214 if (is_full_download_ && remaining_content_length_ == 0) | 214 if (is_full_download_ && remaining_content_length_ == 0) |
| 215 job_canceller_.Reset(); | 215 job_canceller_.Reset(); |
| 216 | 216 |
| 217 return result; | 217 return result; |
| 218 } | 218 } |
| 219 | 219 |
| 220 void NetworkReaderProxy::OnGetContent(scoped_ptr<std::string> data) { | 220 void NetworkReaderProxy::OnGetContent(scoped_ptr<std::string> data) { |
| 221 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 221 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 222 DCHECK(data && !data->empty()); | 222 DCHECK(data && !data->empty()); |
| 223 | 223 |
| 224 if (remaining_offset_ >= static_cast<int64>(data->length())) { | 224 if (remaining_offset_ >= static_cast<int64>(data->length())) { |
| 225 // Skip unneeded leading data. | 225 // Skip unneeded leading data. |
| 226 remaining_offset_ -= data->length(); | 226 remaining_offset_ -= data->length(); |
| 227 return; | 227 return; |
| 228 } | 228 } |
| 229 | 229 |
| 230 if (remaining_offset_ > 0) { | 230 if (remaining_offset_ > 0) { |
| 231 // Erase unnecessary leading bytes. | 231 // Erase unnecessary leading bytes. |
| (...skipping 14 matching lines...) Expand all Loading... |
| 246 if (is_full_download_ && remaining_content_length_ == 0) | 246 if (is_full_download_ && remaining_content_length_ == 0) |
| 247 job_canceller_.Reset(); | 247 job_canceller_.Reset(); |
| 248 | 248 |
| 249 buffer_ = NULL; | 249 buffer_ = NULL; |
| 250 buffer_length_ = 0; | 250 buffer_length_ = 0; |
| 251 DCHECK(!callback_.is_null()); | 251 DCHECK(!callback_.is_null()); |
| 252 base::ResetAndReturn(&callback_).Run(result); | 252 base::ResetAndReturn(&callback_).Run(result); |
| 253 } | 253 } |
| 254 | 254 |
| 255 void NetworkReaderProxy::OnCompleted(FileError error) { | 255 void NetworkReaderProxy::OnCompleted(FileError error) { |
| 256 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 256 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 257 // The downloading is completed, so we do not need to cancel the job | 257 // The downloading is completed, so we do not need to cancel the job |
| 258 // in the destructor. | 258 // in the destructor. |
| 259 job_canceller_.Reset(); | 259 job_canceller_.Reset(); |
| 260 | 260 |
| 261 if (error == FILE_ERROR_OK) { | 261 if (error == FILE_ERROR_OK) { |
| 262 return; | 262 return; |
| 263 } | 263 } |
| 264 | 264 |
| 265 error_code_ = FileErrorToNetError(error); | 265 error_code_ = FileErrorToNetError(error); |
| 266 pending_data_.clear(); | 266 pending_data_.clear(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 281 | 281 |
| 282 // Calls FileSystemInterface::GetFileContent if the file system | 282 // Calls FileSystemInterface::GetFileContent if the file system |
| 283 // is available. If not, the |completion_callback| is invoked with | 283 // is available. If not, the |completion_callback| is invoked with |
| 284 // FILE_ERROR_FAILED. | 284 // FILE_ERROR_FAILED. |
| 285 base::Closure GetFileContentOnUIThread( | 285 base::Closure GetFileContentOnUIThread( |
| 286 const DriveFileStreamReader::FileSystemGetter& file_system_getter, | 286 const DriveFileStreamReader::FileSystemGetter& file_system_getter, |
| 287 const base::FilePath& drive_file_path, | 287 const base::FilePath& drive_file_path, |
| 288 const GetFileContentInitializedCallback& initialized_callback, | 288 const GetFileContentInitializedCallback& initialized_callback, |
| 289 const google_apis::GetContentCallback& get_content_callback, | 289 const google_apis::GetContentCallback& get_content_callback, |
| 290 const FileOperationCallback& completion_callback) { | 290 const FileOperationCallback& completion_callback) { |
| 291 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 291 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 292 | 292 |
| 293 FileSystemInterface* file_system = file_system_getter.Run(); | 293 FileSystemInterface* file_system = file_system_getter.Run(); |
| 294 if (!file_system) { | 294 if (!file_system) { |
| 295 completion_callback.Run(FILE_ERROR_FAILED); | 295 completion_callback.Run(FILE_ERROR_FAILED); |
| 296 return base::Closure(); | 296 return base::Closure(); |
| 297 } | 297 } |
| 298 | 298 |
| 299 return google_apis::CreateRelayCallback( | 299 return google_apis::CreateRelayCallback( |
| 300 file_system->GetFileContent(drive_file_path, | 300 file_system->GetFileContent(drive_file_path, |
| 301 initialized_callback, | 301 initialized_callback, |
| 302 get_content_callback, | 302 get_content_callback, |
| 303 completion_callback)); | 303 completion_callback)); |
| 304 } | 304 } |
| 305 | 305 |
| 306 // Helper to run FileSystemInterface::GetFileContent on UI thread. | 306 // Helper to run FileSystemInterface::GetFileContent on UI thread. |
| 307 void GetFileContent( | 307 void GetFileContent( |
| 308 const DriveFileStreamReader::FileSystemGetter& file_system_getter, | 308 const DriveFileStreamReader::FileSystemGetter& file_system_getter, |
| 309 const base::FilePath& drive_file_path, | 309 const base::FilePath& drive_file_path, |
| 310 const GetFileContentInitializedCallback& initialized_callback, | 310 const GetFileContentInitializedCallback& initialized_callback, |
| 311 const google_apis::GetContentCallback& get_content_callback, | 311 const google_apis::GetContentCallback& get_content_callback, |
| 312 const FileOperationCallback& completion_callback, | 312 const FileOperationCallback& completion_callback, |
| 313 const base::Callback<void(const base::Closure&)>& reply_callback) { | 313 const base::Callback<void(const base::Closure&)>& reply_callback) { |
| 314 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 314 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 315 | 315 |
| 316 BrowserThread::PostTaskAndReplyWithResult( | 316 BrowserThread::PostTaskAndReplyWithResult( |
| 317 BrowserThread::UI, | 317 BrowserThread::UI, |
| 318 FROM_HERE, | 318 FROM_HERE, |
| 319 base::Bind(&GetFileContentOnUIThread, | 319 base::Bind(&GetFileContentOnUIThread, |
| 320 file_system_getter, | 320 file_system_getter, |
| 321 drive_file_path, | 321 drive_file_path, |
| 322 google_apis::CreateRelayCallback(initialized_callback), | 322 google_apis::CreateRelayCallback(initialized_callback), |
| 323 google_apis::CreateRelayCallback(get_content_callback), | 323 google_apis::CreateRelayCallback(get_content_callback), |
| 324 google_apis::CreateRelayCallback(completion_callback)), | 324 google_apis::CreateRelayCallback(completion_callback)), |
| 325 reply_callback); | 325 reply_callback); |
| 326 } | 326 } |
| 327 | 327 |
| 328 } // namespace | 328 } // namespace |
| 329 | 329 |
| 330 DriveFileStreamReader::DriveFileStreamReader( | 330 DriveFileStreamReader::DriveFileStreamReader( |
| 331 const FileSystemGetter& file_system_getter, | 331 const FileSystemGetter& file_system_getter, |
| 332 base::SequencedTaskRunner* file_task_runner) | 332 base::SequencedTaskRunner* file_task_runner) |
| 333 : file_system_getter_(file_system_getter), | 333 : file_system_getter_(file_system_getter), |
| 334 file_task_runner_(file_task_runner), | 334 file_task_runner_(file_task_runner), |
| 335 weak_ptr_factory_(this) { | 335 weak_ptr_factory_(this) { |
| 336 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 336 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 337 } | 337 } |
| 338 | 338 |
| 339 DriveFileStreamReader::~DriveFileStreamReader() { | 339 DriveFileStreamReader::~DriveFileStreamReader() { |
| 340 } | 340 } |
| 341 | 341 |
| 342 bool DriveFileStreamReader::IsInitialized() const { | 342 bool DriveFileStreamReader::IsInitialized() const { |
| 343 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 343 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 344 return reader_proxy_.get() != NULL; | 344 return reader_proxy_.get() != NULL; |
| 345 } | 345 } |
| 346 | 346 |
| 347 void DriveFileStreamReader::Initialize( | 347 void DriveFileStreamReader::Initialize( |
| 348 const base::FilePath& drive_file_path, | 348 const base::FilePath& drive_file_path, |
| 349 const net::HttpByteRange& byte_range, | 349 const net::HttpByteRange& byte_range, |
| 350 const InitializeCompletionCallback& callback) { | 350 const InitializeCompletionCallback& callback) { |
| 351 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 351 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 352 DCHECK(!callback.is_null()); | 352 DCHECK(!callback.is_null()); |
| 353 | 353 |
| 354 GetFileContent( | 354 GetFileContent( |
| 355 file_system_getter_, | 355 file_system_getter_, |
| 356 drive_file_path, | 356 drive_file_path, |
| 357 base::Bind(&DriveFileStreamReader | 357 base::Bind(&DriveFileStreamReader |
| 358 ::InitializeAfterGetFileContentInitialized, | 358 ::InitializeAfterGetFileContentInitialized, |
| 359 weak_ptr_factory_.GetWeakPtr(), | 359 weak_ptr_factory_.GetWeakPtr(), |
| 360 byte_range, | 360 byte_range, |
| 361 callback), | 361 callback), |
| 362 base::Bind(&DriveFileStreamReader::OnGetContent, | 362 base::Bind(&DriveFileStreamReader::OnGetContent, |
| 363 weak_ptr_factory_.GetWeakPtr()), | 363 weak_ptr_factory_.GetWeakPtr()), |
| 364 base::Bind(&DriveFileStreamReader::OnGetFileContentCompletion, | 364 base::Bind(&DriveFileStreamReader::OnGetFileContentCompletion, |
| 365 weak_ptr_factory_.GetWeakPtr(), | 365 weak_ptr_factory_.GetWeakPtr(), |
| 366 callback), | 366 callback), |
| 367 base::Bind(&DriveFileStreamReader::StoreCancelDownloadClosure, | 367 base::Bind(&DriveFileStreamReader::StoreCancelDownloadClosure, |
| 368 weak_ptr_factory_.GetWeakPtr())); | 368 weak_ptr_factory_.GetWeakPtr())); |
| 369 } | 369 } |
| 370 | 370 |
| 371 int DriveFileStreamReader::Read(net::IOBuffer* buffer, int buffer_length, | 371 int DriveFileStreamReader::Read(net::IOBuffer* buffer, int buffer_length, |
| 372 const net::CompletionCallback& callback) { | 372 const net::CompletionCallback& callback) { |
| 373 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 373 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 374 DCHECK(reader_proxy_); | 374 DCHECK(reader_proxy_); |
| 375 DCHECK(buffer); | 375 DCHECK(buffer); |
| 376 DCHECK(!callback.is_null()); | 376 DCHECK(!callback.is_null()); |
| 377 return reader_proxy_->Read(buffer, buffer_length, callback); | 377 return reader_proxy_->Read(buffer, buffer_length, callback); |
| 378 } | 378 } |
| 379 | 379 |
| 380 void DriveFileStreamReader::StoreCancelDownloadClosure( | 380 void DriveFileStreamReader::StoreCancelDownloadClosure( |
| 381 const base::Closure& cancel_download_closure) { | 381 const base::Closure& cancel_download_closure) { |
| 382 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 382 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 383 cancel_download_closure_ = cancel_download_closure; | 383 cancel_download_closure_ = cancel_download_closure; |
| 384 } | 384 } |
| 385 | 385 |
| 386 void DriveFileStreamReader::InitializeAfterGetFileContentInitialized( | 386 void DriveFileStreamReader::InitializeAfterGetFileContentInitialized( |
| 387 const net::HttpByteRange& byte_range, | 387 const net::HttpByteRange& byte_range, |
| 388 const InitializeCompletionCallback& callback, | 388 const InitializeCompletionCallback& callback, |
| 389 FileError error, | 389 FileError error, |
| 390 const base::FilePath& local_cache_file_path, | 390 const base::FilePath& local_cache_file_path, |
| 391 scoped_ptr<ResourceEntry> entry) { | 391 scoped_ptr<ResourceEntry> entry) { |
| 392 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 392 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 393 // StoreCancelDownloadClosure() should be called before this function. | 393 // StoreCancelDownloadClosure() should be called before this function. |
| 394 DCHECK(!cancel_download_closure_.is_null()); | 394 DCHECK(!cancel_download_closure_.is_null()); |
| 395 | 395 |
| 396 if (error != FILE_ERROR_OK) { | 396 if (error != FILE_ERROR_OK) { |
| 397 callback.Run(FileErrorToNetError(error), scoped_ptr<ResourceEntry>()); | 397 callback.Run(FileErrorToNetError(error), scoped_ptr<ResourceEntry>()); |
| 398 return; | 398 return; |
| 399 } | 399 } |
| 400 DCHECK(entry); | 400 DCHECK(entry); |
| 401 | 401 |
| 402 int64 range_start = 0, range_length = 0; | 402 int64 range_start = 0, range_length = 0; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 438 base::Passed(&entry), | 438 base::Passed(&entry), |
| 439 base::Passed(&file_reader))); | 439 base::Passed(&file_reader))); |
| 440 } | 440 } |
| 441 | 441 |
| 442 void DriveFileStreamReader::InitializeAfterLocalFileOpen( | 442 void DriveFileStreamReader::InitializeAfterLocalFileOpen( |
| 443 int64 length, | 443 int64 length, |
| 444 const InitializeCompletionCallback& callback, | 444 const InitializeCompletionCallback& callback, |
| 445 scoped_ptr<ResourceEntry> entry, | 445 scoped_ptr<ResourceEntry> entry, |
| 446 scoped_ptr<util::LocalFileReader> file_reader, | 446 scoped_ptr<util::LocalFileReader> file_reader, |
| 447 int open_result) { | 447 int open_result) { |
| 448 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 448 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 449 | 449 |
| 450 if (open_result != net::OK) { | 450 if (open_result != net::OK) { |
| 451 callback.Run(net::ERR_FAILED, scoped_ptr<ResourceEntry>()); | 451 callback.Run(net::ERR_FAILED, scoped_ptr<ResourceEntry>()); |
| 452 return; | 452 return; |
| 453 } | 453 } |
| 454 | 454 |
| 455 reader_proxy_.reset( | 455 reader_proxy_.reset( |
| 456 new internal::LocalReaderProxy(file_reader.Pass(), length)); | 456 new internal::LocalReaderProxy(file_reader.Pass(), length)); |
| 457 callback.Run(net::OK, entry.Pass()); | 457 callback.Run(net::OK, entry.Pass()); |
| 458 } | 458 } |
| 459 | 459 |
| 460 void DriveFileStreamReader::OnGetContent( | 460 void DriveFileStreamReader::OnGetContent( |
| 461 google_apis::DriveApiErrorCode error_code, | 461 google_apis::DriveApiErrorCode error_code, |
| 462 scoped_ptr<std::string> data) { | 462 scoped_ptr<std::string> data) { |
| 463 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 463 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 464 DCHECK(reader_proxy_); | 464 DCHECK(reader_proxy_); |
| 465 reader_proxy_->OnGetContent(data.Pass()); | 465 reader_proxy_->OnGetContent(data.Pass()); |
| 466 } | 466 } |
| 467 | 467 |
| 468 void DriveFileStreamReader::OnGetFileContentCompletion( | 468 void DriveFileStreamReader::OnGetFileContentCompletion( |
| 469 const InitializeCompletionCallback& callback, | 469 const InitializeCompletionCallback& callback, |
| 470 FileError error) { | 470 FileError error) { |
| 471 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 471 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 472 | 472 |
| 473 if (reader_proxy_) { | 473 if (reader_proxy_) { |
| 474 // If the proxy object available, send the error to it. | 474 // If the proxy object available, send the error to it. |
| 475 reader_proxy_->OnCompleted(error); | 475 reader_proxy_->OnCompleted(error); |
| 476 } else { | 476 } else { |
| 477 // Here the proxy object is not yet available. | 477 // Here the proxy object is not yet available. |
| 478 // There are two cases. 1) Some error happens during the initialization. | 478 // There are two cases. 1) Some error happens during the initialization. |
| 479 // 2) the cache file is found, but the proxy object is not *yet* | 479 // 2) the cache file is found, but the proxy object is not *yet* |
| 480 // initialized because the file is being opened. | 480 // initialized because the file is being opened. |
| 481 // We are interested in 1) only. The callback for 2) will be called | 481 // We are interested in 1) only. The callback for 2) will be called |
| 482 // after opening the file is completed. | 482 // after opening the file is completed. |
| 483 // Note: due to the same reason, LocalReaderProxy::OnCompleted may | 483 // Note: due to the same reason, LocalReaderProxy::OnCompleted may |
| 484 // or may not be called. This is timing issue, and it is difficult to avoid | 484 // or may not be called. This is timing issue, and it is difficult to avoid |
| 485 // unfortunately. | 485 // unfortunately. |
| 486 if (error != FILE_ERROR_OK) { | 486 if (error != FILE_ERROR_OK) { |
| 487 callback.Run(FileErrorToNetError(error), scoped_ptr<ResourceEntry>()); | 487 callback.Run(FileErrorToNetError(error), scoped_ptr<ResourceEntry>()); |
| 488 } | 488 } |
| 489 } | 489 } |
| 490 } | 490 } |
| 491 | 491 |
| 492 } // namespace drive | 492 } // namespace drive |
| OLD | NEW |