blob: 57e1f9eeb1ae1f8ff22ab7b311b259dfd0e81861 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef WEBRTC_BASE_SOCKETADAPTERS_H_
12#define WEBRTC_BASE_SOCKETADAPTERS_H_
13
14#include <map>
15#include <string>
16
17#include "webrtc/base/asyncsocket.h"
kwiberg4485ffb2016-04-26 08:14:39 -070018#include "webrtc/base/constructormagic.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000019#include "webrtc/base/cryptstring.h"
20#include "webrtc/base/logging.h"
21
22namespace rtc {
23
jbauchf1f87202016-03-30 06:43:37 -070024class ByteBufferReader;
25class ByteBufferWriter;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000026
27///////////////////////////////////////////////////////////////////////////////
28
29// Implements a socket adapter that can buffer and process data internally,
30// as in the case of connecting to a proxy, where you must speak the proxy
31// protocol before commencing normal socket behavior.
32class BufferedReadAdapter : public AsyncSocketAdapter {
33 public:
34 BufferedReadAdapter(AsyncSocket* socket, size_t buffer_size);
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000035 ~BufferedReadAdapter() override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000036
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000037 int Send(const void* pv, size_t cb) override;
Stefan Holmer9131efd2016-05-23 18:19:26 +020038 int Recv(void* pv, size_t cb, int64_t* timestamp) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000039
40 protected:
41 int DirectSend(const void* pv, size_t cb) {
42 return AsyncSocketAdapter::Send(pv, cb);
43 }
44
45 void BufferInput(bool on = true);
46 virtual void ProcessInput(char* data, size_t* len) = 0;
47
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000048 void OnReadEvent(AsyncSocket* socket) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000049
50 private:
51 char * buffer_;
52 size_t buffer_size_, data_len_;
53 bool buffering_;
henrikg3c089d72015-09-16 05:37:44 -070054 RTC_DISALLOW_COPY_AND_ASSIGN(BufferedReadAdapter);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000055};
56
57///////////////////////////////////////////////////////////////////////////////
58
59// Interface for implementing proxy server sockets.
60class AsyncProxyServerSocket : public BufferedReadAdapter {
61 public:
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000062 AsyncProxyServerSocket(AsyncSocket* socket, size_t buffer_size);
63 ~AsyncProxyServerSocket() override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000064 sigslot::signal2<AsyncProxyServerSocket*,
65 const SocketAddress&> SignalConnectRequest;
66 virtual void SendConnectResult(int err, const SocketAddress& addr) = 0;
67};
68
69///////////////////////////////////////////////////////////////////////////////
70
71// Implements a socket adapter that performs the client side of a
72// fake SSL handshake. Used for "ssltcp" P2P functionality.
73class AsyncSSLSocket : public BufferedReadAdapter {
74 public:
75 explicit AsyncSSLSocket(AsyncSocket* socket);
76
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000077 int Connect(const SocketAddress& addr) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000078
79 protected:
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000080 void OnConnectEvent(AsyncSocket* socket) override;
81 void ProcessInput(char* data, size_t* len) override;
henrikg3c089d72015-09-16 05:37:44 -070082 RTC_DISALLOW_COPY_AND_ASSIGN(AsyncSSLSocket);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000083};
84
85// Implements a socket adapter that performs the server side of a
86// fake SSL handshake. Used when implementing a relay server that does "ssltcp".
87class AsyncSSLServerSocket : public BufferedReadAdapter {
88 public:
89 explicit AsyncSSLServerSocket(AsyncSocket* socket);
90
91 protected:
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000092 void ProcessInput(char* data, size_t* len) override;
henrikg3c089d72015-09-16 05:37:44 -070093 RTC_DISALLOW_COPY_AND_ASSIGN(AsyncSSLServerSocket);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000094};
95
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000096} // namespace rtc
97
98#endif // WEBRTC_BASE_SOCKETADAPTERS_H_