Index: remoting/protocol/message_reader.cc |
diff --git a/remoting/protocol/message_reader.cc b/remoting/protocol/message_reader.cc |
index 75b14f2344067cc81c33e76c53903c0928fbf61b..7b818ee7da90a0e61059cbf92aa5a59d2f67243e 100644 |
--- a/remoting/protocol/message_reader.cc |
+++ b/remoting/protocol/message_reader.cc |
@@ -24,23 +24,18 @@ MessageReader::MessageReader() |
} |
MessageReader::~MessageReader() { |
- // Destroy MessageReaderPrivate if it was created. |
- if (destruction_callback_.get()) |
- destruction_callback_->Run(); |
} |
-void MessageReader::Close() { |
- closed_ = true; |
-} |
- |
-void MessageReader::Init(net::Socket* socket) { |
+void MessageReader::Init(net::Socket* socket, |
+ MessageReceivedCallback* callback) { |
+ message_received_callback_.reset(callback); |
DCHECK(socket); |
socket_ = socket; |
DoRead(); |
} |
void MessageReader::DoRead() { |
- while (true) { |
+ while (!closed_) { |
read_buffer_ = new net::IOBuffer(kReadBufferSize); |
int result = socket_->Read( |
read_buffer_, kReadBufferSize, &read_callback_); |
@@ -59,10 +54,25 @@ void MessageReader::OnRead(int result) { |
void MessageReader::HandleReadResult(int result) { |
if (result > 0) { |
- data_received_callback_->Run(read_buffer_, result); |
+ OnDataReceived(read_buffer_, result); |
} else { |
- if (result != net::ERR_IO_PENDING) |
+ if (result == net::ERR_CONNECTION_CLOSED) { |
+ closed_ = true; |
+ } else if (result != net::ERR_IO_PENDING) { |
LOG(ERROR) << "Read() returned error " << result; |
+ } |
+ } |
+} |
+ |
+void MessageReader::OnDataReceived(net::IOBuffer* data, int data_size) { |
+ message_decoder_.AddData(data, data_size); |
+ |
+ while (true) { |
+ CompoundBuffer buffer; |
+ if (!message_decoder_.GetNextMessage(&buffer)) |
+ break; |
+ |
+ message_received_callback_->Run(&buffer); |
} |
} |