1/*
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_SOCKETPOOL_H_
12#define WEBRTC_BASE_SOCKETPOOL_H_
13
14#include <deque>
15#include <list>
16#include "webrtc/base/logging.h"
17#include "webrtc/base/sigslot.h"
18#include "webrtc/base/socketaddress.h"
19
20namespace rtc {
21
22class AsyncSocket;
23class LoggingAdapter;
24class SocketFactory;
25class SocketStream;
26class StreamInterface;
27
28//////////////////////////////////////////////////////////////////////
29// StreamPool
30//////////////////////////////////////////////////////////////////////
31
32class StreamPool {
33public:
34  virtual ~StreamPool() { }
35
36  virtual StreamInterface* RequestConnectedStream(const SocketAddress& remote,
37                                                  int* err) = 0;
38  virtual void ReturnConnectedStream(StreamInterface* stream) = 0;
39};
40
41///////////////////////////////////////////////////////////////////////////////
42// StreamCache - Caches a set of open streams, defers creation/destruction to
43//  the supplied StreamPool.
44///////////////////////////////////////////////////////////////////////////////
45
46class StreamCache : public StreamPool, public sigslot::has_slots<> {
47public:
48  StreamCache(StreamPool* pool);
49  ~StreamCache() override;
50
51  // StreamPool Interface
52  StreamInterface* RequestConnectedStream(const SocketAddress& remote,
53                                          int* err) override;
54  void ReturnConnectedStream(StreamInterface* stream) override;
55
56private:
57  typedef std::pair<SocketAddress, StreamInterface*> ConnectedStream;
58  typedef std::list<ConnectedStream> ConnectedList;
59
60  void OnStreamEvent(StreamInterface* stream, int events, int err);
61
62  // We delegate stream creation and deletion to this pool.
63  StreamPool* pool_;
64  // Streams that are in use (returned from RequestConnectedStream).
65  ConnectedList active_;
66  // Streams which were returned to us, but are still open.
67  ConnectedList cached_;
68};
69
70///////////////////////////////////////////////////////////////////////////////
71// NewSocketPool
72// Creates a new stream on every request
73///////////////////////////////////////////////////////////////////////////////
74
75class NewSocketPool : public StreamPool {
76public:
77  NewSocketPool(SocketFactory* factory);
78  ~NewSocketPool() override;
79
80  // StreamPool Interface
81  StreamInterface* RequestConnectedStream(const SocketAddress& remote,
82                                          int* err) override;
83  void ReturnConnectedStream(StreamInterface* stream) override;
84
85private:
86  SocketFactory* factory_;
87};
88
89///////////////////////////////////////////////////////////////////////////////
90// ReuseSocketPool
91// Maintains a single socket at a time, and will reuse it without closing if
92// the destination address is the same.
93///////////////////////////////////////////////////////////////////////////////
94
95class ReuseSocketPool : public StreamPool, public sigslot::has_slots<> {
96public:
97  ReuseSocketPool(SocketFactory* factory);
98  ~ReuseSocketPool() override;
99
100  // StreamPool Interface
101  StreamInterface* RequestConnectedStream(const SocketAddress& remote,
102                                          int* err) override;
103  void ReturnConnectedStream(StreamInterface* stream) override;
104
105private:
106  void OnStreamEvent(StreamInterface* stream, int events, int err);
107
108  SocketFactory* factory_;
109  SocketStream* stream_;
110  SocketAddress remote_;
111  bool checked_out_;  // Whether the stream is currently checked out
112};
113
114///////////////////////////////////////////////////////////////////////////////
115// LoggingPoolAdapter - Adapts a StreamPool to supply streams with attached
116// LoggingAdapters.
117///////////////////////////////////////////////////////////////////////////////
118
119class LoggingPoolAdapter : public StreamPool {
120public:
121  LoggingPoolAdapter(StreamPool* pool, LoggingSeverity level,
122                     const std::string& label, bool binary_mode);
123  ~LoggingPoolAdapter() override;
124
125  // StreamPool Interface
126  StreamInterface* RequestConnectedStream(const SocketAddress& remote,
127                                          int* err) override;
128  void ReturnConnectedStream(StreamInterface* stream) override;
129
130private:
131  StreamPool* pool_;
132  LoggingSeverity level_;
133  std::string label_;
134  bool binary_mode_;
135  typedef std::deque<LoggingAdapter*> StreamList;
136  StreamList recycle_bin_;
137};
138
139//////////////////////////////////////////////////////////////////////
140
141}  // namespace rtc
142
143#endif  // WEBRTC_BASE_SOCKETPOOL_H_
144