| Index: mojo/common/data_pipe_utils.cc
|
| diff --git a/mojo/common/data_pipe_utils.cc b/mojo/common/data_pipe_utils.cc
|
| index c99c6668ba46a1d112724e3246821913cdff0377..a280dad5e4b97a290a41b0a057a0711fb0ee8404 100644
|
| --- a/mojo/common/data_pipe_utils.cc
|
| +++ b/mojo/common/data_pipe_utils.cc
|
| @@ -71,6 +71,37 @@ bool BlockingCopyToString(ScopedDataPipeConsumerHandle source,
|
| source.Pass(), base::Bind(&CopyToStringHelper, result));
|
| }
|
|
|
| +bool MOJO_COMMON_EXPORT BlockingCopyFromString(
|
| + const std::string& source,
|
| + const ScopedDataPipeProducerHandle& destination) {
|
| + auto it = source.begin();
|
| + for (;;) {
|
| + void* buffer = nullptr;
|
| + uint32_t buffer_num_bytes = 0;
|
| + MojoResult result =
|
| + BeginWriteDataRaw(destination.get(), &buffer, &buffer_num_bytes,
|
| + MOJO_WRITE_DATA_FLAG_NONE);
|
| + if (result == MOJO_RESULT_OK) {
|
| + char* char_buffer = static_cast<char*>(buffer);
|
| + uint32_t byte_index = 0;
|
| + while (it != source.end() && byte_index < buffer_num_bytes) {
|
| + char_buffer[byte_index++] = *it++;
|
| + }
|
| + EndWriteDataRaw(destination.get(), byte_index);
|
| + } else if (result == MOJO_RESULT_SHOULD_WAIT) {
|
| + result = Wait(destination.get(), MOJO_HANDLE_SIGNAL_WRITABLE,
|
| + MOJO_DEADLINE_INDEFINITE, nullptr);
|
| + if (result != MOJO_RESULT_OK) {
|
| + // If the consumer handle was closed, then treat as EOF.
|
| + return result == MOJO_RESULT_FAILED_PRECONDITION;
|
| + }
|
| + } else {
|
| + // If the consumer handle was closed, then treat as EOF.
|
| + return result == MOJO_RESULT_FAILED_PRECONDITION;
|
| + }
|
| + }
|
| +}
|
| +
|
| bool BlockingCopyToFile(ScopedDataPipeConsumerHandle source,
|
| const base::FilePath& destination) {
|
| base::ScopedFILE fp(base::OpenFile(destination, "wb"));
|
|
|