OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/nacl/nacl_ipc_adapter.h" | 5 #include "chrome/nacl/nacl_ipc_adapter.h" |
6 | 6 |
7 #include <limits.h> | 7 #include <limits.h> |
8 #include <string.h> | 8 #include <string.h> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 RewrittenMessage(); | 50 RewrittenMessage(); |
51 | 51 |
52 bool is_consumed() const { return data_read_cursor_ == data_len_; } | 52 bool is_consumed() const { return data_read_cursor_ == data_len_; } |
53 | 53 |
54 void SetData(const NaClIPCAdapter::NaClMessageHeader& header, | 54 void SetData(const NaClIPCAdapter::NaClMessageHeader& header, |
55 const void* payload, size_t payload_length); | 55 const void* payload, size_t payload_length); |
56 | 56 |
57 int Read(char* dest_buffer, int dest_buffer_size); | 57 int Read(char* dest_buffer, int dest_buffer_size); |
58 | 58 |
59 private: | 59 private: |
| 60 friend class base::RefCounted<RewrittenMessage>; |
| 61 ~RewrittenMessage() {} |
| 62 |
60 scoped_array<char> data_; | 63 scoped_array<char> data_; |
61 int data_len_; | 64 int data_len_; |
62 | 65 |
63 // Offset into data where the next read will happen. This will be equal to | 66 // Offset into data where the next read will happen. This will be equal to |
64 // data_len_ when all data has been consumed. | 67 // data_len_ when all data has been consumed. |
65 int data_read_cursor_; | 68 int data_read_cursor_; |
66 }; | 69 }; |
67 | 70 |
68 NaClIPCAdapter::RewrittenMessage::RewrittenMessage() | 71 NaClIPCAdapter::RewrittenMessage::RewrittenMessage() |
69 : data_len_(0), | 72 : data_len_(0), |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 | 122 |
120 NaClIPCAdapter::NaClIPCAdapter(scoped_ptr<IPC::Channel> channel, | 123 NaClIPCAdapter::NaClIPCAdapter(scoped_ptr<IPC::Channel> channel, |
121 base::TaskRunner* runner) | 124 base::TaskRunner* runner) |
122 : lock_(), | 125 : lock_(), |
123 cond_var_(&lock_), | 126 cond_var_(&lock_), |
124 task_runner_(runner), | 127 task_runner_(runner), |
125 locked_data_() { | 128 locked_data_() { |
126 io_thread_data_.channel_ = channel.Pass(); | 129 io_thread_data_.channel_ = channel.Pass(); |
127 } | 130 } |
128 | 131 |
129 NaClIPCAdapter::~NaClIPCAdapter() { | |
130 } | |
131 | |
132 // Note that this message is controlled by the untrusted code. So we should be | 132 // Note that this message is controlled by the untrusted code. So we should be |
133 // skeptical of anything it contains and quick to give up if anything is fishy. | 133 // skeptical of anything it contains and quick to give up if anything is fishy. |
134 int NaClIPCAdapter::Send(const char* input_data, size_t input_data_len) { | 134 int NaClIPCAdapter::Send(const char* input_data, size_t input_data_len) { |
135 base::AutoLock lock(lock_); | 135 base::AutoLock lock(lock_); |
136 | 136 |
137 if (input_data_len > IPC::Channel::kMaximumMessageSize) { | 137 if (input_data_len > IPC::Channel::kMaximumMessageSize) { |
138 ClearToBeSent(); | 138 ClearToBeSent(); |
139 return -1; | 139 return -1; |
140 } | 140 } |
141 | 141 |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 return true; | 248 return true; |
249 } | 249 } |
250 | 250 |
251 void NaClIPCAdapter::OnChannelConnected(int32 peer_pid) { | 251 void NaClIPCAdapter::OnChannelConnected(int32 peer_pid) { |
252 } | 252 } |
253 | 253 |
254 void NaClIPCAdapter::OnChannelError() { | 254 void NaClIPCAdapter::OnChannelError() { |
255 CloseChannel(); | 255 CloseChannel(); |
256 } | 256 } |
257 | 257 |
| 258 NaClIPCAdapter::~NaClIPCAdapter() { |
| 259 } |
| 260 |
258 int NaClIPCAdapter::LockedReceive(char* output_buffer, int output_buffer_size) { | 261 int NaClIPCAdapter::LockedReceive(char* output_buffer, int output_buffer_size) { |
259 lock_.AssertAcquired(); | 262 lock_.AssertAcquired(); |
260 | 263 |
261 if (locked_data_.to_be_received_.empty()) | 264 if (locked_data_.to_be_received_.empty()) |
262 return 0; | 265 return 0; |
263 scoped_refptr<RewrittenMessage> current = | 266 scoped_refptr<RewrittenMessage> current = |
264 locked_data_.to_be_received_.front(); | 267 locked_data_.to_be_received_.front(); |
265 | 268 |
266 int retval = current->Read(output_buffer, output_buffer_size); | 269 int retval = current->Read(output_buffer, output_buffer_size); |
267 | 270 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 if (locked_data_.channel_closed_) | 312 if (locked_data_.channel_closed_) |
310 return false; // TODO(brettw) clean up handles here when we add support! | 313 return false; // TODO(brettw) clean up handles here when we add support! |
311 | 314 |
312 // Actual send must be done on the I/O thread. | 315 // Actual send must be done on the I/O thread. |
313 task_runner_->PostTask(FROM_HERE, | 316 task_runner_->PostTask(FROM_HERE, |
314 base::Bind(&NaClIPCAdapter::SendMessageOnIOThread, this, | 317 base::Bind(&NaClIPCAdapter::SendMessageOnIOThread, this, |
315 base::Passed(&msg))); | 318 base::Passed(&msg))); |
316 return true; | 319 return true; |
317 } | 320 } |
318 | 321 |
319 void NaClIPCAdapter::CloseChannelOnIOThread() { | |
320 io_thread_data_.channel_->Close(); | |
321 } | |
322 | |
323 void NaClIPCAdapter::SendMessageOnIOThread(scoped_ptr<IPC::Message> message) { | |
324 io_thread_data_.channel_->Send(message.release()); | |
325 } | |
326 | |
327 void NaClIPCAdapter::ClearToBeSent() { | 322 void NaClIPCAdapter::ClearToBeSent() { |
328 lock_.AssertAcquired(); | 323 lock_.AssertAcquired(); |
329 | 324 |
330 // Don't let the string keep its buffer behind our back. | 325 // Don't let the string keep its buffer behind our back. |
331 std::string empty; | 326 std::string empty; |
332 locked_data_.to_be_sent_.swap(empty); | 327 locked_data_.to_be_sent_.swap(empty); |
333 } | 328 } |
| 329 |
| 330 void NaClIPCAdapter::CloseChannelOnIOThread() { |
| 331 io_thread_data_.channel_->Close(); |
| 332 } |
| 333 |
| 334 void NaClIPCAdapter::SendMessageOnIOThread(scoped_ptr<IPC::Message> message) { |
| 335 io_thread_data_.channel_->Send(message.release()); |
| 336 } |
OLD | NEW |