Index: chrome/browser/renderer_host/socket_stream_dispatcher_host.cc |
=================================================================== |
--- chrome/browser/renderer_host/socket_stream_dispatcher_host.cc (revision 69086) |
+++ chrome/browser/renderer_host/socket_stream_dispatcher_host.cc (working copy) |
@@ -8,126 +8,93 @@ |
#include "chrome/browser/renderer_host/socket_stream_host.h" |
#include "chrome/common/render_messages.h" |
#include "chrome/common/net/socket_stream.h" |
-#include "ipc/ipc_message.h" |
#include "net/websockets/websocket_job.h" |
#include "net/websockets/websocket_throttle.h" |
-SocketStreamDispatcherHost::SocketStreamDispatcherHost() : receiver_(NULL) { |
+SocketStreamDispatcherHost::SocketStreamDispatcherHost() { |
net::WebSocketJob::EnsureInit(); |
} |
SocketStreamDispatcherHost::~SocketStreamDispatcherHost() { |
// TODO(ukai): Implement IDMap::RemoveAll(). |
- for (IDMap< IDMap<SocketStreamHost> >::const_iterator iter(&hostmap_); |
+ for (IDMap<SocketStreamHost>::const_iterator iter(&hosts_); |
!iter.IsAtEnd(); |
iter.Advance()) { |
- int host_id = iter.GetCurrentKey(); |
- CancelRequestsForProcess(host_id); |
+ int socket_id = iter.GetCurrentKey(); |
+ const SocketStreamHost* socket_stream_host = iter.GetCurrentValue(); |
+ delete socket_stream_host; |
+ hosts_.Remove(socket_id); |
} |
} |
-bool SocketStreamDispatcherHost::OnMessageReceived( |
- const IPC::Message& msg, |
- ResourceDispatcherHost::Receiver* receiver, |
- bool* msg_ok) { |
- if (!IsSocketStreamDispatcherHostMessage(msg)) |
- return false; |
- |
- *msg_ok = true; |
+bool SocketStreamDispatcherHost::OnMessageReceived(const IPC::Message& message, |
+ bool* message_was_ok) { |
bool handled = true; |
- receiver_ = receiver; |
- IPC_BEGIN_MESSAGE_MAP_EX(SocketStreamDispatcherHost, msg, *msg_ok) |
+ IPC_BEGIN_MESSAGE_MAP_EX(SocketStreamDispatcherHost, message, *message_was_ok) |
IPC_MESSAGE_HANDLER(ViewHostMsg_SocketStream_Connect, OnConnect) |
IPC_MESSAGE_HANDLER(ViewHostMsg_SocketStream_SendData, OnSendData) |
IPC_MESSAGE_HANDLER(ViewHostMsg_SocketStream_Close, OnCloseReq) |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP_EX() |
- receiver_ = NULL; |
return handled; |
} |
-void SocketStreamDispatcherHost::CancelRequestsForProcess(int host_id) { |
- IDMap<SocketStreamHost>* hosts = hostmap_.Lookup(host_id); |
- if (hosts == NULL) |
- return; |
- for (IDMap<SocketStreamHost>::const_iterator hosts_iter(hosts); |
- !hosts_iter.IsAtEnd(); |
- hosts_iter.Advance()) { |
- const SocketStreamHost* socket_stream_host = hosts_iter.GetCurrentValue(); |
- delete socket_stream_host; |
- int socket_id = hosts_iter.GetCurrentKey(); |
- hosts->Remove(socket_id); |
- } |
- hostmap_.Remove(host_id); |
- delete hosts; |
-} |
- |
// SocketStream::Delegate methods implementations. |
void SocketStreamDispatcherHost::OnConnected(net::SocketStream* socket, |
int max_pending_send_allowed) { |
- SocketStreamHost* socket_stream_host = |
- SocketStreamHost::GetSocketStreamHost(socket); |
- DCHECK(socket_stream_host); |
- int socket_id = socket_stream_host->socket_id(); |
+ int socket_id = SocketStreamHost::SocketIdFromSocketStream(socket); |
DVLOG(1) << "SocketStreamDispatcherHost::OnConnected socket_id=" << socket_id |
<< " max_pending_send_allowed=" << max_pending_send_allowed; |
if (socket_id == chrome_common_net::kNoSocketId) { |
LOG(ERROR) << "NoSocketId in OnConnected"; |
return; |
} |
- if (!socket_stream_host->Connected(max_pending_send_allowed)) { |
+ if (!Send(new ViewMsg_SocketStream_Connected( |
+ socket_id, max_pending_send_allowed))) { |
LOG(ERROR) << "ViewMsg_SocketStream_Connected failed."; |
- DeleteSocketStreamHost(socket_stream_host->receiver()->id(), socket_id); |
+ DeleteSocketStreamHost(socket_id); |
} |
} |
void SocketStreamDispatcherHost::OnSentData(net::SocketStream* socket, |
int amount_sent) { |
- SocketStreamHost* socket_stream_host = |
- SocketStreamHost::GetSocketStreamHost(socket); |
- DCHECK(socket_stream_host); |
- int socket_id = socket_stream_host->socket_id(); |
+ int socket_id = SocketStreamHost::SocketIdFromSocketStream(socket); |
DVLOG(1) << "SocketStreamDispatcherHost::OnSentData socket_id=" << socket_id |
<< " amount_sent=" << amount_sent; |
if (socket_id == chrome_common_net::kNoSocketId) { |
LOG(ERROR) << "NoSocketId in OnReceivedData"; |
return; |
} |
- if (!socket_stream_host->SentData(amount_sent)) { |
+ if (!Send(new ViewMsg_SocketStream_SentData(socket_id, amount_sent))) { |
LOG(ERROR) << "ViewMsg_SocketStream_SentData failed."; |
- DeleteSocketStreamHost(socket_stream_host->receiver()->id(), socket_id); |
+ DeleteSocketStreamHost(socket_id); |
} |
} |
void SocketStreamDispatcherHost::OnReceivedData( |
net::SocketStream* socket, const char* data, int len) { |
- SocketStreamHost* socket_stream_host = |
- SocketStreamHost::GetSocketStreamHost(socket); |
- DCHECK(socket_stream_host); |
- int socket_id = socket_stream_host->socket_id(); |
+ int socket_id = SocketStreamHost::SocketIdFromSocketStream(socket); |
DVLOG(1) << "SocketStreamDispatcherHost::OnReceiveData socket_id=" |
<< socket_id; |
if (socket_id == chrome_common_net::kNoSocketId) { |
LOG(ERROR) << "NoSocketId in OnReceivedData"; |
return; |
} |
- if (!socket_stream_host->ReceivedData(data, len)) { |
+ if (!Send(new ViewMsg_SocketStream_ReceivedData( |
+ socket_id, std::vector<char>(data, data + len)))) { |
LOG(ERROR) << "ViewMsg_SocketStream_ReceivedData failed."; |
- DeleteSocketStreamHost(socket_stream_host->receiver()->id(), socket_id); |
+ DeleteSocketStreamHost(socket_id); |
} |
} |
void SocketStreamDispatcherHost::OnClose(net::SocketStream* socket) { |
- SocketStreamHost* socket_stream_host = |
- SocketStreamHost::GetSocketStreamHost(socket); |
- DCHECK(socket_stream_host); |
- int socket_id = socket_stream_host->socket_id(); |
+ int socket_id = SocketStreamHost::SocketIdFromSocketStream(socket); |
DVLOG(1) << "SocketStreamDispatcherHost::OnClosed socket_id=" << socket_id; |
if (socket_id == chrome_common_net::kNoSocketId) { |
LOG(ERROR) << "NoSocketId in OnClose"; |
return; |
} |
- DeleteSocketStreamHost(socket_stream_host->receiver()->id(), socket_id); |
+ DeleteSocketStreamHost(socket_id); |
} |
// Message handlers called by OnMessageReceived. |
@@ -135,15 +102,12 @@ |
DVLOG(1) << "SocketStreamDispatcherHost::OnConnect url=" << url |
<< " socket_id=" << socket_id; |
DCHECK_NE(chrome_common_net::kNoSocketId, socket_id); |
- DCHECK(receiver_); |
- if (LookupHostMap(receiver_->id(), socket_id)) { |
- LOG(ERROR) << "host_id=" << receiver_->id() |
- << " socket_id=" << socket_id << " already registered."; |
+ if (hosts_.Lookup(socket_id)) { |
+ LOG(ERROR) << "socket_id=" << socket_id << " already registered."; |
return; |
} |
- SocketStreamHost* socket_stream_host = |
- new SocketStreamHost(this, receiver_, socket_id); |
- AddHostMap(receiver_->id(), socket_id, socket_stream_host); |
+ SocketStreamHost* socket_stream_host = new SocketStreamHost(this, socket_id); |
+ hosts_.AddWithID(socket_stream_host, socket_id); |
socket_stream_host->Connect(url); |
DVLOG(1) << "SocketStreamDispatcherHost::OnConnect -> " << socket_id; |
} |
@@ -151,12 +115,9 @@ |
void SocketStreamDispatcherHost::OnSendData( |
int socket_id, const std::vector<char>& data) { |
DVLOG(1) << "SocketStreamDispatcherHost::OnSendData socket_id=" << socket_id; |
- DCHECK(receiver_); |
- SocketStreamHost* socket_stream_host = |
- LookupHostMap(receiver_->id(), socket_id); |
+ SocketStreamHost* socket_stream_host = hosts_.Lookup(socket_id); |
if (!socket_stream_host) { |
- LOG(ERROR) << "host_id=" << receiver_->id() |
- << " socket_id=" << socket_id << " already closed."; |
+ LOG(ERROR) << "socket_id=" << socket_id << " already closed."; |
return; |
} |
if (!socket_stream_host->SendData(data)) { |
@@ -167,57 +128,18 @@ |
void SocketStreamDispatcherHost::OnCloseReq(int socket_id) { |
DVLOG(1) << "SocketStreamDispatcherHost::OnCloseReq socket_id=" << socket_id; |
- DCHECK(receiver_); |
- SocketStreamHost* socket_stream_host = |
- LookupHostMap(receiver_->id(), socket_id); |
+ SocketStreamHost* socket_stream_host = hosts_.Lookup(socket_id); |
if (!socket_stream_host) |
return; |
socket_stream_host->Close(); |
} |
-void SocketStreamDispatcherHost::DeleteSocketStreamHost( |
- int host_id, int socket_id) { |
- SocketStreamHost* socket_stream_host = LookupHostMap(host_id, socket_id); |
+void SocketStreamDispatcherHost::DeleteSocketStreamHost(int socket_id) { |
+ SocketStreamHost* socket_stream_host = hosts_.Lookup(socket_id); |
DCHECK(socket_stream_host); |
delete socket_stream_host; |
- IDMap<SocketStreamHost>* hosts = hostmap_.Lookup(host_id); |
- DCHECK(hosts); |
- hosts->Remove(socket_id); |
- if (hosts->IsEmpty()) { |
- hostmap_.Remove(host_id); |
- delete hosts; |
+ hosts_.Remove(socket_id); |
+ if (!Send(new ViewMsg_SocketStream_Closed(socket_id))) { |
+ LOG(ERROR) << "ViewMsg_SocketStream_Closed failed."; |
} |
} |
- |
-void SocketStreamDispatcherHost::AddHostMap( |
- int host_id, int socket_id, SocketStreamHost* socket_stream_host) { |
- IDMap<SocketStreamHost>* hosts = hostmap_.Lookup(host_id); |
- if (!hosts) { |
- hosts = new IDMap<SocketStreamHost>; |
- hostmap_.AddWithID(hosts, host_id); |
- } |
- hosts->AddWithID(socket_stream_host, socket_id); |
-} |
- |
-SocketStreamHost* SocketStreamDispatcherHost::LookupHostMap( |
- int host_id, int socket_id) { |
- IDMap<SocketStreamHost>* hosts = hostmap_.Lookup(host_id); |
- if (!hosts) |
- return NULL; |
- return hosts->Lookup(socket_id); |
-} |
- |
-/* static */ |
-bool SocketStreamDispatcherHost::IsSocketStreamDispatcherHostMessage( |
- const IPC::Message& message) { |
- switch (message.type()) { |
- case ViewHostMsg_SocketStream_Connect::ID: |
- case ViewHostMsg_SocketStream_SendData::ID: |
- case ViewHostMsg_SocketStream_Close::ID: |
- return true; |
- |
- default: |
- break; |
- } |
- return false; |
-} |