10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/devtools/device/usb/android_usb_socket.h" 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/message_loop/message_loop.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace { 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst int kMaxPayload = 4096; 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochAndroidUsbSocket::IORequest::IORequest( 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch net::IOBuffer* buffer, 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int length, 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const net::CompletionCallback& callback) 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : buffer(buffer), 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch length(length), 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch callback(callback) { 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochAndroidUsbSocket::IORequest::~IORequest() { 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochAndroidUsbSocket::AndroidUsbSocket(scoped_refptr<AndroidUsbDevice> device, 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch uint32 socket_id, 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& command, 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Callback<void(uint32)> delete_callback) 31558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch : device_(device), 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch command_(command), 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch delete_callback_(delete_callback), 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch local_id_(socket_id), 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch remote_id_(0), 36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch is_connected_(false) { 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochAndroidUsbSocket::~AndroidUsbSocket() { 40558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DCHECK(CalledOnValidThread()); 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (is_connected_) 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Disconnect(); 43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!delete_callback_.is_null()) 44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch delete_callback_.Run(local_id_); 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AndroidUsbSocket::HandleIncoming(scoped_refptr<AdbMessage> message) { 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!device_.get()) 49a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CHECK_EQ(message->arg1, local_id_); 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch switch (message->command) { 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case AdbMessage::kCommandOKAY: 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!is_connected_) { 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch remote_id_ = message->arg0; 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch is_connected_ = true; 577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch net::CompletionCallback callback = connect_callback_; 587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch connect_callback_.Reset(); 597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch callback.Run(net::OK); 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // "this" can be NULL. 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RespondToWriters(); 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // "this" can be NULL. 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case AdbMessage::kCommandWRTE: 677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch device_->Send(AdbMessage::kCommandOKAY, local_id_, message->arg0, ""); 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch read_buffer_ += message->body; 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Allow WRTE over new connection even though OKAY ack was not received. 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!is_connected_) { 717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch remote_id_ = message->arg0; 727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch is_connected_ = true; 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch net::CompletionCallback callback = connect_callback_; 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch connect_callback_.Reset(); 757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch callback.Run(net::OK); 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // "this" can be NULL. 777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else { 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch RespondToReaders(false); 797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // "this" can be NULL. 807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case AdbMessage::kCommandCLSE: 837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (is_connected_) 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch device_->Send(AdbMessage::kCommandCLSE, local_id_, 0, ""); 8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Terminated(true); 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // "this" can be NULL. 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch default: 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void AndroidUsbSocket::Terminated(bool closed_by_device) { 947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch is_connected_ = false; 95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Break the socket -> device connection, release the device. 97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch delete_callback_.Run(local_id_); 98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch delete_callback_.Reset(); 99a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch device_ = NULL; 100a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (!closed_by_device) 10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return; 10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 104a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Respond to pending callbacks. 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!connect_callback_.is_null()) { 1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch net::CompletionCallback callback = connect_callback_; 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch connect_callback_.Reset(); 1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch callback.Run(net::ERR_FAILED); 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // "this" can be NULL. 1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch RespondToReaders(true); 1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint AndroidUsbSocket::Read(net::IOBuffer* buffer, 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int length, 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const net::CompletionCallback& callback) { 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!is_connected_) 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return device_.get() ? net::ERR_SOCKET_NOT_CONNECTED : 0; 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (read_buffer_.empty()) { 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch read_requests_.push_back(IORequest(buffer, length, callback)); 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return net::ERR_IO_PENDING; 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t bytes_to_copy = static_cast<size_t>(length) > read_buffer_.length() ? 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch read_buffer_.length() : static_cast<size_t>(length); 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch memcpy(buffer->data(), read_buffer_.data(), bytes_to_copy); 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (read_buffer_.length() > bytes_to_copy) 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch read_buffer_ = read_buffer_.substr(bytes_to_copy); 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else 132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch read_buffer_ = ""; 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return bytes_to_copy; 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint AndroidUsbSocket::Write(net::IOBuffer* buffer, 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int length, 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const net::CompletionCallback& callback) { 139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!is_connected_) 140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return net::ERR_SOCKET_NOT_CONNECTED; 141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (length > kMaxPayload) 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch length = kMaxPayload; 144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch write_requests_.push_back(IORequest(NULL, length, callback)); 145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch device_->Send(AdbMessage::kCommandWRTE, local_id_, remote_id_, 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string(buffer->data(), length)); 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return net::ERR_IO_PENDING; 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint AndroidUsbSocket::SetReceiveBufferSize(int32 size) { 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTIMPLEMENTED(); 152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return net::ERR_NOT_IMPLEMENTED; 153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint AndroidUsbSocket::SetSendBufferSize(int32 size) { 156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTIMPLEMENTED(); 157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return net::ERR_NOT_IMPLEMENTED; 158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint AndroidUsbSocket::Connect(const net::CompletionCallback& callback) { 161558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DCHECK(CalledOnValidThread()); 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!device_.get()) 1637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return net::ERR_FAILED; 164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch connect_callback_ = callback; 165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch device_->Send(AdbMessage::kCommandOPEN, local_id_, 0, command_); 166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return net::ERR_IO_PENDING; 167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AndroidUsbSocket::Disconnect() { 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!device_.get()) 171a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 172ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch device_->Send(AdbMessage::kCommandCLSE, local_id_, remote_id_, ""); 17303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Terminated(false); 174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AndroidUsbSocket::IsConnected() const { 177558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DCHECK(CalledOnValidThread()); 178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return is_connected_; 179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AndroidUsbSocket::IsConnectedAndIdle() const { 182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTIMPLEMENTED(); 183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint AndroidUsbSocket::GetPeerAddress(net::IPEndPoint* address) const { 187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch net::IPAddressNumber ip(net::kIPv4AddressSize); 188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *address = net::IPEndPoint(ip, 0); 189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return net::OK; 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint AndroidUsbSocket::GetLocalAddress(net::IPEndPoint* address) const { 193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTIMPLEMENTED(); 194c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return net::ERR_NOT_IMPLEMENTED; 195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst net::BoundNetLog& AndroidUsbSocket::NetLog() const { 198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return net_log_; 199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AndroidUsbSocket::SetSubresourceSpeculation() { 202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTIMPLEMENTED(); 203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AndroidUsbSocket::SetOmniboxSpeculation() { 206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTIMPLEMENTED(); 207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AndroidUsbSocket::WasEverUsed() const { 210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTIMPLEMENTED(); 211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AndroidUsbSocket::UsingTCPFastOpen() const { 215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTIMPLEMENTED(); 216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AndroidUsbSocket::WasNpnNegotiated() const { 220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTIMPLEMENTED(); 221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnet::NextProto AndroidUsbSocket::GetNegotiatedProtocol() const { 225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTIMPLEMENTED(); 226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return net::kProtoUnknown; 227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AndroidUsbSocket::GetSSLInfo(net::SSLInfo* ssl_info) { 230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AndroidUsbSocket::RespondToReaders(bool disconnect) { 234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::deque<IORequest> read_requests; 235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch read_requests.swap(read_requests_); 236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch while (!read_requests.empty() && (!read_buffer_.empty() || disconnect)) { 237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IORequest read_request = read_requests.front(); 238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch read_requests.pop_front(); 239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t bytes_to_copy = 240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch static_cast<size_t>(read_request.length) > read_buffer_.length() ? 241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch read_buffer_.length() : static_cast<size_t>(read_request.length); 242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch memcpy(read_request.buffer->data(), read_buffer_.data(), bytes_to_copy); 243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (read_buffer_.length() > bytes_to_copy) 244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch read_buffer_ = read_buffer_.substr(bytes_to_copy); 245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else 246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch read_buffer_ = ""; 247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch read_request.callback.Run(bytes_to_copy); 248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AndroidUsbSocket::RespondToWriters() { 252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!write_requests_.empty()) { 253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IORequest write_request = write_requests_.front(); 254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch write_requests_.pop_front(); 255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch write_request.callback.Run(write_request.length); 256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 258