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