Index: mojo/edk/system/endpoint_relayer.cc |
diff --git a/mojo/edk/system/endpoint_relayer.cc b/mojo/edk/system/endpoint_relayer.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..52faefa4c6e783aaea5f95afb1290e7779f0b3e6 |
--- /dev/null |
+++ b/mojo/edk/system/endpoint_relayer.cc |
@@ -0,0 +1,70 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "mojo/edk/system/endpoint_relayer.h" |
+ |
+#include "base/logging.h" |
+#include "mojo/edk/system/channel_endpoint.h" |
+#include "mojo/edk/system/message_in_transit.h" |
+ |
+namespace mojo { |
+namespace system { |
+ |
+EndpointRelayer::EndpointRelayer() { |
+} |
+ |
+// static |
+unsigned EndpointRelayer::GetPeerPort(unsigned port) { |
+ DCHECK(port == 0 || port == 1); |
+ return port ^ 1; |
+} |
+ |
+void EndpointRelayer::Init(ChannelEndpoint* endpoint0, |
+ ChannelEndpoint* endpoint1) { |
+ DCHECK(endpoint0); |
+ DCHECK(endpoint1); |
+ DCHECK(!endpoints_[0]); |
+ DCHECK(!endpoints_[1]); |
+ endpoints_[0] = endpoint0; |
+ endpoints_[1] = endpoint1; |
+} |
+ |
+bool EndpointRelayer::OnReadMessage(unsigned port, MessageInTransit* message) { |
+ DCHECK(message); |
+ |
+ base::AutoLock locker(lock_); |
+ |
+ // If we're no longer the client, then reject the message. |
+ if (!endpoints_[port]) |
+ return false; |
+ |
+ // Otherwise, consume it even if the peer port is closed. |
+ unsigned peer_port = GetPeerPort(port); |
+ if (endpoints_[peer_port]) |
+ endpoints_[peer_port]->EnqueueMessage(make_scoped_ptr(message)); |
+ return true; |
+} |
+ |
+void EndpointRelayer::OnDetachFromChannel(unsigned port) { |
+ base::AutoLock locker(lock_); |
+ |
+ if (endpoints_[port]) { |
+ endpoints_[port]->DetachFromClient(); |
+ endpoints_[port] = nullptr; |
+ } |
+ |
+ unsigned peer_port = GetPeerPort(port); |
+ if (endpoints_[peer_port]) { |
+ endpoints_[peer_port]->DetachFromClient(); |
+ endpoints_[peer_port] = nullptr; |
+ } |
+} |
+ |
+EndpointRelayer::~EndpointRelayer() { |
+ DCHECK(!endpoints_[0]); |
+ DCHECK(!endpoints_[1]); |
+} |
+ |
+} // namespace system |
+} // namespace mojo |