DevTools: Partially redesigned DevToolsAndroidBridge and AndroidDeviceManager.

Review URL: https://codereview.chromium.org/287643002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@274211 0039d316-1c4b-4281-b951-d872f2087c98
parent d9250e7f
...@@ -34,6 +34,7 @@ class AdbClientSocketTest : public InProcessBrowserTest, ...@@ -34,6 +34,7 @@ class AdbClientSocketTest : public InProcessBrowserTest,
device_providers.push_back(new AdbDeviceProvider()); device_providers.push_back(new AdbDeviceProvider());
android_bridge_->set_device_providers_for_test(device_providers); android_bridge_->set_device_providers_for_test(device_providers);
android_bridge_->AddDeviceListListener(this); android_bridge_->AddDeviceListListener(this);
content::RunMessageLoop();
} }
virtual void DeviceListChanged( virtual void DeviceListChanged(
...@@ -125,7 +126,6 @@ class AdbClientSocketTest : public InProcessBrowserTest, ...@@ -125,7 +126,6 @@ class AdbClientSocketTest : public InProcessBrowserTest,
IN_PROC_BROWSER_TEST_F(AdbClientSocketTest, TestAdbClientSocket) { IN_PROC_BROWSER_TEST_F(AdbClientSocketTest, TestAdbClientSocket) {
StartMockAdbServer(); StartMockAdbServer();
StartTest(); StartTest();
content::RunMessageLoop();
CheckDevices(); CheckDevices();
StopMockAdbServer(); StopMockAdbServer();
} }
...@@ -209,6 +209,7 @@ void AdbDeviceInfoQuery::ReceivedModel(int result, ...@@ -209,6 +209,7 @@ void AdbDeviceInfoQuery::ReceivedModel(int result,
return; return;
} }
device_info_.model = response; device_info_.model = response;
device_info_.connected = true;
command_callback_.Run( command_callback_.Run(
kDumpsysCommand, kDumpsysCommand,
base::Bind(&AdbDeviceInfoQuery::ReceivedDumpsys, base::Unretained(this))); base::Bind(&AdbDeviceInfoQuery::ReceivedDumpsys, base::Unretained(this)));
......
...@@ -17,68 +17,48 @@ const char kLocalAbstractCommand[] = "localabstract:%s"; ...@@ -17,68 +17,48 @@ const char kLocalAbstractCommand[] = "localabstract:%s";
const int kAdbPort = 5037; const int kAdbPort = 5037;
class AdbDeviceImpl : public AndroidDeviceManager::Device { static void RunCommand(const std::string& serial,
public: const std::string& command,
AdbDeviceImpl(const std::string& serial, bool is_connected); const AdbDeviceProvider::CommandCallback& callback) {
virtual void QueryDeviceInfo(const DeviceInfoCallback& callback) OVERRIDE; std::string query = base::StringPrintf(
kHostTransportCommand, serial.c_str(), command.c_str());
virtual void OpenSocket(const std::string& name,
const SocketCallback& callback) OVERRIDE;
private:
virtual ~AdbDeviceImpl() {}
void RunCommand(const std::string& command,
const CommandCallback& callback);
};
AdbDeviceImpl::AdbDeviceImpl(const std::string& serial, bool is_connected)
: Device(serial, is_connected) {
}
void AdbDeviceImpl::QueryDeviceInfo(const DeviceInfoCallback& callback) {
AdbDeviceInfoQuery::Start(
base::Bind(&AdbDeviceImpl::RunCommand, this), callback);
}
void AdbDeviceImpl::OpenSocket(const std::string& name,
const SocketCallback& callback) {
DCHECK(CalledOnValidThread());
std::string socket_name =
base::StringPrintf(kLocalAbstractCommand, name.c_str());
AdbClientSocket::TransportQuery(kAdbPort, serial(), socket_name, callback);
}
void AdbDeviceImpl::RunCommand(const std::string& command,
const CommandCallback& callback) {
DCHECK(CalledOnValidThread());
std::string query = base::StringPrintf(kHostTransportCommand,
serial().c_str(), command.c_str());
AdbClientSocket::AdbQuery(kAdbPort, query, callback); AdbClientSocket::AdbQuery(kAdbPort, query, callback);
} }
// static static void ReceivedAdbDevices(
void ReceivedAdbDevices( const AdbDeviceProvider::SerialsCallback& callback,
const AdbDeviceProvider::QueryDevicesCallback& callback,
int result_code, int result_code,
const std::string& response) { const std::string& response) {
AndroidDeviceManager::Devices result; std::vector<std::string> result;
std::vector<std::string> serials; std::vector<std::string> serials;
Tokenize(response, "\n", &serials); Tokenize(response, "\n", &serials);
for (size_t i = 0; i < serials.size(); ++i) { for (size_t i = 0; i < serials.size(); ++i) {
std::vector<std::string> tokens; std::vector<std::string> tokens;
Tokenize(serials[i], "\t ", &tokens); Tokenize(serials[i], "\t ", &tokens);
bool offline = tokens.size() > 1 && tokens[1] == "offline"; result.push_back(tokens[0]);
result.push_back(new AdbDeviceImpl(tokens[0], !offline));
} }
callback.Run(result); callback.Run(result);
} }
} // namespace } // namespace
AdbDeviceProvider::~AdbDeviceProvider() { void AdbDeviceProvider::QueryDevices(const SerialsCallback& callback) {
}
void AdbDeviceProvider::QueryDevices(const QueryDevicesCallback& callback) {
AdbClientSocket::AdbQuery( AdbClientSocket::AdbQuery(
kAdbPort, kHostDevicesCommand, base::Bind(&ReceivedAdbDevices, callback)); kAdbPort, kHostDevicesCommand, base::Bind(&ReceivedAdbDevices, callback));
} }
void AdbDeviceProvider::QueryDeviceInfo(const std::string& serial,
const DeviceInfoCallback& callback) {
AdbDeviceInfoQuery::Start(base::Bind(&RunCommand, serial), callback);
}
void AdbDeviceProvider::OpenSocket(const std::string& serial,
const std::string& socket_name,
const SocketCallback& callback) {
std::string request =
base::StringPrintf(kLocalAbstractCommand, socket_name.c_str());
AdbClientSocket::TransportQuery(kAdbPort, serial, request, callback);
}
AdbDeviceProvider::~AdbDeviceProvider() {
}
...@@ -9,9 +9,14 @@ ...@@ -9,9 +9,14 @@
class AdbDeviceProvider : public AndroidDeviceManager::DeviceProvider { class AdbDeviceProvider : public AndroidDeviceManager::DeviceProvider {
public: public:
typedef DeviceProvider::QueryDevicesCallback QueryDevicesCallback; virtual void QueryDevices(const SerialsCallback& callback) OVERRIDE;
virtual void QueryDevices(const QueryDevicesCallback& callback) OVERRIDE; virtual void QueryDeviceInfo(const std::string& serial,
const DeviceInfoCallback& callback) OVERRIDE;
virtual void OpenSocket(const std::string& serial,
const std::string& socket_name,
const SocketCallback& callback) OVERRIDE;
private: private:
virtual ~AdbDeviceProvider(); virtual ~AdbDeviceProvider();
......
...@@ -463,7 +463,7 @@ class MockAdbServer : SingleConnectionServer::Parser, ...@@ -463,7 +463,7 @@ class MockAdbServer : SingleConnectionServer::Parser,
selected_device_ = command.substr(strlen(kHostTransportPrefix)); selected_device_ = command.substr(strlen(kHostTransportPrefix));
SendResponse(""); SendResponse("");
} else if (selected_device_ != kSerialOnline) { } else if (selected_device_ != kSerialOnline) {
NOTREACHED() << "Unknown device - " << selected_device_; Send("FAIL", "device offline (x)");
} else if (command == kDeviceModelCommand) { } else if (command == kDeviceModelCommand) {
SendResponse(kDeviceModel); SendResponse(kDeviceModel);
} else if (command == kOpenedUnixSocketsCommand) { } else if (command == kOpenedUnixSocketsCommand) {
...@@ -480,10 +480,14 @@ class MockAdbServer : SingleConnectionServer::Parser, ...@@ -480,10 +480,14 @@ class MockAdbServer : SingleConnectionServer::Parser,
} }
} }
void SendResponse(const std::string& response) { void SendResponse(const std::string& response) { Send("OKAY", response); }
void Send(const std::string& status, const std::string& response) {
CHECK(CalledOnValidThread()); CHECK(CalledOnValidThread());
CHECK_EQ(4U, status.size());
std::stringstream response_stream; std::stringstream response_stream;
response_stream << "OKAY"; response_stream << status;
int size = response.size(); int size = response.size();
if (size > 0) { if (size > 0) {
......
...@@ -23,6 +23,7 @@ class AndroidDeviceManager ...@@ -23,6 +23,7 @@ class AndroidDeviceManager
public: public:
typedef base::Callback<void(int, const std::string&)> CommandCallback; typedef base::Callback<void(int, const std::string&)> CommandCallback;
typedef base::Callback<void(int result, net::StreamSocket*)> SocketCallback; typedef base::Callback<void(int result, net::StreamSocket*)> SocketCallback;
typedef base::Callback<void(const std::vector<std::string>&)> SerialsCallback;
struct BrowserInfo { struct BrowserInfo {
BrowserInfo(); BrowserInfo();
...@@ -43,117 +44,170 @@ class AndroidDeviceManager ...@@ -43,117 +44,170 @@ class AndroidDeviceManager
~DeviceInfo(); ~DeviceInfo();
std::string model; std::string model;
bool connected;
gfx::Size screen_size; gfx::Size screen_size;
std::vector<BrowserInfo> browser_info; std::vector<BrowserInfo> browser_info;
}; };
typedef base::Callback<void(const DeviceInfo&)> DeviceInfoCallback; typedef base::Callback<void(const DeviceInfo&)> DeviceInfoCallback;
class Device : public base::RefCounted<Device>, class AndroidWebSocket : public base::RefCountedThreadSafe<AndroidWebSocket> {
public base::NonThreadSafe { public:
class Delegate {
public:
virtual void OnSocketOpened() = 0;
virtual void OnFrameRead(const std::string& message) = 0;
virtual void OnSocketClosed(bool closed_by_device) = 0;
protected: protected:
friend class AndroidDeviceManager; virtual ~Delegate() {}
};
AndroidWebSocket() {}
virtual void Connect() = 0;
virtual void Disconnect() = 0;
virtual void SendFrame(const std::string& message) = 0;
virtual void ClearDelegate() = 0;
protected:
virtual ~AndroidWebSocket() {}
private:
friend class base::RefCountedThreadSafe<AndroidWebSocket>;
DISALLOW_COPY_AND_ASSIGN(AndroidWebSocket);
};
class DeviceProvider;
class Device : public base::RefCountedThreadSafe<Device>,
public base::NonThreadSafe {
public:
typedef AndroidDeviceManager::DeviceInfoCallback DeviceInfoCallback;
typedef AndroidDeviceManager::CommandCallback CommandCallback; typedef AndroidDeviceManager::CommandCallback CommandCallback;
typedef AndroidDeviceManager::SocketCallback SocketCallback; typedef AndroidDeviceManager::SocketCallback SocketCallback;
typedef AndroidDeviceManager::DeviceInfoCallback DeviceInfoCallback;
Device(const std::string& serial, bool is_connected);
virtual void QueryDeviceInfo(const DeviceInfoCallback& callback) = 0; void QueryDeviceInfo(const DeviceInfoCallback& callback);
virtual void OpenSocket(const std::string& socket_name, void OpenSocket(const std::string& socket_name,
const SocketCallback& callback) = 0; const SocketCallback& callback);
virtual void HttpQuery(const std::string& socket_name, void SendJsonRequest(const std::string& socket_name,
const std::string& request, const std::string& request,
const CommandCallback& callback); const CommandCallback& callback);
void HttpUpgrade(const std::string& socket_name,
const std::string& url,
const SocketCallback& callback);
scoped_refptr<AndroidWebSocket> CreateWebSocket(
const std::string& socket_name,
const std::string& url,
AndroidWebSocket::Delegate* delegate);
std::string serial() { return serial_; } std::string serial() { return serial_; }
bool is_connected() { return is_connected_; }
friend class base::RefCounted<Device>; private:
friend class AndroidDeviceManager;
Device(scoped_refptr<base::MessageLoopProxy> device_message_loop,
scoped_refptr<DeviceProvider> provider,
const std::string& serial);
friend class base::RefCountedThreadSafe<Device>;
virtual ~Device(); virtual ~Device();
private: scoped_refptr<base::MessageLoopProxy> device_message_loop_;
const std::string serial_; scoped_refptr<DeviceProvider> provider_;
const bool is_connected_; std::string serial_;
base::WeakPtrFactory<Device> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(Device); DISALLOW_COPY_AND_ASSIGN(Device);
}; };
typedef std::vector<scoped_refptr<Device> > Devices; typedef std::vector<scoped_refptr<Device> > Devices;
typedef base::Callback<void(const Devices&)> DevicesCallback;
class DeviceProvider class DeviceProvider : public base::RefCountedThreadSafe<DeviceProvider> {
: public base::RefCountedThreadSafe< public:
DeviceProvider, typedef AndroidDeviceManager::SerialsCallback SerialsCallback;
content::BrowserThread::DeleteOnUIThread> { typedef AndroidDeviceManager::DeviceInfoCallback DeviceInfoCallback;
protected: typedef AndroidDeviceManager::SocketCallback SocketCallback;
friend class AndroidDeviceManager; typedef AndroidDeviceManager::CommandCallback CommandCallback;
typedef base::Callback<void(const Devices&)> QueryDevicesCallback; virtual void QueryDevices(const SerialsCallback& callback) = 0;
virtual void QueryDevices(const QueryDevicesCallback& callback) = 0; virtual void QueryDeviceInfo(const std::string& serial,
const DeviceInfoCallback& callback) = 0;
protected: virtual void OpenSocket(const std::string& serial,
friend struct const std::string& socket_name,
content::BrowserThread::DeleteOnThread<content::BrowserThread::UI>; const SocketCallback& callback) = 0;
friend class base::DeleteHelper<DeviceProvider>;
virtual void SendJsonRequest(const std::string& serial,
const std::string& socket_name,
const std::string& request,
const CommandCallback& callback);
virtual void HttpUpgrade(const std::string& serial,
const std::string& socket_name,
const std::string& url,
const SocketCallback& callback);
virtual void ReleaseDevice(const std::string& serial);
protected:
friend class base::RefCountedThreadSafe<DeviceProvider>;
DeviceProvider(); DeviceProvider();
virtual ~DeviceProvider(); virtual ~DeviceProvider();
}; };
public:
static scoped_refptr<AndroidDeviceManager> Create();
typedef std::vector<scoped_refptr<DeviceProvider> > DeviceProviders; typedef std::vector<scoped_refptr<DeviceProvider> > DeviceProviders;
typedef base::Callback<void (const std::vector<std::string>&)>
QueryDevicesCallback;
void QueryDevices(const DeviceProviders& providers, static scoped_refptr<AndroidDeviceManager> Create();
const QueryDevicesCallback& callback);
void Stop(); void SetDeviceProviders(const DeviceProviders& providers);
bool IsConnected(const std::string& serial); void QueryDevices(const DevicesCallback& callback);
void QueryDeviceInfo(const std::string& serial, struct DeviceDescriptor {
const DeviceInfoCallback& callback); DeviceDescriptor();
~DeviceDescriptor();
void OpenSocket(const std::string& serial, scoped_refptr<DeviceProvider> provider;
const std::string& socket_name, std::string serial;
const SocketCallback& callback); };
void HttpQuery(const std::string& serial, typedef std::vector<DeviceDescriptor> DeviceDescriptors;
const std::string& socket_name,
const std::string& request,
const CommandCallback& callback);
void HttpUpgrade(const std::string& serial, private:
const std::string& socket_name, class HandlerThread : public base::RefCountedThreadSafe<HandlerThread> {
const std::string& url, public:
const SocketCallback& callback); static scoped_refptr<HandlerThread> GetInstance();
scoped_refptr<base::MessageLoopProxy> message_loop();
private: private:
AndroidDeviceManager(); friend class base::RefCountedThreadSafe<HandlerThread>;
static HandlerThread* instance_;
static void StopThread(base::Thread* thread);
friend class base::RefCountedThreadSafe<AndroidDeviceManager>; HandlerThread();
virtual ~HandlerThread();
base::Thread* thread_;
};
friend class base::RefCountedThreadSafe<AndroidDeviceManager>;
AndroidDeviceManager();
virtual ~AndroidDeviceManager(); virtual ~AndroidDeviceManager();
void QueryNextProvider( void UpdateDevices(const DevicesCallback& callback,
const QueryDevicesCallback& callback, DeviceDescriptors* descriptors);
const DeviceProviders& providers,
const Devices& total_devices,
const Devices& new_devices);
Device* FindDevice(const std::string& serial);
typedef std::map<std::string, scoped_refptr<Device> > DeviceMap; typedef std::map<std::string, base::WeakPtr<Device> > DeviceWeakMap;
DeviceMap devices_;
bool stopped_; scoped_refptr<HandlerThread> handler_thread_;
DeviceProviders providers_;
DeviceWeakMap devices_;
}; };
#endif // CHROME_BROWSER_DEVTOOLS_DEVICE_ANDROID_DEVICE_MANAGER_H_ #endif // CHROME_BROWSER_DEVTOOLS_DEVICE_ANDROID_DEVICE_MANAGER_H_
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
#include "base/message_loop/message_loop.h" #include "base/message_loop/message_loop.h"
#include "base/rand_util.h" #include "base/rand_util.h"
#include "chrome/browser/devtools/device/devtools_android_bridge.h" #include "chrome/browser/devtools/device/android_device_manager.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "net/base/io_buffer.h" #include "net/base/io_buffer.h"
#include "net/base/net_errors.h" #include "net/base/net_errors.h"
...@@ -18,12 +18,11 @@ namespace { ...@@ -18,12 +18,11 @@ namespace {
const int kBufferSize = 16 * 1024; const int kBufferSize = 16 * 1024;
class WebSocketImpl : public DevToolsAndroidBridge::AndroidWebSocket { class WebSocketImpl : public AndroidDeviceManager::AndroidWebSocket {
public: public:
WebSocketImpl(scoped_refptr<DevToolsAndroidBridge> android_bridge, typedef AndroidDeviceManager::Device Device;
AndroidDeviceManager* device_manager, WebSocketImpl(scoped_refptr<base::MessageLoopProxy> device_message_loop,
base::MessageLoop* device_message_loop, scoped_refptr<Device> device,
const std::string& serial,
const std::string& socket_name, const std::string& socket_name,
const std::string& url, const std::string& url,
Delegate* delegate); Delegate* delegate);
...@@ -38,8 +37,7 @@ class WebSocketImpl : public DevToolsAndroidBridge::AndroidWebSocket { ...@@ -38,8 +37,7 @@ class WebSocketImpl : public DevToolsAndroidBridge::AndroidWebSocket {
virtual ~WebSocketImpl(); virtual ~WebSocketImpl();
void ConnectOnHandlerThread(); void Connected(int result, net::StreamSocket* socket);
void ConnectedOnHandlerThread(int result, net::StreamSocket* socket);
void StartListeningOnHandlerThread(); void StartListeningOnHandlerThread();
void OnBytesRead(scoped_refptr<net::IOBuffer> response_buffer, int result); void OnBytesRead(scoped_refptr<net::IOBuffer> response_buffer, int result);
void SendFrameOnHandlerThread(const std::string& message); void SendFrameOnHandlerThread(const std::string& message);
...@@ -50,10 +48,8 @@ class WebSocketImpl : public DevToolsAndroidBridge::AndroidWebSocket { ...@@ -50,10 +48,8 @@ class WebSocketImpl : public DevToolsAndroidBridge::AndroidWebSocket {
void OnFrameRead(const std::string& message); void OnFrameRead(const std::string& message);
void OnSocketClosed(bool closed_by_device); void OnSocketClosed(bool closed_by_device);
scoped_refptr<DevToolsAndroidBridge> android_bridge_; scoped_refptr<base::MessageLoopProxy> device_message_loop_;
AndroidDeviceManager* device_manager_; scoped_refptr<Device> device_;
base::MessageLoop* device_message_loop_;
std::string serial_;
std::string socket_name_; std::string socket_name_;
std::string url_; std::string url_;
scoped_ptr<net::StreamSocket> socket_; scoped_ptr<net::StreamSocket> socket_;
...@@ -63,17 +59,13 @@ class WebSocketImpl : public DevToolsAndroidBridge::AndroidWebSocket { ...@@ -63,17 +59,13 @@ class WebSocketImpl : public DevToolsAndroidBridge::AndroidWebSocket {
}; };
WebSocketImpl::WebSocketImpl( WebSocketImpl::WebSocketImpl(
scoped_refptr<DevToolsAndroidBridge> android_bridge, scoped_refptr<base::MessageLoopProxy> device_message_loop,
AndroidDeviceManager* device_manager, scoped_refptr<Device> device,
base::MessageLoop* device_message_loop,
const std::string& serial,
const std::string& socket_name, const std::string& socket_name,
const std::string& url, const std::string& url,
Delegate* delegate) Delegate* delegate)
: android_bridge_(android_bridge), : device_message_loop_(device_message_loop),
device_manager_(device_manager), device_(device),
device_message_loop_(device_message_loop),
serial_(serial),
socket_name_(socket_name), socket_name_(socket_name),
url_(url), url_(url),
delegate_(delegate) { delegate_(delegate) {
...@@ -81,11 +73,12 @@ WebSocketImpl::WebSocketImpl( ...@@ -81,11 +73,12 @@ WebSocketImpl::WebSocketImpl(
void WebSocketImpl::Connect() { void WebSocketImpl::Connect() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
device_message_loop_->PostTask( device_->HttpUpgrade(
FROM_HERE, base::Bind(&WebSocketImpl::ConnectOnHandlerThread, this)); socket_name_, url_, base::Bind(&WebSocketImpl::Connected, this));
} }
void WebSocketImpl::Disconnect() { void WebSocketImpl::Disconnect() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
device_message_loop_->PostTask( device_message_loop_->PostTask(
FROM_HERE, FROM_HERE,
base::Bind(&WebSocketImpl::DisconnectOnHandlerThread, this, false)); base::Bind(&WebSocketImpl::DisconnectOnHandlerThread, this, false));
...@@ -103,6 +96,7 @@ void WebSocketImpl::ClearDelegate() { ...@@ -103,6 +96,7 @@ void WebSocketImpl::ClearDelegate() {
} }
void WebSocketImpl::SendFrameOnHandlerThread(const std::string& message) { void WebSocketImpl::SendFrameOnHandlerThread(const std::string& message) {
DCHECK_EQ(device_message_loop_, base::MessageLoopProxy::current());
int mask = base::RandInt(0, 0x7FFFFFFF); int mask = base::RandInt(0, 0x7FFFFFFF);
std::string encoded_frame = WebSocket::EncodeFrameHybi17(message, mask); std::string encoded_frame = WebSocket::EncodeFrameHybi17(message, mask);
request_buffer_ += encoded_frame; request_buffer_ += encoded_frame;
...@@ -110,30 +104,25 @@ void WebSocketImpl::SendFrameOnHandlerThread(const std::string& message) { ...@@ -110,30 +104,25 @@ void WebSocketImpl::SendFrameOnHandlerThread(const std::string& message) {
SendPendingRequests(0); SendPendingRequests(0);
} }
WebSocketImpl::~WebSocketImpl() {} WebSocketImpl::~WebSocketImpl() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
void WebSocketImpl::ConnectOnHandlerThread() {
device_manager_->HttpUpgrade(
serial_,
socket_name_,
url_,
base::Bind(&WebSocketImpl::ConnectedOnHandlerThread, this));
} }
void WebSocketImpl::ConnectedOnHandlerThread( void WebSocketImpl::Connected(int result, net::StreamSocket* socket) {
int result, net::StreamSocket* socket) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
if (result != net::OK || socket == NULL) { if (result != net::OK || socket == NULL) {
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, OnSocketClosed(true);
base::Bind(&WebSocketImpl::OnSocketClosed, this, true));
return; return;
} }
socket_.reset(socket); socket_.reset(socket);
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, device_message_loop_->PostTask(
base::Bind(&WebSocketImpl::OnSocketOpened, this)); FROM_HERE,
StartListeningOnHandlerThread(); base::Bind(&WebSocketImpl::StartListeningOnHandlerThread, this));
OnSocketOpened();
} }
void WebSocketImpl::StartListeningOnHandlerThread() { void WebSocketImpl::StartListeningOnHandlerThread() {
DCHECK_EQ(device_message_loop_, base::MessageLoopProxy::current());
scoped_refptr<net::IOBuffer> response_buffer = scoped_refptr<net::IOBuffer> response_buffer =
new net::IOBuffer(kBufferSize); new net::IOBuffer(kBufferSize);
int result = socket_->Read( int result = socket_->Read(
...@@ -146,6 +135,7 @@ void WebSocketImpl::StartListeningOnHandlerThread() { ...@@ -146,6 +135,7 @@ void WebSocketImpl::StartListeningOnHandlerThread() {
void WebSocketImpl::OnBytesRead( void WebSocketImpl::OnBytesRead(
scoped_refptr<net::IOBuffer> response_buffer, int result) { scoped_refptr<net::IOBuffer> response_buffer, int result) {
DCHECK_EQ(device_message_loop_, base::MessageLoopProxy::current());
if (!socket_) if (!socket_)
return; return;
...@@ -185,6 +175,7 @@ void WebSocketImpl::OnBytesRead( ...@@ -185,6 +175,7 @@ void WebSocketImpl::OnBytesRead(
} }
void WebSocketImpl::SendPendingRequests(int result) { void WebSocketImpl::SendPendingRequests(int result) {
DCHECK_EQ(device_message_loop_, base::MessageLoopProxy::current());
if (!socket_) if (!socket_)
return; return;
if (result < 0) { if (result < 0) {
...@@ -205,6 +196,7 @@ void WebSocketImpl::SendPendingRequests(int result) { ...@@ -205,6 +196,7 @@ void WebSocketImpl::SendPendingRequests(int result) {
} }
void WebSocketImpl::DisconnectOnHandlerThread(bool closed_by_device) { void WebSocketImpl::DisconnectOnHandlerThread(bool closed_by_device) {
DCHECK_EQ(device_message_loop_, base::MessageLoopProxy::current());
if (!socket_) if (!socket_)
return; return;
// Wipe out socket_ first since Disconnect can re-enter this method. // Wipe out socket_ first since Disconnect can re-enter this method.
...@@ -231,13 +223,10 @@ void WebSocketImpl::OnSocketClosed(bool closed_by_device) { ...@@ -231,13 +223,10 @@ void WebSocketImpl::OnSocketClosed(bool closed_by_device) {
} // namespace } // namespace
scoped_refptr<DevToolsAndroidBridge::AndroidWebSocket> scoped_refptr<AndroidDeviceManager::AndroidWebSocket>
DevToolsAndroidBridge::RemoteBrowser::CreateWebSocket( AndroidDeviceManager::Device::CreateWebSocket(
const std::string& socket,
const std::string& url, const std::string& url,
DevToolsAndroidBridge::AndroidWebSocket::Delegate* delegate) { AndroidDeviceManager::AndroidWebSocket::Delegate* delegate) {
return new WebSocketImpl( return new WebSocketImpl(device_message_loop_, this, socket, url, delegate);
android_bridge_,
android_bridge_->device_manager(),
android_bridge_->device_message_loop(),
serial_, socket_, url, delegate);
} }
...@@ -72,34 +72,6 @@ class DevToolsAndroidBridge ...@@ -72,34 +72,6 @@ class DevToolsAndroidBridge
DISALLOW_COPY_AND_ASSIGN(Factory); DISALLOW_COPY_AND_ASSIGN(Factory);
}; };
class AndroidWebSocket : public base::RefCountedThreadSafe<AndroidWebSocket> {
public:
class Delegate {
public:
virtual void OnSocketOpened() = 0;
virtual void OnFrameRead(const std::string& message) = 0;
virtual void OnSocketClosed(bool closed_by_device) = 0;
protected:
virtual ~Delegate() {}
};
AndroidWebSocket() {}
virtual void Connect() = 0;
virtual void Disconnect() = 0;
virtual void SendFrame(const std::string& message) = 0;
virtual void ClearDelegate() = 0;
protected:
virtual ~AndroidWebSocket() {}
private:
friend class base::RefCountedThreadSafe<AndroidWebSocket>;
DISALLOW_COPY_AND_ASSIGN(AndroidWebSocket);
};
class RemotePage { class RemotePage {
public: public:
virtual ~RemotePage() {} virtual ~RemotePage() {}
...@@ -108,15 +80,16 @@ class DevToolsAndroidBridge ...@@ -108,15 +80,16 @@ class DevToolsAndroidBridge
}; };
typedef base::Callback<void(RemotePage*)> RemotePageCallback; typedef base::Callback<void(RemotePage*)> RemotePageCallback;
typedef base::Callback<void(int, const std::string&)> JsonRequestCallback;
typedef AndroidDeviceManager::Device Device;
typedef AndroidDeviceManager::AndroidWebSocket AndroidWebSocket;
class RemoteBrowser : public base::RefCounted<RemoteBrowser> { class RemoteBrowser : public base::RefCounted<RemoteBrowser> {
public: public:
RemoteBrowser( RemoteBrowser(scoped_refptr<Device> device,
scoped_refptr<DevToolsAndroidBridge> android_bridge,
const std::string& serial,
const AndroidDeviceManager::BrowserInfo& browser_info); const AndroidDeviceManager::BrowserInfo& browser_info);
std::string serial() { return serial_; } std::string serial() { return device_->serial(); }
std::string socket() { return socket_; } std::string socket() { return socket_; }
std::string display_name() { return display_name_; } std::string display_name() { return display_name_; }
...@@ -134,9 +107,9 @@ class DevToolsAndroidBridge ...@@ -134,9 +107,9 @@ class DevToolsAndroidBridge
std::vector<RemotePage*> CreatePages(); std::vector<RemotePage*> CreatePages();
void SetPageDescriptors(const base::ListValue&); void SetPageDescriptors(const base::ListValue&);
typedef base::Callback<void(int, const std::string&)> JsonRequestCallback;
void SendJsonRequest(const std::string& request, void SendJsonRequest(const std::string& request,
const JsonRequestCallback& callback); const JsonRequestCallback& callback);
void SendProtocolCommand(const std::string& debug_url, void SendProtocolCommand(const std::string& debug_url,
const std::string& method, const std::string& method,
base::DictionaryValue* params, base::DictionaryValue* params,
...@@ -172,8 +145,7 @@ class DevToolsAndroidBridge ...@@ -172,8 +145,7 @@ class DevToolsAndroidBridge
int result, int result,
const std::string& response); const std::string& response);
scoped_refptr<DevToolsAndroidBridge> android_bridge_; scoped_refptr<Device> device_;
const std::string serial_;
const std::string socket_; const std::string socket_;
std::string display_name_; std::string display_name_;
const AndroidDeviceManager::BrowserInfo::Type type_; const AndroidDeviceManager::BrowserInfo::Type type_;
...@@ -187,12 +159,10 @@ class DevToolsAndroidBridge ...@@ -187,12 +159,10 @@ class DevToolsAndroidBridge
class RemoteDevice : public base::RefCounted<RemoteDevice> { class RemoteDevice : public base::RefCounted<RemoteDevice> {
public: public:
RemoteDevice(scoped_refptr<DevToolsAndroidBridge> android_bridge, RemoteDevice(scoped_refptr<Device> device,
const std::string& serial, const AndroidDeviceManager::DeviceInfo& device_info);
const AndroidDeviceManager::DeviceInfo& device_info,
bool connected);
std::string serial() { return serial_; } std::string serial() { return device_->serial(); }
std::string model() { return model_; } std::string model() { return model_; }
bool is_connected() { return connected_; } bool is_connected() { return connected_; }
RemoteBrowsers& browsers() { return browsers_; } RemoteBrowsers& browsers() { return browsers_; }
...@@ -205,8 +175,7 @@ class DevToolsAndroidBridge ...@@ -205,8 +175,7 @@ class DevToolsAndroidBridge
friend class base::RefCounted<RemoteDevice>; friend class base::RefCounted<RemoteDevice>;
virtual ~RemoteDevice(); virtual ~RemoteDevice();
scoped_refptr<DevToolsAndroidBridge> android_bridge_; scoped_refptr<Device> device_;
std::string serial_;
std::string model_; std::string model_;
bool connected_; bool connected_;
RemoteBrowsers browsers_; RemoteBrowsers browsers_;
...@@ -240,7 +209,7 @@ class DevToolsAndroidBridge ...@@ -240,7 +209,7 @@ class DevToolsAndroidBridge
void set_device_providers_for_test( void set_device_providers_for_test(
const AndroidDeviceManager::DeviceProviders& device_providers) { const AndroidDeviceManager::DeviceProviders& device_providers) {
device_providers_ = device_providers; device_manager_->SetDeviceProviders(device_providers);
} }
static bool HasDevToolsWindow(const std::string& agent_id); static bool HasDevToolsWindow(const std::string& agent_id);
...@@ -250,43 +219,18 @@ class DevToolsAndroidBridge ...@@ -250,43 +219,18 @@ class DevToolsAndroidBridge
content::BrowserThread::UI>; content::BrowserThread::UI>;
friend class base::DeleteHelper<DevToolsAndroidBridge>; friend class base::DeleteHelper<DevToolsAndroidBridge>;
class HandlerThread : public base::RefCountedThreadSafe<HandlerThread> {
public:
static scoped_refptr<HandlerThread> GetInstance();
base::MessageLoop* message_loop();
private:
friend class base::RefCountedThreadSafe<HandlerThread>;
static HandlerThread* instance_;
static void StopThread(base::Thread* thread);
HandlerThread();
virtual ~HandlerThread();
base::Thread* thread_;
};
virtual ~DevToolsAndroidBridge(); virtual ~DevToolsAndroidBridge();
base::MessageLoop* device_message_loop() {
return handler_thread_->message_loop();
}
AndroidDeviceManager* device_manager() {
return device_manager_.get();
}
void CreatedDeviceManager(scoped_refptr<AndroidDeviceManager> device_manager);
void RequestDeviceList(); void RequestDeviceList();
void ReceivedDeviceList(RemoteDevices* devices); void ReceivedDeviceList(scoped_ptr<RemoteDevices> devices);
void RequestDeviceCount(); void RequestDeviceCount();
void ReceivedDeviceCount(int count); void ReceivedDeviceCount(int count);
void CreateDeviceProviders(); void CreateDeviceProviders();
Profile* profile_; Profile* profile_;
scoped_refptr<HandlerThread> handler_thread_;
scoped_refptr<AndroidDeviceManager> device_manager_; scoped_refptr<AndroidDeviceManager> device_manager_;
RemoteDevices devices_;
typedef std::vector<DeviceListListener*> DeviceListListeners; typedef std::vector<DeviceListListener*> DeviceListListeners;
DeviceListListeners device_list_listeners_; DeviceListListeners device_list_listeners_;
...@@ -294,7 +238,6 @@ class DevToolsAndroidBridge ...@@ -294,7 +238,6 @@ class DevToolsAndroidBridge
typedef std::vector<DeviceCountListener*> DeviceCountListeners; typedef std::vector<DeviceCountListener*> DeviceCountListeners;
DeviceCountListeners device_count_listeners_; DeviceCountListeners device_count_listeners_;
AndroidDeviceManager::DeviceProviders device_providers_;
PrefChangeRegistrar pref_change_registrar_; PrefChangeRegistrar pref_change_registrar_;
DISALLOW_COPY_AND_ASSIGN(DevToolsAndroidBridge); DISALLOW_COPY_AND_ASSIGN(DevToolsAndroidBridge);
}; };
......
...@@ -13,29 +13,31 @@ namespace { ...@@ -13,29 +13,31 @@ namespace {
const char kDeviceModel[] = "Local Chrome"; const char kDeviceModel[] = "Local Chrome";
const char kBrowserName[] = "Chrome"; const char kBrowserName[] = "Chrome";
const char kLocalhost[] = "127.0.0.1"; const char kLocalhost[] = "127.0.0.1";
const char kSerial[] = "local";
class SelfAsDevice : public AndroidDeviceManager::Device { static void RunSocketCallback(
public: const AndroidDeviceManager::SocketCallback& callback,
explicit SelfAsDevice(int port); net::StreamSocket* socket,
int result) {
virtual void QueryDeviceInfo(const DeviceInfoCallback& callback) OVERRIDE; callback.Run(result, socket);
}
virtual void OpenSocket(const std::string& socket_name, } // namespace
const SocketCallback& callback) OVERRIDE;
private:
virtual ~SelfAsDevice() {}
int port_; SelfAsDeviceProvider::SelfAsDeviceProvider(int port) : port_(port) {
}; }
SelfAsDevice::SelfAsDevice(int port) void SelfAsDeviceProvider::QueryDevices(const SerialsCallback& callback) {
: Device("local", true), std::vector<std::string> result;
port_(port) result.push_back(kSerial);
{} callback.Run(result);
}
void SelfAsDevice::QueryDeviceInfo(const DeviceInfoCallback& callback) { void SelfAsDeviceProvider::QueryDeviceInfo(const std::string& serial,
const DeviceInfoCallback& callback) {
AndroidDeviceManager::DeviceInfo device_info; AndroidDeviceManager::DeviceInfo device_info;
device_info.model = kDeviceModel; device_info.model = kDeviceModel;
device_info.connected = true;
AndroidDeviceManager::BrowserInfo browser_info; AndroidDeviceManager::BrowserInfo browser_info;
browser_info.socket_name = base::IntToString(port_); browser_info.socket_name = base::IntToString(port_);
...@@ -48,16 +50,9 @@ void SelfAsDevice::QueryDeviceInfo(const DeviceInfoCallback& callback) { ...@@ -48,16 +50,9 @@ void SelfAsDevice::QueryDeviceInfo(const DeviceInfoCallback& callback) {
FROM_HERE, base::Bind(callback, device_info)); FROM_HERE, base::Bind(callback, device_info));
} }
static void RunSocketCallback( void SelfAsDeviceProvider::OpenSocket(const std::string& serial,
const AndroidDeviceManager::SocketCallback& callback, const std::string& socket_name,
net::StreamSocket* socket,
int result) {
callback.Run(result, socket);
}
void SelfAsDevice::OpenSocket(const std::string& socket_name,
const SocketCallback& callback) { const SocketCallback& callback) {
DCHECK(CalledOnValidThread());
// Use plain socket for remote debugging and port forwarding on Desktop // Use plain socket for remote debugging and port forwarding on Desktop
// (debugging purposes). // (debugging purposes).
net::IPAddressNumber ip_number; net::IPAddressNumber ip_number;
...@@ -70,15 +65,3 @@ void SelfAsDevice::OpenSocket(const std::string& socket_name, ...@@ -70,15 +65,3 @@ void SelfAsDevice::OpenSocket(const std::string& socket_name,
address_list, NULL, net::NetLog::Source()); address_list, NULL, net::NetLog::Source());
socket->Connect(base::Bind(&RunSocketCallback, callback, socket)); socket->Connect(base::Bind(&RunSocketCallback, callback, socket));
} }
} // namespace
SelfAsDeviceProvider::SelfAsDeviceProvider(int port)
: port_(port) {
}
void SelfAsDeviceProvider::QueryDevices(const QueryDevicesCallback& callback) {
AndroidDeviceManager::Devices result;
result.push_back(new SelfAsDevice(port_));
callback.Run(result);
}
...@@ -12,7 +12,14 @@ class SelfAsDeviceProvider : public AndroidDeviceManager::DeviceProvider { ...@@ -12,7 +12,14 @@ class SelfAsDeviceProvider : public AndroidDeviceManager::DeviceProvider {
public: public:
explicit SelfAsDeviceProvider(int port); explicit SelfAsDeviceProvider(int port);
virtual void QueryDevices(const QueryDevicesCallback& callback) OVERRIDE; virtual void QueryDevices(const SerialsCallback& callback) OVERRIDE;
virtual void QueryDeviceInfo(const std::string& serial,
const DeviceInfoCallback& callback) OVERRIDE;
virtual void OpenSocket(const std::string& serial,
const std::string& socket_name,
const SocketCallback& callback) OVERRIDE;
private: private:
virtual ~SelfAsDeviceProvider(){} virtual ~SelfAsDeviceProvider(){}
......
...@@ -18,82 +18,33 @@ const char kLocalAbstractCommand[] = "localabstract:%s"; ...@@ -18,82 +18,33 @@ const char kLocalAbstractCommand[] = "localabstract:%s";
const int kBufferSize = 16 * 1024; const int kBufferSize = 16 * 1024;
class UsbDeviceImpl : public AndroidDeviceManager::Device { void OnOpenSocket(const UsbDeviceProvider::SocketCallback& callback,
public:
explicit UsbDeviceImpl(AndroidUsbDevice* device);
virtual void QueryDeviceInfo(const DeviceInfoCallback& callback) OVERRIDE;
virtual void OpenSocket(const std::string& name,
const SocketCallback& callback) OVERRIDE;
private:
void OnOpenSocket(const SocketCallback& callback,
net::StreamSocket* socket,
int result);
void RunCommand(const std::string& command,
const CommandCallback& callback);
void OpenedForCommand(const CommandCallback& callback,
net::StreamSocket* socket,
int result);
void OnRead(net::StreamSocket* socket,
scoped_refptr<net::IOBuffer> buffer,
const std::string& data,
const CommandCallback& callback,
int result);
virtual ~UsbDeviceImpl() {}
scoped_refptr<AndroidUsbDevice> device_;
};
UsbDeviceImpl::UsbDeviceImpl(AndroidUsbDevice* device)
: Device(device->serial(), device->is_connected()),
device_(device) {
device_->InitOnCallerThread();
}
void UsbDeviceImpl::QueryDeviceInfo(const DeviceInfoCallback& callback) {
AdbDeviceInfoQuery::Start(
base::Bind(&UsbDeviceImpl::RunCommand, this), callback);
}
void UsbDeviceImpl::OpenSocket(const std::string& name,
const SocketCallback& callback) {
DCHECK(CalledOnValidThread());
std::string socket_name =
base::StringPrintf(kLocalAbstractCommand, name.c_str());
net::StreamSocket* socket = device_->CreateSocket(socket_name);
if (!socket) {
callback.Run(net::ERR_CONNECTION_FAILED, NULL);
return;
}
int result = socket->Connect(base::Bind(&UsbDeviceImpl::OnOpenSocket, this,
callback, socket));
if (result != net::ERR_IO_PENDING)
callback.Run(result, NULL);
}
void UsbDeviceImpl::OnOpenSocket(const SocketCallback& callback,
net::StreamSocket* socket, net::StreamSocket* socket,
int result) { int result) {
callback.Run(result, result == net::OK ? socket : NULL); callback.Run(result, result == net::OK ? socket : NULL);
} }
void UsbDeviceImpl::RunCommand(const std::string& command, void OnRead(net::StreamSocket* socket,
const CommandCallback& callback) { scoped_refptr<net::IOBuffer> buffer,
DCHECK(CalledOnValidThread()); const std::string& data,
net::StreamSocket* socket = device_->CreateSocket(command); const UsbDeviceProvider::CommandCallback& callback,
if (!socket) { int result) {
callback.Run(net::ERR_CONNECTION_FAILED, std::string()); if (result <= 0) {
callback.Run(result, result == 0 ? data : std::string());
delete socket;
return; return;
} }
int result = socket->Connect(base::Bind(&UsbDeviceImpl::OpenedForCommand,
this, callback, socket)); std::string new_data = data + std::string(buffer->data(), result);
result =
socket->Read(buffer,
kBufferSize,
base::Bind(&OnRead, socket, buffer, new_data, callback));
if (result != net::ERR_IO_PENDING) if (result != net::ERR_IO_PENDING)
callback.Run(result, std::string()); OnRead(socket, buffer, new_data, callback, result);
} }
void UsbDeviceImpl::OpenedForCommand(const CommandCallback& callback, void OpenedForCommand(const UsbDeviceProvider::CommandCallback& callback,
net::StreamSocket* socket, net::StreamSocket* socket,
int result) { int result) {
if (result != net::OK) { if (result != net::OK) {
...@@ -101,40 +52,25 @@ void UsbDeviceImpl::OpenedForCommand(const CommandCallback& callback, ...@@ -101,40 +52,25 @@ void UsbDeviceImpl::OpenedForCommand(const CommandCallback& callback,
return; return;
} }
scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kBufferSize); scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kBufferSize);
result = socket->Read(buffer, kBufferSize, result = socket->Read(
base::Bind(&UsbDeviceImpl::OnRead, this, buffer,
socket, buffer, std::string(), callback)); kBufferSize,
base::Bind(&OnRead, socket, buffer, std::string(), callback));
if (result != net::ERR_IO_PENDING) if (result != net::ERR_IO_PENDING)
OnRead(socket, buffer, std::string(), callback, result); OnRead(socket, buffer, std::string(), callback, result);
} }
void UsbDeviceImpl::OnRead(net::StreamSocket* socket, void RunCommand(scoped_refptr<AndroidUsbDevice> device,
scoped_refptr<net::IOBuffer> buffer, const std::string& command,
const std::string& data, const UsbDeviceProvider::CommandCallback& callback) {
const CommandCallback& callback, net::StreamSocket* socket = device->CreateSocket(command);
int result) { if (!socket) {
if (result <= 0) { callback.Run(net::ERR_CONNECTION_FAILED, std::string());
callback.Run(result, result == 0 ? data : std::string());
delete socket;
return; return;
} }
int result = socket->Connect(base::Bind(&OpenedForCommand, callback, socket));
std::string new_data = data + std::string(buffer->data(), result);
result = socket->Read(buffer, kBufferSize,
base::Bind(&UsbDeviceImpl::OnRead, this,
socket, buffer, new_data, callback));
if (result != net::ERR_IO_PENDING) if (result != net::ERR_IO_PENDING)
OnRead(socket, buffer, new_data, callback, result); callback.Run(result, std::string());
}
static void EnumeratedDevices(
const UsbDeviceProvider::QueryDevicesCallback& callback,
const AndroidUsbDevices& devices) {
AndroidDeviceManager::Devices result;
for (AndroidUsbDevices::const_iterator it = devices.begin();
it != devices.end(); ++it)
result.push_back(new UsbDeviceImpl(*it));
callback.Run(result);
} }
} // namespace } // namespace
...@@ -149,10 +85,60 @@ UsbDeviceProvider::UsbDeviceProvider(Profile* profile){ ...@@ -149,10 +85,60 @@ UsbDeviceProvider::UsbDeviceProvider(Profile* profile){
rsa_key_.reset(AndroidRSAPrivateKey(profile)); rsa_key_.reset(AndroidRSAPrivateKey(profile));
} }
void UsbDeviceProvider::QueryDevices(const SerialsCallback& callback) {
AndroidUsbDevice::Enumerate(
rsa_key_.get(),
base::Bind(&UsbDeviceProvider::EnumeratedDevices, this, callback));
}
void UsbDeviceProvider::QueryDeviceInfo(const std::string& serial,
const DeviceInfoCallback& callback) {
UsbDeviceMap::iterator it = device_map_.find(serial);
if (it == device_map_.end() || !it->second->is_connected()) {
AndroidDeviceManager::DeviceInfo offline_info;
callback.Run(offline_info);
return;
}
AdbDeviceInfoQuery::Start(base::Bind(&RunCommand, it->second), callback);
}
void UsbDeviceProvider::OpenSocket(const std::string& serial,
const std::string& name,
const SocketCallback& callback) {
UsbDeviceMap::iterator it = device_map_.find(serial);
if (it == device_map_.end()) {
callback.Run(net::ERR_CONNECTION_FAILED, NULL);
return;
}
std::string socket_name =
base::StringPrintf(kLocalAbstractCommand, name.c_str());
net::StreamSocket* socket = it->second->CreateSocket(socket_name);
if (!socket) {
callback.Run(net::ERR_CONNECTION_FAILED, NULL);
return;
}
int result = socket->Connect(base::Bind(&OnOpenSocket, callback, socket));
if (result != net::ERR_IO_PENDING)
callback.Run(result, NULL);
}
void UsbDeviceProvider::ReleaseDevice(const std::string& serial) {
device_map_.erase(serial);
}
UsbDeviceProvider::~UsbDeviceProvider() { UsbDeviceProvider::~UsbDeviceProvider() {
} }
void UsbDeviceProvider::QueryDevices(const QueryDevicesCallback& callback) { void UsbDeviceProvider::EnumeratedDevices(const SerialsCallback& callback,
AndroidUsbDevice::Enumerate( const AndroidUsbDevices& devices) {
rsa_key_.get(), base::Bind(&EnumeratedDevices, callback)); std::vector<std::string> result;
device_map_.clear();
for (AndroidUsbDevices::const_iterator it = devices.begin();
it != devices.end(); ++it) {
result.push_back((*it)->serial());
device_map_[(*it)->serial()] = *it;
(*it)->InitOnCallerThread();
}
callback.Run(result);
} }
...@@ -11,20 +11,36 @@ namespace crypto { ...@@ -11,20 +11,36 @@ namespace crypto {
class RSAPrivateKey; class RSAPrivateKey;
} }
class AndroidUsbDevice;
class UsbDeviceProvider : public AndroidDeviceManager::DeviceProvider { class UsbDeviceProvider : public AndroidDeviceManager::DeviceProvider {
public: public:
typedef DeviceProvider::QueryDevicesCallback QueryDevicesCallback;
static void CountDevices(const base::Callback<void(int)>& callback); static void CountDevices(const base::Callback<void(int)>& callback);
explicit UsbDeviceProvider(Profile* profile); explicit UsbDeviceProvider(Profile* profile);
virtual void QueryDevices(const QueryDevicesCallback& callback) OVERRIDE; virtual void QueryDevices(const SerialsCallback& callback) OVERRIDE;
virtual void QueryDeviceInfo(const std::string& serial,
const DeviceInfoCallback& callback) OVERRIDE;
virtual void OpenSocket(const std::string& serial,
const std::string& socket_name,
const SocketCallback& callback) OVERRIDE;
virtual void ReleaseDevice(const std::string& serial) OVERRIDE;
private: private:
virtual ~UsbDeviceProvider(); virtual ~UsbDeviceProvider();
void EnumeratedDevices(
const SerialsCallback& callback,
const std::vector<scoped_refptr<AndroidUsbDevice> >& devices);
typedef std::map<std::string, scoped_refptr<AndroidUsbDevice> > UsbDeviceMap;
scoped_ptr<crypto::RSAPrivateKey> rsa_key_; scoped_ptr<crypto::RSAPrivateKey> rsa_key_;
UsbDeviceMap device_map_;
}; };
#endif // CHROME_BROWSER_DEVTOOLS_DEVICE_USB_USB_DEVICE_PROVIDER_H_ #endif // CHROME_BROWSER_DEVTOOLS_DEVICE_USB_USB_DEVICE_PROVIDER_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment