diff options
author | jeremya@chromium.org <jeremya@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-11 04:17:17 +0000 |
---|---|---|
committer | jeremya@chromium.org <jeremya@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-11 04:17:17 +0000 |
commit | 3cfcda39679d94a12a7494dd4a73dc32c37dfce8 (patch) | |
tree | 5bd4ea646b094f481d183552bc3b924dd5b3a8ba /ipc/ipc_channel_factory.h | |
parent | 8e97f014e47198ff1475bc5e9c57e4280a8bc18c (diff) | |
download | chromium_src-3cfcda39679d94a12a7494dd4a73dc32c37dfce8.zip chromium_src-3cfcda39679d94a12a7494dd4a73dc32c37dfce8.tar.gz chromium_src-3cfcda39679d94a12a7494dd4a73dc32c37dfce8.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.
Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=186912
Review URL: https://chromiumcodereview.appspot.com/12386010
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@187233 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_ |