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