Index: mojo/public/bindings/lib/connector.cc |
diff --git a/mojo/public/bindings/lib/connector.cc b/mojo/public/bindings/lib/connector.cc |
index b35812f39ead010829cf34c92d58a843e49fc5ca..7a25e93fb9757639c405480e31fb3da2ff827ac4 100644 |
--- a/mojo/public/bindings/lib/connector.cc |
+++ b/mojo/public/bindings/lib/connector.cc |
@@ -4,10 +4,9 @@ |
#include "mojo/public/bindings/lib/connector.h" |
-#include <assert.h> |
#include <stdlib.h> |
-#include <algorithm> |
+#include "mojo/public/bindings/error_handler.h" |
namespace mojo { |
namespace internal { |
@@ -16,11 +15,15 @@ namespace internal { |
Connector::Connector(ScopedMessagePipeHandle message_pipe, |
MojoAsyncWaiter* waiter) |
- : waiter_(waiter), |
+ : error_handler_(NULL), |
+ waiter_(waiter), |
message_pipe_(message_pipe.Pass()), |
incoming_receiver_(NULL), |
async_wait_id_(0), |
error_(false) { |
+ // Even though we don't have an incoming receiver, we still want to monitor |
+ // the message pipe to know if is closed or encounters an error. |
+ WaitToReadMore(); |
} |
Connector::~Connector() { |
@@ -28,13 +31,6 @@ Connector::~Connector() { |
waiter_->CancelWait(waiter_, async_wait_id_); |
} |
-void Connector::SetIncomingReceiver(MessageReceiver* receiver) { |
- assert(!incoming_receiver_); |
- incoming_receiver_ = receiver; |
- if (incoming_receiver_) |
- WaitToReadMore(); |
-} |
- |
bool Connector::Accept(Message* message) { |
if (error_) |
return false; |
@@ -44,10 +40,22 @@ bool Connector::Accept(Message* message) { |
} |
// static |
-void Connector::OnHandleReady(void* closure, MojoResult result) { |
+void Connector::CallOnHandleReady(void* closure, MojoResult result) { |
Connector* self = static_cast<Connector*>(closure); |
- self->async_wait_id_ = 0; |
- self->ReadMore(); |
+ self->OnHandleReady(result); |
+} |
+ |
+void Connector::OnHandleReady(MojoResult result) { |
+ async_wait_id_ = 0; |
+ |
+ if (result == MOJO_RESULT_OK) { |
+ ReadMore(); |
+ } else { |
+ error_ = true; |
+ } |
+ |
+ if (error_ && error_handler_) |
+ error_handler_->OnError(); |
} |
void Connector::WaitToReadMore() { |
@@ -55,7 +63,7 @@ void Connector::WaitToReadMore() { |
message_pipe_.get().value(), |
MOJO_WAIT_FLAG_READABLE, |
MOJO_DEADLINE_INDEFINITE, |
- &Connector::OnHandleReady, |
+ &Connector::CallOnHandleReady, |
this); |
} |
@@ -95,7 +103,8 @@ void Connector::ReadMore() { |
break; |
} |
- incoming_receiver_->Accept(&message); |
+ if (incoming_receiver_) |
+ incoming_receiver_->Accept(&message); |
} |
} |