diff options
Diffstat (limited to 'chrome')
8 files changed, 181 insertions, 83 deletions
diff --git a/chrome/browser/renderer_host/resource_dispatcher_host.cc b/chrome/browser/renderer_host/resource_dispatcher_host.cc index a4bd156..4bce18a 100644 --- a/chrome/browser/renderer_host/resource_dispatcher_host.cc +++ b/chrome/browser/renderer_host/resource_dispatcher_host.cc @@ -40,6 +40,7 @@ #include "chrome/browser/renderer_host/resource_request_details.h" #include "chrome/browser/renderer_host/safe_browsing_resource_handler.h" #include "chrome/browser/renderer_host/save_file_resource_handler.h" +#include "chrome/browser/renderer_host/socket_stream_dispatcher_host.h" #include "chrome/browser/renderer_host/sync_resource_handler.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" #include "chrome/browser/ssl/ssl_client_auth_handler.h" @@ -249,6 +250,7 @@ ResourceDispatcherHost::ResourceDispatcherHost() ALLOW_THIS_IN_INITIALIZER_LIST(user_script_listener_( new UserScriptListener(this))), safe_browsing_(new SafeBrowsingService), + socket_stream_dispatcher_host_(new SocketStreamDispatcherHost), webkit_thread_(new WebKitThread), request_id_(-1), ALLOW_THIS_IN_INITIALIZER_LIST(method_runner_(this)), @@ -336,8 +338,10 @@ bool ResourceDispatcherHost::HandleExternalProtocol(int request_id, bool ResourceDispatcherHost::OnMessageReceived(const IPC::Message& message, Receiver* receiver, bool* message_was_ok) { - if (!IsResourceDispatcherHostMessage(message)) - return false; + if (!IsResourceDispatcherHostMessage(message)) { + return socket_stream_dispatcher_host_->OnMessageReceived( + message, receiver, message_was_ok); + } *message_was_ok = true; receiver_ = receiver; diff --git a/chrome/browser/renderer_host/resource_dispatcher_host.h b/chrome/browser/renderer_host/resource_dispatcher_host.h index efdd741..a48cebe 100644 --- a/chrome/browser/renderer_host/resource_dispatcher_host.h +++ b/chrome/browser/renderer_host/resource_dispatcher_host.h @@ -36,6 +36,7 @@ class ResourceDispatcherHostRequestInfo; class ResourceHandler; class SafeBrowsingService; class SaveFileManager; +class SocketStreamDispatcherHost; class SSLClientAuthHandler; class UserScriptListener; class URLRequestContext; @@ -426,6 +427,8 @@ class ResourceDispatcherHost : public URLRequest::Delegate { scoped_refptr<SafeBrowsingService> safe_browsing_; + scoped_ptr<SocketStreamDispatcherHost> socket_stream_dispatcher_host_; + // We own the WebKit thread and see to its destruction. scoped_ptr<WebKitThread> webkit_thread_; diff --git a/chrome/browser/renderer_host/resource_message_filter.cc b/chrome/browser/renderer_host/resource_message_filter.cc index 81aefa6..1f623a3 100644 --- a/chrome/browser/renderer_host/resource_message_filter.cc +++ b/chrome/browser/renderer_host/resource_message_filter.cc @@ -31,7 +31,6 @@ #include "chrome/browser/renderer_host/browser_render_process_host.h" #include "chrome/browser/renderer_host/database_dispatcher_host.h" #include "chrome/browser/renderer_host/render_widget_helper.h" -#include "chrome/browser/renderer_host/socket_stream_dispatcher_host.h" #include "chrome/browser/spellchecker_platform_engine.h" #include "chrome/browser/task_manager.h" #include "chrome/browser/worker_host/message_port_dispatcher.h" @@ -173,7 +172,6 @@ ResourceMessageFilter::ResourceMessageFilter( new DatabaseDispatcherHost(profile->GetDatabaseTracker(), this))), notification_prefs_( profile->GetDesktopNotificationService()->prefs_cache()), - socket_stream_dispatcher_host_(new SocketStreamDispatcherHost), host_zoom_map_(profile->GetHostZoomMap()), off_the_record_(profile->IsOffTheRecord()), next_route_id_callback_(NewCallbackWithReturnValue( @@ -183,7 +181,6 @@ ResourceMessageFilter::ResourceMessageFilter( DCHECK(audio_renderer_host_.get()); DCHECK(appcache_dispatcher_host_.get()); DCHECK(dom_storage_dispatcher_host_.get()); - DCHECK(socket_stream_dispatcher_host_.get()); render_widget_helper_->Init(id(), resource_dispatcher_host_); } @@ -234,7 +231,6 @@ void ResourceMessageFilter::OnChannelConnected(int32 peer_pid) { WorkerService::GetInstance()->Initialize(resource_dispatcher_host_); appcache_dispatcher_host_->Initialize(this, id(), handle()); - socket_stream_dispatcher_host_->Initialize(this, id()); dom_storage_dispatcher_host_->Init(handle()); db_dispatcher_host_->Init(handle()); } @@ -269,8 +265,7 @@ bool ResourceMessageFilter::OnMessageReceived(const IPC::Message& msg) { audio_renderer_host_->OnMessageReceived(msg, &msg_is_ok) || db_dispatcher_host_->OnMessageReceived(msg, &msg_is_ok) || mp_dispatcher->OnMessageReceived( - msg, this, next_route_id_callback(), &msg_is_ok) || - socket_stream_dispatcher_host_->OnMessageReceived(msg, &msg_is_ok); + msg, this, next_route_id_callback(), &msg_is_ok); if (!handled) { DCHECK(msg_is_ok); // It should have been marked handled if it wasn't OK. diff --git a/chrome/browser/renderer_host/resource_message_filter.h b/chrome/browser/renderer_host/resource_message_filter.h index 7d5d137..b40dcb3 100644 --- a/chrome/browser/renderer_host/resource_message_filter.h +++ b/chrome/browser/renderer_host/resource_message_filter.h @@ -40,7 +40,6 @@ class HostZoomMap; class NotificationsPrefsCache; class Profile; class RenderWidgetHelper; -class SocketStreamDispatcherHost; class URLRequestContextGetter; struct ViewHostMsg_Audio_CreateStream; struct WebPluginInfo; @@ -373,9 +372,6 @@ class ResourceMessageFilter : public IPC::ChannelProxy::MessageFilter, // Desktop Notifications permission messages. scoped_refptr<NotificationsPrefsCache> notification_prefs_; - // Handles Socket Stream related messages. - scoped_ptr<SocketStreamDispatcherHost> socket_stream_dispatcher_host_; - // Handles zoom-related messages. scoped_refptr<HostZoomMap> host_zoom_map_; diff --git a/chrome/browser/renderer_host/socket_stream_dispatcher_host.cc b/chrome/browser/renderer_host/socket_stream_dispatcher_host.cc index 68f7d4f..a993683 100644 --- a/chrome/browser/renderer_host/socket_stream_dispatcher_host.cc +++ b/chrome/browser/renderer_host/socket_stream_dispatcher_host.cc @@ -11,50 +11,58 @@ #include "ipc/ipc_message.h" #include "net/websockets/websocket_throttle.h" -SocketStreamDispatcherHost::SocketStreamDispatcherHost() - : sender_(NULL) { +SocketStreamDispatcherHost::SocketStreamDispatcherHost() : receiver_(NULL) { net::WebSocketThrottle::Init(); } SocketStreamDispatcherHost::~SocketStreamDispatcherHost() { // TODO(ukai): Implement IDMap::RemoveAll(). - for (IDMap<SocketStreamHost>::const_iterator iter(&hosts_); + for (IDMap< IDMap<SocketStreamHost> >::const_iterator iter(&hostmap_); !iter.IsAtEnd(); iter.Advance()) { - int socket_id = iter.GetCurrentKey(); - const SocketStreamHost* socket_stream_host = iter.GetCurrentValue(); - delete socket_stream_host; - hosts_.Remove(socket_id); + int host_id = iter.GetCurrentKey(); + IDMap<SocketStreamHost>* hosts = + const_cast<IDMap<SocketStreamHost> *>(iter.GetCurrentValue()); + for (IDMap<SocketStreamHost>::const_iterator hosts_iter(hosts); + !hosts_iter.IsAtEnd(); + hosts_iter.Advance()) { + int socket_id = iter.GetCurrentKey(); + const SocketStreamHost* socket_stream_host = hosts_iter.GetCurrentValue(); + delete socket_stream_host; + hosts->Remove(socket_id); + } + hostmap_.Remove(host_id); + delete hosts; } } -void SocketStreamDispatcherHost::Initialize( - IPC::Message::Sender* sender, int process_id) { - DLOG(INFO) << "Initialize: SocketStreamDispatcherHost process_id=" - << process_id; - DCHECK(sender); - sender_ = sender; - process_id_ = process_id; -} +bool SocketStreamDispatcherHost::OnMessageReceived( + const IPC::Message& msg, + ResourceDispatcherHost::Receiver* receiver, + bool* msg_ok) { + if (!IsSocketStreamDispatcherHostMessage(msg)) + return false; -bool SocketStreamDispatcherHost::OnMessageReceived(const IPC::Message& msg, - bool* msg_ok) { - DCHECK(sender_); *msg_ok = true; bool handled = true; + receiver_ = receiver; IPC_BEGIN_MESSAGE_MAP_EX(SocketStreamDispatcherHost, msg, *msg_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; } // SocketStream::Delegate methods implementations. void SocketStreamDispatcherHost::OnConnected(net::SocketStream* socket, int max_pending_send_allowed) { - int socket_id = SocketStreamHost::SocketIdFromSocketStream(socket); + SocketStreamHost* socket_stream_host = + SocketStreamHost::GetSocketStreamHost(socket); + DCHECK(socket_stream_host); + int socket_id = socket_stream_host->socket_id(); DLOG(INFO) << "SocketStreamDispatcherHost::OnConnected socket_id=" << socket_id << " max_pending_send_allowed=" << max_pending_send_allowed; @@ -62,16 +70,18 @@ void SocketStreamDispatcherHost::OnConnected(net::SocketStream* socket, LOG(ERROR) << "NoSocketId in OnConnected"; return; } - if (!sender_->Send(new ViewMsg_SocketStream_Connected( - socket_id, max_pending_send_allowed))) { + if (!socket_stream_host->Connected(max_pending_send_allowed)) { LOG(ERROR) << "ViewMsg_SocketStream_Connected failed."; - DeleteSocketStreamHost(socket_id); + DeleteSocketStreamHost(socket_stream_host->receiver()->id(), socket_id); } } void SocketStreamDispatcherHost::OnSentData(net::SocketStream* socket, int amount_sent) { - int socket_id = SocketStreamHost::SocketIdFromSocketStream(socket); + SocketStreamHost* socket_stream_host = + SocketStreamHost::GetSocketStreamHost(socket); + DCHECK(socket_stream_host); + int socket_id = socket_stream_host->socket_id(); DLOG(INFO) << "SocketStreamDispatcherHost::OnSentData socket_id=" << socket_id << " amount_sent=" << amount_sent; @@ -79,38 +89,42 @@ void SocketStreamDispatcherHost::OnSentData(net::SocketStream* socket, LOG(ERROR) << "NoSocketId in OnReceivedData"; return; } - if (!sender_->Send( - new ViewMsg_SocketStream_SentData(socket_id, amount_sent))) { + if (!socket_stream_host->SentData(amount_sent)) { LOG(ERROR) << "ViewMsg_SocketStream_SentData failed."; - DeleteSocketStreamHost(socket_id); + DeleteSocketStreamHost(socket_stream_host->receiver()->id(), socket_id); } } void SocketStreamDispatcherHost::OnReceivedData( net::SocketStream* socket, const char* data, int len) { - int socket_id = SocketStreamHost::SocketIdFromSocketStream(socket); + SocketStreamHost* socket_stream_host = + SocketStreamHost::GetSocketStreamHost(socket); + DCHECK(socket_stream_host); + int socket_id = socket_stream_host->socket_id(); DLOG(INFO) << "SocketStreamDispatcherHost::OnReceiveData socket_id=" << socket_id; if (socket_id == chrome_common_net::kNoSocketId) { LOG(ERROR) << "NoSocketId in OnReceivedData"; return; } - if (!sender_->Send(new ViewMsg_SocketStream_ReceivedData( - socket_id, std::vector<char>(data, data + len)))) { + if (!socket_stream_host->ReceivedData(data, len)) { LOG(ERROR) << "ViewMsg_SocketStream_ReceivedData failed."; - DeleteSocketStreamHost(socket_id); + DeleteSocketStreamHost(socket_stream_host->receiver()->id(), socket_id); } } void SocketStreamDispatcherHost::OnClose(net::SocketStream* socket) { - int socket_id = SocketStreamHost::SocketIdFromSocketStream(socket); + SocketStreamHost* socket_stream_host = + SocketStreamHost::GetSocketStreamHost(socket); + DCHECK(socket_stream_host); + int socket_id = socket_stream_host->socket_id(); DLOG(INFO) << "SocketStreamDispatcherHost::OnClosed socket_id=" << socket_id; if (socket_id == chrome_common_net::kNoSocketId) { LOG(ERROR) << "NoSocketId in OnClose"; return; } - DeleteSocketStreamHost(socket_id); + DeleteSocketStreamHost(socket_stream_host->receiver()->id(), socket_id); } // Message handlers called by OnMessageReceived. @@ -118,12 +132,15 @@ void SocketStreamDispatcherHost::OnConnect(const GURL& url, int socket_id) { DLOG(INFO) << "SocketStreamDispatcherHost::OnConnect url=" << url << " socket_id=" << socket_id; DCHECK_NE(chrome_common_net::kNoSocketId, socket_id); - if (hosts_.Lookup(socket_id)) { - LOG(ERROR) << "socket_id=" << socket_id << " already registered."; + DCHECK(receiver_); + if (LookupHostMap(receiver_->id(), socket_id)) { + LOG(ERROR) << "host_id=" << receiver_->id() + << " socket_id=" << socket_id << " already registered."; return; } - SocketStreamHost* socket_stream_host = new SocketStreamHost(this, socket_id); - hosts_.AddWithID(socket_stream_host, socket_id); + SocketStreamHost* socket_stream_host = + new SocketStreamHost(this, receiver_, socket_id); + AddHostMap(receiver_->id(), socket_id, socket_stream_host); socket_stream_host->Connect(url); DLOG(INFO) << "SocketStreamDispatcherHost::OnConnect -> " << socket_id; } @@ -132,9 +149,12 @@ void SocketStreamDispatcherHost::OnSendData( int socket_id, const std::vector<char>& data) { DLOG(INFO) << "SocketStreamDispatcherHost::OnSendData socket_id=" << socket_id; - SocketStreamHost* socket_stream_host = hosts_.Lookup(socket_id); + DCHECK(receiver_); + SocketStreamHost* socket_stream_host = + LookupHostMap(receiver_->id(), socket_id); if (!socket_stream_host) { - LOG(ERROR) << "socket_id=" << socket_id << " already closed."; + LOG(ERROR) << "host_id=" << receiver_->id() + << " socket_id=" << socket_id << " already closed."; return; } if (!socket_stream_host->SendData(data)) { @@ -146,18 +166,57 @@ void SocketStreamDispatcherHost::OnSendData( void SocketStreamDispatcherHost::OnCloseReq(int socket_id) { DLOG(INFO) << "SocketStreamDispatcherHost::OnCloseReq socket_id=" << socket_id; - SocketStreamHost* socket_stream_host = hosts_.Lookup(socket_id); + DCHECK(receiver_); + SocketStreamHost* socket_stream_host = + LookupHostMap(receiver_->id(), socket_id); if (!socket_stream_host) return; socket_stream_host->Close(); } -void SocketStreamDispatcherHost::DeleteSocketStreamHost(int socket_id) { - SocketStreamHost* socket_stream_host = hosts_.Lookup(socket_id); +void SocketStreamDispatcherHost::DeleteSocketStreamHost( + int host_id, int socket_id) { + SocketStreamHost* socket_stream_host = LookupHostMap(host_id, socket_id); DCHECK(socket_stream_host); delete socket_stream_host; - hosts_.Remove(socket_id); - if (!sender_->Send(new ViewMsg_SocketStream_Closed(socket_id))) { - LOG(ERROR) << "ViewMsg_SocketStream_Closed failed."; + IDMap<SocketStreamHost>* hosts = hostmap_.Lookup(host_id); + DCHECK(hosts); + hosts->Remove(socket_id); + if (hosts->IsEmpty()) { + hostmap_.Remove(host_id); + delete hosts; + } +} + +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; } diff --git a/chrome/browser/renderer_host/socket_stream_dispatcher_host.h b/chrome/browser/renderer_host/socket_stream_dispatcher_host.h index 58bfaaa..01297ff 100644 --- a/chrome/browser/renderer_host/socket_stream_dispatcher_host.h +++ b/chrome/browser/renderer_host/socket_stream_dispatcher_host.h @@ -8,6 +8,7 @@ #include <vector> #include "base/id_map.h" +#include "chrome/browser/renderer_host/resource_dispatcher_host.h" #include "ipc/ipc_message.h" #include "net/socket_stream/socket_stream.h" @@ -22,8 +23,9 @@ class SocketStreamDispatcherHost : public net::SocketStream::Delegate { SocketStreamDispatcherHost(); virtual ~SocketStreamDispatcherHost(); - void Initialize(IPC::Message::Sender* sender, int process_id); - bool OnMessageReceived(const IPC::Message& msg, bool* msg_ok); + bool OnMessageReceived(const IPC::Message& msg, + ResourceDispatcherHost::Receiver* receiver, + bool* msg_ok); // SocketStream::Delegate methods. virtual void OnConnected(net::SocketStream* socket, @@ -33,22 +35,26 @@ class SocketStreamDispatcherHost : public net::SocketStream::Delegate { const char* data, int len); virtual void OnClose(net::SocketStream* socket); - // For sync message. - bool Send(IPC::Message* message) { - return sender_->Send(message); - } - private: // Message handlers called by OnMessageReceived. void OnConnect(const GURL& url, int socket_id); void OnSendData(int socket_id, const std::vector<char>& data); void OnCloseReq(int socket_id); - void DeleteSocketStreamHost(int socket_id); + void DeleteSocketStreamHost(int host_id, int socket_id); + + void AddHostMap(int host_id, int socket_id, + SocketStreamHost* socket_stream_host); + SocketStreamHost* LookupHostMap(int host_id, int socket_id); + + // Returns true if the message passed in is a SocketStream related message. + static bool IsSocketStreamDispatcherHostMessage(const IPC::Message& message); + + // key: host_id -> { key: socket_id -> value: SocketStreamHost } + IDMap< IDMap<SocketStreamHost> > hostmap_; - IPC::Message::Sender* sender_; - int process_id_; - IDMap<SocketStreamHost> hosts_; + // valid while OnMessageReceived processing. + ResourceDispatcherHost::Receiver* receiver_; DISALLOW_COPY_AND_ASSIGN(SocketStreamDispatcherHost); }; diff --git a/chrome/browser/renderer_host/socket_stream_host.cc b/chrome/browser/renderer_host/socket_stream_host.cc index 864cbf2..6fc49b4 100644 --- a/chrome/browser/renderer_host/socket_stream_host.cc +++ b/chrome/browser/renderer_host/socket_stream_host.cc @@ -8,39 +8,48 @@ #include "chrome/browser/profile.h" #include "chrome/browser/net/url_request_context_getter.h" #include "chrome/common/net/socket_stream.h" +#include "chrome/common/render_messages.h" #include "net/socket_stream/socket_stream.h" -static const char* kSocketIdKey = "socketId"; +static const char* kSocketHostKey = "socketHost"; -class SocketStreamId : public net::SocketStream::UserData { +class SocketStreamInfo : public net::SocketStream::UserData { public: - explicit SocketStreamId(int socket_id) : socket_id_(socket_id) {} - virtual ~SocketStreamId() {} - int socket_id() const { return socket_id_; } + explicit SocketStreamInfo(SocketStreamHost* host) : host_(host) {} + virtual ~SocketStreamInfo() {} + SocketStreamHost* host() const { return host_; } + private: - int socket_id_; + SocketStreamHost* host_; }; SocketStreamHost::SocketStreamHost( - net::SocketStream::Delegate* delegate, int socket_id) + net::SocketStream::Delegate* delegate, + ResourceDispatcherHost::Receiver* receiver, + int socket_id) : delegate_(delegate), + receiver_(receiver), socket_id_(socket_id) { DCHECK_NE(socket_id_, chrome_common_net::kNoSocketId); LOG(INFO) << "SocketStreamHost: socket_id=" << socket_id_; } /* static */ -int SocketStreamHost::SocketIdFromSocketStream(net::SocketStream* socket) { - net::SocketStream::UserData* d = socket->GetUserData(kSocketIdKey); +SocketStreamHost* +SocketStreamHost::GetSocketStreamHost(net::SocketStream* socket) { + net::SocketStream::UserData* d = socket->GetUserData(kSocketHostKey); if (d) { - SocketStreamId* socket_stream_id = static_cast<SocketStreamId*>(d); - return socket_stream_id->socket_id(); + SocketStreamInfo* info = static_cast<SocketStreamInfo*>(d); + return info->host(); } - return chrome_common_net::kNoSocketId; + return NULL; } SocketStreamHost::~SocketStreamHost() { LOG(INFO) << "SocketStreamHost destructed socket_id=" << socket_id_; + if (!receiver_->Send(new ViewMsg_SocketStream_Closed(socket_id_))) { + LOG(ERROR) << "ViewMsg_SocketStream_Closed failed."; + } socket_->DetachDelegate(); } @@ -50,7 +59,7 @@ void SocketStreamHost::Connect(const GURL& url) { URLRequestContextGetter* context_getter = Profile::GetDefaultRequestContext(); if (context_getter) socket_->set_context(context_getter->GetURLRequestContext()); - socket_->SetUserData(kSocketIdKey, new SocketStreamId(socket_id_)); + socket_->SetUserData(kSocketHostKey, new SocketStreamInfo(this)); socket_->Connect(); } @@ -67,3 +76,18 @@ void SocketStreamHost::Close() { return; return socket_->Close(); } + +bool SocketStreamHost::Connected(int max_pending_send_allowed) { + return receiver_->Send(new ViewMsg_SocketStream_Connected( + socket_id_, max_pending_send_allowed)); +} + +bool SocketStreamHost::SentData(int amount_sent) { + return receiver_->Send(new ViewMsg_SocketStream_SentData( + socket_id_, amount_sent)); +} + +bool SocketStreamHost::ReceivedData(const char* data, int len) { + return receiver_->Send(new ViewMsg_SocketStream_ReceivedData( + socket_id_, std::vector<char>(data, data + len))); +} diff --git a/chrome/browser/renderer_host/socket_stream_host.h b/chrome/browser/renderer_host/socket_stream_host.h index d7c1b46..180f818 100644 --- a/chrome/browser/renderer_host/socket_stream_host.h +++ b/chrome/browser/renderer_host/socket_stream_host.h @@ -8,6 +8,7 @@ #include <vector> #include "base/ref_counted.h" +#include "chrome/browser/renderer_host/resource_dispatcher_host.h" #include "net/socket_stream/socket_stream.h" class GURL; @@ -22,12 +23,15 @@ class GURL; // SocketStreamDispatcherHost. class SocketStreamHost { public: - SocketStreamHost(net::SocketStream::Delegate* delegate, int socket_id); + SocketStreamHost(net::SocketStream::Delegate* delegate, + ResourceDispatcherHost::Receiver* receiver, + int socket_id); ~SocketStreamHost(); - // Gets socket_id associated with |socket|. - static int SocketIdFromSocketStream(net::SocketStream* socket); + // Gets SocketStreamHost associated with |socket|. + static SocketStreamHost* GetSocketStreamHost(net::SocketStream* socket); + ResourceDispatcherHost::Receiver* receiver() const { return receiver_; } int socket_id() const { return socket_id_; } // Starts to open connection to |url|. @@ -43,8 +47,15 @@ class SocketStreamHost { // Closes the socket stream. void Close(); + bool Connected(int max_pending_send_allowed); + + bool SentData(int amount_sent); + + bool ReceivedData(const char* data, int len); + private: net::SocketStream::Delegate* delegate_; + ResourceDispatcherHost::Receiver* receiver_; int socket_id_; scoped_refptr<net::SocketStream> socket_; |