| Index: chrome/browser/devtools/adb_client_socket.cc
|
| diff --git a/chrome/browser/devtools/adb_client_socket.cc b/chrome/browser/devtools/adb_client_socket.cc
|
| index 342a09854bb4ad6c5c50e2f88a36118e2ed3a427..a64171d7b8e914d1ea459f5e652e8c38294a71aa 100644
|
| --- a/chrome/browser/devtools/adb_client_socket.cc
|
| +++ b/chrome/browser/devtools/adb_client_socket.cc
|
| @@ -38,141 +38,14 @@ std::string EncodeMessage(const std::string& message) {
|
| return result + message;
|
| }
|
|
|
| -class AdbSocket {
|
| - public:
|
| - AdbSocket(const std::string& host, int port) : host_(host), port_(port) {
|
| - }
|
| -
|
| - ~AdbSocket() {
|
| - }
|
| -
|
| - protected:
|
| - void Connect(const net::CompletionCallback& callback) {
|
| - net::IPAddressNumber ip_number;
|
| - if (!net::ParseIPLiteralToNumber(host_, &ip_number)) {
|
| - callback.Run(net::ERR_FAILED);
|
| - return;
|
| - }
|
| -
|
| - net::AddressList address_list =
|
| - net::AddressList::CreateFromIPAddress(ip_number, port_);
|
| - socket_.reset(new net::TCPClientSocket(address_list, NULL,
|
| - net::NetLog::Source()));
|
| - int result = socket_->Connect(callback);
|
| - if (result != net::ERR_IO_PENDING)
|
| - callback.Run(result);
|
| - }
|
| -
|
| - void SendCommand(const std::string& command,
|
| - bool is_void,
|
| - const CommandCallback& callback) {
|
| - scoped_refptr<net::StringIOBuffer> request_buffer =
|
| - new net::StringIOBuffer(EncodeMessage(command));
|
| - int result = socket_->Write(request_buffer, request_buffer->size(),
|
| - base::Bind(&AdbSocket::ReadResponse, base::Unretained(this),
|
| - callback, is_void));
|
| - if (result != net::ERR_IO_PENDING)
|
| - ReadResponse(callback, is_void, result);
|
| - }
|
| -
|
| - scoped_ptr<net::TCPClientSocket> socket_;
|
| -
|
| - private:
|
| - void ReadResponse(const CommandCallback& callback, bool is_void, int result) {
|
| - if (result < 0) {
|
| - callback.Run(result, "IO error");
|
| - return;
|
| - }
|
| - scoped_refptr<net::IOBuffer> response_buffer =
|
| - new net::IOBuffer(kBufferSize);
|
| - result = socket_->Read(response_buffer, kBufferSize,
|
| - base::Bind(&AdbSocket::OnResponseHeader, base::Unretained(this),
|
| - callback, is_void, response_buffer));
|
| - if (result != net::ERR_IO_PENDING)
|
| - OnResponseHeader(callback, is_void, response_buffer, result);
|
| - }
|
| -
|
| - void OnResponseHeader(const CommandCallback& callback,
|
| - bool is_void,
|
| - scoped_refptr<net::IOBuffer> response_buffer,
|
| - int result) {
|
| - if (result < 0) {
|
| - callback.Run(result, "IO error");
|
| - return;
|
| - }
|
| -
|
| - std::string data = std::string(response_buffer->data(), result);
|
| - if (result < 4) {
|
| - callback.Run(net::ERR_FAILED, "Response is too short: " + data);
|
| - return;
|
| - }
|
| -
|
| - std::string status = data.substr(0, 4);
|
| - if (status != kOkayResponse) {
|
| - callback.Run(net::ERR_FAILED, data);
|
| - return;
|
| - }
|
| -
|
| - data = data.substr(4);
|
| -
|
| - if (!is_void) {
|
| - int payload_length = 0;
|
| - int bytes_left = -1;
|
| - if (data.length() >= 4 &&
|
| - base::HexStringToInt(data.substr(0, 4), &payload_length)) {
|
| - data = data.substr(4);
|
| - bytes_left = payload_length - result + 8;
|
| - } else {
|
| - bytes_left = -1;
|
| - }
|
| - OnResponseData(callback, data, response_buffer, bytes_left, 0);
|
| - } else {
|
| - callback.Run(net::OK, data);
|
| - }
|
| - }
|
| -
|
| - void OnResponseData(const CommandCallback& callback,
|
| - const std::string& response,
|
| - scoped_refptr<net::IOBuffer> response_buffer,
|
| - int bytes_left,
|
| - int result) {
|
| - if (result < 0) {
|
| - callback.Run(result, "IO error");
|
| - return;
|
| - }
|
| -
|
| - bytes_left -= result;
|
| - std::string new_response =
|
| - response + std::string(response_buffer->data(), result);
|
| - if (bytes_left == 0) {
|
| - callback.Run(net::OK, new_response);
|
| - return;
|
| - }
|
| -
|
| - // Read tail
|
| - result = socket_->Read(response_buffer, kBufferSize,
|
| - base::Bind(&AdbSocket::OnResponseData, base::Unretained(this),
|
| - callback, new_response, response_buffer, bytes_left));
|
| - if (result > 0) {
|
| - OnResponseData(callback, new_response, response_buffer, bytes_left,
|
| - result);
|
| - } else if (result != net::ERR_IO_PENDING) {
|
| - callback.Run(net::OK, new_response);
|
| - }
|
| - }
|
| -
|
| - std::string host_;
|
| - int port_;
|
| -};
|
| -
|
| -class AdbTransportSocket : public AdbSocket {
|
| +class AdbTransportSocket : public AdbClientSocket {
|
| public:
|
| AdbTransportSocket(const std::string& host,
|
| int port,
|
| const std::string& serial,
|
| const std::string& socket_name,
|
| const SocketCallback& callback)
|
| - : AdbSocket(host, port),
|
| + : AdbClientSocket(host, port),
|
| serial_(serial),
|
| socket_name_(socket_name),
|
| callback_(callback) {
|
| @@ -294,6 +167,10 @@ class HttpOverAdbSocket {
|
| int result) {
|
| if (!CheckNetResultOrDie(result))
|
| return;
|
| + if (result == 0) {
|
| + CheckNetResultOrDie(net::ERR_CONNECTION_CLOSED);
|
| + return;
|
| + }
|
|
|
| response_ += std::string(response_buffer->data(), result);
|
| int expected_length = 0;
|
| @@ -354,13 +231,13 @@ class HttpOverAdbSocket {
|
| size_t body_pos_;
|
| };
|
|
|
| -class AdbQuerySocket : AdbSocket {
|
| +class AdbQuerySocket : AdbClientSocket {
|
| public:
|
| AdbQuerySocket(const std::string& host,
|
| int port,
|
| const std::string& query,
|
| const CommandCallback& callback)
|
| - : AdbSocket(host, port),
|
| + : AdbClientSocket(host, port),
|
| current_query_(0),
|
| callback_(callback) {
|
| if (Tokenize(query, "|", &queries_) == 0) {
|
| @@ -373,7 +250,6 @@ class AdbQuerySocket : AdbSocket {
|
|
|
| private:
|
| ~AdbQuerySocket() {
|
| -
|
| }
|
|
|
| void SendNextQuery(int result) {
|
| @@ -440,8 +316,123 @@ void AdbClientSocket::HttpQuery(int port,
|
| callback);
|
| }
|
|
|
| -AdbClientSocket::AdbClientSocket() {
|
| +AdbClientSocket::AdbClientSocket(const std::string& host, int port)
|
| + : host_(host), port_(port) {
|
| }
|
|
|
| AdbClientSocket::~AdbClientSocket() {
|
| }
|
| +
|
| +void AdbClientSocket::Connect(const net::CompletionCallback& callback) {
|
| + net::IPAddressNumber ip_number;
|
| + if (!net::ParseIPLiteralToNumber(host_, &ip_number)) {
|
| + callback.Run(net::ERR_FAILED);
|
| + return;
|
| + }
|
| +
|
| + net::AddressList address_list =
|
| + net::AddressList::CreateFromIPAddress(ip_number, port_);
|
| + socket_.reset(new net::TCPClientSocket(address_list, NULL,
|
| + net::NetLog::Source()));
|
| + int result = socket_->Connect(callback);
|
| + if (result != net::ERR_IO_PENDING)
|
| + callback.Run(result);
|
| +}
|
| +
|
| +void AdbClientSocket::SendCommand(const std::string& command,
|
| + bool is_void,
|
| + const CommandCallback& callback) {
|
| + scoped_refptr<net::StringIOBuffer> request_buffer =
|
| + new net::StringIOBuffer(EncodeMessage(command));
|
| + int result = socket_->Write(request_buffer, request_buffer->size(),
|
| + base::Bind(&AdbClientSocket::ReadResponse, base::Unretained(this),
|
| + callback, is_void));
|
| + if (result != net::ERR_IO_PENDING)
|
| + ReadResponse(callback, is_void, result);
|
| +}
|
| +
|
| +void AdbClientSocket::ReadResponse(const CommandCallback& callback,
|
| + bool is_void,
|
| + int result) {
|
| + if (result < 0) {
|
| + callback.Run(result, "IO error");
|
| + return;
|
| + }
|
| + scoped_refptr<net::IOBuffer> response_buffer =
|
| + new net::IOBuffer(kBufferSize);
|
| + result = socket_->Read(response_buffer, kBufferSize,
|
| + base::Bind(&AdbClientSocket::OnResponseHeader, base::Unretained(this),
|
| + callback, is_void, response_buffer));
|
| + if (result != net::ERR_IO_PENDING)
|
| + OnResponseHeader(callback, is_void, response_buffer, result);
|
| +}
|
| +
|
| +void AdbClientSocket::OnResponseHeader(
|
| + const CommandCallback& callback,
|
| + bool is_void,
|
| + scoped_refptr<net::IOBuffer> response_buffer,
|
| + int result) {
|
| + if (result <= 0) {
|
| + callback.Run(result == 0 ? net::ERR_CONNECTION_CLOSED : result,
|
| + "IO error");
|
| + return;
|
| + }
|
| +
|
| + std::string data = std::string(response_buffer->data(), result);
|
| + if (result < 4) {
|
| + callback.Run(net::ERR_FAILED, "Response is too short: " + data);
|
| + return;
|
| + }
|
| +
|
| + std::string status = data.substr(0, 4);
|
| + if (status != kOkayResponse) {
|
| + callback.Run(net::ERR_FAILED, data);
|
| + return;
|
| + }
|
| +
|
| + data = data.substr(4);
|
| +
|
| + if (!is_void) {
|
| + int payload_length = 0;
|
| + int bytes_left = -1;
|
| + if (data.length() >= 4 &&
|
| + base::HexStringToInt(data.substr(0, 4), &payload_length)) {
|
| + data = data.substr(4);
|
| + bytes_left = payload_length - result + 8;
|
| + } else {
|
| + bytes_left = -1;
|
| + }
|
| + OnResponseData(callback, data, response_buffer, bytes_left, 0);
|
| + } else {
|
| + callback.Run(net::OK, data);
|
| + }
|
| +}
|
| +
|
| +void AdbClientSocket::OnResponseData(
|
| + const CommandCallback& callback,
|
| + const std::string& response,
|
| + scoped_refptr<net::IOBuffer> response_buffer,
|
| + int bytes_left,
|
| + int result) {
|
| + if (result < 0) {
|
| + callback.Run(result, "IO error");
|
| + return;
|
| + }
|
| +
|
| + bytes_left -= result;
|
| + std::string new_response =
|
| + response + std::string(response_buffer->data(), result);
|
| + if (bytes_left == 0) {
|
| + callback.Run(net::OK, new_response);
|
| + return;
|
| + }
|
| +
|
| + // Read tail
|
| + result = socket_->Read(response_buffer, kBufferSize,
|
| + base::Bind(&AdbClientSocket::OnResponseData, base::Unretained(this),
|
| + callback, new_response, response_buffer, bytes_left));
|
| + if (result > 0)
|
| + OnResponseData(callback, new_response, response_buffer, bytes_left, result);
|
| + else if (result != net::ERR_IO_PENDING)
|
| + callback.Run(net::OK, new_response);
|
| +}
|
|
|