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_CAPTURING_NET_LOG_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define NET_BASE_CAPTURING_NET_LOG_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/atomicops.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/synchronization/lock.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_log.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace net {
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// CapturingNetLog is an implementation of NetLog that saves messages to a
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// bounded buffer.
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CapturingNetLog : public NetLog {
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct Entry {
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Entry(EventType type,
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          const base::TimeTicks& time,
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          Source source,
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          EventPhase phase,
30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          EventParameters* extra_parameters);
31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    ~Entry();
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EventType type;
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    base::TimeTicks time;
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Source source;
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EventPhase phase;
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scoped_refptr<EventParameters> extra_parameters;
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Ordered set of entries that were logged.
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::vector<Entry> EntryList;
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enum { kUnbounded = -1 };
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates a CapturingNetLog that logs a maximum of |max_num_entries|
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // messages.
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit CapturingNetLog(size_t max_num_entries);
48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual ~CapturingNetLog();
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Returns the list of all entries in the log.
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void GetEntries(EntryList* entry_list) const;
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void Clear();
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void SetLogLevel(NetLog::LogLevel log_level);
5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NetLog implementation:
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void AddEntry(EventType type,
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const base::TimeTicks& time,
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const Source& source,
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        EventPhase phase,
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        EventParameters* extra_parameters);
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual uint32 NextID();
6421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual LogLevel GetLogLevel() const;
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
6721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Needs to be "mutable" so can use it in GetEntries().
6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  mutable base::Lock lock_;
6921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
7021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Last assigned source ID.  Incremented to get the next one.
7121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  base::subtle::Atomic32 last_id_;
7221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  size_t max_num_entries_;
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EntryList entries_;
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
763f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  NetLog::LogLevel log_level_;
773f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(CapturingNetLog);
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Helper class that exposes a similar API as BoundNetLog, but uses a
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// CapturingNetLog rather than the more generic NetLog.
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// CapturingBoundNetLog can easily be converted to a BoundNetLog using the
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// bound() method.
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CapturingBoundNetLog {
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  CapturingBoundNetLog(const NetLog::Source& source, CapturingNetLog* net_log);
89731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
90731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  explicit CapturingBoundNetLog(size_t max_num_entries);
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ~CapturingBoundNetLog();
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The returned BoundNetLog is only valid while |this| is alive.
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BoundNetLog bound() const {
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return BoundNetLog(source_, capturing_net_log_.get());
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Fills |entry_list| with all entries in the log.
10021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  void GetEntries(CapturingNetLog::EntryList* entry_list) const;
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Clear();
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1043f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Sets the log level of the underlying CapturingNetLog.
1053f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  void SetLogLevel(NetLog::LogLevel log_level);
1063f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NetLog::Source source_;
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<CapturingNetLog> capturing_net_log_;
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(CapturingBoundNetLog);
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace net
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // NET_BASE_CAPTURING_NET_LOG_H_
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
118