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