// Copyright 2013 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.

#include "remoting/base/vlog_net_log.h"

#include <memory>

#include "base/json/json_writer.h"
#include "base/logging.h"
#include "base/macros.h"
#include "base/threading/thread_restrictions.h"
#include "base/time/time.h"
#include "base/values.h"
#include "net/log/net_log_entry.h"

namespace remoting {

class VlogNetLog::Observer : public net::NetLog::ThreadSafeObserver {
 public:
  Observer();
  ~Observer() override;

  // NetLog::ThreadSafeObserver overrides:
  void OnAddEntry(const net::NetLogEntry& entry) override;

 private:
  DISALLOW_COPY_AND_ASSIGN(Observer);
};

VlogNetLog::Observer::Observer() {
}

VlogNetLog::Observer::~Observer() {
}

void VlogNetLog::Observer::OnAddEntry(const net::NetLogEntry& entry) {
  if (VLOG_IS_ON(4)) {
    std::unique_ptr<base::Value> value(entry.ToValue());
    std::string json;
    base::JSONWriter::Write(*value, &json);
    VLOG(4) << json;
  }
}

VlogNetLog::VlogNetLog()
    : observer_(new Observer()) {
  AddObserver(observer_.get(),
              net::NetLogCaptureMode::IncludeCookiesAndCredentials());
}

VlogNetLog::~VlogNetLog() {
  RemoveObserver(observer_.get());
}

}  // namespace remoting
