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