1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef COMPONENTS_FEEDBACK_FEEDBACK_REPORT_H_
6#define COMPONENTS_FEEDBACK_FEEDBACK_REPORT_H_
7
8#include <string>
9
10#include "base/basictypes.h"
11#include "base/callback_forward.h"
12#include "base/files/file_path.h"
13#include "base/memory/ref_counted.h"
14#include "base/time/time.h"
15
16namespace base {
17class SequencedTaskRunner;
18}
19
20namespace feedback {
21
22typedef base::Callback<void(const std::string&)> QueueCallback;
23
24// This class holds a feedback report. Once a report is created, a disk backup
25// for it is created automatically. This backup needs to explicitly be
26// deleted by calling DeleteReportOnDisk.
27class FeedbackReport : public base::RefCounted<FeedbackReport> {
28 public:
29  FeedbackReport(const base::FilePath& path,
30                 const base::Time& upload_at,
31                 const std::string& data,
32                 scoped_refptr<base::SequencedTaskRunner> task_runner);
33
34  // Stops the disk write of the report and deletes the report file if already
35  // written.
36  void DeleteReportOnDisk();
37
38  const base::Time& upload_at() const { return upload_at_; }
39  const std::string& data() const { return data_; }
40
41  // Loads the reports still on disk and queues then using the given callback.
42  // This call blocks on the file reads.
43  static void LoadReportsAndQueue(const base::FilePath& user_dir,
44                                  QueueCallback callback);
45
46 private:
47  friend class base::RefCounted<FeedbackReport>;
48  virtual ~FeedbackReport();
49
50  // Name of the file corresponding to this report.
51  base::FilePath file_;
52
53  base::FilePath reports_path_;
54  base::Time upload_at_;  // Upload this report at or after this time.
55  std::string data_;
56
57  scoped_refptr<base::SequencedTaskRunner> reports_task_runner_;
58
59  DISALLOW_COPY_AND_ASSIGN(FeedbackReport);
60};
61
62}  // namespace feedback
63
64#endif  // COMPONENTS_FEEDBACK_FEEDBACK_REPORT_H_
65