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 #include "lldb/Utility/Status.h"
14 #include <chrono>
15 #include <functional>
16 #include <list>
17 #include <memory>
18 #include <string>
19 #include <vector>
20 
21 namespace lldb_private {
22 
23 class FileSpec;
24 
25 namespace platform_android {
26 
27 class AdbClient {
28 public:
29   enum UnixSocketNamespace {
30     UnixSocketNamespaceAbstract,
31     UnixSocketNamespaceFileSystem,
32   };
33 
34   using DeviceIDList = std::list<std::string>;
35 
36   class SyncService {
37     friend class AdbClient;
38 
39   public:
40     ~SyncService();
41 
42     Status PullFile(const FileSpec &remote_file, const FileSpec &local_file);
43 
44     Status PushFile(const FileSpec &local_file, const FileSpec &remote_file);
45 
46     Status Stat(const FileSpec &remote_file, uint32_t &mode, uint32_t &size,
47                 uint32_t &mtime);
48 
49     bool IsConnected() const;
50 
51   private:
52     explicit SyncService(std::unique_ptr<Connection> &&conn);
53 
54     Status SendSyncRequest(const char *request_id, const uint32_t data_len,
55                            const void *data);
56 
57     Status ReadSyncHeader(std::string &response_id, uint32_t &data_len);
58 
59     Status PullFileChunk(std::vector<char> &buffer, bool &eof);
60 
61     Status ReadAllBytes(void *buffer, size_t size);
62 
63     Status internalPullFile(const FileSpec &remote_file,
64                             const FileSpec &local_file);
65 
66     Status internalPushFile(const FileSpec &local_file,
67                             const FileSpec &remote_file);
68 
69     Status internalStat(const FileSpec &remote_file, uint32_t &mode,
70                         uint32_t &size, uint32_t &mtime);
71 
72     Status executeCommand(const std::function<Status()> &cmd);
73 
74     std::unique_ptr<Connection> m_conn;
75   };
76 
77   static Status CreateByDeviceID(const std::string &device_id, AdbClient &adb);
78 
79   AdbClient();
80   explicit AdbClient(const std::string &device_id);
81 
82   ~AdbClient();
83 
84   const std::string &GetDeviceID() const;
85 
86   Status GetDevices(DeviceIDList &device_list);
87 
88   Status SetPortForwarding(const uint16_t local_port,
89                            const uint16_t remote_port);
90 
91   Status SetPortForwarding(const uint16_t local_port,
92                            llvm::StringRef remote_socket_name,
93                            const UnixSocketNamespace socket_namespace);
94 
95   Status DeletePortForwarding(const uint16_t local_port);
96 
97   Status Shell(const char *command, std::chrono::milliseconds timeout,
98                std::string *output);
99 
100   Status ShellToFile(const char *command, std::chrono::milliseconds timeout,
101                      const FileSpec &output_file_spec);
102 
103   std::unique_ptr<SyncService> GetSyncService(Status &error);
104 
105   Status SwitchDeviceTransport();
106 
107 private:
108   Status Connect();
109 
110   void SetDeviceID(const std::string &device_id);
111 
112   Status SendMessage(const std::string &packet, const bool reconnect = true);
113 
114   Status SendDeviceMessage(const std::string &packet);
115 
116   Status ReadMessage(std::vector<char> &message);
117 
118   Status ReadMessageStream(std::vector<char> &message,
119                            std::chrono::milliseconds timeout);
120 
121   Status GetResponseError(const char *response_id);
122 
123   Status ReadResponseStatus();
124 
125   Status Sync();
126 
127   Status StartSync();
128 
129   Status internalShell(const char *command, std::chrono::milliseconds timeout,
130                        std::vector<char> &output_buf);
131 
132   Status ReadAllBytes(void *buffer, size_t size);
133 
134   std::string m_device_id;
135   std::unique_ptr<Connection> m_conn;
136 };
137 
138 } // namespace platform_android
139 } // namespace lldb_private
140 
141 #endif // liblldb_AdbClient_h_
142