Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(49)

Side by Side Diff: mojo/common/data_pipe_utils.cc

Issue 694303002: Allow local file to run though content handler. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Remove mime mapping Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/files/file_path.h" 9 #include "base/files/file_path.h"
10 #include "base/files/file_util.h" 10 #include "base/files/file_util.h"
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 size_t CopyToStringHelper( 51 size_t CopyToStringHelper(
52 std::string* result, const void* buffer, uint32_t num_bytes) { 52 std::string* result, const void* buffer, uint32_t num_bytes) {
53 result->append(static_cast<const char*>(buffer), num_bytes); 53 result->append(static_cast<const char*>(buffer), num_bytes);
54 return num_bytes; 54 return num_bytes;
55 } 55 }
56 56
57 size_t CopyToFileHelper(FILE* fp, const void* buffer, uint32_t num_bytes) { 57 size_t CopyToFileHelper(FILE* fp, const void* buffer, uint32_t num_bytes) {
58 return fwrite(buffer, 1, num_bytes, fp); 58 return fwrite(buffer, 1, num_bytes, fp);
59 } 59 }
60 60
61 bool BlockingCopyFromFile(const base::FilePath& source,
62 ScopedDataPipeProducerHandle destination) {
63 base::File file(source, base::File::FLAG_OPEN | base::File::FLAG_READ);
64 if (!file.IsValid())
65 return false;
66 for (;;) {
67 void* buffer;
Aaron Boodman 2014/11/03 19:20:15 = nullptr; I know the code above does not do it. T
qsr 2014/11/04 11:58:34 Done. But I do not understand why you say this cod
Aaron Boodman 2014/11/04 18:05:00 Sorry, I was exaggerating for comedic effect. As i
68 uint32_t buffer_num_bytes;
Aaron Boodman 2014/11/03 19:20:14 = 0;
qsr 2014/11/04 11:58:33 Done.
69 MojoResult result = BeginWriteDataRaw(destination.get(),
70 &buffer,
71 &buffer_num_bytes,
72 MOJO_WRITE_DATA_FLAG_NONE);
73 if (result == MOJO_RESULT_OK) {
74 int bytes_read =
75 file.ReadAtCurrentPos(static_cast<char*>(buffer), buffer_num_bytes);
76 if (bytes_read >= 0) {
77 EndWriteDataRaw(destination.get(), bytes_read);
78 if (bytes_read == 0) {
79 // eof
80 return true;
81 }
82 } else {
83 // error
84 EndWriteDataRaw(destination.get(), 0);
85 return false;
86 }
87 } else if (result == MOJO_RESULT_SHOULD_WAIT) {
88 result = Wait(destination.get(),
89 MOJO_HANDLE_SIGNAL_WRITABLE,
90 MOJO_DEADLINE_INDEFINITE);
91 if (result != MOJO_RESULT_OK) {
92 // If the consumder handle was closed, then treat as EOF.
Aaron Boodman 2014/11/03 19:20:14 typo: consumer
qsr 2014/11/04 11:58:34 Done.
93 return result == MOJO_RESULT_FAILED_PRECONDITION;
94 }
95 } else {
96 // If the consumder handle was closed, then treat as EOF.
97 return result == MOJO_RESULT_FAILED_PRECONDITION;
98 }
99 }
100 NOTREACHED();
101 return false;
102 }
103
61 } // namespace 104 } // namespace
62 105
63 106
64 // TODO(hansmuller): Add a max_size parameter. 107 // TODO(hansmuller): Add a max_size parameter.
65 bool BlockingCopyToString(ScopedDataPipeConsumerHandle source, 108 bool BlockingCopyToString(ScopedDataPipeConsumerHandle source,
66 std::string* result) { 109 std::string* result) {
67 CHECK(result); 110 CHECK(result);
68 result->clear(); 111 result->clear();
69 return BlockingCopyHelper( 112 return BlockingCopyHelper(
70 source.Pass(), base::Bind(&CopyToStringHelper, result)); 113 source.Pass(), base::Bind(&CopyToStringHelper, result));
(...skipping 12 matching lines...) Expand all
83 const base::FilePath& destination, 126 const base::FilePath& destination,
84 base::TaskRunner* task_runner, 127 base::TaskRunner* task_runner,
85 const base::Callback<void(bool)>& callback) { 128 const base::Callback<void(bool)>& callback) {
86 base::PostTaskAndReplyWithResult( 129 base::PostTaskAndReplyWithResult(
87 task_runner, 130 task_runner,
88 FROM_HERE, 131 FROM_HERE,
89 base::Bind(&BlockingCopyToFile, base::Passed(&source), destination), 132 base::Bind(&BlockingCopyToFile, base::Passed(&source), destination),
90 callback); 133 callback);
91 } 134 }
92 135
136 void CopyFromFile(const base::FilePath& source,
Aaron Boodman 2014/11/03 19:20:15 Can you add a unit test for this?
qsr 2014/11/04 11:58:34 Done.
137 ScopedDataPipeProducerHandle destination,
138 base::TaskRunner* task_runner,
139 const base::Callback<void(bool)>& callback) {
140 base::PostTaskAndReplyWithResult(
141 task_runner,
142 FROM_HERE,
143 base::Bind(&BlockingCopyFromFile, source, base::Passed(&destination)),
144 callback);
145 }
146
93 } // namespace common 147 } // namespace common
94 } // namespace mojo 148 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698