Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "mojo/common/data_pipe_utils.h" | 5 #include "mojo/common/data_pipe_utils.h" |
| 6 | 6 |
| 7 #include <stdio.h> | 7 #include <stdio.h> |
| 8 | 8 |
| 9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| 11 #include "base/files/scoped_file.h" | 11 #include "base/files/scoped_file.h" |
| 12 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
| 13 #include "base/task_runner_util.h" | 13 #include "base/task_runner_util.h" |
| 14 | 14 |
| 15 namespace mojo { | 15 namespace mojo { |
| 16 namespace common { | 16 namespace common { |
| 17 namespace { | |
| 17 | 18 |
| 18 bool BlockingCopyToFile(ScopedDataPipeConsumerHandle source, | 19 bool BlockingCopyHelper(ScopedDataPipeConsumerHandle source, |
|
Aaron Boodman
2014/08/25 17:25:37
I think the callback-based refactor makes sense, b
| |
| 19 const base::FilePath& destination) { | 20 const base::Callback<size_t(const void*, uint32_t)>& write_bytes) { |
| 20 base::ScopedFILE fp(base::OpenFile(destination, "wb")); | |
| 21 if (!fp) | |
| 22 return false; | |
| 23 | |
| 24 for (;;) { | 21 for (;;) { |
| 25 const void* buffer; | 22 const void* buffer; |
| 26 uint32_t num_bytes; | 23 uint32_t num_bytes; |
| 27 MojoResult result = BeginReadDataRaw(source.get(), &buffer, &num_bytes, | 24 MojoResult result = BeginReadDataRaw( |
| 28 MOJO_READ_DATA_FLAG_NONE); | 25 source.get(), &buffer, &num_bytes, MOJO_READ_DATA_FLAG_NONE); |
| 29 if (result == MOJO_RESULT_OK) { | 26 if (result == MOJO_RESULT_OK) { |
| 30 size_t bytes_written = fwrite(buffer, 1, num_bytes, fp.get()); | 27 size_t bytes_written = write_bytes.Run(buffer, num_bytes); |
| 31 result = EndReadDataRaw(source.get(), num_bytes); | 28 result = EndReadDataRaw(source.get(), num_bytes); |
| 32 if (bytes_written < num_bytes || result != MOJO_RESULT_OK) | 29 if (bytes_written < num_bytes || result != MOJO_RESULT_OK) |
| 33 return false; | 30 return false; |
| 34 } else if (result == MOJO_RESULT_SHOULD_WAIT) { | 31 } else if (result == MOJO_RESULT_SHOULD_WAIT) { |
| 35 result = Wait(source.get(), | 32 result = Wait(source.get(), |
| 36 MOJO_HANDLE_SIGNAL_READABLE, | 33 MOJO_HANDLE_SIGNAL_READABLE, |
| 37 MOJO_DEADLINE_INDEFINITE); | 34 MOJO_DEADLINE_INDEFINITE); |
| 38 if (result != MOJO_RESULT_OK) { | 35 if (result != MOJO_RESULT_OK) { |
| 39 // If the producer handle was closed, then treat as EOF. | 36 // If the producer handle was closed, then treat as EOF. |
| 40 return result == MOJO_RESULT_FAILED_PRECONDITION; | 37 return result == MOJO_RESULT_FAILED_PRECONDITION; |
| 41 } | 38 } |
| 42 } else if (result == MOJO_RESULT_FAILED_PRECONDITION) { | 39 } else if (result == MOJO_RESULT_FAILED_PRECONDITION) { |
| 43 // If the producer handle was closed, then treat as EOF. | 40 // If the producer handle was closed, then treat as EOF. |
| 44 return true; | 41 return true; |
| 45 } else { | 42 } else { |
| 46 // Some other error occurred. | 43 // Some other error occurred. |
| 47 break; | 44 break; |
| 48 } | 45 } |
| 49 } | 46 } |
| 50 | 47 |
| 51 return false; | 48 return false; |
| 52 } | 49 } |
| 53 | 50 |
| 51 size_t CopyToStringHelper( | |
|
darin (slow to review)
2014/08/26 05:23:22
nit: Append{Bytes}ToString ?
hansmuller
2014/08/26 23:39:12
I thought there was some value in repeating most o
| |
| 52 std::string* result, const void* buffer, uint32_t num_bytes) { | |
| 53 if (result) | |
| 54 result->append(static_cast<const char*>(buffer), num_bytes); | |
| 55 return num_bytes; | |
| 56 } | |
| 57 | |
| 58 size_t CopyToFileHelper(FILE* fp, const void* buffer, uint32_t num_bytes) { | |
|
darin (slow to review)
2014/08/26 05:23:23
nit: Append{Bytes}ToFile ?
hansmuller
2014/08/26 23:39:12
[see previous comment]
| |
| 59 return fwrite(buffer, 1, num_bytes, fp); | |
| 60 } | |
| 61 | |
| 62 } // namespace | |
| 63 | |
| 64 | |
| 65 // Similar to base::ReadFileToString(). | |
| 66 // TODO(hansmuller): Add a max_size parameter. | |
| 67 bool BlockingCopyToString(ScopedDataPipeConsumerHandle source, | |
| 68 std::string* result) { | |
| 69 if (result) | |
|
Aaron Boodman
2014/08/25 17:25:38
Is there a reason to not pass |result|, or is this
hansmuller
2014/08/26 23:39:12
I was emulating base::ReadFileToString() which al
Aaron Boodman
2014/08/27 05:55:53
OK, that functions gives the example of priming a
| |
| 70 result->clear(); | |
| 71 return BlockingCopyHelper( | |
| 72 source.Pass(), base::Bind(&CopyToStringHelper, result)); | |
| 73 } | |
| 74 | |
| 75 bool BlockingCopyToFile(ScopedDataPipeConsumerHandle source, | |
| 76 const base::FilePath& destination) { | |
| 77 base::ScopedFILE fp(base::OpenFile(destination, "wb")); | |
| 78 if (!fp) | |
| 79 return false; | |
| 80 return BlockingCopyHelper( | |
| 81 source.Pass(), base::Bind(&CopyToFileHelper, fp.get())); | |
| 82 } | |
| 83 | |
| 84 // TODO(hansmuller): Should this be deleted? | |
| 54 void CompleteBlockingCopyToFile(const base::Callback<void(bool)>& callback, | 85 void CompleteBlockingCopyToFile(const base::Callback<void(bool)>& callback, |
|
Aaron Boodman
2014/08/25 17:25:38
Yeah, looks like dead code.
hansmuller
2014/08/26 23:39:12
OK, I deleted it.
| |
| 55 bool result) { | 86 bool result) { |
| 56 callback.Run(result); | 87 callback.Run(result); |
| 57 } | 88 } |
| 58 | 89 |
| 59 void CopyToFile(ScopedDataPipeConsumerHandle source, | 90 void CopyToFile(ScopedDataPipeConsumerHandle source, |
| 60 const base::FilePath& destination, | 91 const base::FilePath& destination, |
| 61 base::TaskRunner* task_runner, | 92 base::TaskRunner* task_runner, |
| 62 const base::Callback<void(bool)>& callback) { | 93 const base::Callback<void(bool)>& callback) { |
| 63 base::PostTaskAndReplyWithResult( | 94 base::PostTaskAndReplyWithResult( |
| 64 task_runner, | 95 task_runner, |
| 65 FROM_HERE, | 96 FROM_HERE, |
| 66 base::Bind(&BlockingCopyToFile, base::Passed(&source), destination), | 97 base::Bind(&BlockingCopyToFile, base::Passed(&source), destination), |
| 67 callback); | 98 callback); |
| 68 } | 99 } |
| 69 | 100 |
| 70 } // namespace common | 101 } // namespace common |
| 71 } // namespace mojo | 102 } // namespace mojo |
| OLD | NEW |