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