Index: ipc/ipc_channel_win.h |
diff --git a/ipc/ipc_channel_win.h b/ipc/ipc_channel_win.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7610d02f42005b5374a562c7625a5b254580b1eb |
--- /dev/null |
+++ b/ipc/ipc_channel_win.h |
@@ -0,0 +1,85 @@ |
+// Copyright (c) 2008 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef IPC_IPC_CHANNEL_WIN_H_ |
+#define IPC_IPC_CHANNEL_WIN_H_ |
+ |
+#include "ipc/ipc_channel.h" |
+ |
+#include <queue> |
+#include <string> |
+ |
+#include "base/message_loop.h" |
+ |
+class NonThreadSafe; |
+ |
+namespace IPC { |
+ |
+class Channel::ChannelImpl : public MessageLoopForIO::IOHandler { |
+ public: |
+ // Mirror methods of Channel, see ipc_channel.h for description. |
+ ChannelImpl(const std::string& channel_id, Mode mode, Listener* listener); |
+ ~ChannelImpl() { Close(); } |
+ bool Connect(); |
+ void Close(); |
+ void set_listener(Listener* listener) { listener_ = listener; } |
+ bool Send(Message* message); |
+ private: |
+ const std::wstring PipeName(const std::string& channel_id) const; |
+ bool CreatePipe(const std::string& channel_id, Mode mode); |
+ |
+ bool ProcessConnection(); |
+ bool ProcessIncomingMessages(MessageLoopForIO::IOContext* context, |
+ DWORD bytes_read); |
+ bool ProcessOutgoingMessages(MessageLoopForIO::IOContext* context, |
+ DWORD bytes_written); |
+ |
+ // MessageLoop::IOHandler implementation. |
+ virtual void OnIOCompleted(MessageLoopForIO::IOContext* context, |
+ DWORD bytes_transfered, DWORD error); |
+ private: |
+ struct State { |
+ explicit State(ChannelImpl* channel); |
+ ~State(); |
+ MessageLoopForIO::IOContext context; |
+ bool is_pending; |
+ }; |
+ |
+ State input_state_; |
+ State output_state_; |
+ |
+ HANDLE pipe_; |
+ |
+ Listener* listener_; |
+ |
+ // Messages to be sent are queued here. |
+ std::queue<Message*> output_queue_; |
+ |
+ // We read from the pipe into this buffer |
+ char input_buf_[Channel::kReadBufferSize]; |
+ |
+ // Large messages that span multiple pipe buffers, get built-up using |
+ // this buffer. |
+ std::string input_overflow_buf_; |
+ |
+ // In server-mode, we have to wait for the client to connect before we |
+ // can begin reading. We make use of the input_state_ when performing |
+ // the connect operation in overlapped mode. |
+ bool waiting_connect_; |
+ |
+ // This flag is set when processing incoming messages. It is used to |
+ // avoid recursing through ProcessIncomingMessages, which could cause |
+ // problems. TODO(darin): make this unnecessary |
+ bool processing_incoming_; |
+ |
+ ScopedRunnableMethodFactory<ChannelImpl> factory_; |
+ |
+ scoped_ptr<NonThreadSafe> thread_check_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ChannelImpl); |
+}; |
+ |
+} // namespace IPC |
+ |
+#endif // IPC_IPC_CHANNEL_WIN_H_ |