1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_TASK_LOGGER_H_
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define CHROME_BROWSER_SYNC_FILE_SYSTEM_TASK_LOGGER_H_
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <deque>
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <string>
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <vector>
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/memory/weak_ptr.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/observer_list.h"
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/time/time.h"
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace sync_file_system {
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class TaskLogger : public base::SupportsWeakPtr<TaskLogger> {
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  struct TaskLog {
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    int log_id;
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::TimeTicks start_time;
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::TimeTicks end_time;
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::string task_description;
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::string result_description;
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::vector<std::string> details;
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    TaskLog();
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ~TaskLog();
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  };
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  typedef std::deque<TaskLog*> LogList;
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  class Observer {
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   public:
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    virtual void OnLogRecorded(const TaskLog& task_log) = 0;
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   protected:
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Observer() {}
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    virtual ~Observer() {}
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   private:
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(Observer);
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  };
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TaskLogger();
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ~TaskLogger();
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void RecordLog(scoped_ptr<TaskLog> log);
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void ClearLog();
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void AddObserver(Observer* observer);
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void RemoveObserver(Observer* observer);
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const LogList& GetLog() const;
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::deque<TaskLog*> log_history_;
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ObserverList<Observer> observers_;
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TaskLogger);
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace sync_file_system
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // CHROME_BROWSER_SYNC_FILE_SYSTEM_TASK_LOGGER_H_
69