blob: b1441d81a789c18fba3dc22f8a0224859c63f571 [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_DEVICE_CONTROLLER_H_
#define TOOLS_ANDROID_FORWARDER2_DEVICE_CONTROLLER_H_
#include <string>
#include "base/basictypes.h"
#include "base/containers/hash_tables.h"
#include "base/memory/linked_ptr.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "tools/android/forwarder2/socket.h"
namespace base {
class SingleThreadTaskRunner;
} // namespace base
namespace forwarder2 {
class DeviceListener;
// There is a single DeviceController per device_forwarder process, and it is in
// charge of managing all active redirections on the device side (one
// DeviceListener each).
class DeviceController {
public:
static scoped_ptr<DeviceController> Create(const std::string& adb_unix_socket,
int exit_notifier_fd);
~DeviceController();
void Start();
private:
typedef base::hash_map<
int /* port */, linked_ptr<DeviceListener> > ListenersMap;
DeviceController(scoped_ptr<Socket> host_socket, int exit_notifier_fd);
void AcceptHostCommandSoon();
void AcceptHostCommandInternal();
// Note that this can end up being called after the DeviceController is
// destroyed which is why a weak pointer is used.
static void DeleteListenerOnError(
const base::WeakPtr<DeviceController>& device_controller_ptr,
scoped_ptr<DeviceListener> device_listener);
base::WeakPtrFactory<DeviceController> weak_ptr_factory_;
const scoped_ptr<Socket> host_socket_;
// Used to notify the controller to exit.
const int exit_notifier_fd_;
// Lets ensure DeviceListener instances are deleted on the thread they were
// created on.
const scoped_refptr<base::SingleThreadTaskRunner> construction_task_runner_;
ListenersMap listeners_;
DISALLOW_COPY_AND_ASSIGN(DeviceController);
};
} // namespace forwarder
#endif // TOOLS_ANDROID_FORWARDER2_DEVICE_CONTROLLER_H_