15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/local_file_stream_writer.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/file_stream.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/io_buffer.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace storage { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kOpenFlagsForWrite = base::File::FLAG_OPEN | 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::File::FLAG_WRITE | 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::File::FLAG_ASYNC; 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kCreateFlagsForWrite = base::File::FLAG_CREATE | 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::File::FLAG_WRITE | 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::File::FLAG_ASYNC; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)FileStreamWriter* FileStreamWriter::CreateForLocalFile( 27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::TaskRunner* task_runner, 28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::FilePath& file_path, 2923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int64 initial_offset, 3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) OpenOrCreate open_or_create) { 3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return new LocalFileStreamWriter( 3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) task_runner, file_path, initial_offset, open_or_create); 33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocalFileStreamWriter::~LocalFileStreamWriter() { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalidate weak pointers so that we won't receive any callbacks from 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in-flight stream operations, which might be triggered during the file close 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the FileStream destructor. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory_.InvalidateWeakPtrs(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FileStream's destructor closes the file safely, since we opened the file 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by its Open() method. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int LocalFileStreamWriter::Write(net::IOBuffer* buf, int buf_len, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!has_pending_operation_); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(cancel_callback_.is_null()); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_pending_operation_ = true; 51b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (stream_impl_) { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = InitiateWrite(buf, buf_len, callback); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result != net::ERR_IO_PENDING) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_pending_operation_ = false; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InitiateOpen(callback, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&LocalFileStreamWriter::ReadyToWrite, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory_.GetWeakPtr(), 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) make_scoped_refptr(buf), buf_len, callback)); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int LocalFileStreamWriter::Cancel(const net::CompletionCallback& callback) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!has_pending_operation_) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return net::ERR_UNEXPECTED; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!callback.is_null()); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancel_callback_ = callback; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return net::ERR_IO_PENDING; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int LocalFileStreamWriter::Flush(const net::CompletionCallback& callback) { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!has_pending_operation_); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(cancel_callback_.is_null()); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Write() is not called yet, so there's nothing to flush. 77b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (!stream_impl_) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return net::OK; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_pending_operation_ = true; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = InitiateFlush(callback); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result != net::ERR_IO_PENDING) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_pending_operation_ = false; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)LocalFileStreamWriter::LocalFileStreamWriter(base::TaskRunner* task_runner, 88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::FilePath& file_path, 8923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int64 initial_offset, 9023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) OpenOrCreate open_or_create) 91d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) : file_path_(file_path), 9223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) open_or_create_(open_or_create), 93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) initial_offset_(initial_offset), 941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) task_runner_(task_runner), 95d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) has_pending_operation_(false), 961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) weak_factory_(this) {} 97d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int LocalFileStreamWriter::InitiateOpen( 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& error_callback, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& main_operation) { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(has_pending_operation_); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!stream_impl_.get()); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch stream_impl_.reset(new net::FileStream(task_runner_)); 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 10623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int open_flags = 0; 10723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) switch (open_or_create_) { 10823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) case OPEN_EXISTING_FILE: 10923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) open_flags = kOpenFlagsForWrite; 11023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) break; 11123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) case CREATE_NEW_FILE: 11223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) open_flags = kCreateFlagsForWrite; 11323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) break; 11423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 11523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return stream_impl_->Open(file_path_, 11723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) open_flags, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&LocalFileStreamWriter::DidOpen, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory_.GetWeakPtr(), 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_callback, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_operation)); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocalFileStreamWriter::DidOpen( 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& error_callback, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& main_operation, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(has_pending_operation_); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(stream_impl_.get()); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CancelIfRequested()) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result != net::OK) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_pending_operation_ = false; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stream_impl_.reset(NULL); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_callback.Run(result); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitiateSeek(error_callback, main_operation); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocalFileStreamWriter::InitiateSeek( 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& error_callback, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& main_operation) { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(has_pending_operation_); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(stream_impl_.get()); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (initial_offset_ == 0) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No need to seek. 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_operation.Run(); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int result = stream_impl_->Seek(base::File::FROM_BEGIN, initial_offset_, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&LocalFileStreamWriter::DidSeek, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory_.GetWeakPtr(), 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_callback, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_operation)); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result != net::ERR_IO_PENDING) { 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_pending_operation_ = false; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_callback.Run(result); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocalFileStreamWriter::DidSeek( 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& error_callback, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& main_operation, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 result) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(has_pending_operation_); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CancelIfRequested()) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result != initial_offset_) { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(kinaba) add a more specific error code. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = net::ERR_FAILED; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result < 0) { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_pending_operation_ = false; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_callback.Run(static_cast<int>(result)); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_operation.Run(); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocalFileStreamWriter::ReadyToWrite( 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::IOBuffer* buf, int buf_len, 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback) { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(has_pending_operation_); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = InitiateWrite(buf, buf_len, callback); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result != net::ERR_IO_PENDING) { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_pending_operation_ = false; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(result); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int LocalFileStreamWriter::InitiateWrite( 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::IOBuffer* buf, int buf_len, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback) { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(has_pending_operation_); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(stream_impl_.get()); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return stream_impl_->Write(buf, buf_len, 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&LocalFileStreamWriter::DidWrite, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory_.GetWeakPtr(), 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback)); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocalFileStreamWriter::DidWrite(const net::CompletionCallback& callback, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(has_pending_operation_); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CancelIfRequested()) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_pending_operation_ = false; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(result); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int LocalFileStreamWriter::InitiateFlush( 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(has_pending_operation_); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(stream_impl_.get()); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return stream_impl_->Flush(base::Bind(&LocalFileStreamWriter::DidFlush, 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory_.GetWeakPtr(), 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback)); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocalFileStreamWriter::DidFlush(const net::CompletionCallback& callback, 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result) { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(has_pending_operation_); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CancelIfRequested()) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_pending_operation_ = false; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(result); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LocalFileStreamWriter::CancelIfRequested() { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(has_pending_operation_); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cancel_callback_.is_null()) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CompletionCallback pending_cancel = cancel_callback_; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_pending_operation_ = false; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancel_callback_.Reset(); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_cancel.Run(net::OK); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // namespace storage 258