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