OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "remoting/protocol/message_reader.h" | 5 #include "remoting/protocol/message_reader.h" |
6 | 6 |
7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
8 #include "net/base/io_buffer.h" | 8 #include "net/base/io_buffer.h" |
9 #include "net/base/net_errors.h" | 9 #include "net/base/net_errors.h" |
10 #include "net/socket/socket.h" | 10 #include "net/socket/socket.h" |
11 #include "remoting/base/compound_buffer.h" | 11 #include "remoting/base/compound_buffer.h" |
12 #include "remoting/proto/internal.pb.h" | 12 #include "remoting/proto/internal.pb.h" |
13 | 13 |
14 namespace remoting { | 14 namespace remoting { |
15 namespace protocol { | 15 namespace protocol { |
16 | 16 |
17 static const int kReadBufferSize = 4096; | 17 static const int kReadBufferSize = 4096; |
18 | 18 |
19 MessageReader::MessageReader() | 19 MessageReader::MessageReader() |
20 : socket_(NULL), | 20 : socket_(NULL), |
21 closed_(false), | 21 closed_(false), |
22 ALLOW_THIS_IN_INITIALIZER_LIST( | 22 ALLOW_THIS_IN_INITIALIZER_LIST( |
23 read_callback_(this, &MessageReader::OnRead)) { | 23 read_callback_(this, &MessageReader::OnRead)) { |
24 } | 24 } |
25 | 25 |
26 MessageReader::~MessageReader() { | 26 MessageReader::~MessageReader() { |
27 // Destroy MessageReaderPrivate if it was created. | |
28 if (destruction_callback_.get()) | |
29 destruction_callback_->Run(); | |
30 } | 27 } |
31 | 28 |
32 void MessageReader::Close() { | 29 void MessageReader::Init(net::Socket* socket, |
33 closed_ = true; | 30 MessageReceivedCallback* callback) { |
34 } | 31 message_received_callback_.reset(callback); |
35 | |
36 void MessageReader::Init(net::Socket* socket) { | |
37 DCHECK(socket); | 32 DCHECK(socket); |
38 socket_ = socket; | 33 socket_ = socket; |
39 DoRead(); | 34 DoRead(); |
40 } | 35 } |
41 | 36 |
42 void MessageReader::DoRead() { | 37 void MessageReader::DoRead() { |
43 while (true) { | 38 while (!closed_) { |
44 read_buffer_ = new net::IOBuffer(kReadBufferSize); | 39 read_buffer_ = new net::IOBuffer(kReadBufferSize); |
45 int result = socket_->Read( | 40 int result = socket_->Read( |
46 read_buffer_, kReadBufferSize, &read_callback_); | 41 read_buffer_, kReadBufferSize, &read_callback_); |
47 HandleReadResult(result); | 42 HandleReadResult(result); |
48 if (result < 0) | 43 if (result < 0) |
49 break; | 44 break; |
50 } | 45 } |
51 } | 46 } |
52 | 47 |
53 void MessageReader::OnRead(int result) { | 48 void MessageReader::OnRead(int result) { |
54 if (!closed_) { | 49 if (!closed_) { |
55 HandleReadResult(result); | 50 HandleReadResult(result); |
56 DoRead(); | 51 DoRead(); |
57 } | 52 } |
58 } | 53 } |
59 | 54 |
60 void MessageReader::HandleReadResult(int result) { | 55 void MessageReader::HandleReadResult(int result) { |
61 if (result > 0) { | 56 if (result > 0) { |
62 data_received_callback_->Run(read_buffer_, result); | 57 OnDataReceived(read_buffer_, result); |
63 } else { | 58 } else { |
64 if (result != net::ERR_IO_PENDING) | 59 if (result == net::ERR_CONNECTION_CLOSED) { |
| 60 closed_ = true; |
| 61 } else if (result != net::ERR_IO_PENDING) { |
65 LOG(ERROR) << "Read() returned error " << result; | 62 LOG(ERROR) << "Read() returned error " << result; |
| 63 } |
66 } | 64 } |
67 } | 65 } |
68 | 66 |
| 67 void MessageReader::OnDataReceived(net::IOBuffer* data, int data_size) { |
| 68 message_decoder_.AddData(data, data_size); |
| 69 |
| 70 while (true) { |
| 71 CompoundBuffer buffer; |
| 72 if (!message_decoder_.GetNextMessage(&buffer)) |
| 73 break; |
| 74 |
| 75 message_received_callback_->Run(&buffer); |
| 76 } |
| 77 } |
| 78 |
69 } // namespace protocol | 79 } // namespace protocol |
70 } // namespace remoting | 80 } // namespace remoting |
OLD | NEW |