15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An implementation of buzz::AsyncSocket that uses Chrome sockets.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef JINGLE_GLUE_CHROME_ASYNC_SOCKET_H_
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define JINGLE_GLUE_CHROME_ASYNC_SOCKET_H_
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(FEATURE_ENABLE_SSL)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#error ChromeAsyncSocket expects FEATURE_ENABLE_SSL to be defined
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/completion_callback.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/libjingle/source/talk/xmpp/asyncsocket.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IOBufferWithSize;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StreamSocket;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace jingle_glue {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResolvingClientSocketFactory;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChromeAsyncSocket : public buzz::AsyncSocket {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Takes ownership of |resolving_client_socket_factory|.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChromeAsyncSocket(
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ResolvingClientSocketFactory* resolving_client_socket_factory,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size_t read_buf_size,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size_t write_buf_size);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Does not raise any signals.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ChromeAsyncSocket();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // buzz::AsyncSocket implementation.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The current state (see buzz::AsyncSocket::State; all but
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // STATE_CLOSING is used).
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual State state() OVERRIDE;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The last generated error.  Errors are generated when the main
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // functions below return false or when SignalClosed is raised due
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to an asynchronous error.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual Error error() OVERRIDE;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GetError() (which is of type net::Error) != net::OK only when
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // error() == ERROR_WINSOCK.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetError() OVERRIDE;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tries to connect to the given address.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If state() is not STATE_CLOSED, sets error to ERROR_WRONGSTATE
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and returns false.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |address| has an empty hostname or a zero port, sets error to
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ERROR_DNS and returns false.  (We don't use the IP address even
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if it's present, as DNS resolution is done by
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |resolving_client_socket_factory_|.  But it's perfectly fine if
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the hostname is a stringified IP address.)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Otherwise, starts the connection process and returns true.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SignalConnected will be raised when the connection is successful;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // otherwise, SignalClosed will be raised with a net error set.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Connect(const talk_base::SocketAddress& address) OVERRIDE;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tries to read at most |len| bytes into |data|.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If state() is not STATE_TLS_CONNECTING, STATE_OPEN, or
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // STATE_TLS_OPEN, sets error to ERROR_WRONGSTATE and returns false.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Otherwise, fills in |len_read| with the number of bytes read and
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // returns true.  If this is called when state() is
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // STATE_TLS_CONNECTING, reads 0 bytes.  (We have to handle this
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // case because StartTls() is called during a slot connected to
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SignalRead after parsing the final non-TLS reply from the server
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // [see XmppClient::Private::OnSocketRead()].)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Read(char* data, size_t len, size_t* len_read) OVERRIDE;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Queues up |len| bytes of |data| for writing.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If state() is not STATE_TLS_CONNECTING, STATE_OPEN, or
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // STATE_TLS_OPEN, sets error to ERROR_WRONGSTATE and returns false.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the given data is too big for the internal write buffer, sets
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // error to ERROR_WINSOCK/net::ERR_INSUFFICIENT_RESOURCES and
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // returns false.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Otherwise, queues up the data and returns true.  If this is
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // called when state() == STATE_TLS_CONNECTING, the data is will be
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sent only after the TLS connection succeeds.  (See StartTls()
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // below for why this happens.)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that there's no guarantee that the data will actually be
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sent; however, it is guaranteed that the any data sent will be
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sent in FIFO order.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Write(const char* data, size_t len) OVERRIDE;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the socket is not already closed, closes the socket and raises
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SignalClosed.  Always returns true.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Close() OVERRIDE;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tries to change to a TLS connection with the given domain name.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If state() is not STATE_OPEN or there are pending reads or
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // writes, sets error to ERROR_WRONGSTATE and returns false.  (In
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // practice, this means that StartTls() can only be called from a
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // slot connected to SignalRead.)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Otherwise, starts the TLS connection process and returns true.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SignalSSLConnected will be raised when the connection is
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // successful; otherwise, SignalClosed will be raised with a net
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // error set.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool StartTls(const std::string& domain_name) OVERRIDE;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Signal behavior:
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SignalConnected: raised whenever the connect initiated by a call
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to Connect() is complete.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SignalSSLConnected: raised whenever the connect initiated by a
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // call to StartTls() is complete.  Not actually used by
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XmppClient. (It just assumes that if SignalRead is raised after a
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // call to StartTls(), the connection has been successfully
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // upgraded.)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SignalClosed: raised whenever the socket is closed, either due to
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // an asynchronous error, the other side closing the connection, or
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when Close() is called.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SignalRead: raised whenever the next call to Read() will succeed
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // with a non-zero |len_read| (assuming nothing else happens in the
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // meantime).
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SignalError: not used.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum AsyncIOState {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // An I/O op is not in progress.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IDLE,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A function has been posted to do the I/O.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    POSTED,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // An async I/O operation is pending.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PENDING,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsOpen() const;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Error functions.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoNonNetError(Error error);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoNetError(net::Error net_error);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoNetErrorFromStatus(int status);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Connection functions.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ProcessConnectDone(int status);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Read loop functions.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PostDoRead();
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoRead();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ProcessReadDone(int status);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write loop functions.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PostDoWrite();
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoWrite();
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ProcessWriteDone(int status);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SSL/TLS connection functions.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ProcessSSLConnectDone(int status);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close functions.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoClose();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ResolvingClientSocketFactory> resolving_client_socket_factory_;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // buzz::AsyncSocket state.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buzz::AsyncSocket::State state_;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buzz::AsyncSocket::Error error_;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::Error net_error_;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NULL iff state() == STATE_CLOSED.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<net::StreamSocket> transport_socket_;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // State for the read loop.  |read_start_| <= |read_end_| <=
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |read_buf_->size()|.  There's a read in flight (i.e.,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |read_state_| != IDLE) iff |read_end_| == 0.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncIOState read_state_;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::IOBufferWithSize> read_buf_;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t read_start_, read_end_;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // State for the write loop.  |write_end_| <= |write_buf_->size()|.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There's a write in flight (i.e., |write_state_| != IDLE) iff
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |write_end_| > 0.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncIOState write_state_;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::IOBufferWithSize> write_buf_;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t write_end_;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::WeakPtrFactory<ChromeAsyncSocket> weak_ptr_factory_;
208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ChromeAsyncSocket);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace jingle_glue
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // JINGLE_GLUE_CHROME_ASYNC_SOCKET_H_
215