text: // Copyright (c) 2010 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  //
  // Collect metrics of SocketStream usage.
  // TODO(ukai): collect WebSocket specific metrics (e.g. handshake time, etc).
  
  #ifndef NET_SOCKET_STREAM_SOCKET_STREAM_METRICS_H_
  #define NET_SOCKET_STREAM_SOCKET_STREAM_METRICS_H_
  #pragma once
  
  #include "base/basictypes.h"
  #include "base/time.h"
  
  class GURL;
  
  namespace net {
  
  class SocketStreamMetrics {
   public:
    enum ProtocolType {
      PROTOCOL_UNKNOWN,
      PROTOCOL_WEBSOCKET,
      PROTOCOL_WEBSOCKET_SECURE,
      NUM_PROTOCOL_TYPES,
    };
  
    enum ConnectionType {
      CONNECTION_NONE,
      ALL_CONNECTIONS,
      TUNNEL_CONNECTION,
      SOCKS_CONNECTION,
      SSL_CONNECTION,
      NUM_CONNECTION_TYPES,
    };
  
    explicit SocketStreamMetrics(const GURL& url);
    ~SocketStreamMetrics();
  
    void OnWaitConnection();
    void OnStartConnection();
    void OnTunnelProxy();
    void OnSOCKSProxy();
    void OnSSLConnection();
    void OnConnected();
    void OnRead(int len);
    void OnWrite(int len);
    void OnClose();
  
   private:
    void CountProtocolType(ProtocolType protocol_type);
    void CountConnectionType(ConnectionType connection_type);
  
    base::TimeTicks wait_start_time_;
    base::TimeTicks connect_start_time_;
    base::TimeTicks connect_establish_time_;
    int received_bytes_;
    int received_counts_;
    int sent_bytes_;
    int sent_counts_;
  
    DISALLOW_COPY_AND_ASSIGN(SocketStreamMetrics);
  };
  
  }  // namespace net
  
  #endif  // NET_SOCKET_STREAM_SOCKET_STREAM_METRICS_H_
  