#ifndef TOOLS_ANDROID_FORWARDER2_DEVICE_CONTROLLER_H_
#define TOOLS_ANDROID_FORWARDER2_DEVICE_CONTROLLER_H_
#include <memory>
#include <string>
#include <unordered_map>
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "tools/android/forwarder2/socket.h"
namespace base {
class SingleThreadTaskRunner;
}
namespace forwarder2 {
class DeviceListener;
class DeviceController {
public:
static std::unique_ptr<DeviceController> Create(
const std::string& adb_unix_socket,
int exit_notifier_fd);
DeviceController(const DeviceController&) = delete;
DeviceController& operator=(const DeviceController&) = delete;
~DeviceController();
void Start();
private:
DeviceController(std::unique_ptr<Socket> host_socket, int exit_notifier_fd);
void AcceptHostCommandSoon();
void AcceptHostCommandInternal();
static void DeleteListenerOnError(
const base::WeakPtr<DeviceController>& device_controller_ptr,
std::unique_ptr<DeviceListener> device_listener);
const std::unique_ptr<Socket> host_socket_;
const int exit_notifier_fd_;
const scoped_refptr<base::SingleThreadTaskRunner> construction_task_runner_;
std::unordered_map<int , std::unique_ptr<DeviceListener>>
listeners_;
base::WeakPtrFactory<DeviceController> weak_ptr_factory_{this};
};
}
#endif