// Copyright 2016 The Chromium Embedded Framework 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 CEF_LIBCEF_COMMON_CEF_CRASH_REPORT_UPLOAD_THREAD_H_
#define CEF_LIBCEF_COMMON_CEF_CRASH_REPORT_UPLOAD_THREAD_H_

#include "third_party/crashpad/crashpad/handler/crash_report_upload_thread.h"

class CefCrashReportUploadThread : public crashpad::CrashReportUploadThread {
 public:
  CefCrashReportUploadThread(crashpad::CrashReportDatabase* database,
                             const std::string& url,
                             const Options& options,
                             int max_uploads);
  ~CefCrashReportUploadThread();

 private:
  void ProcessPendingReports() override;
  void ProcessPendingReport(
      const crashpad::CrashReportDatabase::Report& report) override;
  ParameterMap FilterParameters(const ParameterMap& parameters) override;

  bool UploadsEnabled() const;

  bool MaxUploadsEnabled() const;
  bool MaxUploadsExceeded() const;

  bool BackoffPending() const;
  void IncreaseBackoff();
  void ResetBackoff();

  int max_uploads_;

  // Track the number of uploads that have completed within the last 24 hours.
  // Only used when RateLimitEnabled() is true. Value is reset each time
  // ProcessPendingReports() is called.
  int recent_upload_ct_ = 0;

  DISALLOW_COPY_AND_ASSIGN(CefCrashReportUploadThread);
};

#endif  // CEF_LIBCEF_COMMON_CEF_CRASH_REPORT_UPLOAD_THREAD_H_
