Home | History | Annotate | Download | only in base
      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
      3 // found in the LICENSE file.
      4 
      5 #include "net/base/file_stream.h"
      6 
      7 #include "net/base/file_stream_context.h"
      8 #include "net/base/net_errors.h"
      9 
     10 namespace net {
     11 
     12 FileStream::FileStream(const scoped_refptr<base::TaskRunner>& task_runner)
     13     : context_(new Context(task_runner)) {
     14 }
     15 
     16 FileStream::FileStream(base::File file,
     17                        const scoped_refptr<base::TaskRunner>& task_runner)
     18     : context_(new Context(file.Pass(), task_runner)) {
     19 }
     20 
     21 FileStream::~FileStream() {
     22   context_.release()->Orphan();
     23 }
     24 
     25 int FileStream::Open(const base::FilePath& path, int open_flags,
     26                      const CompletionCallback& callback) {
     27   if (IsOpen()) {
     28     DLOG(FATAL) << "File is already open!";
     29     return ERR_UNEXPECTED;
     30   }
     31 
     32   DCHECK(open_flags & base::File::FLAG_ASYNC);
     33   context_->OpenAsync(path, open_flags, callback);
     34   return ERR_IO_PENDING;
     35 }
     36 
     37 int FileStream::Close(const CompletionCallback& callback) {
     38   context_->CloseAsync(callback);
     39   return ERR_IO_PENDING;
     40 }
     41 
     42 bool FileStream::IsOpen() const {
     43   return context_->file().IsValid();
     44 }
     45 
     46 int FileStream::Seek(Whence whence,
     47                      int64 offset,
     48                      const Int64CompletionCallback& callback) {
     49   if (!IsOpen())
     50     return ERR_UNEXPECTED;
     51 
     52   context_->SeekAsync(whence, offset, callback);
     53   return ERR_IO_PENDING;
     54 }
     55 
     56 int FileStream::Read(IOBuffer* buf,
     57                      int buf_len,
     58                      const CompletionCallback& callback) {
     59   if (!IsOpen())
     60     return ERR_UNEXPECTED;
     61 
     62   // read(..., 0) will return 0, which indicates end-of-file.
     63   DCHECK_GT(buf_len, 0);
     64 
     65   return context_->ReadAsync(buf, buf_len, callback);
     66 }
     67 
     68 int FileStream::Write(IOBuffer* buf,
     69                       int buf_len,
     70                       const CompletionCallback& callback) {
     71   if (!IsOpen())
     72     return ERR_UNEXPECTED;
     73 
     74   // write(..., 0) will return 0, which indicates end-of-file.
     75   DCHECK_GT(buf_len, 0);
     76 
     77   return context_->WriteAsync(buf, buf_len, callback);
     78 }
     79 
     80 int FileStream::Flush(const CompletionCallback& callback) {
     81   if (!IsOpen())
     82     return ERR_UNEXPECTED;
     83 
     84   context_->FlushAsync(callback);
     85   return ERR_IO_PENDING;
     86 }
     87 
     88 const base::File& FileStream::GetFileForTesting() const {
     89   return context_->file();
     90 }
     91 
     92 }  // namespace net
     93