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 20 namespace rtc { 21 22 class AsyncSocket; 23 class LoggingAdapter; 24 class SocketFactory; 25 class SocketStream; 26 class StreamInterface; 27 28 ////////////////////////////////////////////////////////////////////// 29 // StreamPool 30 ////////////////////////////////////////////////////////////////////// 31 32 class StreamPool { 33 public: 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 46 class StreamCache : public StreamPool, public sigslot::has_slots<> { 47 public: 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 56 private: 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 75 class NewSocketPool : public StreamPool { 76 public: 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 85 private: 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 95 class ReuseSocketPool : public StreamPool, public sigslot::has_slots<> { 96 public: 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 105 private: 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 119 class LoggingPoolAdapter : public StreamPool { 120 public: 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 130 private: 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