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#ifndef NET_BASE_CAPTURING_NET_LOG_H_
6#define NET_BASE_CAPTURING_NET_LOG_H_
7#pragma once
8
9#include <vector>
10
11#include "base/atomicops.h"
12#include "base/basictypes.h"
13#include "base/memory/ref_counted.h"
14#include "base/memory/scoped_ptr.h"
15#include "base/synchronization/lock.h"
16#include "base/time.h"
17#include "net/base/net_log.h"
18
19namespace net {
20
21// CapturingNetLog is an implementation of NetLog that saves messages to a
22// bounded buffer.
23class CapturingNetLog : public NetLog {
24 public:
25  struct Entry {
26    Entry(EventType type,
27          const base::TimeTicks& time,
28          Source source,
29          EventPhase phase,
30          EventParameters* extra_parameters);
31    ~Entry();
32
33    EventType type;
34    base::TimeTicks time;
35    Source source;
36    EventPhase phase;
37    scoped_refptr<EventParameters> extra_parameters;
38  };
39
40  // Ordered set of entries that were logged.
41  typedef std::vector<Entry> EntryList;
42
43  enum { kUnbounded = -1 };
44
45  // Creates a CapturingNetLog that logs a maximum of |max_num_entries|
46  // messages.
47  explicit CapturingNetLog(size_t max_num_entries);
48  virtual ~CapturingNetLog();
49
50  // Returns the list of all entries in the log.
51  void GetEntries(EntryList* entry_list) const;
52
53  void Clear();
54
55  void SetLogLevel(NetLog::LogLevel log_level);
56
57  // NetLog implementation:
58  virtual void AddEntry(EventType type,
59                        const base::TimeTicks& time,
60                        const Source& source,
61                        EventPhase phase,
62                        EventParameters* extra_parameters);
63  virtual uint32 NextID();
64  virtual LogLevel GetLogLevel() const;
65
66 private:
67  // Needs to be "mutable" so can use it in GetEntries().
68  mutable base::Lock lock_;
69
70  // Last assigned source ID.  Incremented to get the next one.
71  base::subtle::Atomic32 last_id_;
72
73  size_t max_num_entries_;
74  EntryList entries_;
75
76  NetLog::LogLevel log_level_;
77
78  DISALLOW_COPY_AND_ASSIGN(CapturingNetLog);
79};
80
81// Helper class that exposes a similar API as BoundNetLog, but uses a
82// CapturingNetLog rather than the more generic NetLog.
83//
84// CapturingBoundNetLog can easily be converted to a BoundNetLog using the
85// bound() method.
86class CapturingBoundNetLog {
87 public:
88  CapturingBoundNetLog(const NetLog::Source& source, CapturingNetLog* net_log);
89
90  explicit CapturingBoundNetLog(size_t max_num_entries);
91
92  ~CapturingBoundNetLog();
93
94  // The returned BoundNetLog is only valid while |this| is alive.
95  BoundNetLog bound() const {
96    return BoundNetLog(source_, capturing_net_log_.get());
97  }
98
99  // Fills |entry_list| with all entries in the log.
100  void GetEntries(CapturingNetLog::EntryList* entry_list) const;
101
102  void Clear();
103
104  // Sets the log level of the underlying CapturingNetLog.
105  void SetLogLevel(NetLog::LogLevel log_level);
106
107 private:
108  NetLog::Source source_;
109  scoped_ptr<CapturingNetLog> capturing_net_log_;
110
111  DISALLOW_COPY_AND_ASSIGN(CapturingBoundNetLog);
112};
113
114}  // namespace net
115
116#endif  // NET_BASE_CAPTURING_NET_LOG_H_
117
118