| Index: mojo/common/data_pipe_utils.cc
|
| diff --git a/mojo/common/data_pipe_utils.cc b/mojo/common/data_pipe_utils.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2722bc3c2176b511c2e9e4af131be2a034b23d57
|
| --- /dev/null
|
| +++ b/mojo/common/data_pipe_utils.cc
|
| @@ -0,0 +1,72 @@
|
| +// 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_utils.h"
|
| +
|
| +#include <stdio.h>
|
| +
|
| +#include "base/file_util.h"
|
| +#include "base/files/file_path.h"
|
| +#include "base/files/scoped_file.h"
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "base/task_runner_util.h"
|
| +#include "mojo/common/handle_watcher.h"
|
| +
|
| +namespace mojo {
|
| +namespace common {
|
| +
|
| +bool BlockingCopyToFile(ScopedDataPipeConsumerHandle source,
|
| + const base::FilePath& destination) {
|
| + base::ScopedFILE fp(base::OpenFile(destination, "wb"));
|
| + if (!fp)
|
| + return false;
|
| +
|
| + for (;;) {
|
| + const void* buffer;
|
| + uint32_t num_bytes;
|
| + MojoResult result = BeginReadDataRaw(source.get(), &buffer, &num_bytes,
|
| + MOJO_READ_DATA_FLAG_NONE);
|
| + if (result == MOJO_RESULT_OK) {
|
| + fwrite(buffer, 1, num_bytes, fp.get());
|
| + result = EndReadDataRaw(source.get(), num_bytes);
|
| + if (result != MOJO_RESULT_OK)
|
| + return false;
|
| + } else if (result == MOJO_RESULT_SHOULD_WAIT) {
|
| + result = Wait(source.get(),
|
| + MOJO_WAIT_FLAG_READABLE,
|
| + MOJO_DEADLINE_INDEFINITE);
|
| + if (result != MOJO_RESULT_OK) {
|
| + // If the producer handle was closed, then treat as EOF.
|
| + return result == MOJO_RESULT_FAILED_PRECONDITION;
|
| + }
|
| + } else if (result == MOJO_RESULT_FAILED_PRECONDITION) {
|
| + // If the producer handle was closed, then treat as EOF.
|
| + return true;
|
| + } else {
|
| + // Some other error occurred.
|
| + break;
|
| + }
|
| + }
|
| +
|
| + return false;
|
| +}
|
| +
|
| +void CompleteBlockingCopyToFile(const base::Callback<void(bool)>& callback,
|
| + bool result) {
|
| + callback.Run(result);
|
| +}
|
| +
|
| +void CopyToFile(ScopedDataPipeConsumerHandle source,
|
| + const base::FilePath& destination,
|
| + base::TaskRunner* task_runner,
|
| + const base::Callback<void(bool)>& callback) {
|
| + base::PostTaskAndReplyWithResult(
|
| + task_runner,
|
| + FROM_HERE,
|
| + base::Bind(&BlockingCopyToFile, base::Passed(&source), destination),
|
| + callback);
|
| +}
|
| +
|
| +} // namespace common
|
| +} // namespace mojo
|
|
|