| Index: content/renderer/p2p/socket_dispatcher.cc
|
| diff --git a/content/renderer/p2p/socket_dispatcher.cc b/content/renderer/p2p/socket_dispatcher.cc
|
| index f3f29b87d93465175636feb01f9ba7883c761157..4788c43b091c8b410e63ce02782ab639d1afae35 100644
|
| --- a/content/renderer/p2p/socket_dispatcher.cc
|
| +++ b/content/renderer/p2p/socket_dispatcher.cc
|
| @@ -7,6 +7,7 @@
|
| #include "base/bind.h"
|
| #include "base/memory/ref_counted.h"
|
| #include "base/message_loop_proxy.h"
|
| +#include "content/common/child_process.h"
|
| #include "content/common/p2p_messages.h"
|
| #include "content/renderer/p2p/host_address_request.h"
|
| #include "content/renderer/p2p/socket_client.h"
|
| @@ -18,44 +19,42 @@ namespace content {
|
| class P2PSocketDispatcher::AsyncMessageSender
|
| : public base::RefCountedThreadSafe<AsyncMessageSender> {
|
| public:
|
| - explicit AsyncMessageSender(IPC::Sender* message_sender)
|
| - : message_loop_(base::MessageLoopProxy::current()),
|
| - message_sender_(message_sender) {
|
| + explicit AsyncMessageSender(P2PSocketDispatcher* message_sender)
|
| + : message_sender_(message_sender) {
|
| }
|
|
|
| void Detach() {
|
| - DCHECK(message_loop_->BelongsToCurrentThread());
|
| message_sender_ = NULL;
|
| }
|
|
|
| void Send(IPC::Message* msg) {
|
| - message_loop_->PostTask(FROM_HERE,
|
| - base::Bind(&AsyncMessageSender::DoSend, this, msg));
|
| + if (!message_sender_) {
|
| + delete msg;
|
| + return;
|
| + }
|
| + base::MessageLoopProxy* loop = message_sender_->message_loop();
|
| + loop->PostTask(
|
| + FROM_HERE, base::Bind(&P2PSocketDispatcher::Send,
|
| + message_sender_.get(), msg));
|
| }
|
|
|
| private:
|
| friend class base::RefCountedThreadSafe<AsyncMessageSender>;
|
| ~AsyncMessageSender() {}
|
|
|
| - void DoSend(IPC::Message* msg) {
|
| - DCHECK(message_loop_->BelongsToCurrentThread());
|
| - if (message_sender_)
|
| - message_sender_->Send(msg);
|
| - }
|
| -
|
| - scoped_refptr<base::MessageLoopProxy> message_loop_;
|
| - IPC::Sender* message_sender_;
|
| + scoped_refptr<P2PSocketDispatcher> message_sender_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(AsyncMessageSender);
|
| };
|
|
|
| -P2PSocketDispatcher::P2PSocketDispatcher(RenderViewImpl* render_view)
|
| - : content::RenderViewObserver(render_view),
|
| - message_loop_(base::MessageLoopProxy::current()),
|
| +P2PSocketDispatcher::P2PSocketDispatcher(
|
| + base::MessageLoopProxy* ipc_message_loop)
|
| + : message_loop_(ipc_message_loop),
|
| network_notifications_started_(false),
|
| network_list_observers_(
|
| new ObserverListThreadSafe<webkit_glue::NetworkListObserver>()),
|
| - async_message_sender_(new AsyncMessageSender(this)) {
|
| + async_message_sender_(new AsyncMessageSender(this)),
|
| + channel_(NULL) {
|
| }
|
|
|
| P2PSocketDispatcher::~P2PSocketDispatcher() {
|
| @@ -63,7 +62,7 @@ P2PSocketDispatcher::~P2PSocketDispatcher() {
|
| destruction_observer_, OnSocketDispatcherDestroyed());
|
| network_list_observers_->AssertEmpty();
|
| if (network_notifications_started_)
|
| - Send(new P2PHostMsg_StopNetworkNotifications(routing_id()));
|
| + Send(new P2PHostMsg_StopNetworkNotifications());
|
| for (IDMap<P2PSocketClient>::iterator i(&clients_); !i.IsAtEnd();
|
| i.Advance()) {
|
| i.GetCurrentValue()->Detach();
|
| @@ -76,7 +75,7 @@ void P2PSocketDispatcher::AddNetworkListObserver(
|
| network_list_observers_->AddObserver(network_list_observer);
|
| network_notifications_started_ = true;
|
| async_message_sender_->Send(
|
| - new P2PHostMsg_StartNetworkNotifications(routing_id()));
|
| + new P2PHostMsg_StartNetworkNotifications());
|
| }
|
|
|
| void P2PSocketDispatcher::RemoveNetworkListObserver(
|
| @@ -94,6 +93,16 @@ void P2PSocketDispatcher::RemoveDestructionObserver(
|
| destruction_observer_.RemoveObserver(observer);
|
| }
|
|
|
| +void P2PSocketDispatcher::Send(IPC::Message* message) {
|
| + DCHECK(message_loop_->BelongsToCurrentThread());
|
| + if (!channel_) {
|
| + delete message;
|
| + return;
|
| + }
|
| +
|
| + channel_->Send(message);
|
| +}
|
| +
|
| bool P2PSocketDispatcher::OnMessageReceived(const IPC::Message& message) {
|
| bool handled = true;
|
| IPC_BEGIN_MESSAGE_MAP(P2PSocketDispatcher, message)
|
| @@ -108,29 +117,47 @@ bool P2PSocketDispatcher::OnMessageReceived(const IPC::Message& message) {
|
| return handled;
|
| }
|
|
|
| +void P2PSocketDispatcher::OnFilterAdded(IPC::Channel* channel) {
|
| + DVLOG(1) << "P2PSocketDispatcher::OnFilterAdded()";
|
| + // Captures the channel for IPC.
|
| + channel_ = channel;
|
| +}
|
| +
|
| +void P2PSocketDispatcher::OnFilterRemoved() {
|
| + channel_ = NULL;
|
| +}
|
| +
|
| +void P2PSocketDispatcher::OnChannelClosing() {
|
| + channel_ = NULL;
|
| +}
|
| +
|
| base::MessageLoopProxy* P2PSocketDispatcher::message_loop() {
|
| return message_loop_;
|
| }
|
|
|
| int P2PSocketDispatcher::RegisterClient(P2PSocketClient* client) {
|
| + DCHECK(message_loop_->BelongsToCurrentThread());
|
| return clients_.Add(client);
|
| }
|
|
|
| void P2PSocketDispatcher::UnregisterClient(int id) {
|
| + DCHECK(message_loop_->BelongsToCurrentThread());
|
| clients_.Remove(id);
|
| }
|
|
|
| void P2PSocketDispatcher::SendP2PMessage(IPC::Message* msg) {
|
| - msg->set_routing_id(routing_id());
|
| + DCHECK(message_loop_->BelongsToCurrentThread());
|
| Send(msg);
|
| }
|
|
|
| int P2PSocketDispatcher::RegisterHostAddressRequest(
|
| P2PHostAddressRequest* request) {
|
| + DCHECK(message_loop_->BelongsToCurrentThread());
|
| return host_address_requests_.Add(request);
|
| }
|
|
|
| void P2PSocketDispatcher::UnregisterHostAddressRequest(int id) {
|
| + DCHECK(message_loop_->BelongsToCurrentThread());
|
| host_address_requests_.Remove(id);
|
| }
|
|
|
|
|