Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(449)

Side by Side Diff: extensions/browser/api/cast_channel/cast_socket.h

Issue 555283002: Create new class "CastTransport", which encapsulates the message read and write event loops. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed wez's feedback. Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef EXTENSIONS_BROWSER_API_CAST_CHANNEL_CAST_SOCKET_H_ 5 #ifndef EXTENSIONS_BROWSER_API_CAST_CHANNEL_CAST_SOCKET_H_
6 #define EXTENSIONS_BROWSER_API_CAST_CHANNEL_CAST_SOCKET_H_ 6 #define EXTENSIONS_BROWSER_API_CAST_CHANNEL_CAST_SOCKET_H_
7 7
8 #include <queue> 8 #include <queue>
9 #include <string> 9 #include <string>
10 10
(...skipping 24 matching lines...) Expand all
35 namespace core_api { 35 namespace core_api {
36 namespace cast_channel { 36 namespace cast_channel {
37 37
38 class CastMessage; 38 class CastMessage;
39 class Logger; 39 class Logger;
40 struct LastErrors; 40 struct LastErrors;
41 class MessageFramer; 41 class MessageFramer;
42 42
43 // This class implements a channel between Chrome and a Cast device using a TCP 43 // This class implements a channel between Chrome and a Cast device using a TCP
44 // socket with SSL. The channel may authenticate that the receiver is a genuine 44 // socket with SSL. The channel may authenticate that the receiver is a genuine
45 // Cast device. All CastSocket objects must be used only on the IO thread. 45 // Cast device. All CastSocketImpl objects must be used only on the IO thread.
46 // 46 //
47 // NOTE: Not called "CastChannel" to reduce confusion with the generated API 47 // NOTE: Not called "CastChannel" to reduce confusion with the generated API
48 // code. 48 // code.
49 class CastSocket : public ApiResource { 49 class CastSocketImpl : public ApiResource {
50 public: 50 public:
51 // Object to be informed of incoming messages and errors. The CastSocket that 51 // Object to be informed of incoming messages and errors. The CastSocketImpl
52 // that
52 // owns the delegate must not be deleted by it, only by the ApiResourceManager 53 // owns the delegate must not be deleted by it, only by the ApiResourceManager
53 // or in the callback to Close(). 54 // or in the callback to Close().
54 class Delegate { 55 class Delegate {
55 public: 56 public:
56 // An error occurred on the channel. |last_errors| contains the last errors 57 // An error occurred on the channel. |last_errors| contains the last errors
57 // logged for the channel from the implementation. 58 // logged for the channel from the implementation.
58 virtual void OnError(const CastSocket* socket, 59 virtual void OnError(const CastSocketImpl* socket,
59 ChannelError error_state, 60 ChannelError error_state,
60 const LastErrors& last_errors) = 0; 61 const LastErrors& last_errors) = 0;
61 // A message was received on the channel. 62 // A message was received on the channel.
62 virtual void OnMessage(const CastSocket* socket, 63 virtual void OnMessage(const CastSocketImpl* socket,
63 const MessageInfo& message) = 0; 64 const MessageInfo& message) = 0;
64 65
65 protected: 66 protected:
66 virtual ~Delegate() {} 67 virtual ~Delegate() {}
67 }; 68 };
68 69
69 // Creates a new CastSocket that connects to |ip_endpoint| with 70 // Creates a new CastSocketImpl that connects to |ip_endpoint| with
70 // |channel_auth|. |owner_extension_id| is the id of the extension that opened 71 // |channel_auth|. |owner_extension_id| is the id of the extension that opened
71 // the socket. |channel_auth| must not be CHANNEL_AUTH_NONE. 72 // the socket. |channel_auth| must not be CHANNEL_AUTH_NONE.
72 CastSocket(const std::string& owner_extension_id, 73 CastSocketImpl(const std::string& owner_extension_id,
73 const net::IPEndPoint& ip_endpoint, 74 const net::IPEndPoint& ip_endpoint,
74 ChannelAuthType channel_auth, 75 ChannelAuthType channel_auth,
75 CastSocket::Delegate* delegate, 76 CastSocketImpl::Delegate* delegate,
76 net::NetLog* net_log, 77 net::NetLog* net_log,
77 const base::TimeDelta& connect_timeout, 78 const base::TimeDelta& connect_timeout,
78 const scoped_refptr<Logger>& logger); 79 const scoped_refptr<Logger>& logger);
79 80
80 // Ensures that the socket is closed. 81 // Ensures that the socket is closed.
81 virtual ~CastSocket(); 82 virtual ~CastSocketImpl();
82 83
83 // The IP endpoint for the destination of the channel. 84 // The IP endpoint for the destination of the channel.
84 const net::IPEndPoint& ip_endpoint() const { return ip_endpoint_; } 85 const net::IPEndPoint& ip_endpoint() const { return ip_endpoint_; }
85 86
86 // The authentication level requested for the channel. 87 // The authentication level requested for the channel.
87 ChannelAuthType channel_auth() const { return channel_auth_; } 88 ChannelAuthType channel_auth() const { return channel_auth_; }
88 89
89 // Returns a cast:// or casts:// URL for the channel endpoint. 90 // Returns a cast:// or casts:// URL for the channel endpoint.
90 // For backwards compatibility. 91 // For backwards compatibility.
91 std::string CastUrl() const; 92 std::string CastUrl() const;
92 93
93 // Channel id for the ApiResourceManager. 94 // Channel id for the ApiResourceManager.
94 int id() const { return channel_id_; } 95 int id() const { return channel_id_; }
95 96
96 // Sets the channel id. 97 // Sets the channel id.
97 void set_id(int channel_id) { channel_id_ = channel_id; } 98 void set_id(int channel_id) { channel_id_ = channel_id; }
98 99
99 // Returns the state of the channel. Virtual for testing. 100 // Returns the state of the channel. Virtual for testing.
100 virtual ReadyState ready_state() const; 101 virtual ReadyState ready_state() const;
101 102
102 // Returns the last error that occurred on this channel, or 103 // Returns the last error that occurred on this channel, or
103 // CHANNEL_ERROR_NONE if no error has occurred. Virtual for testing. 104 // CHANNEL_ERROR_NONE if no error has occurred. Virtual for testing.
104 virtual ChannelError error_state() const; 105 virtual ChannelError error_state() const;
105 106
106 // Connects the channel to the peer. If successful, the channel will be in 107 // Connects the channel to the peer. If successful, the channel will be in
107 // READY_STATE_OPEN. DO NOT delete the CastSocket object in |callback|. 108 // READY_STATE_OPEN. DO NOT delete the CastSocketImpl object in |callback|.
108 // Instead use Close(). 109 // Instead use Close().
109 virtual void Connect(const net::CompletionCallback& callback); 110 virtual void Connect(const net::CompletionCallback& callback);
110 111
111 // Sends a message over a connected channel. The channel must be in 112 // Sends a message over a connected channel. The channel must be in
112 // READY_STATE_OPEN. 113 // READY_STATE_OPEN.
113 // 114 //
114 // Note that if an error occurs the following happens: 115 // Note that if an error occurs the following happens:
115 // 1. Completion callbacks for all pending writes are invoked with error. 116 // 1. Completion callbacks for all pending writes are invoked with error.
116 // 2. Delegate::OnError is called once. 117 // 2. Delegate::OnError is called once.
117 // 3. CastSocket is closed. 118 // 3. CastSocketImpl is closed.
118 // 119 //
119 // DO NOT delete the CastSocket object in |callback|. Instead use Close(). 120 // DO NOT delete the CastSocketImpl object in |callback|. Instead use Close().
120 virtual void SendMessage(const MessageInfo& message, 121 virtual void SendMessage(const MessageInfo& message,
121 const net::CompletionCallback& callback); 122 const net::CompletionCallback& callback);
122 123
123 // Closes the channel if not already closed. On completion, the channel will 124 // Closes the channel if not already closed. On completion, the channel will
124 // be in READY_STATE_CLOSED. 125 // be in READY_STATE_CLOSED.
125 // 126 //
126 // It is fine to delete the CastSocket object in |callback|. 127 // It is fine to delete the CastSocketImpl object in |callback|.
127 virtual void Close(const net::CompletionCallback& callback); 128 virtual void Close(const net::CompletionCallback& callback);
128 129
129 // Internal connection states. 130 // Internal connection states.
130 enum ConnectionState { 131 enum ConnectionState {
131 CONN_STATE_NONE, 132 CONN_STATE_NONE,
132 CONN_STATE_TCP_CONNECT, 133 CONN_STATE_TCP_CONNECT,
133 CONN_STATE_TCP_CONNECT_COMPLETE, 134 CONN_STATE_TCP_CONNECT_COMPLETE,
134 CONN_STATE_SSL_CONNECT, 135 CONN_STATE_SSL_CONNECT,
135 CONN_STATE_SSL_CONNECT_COMPLETE, 136 CONN_STATE_SSL_CONNECT_COMPLETE,
136 CONN_STATE_AUTH_CHALLENGE_SEND, 137 CONN_STATE_AUTH_CHALLENGE_SEND,
(...skipping 13 matching lines...) Expand all
150 // Internal read states. 151 // Internal read states.
151 enum ReadState { 152 enum ReadState {
152 READ_STATE_NONE, 153 READ_STATE_NONE,
153 READ_STATE_READ, 154 READ_STATE_READ,
154 READ_STATE_READ_COMPLETE, 155 READ_STATE_READ_COMPLETE,
155 READ_STATE_DO_CALLBACK, 156 READ_STATE_DO_CALLBACK,
156 READ_STATE_ERROR, 157 READ_STATE_ERROR,
157 }; 158 };
158 159
159 private: 160 private:
160 friend class ApiResourceManager<CastSocket>; 161 friend class ApiResourceManager<CastSocketImpl>;
161 friend class CastSocketTest; 162 friend class CastSocketImplTest;
162 friend class TestCastSocket; 163 friend class TestCastSocketImpl;
163 164
164 static const char* service_name() { return "CastSocketManager"; } 165 static const char* service_name() { return "CastSocketImplManager"; }
165 166
166 // Creates an instance of TCPClientSocket. 167 // Creates an instance of TCPClientSocket.
167 virtual scoped_ptr<net::TCPClientSocket> CreateTcpSocket(); 168 virtual scoped_ptr<net::TCPClientSocket> CreateTcpSocket();
168 // Creates an instance of SSLClientSocket with the given underlying |socket|. 169 // Creates an instance of SSLClientSocket with the given underlying |socket|.
169 virtual scoped_ptr<net::SSLClientSocket> CreateSslSocket( 170 virtual scoped_ptr<net::SSLClientSocket> CreateSslSocket(
170 scoped_ptr<net::StreamSocket> socket); 171 scoped_ptr<net::StreamSocket> socket);
171 // Extracts peer certificate from SSLClientSocket instance when the socket 172 // Extracts peer certificate from SSLClientSocket instance when the socket
172 // is in cert error state. 173 // is in cert error state.
173 // Returns whether certificate is successfully extracted. 174 // Returns whether certificate is successfully extracted.
174 virtual bool ExtractPeerCert(std::string* cert); 175 virtual bool ExtractPeerCert(std::string* cert);
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 281
281 // IOBuffer for reading the message header. 282 // IOBuffer for reading the message header.
282 scoped_refptr<net::GrowableIOBuffer> read_buffer_; 283 scoped_refptr<net::GrowableIOBuffer> read_buffer_;
283 scoped_ptr<MessageFramer> framer_; 284 scoped_ptr<MessageFramer> framer_;
284 285
285 // The NetLog for this service. 286 // The NetLog for this service.
286 net::NetLog* net_log_; 287 net::NetLog* net_log_;
287 // The NetLog source for this service. 288 // The NetLog source for this service.
288 net::NetLog::Source net_log_source_; 289 net::NetLog::Source net_log_source_;
289 290
290 // Logger used to track multiple CastSockets. Does NOT own this object. 291 // Logger used to track multiple CastSocketImpls. Does NOT own this object.
291 scoped_refptr<Logger> logger_; 292 scoped_refptr<Logger> logger_;
292 293
293 // CertVerifier is owned by us but should be deleted AFTER SSLClientSocket 294 // CertVerifier is owned by us but should be deleted AFTER SSLClientSocket
294 // since in some cases the destructor of SSLClientSocket may call a method 295 // since in some cases the destructor of SSLClientSocket may call a method
295 // to cancel a cert verification request. 296 // to cancel a cert verification request.
296 scoped_ptr<net::CertVerifier> cert_verifier_; 297 scoped_ptr<net::CertVerifier> cert_verifier_;
297 scoped_ptr<net::TransportSecurityState> transport_security_state_; 298 scoped_ptr<net::TransportSecurityState> transport_security_state_;
298 299
299 // Owned ptr to the underlying TCP socket. 300 // Owned ptr to the underlying TCP socket.
300 scoped_ptr<net::TCPClientSocket> tcp_socket_; 301 scoped_ptr<net::TCPClientSocket> tcp_socket_;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
352 bool SetContent(const CastMessage& message_proto); 353 bool SetContent(const CastMessage& message_proto);
353 354
354 net::CompletionCallback callback; 355 net::CompletionCallback callback;
355 std::string message_namespace; 356 std::string message_namespace;
356 scoped_refptr<net::DrainableIOBuffer> io_buffer; 357 scoped_refptr<net::DrainableIOBuffer> io_buffer;
357 }; 358 };
358 // Queue of pending writes. The message at the front of the queue is the one 359 // Queue of pending writes. The message at the front of the queue is the one
359 // being written. 360 // being written.
360 std::queue<WriteRequest> write_queue_; 361 std::queue<WriteRequest> write_queue_;
361 362
362 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestFullSecureConnectionFlowAsync); 363 FRIEND_TEST_ALL_PREFIXES(CastSocketImplTest,
363 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestRead); 364 TestFullSecureConnectionFlowAsync);
364 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestReadHeaderParseError); 365 FRIEND_TEST_ALL_PREFIXES(CastSocketImplTest, TestRead);
365 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestReadMany); 366 FRIEND_TEST_ALL_PREFIXES(CastSocketImplTest, TestReadHeaderParseError);
366 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestWriteErrorLargeMessage); 367 FRIEND_TEST_ALL_PREFIXES(CastSocketImplTest, TestReadMany);
367 DISALLOW_COPY_AND_ASSIGN(CastSocket); 368 FRIEND_TEST_ALL_PREFIXES(CastSocketImplTest, TestWriteErrorLargeMessage);
369 DISALLOW_COPY_AND_ASSIGN(CastSocketImpl);
368 }; 370 };
369 } // namespace cast_channel 371 } // namespace cast_channel
370 } // namespace core_api 372 } // namespace core_api
371 } // namespace extensions 373 } // namespace extensions
372 374
373 #endif // EXTENSIONS_BROWSER_API_CAST_CHANNEL_CAST_SOCKET_H_ 375 #endif // EXTENSIONS_BROWSER_API_CAST_CHANNEL_CAST_SOCKET_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698