| 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..c999e621399c6e51197ae9b5086000453564e29c 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"
|
| @@ -15,68 +16,28 @@
|
|
|
| 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) {
|
| - }
|
| -
|
| - 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));
|
| - }
|
| -
|
| - 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_;
|
| -
|
| - 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)) {
|
| + channel_(NULL) {
|
| }
|
|
|
| P2PSocketDispatcher::~P2PSocketDispatcher() {
|
| - FOR_EACH_OBSERVER(P2PSocketDispatcherDestructionObserver,
|
| - destruction_observer_, OnSocketDispatcherDestroyed());
|
| network_list_observers_->AssertEmpty();
|
| - if (network_notifications_started_)
|
| - Send(new P2PHostMsg_StopNetworkNotifications(routing_id()));
|
| for (IDMap<P2PSocketClient>::iterator i(&clients_); !i.IsAtEnd();
|
| i.Advance()) {
|
| i.GetCurrentValue()->Detach();
|
| }
|
| - async_message_sender_->Detach();
|
| }
|
|
|
| void P2PSocketDispatcher::AddNetworkListObserver(
|
| webkit_glue::NetworkListObserver* network_list_observer) {
|
| network_list_observers_->AddObserver(network_list_observer);
|
| network_notifications_started_ = true;
|
| - async_message_sender_->Send(
|
| - new P2PHostMsg_StartNetworkNotifications(routing_id()));
|
| + SendP2PMessage(new P2PHostMsg_StartNetworkNotifications());
|
| }
|
|
|
| void P2PSocketDispatcher::RemoveNetworkListObserver(
|
| @@ -84,14 +45,15 @@ void P2PSocketDispatcher::RemoveNetworkListObserver(
|
| network_list_observers_->RemoveObserver(network_list_observer);
|
| }
|
|
|
| -void P2PSocketDispatcher::AddDestructionObserver(
|
| - P2PSocketDispatcherDestructionObserver* observer) {
|
| - destruction_observer_.AddObserver(observer);
|
| -}
|
| +void P2PSocketDispatcher::Send(IPC::Message* message) {
|
| + DCHECK(message_loop_->BelongsToCurrentThread());
|
| + if (!channel_) {
|
| + DLOG(WARNING) << "P2PSocketDispatcher::Send() - Channel closed.";
|
| + delete message;
|
| + return;
|
| + }
|
|
|
| -void P2PSocketDispatcher::RemoveDestructionObserver(
|
| - P2PSocketDispatcherDestructionObserver* observer) {
|
| - destruction_observer_.RemoveObserver(observer);
|
| + channel_->Send(message);
|
| }
|
|
|
| bool P2PSocketDispatcher::OnMessageReceived(const IPC::Message& message) {
|
| @@ -108,29 +70,51 @@ bool P2PSocketDispatcher::OnMessageReceived(const IPC::Message& message) {
|
| return handled;
|
| }
|
|
|
| +void P2PSocketDispatcher::OnFilterAdded(IPC::Channel* channel) {
|
| + DVLOG(1) << "P2PSocketDispatcher::OnFilterAdded()";
|
| + 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());
|
| + if (!message_loop_->BelongsToCurrentThread()) {
|
| + message_loop_->PostTask(FROM_HERE,
|
| + base::Bind(&P2PSocketDispatcher::Send,
|
| + this, msg));
|
| + return;
|
| + }
|
| 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);
|
| }
|
|
|
|
|