普通文本  |  235行  |  6.39 KB

// Copyright (c) 2011 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.

#include "net/base/net_log.h"

#include "base/logging.h"
#include "base/string_number_conversions.h"
#include "base/time.h"
#include "base/utf_string_conversions.h"
#include "base/values.h"
#include "net/base/net_errors.h"

namespace net {

Value* NetLog::Source::ToValue() const {
  DictionaryValue* dict = new DictionaryValue();
  dict->SetInteger("type", static_cast<int>(type));
  dict->SetInteger("id", static_cast<int>(id));
  return dict;
}

// static
std::string NetLog::TickCountToString(const base::TimeTicks& time) {
  int64 delta_time = (time - base::TimeTicks()).InMilliseconds();
  return base::Int64ToString(delta_time);
}

// static
const char* NetLog::EventTypeToString(EventType event) {
  switch (event) {
#define EVENT_TYPE(label) case TYPE_ ## label: return #label;
#include "net/base/net_log_event_type_list.h"
#undef EVENT_TYPE
  }
  return NULL;
}

// static
std::vector<NetLog::EventType> NetLog::GetAllEventTypes() {
  std::vector<NetLog::EventType> types;
#define EVENT_TYPE(label) types.push_back(TYPE_ ## label);
#include "net/base/net_log_event_type_list.h"
#undef EVENT_TYPE
  return types;
}

// static
const char* NetLog::SourceTypeToString(SourceType source) {
  switch (source) {
#define SOURCE_TYPE(label, id) case id: return #label;
#include "net/base/net_log_source_type_list.h"
#undef SOURCE_TYPE
  }
  NOTREACHED();
  return NULL;
}

// static
const char* NetLog::EventPhaseToString(EventPhase phase) {
  switch (phase) {
    case PHASE_BEGIN:
      return "PHASE_BEGIN";
    case PHASE_END:
      return "PHASE_END";
    case PHASE_NONE:
      return "PHASE_NONE";
  }
  NOTREACHED();
  return NULL;
}

// static
Value* NetLog::EntryToDictionaryValue(NetLog::EventType type,
                                      const base::TimeTicks& time,
                                      const NetLog::Source& source,
                                      NetLog::EventPhase phase,
                                      NetLog::EventParameters* params,
                                      bool use_strings) {
  DictionaryValue* entry_dict = new DictionaryValue();

  entry_dict->SetString("time", TickCountToString(time));

  // Set the entry source.
  DictionaryValue* source_dict = new DictionaryValue();
  source_dict->SetInteger("id", source.id);
  if (!use_strings) {
    source_dict->SetInteger("type", static_cast<int>(source.type));
  } else {
    source_dict->SetString("type",
                           NetLog::SourceTypeToString(source.type));
  }
  entry_dict->Set("source", source_dict);

  // Set the event info.
  if (!use_strings) {
    entry_dict->SetInteger("type", static_cast<int>(type));
    entry_dict->SetInteger("phase", static_cast<int>(phase));
  } else {
    entry_dict->SetString("type", NetLog::EventTypeToString(type));
    entry_dict->SetString("phase", NetLog::EventPhaseToString(phase));
  }

  // Set the event-specific parameters.
  if (params)
    entry_dict->Set("params", params->ToValue());

  return entry_dict;
}

void BoundNetLog::AddEntry(
    NetLog::EventType type,
    NetLog::EventPhase phase,
    const scoped_refptr<NetLog::EventParameters>& params) const {
  if (net_log_) {
    net_log_->AddEntry(type, base::TimeTicks::Now(), source_, phase, params);
  }
}

void BoundNetLog::AddEntryWithTime(
    NetLog::EventType type,
    const base::TimeTicks& time,
    NetLog::EventPhase phase,
    const scoped_refptr<NetLog::EventParameters>& params) const {
  if (net_log_) {
    net_log_->AddEntry(type, time, source_, phase, params);
  }
}

void BoundNetLog::AddEvent(
    NetLog::EventType event_type,
    const scoped_refptr<NetLog::EventParameters>& params) const {
  AddEntry(event_type, NetLog::PHASE_NONE, params);
}

void BoundNetLog::BeginEvent(
    NetLog::EventType event_type,
    const scoped_refptr<NetLog::EventParameters>& params) const {
  AddEntry(event_type, NetLog::PHASE_BEGIN, params);
}

void BoundNetLog::EndEvent(
    NetLog::EventType event_type,
    const scoped_refptr<NetLog::EventParameters>& params) const {
  AddEntry(event_type, NetLog::PHASE_END, params);
}

void BoundNetLog::EndEventWithNetErrorCode(NetLog::EventType event_type,
                                           int net_error) const {
  DCHECK_NE(net_error, ERR_IO_PENDING);
  if (net_error >= 0) {
    EndEvent(event_type, NULL);
  } else {
    EndEvent(
        event_type,
        make_scoped_refptr(new NetLogIntegerParameter("net_error", net_error)));
  }
}

NetLog::LogLevel BoundNetLog::GetLogLevel() const {
  if (net_log_)
    return net_log_->GetLogLevel();
  return NetLog::LOG_BASIC;
}

bool BoundNetLog::IsLoggingBytes() const {
  return GetLogLevel() == NetLog::LOG_ALL;
}

bool BoundNetLog::IsLoggingAllEvents() const {
  return GetLogLevel() <= NetLog::LOG_ALL_BUT_BYTES;
}

// static
BoundNetLog BoundNetLog::Make(NetLog* net_log,
                              NetLog::SourceType source_type) {
  if (!net_log)
    return BoundNetLog();

  NetLog::Source source(source_type, net_log->NextID());
  return BoundNetLog(source, net_log);
}

NetLogStringParameter::NetLogStringParameter(const char* name,
                                             const std::string& value)
    : name_(name), value_(value) {
}

NetLogStringParameter::~NetLogStringParameter() {
}

Value* NetLogIntegerParameter::ToValue() const {
  DictionaryValue* dict = new DictionaryValue();
  dict->SetInteger(name_, value_);
  return dict;
}

Value* NetLogStringParameter::ToValue() const {
  DictionaryValue* dict = new DictionaryValue();
  dict->SetString(name_, value_);
  return dict;
}

Value* NetLogSourceParameter::ToValue() const {
  DictionaryValue* dict = new DictionaryValue();

  dict->Set(name_, value_.ToValue());
  return dict;
}

ScopedNetLogEvent::ScopedNetLogEvent(
    const BoundNetLog& net_log,
    NetLog::EventType event_type,
    const scoped_refptr<NetLog::EventParameters>& params)
    : net_log_(net_log),
      event_type_(event_type) {
  net_log_.BeginEvent(event_type, params);
}

ScopedNetLogEvent::~ScopedNetLogEvent() {
  net_log_.EndEvent(event_type_, end_event_params_);
}

void ScopedNetLogEvent::SetEndEventParameters(
    const scoped_refptr<NetLog::EventParameters>& end_event_params) {
  DCHECK(!end_event_params_.get());
  end_event_params_ = end_event_params;
}

const BoundNetLog& ScopedNetLogEvent::net_log() const {
  return net_log_;
}

}  // namespace net