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