|  | // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "net/base/file_stream.h" | 
|  |  | 
|  | #include <utility> | 
|  |  | 
|  | #include "base/profiler/scoped_tracker.h" | 
|  | #include "net/base/file_stream_context.h" | 
|  | #include "net/base/net_errors.h" | 
|  |  | 
|  | namespace net { | 
|  |  | 
|  | FileStream::FileStream(const scoped_refptr<base::TaskRunner>& task_runner) | 
|  | : context_(new Context(task_runner)) { | 
|  | } | 
|  |  | 
|  | FileStream::FileStream(base::File file, | 
|  | const scoped_refptr<base::TaskRunner>& task_runner) | 
|  | : context_(new Context(std::move(file), task_runner)) {} | 
|  |  | 
|  | FileStream::~FileStream() { | 
|  | context_.release()->Orphan(); | 
|  | } | 
|  |  | 
|  | int FileStream::Open(const base::FilePath& path, int open_flags, | 
|  | const CompletionCallback& callback) { | 
|  | if (IsOpen()) { | 
|  | DLOG(FATAL) << "File is already open!"; | 
|  | return ERR_UNEXPECTED; | 
|  | } | 
|  |  | 
|  | DCHECK(open_flags & base::File::FLAG_ASYNC); | 
|  | context_->Open(path, open_flags, callback); | 
|  | return ERR_IO_PENDING; | 
|  | } | 
|  |  | 
|  | int FileStream::Close(const CompletionCallback& callback) { | 
|  | context_->Close(callback); | 
|  | return ERR_IO_PENDING; | 
|  | } | 
|  |  | 
|  | bool FileStream::IsOpen() const { | 
|  | return context_->IsOpen(); | 
|  | } | 
|  |  | 
|  | int FileStream::Seek(int64_t offset, const Int64CompletionCallback& callback) { | 
|  | if (!IsOpen()) | 
|  | return ERR_UNEXPECTED; | 
|  |  | 
|  | context_->Seek(offset, callback); | 
|  | return ERR_IO_PENDING; | 
|  | } | 
|  |  | 
|  | int FileStream::Read(IOBuffer* buf, | 
|  | int buf_len, | 
|  | const CompletionCallback& callback) { | 
|  | // TODO(rvargas): Remove ScopedTracker below once crbug.com/475751 is fixed. | 
|  | tracked_objects::ScopedTracker tracking_profile( | 
|  | FROM_HERE_WITH_EXPLICIT_FUNCTION("475751 FileStream::Read")); | 
|  |  | 
|  | if (!IsOpen()) | 
|  | return ERR_UNEXPECTED; | 
|  |  | 
|  | // read(..., 0) will return 0, which indicates end-of-file. | 
|  | DCHECK_GT(buf_len, 0); | 
|  |  | 
|  | return context_->Read(buf, buf_len, callback); | 
|  | } | 
|  |  | 
|  | int FileStream::Write(IOBuffer* buf, | 
|  | int buf_len, | 
|  | const CompletionCallback& callback) { | 
|  | if (!IsOpen()) | 
|  | return ERR_UNEXPECTED; | 
|  |  | 
|  | DCHECK_GE(buf_len, 0); | 
|  | return context_->Write(buf, buf_len, callback); | 
|  | } | 
|  |  | 
|  | int FileStream::Flush(const CompletionCallback& callback) { | 
|  | if (!IsOpen()) | 
|  | return ERR_UNEXPECTED; | 
|  |  | 
|  | context_->Flush(callback); | 
|  | return ERR_IO_PENDING; | 
|  | } | 
|  |  | 
|  | }  // namespace net |