1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file.
4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef CHROME_BROWSER_DEVTOOLS_DEVICE_USB_ANDROID_USB_SOCKET_H_
6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define CHROME_BROWSER_DEVTOOLS_DEVICE_USB_ANDROID_USB_SOCKET_H_
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <deque>
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/memory/ref_counted.h"
11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/threading/non_thread_safe.h"
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/devtools/device/usb/android_usb_device.h"
13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "net/base/ip_endpoint.h"
14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "net/base/net_errors.h"
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "net/socket/stream_socket.h"
16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace base {
18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class MessageLoop;
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass AdbMessage;
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class AndroidUsbSocket : public net::StreamSocket,
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         public base::NonThreadSafe {
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public:
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  AndroidUsbSocket(scoped_refptr<AndroidUsbDevice> device,
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   uint32 socket_id,
28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   const std::string& command,
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   base::Callback<void(uint32)> delete_callback);
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual ~AndroidUsbSocket();
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void HandleIncoming(scoped_refptr<AdbMessage> message);
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void Terminated(bool closed_by_device);
3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // net::StreamSocket implementation.
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual int Read(net::IOBuffer* buf, int buf_len,
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   const net::CompletionCallback& callback) OVERRIDE;
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual int Write(net::IOBuffer* buf, int buf_len,
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    const net::CompletionCallback& callback) OVERRIDE;
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual int SetReceiveBufferSize(int32 size) OVERRIDE;
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual int SetSendBufferSize(int32 size) OVERRIDE;
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual int Connect(const net::CompletionCallback& callback) OVERRIDE;
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void Disconnect() OVERRIDE;
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual bool IsConnected() const OVERRIDE;
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool IsConnectedAndIdle() const OVERRIDE;
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual int GetPeerAddress(net::IPEndPoint* address) const OVERRIDE;
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual int GetLocalAddress(net::IPEndPoint* address) const OVERRIDE;
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual const net::BoundNetLog& NetLog() const OVERRIDE;
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void SetSubresourceSpeculation() OVERRIDE;
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void SetOmniboxSpeculation() OVERRIDE;
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual bool WasEverUsed() const OVERRIDE;
53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual bool UsingTCPFastOpen() const OVERRIDE;
54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual bool WasNpnNegotiated() const OVERRIDE;
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual net::NextProto GetNegotiatedProtocol() const OVERRIDE;
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual bool GetSSLInfo(net::SSLInfo* ssl_info) OVERRIDE;
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  class IORequest {
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   public:
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    IORequest(net::IOBuffer* buffer,
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              int length,
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              const net::CompletionCallback& callback);
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ~IORequest();
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    scoped_refptr<net::IOBuffer> buffer;
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    int length;
68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    net::CompletionCallback callback;
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  };
7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void RespondToReaders(bool diconnect);
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void RespondToWriters();
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<AndroidUsbDevice> device_;
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string command_;
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::Callback<void(uint32)> delete_callback_;
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  uint32 local_id_;
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  uint32 remote_id_;
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  net::BoundNetLog net_log_;
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool is_connected_;
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string read_buffer_;
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  net::CompletionCallback connect_callback_;
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::deque<IORequest> read_requests_;
84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::deque<IORequest> write_requests_;
85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AndroidUsbSocket);
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif  // CHROME_BROWSER_DEVTOOLS_DEVICE_USB_ANDROID_USB_SOCKET_H_
90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)