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