Index: mojo/public/cpp/bindings/interface_impl.h |
diff --git a/mojo/public/cpp/bindings/interface_impl.h b/mojo/public/cpp/bindings/interface_impl.h |
index 4a78cb4b05a1f11b4380a001aab45fa76e91a8e2..8204f3074090809047d93114af6dbcfb97e6d741 100644 |
--- a/mojo/public/cpp/bindings/interface_impl.h |
+++ b/mojo/public/cpp/bindings/interface_impl.h |
@@ -19,6 +19,7 @@ template <typename Interface> |
class InterfaceImpl : public internal::InterfaceImplBase<Interface> { |
public: |
typedef typename Interface::Client Client; |
+ typedef Interface Implements; |
jamesr
2014/07/14 21:21:44
this is a little bit strange but without it I'm no
|
InterfaceImpl() : internal_state_(this) {} |
virtual ~InterfaceImpl() {} |
@@ -69,8 +70,9 @@ template <typename Impl> |
Impl* BindToPipe( |
darin (slow to review)
2014/07/14 21:34:06
Instead of exposing the enum (which is a bit awkwa
|
Impl* instance, |
ScopedMessagePipeHandle handle, |
- const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { |
- instance->internal_state()->Bind(handle.Pass(), waiter); |
+ const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter(), |
+ OnConnectionErrorBehavior behavior = DELETE_ON_ERROR) { |
+ instance->internal_state()->Bind(handle.Pass(), waiter, behavior); |
return instance; |
} |
@@ -95,8 +97,11 @@ Impl* BindToProxy( |
// Takes an instance of an InterfaceImpl<..> subclass and binds it to the given |
// InterfaceRequest<..>. The instance is returned for convenience in member |
-// initializer lists, etc. If the pipe is closed, the instance's |
-// OnConnectionError method will be called. |
+// initializer lists, etc. |
+// |
+// The bind call passes ownership of the instance to the pipe. If the pipe is |
+// closed, the instance's OnConnectionError method will be called and then the |
+// instance will be deleted. |
// |
// The instance is also bound to the current thread. Its methods will only be |
// called on the current thread, and if the current thread exits, then it will |
@@ -104,6 +109,9 @@ Impl* BindToProxy( |
// |
// Before returning, the instance will receive a SetClient call, providing it |
// with a proxy to the client on the other end of the pipe. |
+// |
+// (Aside: If we were using C++11, the type of the first parameter would be |
+// std::unique_ptr<Impl>). |
template <typename Impl, typename Interface> |
Impl* BindToRequest( |
Impl* instance, |
@@ -112,6 +120,17 @@ Impl* BindToRequest( |
return BindToPipe(instance, request->PassMessagePipe(), waiter); |
} |
+// This is the same as BindToRequest except that the lifetime of the instance is |
+// not bound to the pipe. If the pipe is closed, the instance's OnChannelError |
+// method will be called but the instance will not be deleted. |
+template <typename Impl, typename Interface> |
+Impl* WeakBindToRequest( |
+ Impl* instance, |
+ InterfaceRequest<Interface>* request, |
+ const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { |
+ return BindToPipe(instance, request->PassMessagePipe(), waiter, DO_NOTHING); |
+} |
+ |
} // namespace mojo |
#endif // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_IMPL_H_ |