1 //===-- AdbClient.h ---------------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef liblldb_AdbClient_h_
11 #define liblldb_AdbClient_h_
12 
13 // C Includes
14 
15 // C++ Includes
16 
17 #include <functional>
18 #include <list>
19 #include <memory>
20 #include <string>
21 #include <vector>
22 
23 // Other libraries and framework includes
24 // Project includes
25 
26 #include "lldb/Core/Error.h"
27 
28 namespace lldb_private {
29 
30 class FileSpec;
31 
32 namespace platform_android {
33 
34 class AdbClient {
35 public:
36   enum UnixSocketNamespace {
37     UnixSocketNamespaceAbstract,
38     UnixSocketNamespaceFileSystem,
39   };
40 
41   using DeviceIDList = std::list<std::string>;
42 
43   class SyncService {
44     friend class AdbClient;
45 
46   public:
47     ~SyncService();
48 
49     Error PullFile(const FileSpec &remote_file, const FileSpec &local_file);
50 
51     Error PushFile(const FileSpec &local_file, const FileSpec &remote_file);
52 
53     Error Stat(const FileSpec &remote_file, uint32_t &mode, uint32_t &size,
54                uint32_t &mtime);
55 
56     bool IsConnected() const;
57 
58   private:
59     explicit SyncService(std::unique_ptr<Connection> &&conn);
60 
61     Error SendSyncRequest(const char *request_id, const uint32_t data_len,
62                           const void *data);
63 
64     Error ReadSyncHeader(std::string &response_id, uint32_t &data_len);
65 
66     Error PullFileChunk(std::vector<char> &buffer, bool &eof);
67 
68     Error ReadAllBytes(void *buffer, size_t size);
69 
70     Error internalPullFile(const FileSpec &remote_file,
71                            const FileSpec &local_file);
72 
73     Error internalPushFile(const FileSpec &local_file,
74                            const FileSpec &remote_file);
75 
76     Error internalStat(const FileSpec &remote_file, uint32_t &mode,
77                        uint32_t &size, uint32_t &mtime);
78 
79     Error executeCommand(const std::function<Error()> &cmd);
80 
81     std::unique_ptr<Connection> m_conn;
82   };
83 
84   static Error CreateByDeviceID(const std::string &device_id, AdbClient &adb);
85 
86   AdbClient();
87   explicit AdbClient(const std::string &device_id);
88 
89   ~AdbClient();
90 
91   const std::string &GetDeviceID() const;
92 
93   Error GetDevices(DeviceIDList &device_list);
94 
95   Error SetPortForwarding(const uint16_t local_port,
96                           const uint16_t remote_port);
97 
98   Error SetPortForwarding(const uint16_t local_port,
99                           const char *remote_socket_name,
100                           const UnixSocketNamespace socket_namespace);
101 
102   Error DeletePortForwarding(const uint16_t local_port);
103 
104   Error Shell(const char *command, uint32_t timeout_ms, std::string *output);
105 
106   Error ShellToFile(const char *command, uint32_t timeout_ms,
107                     const FileSpec &output_file_spec);
108 
109   std::unique_ptr<SyncService> GetSyncService(Error &error);
110 
111   Error SwitchDeviceTransport();
112 
113 private:
114   Error Connect();
115 
116   void SetDeviceID(const std::string &device_id);
117 
118   Error SendMessage(const std::string &packet, const bool reconnect = true);
119 
120   Error SendDeviceMessage(const std::string &packet);
121 
122   Error ReadMessage(std::vector<char> &message);
123 
124   Error ReadMessageStream(std::vector<char> &message, uint32_t timeout_ms);
125 
126   Error GetResponseError(const char *response_id);
127 
128   Error ReadResponseStatus();
129 
130   Error Sync();
131 
132   Error StartSync();
133 
134   Error internalShell(const char *command, uint32_t timeout_ms,
135                       std::vector<char> &output_buf);
136 
137   Error ReadAllBytes(void *buffer, size_t size);
138 
139   std::string m_device_id;
140   std::unique_ptr<Connection> m_conn;
141 };
142 
143 } // namespace platform_android
144 } // namespace lldb_private
145 
146 #endif // liblldb_AdbClient_h_
147