OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/devtools/devtools_adb_bridge.h" | 5 #include "chrome/browser/devtools/devtools_adb_bridge.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/base64.h" | 10 #include "base/base64.h" |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 } | 92 } |
93 private: | 93 private: |
94 virtual ~AdbDeviceImpl() {} | 94 virtual ~AdbDeviceImpl() {} |
95 }; | 95 }; |
96 | 96 |
97 class UsbDeviceImpl : public DevToolsAdbBridge::AndroidDevice { | 97 class UsbDeviceImpl : public DevToolsAdbBridge::AndroidDevice { |
98 public: | 98 public: |
99 explicit UsbDeviceImpl(AndroidUsbDevice* device) | 99 explicit UsbDeviceImpl(AndroidUsbDevice* device) |
100 : AndroidDevice(device->serial()), | 100 : AndroidDevice(device->serial()), |
101 device_(device) { | 101 device_(device) { |
| 102 device_->InitOnCallerThread(); |
102 } | 103 } |
103 | 104 |
104 virtual void RunCommand(const std::string& command, | 105 virtual void RunCommand(const std::string& command, |
105 const CommandCallback& callback) OVERRIDE { | 106 const CommandCallback& callback) OVERRIDE { |
106 net::StreamSocket* socket = device_->CreateSocket(command); | 107 net::StreamSocket* socket = device_->CreateSocket(command); |
107 int result = socket->Connect(base::Bind(&UsbDeviceImpl::OpenedForCommand, | 108 int result = socket->Connect(base::Bind(&UsbDeviceImpl::OpenedForCommand, |
108 this, callback, socket)); | 109 this, callback, socket)); |
109 if (result != net::ERR_IO_PENDING) | 110 if (result != net::ERR_IO_PENDING) |
110 callback.Run(result, std::string()); | 111 callback.Run(result, std::string()); |
111 } | 112 } |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 virtual ~UsbDeviceImpl() {} | 166 virtual ~UsbDeviceImpl() {} |
166 scoped_refptr<AndroidUsbDevice> device_; | 167 scoped_refptr<AndroidUsbDevice> device_; |
167 }; | 168 }; |
168 | 169 |
169 class AdbPagesCommand : public base::RefCountedThreadSafe< | 170 class AdbPagesCommand : public base::RefCountedThreadSafe< |
170 AdbPagesCommand, | 171 AdbPagesCommand, |
171 content::BrowserThread::DeleteOnUIThread> { | 172 content::BrowserThread::DeleteOnUIThread> { |
172 public: | 173 public: |
173 typedef base::Callback<void(DevToolsAdbBridge::RemoteDevices*)> Callback; | 174 typedef base::Callback<void(DevToolsAdbBridge::RemoteDevices*)> Callback; |
174 | 175 |
175 AdbPagesCommand(DevToolsAdbBridge* bridge, const Callback& callback) | 176 AdbPagesCommand(DevToolsAdbBridge* bridge, |
| 177 crypto::RSAPrivateKey* rsa_key, |
| 178 const Callback& callback) |
176 : bridge_(bridge), | 179 : bridge_(bridge), |
177 callback_(callback) { | 180 callback_(callback) { |
178 remote_devices_.reset(new DevToolsAdbBridge::RemoteDevices()); | 181 remote_devices_.reset(new DevToolsAdbBridge::RemoteDevices()); |
179 bridge_->GetAdbMessageLoop()->PostTask(FROM_HERE, | 182 |
180 base::Bind(&DevToolsAdbBridge::EnumerateUsbDevices, bridge_, | 183 if (CommandLine::ForCurrentProcess()->HasSwitch( |
181 base::Bind(&AdbPagesCommand::ReceivedUsbDevices, this))); | 184 switches::kRemoteDebuggingRawUSB)) { |
| 185 AndroidUsbDevice::Enumerate(rsa_key, |
| 186 base::Bind(&AdbPagesCommand::ReceivedUsbDevices, this)); |
| 187 } else { |
| 188 ReceivedUsbDevices(AndroidUsbDevices()); |
| 189 } |
182 } | 190 } |
183 | 191 |
184 private: | 192 private: |
185 friend struct content::BrowserThread::DeleteOnThread< | 193 friend struct content::BrowserThread::DeleteOnThread< |
186 content::BrowserThread::UI>; | 194 content::BrowserThread::UI>; |
187 friend class base::DeleteHelper<AdbPagesCommand>; | 195 friend class base::DeleteHelper<AdbPagesCommand>; |
188 | 196 |
189 virtual ~AdbPagesCommand() { | 197 virtual ~AdbPagesCommand() { |
190 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 198 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
191 } | 199 } |
192 | 200 |
193 void ReceivedUsbDevices(const AndroidDevices& devices) { | 201 void ReceivedUsbDevices(const AndroidUsbDevices& usb_devices) { |
| 202 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 203 bridge_->GetAdbMessageLoop()->PostTask( |
| 204 FROM_HERE, base::Bind(&AdbPagesCommand::WrapUsbDevices, this, |
| 205 usb_devices)); |
| 206 } |
| 207 |
| 208 void WrapUsbDevices(const AndroidUsbDevices& usb_devices) { |
194 DCHECK_EQ(bridge_->GetAdbMessageLoop(), base::MessageLoop::current()); | 209 DCHECK_EQ(bridge_->GetAdbMessageLoop(), base::MessageLoop::current()); |
195 devices_ = devices; | 210 |
196 bridge_->EnumerateAdbDevices( | 211 #if defined(DEBUG_DEVTOOLS) |
| 212 devices_.push_back(new AdbDeviceImpl("")); // For desktop remote debugging. |
| 213 #endif // defined(DEBUG_DEVTOOLS) |
| 214 |
| 215 for (AndroidUsbDevices::const_iterator it = usb_devices.begin(); |
| 216 it != usb_devices.end(); ++it) { |
| 217 devices_.push_back(new UsbDeviceImpl(*it)); |
| 218 } |
| 219 |
| 220 AdbClientSocket::AdbQuery( |
| 221 kAdbPort, kHostDevicesCommand, |
197 base::Bind(&AdbPagesCommand::ReceivedAdbDevices, this)); | 222 base::Bind(&AdbPagesCommand::ReceivedAdbDevices, this)); |
198 } | 223 } |
199 | 224 |
200 void ReceivedAdbDevices(const AndroidDevices& devices) { | 225 void ReceivedAdbDevices( |
201 devices_.insert(devices_.end(), devices.begin(), devices.end()); | 226 int result, |
| 227 const std::string& response) { |
| 228 DCHECK_EQ(bridge_->GetAdbMessageLoop(), base::MessageLoop::current()); |
| 229 std::vector<std::string> serials; |
| 230 Tokenize(response, "\n", &serials); |
| 231 for (size_t i = 0; i < serials.size(); ++i) { |
| 232 std::vector<std::string> tokens; |
| 233 Tokenize(serials[i], "\t ", &tokens); |
| 234 devices_.push_back(new AdbDeviceImpl(tokens[0])); |
| 235 } |
202 ProcessSerials(); | 236 ProcessSerials(); |
203 } | 237 } |
204 | 238 |
205 void ProcessSerials() { | 239 void ProcessSerials() { |
206 DCHECK_EQ(bridge_->GetAdbMessageLoop(), base::MessageLoop::current()); | 240 DCHECK_EQ(bridge_->GetAdbMessageLoop(), base::MessageLoop::current()); |
207 if (devices_.size() == 0) { | 241 if (devices_.size() == 0) { |
208 BrowserThread::PostTask( | 242 BrowserThread::PostTask( |
209 BrowserThread::UI, FROM_HERE, | 243 BrowserThread::UI, FROM_HERE, |
210 base::Bind(&AdbPagesCommand::Respond, this)); | 244 base::Bind(&AdbPagesCommand::Respond, this)); |
211 return; | 245 return; |
(...skipping 649 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
861 | 895 |
862 DevToolsAdbBridge::DevToolsAdbBridge(Profile* profile) | 896 DevToolsAdbBridge::DevToolsAdbBridge(Profile* profile) |
863 : profile_(profile), | 897 : profile_(profile), |
864 adb_thread_(RefCountedAdbThread::GetInstance()), | 898 adb_thread_(RefCountedAdbThread::GetInstance()), |
865 has_message_loop_(adb_thread_->message_loop() != NULL) { | 899 has_message_loop_(adb_thread_->message_loop() != NULL) { |
866 rsa_key_.reset(AndroidRSAPrivateKey(profile)); | 900 rsa_key_.reset(AndroidRSAPrivateKey(profile)); |
867 port_forwarding_controller_.reset( | 901 port_forwarding_controller_.reset( |
868 new PortForwardingController(this, profile->GetPrefs())); | 902 new PortForwardingController(this, profile->GetPrefs())); |
869 } | 903 } |
870 | 904 |
871 void DevToolsAdbBridge::EnumerateUsbDevices( | |
872 const AndroidDevicesCallback& callback) { | |
873 DCHECK_EQ(base::MessageLoop::current(), adb_thread_->message_loop()); | |
874 if (CommandLine::ForCurrentProcess()->HasSwitch( | |
875 switches::kRemoteDebuggingRawUSB)) { | |
876 AndroidUsbDevice::Enumerate(rsa_key_.get(), | |
877 base::Bind(&DevToolsAdbBridge::ReceivedUsbDevices, this, callback)); | |
878 } else { | |
879 ReceivedUsbDevices(callback, AndroidUsbDevices()); | |
880 } | |
881 } | |
882 | |
883 void DevToolsAdbBridge::EnumerateAdbDevices( | |
884 const AndroidDevicesCallback& callback) { | |
885 DCHECK_EQ(base::MessageLoop::current(), adb_thread_->message_loop()); | |
886 | |
887 AdbClientSocket::AdbQuery( | |
888 kAdbPort, kHostDevicesCommand, | |
889 base::Bind(&DevToolsAdbBridge::ReceivedAdbDevices, this, callback)); | |
890 } | |
891 | |
892 void DevToolsAdbBridge::AddListener(Listener* listener) { | 905 void DevToolsAdbBridge::AddListener(Listener* listener) { |
893 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 906 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
894 if (listeners_.empty()) | 907 if (listeners_.empty()) |
895 RequestRemoteDevices(); | 908 RequestRemoteDevices(); |
896 listeners_.push_back(listener); | 909 listeners_.push_back(listener); |
897 } | 910 } |
898 | 911 |
899 void DevToolsAdbBridge::RemoveListener(Listener* listener) { | 912 void DevToolsAdbBridge::RemoveListener(Listener* listener) { |
900 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 913 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
901 Listeners::iterator it = | 914 Listeners::iterator it = |
902 std::find(listeners_.begin(), listeners_.end(), listener); | 915 std::find(listeners_.begin(), listeners_.end(), listener); |
903 DCHECK(it != listeners_.end()); | 916 DCHECK(it != listeners_.end()); |
904 listeners_.erase(it); | 917 listeners_.erase(it); |
905 } | 918 } |
906 | 919 |
907 base::MessageLoop* DevToolsAdbBridge::GetAdbMessageLoop() { | 920 base::MessageLoop* DevToolsAdbBridge::GetAdbMessageLoop() { |
908 return adb_thread_->message_loop(); | 921 return adb_thread_->message_loop(); |
909 } | 922 } |
910 | 923 |
911 DevToolsAdbBridge::~DevToolsAdbBridge() { | 924 DevToolsAdbBridge::~DevToolsAdbBridge() { |
912 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 925 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
913 DCHECK(listeners_.empty()); | 926 DCHECK(listeners_.empty()); |
914 } | 927 } |
915 | 928 |
916 void DevToolsAdbBridge::ReceivedUsbDevices( | |
917 const AndroidDevicesCallback& callback, | |
918 const AndroidUsbDevices& usb_devices) { | |
919 AndroidDevices devices; | |
920 | |
921 #if defined(DEBUG_DEVTOOLS) | |
922 devices.push_back(new AdbDeviceImpl("")); // For desktop remote debugging. | |
923 #endif // defined(DEBUG_DEVTOOLS) | |
924 | |
925 for (AndroidUsbDevices::const_iterator it = usb_devices.begin(); | |
926 it != usb_devices.end(); ++it) { | |
927 devices.push_back(new UsbDeviceImpl(*it)); | |
928 } | |
929 | |
930 callback.Run(devices); | |
931 } | |
932 | |
933 void DevToolsAdbBridge::ReceivedAdbDevices( | |
934 const AndroidDevicesCallback& callback, | |
935 int result, | |
936 const std::string& response) { | |
937 AndroidDevices devices; | |
938 if (result != net::OK) { | |
939 callback.Run(devices); | |
940 return; | |
941 } | |
942 | |
943 std::vector<std::string> serials; | |
944 Tokenize(response, "\n", &serials); | |
945 for (size_t i = 0; i < serials.size(); ++i) { | |
946 std::vector<std::string> tokens; | |
947 Tokenize(serials[i], "\t ", &tokens); | |
948 devices.push_back(new AdbDeviceImpl(tokens[0])); | |
949 } | |
950 callback.Run(devices); | |
951 } | |
952 | |
953 void DevToolsAdbBridge::RequestRemoteDevices() { | 929 void DevToolsAdbBridge::RequestRemoteDevices() { |
954 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 930 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
955 if (!has_message_loop_) | 931 if (!has_message_loop_) |
956 return; | 932 return; |
957 | 933 |
958 new AdbPagesCommand( | 934 new AdbPagesCommand( |
959 this, base::Bind(&DevToolsAdbBridge::ReceivedRemoteDevices, this)); | 935 this, rsa_key_.get(), |
| 936 base::Bind(&DevToolsAdbBridge::ReceivedRemoteDevices, this)); |
960 } | 937 } |
961 | 938 |
962 void DevToolsAdbBridge::ReceivedRemoteDevices(RemoteDevices* devices_ptr) { | 939 void DevToolsAdbBridge::ReceivedRemoteDevices(RemoteDevices* devices_ptr) { |
963 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 940 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
964 | 941 |
965 scoped_ptr<RemoteDevices> devices(devices_ptr); | 942 scoped_ptr<RemoteDevices> devices(devices_ptr); |
966 port_forwarding_controller_->UpdateDeviceList(*devices.get()); | 943 port_forwarding_controller_->UpdateDeviceList(*devices.get()); |
967 | 944 |
968 Listeners copy(listeners_); | 945 Listeners copy(listeners_); |
969 for (Listeners::iterator it = copy.begin(); it != copy.end(); ++it) | 946 for (Listeners::iterator it = copy.begin(); it != copy.end(); ++it) |
970 (*it)->RemoteDevicesChanged(devices.get()); | 947 (*it)->RemoteDevicesChanged(devices.get()); |
971 | 948 |
972 if (listeners_.empty()) | 949 if (listeners_.empty()) |
973 return; | 950 return; |
974 | 951 |
975 BrowserThread::PostDelayedTask( | 952 BrowserThread::PostDelayedTask( |
976 BrowserThread::UI, | 953 BrowserThread::UI, |
977 FROM_HERE, | 954 FROM_HERE, |
978 base::Bind(&DevToolsAdbBridge::RequestRemoteDevices, this), | 955 base::Bind(&DevToolsAdbBridge::RequestRemoteDevices, this), |
979 base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs)); | 956 base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs)); |
980 } | 957 } |
OLD | NEW |