15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file. 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef CHROME_BROWSER_APPS_APP_SHIM_UNIX_DOMAIN_SOCKET_ACCEPTOR_H_ 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define CHROME_BROWSER_APPS_APP_SHIM_UNIX_DOMAIN_SOCKET_ACCEPTOR_H_ 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/files/file_path.h" 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/message_loop/message_loop.h" 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ipc/ipc_channel_handle.h" 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace apps { 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// A UnixDomainSocketAcceptor listens on a UNIX domain socket. When a 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// client connects to the socket, it accept()s the connection and 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// passes the new FD to the delegate. The delegate is then responsible 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// for creating a new IPC::Channel for the FD. 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class UnixDomainSocketAcceptor : public base::MessageLoopForIO::Watcher { 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public: 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) class Delegate { 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public: 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Called when a client connects to the factory. It is the delegate's 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // responsibility to create an IPC::Channel for the handle, or else close 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // the file descriptor contained therein. 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void OnClientConnected(const IPC::ChannelHandle& handle) = 0; 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Called when an error occurs and the channel is closed. 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void OnListenError() = 0; 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) }; 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) UnixDomainSocketAcceptor(const base::FilePath& path, Delegate* delegate); 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual ~UnixDomainSocketAcceptor(); 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Call this to start listening on the socket. 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool Listen(); 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Close and unlink the socket, and stop accepting connections. 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void Close(); 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private: 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool CreateSocket(); 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void OnFileCanReadWithoutBlocking(int fd) OVERRIDE; 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void OnFileCanWriteWithoutBlocking(int fd) OVERRIDE; 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::MessageLoopForIO::FileDescriptorWatcher 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) server_listen_connection_watcher_; 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath path_; 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Delegate* delegate_; 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int listen_fd_; 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(UnixDomainSocketAcceptor); 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace apps 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // CHROME_BROWSER_APPS_APP_SHIM_UNIX_DOMAIN_SOCKET_ACCEPTOR_H_ 58