// Copyright 2016 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_NETWORK_COBALT_NET_LOG_H_
#define COBALT_NETWORK_COBALT_NET_LOG_H_

#include "base/atomic_sequence_num.h"
#include "base/file_path.h"
#include "base/memory/scoped_ptr.h"
#include "base/observer_list.h"
#include "base/synchronization/lock.h"
#include "net/base/net_log.h"

namespace cobalt {
namespace network {

class NetLogLogger;

// CobaltNetLog is an implementation of NetLog that dispatches network log
// messages to a list of observers.
//
// All methods are thread safe, with the exception that no NetLog or
// NetLog::ThreadSafeObserver functions may be called by an observer's
// OnAddEntry() method.  Doing so will result in a deadlock.
//
// CobaltNetLog is largely copied from ChromeNetLog. The differences are the
// removal of a different type of Observer, and the path and level are passed
// in as constructor parameters.
class CobaltNetLog : public net::NetLog {
 public:
  CobaltNetLog(const FilePath& log_path, net::NetLog::LogLevel level);
  virtual ~CobaltNetLog();

  // NetLog implementation:
  uint32 NextID() OVERRIDE;
  LogLevel GetLogLevel() const OVERRIDE;
  void AddThreadSafeObserver(ThreadSafeObserver* observer,
                             LogLevel log_level) OVERRIDE;
  void SetObserverLogLevel(ThreadSafeObserver* observer,
                           LogLevel log_level) OVERRIDE;
  void RemoveThreadSafeObserver(ThreadSafeObserver* observer) OVERRIDE;

 private:
  // NetLog implementation:
  void OnAddEntry(const net::NetLog::Entry& entry) OVERRIDE;

  // Called whenever an observer is added or removed, or has its log level
  // changed.  Must have acquired |lock_| prior to calling.
  void UpdateLogLevel();

  // |lock_| protects access to |observers_|.
  base::Lock lock_;

  // Used to get a unique source id.
  base::AtomicSequenceNumber source_id_;

  // The lowest allowed log level, regardless of any ChromeNetLogObservers.
  // Normally defaults to LOG_BASIC, but can be changed with command line flags.
  LogLevel base_log_level_;

  // The current log level.
  base::subtle::Atomic32 effective_log_level_;

  scoped_ptr<NetLogLogger> net_log_logger_;

  // |lock_| must be acquired whenever reading or writing to this.
  ObserverList<ThreadSafeObserver, true> observers_;

  DISALLOW_COPY_AND_ASSIGN(CobaltNetLog);
};

}  // namespace network
}  // namespace cobalt

#endif  // COBALT_NETWORK_COBALT_NET_LOG_H_
