blob: 7bcaa062d06a009986c1a0c5fc944384cb6eae5c [file] [log] [blame]
henrike@webrtc.org47be73b2014-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_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 virtual ~StreamCache();
50
51 // StreamPool Interface
52 virtual StreamInterface* RequestConnectedStream(const SocketAddress& remote,
53 int* err);
54 virtual void ReturnConnectedStream(StreamInterface* stream);
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 virtual ~NewSocketPool();
79
80 // StreamPool Interface
81 virtual StreamInterface* RequestConnectedStream(const SocketAddress& remote,
82 int* err);
83 virtual void ReturnConnectedStream(StreamInterface* stream);
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 virtual ~ReuseSocketPool();
99
100 // StreamPool Interface
101 virtual StreamInterface* RequestConnectedStream(const SocketAddress& remote,
102 int* err);
103 virtual void ReturnConnectedStream(StreamInterface* stream);
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 virtual ~LoggingPoolAdapter();
124
125 // StreamPool Interface
126 virtual StreamInterface* RequestConnectedStream(const SocketAddress& remote,
127 int* err);
128 virtual void ReturnConnectedStream(StreamInterface* stream);
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_