| // 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 |