1// Copyright (c) 2013 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#ifndef NET_URL_REQUEST_URL_FETCHER_RESPONSE_WRITER_H_ 6#define NET_URL_REQUEST_URL_FETCHER_RESPONSE_WRITER_H_ 7 8#include <string> 9 10#include "base/basictypes.h" 11#include "base/files/file_path.h" 12#include "base/memory/ref_counted.h" 13#include "base/memory/scoped_ptr.h" 14#include "base/memory/weak_ptr.h" 15#include "net/base/completion_callback.h" 16#include "net/base/net_export.h" 17 18namespace base { 19class SequencedTaskRunner; 20} // namespace base 21 22namespace net { 23 24class DrainableIOBuffer; 25class FileStream; 26class IOBuffer; 27class URLFetcherFileWriter; 28class URLFetcherStringWriter; 29 30// This class encapsulates all state involved in writing URLFetcher response 31// bytes to the destination. 32class NET_EXPORT URLFetcherResponseWriter { 33 public: 34 virtual ~URLFetcherResponseWriter() {} 35 36 // Initializes this instance. If ERR_IO_PENDING is returned, |callback| will 37 // be run later with the result. Calling this method again after a 38 // Initialize() success results in discarding already written data. 39 virtual int Initialize(const CompletionCallback& callback) = 0; 40 41 // Writes |num_bytes| bytes in |buffer|, and returns the number of bytes 42 // written or an error code. If ERR_IO_PENDING is returned, |callback| will be 43 // run later with the result. 44 virtual int Write(IOBuffer* buffer, 45 int num_bytes, 46 const CompletionCallback& callback) = 0; 47 48 // Finishes writing. If ERR_IO_PENDING is returned, |callback| will be run 49 // later with the result. 50 virtual int Finish(const CompletionCallback& callback) = 0; 51 52 // Returns this instance's pointer as URLFetcherStringWriter when possible. 53 virtual URLFetcherStringWriter* AsStringWriter(); 54 55 // Returns this instance's pointer as URLFetcherFileWriter when possible. 56 virtual URLFetcherFileWriter* AsFileWriter(); 57}; 58 59// URLFetcherResponseWriter implementation for std::string. 60class NET_EXPORT URLFetcherStringWriter : public URLFetcherResponseWriter { 61 public: 62 URLFetcherStringWriter(); 63 virtual ~URLFetcherStringWriter(); 64 65 const std::string& data() const { return data_; } 66 67 // URLFetcherResponseWriter overrides: 68 virtual int Initialize(const CompletionCallback& callback) OVERRIDE; 69 virtual int Write(IOBuffer* buffer, 70 int num_bytes, 71 const CompletionCallback& callback) OVERRIDE; 72 virtual int Finish(const CompletionCallback& callback) OVERRIDE; 73 virtual URLFetcherStringWriter* AsStringWriter() OVERRIDE; 74 75 private: 76 std::string data_; 77 78 DISALLOW_COPY_AND_ASSIGN(URLFetcherStringWriter); 79}; 80 81// URLFetcherResponseWriter implementation for files. 82class NET_EXPORT URLFetcherFileWriter : public URLFetcherResponseWriter { 83 public: 84 // |file_path| is used as the destination path. If |file_path| is empty, 85 // Initialize() will create a temporary file. 86 URLFetcherFileWriter( 87 scoped_refptr<base::SequencedTaskRunner> file_task_runner, 88 const base::FilePath& file_path); 89 virtual ~URLFetcherFileWriter(); 90 91 const base::FilePath& file_path() const { return file_path_; } 92 93 // URLFetcherResponseWriter overrides: 94 virtual int Initialize(const CompletionCallback& callback) OVERRIDE; 95 virtual int Write(IOBuffer* buffer, 96 int num_bytes, 97 const CompletionCallback& callback) OVERRIDE; 98 virtual int Finish(const CompletionCallback& callback) OVERRIDE; 99 virtual URLFetcherFileWriter* AsFileWriter() OVERRIDE; 100 101 // Drops ownership of the file at |file_path_|. 102 // This class will not delete it or write to it again. 103 void DisownFile(); 104 105 private: 106 // Called when a write has been done. 107 void DidWrite(const CompletionCallback& callback, int result); 108 109 // Closes the file if it is open and then delete it. 110 void CloseAndDeleteFile(); 111 112 // Callback which gets the result of a temporary file creation. 113 void DidCreateTempFile(const CompletionCallback& callback, 114 base::FilePath* temp_file_path, 115 bool success); 116 117 // Callback which gets the result of FileStream::Open. 118 void DidOpenFile(const CompletionCallback& callback, 119 int result); 120 121 // Callback which gets the result of closing a file. 122 void CloseComplete(const CompletionCallback& callback, int result); 123 124 // Task runner on which file operations should happen. 125 scoped_refptr<base::SequencedTaskRunner> file_task_runner_; 126 127 // Destination file path. 128 // Initialize() creates a temporary file if this variable is empty. 129 base::FilePath file_path_; 130 131 // True when this instance is responsible to delete the file at |file_path_|. 132 bool owns_file_; 133 134 scoped_ptr<FileStream> file_stream_; 135 136 // Callbacks are created for use with base::FileUtilProxy. 137 base::WeakPtrFactory<URLFetcherFileWriter> weak_factory_; 138 139 DISALLOW_COPY_AND_ASSIGN(URLFetcherFileWriter); 140}; 141 142} // namespace net 143 144#endif // NET_URL_REQUEST_URL_FETCHER_RESPONSE_WRITER_H_ 145