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 "base/bind.h" | 5 #include "base/bind.h" |
6 #include "base/compiler_specific.h" | 6 #include "base/compiler_specific.h" |
7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
8 #include "base/location.h" | 8 #include "base/location.h" |
9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
61 ipc_task_runner_ = NULL; | 61 ipc_task_runner_ = NULL; |
62 } | 62 } |
63 | 63 |
64 void ChannelProxy::Context::CreateChannel(const IPC::ChannelHandle& handle, | 64 void ChannelProxy::Context::CreateChannel(const IPC::ChannelHandle& handle, |
65 const Channel::Mode& mode) { | 65 const Channel::Mode& mode) { |
66 DCHECK(channel_.get() == NULL); | 66 DCHECK(channel_.get() == NULL); |
67 channel_id_ = handle.name; | 67 channel_id_ = handle.name; |
68 channel_.reset(new Channel(handle, mode, this)); | 68 channel_.reset(new Channel(handle, mode, this)); |
69 } | 69 } |
70 | 70 |
| 71 void ChannelProxy::Context::SendFailedSyncMessageReply(const Message& message) { |
| 72 if (!message.is_sync()) |
| 73 return; |
| 74 |
| 75 Message* reply = SyncMessage::GenerateReply(&message); |
| 76 reply->set_reply_error(); |
| 77 ipc_task_runner()->PostTask( |
| 78 FROM_HERE, |
| 79 base::Bind(&ChannelProxy::Context::OnSendMessage, |
| 80 this, base::Passed(scoped_ptr<Message>(reply)))); |
| 81 } |
| 82 |
71 bool ChannelProxy::Context::TryFilters(const Message& message) { | 83 bool ChannelProxy::Context::TryFilters(const Message& message) { |
72 #ifdef IPC_MESSAGE_LOG_ENABLED | 84 #ifdef IPC_MESSAGE_LOG_ENABLED |
73 Logging* logger = Logging::GetInstance(); | 85 Logging* logger = Logging::GetInstance(); |
74 if (logger->Enabled()) | 86 if (logger->Enabled()) |
75 logger->OnPreDispatchMessage(message); | 87 logger->OnPreDispatchMessage(message); |
76 #endif | 88 #endif |
77 | 89 |
78 for (size_t i = 0; i < filters_.size(); ++i) { | 90 for (size_t i = 0; i < filters_.size(); ++i) { |
79 if (filters_[i]->OnMessageReceived(message)) { | 91 if (filters_[i]->OnMessageReceived(message)) { |
80 #ifdef IPC_MESSAGE_LOG_ENABLED | 92 #ifdef IPC_MESSAGE_LOG_ENABLED |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
236 std::string name; | 248 std::string name; |
237 logger->GetMessageText(message.type(), &name, &message, NULL); | 249 logger->GetMessageText(message.type(), &name, &message, NULL); |
238 TRACE_EVENT1("task", "ChannelProxy::Context::OnDispatchMessage", | 250 TRACE_EVENT1("task", "ChannelProxy::Context::OnDispatchMessage", |
239 "name", name); | 251 "name", name); |
240 #else | 252 #else |
241 TRACE_EVENT2("task", "ChannelProxy::Context::OnDispatchMessage", | 253 TRACE_EVENT2("task", "ChannelProxy::Context::OnDispatchMessage", |
242 "class", IPC_MESSAGE_ID_CLASS(message.type()), | 254 "class", IPC_MESSAGE_ID_CLASS(message.type()), |
243 "line", IPC_MESSAGE_ID_LINE(message.type())); | 255 "line", IPC_MESSAGE_ID_LINE(message.type())); |
244 #endif | 256 #endif |
245 | 257 |
246 if (!listener_) | 258 if (!listener_) { |
| 259 SendFailedSyncMessageReply(message); |
247 return; | 260 return; |
| 261 } |
248 | 262 |
249 OnDispatchConnected(); | 263 OnDispatchConnected(); |
250 | 264 |
251 #ifdef IPC_MESSAGE_LOG_ENABLED | 265 #ifdef IPC_MESSAGE_LOG_ENABLED |
252 if (message.type() == IPC_LOGGING_ID) { | 266 if (message.type() == IPC_LOGGING_ID) { |
253 logger->OnReceivedLoggingMessage(message); | 267 logger->OnReceivedLoggingMessage(message); |
| 268 SendFailedSyncMessageReply(message); |
254 return; | 269 return; |
255 } | 270 } |
256 | 271 |
257 if (logger->Enabled()) | 272 if (logger->Enabled()) |
258 logger->OnPreDispatchMessage(message); | 273 logger->OnPreDispatchMessage(message); |
259 #endif | 274 #endif |
260 | 275 |
261 listener_->OnMessageReceived(message); | 276 if (!listener_->OnMessageReceived(message)) |
| 277 SendFailedSyncMessageReply(message); |
262 | 278 |
263 #ifdef IPC_MESSAGE_LOG_ENABLED | 279 #ifdef IPC_MESSAGE_LOG_ENABLED |
264 if (logger->Enabled()) | 280 if (logger->Enabled()) |
265 logger->OnPostDispatchMessage(message, channel_id_); | 281 logger->OnPostDispatchMessage(message, channel_id_); |
266 #endif | 282 #endif |
267 } | 283 } |
268 | 284 |
269 // Called on the listener's thread | 285 // Called on the listener's thread |
270 void ChannelProxy::Context::OnDispatchConnected() { | 286 void ChannelProxy::Context::OnDispatchConnected() { |
271 if (channel_connected_called_) | 287 if (channel_connected_called_) |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
420 Channel* channel = context_.get()->channel_.get(); | 436 Channel* channel = context_.get()->channel_.get(); |
421 // Channel must have been created first. | 437 // Channel must have been created first. |
422 DCHECK(channel) << context_.get()->channel_id_; | 438 DCHECK(channel) << context_.get()->channel_id_; |
423 return channel->GetClientEuid(client_euid); | 439 return channel->GetClientEuid(client_euid); |
424 } | 440 } |
425 #endif | 441 #endif |
426 | 442 |
427 //----------------------------------------------------------------------------- | 443 //----------------------------------------------------------------------------- |
428 | 444 |
429 } // namespace IPC | 445 } // namespace IPC |
OLD | NEW |