diff options
author | jeremya@chromium.org <jeremya@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-13 04:23:10 +0000 |
---|---|---|
committer | jeremya@chromium.org <jeremya@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-13 04:23:10 +0000 |
commit | bdf9bdc258df1e56f7ac7e3de705b0a70e9f93e4 (patch) | |
tree | 50c5cfdf9fad5caad2424485f3e30841ee860378 /ipc/ipc_channel_factory.h | |
parent | 989ae864ea9b25f772d4a6a648a48b48232bea28 (diff) | |
download | chromium_src-bdf9bdc258df1e56f7ac7e3de705b0a70e9f93e4.zip chromium_src-bdf9bdc258df1e56f7ac7e3de705b0a70e9f93e4.tar.gz chromium_src-bdf9bdc258df1e56f7ac7e3de705b0a70e9f93e4.tar.bz2 |
Implement IPC::ChannelFactory, a class that accept()s on a UNIX socket.
IPC::ChannelFactory listens on a UNIX domain socket and notifies its delegate
when a client connects. The delegate is expected to craft an IPC::Channel from
the handle it is given.
Previously committed:
- https://src.chromium.org/viewvc/chrome?view=rev&revision=186912
- https://src.chromium.org/viewvc/chrome?view=rev&revision=187233
- https://src.chromium.org/viewvc/chrome?view=rev&revision=187554
Review URL: https://codereview.chromium.org/12386010
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@187772 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ipc/ipc_channel_factory.h')
-rw-r--r-- | ipc/ipc_channel_factory.h | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/ipc/ipc_channel_factory.h b/ipc/ipc_channel_factory.h new file mode 100644 index 0000000..a1e1d85 --- /dev/null +++ b/ipc/ipc_channel_factory.h @@ -0,0 +1,57 @@ +// Copyright 2013 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_FACTORY_H_ +#define IPC_IPC_CHANNEL_FACTORY_H_ + +#include "base/files/file_path.h" +#include "base/message_loop.h" +#include "ipc/ipc_channel_handle.h" +#include "ipc/ipc_export.h" + +namespace IPC { + +// A ChannelFactory listens on a UNIX domain socket. When a client connects to +// the socket, it accept()s the connection and passes the new FD to the +// delegate. The delegate is then responsible for creating a new IPC::Channel +// for the FD. +class IPC_EXPORT ChannelFactory : public MessageLoopForIO::Watcher { + public: + class Delegate { + public: + // Called when a client connects to the factory. It is the delegate's + // responsibility to create an IPC::Channel for the handle, or else close + // the file descriptor contained therein. + virtual void OnClientConnected(const ChannelHandle& handle) = 0; + + // Called when an error occurs and the channel is closed. + virtual void OnListenError() = 0; + }; + + ChannelFactory(const base::FilePath& path, Delegate* delegate); + + virtual ~ChannelFactory(); + + // Call this to start listening on the socket. + bool Listen(); + + // Close and unlink the socket, and stop accepting connections. + void Close(); + + private: + bool CreateSocket(); + virtual void OnFileCanReadWithoutBlocking(int fd) OVERRIDE; + virtual void OnFileCanWriteWithoutBlocking(int fd) OVERRIDE; + + MessageLoopForIO::FileDescriptorWatcher server_listen_connection_watcher_; + base::FilePath path_; + Delegate* delegate_; + int listen_fd_; + + DISALLOW_COPY_AND_ASSIGN(ChannelFactory); +}; + +} // namespace IPC + +#endif // IPC_IPC_CHANNEL_FACTORY_H_ |