1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file.
4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/devtools/device/adb/adb_device_provider.h"
6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/strings/string_util.h"
8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/strings/stringprintf.h"
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/devtools/device/adb/adb_client_socket.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/devtools/device/adb/adb_device_info_query.h"
11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace {
13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kHostDevicesCommand[] = "host:devices";
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kHostTransportCommand[] = "host:transport:%s|%s";
16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kLocalAbstractCommand[] = "localabstract:%s";
17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const int kAdbPort = 5037;
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)static void RunCommand(const std::string& serial,
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       const std::string& command,
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       const AdbDeviceProvider::CommandCallback& callback) {
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::string query = base::StringPrintf(
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kHostTransportCommand, serial.c_str(), command.c_str());
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AdbClientSocket::AdbQuery(kAdbPort, query, callback);
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)static void ReceivedAdbDevices(
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const AdbDeviceProvider::SerialsCallback& callback,
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    int result_code,
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const std::string& response) {
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::vector<std::string> result;
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (result_code < 0) {
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    callback.Run(result);
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::vector<std::string> serials;
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Tokenize(response, "\n", &serials);
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  for (size_t i = 0; i < serials.size(); ++i) {
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    std::vector<std::string> tokens;
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    Tokenize(serials[i], "\t ", &tokens);
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    result.push_back(tokens[0]);
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  callback.Run(result);
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace
48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void AdbDeviceProvider::QueryDevices(const SerialsCallback& callback) {
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  AdbClientSocket::AdbQuery(
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      kAdbPort, kHostDevicesCommand, base::Bind(&ReceivedAdbDevices, callback));
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void AdbDeviceProvider::QueryDeviceInfo(const std::string& serial,
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                        const DeviceInfoCallback& callback) {
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  AdbDeviceInfoQuery::Start(base::Bind(&RunCommand, serial), callback);
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void AdbDeviceProvider::OpenSocket(const std::string& serial,
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                   const std::string& socket_name,
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                   const SocketCallback& callback) {
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::string request =
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::StringPrintf(kLocalAbstractCommand, socket_name.c_str());
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  AdbClientSocket::TransportQuery(kAdbPort, serial, request, callback);
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)AdbDeviceProvider::~AdbDeviceProvider() {
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
69