| Index: mojo/public/cpp/bindings/lib/router.cc
|
| diff --git a/mojo/public/cpp/bindings/lib/router.cc b/mojo/public/cpp/bindings/lib/router.cc
|
| index da5f34b1df57ce4bbfaf8668061d2bbde6bc3e49..648fcfe7355766a903c150f5dbaba7190893bd4a 100644
|
| --- a/mojo/public/cpp/bindings/lib/router.cc
|
| +++ b/mojo/public/cpp/bindings/lib/router.cc
|
| @@ -41,32 +41,32 @@ class ResponderThunk : public MessageReceiverWithStatus {
|
| // We raise an error to signal the calling application that an error
|
| // condition occurred. Without this the calling application would have no
|
| // way of knowing it should stop waiting for a response.
|
| + Result error(Result::Type::RESPONSE_DROPPED);
|
| if (task_runner_->RunsTasksOnCurrentThread()) {
|
| // Please note that even if this code is run from a different task
|
| // runner on the same thread as |task_runner_|, it is okay to directly
|
| // call Router::RaiseError(), because it will raise error from the
|
| // correct task runner asynchronously.
|
| if (router_)
|
| - router_->RaiseError();
|
| + router_->RaiseError(std::move(error));
|
| } else {
|
| task_runner_->PostTask(FROM_HERE,
|
| - base::Bind(&Router::RaiseError, router_));
|
| + base::Bind(&Router::RaiseError, router_,
|
| + base::Passed(&error)));
|
| }
|
| }
|
| }
|
|
|
| // MessageReceiver implementation:
|
| - bool Accept(Message* message) override {
|
| + Result Accept(Message* message) override {
|
| DCHECK(task_runner_->RunsTasksOnCurrentThread());
|
| accept_was_invoked_ = true;
|
| DCHECK(message->has_flag(kMessageIsResponse));
|
|
|
| - bool result = false;
|
| + if (!router_)
|
| + return Result(Result::Type::RESPONSE_DROPPED);
|
|
|
| - if (router_)
|
| - result = router_->Accept(message);
|
| -
|
| - return result;
|
| + return router_->Accept(message);
|
| }
|
|
|
| // MessageReceiverWithStatus implementation:
|
| @@ -108,7 +108,8 @@ Router::HandleIncomingMessageThunk::HandleIncomingMessageThunk(Router* router)
|
| Router::HandleIncomingMessageThunk::~HandleIncomingMessageThunk() {
|
| }
|
|
|
| -bool Router::HandleIncomingMessageThunk::Accept(Message* message) {
|
| +MessageReceiver::Result Router::HandleIncomingMessageThunk::Accept(
|
| + Message* message) {
|
| return router_->HandleIncomingMessage(message);
|
| }
|
|
|
| @@ -138,13 +139,15 @@ Router::Router(ScopedMessagePipeHandle message_pipe,
|
|
|
| Router::~Router() {}
|
|
|
| -bool Router::Accept(Message* message) {
|
| +MessageReceiver::Result Router::Accept(Message* message) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| DCHECK(!message->has_flag(kMessageExpectsResponse));
|
| return connector_.Accept(message);
|
| }
|
|
|
| -bool Router::AcceptWithResponder(Message* message, MessageReceiver* responder) {
|
| +MessageReceiver::Result Router::AcceptWithResponder(
|
| + Message* message,
|
| + MessageReceiver* responder) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| DCHECK(message->has_flag(kMessageExpectsResponse));
|
|
|
| @@ -155,13 +158,13 @@ bool Router::AcceptWithResponder(Message* message, MessageReceiver* responder) {
|
|
|
| bool is_sync = message->has_flag(kMessageIsSync);
|
| message->set_request_id(request_id);
|
| - if (!connector_.Accept(message))
|
| - return false;
|
| + if (!connector_.Accept(message).Succeeded())
|
| + return Result(Result::Type::SEND_FAILED);
|
|
|
| if (!is_sync) {
|
| // We assume ownership of |responder|.
|
| async_responders_[request_id] = base::WrapUnique(responder);
|
| - return true;
|
| + return Result::ForSuccess();
|
| }
|
|
|
| bool response_received = false;
|
| @@ -183,8 +186,8 @@ bool Router::AcceptWithResponder(Message* message, MessageReceiver* responder) {
|
| sync_responses_.erase(iter);
|
| }
|
|
|
| - // Return true means that we take ownership of |responder|.
|
| - return true;
|
| + // Success means that we take ownership of |responder|.
|
| + return Result::ForSuccess();
|
| }
|
|
|
| void Router::EnableTestingMode() {
|
| @@ -193,7 +196,7 @@ void Router::EnableTestingMode() {
|
| connector_.set_enforce_errors_from_incoming_receiver(false);
|
| }
|
|
|
| -bool Router::HandleIncomingMessage(Message* message) {
|
| +MessageReceiver::Result Router::HandleIncomingMessage(Message* message) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
|
|
| const bool during_sync_call =
|
| @@ -211,7 +214,7 @@ bool Router::HandleIncomingMessage(Message* message) {
|
| weak_factory_.GetWeakPtr()));
|
| }
|
|
|
| - return true;
|
| + return Result::ForSuccess();
|
| }
|
|
|
| return HandleMessageInternal(message);
|
| @@ -226,12 +229,12 @@ void Router::HandleQueuedMessages() {
|
| std::unique_ptr<Message> message(std::move(pending_messages_.front()));
|
| pending_messages_.pop();
|
|
|
| - bool result = HandleMessageInternal(message.get());
|
| + Result result = HandleMessageInternal(message.get());
|
| if (!weak_self)
|
| return;
|
|
|
| - if (!result && !testing_mode_) {
|
| - connector_.RaiseError();
|
| + if (!result.Succeeded() && !testing_mode_) {
|
| + connector_.RaiseError(std::move(result));
|
| break;
|
| }
|
| }
|
| @@ -245,17 +248,17 @@ void Router::HandleQueuedMessages() {
|
| OnConnectionError();
|
| }
|
|
|
| -bool Router::HandleMessageInternal(Message* message) {
|
| +MessageReceiver::Result Router::HandleMessageInternal(Message* message) {
|
| if (message->has_flag(kMessageExpectsResponse)) {
|
| if (!incoming_receiver_)
|
| - return false;
|
| + return Result(Result::Type::REQUEST_DROPPED);
|
|
|
| MessageReceiverWithStatus* responder = new ResponderThunk(
|
| weak_factory_.GetWeakPtr(), connector_.task_runner());
|
| - bool ok = incoming_receiver_->AcceptWithResponder(message, responder);
|
| - if (!ok)
|
| + Result result = incoming_receiver_->AcceptWithResponder(message, responder);
|
| + if (!result.Succeeded())
|
| delete responder;
|
| - return ok;
|
| + return result;
|
|
|
| } else if (message->has_flag(kMessageIsResponse)) {
|
| uint64_t request_id = message->request_id();
|
| @@ -264,25 +267,25 @@ bool Router::HandleMessageInternal(Message* message) {
|
| auto it = sync_responses_.find(request_id);
|
| if (it == sync_responses_.end()) {
|
| DCHECK(testing_mode_);
|
| - return false;
|
| + return Result::ForUnexpectedResponse(interface_name_, message);
|
| }
|
| it->second->response.reset(new Message());
|
| message->MoveTo(it->second->response.get());
|
| *it->second->response_received = true;
|
| - return true;
|
| + return Result::ForSuccess();
|
| }
|
|
|
| auto it = async_responders_.find(request_id);
|
| if (it == async_responders_.end()) {
|
| DCHECK(testing_mode_);
|
| - return false;
|
| + return Result::ForUnexpectedResponse(interface_name_, message);
|
| }
|
| std::unique_ptr<MessageReceiver> responder = std::move(it->second);
|
| async_responders_.erase(it);
|
| return responder->Accept(message);
|
| } else {
|
| if (!incoming_receiver_)
|
| - return false;
|
| + return Result(Result::Type::REQUEST_DROPPED);
|
|
|
| return incoming_receiver_->Accept(message);
|
| }
|
|
|