socket_stream_dispatcher_host.h revision 58537e28ecd584eab876aee8be7156509866d23a
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_BROWSER_RENDERER_HOST_SOCKET_STREAM_DISPATCHER_HOST_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_BROWSER_RENDERER_HOST_SOCKET_STREAM_DISPATCHER_HOST_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/callback_forward.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/id_map.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/ssl/ssl_error_handler.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_message_filter.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket_stream/socket_stream.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLInfo;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourceContext;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketStreamHost;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dispatches ViewHostMsg_SocketStream_* messages sent from renderer.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It also acts as SocketStream::Delegate so that it sends
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ViewMsg_SocketStream_* messages back to renderer.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketStreamDispatcherHost
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public BrowserMessageFilter,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public net::SocketStream::Delegate,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public SSLErrorHandler::Delegate {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  typedef base::Callback<net::URLRequestContext*(ResourceType::Type)>
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      GetRequestContextCallback;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketStreamDispatcherHost(
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int render_process_id,
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const GetRequestContextCallback& request_context_callback,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ResourceContext* resource_context);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BrowserMessageFilter:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 bool* message_was_ok) OVERRIDE;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Make this object inactive.
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Remove all active SocketStreamHost objects.
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void Shutdown();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SocketStream::Delegate:
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnConnected(net::SocketStream* socket,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int max_pending_send_allowed) OVERRIDE;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnSentData(net::SocketStream* socket, int amount_sent) OVERRIDE;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnReceivedData(net::SocketStream* socket,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const char* data, int len) OVERRIDE;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnClose(net::SocketStream* socket) OVERRIDE;
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnError(const net::SocketStream* socket, int error) OVERRIDE;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnSSLCertificateError(net::SocketStream* socket,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const net::SSLInfo& ssl_info,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     bool fatal) OVERRIDE;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool CanGetCookies(net::SocketStream* socket,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const GURL& url) OVERRIDE;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool CanSetCookie(net::SocketStream* request,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const GURL& url,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const std::string& cookie_line,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            net::CookieOptions* options) OVERRIDE;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SSLErrorHandler::Delegate methods:
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CancelSSLRequest(const GlobalRequestID& id,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                int error,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const net::SSLInfo* ssl_info) OVERRIDE;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ContinueSSLRequest(const GlobalRequestID& id) OVERRIDE;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketStreamDispatcherHost();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Message handlers called by OnMessageReceived.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnConnect(int render_view_id, const GURL& url, int socket_id);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSendData(int socket_id, const std::vector<char>& data);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCloseReq(int socket_id);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteSocketStreamHost(int socket_id);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLRequestContext* GetURLRequestContext();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDMap<SocketStreamHost> hosts_;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int render_process_id_;
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetRequestContextCallback request_context_callback_;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceContext* resource_context_;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<SocketStreamDispatcherHost> weak_ptr_factory_;
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool on_shutdown_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SocketStreamDispatcherHost);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_BROWSER_RENDERER_HOST_SOCKET_STREAM_DISPATCHER_HOST_H_
101