Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(188)

Unified Diff: ipc/ipc_channel_win.cc

Issue 9547009: Factor out the shared parts of IPC channel reading. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ipc/ipc_channel_win.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ipc/ipc_channel_win.cc
diff --git a/ipc/ipc_channel_win.cc b/ipc/ipc_channel_win.cc
index b2a3421e7bb92b7eb55e21263d13ff5163051693..ef974ee8182c1dd832ddb905f19bf0be93288361 100644
--- a/ipc/ipc_channel_win.cc
+++ b/ipc/ipc_channel_win.cc
@@ -30,10 +30,10 @@ Channel::ChannelImpl::State::~State() {
Channel::ChannelImpl::ChannelImpl(const IPC::ChannelHandle &channel_handle,
Mode mode, Listener* listener)
- : ALLOW_THIS_IN_INITIALIZER_LIST(input_state_(this)),
+ : ChannelReader(listener),
+ ALLOW_THIS_IN_INITIALIZER_LIST(input_state_(this)),
ALLOW_THIS_IN_INITIALIZER_LIST(output_state_(this)),
pipe_(INVALID_HANDLE_VALUE),
- listener_(listener),
waiting_connect_(mode & MODE_SERVER_FLAG),
processing_incoming_(false),
ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) {
@@ -113,7 +113,7 @@ Channel::ChannelImpl::ReadState Channel::ChannelImpl::ReadData(
return READ_FAILED;
DWORD bytes_read = 0;
- BOOL ok = ReadFile(pipe_, input_buf_, Channel::kReadBufferSize,
+ BOOL ok = ReadFile(pipe_, buffer, buffer_len,
&bytes_read, &input_state_.context.overlapped);
if (!ok) {
DWORD err = GetLastError();
@@ -138,75 +138,20 @@ Channel::ChannelImpl::ReadState Channel::ChannelImpl::ReadData(
}
bool Channel::ChannelImpl::WillDispatchInputMessage(Message* msg) {
+ // We don't need to do anything here.
return true;
}
void Channel::ChannelImpl::HandleHelloMessage(const Message& msg) {
// The hello message contains one parameter containing the PID.
- listener_->OnChannelConnected(MessageIterator(msg).NextInt());
+ listener()->OnChannelConnected(MessageIterator(msg).NextInt());
}
bool Channel::ChannelImpl::DidEmptyInputBuffers() {
+ // We don't need to do anything here.
return true;
}
-bool Channel::ChannelImpl::DispatchInputData(const char* input_data,
- int input_data_len) {
- const char* p;
- const char* end;
-
- // Possibly combine with the overflow buffer to make a larger buffer.
- if (input_overflow_buf_.empty()) {
- p = input_data;
- end = input_data + input_data_len;
- } else {
- if (input_overflow_buf_.size() >
- kMaximumMessageSize - input_data_len) {
- input_overflow_buf_.clear();
- LOG(ERROR) << "IPC message is too big";
- return false;
- }
- input_overflow_buf_.append(input_data, input_data_len);
- p = input_overflow_buf_.data();
- end = p + input_overflow_buf_.size();
- }
-
- // Dispatch all complete messages in the data buffer.
- while (p < end) {
- const char* message_tail = Message::FindNext(p, end);
- if (message_tail) {
- int len = static_cast<int>(message_tail - p);
- Message m(p, len);
- if (!WillDispatchInputMessage(&m))
- return false;
-
- if (IsHelloMessage(m))
- HandleHelloMessage(m);
- else
- listener_->OnMessageReceived(m);
- p = message_tail;
- } else {
- // Last message is partial.
- break;
- }
- }
-
- // Save any partial data in the overflow buffer.
- input_overflow_buf_.assign(p, end - p);
-
- if (input_overflow_buf_.empty() && !DidEmptyInputBuffers())
- return false;
- return true;
-}
-
-bool Channel::ChannelImpl::IsHelloMessage(const Message& m) const {
- return m.routing_id() == MSG_ROUTING_NONE && m.type() == HELLO_MESSAGE_TYPE;
-}
-
-bool Channel::ChannelImpl::AsyncReadComplete(int bytes_read) {
- return DispatchInputData(input_buf_, bytes_read);
-}
-
// static
const std::wstring Channel::ChannelImpl::PipeName(
const std::string& channel_id) {
@@ -360,21 +305,6 @@ bool Channel::ChannelImpl::ProcessConnection() {
return true;
}
-bool Channel::ChannelImpl::ProcessIncomingMessages() {
- while (true) {
- int bytes_read = 0;
- ReadState read_state = ReadData(input_buf_, Channel::kReadBufferSize,
- &bytes_read);
- if (read_state == READ_FAILED)
- return false;
- if (read_state == READ_PENDING)
- return true;
- DCHECK(bytes_read > 0);
- if (!DispatchInputData(input_buf_, bytes_read))
- return false;
- }
-}
-
bool Channel::ChannelImpl::ProcessOutgoingMessages(
MessageLoopForIO::IOContext* context,
DWORD bytes_written) {
@@ -475,7 +405,7 @@ void Channel::ChannelImpl::OnIOCompleted(MessageLoopForIO::IOContext* context,
if (!ok && INVALID_HANDLE_VALUE != pipe_) {
// We don't want to re-enter Close().
Close();
- listener_->OnChannelError();
+ listener()->OnChannelError();
}
}
« no previous file with comments | « ipc/ipc_channel_win.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698