OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "chrome/browser/renderer_host/socket_stream_dispatcher_host.h" |
| 6 |
| 7 #include "base/logging.h" |
| 8 #include "chrome/browser/renderer_host/socket_stream_host.h" |
| 9 #include "chrome/common/render_messages.h" |
| 10 #include "chrome/common/net/socket_stream.h" |
| 11 #include "ipc/ipc_message.h" |
| 12 |
| 13 SocketStreamDispatcherHost::SocketStreamDispatcherHost() |
| 14 : sender_(NULL) { |
| 15 } |
| 16 |
| 17 SocketStreamDispatcherHost::~SocketStreamDispatcherHost() { |
| 18 for (IDMap<SocketStreamHost>::const_iterator iter(&hosts_); |
| 19 !iter.IsAtEnd(); |
| 20 iter.Advance()) { |
| 21 int socket_id = iter.GetCurrentKey(); |
| 22 hosts_.Remove(socket_id); |
| 23 } |
| 24 } |
| 25 |
| 26 void SocketStreamDispatcherHost::Initialize( |
| 27 IPC::Message::Sender* sender, int process_id) { |
| 28 LOG(INFO) << "Initialize: SocketStreamDispatcherHost process_id=" |
| 29 << process_id_; |
| 30 DCHECK(sender); |
| 31 sender_ = sender; |
| 32 process_id_ = process_id; |
| 33 } |
| 34 |
| 35 bool SocketStreamDispatcherHost::OnMessageReceived(const IPC::Message& msg, |
| 36 bool* msg_ok) { |
| 37 DCHECK(sender_); |
| 38 *msg_ok = true; |
| 39 bool handled = true; |
| 40 IPC_BEGIN_MESSAGE_MAP_EX(SocketStreamDispatcherHost, msg, *msg_ok) |
| 41 IPC_MESSAGE_HANDLER(ViewHostMsg_SocketStream_Connect, OnConnect) |
| 42 IPC_MESSAGE_HANDLER(ViewHostMsg_SocketStream_SendData, OnSendData) |
| 43 IPC_MESSAGE_HANDLER(ViewHostMsg_SocketStream_Close, OnCloseReq) |
| 44 IPC_MESSAGE_UNHANDLED(handled = false) |
| 45 IPC_END_MESSAGE_MAP_EX() |
| 46 return handled; |
| 47 } |
| 48 |
| 49 void SocketStreamDispatcherHost::OnConnected(net::SocketStream* socket, |
| 50 int max_pending_send_allowed) { |
| 51 int socket_id = SocketStreamHost::SocketIdFromSocketStream(socket); |
| 52 LOG(INFO) << "SocketStreamDispatcherHost::OnConnected socket_id=" |
| 53 << socket_id |
| 54 << " max_pending_send_allowed=" << max_pending_send_allowed; |
| 55 if (socket_id == chrome_common_net::kNoSocketId) |
| 56 return; |
| 57 if (!sender_->Send(new ViewMsg_SocketStream_Connected( |
| 58 socket_id, max_pending_send_allowed))) { |
| 59 LOG(ERROR) << "ViewMsg_SocketStream_Connected failed."; |
| 60 DeleteSocketStreamHost(socket_id); |
| 61 } |
| 62 } |
| 63 |
| 64 void SocketStreamDispatcherHost::OnSentData(net::SocketStream* socket, |
| 65 int amount_sent) { |
| 66 int socket_id = SocketStreamHost::SocketIdFromSocketStream(socket); |
| 67 LOG(INFO) << "SocketStreamDispatcherHost::OnDataSent socket_id=" |
| 68 << socket_id |
| 69 << " amount_sent=" << amount_sent; |
| 70 if (socket_id == chrome_common_net::kNoSocketId) |
| 71 return; |
| 72 if (!sender_->Send( |
| 73 new ViewMsg_SocketStream_SentData(socket_id, amount_sent))) { |
| 74 LOG(ERROR) << "ViewMsg_SocketStream_DataSent failed."; |
| 75 DeleteSocketStreamHost(socket_id); |
| 76 } |
| 77 } |
| 78 |
| 79 void SocketStreamDispatcherHost::OnReceivedData( |
| 80 net::SocketStream* socket, const char* data, int len) { |
| 81 int socket_id = SocketStreamHost::SocketIdFromSocketStream(socket); |
| 82 LOG(INFO) << "SocketStreamDispatcherHost::OnReceiveData socket_id=" |
| 83 << socket_id; |
| 84 if (socket_id == chrome_common_net::kNoSocketId) |
| 85 return; |
| 86 if (!sender_->Send(new ViewMsg_SocketStream_ReceivedData( |
| 87 socket_id, std::vector<char>(data, data + len)))) { |
| 88 LOG(ERROR) << "ViewMsg_SocketStream_ReceivedData failed."; |
| 89 DeleteSocketStreamHost(socket_id); |
| 90 } |
| 91 } |
| 92 |
| 93 void SocketStreamDispatcherHost::OnClose(net::SocketStream* socket) { |
| 94 int socket_id = SocketStreamHost::SocketIdFromSocketStream(socket); |
| 95 LOG(INFO) << "SocketStreamDispatcherHost::OnClosed socket_id=" |
| 96 << socket_id; |
| 97 if (socket_id == chrome_common_net::kNoSocketId) |
| 98 return; |
| 99 DeleteSocketStreamHost(socket_id); |
| 100 } |
| 101 |
| 102 void SocketStreamDispatcherHost::OnConnect(const GURL& url, int socket_id) { |
| 103 LOG(INFO) << "SocketStreamDispatcherHost::OnConnect url=" << url |
| 104 << " socket_id=" << socket_id; |
| 105 SocketStreamHost* socket_stream_host = new SocketStreamHost(this, socket_id); |
| 106 if (hosts_.Lookup(socket_id)) { |
| 107 LOG(ERROR) << "socket_id=" << socket_id << " already registered."; |
| 108 return; |
| 109 } |
| 110 hosts_.AddWithID(socket_stream_host, socket_id); |
| 111 socket_stream_host->Connect(url); |
| 112 LOG(INFO) << "SocketStreamDispatcherHost::OnConnect -> " << socket_id; |
| 113 } |
| 114 |
| 115 void SocketStreamDispatcherHost::OnSendData( |
| 116 int socket_id, const std::vector<char>& data) { |
| 117 LOG(INFO) << "SocketStreamDispatcherHost::OnSendData socket_id=" << socket_id; |
| 118 SocketStreamHost* socket_stream_host = hosts_.Lookup(socket_id); |
| 119 if (!socket_stream_host) |
| 120 return; |
| 121 if (!socket_stream_host->SendData(data)) { |
| 122 // Cannot accept more data to send. |
| 123 socket_stream_host->Close(); |
| 124 } |
| 125 } |
| 126 |
| 127 void SocketStreamDispatcherHost::OnCloseReq(int socket_id) { |
| 128 LOG(INFO) << "SocketStreamDispatcherHost::OnClose socket_id=" << socket_id; |
| 129 SocketStreamHost* socket_stream_host = hosts_.Lookup(socket_id); |
| 130 if (!socket_stream_host) |
| 131 return; |
| 132 socket_stream_host->Close(); |
| 133 } |
| 134 |
| 135 void SocketStreamDispatcherHost::DeleteSocketStreamHost(int socket_id) { |
| 136 SocketStreamHost* socket_stream_host = hosts_.Lookup(socket_id); |
| 137 DCHECK(socket_stream_host); |
| 138 delete socket_stream_host; |
| 139 hosts_.Remove(socket_id); |
| 140 if (!sender_->Send(new ViewMsg_SocketStream_Closed(socket_id))) { |
| 141 LOG(ERROR) << "ViewMsg_SocketStream_Closed failed."; |
| 142 } |
| 143 } |
OLD | NEW |