OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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_ASSOCIATED_GROUP_H_ | 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_GROUP_H_ |
6 #define MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_GROUP_H_ | 6 #define MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_GROUP_H_ |
7 | 7 |
8 #include "base/callback.h" | 8 #include "base/callback.h" |
9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
10 #include "mojo/public/cpp/bindings/associated_interface_ptr_info.h" | |
11 #include "mojo/public/cpp/bindings/associated_interface_request.h" | |
12 #include "mojo/public/cpp/bindings/bindings_export.h" | 10 #include "mojo/public/cpp/bindings/bindings_export.h" |
13 #include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h" | 11 #include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h" |
14 | 12 |
15 namespace mojo { | 13 namespace mojo { |
16 | 14 |
17 class AssociatedGroupController; | 15 class AssociatedGroupController; |
18 | 16 |
19 // AssociatedGroup refers to all the interface endpoints running at one end of a | 17 // AssociatedGroup refers to all the interface endpoints running at one end of a |
20 // message pipe. | 18 // message pipe. |
21 // It is thread safe and cheap to make copies. | 19 // It is thread safe and cheap to make copies. |
(...skipping 14 matching lines...) Expand all Loading... |
36 // The return value of this getter if this object is initialized with a | 34 // The return value of this getter if this object is initialized with a |
37 // ScopedInterfaceEndpointHandle: | 35 // ScopedInterfaceEndpointHandle: |
38 // - If the handle is invalid, the return value will always be null. | 36 // - If the handle is invalid, the return value will always be null. |
39 // - If the handle is valid and non-pending, the return value will be | 37 // - If the handle is valid and non-pending, the return value will be |
40 // non-null and remain unchanged even if the handle is later reset. | 38 // non-null and remain unchanged even if the handle is later reset. |
41 // - If the handle is pending asssociation, the return value will initially | 39 // - If the handle is pending asssociation, the return value will initially |
42 // be null, change to non-null when/if the handle is associated, and | 40 // be null, change to non-null when/if the handle is associated, and |
43 // remain unchanged ever since. | 41 // remain unchanged ever since. |
44 AssociatedGroupController* GetController(); | 42 AssociatedGroupController* GetController(); |
45 | 43 |
46 // TODO(yzshen): Remove the following public method. It is not needed anymore. | |
47 // Configuration used by CreateAssociatedInterface(). Please see the comments | |
48 // of that method for more details. | |
49 enum AssociatedInterfaceConfig { WILL_PASS_PTR, WILL_PASS_REQUEST }; | |
50 | |
51 // |config| indicates whether |ptr_info| or |request| will be sent to the | |
52 // remote side of the message pipe. | |
53 // | |
54 // NOTE: If |config| is |WILL_PASS_REQUEST|, you will want to bind |ptr_info| | |
55 // to a local AssociatedInterfacePtr to make calls. However, there is one | |
56 // restriction: the pointer should NOT be used to make calls before |request| | |
57 // is sent. Violating that will cause the message pipe to be closed. On the | |
58 // other hand, as soon as |request| is sent, the pointer is usable. There is | |
59 // no need to wait until |request| is bound to an implementation at the remote | |
60 // side. | |
61 template <typename T> | |
62 void CreateAssociatedInterface(AssociatedInterfaceConfig config, | |
63 AssociatedInterfacePtrInfo<T>* ptr_info, | |
64 AssociatedInterfaceRequest<T>* request) { | |
65 ScopedInterfaceEndpointHandle handle0; | |
66 ScopedInterfaceEndpointHandle handle1; | |
67 ScopedInterfaceEndpointHandle::CreatePairPendingAssociation(&handle0, | |
68 &handle1); | |
69 | |
70 ptr_info->set_handle(std::move(handle0)); | |
71 request->Bind(std::move(handle1)); | |
72 | |
73 if (config == WILL_PASS_PTR) { | |
74 // The implementation is local, therefore set the version according to | |
75 // the interface definition that this code is built against. | |
76 ptr_info->set_version(T::Version_); | |
77 } else { | |
78 // The implementation is remote, we don't know about its actual version | |
79 // yet. | |
80 ptr_info->set_version(0u); | |
81 } | |
82 } | |
83 | |
84 private: | 44 private: |
85 base::Callback<AssociatedGroupController*()> controller_getter_; | 45 base::Callback<AssociatedGroupController*()> controller_getter_; |
86 scoped_refptr<AssociatedGroupController> controller_; | 46 scoped_refptr<AssociatedGroupController> controller_; |
87 }; | 47 }; |
88 | 48 |
89 } // namespace mojo | 49 } // namespace mojo |
90 | 50 |
91 #endif // MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_GROUP_H_ | 51 #endif // MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_GROUP_H_ |
OLD | NEW |