| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef NET_BASE_CAPTURING_NET_LOG_H_ |
| #define NET_BASE_CAPTURING_NET_LOG_H_ |
| #pragma once |
| |
| #include <vector> |
| |
| #include "base/atomicops.h" |
| #include "base/basictypes.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/synchronization/lock.h" |
| #include "base/time.h" |
| #include "net/base/net_log.h" |
| |
| namespace net { |
| |
| // CapturingNetLog is an implementation of NetLog that saves messages to a |
| // bounded buffer. |
| class CapturingNetLog : public NetLog { |
| public: |
| struct Entry { |
| Entry(EventType type, |
| const base::TimeTicks& time, |
| Source source, |
| EventPhase phase, |
| EventParameters* extra_parameters); |
| ~Entry(); |
| |
| EventType type; |
| base::TimeTicks time; |
| Source source; |
| EventPhase phase; |
| scoped_refptr<EventParameters> extra_parameters; |
| }; |
| |
| // Ordered set of entries that were logged. |
| typedef std::vector<Entry> EntryList; |
| |
| enum { kUnbounded = -1 }; |
| |
| // Creates a CapturingNetLog that logs a maximum of |max_num_entries| |
| // messages. |
| explicit CapturingNetLog(size_t max_num_entries); |
| virtual ~CapturingNetLog(); |
| |
| // Returns the list of all entries in the log. |
| void GetEntries(EntryList* entry_list) const; |
| |
| void Clear(); |
| |
| void SetLogLevel(NetLog::LogLevel log_level); |
| |
| // NetLog implementation: |
| virtual void AddEntry(EventType type, |
| const base::TimeTicks& time, |
| const Source& source, |
| EventPhase phase, |
| EventParameters* extra_parameters); |
| virtual uint32 NextID(); |
| virtual LogLevel GetLogLevel() const; |
| |
| private: |
| // Needs to be "mutable" so can use it in GetEntries(). |
| mutable base::Lock lock_; |
| |
| // Last assigned source ID. Incremented to get the next one. |
| base::subtle::Atomic32 last_id_; |
| |
| size_t max_num_entries_; |
| EntryList entries_; |
| |
| NetLog::LogLevel log_level_; |
| |
| DISALLOW_COPY_AND_ASSIGN(CapturingNetLog); |
| }; |
| |
| // Helper class that exposes a similar API as BoundNetLog, but uses a |
| // CapturingNetLog rather than the more generic NetLog. |
| // |
| // CapturingBoundNetLog can easily be converted to a BoundNetLog using the |
| // bound() method. |
| class CapturingBoundNetLog { |
| public: |
| CapturingBoundNetLog(const NetLog::Source& source, CapturingNetLog* net_log); |
| |
| explicit CapturingBoundNetLog(size_t max_num_entries); |
| |
| ~CapturingBoundNetLog(); |
| |
| // The returned BoundNetLog is only valid while |this| is alive. |
| BoundNetLog bound() const { |
| return BoundNetLog(source_, capturing_net_log_.get()); |
| } |
| |
| // Fills |entry_list| with all entries in the log. |
| void GetEntries(CapturingNetLog::EntryList* entry_list) const; |
| |
| void Clear(); |
| |
| // Sets the log level of the underlying CapturingNetLog. |
| void SetLogLevel(NetLog::LogLevel log_level); |
| |
| private: |
| NetLog::Source source_; |
| scoped_ptr<CapturingNetLog> capturing_net_log_; |
| |
| DISALLOW_COPY_AND_ASSIGN(CapturingBoundNetLog); |
| }; |
| |
| } // namespace net |
| |
| #endif // NET_BASE_CAPTURING_NET_LOG_H_ |
| |