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

#ifndef WRITE_TO_FILE_NET_LOG_OBSERVER_H_
#define WRITE_TO_FILE_NET_LOG_OBSERVER_H_

#include <stdio.h>

#include "base/files/scoped_file.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "net/log/net_log.h"

namespace base {
class DictionaryValue;
class FilePath;
class Value;
}

namespace net {

class URLRequestContext;

// WriteToFileNetLogObserver watches the NetLog event stream, and sends all
// entries to a file specified on creation.
//
// The text file will contain a single JSON object.
class NET_EXPORT WriteToFileNetLogObserver : public NetLog::ThreadSafeObserver {
 public:
  WriteToFileNetLogObserver();
  ~WriteToFileNetLogObserver() override;

  // Sets the capture mode to log at. Must be called before StartObserving.
  void set_capture_mode(NetLogCaptureMode capture_mode);

  // Starts observing |net_log| and writes output to |file|.  Must not already
  // be watching a NetLog.  Separate from constructor to enforce thread safety.
  //
  // |file| must be a non-NULL empty file that's open for writing.
  //
  // |constants| is an optional legend for decoding constant values used in the
  // log.  It should generally be a modified version of GetNetConstants().  If
  // not present, the output of GetNetConstants() will be used.
  //
  // |url_request_context| is an optional URLRequestContext that will be used to
  // pre-populate the log with information about in-progress events.
  // If the context is non-NULL, this must be called on the context's thread.
  void StartObserving(NetLog* net_log,
                      base::ScopedFILE file,
                      base::Value* constants,
                      URLRequestContext* url_request_context);

  // Stops observing net_log().  Must already be watching.  Must be called
  // before destruction of the WriteToFileNetLogObserver and the NetLog.
  //
  // |url_request_context| is an optional argument used to added additional
  // network stack state to the log.  If the context is non-NULL, this must be
  // called on the context's thread.
  void StopObserving(URLRequestContext* url_request_context);

  // net::NetLog::ThreadSafeObserver implementation:
  void OnAddEntry(const NetLog::Entry& entry) override;

 private:
  base::ScopedFILE file_;

  // The capture mode to log at.
  NetLogCaptureMode capture_mode_;

  // True if OnAddEntry() has been called at least once.
  bool added_events_;

  DISALLOW_COPY_AND_ASSIGN(WriteToFileNetLogObserver);
};

}  // namespace net

#endif  // WRITE_TO_FILE_NET_LOG_OBSERVER_H_
