Index: mojo/public/bindings/lib/remote_ptr.h |
diff --git a/mojo/public/bindings/lib/remote_ptr.h b/mojo/public/bindings/lib/remote_ptr.h |
index 3b57594e23ef0ddf722990d892673ba04ea60c7c..a0c42e33c64dabd946f2f0e8e7e479e8538d4983 100644 |
--- a/mojo/public/bindings/lib/remote_ptr.h |
+++ b/mojo/public/bindings/lib/remote_ptr.h |
@@ -22,8 +22,7 @@ namespace mojo { |
// class FooClientImpl : public FooClientStub { |
// public: |
// explicit FooClientImpl(const mojo::MessagePipeHandle& message_pipe) |
-// : foo_(message_pipe) { |
-// foo_.SetPeer(this); |
+// : foo_(message_pipe, this) { |
// foo_.Ping(); |
// } |
// virtual void Pong() { |
@@ -38,8 +37,7 @@ namespace mojo { |
// class FooImpl : public FooStub { |
// public: |
// explicit FooImpl(const mojo::MessagePipeHandle& message_pipe) |
-// : client_(message_pipe) { |
-// client_.SetPeer(this); |
+// : client_(message_pipe, this) { |
// } |
// virtual void Ping() { |
// client_->Pong(); |
@@ -54,8 +52,9 @@ class RemotePtr { |
public: |
RemotePtr() : state_(NULL) {} |
- explicit RemotePtr(ScopedMessagePipeHandle message_pipe) |
- : state_(new State(message_pipe.Pass())) { |
+ explicit RemotePtr(ScopedMessagePipeHandle message_pipe, |
+ typename S::_Peer* peer = NULL) |
+ : state_(new State(message_pipe.Pass(), peer)) { |
} |
// Move-only constructor and operator=. |
@@ -87,9 +86,10 @@ class RemotePtr { |
state_ = NULL; |
} |
- void reset(ScopedMessagePipeHandle message_pipe) { |
+ void reset(ScopedMessagePipeHandle message_pipe, |
+ typename S::_Peer* peer = NULL) { |
delete state_; |
- state_ = new State(message_pipe.Pass()); |
+ state_ = new State(message_pipe.Pass(), peer); |
} |
bool encountered_error() const { |
@@ -97,19 +97,18 @@ class RemotePtr { |
return state_->connector.encountered_error(); |
} |
- void SetPeer(typename S::_Peer::_Stub* peer) { |
- assert(state_); |
- state_->connector.SetIncomingReceiver(peer); |
- } |
- |
private: |
struct State { |
- State(ScopedMessagePipeHandle message_pipe) |
+ State(ScopedMessagePipeHandle message_pipe, typename S::_Peer* peer) |
: connector(message_pipe.Pass()), |
- proxy(&connector) { |
+ proxy(&connector), |
+ stub(peer) { |
+ if (peer) |
+ connector.SetIncomingReceiver(&stub); |
} |
internal::Connector connector; |
typename S::_Proxy proxy; |
+ typename S::_Peer::_Stub stub; |
}; |
State* release() { |