| // Copyright 2013 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "services/network/public/cpp/data_element.h" |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| |
| #include <algorithm> |
| |
| #include "base/notreached.h" |
| #include "base/strings/string_number_conversions.h" |
| #include "base/strings/string_view_util.h" |
| #include "mojo/public/cpp/bindings/remote.h" |
| #include "services/network/public/mojom/chunked_data_pipe_getter.mojom.h" |
| #include "services/network/public/mojom/data_pipe_getter.mojom.h" |
| |
| namespace network { |
| |
| DataElementBytes::DataElementBytes() = default; |
| DataElementBytes::DataElementBytes(std::vector<uint8_t> bytes) |
| : bytes_(std::move(bytes)) {} |
| DataElementBytes::DataElementBytes(DataElementBytes&& other) = default; |
| DataElementBytes& DataElementBytes::operator=(DataElementBytes&& other) = |
| default; |
| DataElementBytes::~DataElementBytes() = default; |
| |
| std::string_view DataElementBytes::AsStringView() const { |
| return base::as_string_view(bytes_); |
| } |
| |
| DataElementBytes DataElementBytes::Clone() const { |
| return DataElementBytes(bytes_); |
| } |
| |
| DataElementDataPipe::DataElementDataPipe() = default; |
| DataElementDataPipe::DataElementDataPipe( |
| mojo::PendingRemote<mojom::DataPipeGetter> data_pipe_getter) |
| : data_pipe_getter_(std::move(data_pipe_getter)) { |
| DCHECK(data_pipe_getter_); |
| } |
| DataElementDataPipe::DataElementDataPipe(DataElementDataPipe&&) = default; |
| DataElementDataPipe& DataElementDataPipe::operator=( |
| DataElementDataPipe&& other) = default; |
| DataElementDataPipe::~DataElementDataPipe() = default; |
| |
| mojo::PendingRemote<mojom::DataPipeGetter> |
| DataElementDataPipe::ReleaseDataPipeGetter() { |
| DCHECK(data_pipe_getter_.is_valid()); |
| return std::move(data_pipe_getter_); |
| } |
| |
| mojo::PendingRemote<mojom::DataPipeGetter> |
| DataElementDataPipe::CloneDataPipeGetter() const { |
| DCHECK(data_pipe_getter_.is_valid()); |
| auto* mutable_this = const_cast<DataElementDataPipe*>(this); |
| mojo::Remote<mojom::DataPipeGetter> owned( |
| std::move(mutable_this->data_pipe_getter_)); |
| mojo::PendingRemote<mojom::DataPipeGetter> clone; |
| owned->Clone(clone.InitWithNewPipeAndPassReceiver()); |
| mutable_this->data_pipe_getter_ = owned.Unbind(); |
| return clone; |
| } |
| |
| DataElementDataPipe DataElementDataPipe::Clone() const { |
| return DataElementDataPipe(CloneDataPipeGetter()); |
| } |
| |
| DataElementChunkedDataPipe::DataElementChunkedDataPipe() = default; |
| DataElementChunkedDataPipe::DataElementChunkedDataPipe( |
| mojo::PendingRemote<mojom::ChunkedDataPipeGetter> chunked_data_pipe_getter, |
| ReadOnlyOnce read_only_once) |
| : chunked_data_pipe_getter_(std::move(chunked_data_pipe_getter)), |
| read_only_once_(read_only_once) { |
| DCHECK(chunked_data_pipe_getter_); |
| } |
| DataElementChunkedDataPipe::DataElementChunkedDataPipe( |
| DataElementChunkedDataPipe&& other) = default; |
| DataElementChunkedDataPipe& DataElementChunkedDataPipe::operator=( |
| DataElementChunkedDataPipe&& other) = default; |
| DataElementChunkedDataPipe::~DataElementChunkedDataPipe() = default; |
| |
| mojo::PendingRemote<mojom::ChunkedDataPipeGetter> |
| DataElementChunkedDataPipe::ReleaseChunkedDataPipeGetter() { |
| DCHECK(chunked_data_pipe_getter_.is_valid()); |
| return std::move(chunked_data_pipe_getter_); |
| } |
| |
| DataElementFile::DataElementFile() = default; |
| DataElementFile::DataElementFile(const base::FilePath& path, |
| uint64_t offset, |
| uint64_t length, |
| base::Time expected_modification_time) |
| : path_(path), |
| offset_(offset), |
| length_(length), |
| expected_modification_time_(expected_modification_time) {} |
| DataElementFile::DataElementFile(const DataElementFile&) = default; |
| DataElementFile& DataElementFile::operator=(const DataElementFile&) = default; |
| DataElementFile::DataElementFile(DataElementFile&&) = default; |
| DataElementFile& DataElementFile::operator=(DataElementFile&&) = default; |
| DataElementFile::~DataElementFile() = default; |
| |
| DataElement::DataElement() = default; |
| DataElement::DataElement(DataElement&& other) = default; |
| DataElement& DataElement::operator=(DataElement&& other) = default; |
| DataElement::~DataElement() = default; |
| |
| DataElement DataElement::Clone() const { |
| switch (type()) { |
| case Tag::kBytes: |
| return DataElement(As<DataElementBytes>().Clone()); |
| case network::DataElement::Tag::kDataPipe: |
| return DataElement(As<DataElementDataPipe>().Clone()); |
| case network::DataElement::Tag::kFile: |
| return DataElement(As<DataElementFile>()); |
| case network::DataElement::Tag::kChunkedDataPipe: |
| // DataElementChunkedDataPipe is not generally copyable, especially if |
| // `read_only_once` is true. |
| // We want to be strict on this case, and use NOTREACHED(). |
| NOTREACHED(); |
| } |
| } |
| |
| } // namespace network |