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