1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef NET_BASE_NET_LOG_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define NET_BASE_NET_LOG_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Value;
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace base {
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TimeTicks;
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace net {
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// NetLog is the destination for log messages generated by the network stack.
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Each log message has a "source" field which identifies the specific entity
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// that generated the message (for example, which URLRequest or which
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// SocketStream).
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// To avoid needing to pass in the "source id" to the logging functions, NetLog
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// is usually accessed through a BoundNetLog, which will always pass in a
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// specific source ID.
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ******** The NetLog (and associated logging) is a work in progress ********
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(eroman): Remove the 'const' qualitifer from the BoundNetLog methods.
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// TODO(eroman): Start a new Source each time URLRequest redirects
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//               (simpler to reason about each as a separate entity).
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass NetLog {
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enum EventType {
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define EVENT_TYPE(label) TYPE_ ## label,
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_log_event_type_list.h"
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#undef EVENT_TYPE
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The 'phase' of an event trace (whether it marks the beginning or end
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // of an event.).
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enum EventPhase {
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    PHASE_NONE,
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    PHASE_BEGIN,
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    PHASE_END,
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The "source" identifies the entity that generated the log message.
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enum SourceType {
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define SOURCE_TYPE(label, value) SOURCE_ ## label = value,
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_log_source_type_list.h"
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#undef SOURCE_TYPE
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Identifies the entity that generated this log. The |id| field should
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // uniquely identify the source, and is used by log observers to infer
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // message groupings. Can use NetLog::NextID() to create unique IDs.
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct Source {
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    static const uint32 kInvalidId = 0;
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Source() : type(SOURCE_NONE), id(kInvalidId) {}
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Source(SourceType type, uint32 id) : type(type), id(id) {}
693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool is_valid() const { return id != kInvalidId; }
703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // The caller takes ownership of the returned Value*.
723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    Value* ToValue() const;
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SourceType type;
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    uint32 id;
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Base class for associating additional parameters with an event. Log
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // observers need to know what specific derivations of EventParameters a
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // particular EventType uses, in order to get at the individual components.
81201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  class EventParameters : public base::RefCountedThreadSafe<EventParameters> {
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EventParameters() {}
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual ~EventParameters() {}
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Serializes the parameters to a Value tree. This is intended to be a
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // lossless conversion, which is used to serialize the parameters to JSON.
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The caller takes ownership of the returned Value*.
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual Value* ToValue() const = 0;
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   private:
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DISALLOW_COPY_AND_ASSIGN(EventParameters);
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Specifies the granularity of events that should be emitted to the log.
963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  enum LogLevel {
973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Log everything possible, even if it is slow and memory expensive.
98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Includes logging of transferred bytes.
993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    LOG_ALL,
1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Log all events, but do not include the actual transferred bytes as
102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // parameters for bytes sent/received events.
103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    LOG_ALL_BUT_BYTES,
104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Only log events which are cheap, and don't consume much memory.
1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    LOG_BASIC,
1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NetLog() {}
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~NetLog() {}
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Emits an event to the log stream.
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //  |type| - The type of the event.
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //  |time| - The time when the event occurred.
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //  |source| - The source that generated the event.
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //  |phase| - An optional parameter indicating whether this is the start/end
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //            of an action.
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //  |params| - Optional (may be NULL) parameters for this event.
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //             The specific subclass of EventParameters is defined
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //             by the contract for events of this |type|.
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //             TODO(eroman): Take a scoped_refptr<> instead.
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void AddEntry(EventType type,
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const base::TimeTicks& time,
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const Source& source,
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        EventPhase phase,
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        EventParameters* params) = 0;
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns a unique ID which can be used as a source ID.
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual uint32 NextID() = 0;
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Returns the logging level for this NetLog. This is used to avoid computing
1323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // and saving expensive log entries.
1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual LogLevel GetLogLevel() const = 0;
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Converts a time to the string format that the NetLog uses to represent
136731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // times.  Strings are used since integers may overflow.
137731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  static std::string TickCountToString(const base::TimeTicks& time);
138731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns a C-String symbolic name for |event_type|.
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const char* EventTypeToString(EventType event_type);
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns a list of all the available EventTypes.
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static std::vector<EventType> GetAllEventTypes();
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Returns a C-String symbolic name for |source_type|.
1463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const char* SourceTypeToString(SourceType source_type);
1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Returns a C-String symbolic name for |event_phase|.
1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const char* EventPhaseToString(EventPhase event_phase);
1503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Serializes the specified event to a DictionaryValue.
1523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // If |use_strings| is true, uses strings rather than numeric ids.
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static Value* EntryToDictionaryValue(NetLog::EventType type,
1543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                       const base::TimeTicks& time,
155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       const NetLog::Source& source,
156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       NetLog::EventPhase phase,
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       NetLog::EventParameters* params,
1583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                       bool use_strings);
1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(NetLog);
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Helper that binds a Source to a NetLog, and exposes convenience methods to
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// output log messages without needing to pass in the source.
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BoundNetLog {
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BoundNetLog() : net_log_(NULL) {}
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BoundNetLog(const NetLog::Source& source, NetLog* net_log)
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      : source_(source), net_log_(net_log) {
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Convenience methods that call through to the NetLog, passing in the
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // currently bound source.
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddEntry(NetLog::EventType type,
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                NetLog::EventPhase phase,
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                const scoped_refptr<NetLog::EventParameters>& params) const;
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddEntryWithTime(
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NetLog::EventType type,
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const base::TimeTicks& time,
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NetLog::EventPhase phase,
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const scoped_refptr<NetLog::EventParameters>& params) const;
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Convenience methods that call through to the NetLog, passing in the
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // currently bound source, current time, and a fixed "capture phase"
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // (begin, end, or none).
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddEvent(NetLog::EventType event_type,
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                const scoped_refptr<NetLog::EventParameters>& params) const;
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void BeginEvent(NetLog::EventType event_type,
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  const scoped_refptr<NetLog::EventParameters>& params) const;
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void EndEvent(NetLog::EventType event_type,
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                const scoped_refptr<NetLog::EventParameters>& params) const;
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1963f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Just like EndEvent, except |net_error| is a net error code.  If it's
1973f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // negative, a parameter called "net_error" with a value of |net_error| is
1983f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // associated with the event.  Otherwise, the end event has no parameters.
1993f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // |net_error| must not be ERR_IO_PENDING, as it's not a true error.
2003f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  void EndEventWithNetErrorCode(NetLog::EventType event_type,
2013f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                                int net_error) const;
2023f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
2033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  NetLog::LogLevel GetLogLevel() const;
2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Returns true if the log level is LOG_ALL.
206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool IsLoggingBytes() const;
207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
208731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Returns true if the log level is LOG_ALL or LOG_ALL_BUT_BYTES.
209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool IsLoggingAllEvents() const;
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Helper to create a BoundNetLog given a NetLog and a SourceType. Takes care
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // of creating a unique source ID, and handles the case of NULL net_log.
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static BoundNetLog Make(NetLog* net_log, NetLog::SourceType source_type);
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const NetLog::Source& source() const { return source_; }
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NetLog* net_log() const { return net_log_; }
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NetLog::Source source_;
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NetLog* net_log_;
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// NetLogStringParameter is a subclass of EventParameters that encapsulates a
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// single std::string parameter.
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass NetLogStringParameter : public NetLog::EventParameters {
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |name| must be a string literal.
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NetLogStringParameter(const char* name, const std::string& value);
2293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual ~NetLogStringParameter();
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string& value() const {
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return value_;
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual Value* ToValue() const;
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char* const name_;
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string value_;
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// NetLogIntegerParameter is a subclass of EventParameters that encapsulates a
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// single integer parameter.
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass NetLogIntegerParameter : public NetLog::EventParameters {
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |name| must be a string literal.
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NetLogIntegerParameter(const char* name, int value)
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      : name_(name), value_(value) {}
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int value() const {
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return value_;
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual Value* ToValue() const;
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char* name_;
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const int value_;
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// NetLogSourceParameter is a subclass of EventParameters that encapsulates a
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// single NetLog::Source parameter.
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass NetLogSourceParameter : public NetLog::EventParameters {
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |name| must be a string literal.
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NetLogSourceParameter(const char* name, const NetLog::Source& value)
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      : name_(name), value_(value) {}
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const NetLog::Source& value() const {
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return value_;
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual Value* ToValue() const;
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char* name_;
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const NetLog::Source value_;
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// ScopedNetLogEvent logs a begin event on creation, and the corresponding end
28121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// event on destruction.
28221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass ScopedNetLogEvent {
28321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen public:
28421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ScopedNetLogEvent(const BoundNetLog& net_log,
28521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                    NetLog::EventType event_type,
28621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                    const scoped_refptr<NetLog::EventParameters>& params);
28721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
28821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ~ScopedNetLogEvent();
28921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
29021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Sets the parameters that will logged on object destruction.  Can be called
29121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // at most once for a given ScopedNetLogEvent object.  If not called, the end
29221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // event will have no parameters.
29321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  void SetEndEventParameters(
29421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      const scoped_refptr<NetLog::EventParameters>& end_event_params);
29521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
29621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const BoundNetLog& net_log() const;
29721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
29821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen private:
29921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  BoundNetLog net_log_;
30021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const NetLog::EventType event_type_;
30121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  scoped_refptr<NetLog::EventParameters> end_event_params_;
30221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen};
30321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace net
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // NET_BASE_NET_LOG_H_
307