Index: mojo/public/cpp/bindings/lib/scoped_interface_endpoint_handle.cc |
diff --git a/mojo/public/cpp/bindings/lib/scoped_interface_endpoint_handle.cc b/mojo/public/cpp/bindings/lib/scoped_interface_endpoint_handle.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4a2a47bcfb370a63de30b5b446545d8fe17001e4 |
--- /dev/null |
+++ b/mojo/public/cpp/bindings/lib/scoped_interface_endpoint_handle.cc |
@@ -0,0 +1,75 @@ |
+// Copyright 2015 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/public/cpp/bindings/lib/scoped_interface_endpoint_handle.h" |
+ |
+#include "base/logging.h" |
+#include "mojo/public/cpp/bindings/lib/multiplex_router.h" |
+ |
+namespace mojo { |
+namespace internal { |
+ |
+ScopedInterfaceEndpointHandle::ScopedInterfaceEndpointHandle() |
+ : ScopedInterfaceEndpointHandle(kInvalidInterfaceId, true, nullptr) {} |
+ |
+ScopedInterfaceEndpointHandle::ScopedInterfaceEndpointHandle( |
+ InterfaceId id, |
+ bool is_local, |
+ scoped_refptr<MultiplexRouter> router) |
+ : id_(id), is_local_(is_local), router_(router.Pass()) { |
+ DCHECK(!IsValidInterfaceId(id) || router_); |
+} |
+ |
+ScopedInterfaceEndpointHandle::ScopedInterfaceEndpointHandle( |
+ ScopedInterfaceEndpointHandle&& other) |
+ : id_(other.id_), is_local_(other.is_local_) { |
+ router_.swap(other.router_); |
+ other.id_ = kInvalidInterfaceId; |
+} |
+ |
+ScopedInterfaceEndpointHandle::~ScopedInterfaceEndpointHandle() { |
+ reset(); |
+} |
+ |
+ScopedInterfaceEndpointHandle& ScopedInterfaceEndpointHandle::operator=( |
+ ScopedInterfaceEndpointHandle&& other) { |
+ reset(); |
+ |
+ id_ = other.id_; |
+ is_local_ = other.is_local_; |
+ router_.swap(other.router_); |
+ |
+ other.id_ = kInvalidInterfaceId; |
+ |
+ return *this; |
+} |
+ |
+void ScopedInterfaceEndpointHandle::reset() { |
+ if (!IsValidInterfaceId(id_)) |
+ return; |
+ |
+ router_->CloseEndpointHandle(id_, is_local_); |
+ |
+ id_ = kInvalidInterfaceId; |
+ router_ = nullptr; |
+} |
+ |
+void ScopedInterfaceEndpointHandle::swap(ScopedInterfaceEndpointHandle& other) { |
+ using std::swap; |
+ swap(other.id_, id_); |
+ swap(other.is_local_, is_local_); |
+ swap(other.router_, router_); |
+} |
+ |
+InterfaceId ScopedInterfaceEndpointHandle::release() { |
+ InterfaceId result = id_; |
+ |
+ id_ = kInvalidInterfaceId; |
+ router_ = nullptr; |
+ |
+ return result; |
+} |
+ |
+} // namespace internal |
+} // namespace mojo |