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 3 // found in the LICENSE file. 4 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_INTERFACE_REQUEST_H_ 6 #define MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_INTERFACE_REQUEST_H_ 7 8 #include <string> 9 #include <utility> 10 11 #include "base/macros.h" 12 #include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h" 13 14 namespace mojo { 15 16 // AssociatedInterfaceRequest represents an associated interface request. It is 17 // similar to InterfaceRequest except that it doesn't own a message pipe handle. 18 template <typename Interface> 19 class AssociatedInterfaceRequest { 20 public: 21 // Constructs an empty AssociatedInterfaceRequest, representing that the 22 // client is not requesting an implementation of Interface. AssociatedInterfaceRequest()23 AssociatedInterfaceRequest() {} AssociatedInterfaceRequest(decltype (nullptr))24 AssociatedInterfaceRequest(decltype(nullptr)) {} 25 26 // Takes the interface endpoint handle from another 27 // AssociatedInterfaceRequest. AssociatedInterfaceRequest(AssociatedInterfaceRequest && other)28 AssociatedInterfaceRequest(AssociatedInterfaceRequest&& other) { 29 handle_ = std::move(other.handle_); 30 } 31 AssociatedInterfaceRequest& operator=(AssociatedInterfaceRequest&& other) { 32 if (this != &other) 33 handle_ = std::move(other.handle_); 34 return *this; 35 } 36 37 // Assigning to nullptr resets the AssociatedInterfaceRequest to an empty 38 // state, closing the interface endpoint handle currently bound to it (if 39 // any). decltype(nullptr)40 AssociatedInterfaceRequest& operator=(decltype(nullptr)) { 41 handle_.reset(); 42 return *this; 43 } 44 45 // Indicates whether the request currently contains a valid interface endpoint 46 // handle. is_pending()47 bool is_pending() const { return handle_.is_valid(); } 48 Bind(ScopedInterfaceEndpointHandle handle)49 void Bind(ScopedInterfaceEndpointHandle handle) { 50 handle_ = std::move(handle); 51 } 52 PassHandle()53 ScopedInterfaceEndpointHandle PassHandle() { 54 return std::move(handle_); 55 } 56 handle()57 const ScopedInterfaceEndpointHandle& handle() const { return handle_; } 58 Equals(const AssociatedInterfaceRequest & other)59 bool Equals(const AssociatedInterfaceRequest& other) const { 60 if (this == &other) 61 return true; 62 63 // Now that the two refer to different objects, they are equivalent if 64 // and only if they are both invalid. 65 return !is_pending() && !other.is_pending(); 66 } 67 ResetWithReason(uint32_t custom_reason,const std::string & description)68 void ResetWithReason(uint32_t custom_reason, const std::string& description) { 69 handle_.ResetWithReason(custom_reason, description); 70 } 71 72 private: 73 ScopedInterfaceEndpointHandle handle_; 74 75 DISALLOW_COPY_AND_ASSIGN(AssociatedInterfaceRequest); 76 }; 77 78 // Makes an AssociatedInterfaceRequest bound to the specified associated 79 // endpoint. 80 template <typename Interface> MakeAssociatedRequest(ScopedInterfaceEndpointHandle handle)81AssociatedInterfaceRequest<Interface> MakeAssociatedRequest( 82 ScopedInterfaceEndpointHandle handle) { 83 AssociatedInterfaceRequest<Interface> request; 84 request.Bind(std::move(handle)); 85 return request; 86 } 87 88 } // namespace mojo 89 90 #endif // MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_INTERFACE_REQUEST_H_ 91