transportlayerloopback.h (2528B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 5 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 // Original author: ekr@rtfm.com 8 9 #ifndef transportlayerloopback_h__ 10 #define transportlayerloopback_h__ 11 12 #include <queue> 13 14 #include "m_cpp_utils.h" 15 #include "nsCOMPtr.h" 16 #include "nsINamed.h" 17 #include "nsITimer.h" 18 #include "prlock.h" 19 #include "transportlayer.h" 20 21 // A simple loopback transport layer that is used for testing. 22 namespace mozilla { 23 24 class TransportLayerLoopback : public TransportLayer { 25 public: 26 TransportLayerLoopback() 27 : peer_(nullptr), 28 timer_(nullptr), 29 packets_lock_(nullptr), 30 deliverer_(nullptr), 31 combinePackets_(false) {} 32 33 ~TransportLayerLoopback() { 34 while (!packets_.empty()) { 35 MediaPacket* packet = packets_.front(); 36 packets_.pop(); 37 delete packet; 38 } 39 if (packets_lock_) { 40 PR_DestroyLock(packets_lock_); 41 } 42 timer_->Cancel(); 43 deliverer_->Detach(); 44 } 45 46 // Init 47 nsresult Init(); 48 49 // Connect to the other side 50 void Connect(TransportLayerLoopback* peer); 51 52 // Disconnect 53 void Disconnect() { 54 TransportLayerLoopback* peer = peer_; 55 56 peer_ = nullptr; 57 if (peer) { 58 peer->Disconnect(); 59 } 60 } 61 62 void CombinePackets(bool combine) { combinePackets_ = combine; } 63 64 // Overrides for TransportLayer 65 TransportResult SendPacket(MediaPacket& packet) override; 66 67 // Deliver queued packets 68 void DeliverPackets(); 69 70 TRANSPORT_LAYER_ID("loopback") 71 72 private: 73 DISALLOW_COPY_ASSIGN(TransportLayerLoopback); 74 75 // A timer to deliver packets if some are available 76 // Fires every 100 ms 77 class Deliverer : public nsITimerCallback, public nsINamed { 78 public: 79 explicit Deliverer(TransportLayerLoopback* layer) : layer_(layer) {} 80 void Detach() { layer_ = nullptr; } 81 82 NS_DECL_THREADSAFE_ISUPPORTS 83 NS_DECL_NSITIMERCALLBACK 84 NS_DECL_NSINAMED 85 86 private: 87 virtual ~Deliverer() = default; 88 89 DISALLOW_COPY_ASSIGN(Deliverer); 90 91 TransportLayerLoopback* layer_; 92 }; 93 94 // Queue a packet for delivery 95 nsresult QueuePacket(MediaPacket& packet); 96 97 TransportLayerLoopback* peer_; 98 nsCOMPtr<nsITimer> timer_; 99 std::queue<MediaPacket*> packets_; 100 PRLock* packets_lock_; 101 RefPtr<Deliverer> deliverer_; 102 bool combinePackets_; 103 }; 104 105 } // namespace mozilla 106 #endif