xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/Platform/Android/AdbClient.h (revision dda2819751e49c83612958492e38917049128b41)
1061da546Spatrick //===-- AdbClient.h ---------------------------------------------*- C++ -*-===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick 
9*dda28197Spatrick #ifndef LLDB_SOURCE_PLUGINS_PLATFORM_ANDROID_ADBCLIENT_H
10*dda28197Spatrick #define LLDB_SOURCE_PLUGINS_PLATFORM_ANDROID_ADBCLIENT_H
11061da546Spatrick 
12061da546Spatrick #include "lldb/Utility/Status.h"
13061da546Spatrick #include <chrono>
14061da546Spatrick #include <functional>
15061da546Spatrick #include <list>
16061da546Spatrick #include <memory>
17061da546Spatrick #include <string>
18061da546Spatrick #include <vector>
19061da546Spatrick 
20061da546Spatrick namespace lldb_private {
21061da546Spatrick 
22061da546Spatrick class FileSpec;
23061da546Spatrick 
24061da546Spatrick namespace platform_android {
25061da546Spatrick 
26061da546Spatrick class AdbClient {
27061da546Spatrick public:
28061da546Spatrick   enum UnixSocketNamespace {
29061da546Spatrick     UnixSocketNamespaceAbstract,
30061da546Spatrick     UnixSocketNamespaceFileSystem,
31061da546Spatrick   };
32061da546Spatrick 
33061da546Spatrick   using DeviceIDList = std::list<std::string>;
34061da546Spatrick 
35061da546Spatrick   class SyncService {
36061da546Spatrick     friend class AdbClient;
37061da546Spatrick 
38061da546Spatrick   public:
39061da546Spatrick     ~SyncService();
40061da546Spatrick 
41061da546Spatrick     Status PullFile(const FileSpec &remote_file, const FileSpec &local_file);
42061da546Spatrick 
43061da546Spatrick     Status PushFile(const FileSpec &local_file, const FileSpec &remote_file);
44061da546Spatrick 
45061da546Spatrick     Status Stat(const FileSpec &remote_file, uint32_t &mode, uint32_t &size,
46061da546Spatrick                 uint32_t &mtime);
47061da546Spatrick 
48061da546Spatrick     bool IsConnected() const;
49061da546Spatrick 
50061da546Spatrick   private:
51061da546Spatrick     explicit SyncService(std::unique_ptr<Connection> &&conn);
52061da546Spatrick 
53061da546Spatrick     Status SendSyncRequest(const char *request_id, const uint32_t data_len,
54061da546Spatrick                            const void *data);
55061da546Spatrick 
56061da546Spatrick     Status ReadSyncHeader(std::string &response_id, uint32_t &data_len);
57061da546Spatrick 
58061da546Spatrick     Status PullFileChunk(std::vector<char> &buffer, bool &eof);
59061da546Spatrick 
60061da546Spatrick     Status ReadAllBytes(void *buffer, size_t size);
61061da546Spatrick 
62061da546Spatrick     Status internalPullFile(const FileSpec &remote_file,
63061da546Spatrick                             const FileSpec &local_file);
64061da546Spatrick 
65061da546Spatrick     Status internalPushFile(const FileSpec &local_file,
66061da546Spatrick                             const FileSpec &remote_file);
67061da546Spatrick 
68061da546Spatrick     Status internalStat(const FileSpec &remote_file, uint32_t &mode,
69061da546Spatrick                         uint32_t &size, uint32_t &mtime);
70061da546Spatrick 
71061da546Spatrick     Status executeCommand(const std::function<Status()> &cmd);
72061da546Spatrick 
73061da546Spatrick     std::unique_ptr<Connection> m_conn;
74061da546Spatrick   };
75061da546Spatrick 
76061da546Spatrick   static Status CreateByDeviceID(const std::string &device_id, AdbClient &adb);
77061da546Spatrick 
78061da546Spatrick   AdbClient();
79061da546Spatrick   explicit AdbClient(const std::string &device_id);
80061da546Spatrick 
81061da546Spatrick   ~AdbClient();
82061da546Spatrick 
83061da546Spatrick   const std::string &GetDeviceID() const;
84061da546Spatrick 
85061da546Spatrick   Status GetDevices(DeviceIDList &device_list);
86061da546Spatrick 
87061da546Spatrick   Status SetPortForwarding(const uint16_t local_port,
88061da546Spatrick                            const uint16_t remote_port);
89061da546Spatrick 
90061da546Spatrick   Status SetPortForwarding(const uint16_t local_port,
91061da546Spatrick                            llvm::StringRef remote_socket_name,
92061da546Spatrick                            const UnixSocketNamespace socket_namespace);
93061da546Spatrick 
94061da546Spatrick   Status DeletePortForwarding(const uint16_t local_port);
95061da546Spatrick 
96061da546Spatrick   Status Shell(const char *command, std::chrono::milliseconds timeout,
97061da546Spatrick                std::string *output);
98061da546Spatrick 
99061da546Spatrick   Status ShellToFile(const char *command, std::chrono::milliseconds timeout,
100061da546Spatrick                      const FileSpec &output_file_spec);
101061da546Spatrick 
102061da546Spatrick   std::unique_ptr<SyncService> GetSyncService(Status &error);
103061da546Spatrick 
104061da546Spatrick   Status SwitchDeviceTransport();
105061da546Spatrick 
106061da546Spatrick private:
107061da546Spatrick   Status Connect();
108061da546Spatrick 
109061da546Spatrick   void SetDeviceID(const std::string &device_id);
110061da546Spatrick 
111061da546Spatrick   Status SendMessage(const std::string &packet, const bool reconnect = true);
112061da546Spatrick 
113061da546Spatrick   Status SendDeviceMessage(const std::string &packet);
114061da546Spatrick 
115061da546Spatrick   Status ReadMessage(std::vector<char> &message);
116061da546Spatrick 
117061da546Spatrick   Status ReadMessageStream(std::vector<char> &message,
118061da546Spatrick                            std::chrono::milliseconds timeout);
119061da546Spatrick 
120061da546Spatrick   Status GetResponseError(const char *response_id);
121061da546Spatrick 
122061da546Spatrick   Status ReadResponseStatus();
123061da546Spatrick 
124061da546Spatrick   Status Sync();
125061da546Spatrick 
126061da546Spatrick   Status StartSync();
127061da546Spatrick 
128061da546Spatrick   Status internalShell(const char *command, std::chrono::milliseconds timeout,
129061da546Spatrick                        std::vector<char> &output_buf);
130061da546Spatrick 
131061da546Spatrick   Status ReadAllBytes(void *buffer, size_t size);
132061da546Spatrick 
133061da546Spatrick   std::string m_device_id;
134061da546Spatrick   std::unique_ptr<Connection> m_conn;
135061da546Spatrick };
136061da546Spatrick 
137061da546Spatrick } // namespace platform_android
138061da546Spatrick } // namespace lldb_private
139061da546Spatrick 
140*dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_PLATFORM_ANDROID_ADBCLIENT_H
141