//===-- AdbClient.h ---------------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLDB_SOURCE_PLUGINS_PLATFORM_ANDROID_ADBCLIENT_H #define LLDB_SOURCE_PLUGINS_PLATFORM_ANDROID_ADBCLIENT_H #include "lldb/Utility/Status.h" #include "llvm/Support/Error.h" #include #include #include #include #include #include namespace lldb_private { class FileSpec; namespace platform_android { class AdbClient { public: enum UnixSocketNamespace { UnixSocketNamespaceAbstract, UnixSocketNamespaceFileSystem, }; using DeviceIDList = std::list; /// Resolves a device identifier to its canonical form. /// /// \param device_id the device identifier to resolve (may be empty). /// /// \returns Expected containing the resolved device ID on /// success, or an Error if the device ID cannot be resolved or /// is ambiguous. static llvm::Expected ResolveDeviceID(llvm::StringRef device_id); AdbClient(); explicit AdbClient(llvm::StringRef device_id); virtual ~AdbClient(); llvm::StringRef GetDeviceID() const; Status SetPortForwarding(const uint16_t local_port, const uint16_t remote_port); Status SetPortForwarding(const uint16_t local_port, llvm::StringRef remote_socket_name, const UnixSocketNamespace socket_namespace); Status DeletePortForwarding(const uint16_t local_port); Status Shell(const char *command, std::chrono::milliseconds timeout, std::string *output); virtual Status ShellToFile(const char *command, std::chrono::milliseconds timeout, const FileSpec &output_file_spec); Status Connect(); private: Status SendDeviceMessage(llvm::StringRef packet); Status ReadMessageStream(std::vector &message, std::chrono::milliseconds timeout); Status internalShell(const char *command, std::chrono::milliseconds timeout, std::vector &output_buf); std::string m_device_id; std::unique_ptr m_conn; }; class AdbSyncService { public: explicit AdbSyncService(const std::string device_id); virtual ~AdbSyncService(); Status SetupSyncConnection(); virtual Status PullFile(const FileSpec &remote_file, const FileSpec &local_file); virtual Status PushFile(const FileSpec &local_file, const FileSpec &remote_file); virtual Status Stat(const FileSpec &remote_file, uint32_t &mode, uint32_t &size, uint32_t &mtime); virtual bool IsConnected() const; llvm::StringRef GetDeviceId() const { return m_device_id; } private: Status SendSyncRequest(const char *request_id, const uint32_t data_len, const void *data); Status ReadSyncHeader(std::string &response_id, uint32_t &data_len); Status PullFileChunk(std::vector &buffer, bool &eof); Status PullFileImpl(const FileSpec &remote_file, const FileSpec &local_file); Status PushFileImpl(const FileSpec &local_file, const FileSpec &remote_file); Status StatImpl(const FileSpec &remote_file, uint32_t &mode, uint32_t &size, uint32_t &mtime); Status ExecuteCommand(const std::function &cmd); std::unique_ptr m_conn; std::string m_device_id; }; } // namespace platform_android } // namespace lldb_private #endif // LLDB_SOURCE_PLUGINS_PLATFORM_ANDROID_ADBCLIENT_H