|  | // 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/common/data_pipe_drainer.h" | 
|  |  | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include <utility> | 
|  |  | 
|  | #include "base/bind.h" | 
|  |  | 
|  | namespace mojo { | 
|  | namespace common { | 
|  |  | 
|  | DataPipeDrainer::DataPipeDrainer(Client* client, | 
|  | mojo::ScopedDataPipeConsumerHandle source) | 
|  | : client_(client), | 
|  | source_(std::move(source)), | 
|  | handle_watcher_(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC), | 
|  | 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 common | 
|  | }  // namespace mojo |