• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_DEVTOOLS_ADB_ANDROID_USB_DEVICE_H_
6 #define CHROME_BROWSER_DEVTOOLS_ADB_ANDROID_USB_DEVICE_H_
7 
8 #include <map>
9 #include <queue>
10 #include <vector>
11 #include "base/memory/ref_counted.h"
12 #include "chrome/browser/usb/usb_device_handle.h"
13 
14 namespace base {
15 class MessageLoop;
16 }
17 
18 namespace crypto {
19 class RSAPrivateKey;
20 }
21 
22 namespace net {
23 class StreamSocket;
24 }
25 
26 class AndroidUsbSocket;
27 
28 class AdbMessage : public base::RefCounted<AdbMessage> {
29  public:
30   enum Command {
31     kCommandSYNC = 0x434e5953,
32     kCommandCNXN = 0x4e584e43,
33     kCommandOPEN = 0x4e45504f,
34     kCommandOKAY = 0x59414b4f,
35     kCommandCLSE = 0x45534c43,
36     kCommandWRTE = 0x45545257,
37     kCommandAUTH = 0x48545541
38   };
39 
40   enum Auth {
41     kAuthToken = 1,
42     kAuthSignature = 2,
43     kAuthRSAPublicKey = 3
44   };
45 
46   AdbMessage(uint32 command,
47              uint32 arg0,
48              uint32 arg1,
49              const std::string& body);
50 
51   uint32 command;
52   uint32 arg0;
53   uint32 arg1;
54   std::string body;
55  private:
56   friend class base::RefCounted<AdbMessage>;
57   ~AdbMessage();
58 
59   DISALLOW_COPY_AND_ASSIGN(AdbMessage);
60 };
61 
62 class AndroidUsbDevice;
63 typedef std::vector<scoped_refptr<AndroidUsbDevice> > AndroidUsbDevices;
64 typedef base::Callback<void(const AndroidUsbDevices&)>
65     AndroidUsbDevicesCallback;
66 
67 class AndroidUsbDevice : public base::RefCountedThreadSafe<AndroidUsbDevice> {
68  public:
69   static void Enumerate(crypto::RSAPrivateKey* rsa_key,
70                         const AndroidUsbDevicesCallback& callback);
71 
72   static void CountDevices(const base::Callback<void(int)>& callback);
73 
74   AndroidUsbDevice(crypto::RSAPrivateKey* rsa_key,
75                    scoped_refptr<UsbDeviceHandle> device,
76                    const std::string& serial,
77                    int inbound_address,
78                    int outbound_address,
79                    int zero_mask);
80 
81   void InitOnCallerThread();
82 
83   net::StreamSocket* CreateSocket(const std::string& command);
84 
85   void Send(uint32 command,
86             uint32 arg0,
87             uint32 arg1,
88             const std::string& body);
89 
usb_device()90   scoped_refptr<UsbDeviceHandle> usb_device() { return usb_device_; }
91 
serial()92   std::string serial() { return serial_; }
93 
terminated()94   bool terminated() { return terminated_; }
95 
is_connected()96   bool is_connected() { return is_connected_; }
97 
98  private:
99   friend class base::RefCountedThreadSafe<AndroidUsbDevice>;
100   virtual ~AndroidUsbDevice();
101 
102   void Queue(scoped_refptr<AdbMessage> message);
103   void ProcessOutgoing();
104   void OutgoingMessageSent(UsbTransferStatus status,
105                            scoped_refptr<net::IOBuffer> buffer,
106                            size_t result);
107 
108   void ReadHeader(bool initial);
109   void ParseHeader(UsbTransferStatus status,
110                    scoped_refptr<net::IOBuffer> buffer,
111                    size_t result);
112 
113   void ReadBody(scoped_refptr<AdbMessage> message,
114                 uint32 data_length,
115                 uint32 data_check);
116   void ParseBody(scoped_refptr<AdbMessage> message,
117                  uint32 data_length,
118                  uint32 data_check,
119                  UsbTransferStatus status,
120                  scoped_refptr<net::IOBuffer> buffer,
121                  size_t result);
122 
123   void HandleIncoming(scoped_refptr<AdbMessage> message);
124 
125   void TransferError(UsbTransferStatus status);
126 
127   void Terminate();
128 
129   void SocketDeleted(uint32 socket_id);
130 
131   base::MessageLoop* message_loop_;
132 
133   scoped_ptr<crypto::RSAPrivateKey> rsa_key_;
134 
135   // Device info
136   scoped_refptr<UsbDeviceHandle> usb_device_;
137   std::string serial_;
138   int inbound_address_;
139   int outbound_address_;
140   int zero_mask_;
141 
142   bool is_connected_;
143   bool signature_sent_;
144 
145   // Created sockets info
146   uint32 last_socket_id_;
147   bool terminated_;
148   typedef std::map<uint32, AndroidUsbSocket*> AndroidUsbSockets;
149   AndroidUsbSockets sockets_;
150 
151   // Outgoing bulk queue
152   typedef std::pair<scoped_refptr<net::IOBuffer>, size_t> BulkMessage;
153   std::queue<BulkMessage> outgoing_queue_;
154 
155   // Outgoing messages pending connect
156   typedef std::vector<scoped_refptr<AdbMessage> > PendingMessages;
157   PendingMessages pending_messages_;
158 
159   DISALLOW_COPY_AND_ASSIGN(AndroidUsbDevice);
160 };
161 
162 #endif  // CHROME_BROWSER_DEVTOOLS_ADB_ANDROID_USB_DEVICE_H_
163