Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
516 changes: 266 additions & 250 deletions lldb/source/Plugins/Platform/Android/AdbClient.cpp

Large diffs are not rendered by default.

110 changes: 42 additions & 68 deletions lldb/source/Plugins/Platform/Android/AdbClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#define LLDB_SOURCE_PLUGINS_PLATFORM_ANDROID_ADBCLIENT_H

#include "lldb/Utility/Status.h"
#include "llvm/Support/Error.h"
#include <chrono>
#include <functional>
#include <list>
Expand All @@ -32,59 +33,21 @@ class AdbClient {

using DeviceIDList = std::list<std::string>;

class SyncService {
friend class AdbClient;

public:
virtual ~SyncService();

virtual Status PullFile(const FileSpec &remote_file,
const FileSpec &local_file);

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);

bool IsConnected() const;

protected:
explicit SyncService(std::unique_ptr<Connection> &&conn);

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<char> &buffer, bool &eof);

Status ReadAllBytes(void *buffer, size_t size);

Status internalPullFile(const FileSpec &remote_file,
const FileSpec &local_file);

Status internalPushFile(const FileSpec &local_file,
const FileSpec &remote_file);

Status internalStat(const FileSpec &remote_file, uint32_t &mode,
uint32_t &size, uint32_t &mtime);

Status executeCommand(const std::function<Status()> &cmd);

std::unique_ptr<Connection> m_conn;
};

static Status CreateByDeviceID(const std::string &device_id, AdbClient &adb);
/// Resolves a device identifier to its canonical form.
///
/// \param device_id the device identifier to resolve (may be empty).
///
/// \returns Expected<std::string> containing the resolved device ID on
/// success, or an Error if the device ID cannot be resolved or
/// is ambiguous.
static llvm::Expected<std::string> ResolveDeviceID(llvm::StringRef device_id);

AdbClient();
explicit AdbClient(const std::string &device_id);
explicit AdbClient(llvm::StringRef device_id);

virtual ~AdbClient();

const std::string &GetDeviceID() const;

Status GetDevices(DeviceIDList &device_list);
llvm::StringRef GetDeviceID() const;

Status SetPortForwarding(const uint16_t local_port,
const uint16_t remote_port);
Expand All @@ -102,39 +65,50 @@ class AdbClient {
std::chrono::milliseconds timeout,
const FileSpec &output_file_spec);

virtual std::unique_ptr<SyncService> GetSyncService(Status &error);

Status SwitchDeviceTransport();

private:
Status Connect();

void SetDeviceID(const std::string &device_id);

Status SendMessage(const std::string &packet, const bool reconnect = true);

Status SendDeviceMessage(const std::string &packet);

Status ReadMessage(std::vector<char> &message);
private:
Status SendDeviceMessage(llvm::StringRef packet);

Status ReadMessageStream(std::vector<char> &message,
std::chrono::milliseconds timeout);

Status GetResponseError(const char *response_id);
Status internalShell(const char *command, std::chrono::milliseconds timeout,
std::vector<char> &output_buf);

Status ReadResponseStatus();
std::string m_device_id;
std::unique_ptr<Connection> m_conn;
};

Status Sync();
class AdbSyncService {
public:
explicit AdbSyncService(const std::string device_id);
virtual ~AdbSyncService();
Status SetupSyncConnection();

Status StartSync();
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;

Status internalShell(const char *command, std::chrono::milliseconds timeout,
std::vector<char> &output_buf);
llvm::StringRef GetDeviceId() const { return m_device_id; }

Status ReadAllBytes(void *buffer, size_t size);
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<char> &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<Status()> &cmd);

std::string m_device_id;
std::unique_ptr<Connection> m_conn;
std::string m_device_id;
};

} // namespace platform_android
Expand Down
Loading