1 // Copyright (c) 2011 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.
5 #ifndef CONTENT_BROWSER_RENDERER_HOST_P2P_SOCKET_HOST_TCP_H_
6 #define CONTENT_BROWSER_RENDERER_HOST_P2P_SOCKET_HOST_TCP_H_
11 #include "base/compiler_specific.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/message_loop/message_loop.h"
15 #include "content/browser/renderer_host/p2p/socket_host.h"
16 #include "content/common/p2p_socket_type.h"
17 #include "net/base/completion_callback.h"
18 #include "net/base/ip_endpoint.h"
21 class DrainableIOBuffer
;
22 class GrowableIOBuffer
;
24 class URLRequestContextGetter
;
29 class CONTENT_EXPORT P2PSocketHostTcpBase
: public P2PSocketHost
{
31 P2PSocketHostTcpBase(IPC::Sender
* message_sender
,
34 net::URLRequestContextGetter
* url_context
);
35 virtual ~P2PSocketHostTcpBase();
37 bool InitAccepted(const net::IPEndPoint
& remote_address
,
38 net::StreamSocket
* socket
);
40 // P2PSocketHost overrides.
41 virtual bool Init(const net::IPEndPoint
& local_address
,
42 const P2PHostAndIPEndPoint
& remote_address
) OVERRIDE
;
43 virtual void Send(const net::IPEndPoint
& to
,
44 const std::vector
<char>& data
,
45 const rtc::PacketOptions
& options
,
46 uint64 packet_id
) OVERRIDE
;
47 virtual P2PSocketHost
* AcceptIncomingTcpConnection(
48 const net::IPEndPoint
& remote_address
, int id
) OVERRIDE
;
49 virtual bool SetOption(P2PSocketOption option
, int value
) OVERRIDE
;
52 // Derived classes will provide the implementation.
53 virtual int ProcessInput(char* input
, int input_len
) = 0;
54 virtual void DoSend(const net::IPEndPoint
& to
,
55 const std::vector
<char>& data
,
56 const rtc::PacketOptions
& options
) = 0;
58 void WriteOrQueue(scoped_refptr
<net::DrainableIOBuffer
>& buffer
);
59 void OnPacket(const std::vector
<char>& data
);
63 friend class P2PSocketHostTcpTestBase
;
64 friend class P2PSocketHostTcpServerTest
;
66 // SSL/TLS connection functions.
68 void ProcessTlsSslConnectDone(int status
);
70 void DidCompleteRead(int result
);
74 void HandleWriteResult(int result
);
76 // Callbacks for Connect(), Read() and Write().
77 void OnConnected(int result
);
78 void OnRead(int result
);
79 void OnWritten(int result
);
81 // Helper method to send socket create message and start read.
83 void DoSendSocketCreateMsg();
85 P2PHostAndIPEndPoint remote_address_
;
87 scoped_ptr
<net::StreamSocket
> socket_
;
88 scoped_refptr
<net::GrowableIOBuffer
> read_buffer_
;
89 std::queue
<scoped_refptr
<net::DrainableIOBuffer
> > write_queue_
;
90 scoped_refptr
<net::DrainableIOBuffer
> write_buffer_
;
96 scoped_refptr
<net::URLRequestContextGetter
> url_context_
;
98 DISALLOW_COPY_AND_ASSIGN(P2PSocketHostTcpBase
);
101 class CONTENT_EXPORT P2PSocketHostTcp
: public P2PSocketHostTcpBase
{
103 P2PSocketHostTcp(IPC::Sender
* message_sender
,
106 net::URLRequestContextGetter
* url_context
);
107 virtual ~P2PSocketHostTcp();
110 virtual int ProcessInput(char* input
, int input_len
) OVERRIDE
;
111 virtual void DoSend(const net::IPEndPoint
& to
,
112 const std::vector
<char>& data
,
113 const rtc::PacketOptions
& options
) OVERRIDE
;
115 DISALLOW_COPY_AND_ASSIGN(P2PSocketHostTcp
);
118 // P2PSocketHostStunTcp class provides the framing of STUN messages when used
119 // with TURN. These messages will not have length at front of the packet and
120 // are padded to multiple of 4 bytes.
121 // Formatting of messages is defined in RFC5766.
122 class CONTENT_EXPORT P2PSocketHostStunTcp
: public P2PSocketHostTcpBase
{
124 P2PSocketHostStunTcp(IPC::Sender
* message_sender
,
127 net::URLRequestContextGetter
* url_context
);
129 virtual ~P2PSocketHostStunTcp();
132 virtual int ProcessInput(char* input
, int input_len
) OVERRIDE
;
133 virtual void DoSend(const net::IPEndPoint
& to
,
134 const std::vector
<char>& data
,
135 const rtc::PacketOptions
& options
) OVERRIDE
;
137 int GetExpectedPacketSize(const char* data
, int len
, int* pad_bytes
);
139 DISALLOW_COPY_AND_ASSIGN(P2PSocketHostStunTcp
);
143 } // namespace content
145 #endif // CONTENT_BROWSER_RENDERER_HOST_P2P_SOCKET_HOST_TCP_H_