| // 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_REQUEST_H_ |
| #define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_REQUEST_H_ |
| |
| #include "mojo/public/cpp/bindings/interface_ptr.h" |
| |
| namespace mojo { |
| |
| // Used in methods that return instances of remote objects. |
| template <typename Interface> |
| class InterfaceRequest { |
| MOJO_MOVE_ONLY_TYPE(InterfaceRequest) |
| public: |
| InterfaceRequest() {} |
| |
| InterfaceRequest(InterfaceRequest&& other) { handle_ = other.handle_.Pass(); } |
| InterfaceRequest& operator=(InterfaceRequest&& other) { |
| handle_ = other.handle_.Pass(); |
| return *this; |
| } |
| |
| // Returns true if the request has yet to be completed. |
| bool is_pending() const { return handle_.is_valid(); } |
| |
| void Bind(ScopedMessagePipeHandle handle) { handle_ = handle.Pass(); } |
| |
| ScopedMessagePipeHandle PassMessagePipe() { return handle_.Pass(); } |
| |
| private: |
| ScopedMessagePipeHandle handle_; |
| }; |
| |
| template <typename Interface> |
| InterfaceRequest<Interface> MakeRequest(ScopedMessagePipeHandle handle) { |
| InterfaceRequest<Interface> request; |
| request.Bind(handle.Pass()); |
| return request.Pass(); |
| } |
| |
| // Used to construct a request that synchronously binds an InterfacePtr<..>, |
| // making it immediately usable upon return. The resulting request object may |
| // then be later bound to an InterfaceImpl<..> via BindToRequest. |
| // |
| // Given the following interface: |
| // |
| // interface Foo { |
| // CreateBar(Bar& bar); |
| // } |
| // |
| // The caller of CreateBar would have code similar to the following: |
| // |
| // InterfacePtr<Foo> foo = ...; |
| // InterfacePtr<Bar> bar; |
| // foo->CreateBar(GetProxy(&bar)); |
| // |
| // Upon return from CreateBar, |bar| is ready to have methods called on it. |
| // |
| template <typename Interface> |
| InterfaceRequest<Interface> GetProxy(InterfacePtr<Interface>* ptr) { |
| MessagePipe pipe; |
| ptr->Bind(pipe.handle0.Pass()); |
| return MakeRequest<Interface>(pipe.handle1.Pass()); |
| } |
| |
| } // namespace mojo |
| |
| #endif // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_REQUEST_H_ |