// Copyright 2014 The Chromium Authors. All rights reserved. // 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 #include #include "base/bind.h" namespace mojo { DataPipeDrainer::DataPipeDrainer(Client* client, mojo::ScopedDataPipeConsumerHandle source) : client_(client), source_(std::move(source)), handle_watcher_(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC, base::SequencedTaskRunnerHandle::Get()), weak_factory_(this) { DCHECK(client_); handle_watcher_.Watch( source_.get(), MOJO_HANDLE_SIGNAL_READABLE, base::Bind(&DataPipeDrainer::WaitComplete, weak_factory_.GetWeakPtr())); } DataPipeDrainer::~DataPipeDrainer() {} void DataPipeDrainer::ReadData() { const void* buffer = nullptr; uint32_t num_bytes = 0; MojoResult rv = source_->BeginReadData(&buffer, &num_bytes, MOJO_READ_DATA_FLAG_NONE); if (rv == MOJO_RESULT_OK) { client_->OnDataAvailable(buffer, num_bytes); source_->EndReadData(num_bytes); } 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