Index: blimp/net/blimp_connection.cc |
diff --git a/blimp/net/blimp_connection.cc b/blimp/net/blimp_connection.cc |
index e8f3c68cc376131814ccd41bcf308c8950a2ce91..c177cd580b9d50ab7b41438758ae98aa9b2d456d 100644 |
--- a/blimp/net/blimp_connection.cc |
+++ b/blimp/net/blimp_connection.cc |
@@ -99,12 +99,47 @@ void BlimpMessageSender::OnWritePacketComplete(int result) { |
} // namespace |
+class BlimpConnection::EndConnectionHandler |
Kevin M
2016/05/25 21:19:19
Comment on the class' purpose?
Wez
2016/05/25 23:11:36
Done.
|
+ : public BlimpMessageProcessor { |
+ public: |
+ explicit EndConnectionHandler(BlimpConnection* connection) |
+ : connection_(connection), message_handler_(nullptr) {} |
+ |
+ void set_message_handler(BlimpMessageProcessor* message_handler) { |
+ message_handler_ = message_handler; |
+ } |
+ |
+ // BlimpMessageProcessor implementation. |
+ void ProcessMessage(std::unique_ptr<BlimpMessage> message, |
+ const net::CompletionCallback& callback) override { |
+ if (message->has_protocol_control() && |
+ message->protocol_control().has_end_connection()) { |
+ // Report the EndConnection reason to connection error observers. |
+ connection_->OnConnectionError( |
+ message->protocol_control().end_connection().reason()); |
+ |
+ // Caller is responsible for ensuring |callback| is still safe to call. |
+ callback.Run(message->protocol_control().end_connection().reason()); |
+ return; |
+ } |
+ |
+ message_handler_->ProcessMessage(std::move(message), callback); |
+ } |
+ |
+ private: |
+ BlimpConnection* connection_; |
+ BlimpMessageProcessor* message_handler_; |
Kevin M
2016/05/25 21:19:19
Document the role of |message_handler_|?
Wez
2016/05/25 23:11:37
Done.
|
+ |
+ DISALLOW_COPY_AND_ASSIGN(EndConnectionHandler); |
+}; |
+ |
BlimpConnection::BlimpConnection(std::unique_ptr<PacketReader> reader, |
std::unique_ptr<PacketWriter> writer) |
: reader_(std::move(reader)), |
message_pump_(new BlimpMessagePump(reader_.get())), |
writer_(std::move(writer)), |
- outgoing_msg_processor_(new BlimpMessageSender(writer_.get())) { |
+ outgoing_msg_processor_(new BlimpMessageSender(writer_.get())), |
+ end_connection_handler_(new EndConnectionHandler(this)) { |
DCHECK(writer_); |
// Observe the connection errors received by any of this connection's network |
@@ -133,7 +168,9 @@ void BlimpConnection::RemoveConnectionErrorObserver( |
void BlimpConnection::SetIncomingMessageProcessor( |
BlimpMessageProcessor* processor) { |
- message_pump_->SetMessageProcessor(processor); |
+ end_connection_handler_->set_message_handler(processor); |
+ message_pump_->SetMessageProcessor(processor ? end_connection_handler_.get() |
+ : nullptr); |
} |
BlimpMessageProcessor* BlimpConnection::GetOutgoingMessageProcessor() { |