| 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;
|
| -}
|
|
|