tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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