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