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)#include "net/base/net_log.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
95e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns parameters for logging data transferred events. Includes number of
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bytes transferred and, if the log level indicates bytes should be logged and
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |byte_count| > 0, the bytes themselves.  The bytes are hex-encoded, since
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::StringValue only supports UTF-8.
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::Value* BytesTransferredCallback(int byte_count,
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      const char* bytes,
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      NetLog::LogLevel log_level) {
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* dict = new base::DictionaryValue();
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetInteger("byte_count", byte_count);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (NetLog::IsLoggingBytes(log_level) && byte_count > 0)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->SetString("hex_encoded_bytes", base::HexEncode(bytes, byte_count));
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dict;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::Value* SourceEventParametersCallback(const NetLog::Source source,
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                           NetLog::LogLevel /* log_level */) {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!source.IsValid())
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* event_params = new base::DictionaryValue();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source.AddToEventParameters(event_params);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return event_params;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::Value* NetLogIntegerCallback(const char* name,
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                   int value,
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                   NetLog::LogLevel /* log_level */) {
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* event_params = new base::DictionaryValue();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event_params->SetInteger(name, value);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return event_params;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::Value* NetLogInt64Callback(const char* name,
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                 int64 value,
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                 NetLog::LogLevel /* log_level */) {
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* event_params = new base::DictionaryValue();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event_params->SetString(name, base::Int64ToString(value));
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return event_params;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::Value* NetLogStringCallback(const char* name,
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  const std::string* value,
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  NetLog::LogLevel /* log_level */) {
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* event_params = new base::DictionaryValue();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event_params->SetString(name, *value);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return event_params;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::Value* NetLogString16Callback(const char* name,
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                    const base::string16* value,
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                    NetLog::LogLevel /* log_level */) {
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* event_params = new base::DictionaryValue();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event_params->SetString(name, *value);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return event_params;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// LoadTimingInfo requires this be 0.
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const uint32 NetLog::Source::kInvalidId = 0;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetLog::Source::Source() : type(SOURCE_NONE), id(kInvalidId) {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetLog::Source::Source(SourceType type, uint32 id) : type(type), id(id) {
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NetLog::Source::IsValid() const {
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return id != kInvalidId;
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void NetLog::Source::AddToEventParameters(
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    base::DictionaryValue* event_params) const {
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* dict = new base::DictionaryValue();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetInteger("type", static_cast<int>(type));
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetInteger("id", static_cast<int>(id));
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event_params->Set("source_dependency", dict);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetLog::ParametersCallback NetLog::Source::ToEventParametersCallback() const {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::Bind(&SourceEventParametersCallback, *this);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool NetLog::Source::FromEventParameters(base::Value* event_params,
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                         Source* source) {
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* dict;
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* source_dict;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int source_id;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int source_type;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!event_params ||
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !event_params->GetAsDictionary(&dict) ||
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !dict->GetDictionary("source_dependency", &source_dict) ||
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !source_dict->GetInteger("id", &source_id) ||
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !source_dict->GetInteger("type", &source_type)) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *source = Source();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_LE(0, source_id);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_LT(source_type, NetLog::SOURCE_COUNT);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *source = Source(static_cast<SourceType>(source_type), source_id);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::Value* NetLog::Entry::ToValue() const {
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* entry_dict(new base::DictionaryValue());
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_dict->SetString("time", TickCountToString(time_));
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the entry source.
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* source_dict = new base::DictionaryValue();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source_dict->SetInteger("id", source_.id);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source_dict->SetInteger("type", static_cast<int>(source_.type));
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_dict->Set("source", source_dict);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the event info.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_dict->SetInteger("type", static_cast<int>(type_));
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_dict->SetInteger("phase", static_cast<int>(phase_));
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the event-specific parameters.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (parameters_callback_) {
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::Value* value = parameters_callback_->Run(log_level_);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entry_dict->Set("params", value);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return entry_dict;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::Value* NetLog::Entry::ParametersToValue() const {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (parameters_callback_)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return parameters_callback_->Run(log_level_);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetLog::Entry::Entry(
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EventType type,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Source source,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EventPhase phase,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeTicks time,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ParametersCallback* parameters_callback,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LogLevel log_level)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : type_(type),
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      source_(source),
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      phase_(phase),
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      time_(time),
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      parameters_callback_(parameters_callback),
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      log_level_(log_level) {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetLog::Entry::~Entry() {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetLog::ThreadSafeObserver::ThreadSafeObserver() : log_level_(LOG_BASIC),
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   net_log_(NULL) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetLog::ThreadSafeObserver::~ThreadSafeObserver() {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we aren't watching a NetLog on destruction.  Because the NetLog
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // may pass events to each observer on multiple threads, we cannot safely
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // stop watching a NetLog automatically from a parent class.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!net_log_);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetLog::LogLevel NetLog::ThreadSafeObserver::log_level() const {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(net_log_);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return log_level_;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetLog* NetLog::ThreadSafeObserver::net_log() const {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return net_log_;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)NetLog::NetLog()
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    : last_id_(0),
194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base_log_level_(LOG_NONE),
195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      effective_log_level_(LOG_NONE) {
196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)NetLog::~NetLog() {
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetLog::AddGlobalEntry(EventType type) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddEntry(type,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           Source(net::NetLog::SOURCE_NONE, NextID()),
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           net::NetLog::PHASE_NONE,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           NULL);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetLog::AddGlobalEntry(
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EventType type,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const NetLog::ParametersCallback& parameters_callback) {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddEntry(type,
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           Source(net::NetLog::SOURCE_NONE, NextID()),
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           net::NetLog::PHASE_NONE,
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           &parameters_callback);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)uint32 NetLog::NextID() {
218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return base::subtle::NoBarrier_AtomicIncrement(&last_id_, 1);
219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void NetLog::SetBaseLogLevel(LogLevel log_level) {
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::AutoLock lock(lock_);
223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base_log_level_ = log_level;
224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  UpdateLogLevel();
226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)NetLog::LogLevel NetLog::GetLogLevel() const {
229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::subtle::Atomic32 log_level =
230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::subtle::NoBarrier_Load(&effective_log_level_);
231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return static_cast<net::NetLog::LogLevel>(log_level);
232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void NetLog::AddThreadSafeObserver(
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    net::NetLog::ThreadSafeObserver* observer,
236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    LogLevel log_level) {
237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::AutoLock lock(lock_);
238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(!observer->net_log_);
240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  observers_.AddObserver(observer);
241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  observer->net_log_ = this;
242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  observer->log_level_ = log_level;
243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  UpdateLogLevel();
244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void NetLog::SetObserverLogLevel(
247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    net::NetLog::ThreadSafeObserver* observer,
248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    LogLevel log_level) {
249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::AutoLock lock(lock_);
250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(observers_.HasObserver(observer));
252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK_EQ(this, observer->net_log_);
253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  observer->log_level_ = log_level;
254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  UpdateLogLevel();
255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void NetLog::RemoveThreadSafeObserver(
258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    net::NetLog::ThreadSafeObserver* observer) {
259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::AutoLock lock(lock_);
260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(observers_.HasObserver(observer));
262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK_EQ(this, observer->net_log_);
263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  observers_.RemoveObserver(observer);
264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  observer->net_log_ = NULL;
265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  UpdateLogLevel();
266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void NetLog::UpdateLogLevel() {
269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  lock_.AssertAcquired();
270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Look through all the observers and find the finest granularity
272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // log level (higher values of the enum imply *lower* log levels).
273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  LogLevel new_effective_log_level = base_log_level_;
274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ObserverListBase<ThreadSafeObserver>::Iterator it(observers_);
275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ThreadSafeObserver* observer;
276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  while ((observer = it.GetNext()) != NULL) {
277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    new_effective_log_level =
278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        std::min(new_effective_log_level, observer->log_level());
279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::subtle::NoBarrier_Store(&effective_log_level_,
281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                new_effective_log_level);
282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string NetLog::TickCountToString(const base::TimeTicks& time) {
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 delta_time = (time - base::TimeTicks()).InMilliseconds();
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::Int64ToString(delta_time);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* NetLog::EventTypeToString(EventType event) {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (event) {
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define EVENT_TYPE(label) case TYPE_ ## label: return #label;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log_event_type_list.h"
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef EVENT_TYPE
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::Value* NetLog::GetEventTypesAsValue() {
3047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* dict = new base::DictionaryValue();
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < EVENT_COUNT; ++i) {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->SetInteger(EventTypeToString(static_cast<EventType>(i)), i);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dict;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* NetLog::SourceTypeToString(SourceType source) {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (source) {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SOURCE_TYPE(label) case SOURCE_ ## label: return #label;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log_source_type_list.h"
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef SOURCE_TYPE
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::Value* NetLog::GetSourceTypesAsValue() {
3257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* dict = new base::DictionaryValue();
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < SOURCE_COUNT; ++i) {
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->SetInteger(SourceTypeToString(static_cast<SourceType>(i)), i);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dict;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* NetLog::EventPhaseToString(EventPhase phase) {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (phase) {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PHASE_BEGIN:
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "PHASE_BEGIN";
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PHASE_END:
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "PHASE_END";
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PHASE_NONE:
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "PHASE_NONE";
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NetLog::IsLoggingBytes(LogLevel log_level) {
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return log_level == NetLog::LOG_ALL;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NetLog::IsLoggingAllEvents(LogLevel log_level) {
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return log_level <= NetLog::LOG_ALL_BUT_BYTES;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetLog::ParametersCallback NetLog::IntegerCallback(const char* name,
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   int value) {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::Bind(&NetLogIntegerCallback, name, value);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetLog::ParametersCallback NetLog::Int64Callback(const char* name,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 int64 value) {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::Bind(&NetLogInt64Callback, name, value);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetLog::ParametersCallback NetLog::StringCallback(const char* name,
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  const std::string* value) {
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(value);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::Bind(&NetLogStringCallback, name, value);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetLog::ParametersCallback NetLog::StringCallback(const char* name,
377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                  const base::string16* value) {
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(value);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::Bind(&NetLogString16Callback, name, value);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetLog::AddEntry(EventType type,
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const Source& source,
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      EventPhase phase,
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const NetLog::ParametersCallback* parameters_callback) {
386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LogLevel log_level = GetLogLevel();
387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (log_level == LOG_NONE)
388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Entry entry(type, source, phase, base::TimeTicks::Now(),
390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              parameters_callback, log_level);
391868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
392868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Notify all of the log observers.
393868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::AutoLock lock(lock_);
394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FOR_EACH_OBSERVER(ThreadSafeObserver, observers_, OnAddEntry(entry));
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BoundNetLog::AddEntry(NetLog::EventType type,
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           NetLog::EventPhase phase) const {
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!net_log_)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net_log_->AddEntry(type, source_, phase, NULL);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BoundNetLog::AddEntry(
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NetLog::EventType type,
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NetLog::EventPhase phase,
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const NetLog::ParametersCallback& get_parameters) const {
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!net_log_)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net_log_->AddEntry(type, source_, phase, &get_parameters);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BoundNetLog::AddEvent(NetLog::EventType type) const {
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddEntry(type, NetLog::PHASE_NONE);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BoundNetLog::AddEvent(
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NetLog::EventType type,
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const NetLog::ParametersCallback& get_parameters) const {
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddEntry(type, NetLog::PHASE_NONE, get_parameters);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BoundNetLog::BeginEvent(NetLog::EventType type) const {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddEntry(type, NetLog::PHASE_BEGIN);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BoundNetLog::BeginEvent(
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NetLog::EventType type,
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const NetLog::ParametersCallback& get_parameters) const {
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddEntry(type, NetLog::PHASE_BEGIN, get_parameters);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BoundNetLog::EndEvent(NetLog::EventType type) const {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddEntry(type, NetLog::PHASE_END);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BoundNetLog::EndEvent(
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NetLog::EventType type,
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const NetLog::ParametersCallback& get_parameters) const {
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddEntry(type, NetLog::PHASE_END, get_parameters);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BoundNetLog::AddEventWithNetErrorCode(NetLog::EventType event_type,
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int net_error) const {
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_NE(ERR_IO_PENDING, net_error);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (net_error >= 0) {
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddEvent(event_type);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddEvent(event_type, NetLog::IntegerCallback("net_error", net_error));
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BoundNetLog::EndEventWithNetErrorCode(NetLog::EventType event_type,
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int net_error) const {
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_NE(ERR_IO_PENDING, net_error);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (net_error >= 0) {
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EndEvent(event_type);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EndEvent(event_type, NetLog::IntegerCallback("net_error", net_error));
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BoundNetLog::AddByteTransferEvent(NetLog::EventType event_type,
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int byte_count,
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const char* bytes) const {
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddEvent(event_type, base::Bind(BytesTransferredCallback, byte_count, bytes));
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetLog::LogLevel BoundNetLog::GetLogLevel() const {
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (net_log_)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return net_log_->GetLogLevel();
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NetLog::LOG_BASIC;
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BoundNetLog::IsLoggingBytes() const {
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NetLog::IsLoggingBytes(GetLogLevel());
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BoundNetLog::IsLoggingAllEvents() const {
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NetLog::IsLoggingAllEvents(GetLogLevel());
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BoundNetLog BoundNetLog::Make(NetLog* net_log,
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              NetLog::SourceType source_type) {
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!net_log)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return BoundNetLog();
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetLog::Source source(source_type, net_log->NextID());
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return BoundNetLog(source, net_log);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
494