summaryrefslogtreecommitdiffstats
path: root/ipc/ipc_channel_proxy.cc
diff options
context:
space:
mode:
authoragl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-04-03 02:29:45 +0000
committeragl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-04-03 02:29:45 +0000
commit82e5ee816a5f05d230c5356205e93d803650d0b9 (patch)
tree6b6e9d1bef407feef8ef24eedc9f343e2d536609 /ipc/ipc_channel_proxy.cc
parent8cf3f1dae79db8cfbf9dc6b75c140eabad918a6e (diff)
downloadchromium_src-82e5ee816a5f05d230c5356205e93d803650d0b9.zip
chromium_src-82e5ee816a5f05d230c5356205e93d803650d0b9.tar.gz
chromium_src-82e5ee816a5f05d230c5356205e93d803650d0b9.tar.bz2
Revert "Move IPC code to ipc/"
This reverts commit r13062 which, unsurprisingly, broke the build. git-svn-id: svn://svn.chromium.org/chrome/trunk/src@13063 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ipc/ipc_channel_proxy.cc')
-rw-r--r--ipc/ipc_channel_proxy.cc305
1 files changed, 0 insertions, 305 deletions
diff --git a/ipc/ipc_channel_proxy.cc b/ipc/ipc_channel_proxy.cc
deleted file mode 100644
index a07c677..0000000
--- a/ipc/ipc_channel_proxy.cc
+++ /dev/null
@@ -1,305 +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 "ipc/ipc_channel_proxy.h"
-#include "ipc/ipc_logging.h"
-#include "ipc/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::wstring& 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() {
- // 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::wstring& 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::wstring& 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::wstring& 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 {
-#if defined(OS_POSIX)
- // TODO(playmobil): On POSIX, IPC::Channel uses a socketpair(), one side of
- // which needs to be mapped into the child process' address space.
- // To know the value of the client side FD we need to have already
- // created a socketpair which currently occurs in IPC::Channel's
- // constructor.
- // If we lazilly construct the IPC::Channel then the caller has no way
- // of knowing the FD #.
- //
- // We can solve this either by having the Channel's creation launch the
- // subprocess itself or by creating the socketpair() externally.
- NOTIMPLEMENTED();
-#endif // defined(OS_POSIX)
- 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.
-void ChannelProxy::GetClientFileDescriptorMapping(int *src_fd, int *dest_fd) {
- Channel *channel = context_.get()->channel_;
- DCHECK(channel); // Channel must have been created first.
- channel->GetClientFileDescriptorMapping(src_fd, dest_fd);
-}
-
-// We assume that IP::Channel::OnClientConnected() is thread-safe.
-void ChannelProxy::OnClientConnected() {
- Channel *channel = context_.get()->channel_;
- DCHECK(channel); // Channel must have been created first.
- channel->OnClientConnected();
-}
-#endif
-
-//-----------------------------------------------------------------------------
-
-} // namespace IPC