OLD | NEW |
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 20 matching lines...) Expand all Loading... |
31 class TransportSecurityState; | 31 class TransportSecurityState; |
32 } | 32 } |
33 | 33 |
34 namespace extensions { | 34 namespace extensions { |
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 | 42 |
42 // 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 |
43 // 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 |
44 // Cast device. All CastSocket objects must be used only on the IO thread. | 45 // Cast device. All CastSocket objects must be used only on the IO thread. |
45 // | 46 // |
46 // NOTE: Not called "CastChannel" to reduce confusion with the generated API | 47 // NOTE: Not called "CastChannel" to reduce confusion with the generated API |
47 // code. | 48 // code. |
48 class CastSocket : public ApiResource { | 49 class CastSocket : public ApiResource { |
49 public: | 50 public: |
50 // Object to be informed of incoming messages and errors. The CastSocket that | 51 // Object to be informed of incoming messages and errors. The CastSocket that |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 | 149 |
149 // Internal read states. | 150 // Internal read states. |
150 enum ReadState { | 151 enum ReadState { |
151 READ_STATE_NONE, | 152 READ_STATE_NONE, |
152 READ_STATE_READ, | 153 READ_STATE_READ, |
153 READ_STATE_READ_COMPLETE, | 154 READ_STATE_READ_COMPLETE, |
154 READ_STATE_DO_CALLBACK, | 155 READ_STATE_DO_CALLBACK, |
155 READ_STATE_ERROR, | 156 READ_STATE_ERROR, |
156 }; | 157 }; |
157 | 158 |
158 protected: | |
159 // Message header struct. If fields are added, be sure to update | |
160 // header_size(). Protected to allow use of *_size() methods in unit tests. | |
161 struct MessageHeader { | |
162 MessageHeader(); | |
163 // Sets the message size. | |
164 void SetMessageSize(size_t message_size); | |
165 // Prepends this header to |str|. | |
166 void PrependToString(std::string* str); | |
167 // Reads |header| from the beginning of |buffer|. | |
168 static void ReadFromIOBuffer(net::GrowableIOBuffer* buffer, | |
169 MessageHeader* header); | |
170 // Size (in bytes) of the message header. | |
171 static uint32 header_size() { return sizeof(uint32); } | |
172 | |
173 // Maximum size (in bytes) of a message payload on the wire (does not | |
174 // include header). | |
175 static uint32 max_message_size() { return 65536; } | |
176 | |
177 std::string ToString(); | |
178 // The size of the following protocol message in bytes, in host byte order. | |
179 uint32 message_size; | |
180 }; | |
181 | |
182 private: | 159 private: |
183 friend class ApiResourceManager<CastSocket>; | 160 friend class ApiResourceManager<CastSocket>; |
184 friend class CastSocketTest; | 161 friend class CastSocketTest; |
185 friend class TestCastSocket; | 162 friend class TestCastSocket; |
186 | 163 |
187 static const char* service_name() { return "CastSocketManager"; } | 164 static const char* service_name() { return "CastSocketManager"; } |
188 | 165 |
189 // Creates an instance of TCPClientSocket. | 166 // Creates an instance of TCPClientSocket. |
190 virtual scoped_ptr<net::TCPClientSocket> CreateTcpSocket(); | 167 virtual scoped_ptr<net::TCPClientSocket> CreateTcpSocket(); |
191 // Creates an instance of SSLClientSocket with the given underlying |socket|. | 168 // Creates an instance of SSLClientSocket with the given underlying |socket|. |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 ///////////////////////////////////////////////////////////////////////////// | 236 ///////////////////////////////////////////////////////////////////////////// |
260 | 237 |
261 // Runs the external connection callback and resets it. | 238 // Runs the external connection callback and resets it. |
262 void DoConnectCallback(int result); | 239 void DoConnectCallback(int result); |
263 // Adds |message| to the write queue and starts the write loop if needed. | 240 // Adds |message| to the write queue and starts the write loop if needed. |
264 void SendCastMessageInternal(const CastMessage& message, | 241 void SendCastMessageInternal(const CastMessage& message, |
265 const net::CompletionCallback& callback); | 242 const net::CompletionCallback& callback); |
266 void PostTaskToStartConnectLoop(int result); | 243 void PostTaskToStartConnectLoop(int result); |
267 void PostTaskToStartReadLoop(); | 244 void PostTaskToStartReadLoop(); |
268 void StartReadLoop(); | 245 void StartReadLoop(); |
269 // Parses the contents of header_read_buffer_ and sets current_message_size_ | |
270 // to the size of the body of the message. | |
271 bool ProcessHeader(); | |
272 // Parses the contents of body_read_buffer_ and sets current_message_ to | |
273 // the message received. | |
274 bool ProcessBody(); | |
275 // Closes socket, signaling the delegate that |error| has occurred. | 246 // Closes socket, signaling the delegate that |error| has occurred. |
276 void CloseWithError(); | 247 void CloseWithError(); |
277 // Frees resources and cancels pending callbacks. |ready_state_| will be set | 248 // Frees resources and cancels pending callbacks. |ready_state_| will be set |
278 // READY_STATE_CLOSED on completion. A no-op if |ready_state_| is already | 249 // READY_STATE_CLOSED on completion. A no-op if |ready_state_| is already |
279 // READY_STATE_CLOSED. | 250 // READY_STATE_CLOSED. |
280 void CloseInternal(); | 251 void CloseInternal(); |
281 // Runs pending callbacks that are passed into us to notify API clients that | 252 // Runs pending callbacks that are passed into us to notify API clients that |
282 // pending operations will fail because the socket has been closed. | 253 // pending operations will fail because the socket has been closed. |
283 void RunPendingCallbacksOnClose(); | 254 void RunPendingCallbacksOnClose(); |
284 // Serializes the content of message_proto (with a header) to |message_data|. | 255 // Serializes the content of message_proto (with a header) to |message_data|. |
(...skipping 16 matching lines...) Expand all Loading... |
301 int channel_id_; | 272 int channel_id_; |
302 | 273 |
303 // The IP endpoint that the the channel is connected to. | 274 // The IP endpoint that the the channel is connected to. |
304 net::IPEndPoint ip_endpoint_; | 275 net::IPEndPoint ip_endpoint_; |
305 // Receiver authentication requested for the channel. | 276 // Receiver authentication requested for the channel. |
306 ChannelAuthType channel_auth_; | 277 ChannelAuthType channel_auth_; |
307 // Delegate to inform of incoming messages and errors. | 278 // Delegate to inform of incoming messages and errors. |
308 Delegate* delegate_; | 279 Delegate* delegate_; |
309 | 280 |
310 // IOBuffer for reading the message header. | 281 // IOBuffer for reading the message header. |
311 scoped_refptr<net::GrowableIOBuffer> header_read_buffer_; | 282 scoped_refptr<net::GrowableIOBuffer> read_buffer_; |
312 // IOBuffer for reading the message body. | 283 scoped_ptr<MessageFramer> framer_; |
313 scoped_refptr<net::GrowableIOBuffer> body_read_buffer_; | |
314 // IOBuffer to currently read into. | |
315 scoped_refptr<net::GrowableIOBuffer> current_read_buffer_; | |
316 // The number of bytes in the current message body. | |
317 uint32 current_message_size_; | |
318 // Last message received on the socket. | |
319 scoped_ptr<CastMessage> current_message_; | |
320 | 284 |
321 // The NetLog for this service. | 285 // The NetLog for this service. |
322 net::NetLog* net_log_; | 286 net::NetLog* net_log_; |
323 // The NetLog source for this service. | 287 // The NetLog source for this service. |
324 net::NetLog::Source net_log_source_; | 288 net::NetLog::Source net_log_source_; |
325 | 289 |
326 // Logger used to track multiple CastSockets. Does NOT own this object. | 290 // Logger used to track multiple CastSockets. Does NOT own this object. |
327 scoped_refptr<Logger> logger_; | 291 scoped_refptr<Logger> logger_; |
328 | 292 |
329 // CertVerifier is owned by us but should be deleted AFTER SSLClientSocket | 293 // CertVerifier is owned by us but should be deleted AFTER SSLClientSocket |
(...skipping 18 matching lines...) Expand all Loading... |
348 // Callback invoked by |connect_timeout_timer_| to cancel the connection. | 312 // Callback invoked by |connect_timeout_timer_| to cancel the connection. |
349 base::CancelableClosure connect_timeout_callback_; | 313 base::CancelableClosure connect_timeout_callback_; |
350 // Duration to wait before timing out. | 314 // Duration to wait before timing out. |
351 base::TimeDelta connect_timeout_; | 315 base::TimeDelta connect_timeout_; |
352 // Timer invoked when the connection has timed out. | 316 // Timer invoked when the connection has timed out. |
353 scoped_ptr<base::Timer> connect_timeout_timer_; | 317 scoped_ptr<base::Timer> connect_timeout_timer_; |
354 // Set when a timeout is triggered and the connection process has | 318 // Set when a timeout is triggered and the connection process has |
355 // canceled. | 319 // canceled. |
356 bool is_canceled_; | 320 bool is_canceled_; |
357 | 321 |
| 322 scoped_ptr<CastMessage> current_message_; |
| 323 |
358 // Connection flow state machine state. | 324 // Connection flow state machine state. |
359 ConnectionState connect_state_; | 325 ConnectionState connect_state_; |
360 // Write flow state machine state. | 326 // Write flow state machine state. |
361 WriteState write_state_; | 327 WriteState write_state_; |
362 // Read flow state machine state. | 328 // Read flow state machine state. |
363 ReadState read_state_; | 329 ReadState read_state_; |
364 // The last error encountered by the channel. | 330 // The last error encountered by the channel. |
365 ChannelError error_state_; | 331 ChannelError error_state_; |
366 // The current status of the channel. | 332 // The current status of the channel. |
367 ReadyState ready_state_; | 333 ReadyState ready_state_; |
(...skipping 25 matching lines...) Expand all Loading... |
393 // being written. | 359 // being written. |
394 std::queue<WriteRequest> write_queue_; | 360 std::queue<WriteRequest> write_queue_; |
395 | 361 |
396 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestFullSecureConnectionFlowAsync); | 362 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestFullSecureConnectionFlowAsync); |
397 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestRead); | 363 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestRead); |
398 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestReadHeaderParseError); | 364 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestReadHeaderParseError); |
399 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestReadMany); | 365 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestReadMany); |
400 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestWriteErrorLargeMessage); | 366 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestWriteErrorLargeMessage); |
401 DISALLOW_COPY_AND_ASSIGN(CastSocket); | 367 DISALLOW_COPY_AND_ASSIGN(CastSocket); |
402 }; | 368 }; |
403 | |
404 } // namespace cast_channel | 369 } // namespace cast_channel |
405 } // namespace core_api | 370 } // namespace core_api |
406 } // namespace extensions | 371 } // namespace extensions |
407 | 372 |
408 #endif // EXTENSIONS_BROWSER_API_CAST_CHANNEL_CAST_SOCKET_H_ | 373 #endif // EXTENSIONS_BROWSER_API_CAST_CHANNEL_CAST_SOCKET_H_ |
OLD | NEW |