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/. */
7 // Original author: ekr@rtfm.com
9 #ifndef transportlayerloopback_h__
10 #define transportlayerloopback_h__
20 #include "nsAutoPtr.h"
25 #include "m_cpp_utils.h"
26 #include "transportflow.h"
27 #include "transportlayer.h"
29 // A simple loopback transport layer that is used for testing.
32 class TransportLayerLoopback
: public TransportLayer
{
34 TransportLayerLoopback() :
38 packets_lock_(nullptr),
39 deliverer_(nullptr) {}
41 ~TransportLayerLoopback() {
42 while (!packets_
.empty()) {
43 QueuedPacket
*packet
= packets_
.front();
48 PR_DestroyLock(packets_lock_
);
57 // Connect to the other side
58 void Connect(TransportLayerLoopback
* peer
);
62 TransportLayerLoopback
*peer
= peer_
;
70 // Overrides for TransportLayer
71 virtual TransportResult
SendPacket(const unsigned char *data
, size_t len
);
73 // Deliver queued packets
74 void DeliverPackets();
76 TRANSPORT_LAYER_ID("loopback")
79 DISALLOW_COPY_ASSIGN(TransportLayerLoopback
);
84 QueuedPacket() : data_(nullptr), len_(0) {}
89 void Assign(const unsigned char *data
, size_t len
) {
90 data_
= new unsigned char[len
];
91 memcpy(static_cast<void *>(data_
),
92 static_cast<const void *>(data
), len
);
96 const unsigned char *data() const { return data_
; }
97 size_t len() const { return len_
; }
100 DISALLOW_COPY_ASSIGN(QueuedPacket
);
102 unsigned char *data_
;
106 // A timer to deliver packets if some are available
107 // Fires every 100 ms
108 class Deliverer
: public nsITimerCallback
{
110 explicit Deliverer(TransportLayerLoopback
*layer
) :
116 NS_DECL_THREADSAFE_ISUPPORTS
117 NS_DECL_NSITIMERCALLBACK
120 virtual ~Deliverer() {
123 DISALLOW_COPY_ASSIGN(Deliverer
);
125 TransportLayerLoopback
*layer_
;
128 // Queue a packet for delivery
129 nsresult
QueuePacket(const unsigned char *data
, size_t len
);
131 TransportLayerLoopback
* peer_
;
132 nsCOMPtr
<nsITimer
> timer_
;
133 std::queue
<QueuedPacket
*> packets_
;
134 PRLock
*packets_lock_
;
135 nsRefPtr
<Deliverer
> deliverer_
;