| OLD | NEW |
| (Empty) |
| 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 | |
| 18 namespace base { | |
| 19 class SequencedTaskRunner; | |
| 20 } // namespace base | |
| 21 | |
| 22 namespace net { | |
| 23 | |
| 24 class DrainableIOBuffer; | |
| 25 class FileStream; | |
| 26 class IOBuffer; | |
| 27 class URLFetcherFileWriter; | |
| 28 class URLFetcherStringWriter; | |
| 29 | |
| 30 // This class encapsulates all state involved in writing URLFetcher response | |
| 31 // bytes to the destination. | |
| 32 class 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. | |
| 60 class NET_EXPORT URLFetcherStringWriter : public URLFetcherResponseWriter { | |
| 61 public: | |
| 62 URLFetcherStringWriter(); | |
| 63 ~URLFetcherStringWriter() override; | |
| 64 | |
| 65 const std::string& data() const { return data_; } | |
| 66 | |
| 67 // URLFetcherResponseWriter overrides: | |
| 68 int Initialize(const CompletionCallback& callback) override; | |
| 69 int Write(IOBuffer* buffer, | |
| 70 int num_bytes, | |
| 71 const CompletionCallback& callback) override; | |
| 72 int Finish(const CompletionCallback& callback) override; | |
| 73 URLFetcherStringWriter* AsStringWriter() override; | |
| 74 | |
| 75 private: | |
| 76 std::string data_; | |
| 77 | |
| 78 DISALLOW_COPY_AND_ASSIGN(URLFetcherStringWriter); | |
| 79 }; | |
| 80 | |
| 81 // URLFetcherResponseWriter implementation for files. | |
| 82 class 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 ~URLFetcherFileWriter() override; | |
| 90 | |
| 91 const base::FilePath& file_path() const { return file_path_; } | |
| 92 | |
| 93 // URLFetcherResponseWriter overrides: | |
| 94 int Initialize(const CompletionCallback& callback) override; | |
| 95 int Write(IOBuffer* buffer, | |
| 96 int num_bytes, | |
| 97 const CompletionCallback& callback) override; | |
| 98 int Finish(const CompletionCallback& callback) override; | |
| 99 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_ | |
| OLD | NEW |