• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "net/base/net_log.h"
6 
7 #include "base/logging.h"
8 #include "base/string_number_conversions.h"
9 #include "base/time.h"
10 #include "base/utf_string_conversions.h"
11 #include "base/values.h"
12 #include "net/base/net_errors.h"
13 
14 namespace net {
15 
ToValue() const16 Value* NetLog::Source::ToValue() const {
17   DictionaryValue* dict = new DictionaryValue();
18   dict->SetInteger("type", static_cast<int>(type));
19   dict->SetInteger("id", static_cast<int>(id));
20   return dict;
21 }
22 
23 // static
TickCountToString(const base::TimeTicks & time)24 std::string NetLog::TickCountToString(const base::TimeTicks& time) {
25   int64 delta_time = (time - base::TimeTicks()).InMilliseconds();
26   return base::Int64ToString(delta_time);
27 }
28 
29 // static
EventTypeToString(EventType event)30 const char* NetLog::EventTypeToString(EventType event) {
31   switch (event) {
32 #define EVENT_TYPE(label) case TYPE_ ## label: return #label;
33 #include "net/base/net_log_event_type_list.h"
34 #undef EVENT_TYPE
35   }
36   return NULL;
37 }
38 
39 // static
GetAllEventTypes()40 std::vector<NetLog::EventType> NetLog::GetAllEventTypes() {
41   std::vector<NetLog::EventType> types;
42 #define EVENT_TYPE(label) types.push_back(TYPE_ ## label);
43 #include "net/base/net_log_event_type_list.h"
44 #undef EVENT_TYPE
45   return types;
46 }
47 
48 // static
SourceTypeToString(SourceType source)49 const char* NetLog::SourceTypeToString(SourceType source) {
50   switch (source) {
51 #define SOURCE_TYPE(label, id) case id: return #label;
52 #include "net/base/net_log_source_type_list.h"
53 #undef SOURCE_TYPE
54   }
55   NOTREACHED();
56   return NULL;
57 }
58 
59 // static
EventPhaseToString(EventPhase phase)60 const char* NetLog::EventPhaseToString(EventPhase phase) {
61   switch (phase) {
62     case PHASE_BEGIN:
63       return "PHASE_BEGIN";
64     case PHASE_END:
65       return "PHASE_END";
66     case PHASE_NONE:
67       return "PHASE_NONE";
68   }
69   NOTREACHED();
70   return NULL;
71 }
72 
73 // static
EntryToDictionaryValue(NetLog::EventType type,const base::TimeTicks & time,const NetLog::Source & source,NetLog::EventPhase phase,NetLog::EventParameters * params,bool use_strings)74 Value* NetLog::EntryToDictionaryValue(NetLog::EventType type,
75                                       const base::TimeTicks& time,
76                                       const NetLog::Source& source,
77                                       NetLog::EventPhase phase,
78                                       NetLog::EventParameters* params,
79                                       bool use_strings) {
80   DictionaryValue* entry_dict = new DictionaryValue();
81 
82   entry_dict->SetString("time", TickCountToString(time));
83 
84   // Set the entry source.
85   DictionaryValue* source_dict = new DictionaryValue();
86   source_dict->SetInteger("id", source.id);
87   if (!use_strings) {
88     source_dict->SetInteger("type", static_cast<int>(source.type));
89   } else {
90     source_dict->SetString("type",
91                            NetLog::SourceTypeToString(source.type));
92   }
93   entry_dict->Set("source", source_dict);
94 
95   // Set the event info.
96   if (!use_strings) {
97     entry_dict->SetInteger("type", static_cast<int>(type));
98     entry_dict->SetInteger("phase", static_cast<int>(phase));
99   } else {
100     entry_dict->SetString("type", NetLog::EventTypeToString(type));
101     entry_dict->SetString("phase", NetLog::EventPhaseToString(phase));
102   }
103 
104   // Set the event-specific parameters.
105   if (params)
106     entry_dict->Set("params", params->ToValue());
107 
108   return entry_dict;
109 }
110 
AddEntry(NetLog::EventType type,NetLog::EventPhase phase,const scoped_refptr<NetLog::EventParameters> & params) const111 void BoundNetLog::AddEntry(
112     NetLog::EventType type,
113     NetLog::EventPhase phase,
114     const scoped_refptr<NetLog::EventParameters>& params) const {
115   if (net_log_) {
116     net_log_->AddEntry(type, base::TimeTicks::Now(), source_, phase, params);
117   }
118 }
119 
AddEntryWithTime(NetLog::EventType type,const base::TimeTicks & time,NetLog::EventPhase phase,const scoped_refptr<NetLog::EventParameters> & params) const120 void BoundNetLog::AddEntryWithTime(
121     NetLog::EventType type,
122     const base::TimeTicks& time,
123     NetLog::EventPhase phase,
124     const scoped_refptr<NetLog::EventParameters>& params) const {
125   if (net_log_) {
126     net_log_->AddEntry(type, time, source_, phase, params);
127   }
128 }
129 
AddEvent(NetLog::EventType event_type,const scoped_refptr<NetLog::EventParameters> & params) const130 void BoundNetLog::AddEvent(
131     NetLog::EventType event_type,
132     const scoped_refptr<NetLog::EventParameters>& params) const {
133   AddEntry(event_type, NetLog::PHASE_NONE, params);
134 }
135 
BeginEvent(NetLog::EventType event_type,const scoped_refptr<NetLog::EventParameters> & params) const136 void BoundNetLog::BeginEvent(
137     NetLog::EventType event_type,
138     const scoped_refptr<NetLog::EventParameters>& params) const {
139   AddEntry(event_type, NetLog::PHASE_BEGIN, params);
140 }
141 
EndEvent(NetLog::EventType event_type,const scoped_refptr<NetLog::EventParameters> & params) const142 void BoundNetLog::EndEvent(
143     NetLog::EventType event_type,
144     const scoped_refptr<NetLog::EventParameters>& params) const {
145   AddEntry(event_type, NetLog::PHASE_END, params);
146 }
147 
EndEventWithNetErrorCode(NetLog::EventType event_type,int net_error) const148 void BoundNetLog::EndEventWithNetErrorCode(NetLog::EventType event_type,
149                                            int net_error) const {
150   DCHECK_NE(net_error, ERR_IO_PENDING);
151   if (net_error >= 0) {
152     EndEvent(event_type, NULL);
153   } else {
154     EndEvent(
155         event_type,
156         make_scoped_refptr(new NetLogIntegerParameter("net_error", net_error)));
157   }
158 }
159 
GetLogLevel() const160 NetLog::LogLevel BoundNetLog::GetLogLevel() const {
161   if (net_log_)
162     return net_log_->GetLogLevel();
163   return NetLog::LOG_BASIC;
164 }
165 
IsLoggingBytes() const166 bool BoundNetLog::IsLoggingBytes() const {
167   return GetLogLevel() == NetLog::LOG_ALL;
168 }
169 
IsLoggingAllEvents() const170 bool BoundNetLog::IsLoggingAllEvents() const {
171   return GetLogLevel() <= NetLog::LOG_ALL_BUT_BYTES;
172 }
173 
174 // static
Make(NetLog * net_log,NetLog::SourceType source_type)175 BoundNetLog BoundNetLog::Make(NetLog* net_log,
176                               NetLog::SourceType source_type) {
177   if (!net_log)
178     return BoundNetLog();
179 
180   NetLog::Source source(source_type, net_log->NextID());
181   return BoundNetLog(source, net_log);
182 }
183 
NetLogStringParameter(const char * name,const std::string & value)184 NetLogStringParameter::NetLogStringParameter(const char* name,
185                                              const std::string& value)
186     : name_(name), value_(value) {
187 }
188 
~NetLogStringParameter()189 NetLogStringParameter::~NetLogStringParameter() {
190 }
191 
ToValue() const192 Value* NetLogIntegerParameter::ToValue() const {
193   DictionaryValue* dict = new DictionaryValue();
194   dict->SetInteger(name_, value_);
195   return dict;
196 }
197 
ToValue() const198 Value* NetLogStringParameter::ToValue() const {
199   DictionaryValue* dict = new DictionaryValue();
200   dict->SetString(name_, value_);
201   return dict;
202 }
203 
ToValue() const204 Value* NetLogSourceParameter::ToValue() const {
205   DictionaryValue* dict = new DictionaryValue();
206 
207   dict->Set(name_, value_.ToValue());
208   return dict;
209 }
210 
ScopedNetLogEvent(const BoundNetLog & net_log,NetLog::EventType event_type,const scoped_refptr<NetLog::EventParameters> & params)211 ScopedNetLogEvent::ScopedNetLogEvent(
212     const BoundNetLog& net_log,
213     NetLog::EventType event_type,
214     const scoped_refptr<NetLog::EventParameters>& params)
215     : net_log_(net_log),
216       event_type_(event_type) {
217   net_log_.BeginEvent(event_type, params);
218 }
219 
~ScopedNetLogEvent()220 ScopedNetLogEvent::~ScopedNetLogEvent() {
221   net_log_.EndEvent(event_type_, end_event_params_);
222 }
223 
SetEndEventParameters(const scoped_refptr<NetLog::EventParameters> & end_event_params)224 void ScopedNetLogEvent::SetEndEventParameters(
225     const scoped_refptr<NetLog::EventParameters>& end_event_params) {
226   DCHECK(!end_event_params_.get());
227   end_event_params_ = end_event_params;
228 }
229 
net_log() const230 const BoundNetLog& ScopedNetLogEvent::net_log() const {
231   return net_log_;
232 }
233 
234 }  // namespace net
235