blob: 674489a4a42edcb6d52e7f995973814441e13e06 [file] [log] [blame]
// Copyright (c) 2013 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 CHROME_BROWSER_DEVTOOLS_TETHERING_ADB_FILTER_H_
#define CHROME_BROWSER_DEVTOOLS_TETHERING_ADB_FILTER_H_
#include <map>
#include <string>
#include "base/basictypes.h"
#include "base/memory/ref_counted.h"
#include "base/prefs/pref_change_registrar.h"
#include "chrome/browser/devtools/adb_web_socket.h"
#include "chrome/browser/devtools/devtools_adb_bridge.h"
class PrefService;
namespace base {
class MessageLoop;
}
class TetheringAdbFilter : public base::RefCountedThreadSafe<
TetheringAdbFilter,
content::BrowserThread::DeleteOnUIThread> {
public:
typedef DevToolsAdbBridge::RemoteDevice::PortStatus PortStatus;
typedef DevToolsAdbBridge::RemoteDevice::PortStatusMap PortStatusMap;
TetheringAdbFilter(scoped_refptr<DevToolsAdbBridge::AndroidDevice> device,
base::MessageLoop* adb_message_loop,
PrefService* pref_service,
scoped_refptr<AdbWebSocket> web_socket);
const PortStatusMap& GetPortStatusMap();
bool ProcessIncomingMessage(const std::string& message);
private:
friend struct content::BrowserThread::DeleteOnThread<
content::BrowserThread::UI>;
friend class base::DeleteHelper<TetheringAdbFilter>;
virtual ~TetheringAdbFilter();
typedef std::map<int, std::string> ForwardingMap;
typedef base::Callback<void(PortStatus)> CommandCallback;
typedef std::map<int, CommandCallback> CommandCallbackMap;
void OnPrefsChange();
void ChangeForwardingMap(ForwardingMap map);
void SerializeChanges(const std::string& method,
const ForwardingMap& old_map,
const ForwardingMap& new_map);
void SendCommand(const std::string& method, int port);
bool ProcessResponse(const std::string& json);
void ProcessBindResponse(int port, PortStatus status);
void ProcessUnbindResponse(int port, PortStatus status);
void UpdateSocketCount(int port, int increment);
void UpdatePortStatusMap();
void UpdatePortStatusMapOnUIThread(const PortStatusMap& status_map);
scoped_refptr<DevToolsAdbBridge::AndroidDevice> device_;
base::MessageLoop* adb_message_loop_;
PrefChangeRegistrar pref_change_registrar_;
scoped_refptr<AdbWebSocket> web_socket_;
int command_id_;
ForwardingMap forwarding_map_;
CommandCallbackMap pending_responses_;
PortStatusMap port_status_;
PortStatusMap port_status_on_ui_thread_;
DISALLOW_COPY_AND_ASSIGN(TetheringAdbFilter);
};
class PortForwardingController {
public:
PortForwardingController(
base::MessageLoop* adb_message_loop,
PrefService* pref_service);
virtual ~PortForwardingController();
void UpdateDeviceList(const DevToolsAdbBridge::RemoteDevices& devices);
private:
class Connection;
typedef std::map<std::string, Connection*> Registry;
base::MessageLoop* adb_message_loop_;
PrefService* pref_service_;
Registry registry_;
};
#endif // CHROME_BROWSER_DEVTOOLS_TETHERING_ADB_FILTER_H_