Index: mojo/public/cpp/bindings/interface_ptr.h |
diff --git a/mojo/public/cpp/bindings/interface_ptr.h b/mojo/public/cpp/bindings/interface_ptr.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..91bd6ba40f50cfd23341eac4369fb13b82b06de5 |
--- /dev/null |
+++ b/mojo/public/cpp/bindings/interface_ptr.h |
@@ -0,0 +1,116 @@ |
+// 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. |
+ |
+#ifndef MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_H_ |
+#define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_H_ |
+ |
+#include <assert.h> |
+ |
+#include <algorithm> |
+ |
+#include "mojo/public/cpp/bindings/error_handler.h" |
+#include "mojo/public/cpp/bindings/lib/interface_ptr_internal.h" |
+#include "mojo/public/cpp/system/macros.h" |
+ |
+namespace mojo { |
+class ErrorHandler; |
+ |
+// InterfacePtr represents a proxy to a remote instance of an interface. |
+template <typename Interface> |
+class InterfacePtr { |
+ MOJO_MOVE_ONLY_TYPE_FOR_CPP_03(InterfacePtr, RValue) |
+ public: |
+ InterfacePtr() {} |
+ |
+ InterfacePtr(RValue other) { |
+ other.object->internal_state_.Swap(&internal_state_); |
+ } |
+ InterfacePtr& operator=(RValue other) { |
+ other.object->internal_state_.Swap(&internal_state_); |
+ return *this; |
+ } |
+ |
+ ~InterfacePtr() {} |
+ |
+ Interface* get() const { |
+ return internal_state_.instance(); |
+ } |
+ Interface* operator->() const { return get(); } |
+ Interface* operator*() const { return get(); } |
+ |
+ void reset() { |
+ State doomed; |
+ internal_state_.Swap(&doomed); |
+ } |
+ |
+ // This method configures the InterfacePtr<..> to be a proxy to a remote |
+ // object on the other end of the given pipe. |
+ // |
+ // The proxy is bound to the current thread, which means its methods may |
+ // only be called on the current thread. |
+ // |
+ // To move a bound InterfacePtr<..> to another thread, call |
+ // ResetAndReturnMessagePipe. Then create a new InterfacePtr<..> on another |
+ // thread, and bind the new InterfacePtr<..> to the message pipe on that |
+ // thread. |
+ void Bind(ScopedMessagePipeHandle handle, |
+ MojoAsyncWaiter* waiter = GetDefaultAsyncWaiter()) { |
+ reset(); |
+ internal_state_.ConfigureProxy(handle.Pass(), waiter); |
+ } |
+ |
+ // This method may be called to query if the underlying pipe has encountered |
+ // an error. If true, this means method calls made on this interface will be |
+ // dropped (and may have already been dropped) on the floor. |
+ bool encountered_error() const { |
+ assert(internal_state_.router()); |
+ return internal_state_.router()->encountered_error(); |
+ } |
+ |
+ // This method may be called to register an ErrorHandler to observe a |
+ // connection error on the underlying pipe. The callback runs asynchronously |
+ // from the current message loop. |
+ void set_error_handler(ErrorHandler* error_handler) { |
+ assert(internal_state_.router()); |
+ internal_state_.router()->set_error_handler(error_handler); |
+ } |
+ |
+ // Returns the underlying message pipe handle (if any) and resets the |
+ // InterfacePtr<..> to its uninitialized state. This method is helpful if you |
+ // need to move a proxy to another thread. See related notes for Bind. |
+ ScopedMessagePipeHandle ResetAndReturnMessagePipe() { |
+ State state; |
+ internal_state_.Swap(&state); |
+ return state.router() ? |
+ state.router()->ReleaseMessagePipe() : ScopedMessagePipeHandle(); |
+ } |
+ |
+ // DO NOT USE. Exposed only for internal use and for testing. |
+ internal::InterfacePtrState<Interface>* internal_state() { |
+ return &internal_state_; |
+ } |
+ |
+ private: |
+ typedef internal::InterfacePtrState<Interface> State; |
+ State internal_state_; |
+}; |
+ |
+// Takes a handle to the proxy end-point of a pipe. On the other end is |
+// presumed to be an interface implementation of type |Interface|. Returns a |
+// generated proxy to that interface, which may be used on the current thread. |
+// It is valid to call SetClient on the returned Interface to set an instance |
+// of Interface::Client. |
+template <typename Interface> |
+InterfacePtr<Interface> MakeProxy( |
+ ScopedMessagePipeHandle handle, |
+ MojoAsyncWaiter* waiter = GetDefaultAsyncWaiter()) { |
+ InterfacePtr<Interface> ptr; |
+ if (handle.is_valid()) |
+ ptr.Bind(handle.Pass(), waiter); |
+ return ptr.Pass(); |
+} |
+ |
+} // namespace mojo |
+ |
+#endif // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_H_ |