Index: chrome/common/ipc_channel_proxy.cc |
diff --git a/chrome/common/ipc_channel_proxy.cc b/chrome/common/ipc_channel_proxy.cc |
deleted file mode 100644 |
index c97e6f5ec7a092f4525cd238145dbedb4099185f..0000000000000000000000000000000000000000 |
--- a/chrome/common/ipc_channel_proxy.cc |
+++ /dev/null |
@@ -1,288 +0,0 @@ |
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "base/message_loop.h" |
-#include "base/thread.h" |
-#include "chrome/common/ipc_channel_proxy.h" |
-#include "chrome/common/ipc_logging.h" |
-#include "chrome/common/ipc_message_utils.h" |
- |
-namespace IPC { |
- |
-//----------------------------------------------------------------------------- |
- |
-ChannelProxy::Context::Context(Channel::Listener* listener, |
- MessageFilter* filter, |
- MessageLoop* ipc_message_loop) |
- : listener_message_loop_(MessageLoop::current()), |
- listener_(listener), |
- ipc_message_loop_(ipc_message_loop), |
- channel_(NULL), |
- peer_pid_(0), |
- channel_connected_called_(false) { |
- if (filter) |
- filters_.push_back(filter); |
-} |
- |
-void ChannelProxy::Context::CreateChannel(const std::string& id, |
- const Channel::Mode& mode) { |
- DCHECK(channel_ == NULL); |
- channel_id_ = id; |
- channel_ = new Channel(id, mode, this); |
-} |
- |
-bool ChannelProxy::Context::TryFilters(const Message& message) { |
-#ifdef IPC_MESSAGE_LOG_ENABLED |
- Logging* logger = Logging::current(); |
- if (logger->Enabled()) |
- logger->OnPreDispatchMessage(message); |
-#endif |
- |
- for (size_t i = 0; i < filters_.size(); ++i) { |
- if (filters_[i]->OnMessageReceived(message)) { |
-#ifdef IPC_MESSAGE_LOG_ENABLED |
- if (logger->Enabled()) |
- logger->OnPostDispatchMessage(message, channel_id_); |
-#endif |
- return true; |
- } |
- } |
- return false; |
-} |
- |
-// Called on the IPC::Channel thread |
-void ChannelProxy::Context::OnMessageReceived(const Message& message) { |
- // First give a chance to the filters to process this message. |
- if (!TryFilters(message)) |
- OnMessageReceivedNoFilter(message); |
-} |
- |
-// Called on the IPC::Channel thread |
-void ChannelProxy::Context::OnMessageReceivedNoFilter(const Message& message) { |
- // NOTE: This code relies on the listener's message loop not going away while |
- // this thread is active. That should be a reasonable assumption, but it |
- // feels risky. We may want to invent some more indirect way of referring to |
- // a MessageLoop if this becomes a problem. |
- listener_message_loop_->PostTask(FROM_HERE, NewRunnableMethod( |
- this, &Context::OnDispatchMessage, message)); |
-} |
- |
-// Called on the IPC::Channel thread |
-void ChannelProxy::Context::OnChannelConnected(int32 peer_pid) { |
- peer_pid_ = peer_pid; |
- for (size_t i = 0; i < filters_.size(); ++i) |
- filters_[i]->OnChannelConnected(peer_pid); |
- |
- // See above comment about using listener_message_loop_ here. |
- listener_message_loop_->PostTask(FROM_HERE, NewRunnableMethod( |
- this, &Context::OnDispatchConnected)); |
-} |
- |
-// Called on the IPC::Channel thread |
-void ChannelProxy::Context::OnChannelError() { |
- for (size_t i = 0; i < filters_.size(); ++i) |
- filters_[i]->OnChannelError(); |
- |
- // See above comment about using listener_message_loop_ here. |
- listener_message_loop_->PostTask(FROM_HERE, NewRunnableMethod( |
- this, &Context::OnDispatchError)); |
-} |
- |
-// Called on the IPC::Channel thread |
-void ChannelProxy::Context::OnChannelOpened() { |
- DCHECK(channel_ != NULL); |
- |
- // Assume a reference to ourselves on behalf of this thread. This reference |
- // will be released when we are closed. |
- AddRef(); |
- |
- if (!channel_->Connect()) { |
- OnChannelError(); |
- return; |
- } |
- |
- for (size_t i = 0; i < filters_.size(); ++i) |
- filters_[i]->OnFilterAdded(channel_); |
-} |
- |
-// Called on the IPC::Channel thread |
-void ChannelProxy::Context::OnChannelClosed() { |
- // It's okay for IPC::ChannelProxy::Close to be called more than once, which |
- // would result in this branch being taken. |
- if (!channel_) |
- return; |
- |
- for (size_t i = 0; i < filters_.size(); ++i) { |
- filters_[i]->OnChannelClosing(); |
- filters_[i]->OnFilterRemoved(); |
- } |
- |
- // We don't need the filters anymore. |
- filters_.clear(); |
- |
- delete channel_; |
- channel_ = NULL; |
- |
- // Balance with the reference taken during startup. This may result in |
- // self-destruction. |
- Release(); |
-} |
- |
-// Called on the IPC::Channel thread |
-void ChannelProxy::Context::OnSendMessage(Message* message) { |
- if (!channel_->Send(message)) |
- OnChannelError(); |
-} |
- |
-// Called on the IPC::Channel thread |
-void ChannelProxy::Context::OnAddFilter(MessageFilter* filter) { |
- filters_.push_back(filter); |
- |
- // If the channel has already been created, then we need to send this message |
- // so that the filter gets access to the Channel. |
- if (channel_) |
- filter->OnFilterAdded(channel_); |
- |
- // Balances the AddRef in ChannelProxy::AddFilter. |
- filter->Release(); |
-} |
- |
-// Called on the IPC::Channel thread |
-void ChannelProxy::Context::OnRemoveFilter(MessageFilter* filter) { |
- for (size_t i = 0; i < filters_.size(); ++i) { |
- if (filters_[i].get() == filter) { |
- filter->OnFilterRemoved(); |
- filters_.erase(filters_.begin() + i); |
- return; |
- } |
- } |
- |
- NOTREACHED() << "filter to be removed not found"; |
-} |
- |
-// Called on the listener's thread |
-void ChannelProxy::Context::OnDispatchMessage(const Message& message) { |
- if (!listener_) |
- return; |
- |
- OnDispatchConnected(); |
- |
-#ifdef IPC_MESSAGE_LOG_ENABLED |
- Logging* logger = Logging::current(); |
- if (message.type() == IPC_LOGGING_ID) { |
- logger->OnReceivedLoggingMessage(message); |
- return; |
- } |
- |
- if (logger->Enabled()) |
- logger->OnPreDispatchMessage(message); |
-#endif |
- |
- listener_->OnMessageReceived(message); |
- |
-#ifdef IPC_MESSAGE_LOG_ENABLED |
- if (logger->Enabled()) |
- logger->OnPostDispatchMessage(message, channel_id_); |
-#endif |
-} |
- |
-// Called on the listener's thread |
-void ChannelProxy::Context::OnDispatchConnected() { |
- if (channel_connected_called_) |
- return; |
- |
- channel_connected_called_ = true; |
- if (listener_) |
- listener_->OnChannelConnected(peer_pid_); |
-} |
- |
-// Called on the listener's thread |
-void ChannelProxy::Context::OnDispatchError() { |
- if (listener_) |
- listener_->OnChannelError(); |
-} |
- |
-//----------------------------------------------------------------------------- |
- |
-ChannelProxy::ChannelProxy(const std::string& channel_id, Channel::Mode mode, |
- Channel::Listener* listener, MessageFilter* filter, |
- MessageLoop* ipc_thread) |
- : context_(new Context(listener, filter, ipc_thread)) { |
- Init(channel_id, mode, ipc_thread, true); |
-} |
- |
-ChannelProxy::ChannelProxy(const std::string& channel_id, Channel::Mode mode, |
- MessageLoop* ipc_thread, Context* context, |
- bool create_pipe_now) |
- : context_(context) { |
- Init(channel_id, mode, ipc_thread, create_pipe_now); |
-} |
- |
-void ChannelProxy::Init(const std::string& channel_id, Channel::Mode mode, |
- MessageLoop* ipc_thread_loop, bool create_pipe_now) { |
- if (create_pipe_now) { |
- // Create the channel immediately. This effectively sets up the |
- // low-level pipe so that the client can connect. Without creating |
- // the pipe immediately, it is possible for a listener to attempt |
- // to connect and get an error since the pipe doesn't exist yet. |
- context_->CreateChannel(channel_id, mode); |
- } else { |
- context_->ipc_message_loop()->PostTask(FROM_HERE, NewRunnableMethod( |
- context_.get(), &Context::CreateChannel, channel_id, mode)); |
- } |
- |
- // complete initialization on the background thread |
- context_->ipc_message_loop()->PostTask(FROM_HERE, NewRunnableMethod( |
- context_.get(), &Context::OnChannelOpened)); |
-} |
- |
-void ChannelProxy::Close() { |
- // Clear the backpointer to the listener so that any pending calls to |
- // Context::OnDispatchMessage or OnDispatchError will be ignored. It is |
- // possible that the channel could be closed while it is receiving messages! |
- context_->Clear(); |
- |
- if (context_->ipc_message_loop()) { |
- context_->ipc_message_loop()->PostTask(FROM_HERE, NewRunnableMethod( |
- context_.get(), &Context::OnChannelClosed)); |
- } |
-} |
- |
-bool ChannelProxy::Send(Message* message) { |
-#ifdef IPC_MESSAGE_LOG_ENABLED |
- Logging::current()->OnSendMessage(message, context_->channel_id()); |
-#endif |
- |
- context_->ipc_message_loop()->PostTask(FROM_HERE, NewRunnableMethod( |
- context_.get(), &Context::OnSendMessage, message)); |
- return true; |
-} |
- |
-void ChannelProxy::AddFilter(MessageFilter* filter) { |
- // We want to addref the filter to prevent it from |
- // being destroyed before the OnAddFilter call is invoked. |
- filter->AddRef(); |
- context_->ipc_message_loop()->PostTask(FROM_HERE, NewRunnableMethod( |
- context_.get(), &Context::OnAddFilter, filter)); |
-} |
- |
-void ChannelProxy::RemoveFilter(MessageFilter* filter) { |
- context_->ipc_message_loop()->PostTask(FROM_HERE, NewRunnableMethod( |
- context_.get(), &Context::OnRemoveFilter, filter)); |
-} |
- |
-#if defined(OS_POSIX) |
-// See the TODO regarding lazy initialization of the channel in |
-// ChannelProxy::Init(). |
-// We assume that IPC::Channel::GetClientFileDescriptorMapping() is thread-safe. |
-int ChannelProxy::GetClientFileDescriptor() const { |
- Channel *channel = context_.get()->channel_; |
- DCHECK(channel); // Channel must have been created first. |
- return channel->GetClientFileDescriptor(); |
-} |
-#endif |
- |
-//----------------------------------------------------------------------------- |
- |
-} // namespace IPC |