OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_REQUEST_H_ | 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_REQUEST_H_ |
6 #define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_REQUEST_H_ | 6 #define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_REQUEST_H_ |
7 | 7 |
| 8 #include <utility> |
| 9 |
8 #include "mojo/public/cpp/bindings/interface_ptr.h" | 10 #include "mojo/public/cpp/bindings/interface_ptr.h" |
9 | 11 |
10 namespace mojo { | 12 namespace mojo { |
11 | 13 |
12 // Represents a request from a remote client for an implementation of Interface | 14 // Represents a request from a remote client for an implementation of Interface |
13 // over a specified message pipe. The implementor of the interface should | 15 // over a specified message pipe. The implementor of the interface should |
14 // remove the message pipe by calling PassMessagePipe() and bind it to the | 16 // remove the message pipe by calling PassMessagePipe() and bind it to the |
15 // implementation. If this is not done, the InterfaceRequest will automatically | 17 // implementation. If this is not done, the InterfaceRequest will automatically |
16 // close the pipe on destruction. Can also represent the absence of a request | 18 // close the pipe on destruction. Can also represent the absence of a request |
17 // if the client did not provide a message pipe. | 19 // if the client did not provide a message pipe. |
18 template <typename Interface> | 20 template <typename Interface> |
19 class InterfaceRequest { | 21 class InterfaceRequest { |
20 MOJO_MOVE_ONLY_TYPE(InterfaceRequest) | 22 MOJO_MOVE_ONLY_TYPE(InterfaceRequest) |
21 public: | 23 public: |
22 // Constructs an empty InterfaceRequest, representing that the client is not | 24 // Constructs an empty InterfaceRequest, representing that the client is not |
23 // requesting an implementation of Interface. | 25 // requesting an implementation of Interface. |
24 InterfaceRequest() {} | 26 InterfaceRequest() {} |
25 InterfaceRequest(decltype(nullptr)) {} | 27 InterfaceRequest(decltype(nullptr)) {} |
26 | 28 |
27 // Takes the message pipe from another InterfaceRequest. | 29 // Takes the message pipe from another InterfaceRequest. |
28 InterfaceRequest(InterfaceRequest&& other) { handle_ = other.handle_.Pass(); } | 30 InterfaceRequest(InterfaceRequest&& other) { |
| 31 handle_ = std::move(other.handle_); |
| 32 } |
29 InterfaceRequest& operator=(InterfaceRequest&& other) { | 33 InterfaceRequest& operator=(InterfaceRequest&& other) { |
30 handle_ = other.handle_.Pass(); | 34 handle_ = std::move(other.handle_); |
31 return *this; | 35 return *this; |
32 } | 36 } |
33 | 37 |
34 // Assigning to nullptr resets the InterfaceRequest to an empty state, | 38 // Assigning to nullptr resets the InterfaceRequest to an empty state, |
35 // closing the message pipe currently bound to it (if any). | 39 // closing the message pipe currently bound to it (if any). |
36 InterfaceRequest& operator=(decltype(nullptr)) { | 40 InterfaceRequest& operator=(decltype(nullptr)) { |
37 handle_.reset(); | 41 handle_.reset(); |
38 return *this; | 42 return *this; |
39 } | 43 } |
40 | 44 |
41 // Binds the request to a message pipe over which Interface is to be | 45 // Binds the request to a message pipe over which Interface is to be |
42 // requested. If the request is already bound to a message pipe, the current | 46 // requested. If the request is already bound to a message pipe, the current |
43 // message pipe will be closed. | 47 // message pipe will be closed. |
44 void Bind(ScopedMessagePipeHandle handle) { handle_ = handle.Pass(); } | 48 void Bind(ScopedMessagePipeHandle handle) { handle_ = std::move(handle); } |
45 | 49 |
46 // Indicates whether the request currently contains a valid message pipe. | 50 // Indicates whether the request currently contains a valid message pipe. |
47 bool is_pending() const { return handle_.is_valid(); } | 51 bool is_pending() const { return handle_.is_valid(); } |
48 | 52 |
49 // Removes the message pipe from the request and returns it. | 53 // Removes the message pipe from the request and returns it. |
50 ScopedMessagePipeHandle PassMessagePipe() { return handle_.Pass(); } | 54 ScopedMessagePipeHandle PassMessagePipe() { return std::move(handle_); } |
51 | 55 |
52 private: | 56 private: |
53 ScopedMessagePipeHandle handle_; | 57 ScopedMessagePipeHandle handle_; |
54 }; | 58 }; |
55 | 59 |
56 // Makes an InterfaceRequest bound to the specified message pipe. If |handle| | 60 // Makes an InterfaceRequest bound to the specified message pipe. If |handle| |
57 // is empty or invalid, the resulting InterfaceRequest will represent the | 61 // is empty or invalid, the resulting InterfaceRequest will represent the |
58 // absence of a request. | 62 // absence of a request. |
59 template <typename Interface> | 63 template <typename Interface> |
60 InterfaceRequest<Interface> MakeRequest(ScopedMessagePipeHandle handle) { | 64 InterfaceRequest<Interface> MakeRequest(ScopedMessagePipeHandle handle) { |
61 InterfaceRequest<Interface> request; | 65 InterfaceRequest<Interface> request; |
62 request.Bind(handle.Pass()); | 66 request.Bind(std::move(handle)); |
63 return request.Pass(); | 67 return std::move(request); |
64 } | 68 } |
65 | 69 |
66 // Creates a new message pipe over which Interface is to be served. Binds the | 70 // Creates a new message pipe over which Interface is to be served. Binds the |
67 // specified InterfacePtr to one end of the message pipe, and returns an | 71 // specified InterfacePtr to one end of the message pipe, and returns an |
68 // InterfaceRequest bound to the other. The InterfacePtr should be passed to | 72 // InterfaceRequest bound to the other. The InterfacePtr should be passed to |
69 // the client, and the InterfaceRequest should be passed to whatever will | 73 // the client, and the InterfaceRequest should be passed to whatever will |
70 // provide the implementation. The implementation should typically be bound to | 74 // provide the implementation. The implementation should typically be bound to |
71 // the InterfaceRequest using the Binding or StrongBinding classes. The client | 75 // the InterfaceRequest using the Binding or StrongBinding classes. The client |
72 // may begin to issue calls even before an implementation has been bound, since | 76 // may begin to issue calls even before an implementation has been bound, since |
73 // messages sent over the pipe will just queue up until they are consumed by | 77 // messages sent over the pipe will just queue up until they are consumed by |
(...skipping 30 matching lines...) Expand all Loading... |
104 // SourcePtr source; | 108 // SourcePtr source; |
105 // InterfaceRequest<Source> source_request = GetProxy(&source); | 109 // InterfaceRequest<Source> source_request = GetProxy(&source); |
106 // collector->RegisterSource(source.Pass()); | 110 // collector->RegisterSource(source.Pass()); |
107 // CreateSource(source_request.Pass()); // Create implementation locally. | 111 // CreateSource(source_request.Pass()); // Create implementation locally. |
108 // | 112 // |
109 template <typename Interface> | 113 template <typename Interface> |
110 InterfaceRequest<typename Interface::GenericInterface> | 114 InterfaceRequest<typename Interface::GenericInterface> |
111 GetProxy(InterfacePtr<Interface>* ptr) { | 115 GetProxy(InterfacePtr<Interface>* ptr) { |
112 MessagePipe pipe; | 116 MessagePipe pipe; |
113 ptr->Bind(InterfacePtrInfo<typename Interface::GenericInterface>( | 117 ptr->Bind(InterfacePtrInfo<typename Interface::GenericInterface>( |
114 pipe.handle0.Pass(), 0u)); | 118 std::move(pipe.handle0), 0u)); |
115 return MakeRequest<typename Interface::GenericInterface>( | 119 return MakeRequest<typename Interface::GenericInterface>( |
116 pipe.handle1.Pass()); | 120 std::move(pipe.handle1)); |
117 } | 121 } |
118 | 122 |
119 } // namespace mojo | 123 } // namespace mojo |
120 | 124 |
121 #endif // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_REQUEST_H_ | 125 #endif // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_REQUEST_H_ |
OLD | NEW |