OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/loader/upload_data_stream_builder.h" | 5 #include "content/browser/loader/upload_data_stream_builder.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <limits> | 9 #include <limits> |
10 #include <utility> | 10 #include <utility> |
11 #include <vector> | 11 #include <vector> |
12 | 12 |
13 #include "base/logging.h" | 13 #include "base/logging.h" |
14 #include "base/macros.h" | 14 #include "base/macros.h" |
15 #include "base/memory/ptr_util.h" | 15 #include "base/memory/ptr_util.h" |
16 #include "base/memory/ref_counted.h" | 16 #include "base/memory/ref_counted.h" |
17 #include "content/browser/fileapi/upload_file_system_file_element_reader.h" | 17 #include "content/browser/fileapi/upload_file_system_file_element_reader.h" |
18 #include "content/common/resource_request_body.h" | 18 #include "content/common/resource_request_body_impl.h" |
19 #include "net/base/elements_upload_data_stream.h" | 19 #include "net/base/elements_upload_data_stream.h" |
20 #include "net/base/upload_bytes_element_reader.h" | 20 #include "net/base/upload_bytes_element_reader.h" |
21 #include "net/base/upload_file_element_reader.h" | 21 #include "net/base/upload_file_element_reader.h" |
22 #include "storage/browser/blob/blob_data_handle.h" | 22 #include "storage/browser/blob/blob_data_handle.h" |
23 #include "storage/browser/blob/blob_reader.h" | 23 #include "storage/browser/blob/blob_reader.h" |
24 #include "storage/browser/blob/blob_storage_context.h" | 24 #include "storage/browser/blob/blob_storage_context.h" |
25 #include "storage/browser/blob/upload_blob_element_reader.h" | 25 #include "storage/browser/blob/upload_blob_element_reader.h" |
26 | 26 |
27 namespace disk_cache { | 27 namespace disk_cache { |
28 class Entry; | 28 class Entry; |
29 } | 29 } |
30 | 30 |
31 namespace content { | 31 namespace content { |
32 namespace { | 32 namespace { |
33 | 33 |
34 // A subclass of net::UploadBytesElementReader which owns ResourceRequestBody. | 34 // A subclass of net::UploadBytesElementReader which owns |
| 35 // ResourceRequestBodyImpl. |
35 class BytesElementReader : public net::UploadBytesElementReader { | 36 class BytesElementReader : public net::UploadBytesElementReader { |
36 public: | 37 public: |
37 BytesElementReader(ResourceRequestBody* resource_request_body, | 38 BytesElementReader(ResourceRequestBodyImpl* resource_request_body, |
38 const ResourceRequestBody::Element& element) | 39 const ResourceRequestBodyImpl::Element& element) |
39 : net::UploadBytesElementReader(element.bytes(), element.length()), | 40 : net::UploadBytesElementReader(element.bytes(), element.length()), |
40 resource_request_body_(resource_request_body) { | 41 resource_request_body_(resource_request_body) { |
41 DCHECK_EQ(ResourceRequestBody::Element::TYPE_BYTES, element.type()); | 42 DCHECK_EQ(ResourceRequestBodyImpl::Element::TYPE_BYTES, element.type()); |
42 } | 43 } |
43 | 44 |
44 ~BytesElementReader() override {} | 45 ~BytesElementReader() override {} |
45 | 46 |
46 private: | 47 private: |
47 scoped_refptr<ResourceRequestBody> resource_request_body_; | 48 scoped_refptr<ResourceRequestBodyImpl> resource_request_body_; |
48 | 49 |
49 DISALLOW_COPY_AND_ASSIGN(BytesElementReader); | 50 DISALLOW_COPY_AND_ASSIGN(BytesElementReader); |
50 }; | 51 }; |
51 | 52 |
52 // A subclass of net::UploadFileElementReader which owns ResourceRequestBody. | 53 // A subclass of net::UploadFileElementReader which owns |
| 54 // ResourceRequestBodyImpl. |
53 // This class is necessary to ensure the BlobData and any attached shareable | 55 // This class is necessary to ensure the BlobData and any attached shareable |
54 // files survive until upload completion. | 56 // files survive until upload completion. |
55 class FileElementReader : public net::UploadFileElementReader { | 57 class FileElementReader : public net::UploadFileElementReader { |
56 public: | 58 public: |
57 FileElementReader(ResourceRequestBody* resource_request_body, | 59 FileElementReader(ResourceRequestBodyImpl* resource_request_body, |
58 base::TaskRunner* task_runner, | 60 base::TaskRunner* task_runner, |
59 const ResourceRequestBody::Element& element) | 61 const ResourceRequestBodyImpl::Element& element) |
60 : net::UploadFileElementReader(task_runner, | 62 : net::UploadFileElementReader(task_runner, |
61 element.path(), | 63 element.path(), |
62 element.offset(), | 64 element.offset(), |
63 element.length(), | 65 element.length(), |
64 element.expected_modification_time()), | 66 element.expected_modification_time()), |
65 resource_request_body_(resource_request_body) { | 67 resource_request_body_(resource_request_body) { |
66 DCHECK_EQ(ResourceRequestBody::Element::TYPE_FILE, element.type()); | 68 DCHECK_EQ(ResourceRequestBodyImpl::Element::TYPE_FILE, element.type()); |
67 } | 69 } |
68 | 70 |
69 ~FileElementReader() override {} | 71 ~FileElementReader() override {} |
70 | 72 |
71 private: | 73 private: |
72 scoped_refptr<ResourceRequestBody> resource_request_body_; | 74 scoped_refptr<ResourceRequestBodyImpl> resource_request_body_; |
73 | 75 |
74 DISALLOW_COPY_AND_ASSIGN(FileElementReader); | 76 DISALLOW_COPY_AND_ASSIGN(FileElementReader); |
75 }; | 77 }; |
76 | 78 |
77 } // namespace | 79 } // namespace |
78 | 80 |
79 std::unique_ptr<net::UploadDataStream> UploadDataStreamBuilder::Build( | 81 std::unique_ptr<net::UploadDataStream> UploadDataStreamBuilder::Build( |
80 ResourceRequestBody* body, | 82 ResourceRequestBodyImpl* body, |
81 storage::BlobStorageContext* blob_context, | 83 storage::BlobStorageContext* blob_context, |
82 storage::FileSystemContext* file_system_context, | 84 storage::FileSystemContext* file_system_context, |
83 base::SingleThreadTaskRunner* file_task_runner) { | 85 base::SingleThreadTaskRunner* file_task_runner) { |
84 std::vector<std::unique_ptr<net::UploadElementReader>> element_readers; | 86 std::vector<std::unique_ptr<net::UploadElementReader>> element_readers; |
85 for (const auto& element : *body->elements()) { | 87 for (const auto& element : *body->elements()) { |
86 switch (element.type()) { | 88 switch (element.type()) { |
87 case ResourceRequestBody::Element::TYPE_BYTES: | 89 case ResourceRequestBodyImpl::Element::TYPE_BYTES: |
88 element_readers.push_back( | 90 element_readers.push_back( |
89 base::WrapUnique(new BytesElementReader(body, element))); | 91 base::WrapUnique(new BytesElementReader(body, element))); |
90 break; | 92 break; |
91 case ResourceRequestBody::Element::TYPE_FILE: | 93 case ResourceRequestBodyImpl::Element::TYPE_FILE: |
92 element_readers.push_back(base::WrapUnique( | 94 element_readers.push_back(base::WrapUnique( |
93 new FileElementReader(body, file_task_runner, element))); | 95 new FileElementReader(body, file_task_runner, element))); |
94 break; | 96 break; |
95 case ResourceRequestBody::Element::TYPE_FILE_FILESYSTEM: | 97 case ResourceRequestBodyImpl::Element::TYPE_FILE_FILESYSTEM: |
96 // If |body| contains any filesystem URLs, the caller should have | 98 // If |body| contains any filesystem URLs, the caller should have |
97 // supplied a FileSystemContext. | 99 // supplied a FileSystemContext. |
98 DCHECK(file_system_context); | 100 DCHECK(file_system_context); |
99 element_readers.push_back( | 101 element_readers.push_back( |
100 base::WrapUnique(new content::UploadFileSystemFileElementReader( | 102 base::WrapUnique(new content::UploadFileSystemFileElementReader( |
101 file_system_context, element.filesystem_url(), element.offset(), | 103 file_system_context, element.filesystem_url(), element.offset(), |
102 element.length(), element.expected_modification_time()))); | 104 element.length(), element.expected_modification_time()))); |
103 break; | 105 break; |
104 case ResourceRequestBody::Element::TYPE_BLOB: { | 106 case ResourceRequestBodyImpl::Element::TYPE_BLOB: { |
105 DCHECK_EQ(std::numeric_limits<uint64_t>::max(), element.length()); | 107 DCHECK_EQ(std::numeric_limits<uint64_t>::max(), element.length()); |
106 DCHECK_EQ(0ul, element.offset()); | 108 DCHECK_EQ(0ul, element.offset()); |
107 std::unique_ptr<storage::BlobDataHandle> handle = | 109 std::unique_ptr<storage::BlobDataHandle> handle = |
108 blob_context->GetBlobDataFromUUID(element.blob_uuid()); | 110 blob_context->GetBlobDataFromUUID(element.blob_uuid()); |
109 element_readers.push_back( | 111 element_readers.push_back( |
110 base::WrapUnique(new storage::UploadBlobElementReader( | 112 base::WrapUnique(new storage::UploadBlobElementReader( |
111 std::move(handle), file_system_context, file_task_runner))); | 113 std::move(handle), file_system_context, file_task_runner))); |
112 break; | 114 break; |
113 } | 115 } |
114 case ResourceRequestBody::Element::TYPE_DISK_CACHE_ENTRY: | 116 case ResourceRequestBodyImpl::Element::TYPE_DISK_CACHE_ENTRY: |
115 case ResourceRequestBody::Element::TYPE_BYTES_DESCRIPTION: | 117 case ResourceRequestBodyImpl::Element::TYPE_BYTES_DESCRIPTION: |
116 case ResourceRequestBody::Element::TYPE_UNKNOWN: | 118 case ResourceRequestBodyImpl::Element::TYPE_UNKNOWN: |
117 NOTREACHED(); | 119 NOTREACHED(); |
118 break; | 120 break; |
119 } | 121 } |
120 } | 122 } |
121 | 123 |
122 return base::WrapUnique(new net::ElementsUploadDataStream( | 124 return base::WrapUnique(new net::ElementsUploadDataStream( |
123 std::move(element_readers), body->identifier())); | 125 std::move(element_readers), body->identifier())); |
124 } | 126 } |
125 | 127 |
126 } // namespace content | 128 } // namespace content |
OLD | NEW |