C++程序  |  95行  |  3.34 KB

// Copyright 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_ANDROID_DEVICE_H_
#define CHROME_BROWSER_DEVTOOLS_ANDROID_DEVICE_H_

#include <vector>

#include "base/memory/ref_counted.h"
#include "chrome/browser/devtools/adb/android_usb_device.h"
#include "chrome/browser/devtools/refcounted_adb_thread.h"
#include "chrome/browser/profiles/profile.h"
#include "content/public/browser/browser_thread.h"
#include "crypto/rsa_private_key.h"
#include "net/socket/stream_socket.h"

class AndroidDevice : public base::RefCounted<AndroidDevice> {
 public:
  typedef base::Callback<void(int, const std::string&)> CommandCallback;
  typedef base::Callback<void(int result, net::StreamSocket*)> SocketCallback;

  AndroidDevice(const std::string& serial, bool is_connected);

  virtual void RunCommand(const std::string& command,
                          const CommandCallback& callback) = 0;
  virtual void OpenSocket(const std::string& socket_name,
                          const SocketCallback& callback) = 0;
  virtual void HttpQuery(const std::string& la_name,
                         const std::string& request,
                         const CommandCallback& callback);
  void HttpUpgrade(const std::string& la_name,
                   const std::string& request,
                   const SocketCallback& callback);

  std::string serial() { return serial_; }
  bool is_connected() { return is_connected_; }

  std::string model() { return model_; }
  void set_model(const std::string& model) { model_ = model; }

 protected:
  friend class base::RefCounted<AndroidDevice>;
  virtual ~AndroidDevice();

 private:
  void OnHttpSocketOpened(const std::string& request,
                          const CommandCallback& callback,
                          int result,
                          net::StreamSocket* socket);
  void OnHttpSocketOpened2(const std::string& request,
                           const SocketCallback& callback,
                           int result,
                           net::StreamSocket* socket);

  std::string serial_;
  bool is_connected_;
  std::string model_;

  DISALLOW_COPY_AND_ASSIGN(AndroidDevice);
};


class AndroidDeviceProvider
    : public base::RefCountedThreadSafe<
          AndroidDeviceProvider,
          content::BrowserThread::DeleteOnUIThread> {
 public:
  typedef std::vector<scoped_refptr<AndroidDevice> > AndroidDevices;
  typedef base::Callback<void(const AndroidDevices&)> QueryDevicesCallback;

  virtual void QueryDevices(const QueryDevicesCallback& callback) = 0;

  static void CountDevices(bool discover_usb_devices,
                           const  base::Callback<void(int)>& callback);

  static scoped_refptr<AndroidDeviceProvider> GetAdbDeviceProvider();
  static scoped_refptr<AndroidDeviceProvider>
      GetUsbDeviceProvider(Profile* profile);

 protected:
  friend struct
      content::BrowserThread::DeleteOnThread<content::BrowserThread::UI>;
  friend class base::DeleteHelper<AndroidDeviceProvider>;

  AndroidDeviceProvider();
  virtual ~AndroidDeviceProvider();
  static void RunCallbackOnUIThread(const QueryDevicesCallback& callback,
                                    const AndroidDevices& result);

  scoped_refptr<RefCountedAdbThread> adb_thread_;
};

#endif  // CHROME_BROWSER_DEVTOOLS_ANDROID_DEVICE_H_