Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1001)

Side by Side Diff: mojo/public/cpp/bindings/interface_request.h

Issue 2250183003: Make the fuchsia mojo/public repo the source of truth. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « mojo/public/cpp/bindings/interface_ptr_set.h ('k') | mojo/public/cpp/bindings/lib/TODO » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_REQUEST_H_
6 #define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_REQUEST_H_
7
8 #include <cstddef>
9 #include <utility>
10
11 #include "mojo/public/cpp/system/message_pipe.h"
12
13 namespace mojo {
14
15 template <typename I>
16 class InterfacePtr;
17
18 template <typename I>
19 class InterfaceHandle;
20
21 // Represents a request from a remote client for an implementation of Interface
22 // over a specified message pipe. The implementor of the interface should
23 // remove the message pipe by calling PassMessagePipe() and bind it to the
24 // implementation. If this is not done, the InterfaceRequest will automatically
25 // close the pipe on destruction. Can also represent the absence of a request
26 // if the client did not provide a message pipe.
27 template <typename Interface>
28 class InterfaceRequest {
29 public:
30 // Constructs an "empty" InterfaceRequest, representing that the client is not
31 // requesting an implementation of Interface.
32 InterfaceRequest() {}
33 InterfaceRequest(std::nullptr_t) {}
34
35 // Constructs an InterfaceRequest from a message pipe handle (if |handle| is
36 // not set, then this constructs an "empty" InterfaceRequest).
37 explicit InterfaceRequest(ScopedMessagePipeHandle handle)
38 : handle_(handle.Pass()) {}
39
40 // Takes the message pipe from another InterfaceRequest.
41 InterfaceRequest(InterfaceRequest&& other) { handle_ = other.handle_.Pass(); }
42 InterfaceRequest& operator=(InterfaceRequest&& other) {
43 handle_ = other.handle_.Pass();
44 return *this;
45 }
46
47 // Assigning to nullptr resets the InterfaceRequest to an empty state,
48 // closing the message pipe currently bound to it (if any).
49 InterfaceRequest& operator=(std::nullptr_t) {
50 handle_.reset();
51 return *this;
52 }
53
54 // Binds the request to a message pipe over which Interface is to be
55 // requested. If the request is already bound to a message pipe, the current
56 // message pipe will be closed.
57 void Bind(ScopedMessagePipeHandle handle) { handle_ = handle.Pass(); }
58
59 // Indicates whether the request currently contains a valid message pipe.
60 bool is_pending() const { return handle_.is_valid(); }
61
62 // Removes the message pipe from the request and returns it.
63 ScopedMessagePipeHandle PassMessagePipe() { return handle_.Pass(); }
64
65 private:
66 ScopedMessagePipeHandle handle_;
67
68 MOJO_MOVE_ONLY_TYPE(InterfaceRequest);
69 };
70
71 // Creates a new message pipe over which Interface is to be served, and one end
72 // into the supplied |handle| and the returns the other inside an
73 // InterfaceRequest<>. The InterfaceHandle<> can be used to create a client
74 // proxy (such as an InterfacePtr<> or SynchronousInterfacePtr<>).
75 // InterfaceRequest<> should be passed to whatever will provide the
76 // implementation.
77 // TODO(vardhan): Rename this function? This isn't making a "proxy" you can use,
78 // as you still need to convert it into something like InterfacePtr<>.
79 template <typename Interface>
80 InterfaceRequest<Interface> GetProxy(InterfaceHandle<Interface>* handle) {
81 MessagePipe pipe;
82 *handle = InterfaceHandle<Interface>(pipe.handle0.Pass(), 0u);
83 return InterfaceRequest<Interface>(pipe.handle1.Pass());
84 }
85
86 // Creates a new message pipe over which Interface is to be served. Binds the
87 // specified InterfacePtr to one end of the message pipe, and returns an
88 // InterfaceRequest bound to the other. The InterfacePtr should be passed to
89 // the client, and the InterfaceRequest should be passed to whatever will
90 // provide the implementation. The implementation should typically be bound to
91 // the InterfaceRequest using the Binding or StrongBinding classes. The client
92 // may begin to issue calls even before an implementation has been bound, since
93 // messages sent over the pipe will just queue up until they are consumed by
94 // the implementation.
95 //
96 // Example #1: Requesting a remote implementation of an interface.
97 // ===============================================================
98 //
99 // Given the following interface:
100 //
101 // interface Database {
102 // OpenTable(Table& table);
103 // }
104 //
105 // The client would have code similar to the following:
106 //
107 // DatabasePtr database = ...; // Connect to database.
108 // TablePtr table;
109 // database->OpenTable(GetProxy(&table));
110 //
111 // Upon return from GetProxy, |table| is ready to have methods called on it.
112 //
113 // Example #2: Registering a local implementation with a remote service.
114 // =====================================================================
115 //
116 // Given the following interface
117 // interface Collector {
118 // RegisterSource(Source source);
119 // }
120 //
121 // The client would have code similar to the following:
122 //
123 // CollectorPtr collector = ...; // Connect to Collector.
124 // SourcePtr source;
125 // InterfaceRequest<Source> source_request = GetProxy(&source);
126 // collector->RegisterSource(source.Pass());
127 // CreateSource(source_request.Pass()); // Create implementation locally.
128 //
129 // TODO(vardhan): Move this function into interface_ptr.h
130 template <typename Interface>
131 InterfaceRequest<Interface> GetProxy(InterfacePtr<Interface>* ptr) {
132 InterfaceHandle<Interface> iface_handle;
133 auto retval = GetProxy(&iface_handle);
134 *ptr = InterfacePtr<Interface>::Create(std::move(iface_handle));
135 return retval;
136 }
137
138 } // namespace mojo
139
140 #endif // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_REQUEST_H_
OLDNEW
« no previous file with comments | « mojo/public/cpp/bindings/interface_ptr_set.h ('k') | mojo/public/cpp/bindings/lib/TODO » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698