blob: 84f646df14d7cab87cca733c930176c172931398 [file] [log] [blame]
// Copyright (c) 2012 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 TOOLS_ANDROID_FORWARDER2_DAEMON_H_
#define TOOLS_ANDROID_FORWARDER2_DAEMON_H_
#include <string>
#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
namespace forwarder2 {
class Socket;
// Provides a way to spawn a daemon and communicate with it.
class Daemon {
public:
// Callback used by the daemon to shutdown properly. See pipe_notifier.h for
// more details.
typedef int (*GetExitNotifierFDCallback)();
class ClientDelegate {
public:
virtual ~ClientDelegate() {}
// Called after the daemon is ready to receive commands.
virtual void OnDaemonReady(Socket* daemon_socket) = 0;
};
class ServerDelegate {
public:
virtual ~ServerDelegate() {}
// Called after the daemon bound its Unix Domain Socket. This can be used to
// setup signal handlers or perform global initialization.
virtual void Init() = 0;
virtual void OnClientConnected(scoped_ptr<Socket> client_socket) = 0;
virtual void OnServerExited() = 0;
};
// |pid_file_path| is the file path to which the daemon's PID will be written.
// |identifier| should be a unique string identifier. It is used to
// bind/connect the underlying Unix Domain Socket.
// Note that this class does not take ownership of |client_delegate| and
// |server_delegate|.
Daemon(const std::string& log_file_path,
const std::string& pid_file_path,
const std::string& identifier,
ClientDelegate* client_delegate,
ServerDelegate* server_delegate,
GetExitNotifierFDCallback get_exit_fd_callback);
~Daemon();
// Returns whether the daemon was successfully spawned. Note that this does
// not necessarily mean that the current process was forked in case the daemon
// is already running.
bool SpawnIfNeeded();
// Kills the daemon and blocks until it exited. Returns whether it succeeded.
bool Kill();
private:
class PIDFile;
const std::string log_file_path_;
const std::string pid_file_path_;
const std::string identifier_;
ClientDelegate* const client_delegate_;
ServerDelegate* const server_delegate_;
const GetExitNotifierFDCallback get_exit_fd_callback_;
scoped_ptr<PIDFile> pid_file_;
DISALLOW_COPY_AND_ASSIGN(Daemon);
};
} // namespace forwarder2
#endif // TOOLS_ANDROID_FORWARDER2_DAEMON_H_