118 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLDB_SOURCE_PLUGINS_PLATFORM_ANDROID_ADBCLIENT_H10#define LLDB_SOURCE_PLUGINS_PLATFORM_ANDROID_ADBCLIENT_H11 12#include "lldb/Utility/Status.h"13#include "llvm/Support/Error.h"14#include <chrono>15#include <functional>16#include <list>17#include <memory>18#include <string>19#include <vector>20 21namespace lldb_private {22 23class FileSpec;24 25namespace platform_android {26 27class AdbClient {28public:29 enum UnixSocketNamespace {30 UnixSocketNamespaceAbstract,31 UnixSocketNamespaceFileSystem,32 };33 34 using DeviceIDList = std::list<std::string>;35 36 /// Resolves a device identifier to its canonical form.37 ///38 /// \param device_id the device identifier to resolve (may be empty).39 ///40 /// \returns Expected<std::string> containing the resolved device ID on41 /// success, or an Error if the device ID cannot be resolved or42 /// is ambiguous.43 static llvm::Expected<std::string> ResolveDeviceID(llvm::StringRef device_id);44 45 AdbClient();46 explicit AdbClient(llvm::StringRef device_id);47 48 virtual ~AdbClient();49 50 llvm::StringRef GetDeviceID() const;51 52 Status SetPortForwarding(const uint16_t local_port,53 const uint16_t remote_port);54 55 Status SetPortForwarding(const uint16_t local_port,56 llvm::StringRef remote_socket_name,57 const UnixSocketNamespace socket_namespace);58 59 Status DeletePortForwarding(const uint16_t local_port);60 61 Status Shell(const char *command, std::chrono::milliseconds timeout,62 std::string *output);63 64 virtual Status ShellToFile(const char *command,65 std::chrono::milliseconds timeout,66 const FileSpec &output_file_spec);67 68 Status Connect();69 70private:71 Status SendDeviceMessage(llvm::StringRef packet);72 73 Status ReadMessageStream(std::vector<char> &message,74 std::chrono::milliseconds timeout);75 76 Status internalShell(const char *command, std::chrono::milliseconds timeout,77 std::vector<char> &output_buf);78 79 std::string m_device_id;80 std::unique_ptr<Connection> m_conn;81};82 83class AdbSyncService {84public:85 explicit AdbSyncService(const std::string device_id);86 virtual ~AdbSyncService();87 Status SetupSyncConnection();88 89 virtual Status PullFile(const FileSpec &remote_file,90 const FileSpec &local_file);91 virtual Status PushFile(const FileSpec &local_file,92 const FileSpec &remote_file);93 virtual Status Stat(const FileSpec &remote_file, uint32_t &mode,94 uint32_t &size, uint32_t &mtime);95 virtual bool IsConnected() const;96 97 llvm::StringRef GetDeviceId() const { return m_device_id; }98 99private:100 Status SendSyncRequest(const char *request_id, const uint32_t data_len,101 const void *data);102 Status ReadSyncHeader(std::string &response_id, uint32_t &data_len);103 Status PullFileChunk(std::vector<char> &buffer, bool &eof);104 Status PullFileImpl(const FileSpec &remote_file, const FileSpec &local_file);105 Status PushFileImpl(const FileSpec &local_file, const FileSpec &remote_file);106 Status StatImpl(const FileSpec &remote_file, uint32_t &mode, uint32_t &size,107 uint32_t &mtime);108 Status ExecuteCommand(const std::function<Status()> &cmd);109 110 std::unique_ptr<Connection> m_conn;111 std::string m_device_id;112};113 114} // namespace platform_android115} // namespace lldb_private116 117#endif // LLDB_SOURCE_PLUGINS_PLATFORM_ANDROID_ADBCLIENT_H118