|  | // Copyright 2014 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "mojo/public/cpp/system/data_pipe_drainer.h" | 
|  |  | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include <utility> | 
|  |  | 
|  | #include "base/functional/bind.h" | 
|  | #include "base/task/sequenced_task_runner.h" | 
|  |  | 
|  | namespace mojo { | 
|  |  | 
|  | DataPipeDrainer::DataPipeDrainer(Client* client, | 
|  | mojo::ScopedDataPipeConsumerHandle source) | 
|  | : client_(client), | 
|  | source_(std::move(source)), | 
|  | handle_watcher_(FROM_HERE, | 
|  | SimpleWatcher::ArmingPolicy::AUTOMATIC, | 
|  | base::SequencedTaskRunner::GetCurrentDefault()) { | 
|  | DCHECK(client_); | 
|  | handle_watcher_.Watch(source_.get(), MOJO_HANDLE_SIGNAL_READABLE, | 
|  | base::BindRepeating(&DataPipeDrainer::WaitComplete, | 
|  | weak_factory_.GetWeakPtr())); | 
|  | } | 
|  |  | 
|  | DataPipeDrainer::~DataPipeDrainer() {} | 
|  |  | 
|  | void DataPipeDrainer::ReadData() { | 
|  | base::span<const uint8_t> buffer; | 
|  | MojoResult rv = source_->BeginReadData(MOJO_READ_DATA_FLAG_NONE, buffer); | 
|  | if (rv == MOJO_RESULT_OK) { | 
|  | client_->OnDataAvailable(buffer); | 
|  | source_->EndReadData(buffer.size()); | 
|  | } else if (rv == MOJO_RESULT_FAILED_PRECONDITION) { | 
|  | client_->OnDataComplete(); | 
|  | } else if (rv != MOJO_RESULT_SHOULD_WAIT) { | 
|  | DCHECK(false) << "Unhandled MojoResult: " << rv; | 
|  | } | 
|  | } | 
|  |  | 
|  | void DataPipeDrainer::WaitComplete(MojoResult result) { | 
|  | ReadData(); | 
|  | } | 
|  |  | 
|  | }  // namespace mojo |