1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#ifndef CHROME_BROWSER_UPLOAD_LIST_H_
6a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#define CHROME_BROWSER_UPLOAD_LIST_H_
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <string>
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <vector>
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/files/file_path.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/gtest_prod_util.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/ref_counted.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Loads and parses an upload list text file of the format
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// time,id[,local_id]
18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// time,id[,local_id]
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// etc.
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// where each line represents an upload and "time" is Unix time. Must be used
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// from the UI thread. The loading and parsing is done on a blocking pool task
22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// runner. A line may or may not contain "local_id".
23a3f7b4e666c476898878fa745f637129375cd889Ben Murdochclass UploadList : public base::RefCountedThreadSafe<UploadList> {
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
25a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  struct UploadInfo {
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    UploadInfo(const std::string& id,
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch               const base::Time& t,
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch               const std::string& local_id);
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    UploadInfo(const std::string& id, const base::Time& t);
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ~UploadInfo();
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::string id;
33a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    base::Time time;
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // ID for a locally stored object that may or may not be uploaded.
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    std::string local_id;
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  class Delegate {
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   public:
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Invoked when the upload list has been loaded. Will be called on the
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // UI thread.
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual void OnUploadListAvailable() = 0;
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   protected:
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual ~Delegate() {}
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Creates a new upload list with the given callback delegate.
49a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  UploadList(Delegate* delegate, const base::FilePath& upload_log_path);
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Starts loading the upload list. OnUploadListAvailable will be called when
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // loading is complete.
53a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  void LoadUploadListAsynchronously();
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Clears the delegate, so that any outstanding asynchronous load will not
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // call the delegate on completion.
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void ClearDelegate();
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Populates |uploads| with the |max_count| most recent uploads,
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // in reverse chronological order.
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Must be called only after OnUploadListAvailable has been called.
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void GetUploads(unsigned int max_count, std::vector<UploadInfo>* uploads);
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected:
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual ~UploadList();
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Reads the upload log and stores the entries in |uploads_|.
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void LoadUploadList();
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Adds |info| to |uploads_|.
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void AppendUploadInfo(const UploadInfo& info);
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Clear |uploads_|.
741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void ClearUploads();
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
77a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  friend class base::RefCountedThreadSafe<UploadList>;
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FRIEND_TEST_ALL_PREFIXES(UploadListTest, ParseLogEntries);
79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  FRIEND_TEST_ALL_PREFIXES(UploadListTest, ParseLogEntriesWithLocalId);
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Manages the background thread work for LoadUploadListAsynchronously().
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void LoadUploadListAndInformDelegateOfCompletion();
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Calls the delegate's callback method, if there is a delegate.
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void InformDelegateOfCompletion();
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Parses upload log lines, converting them to UploadInfo entries.
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void ParseLogEntries(const std::vector<std::string>& log_entries);
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector<UploadInfo> uploads_;
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Delegate* delegate_;
92a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  const base::FilePath upload_log_path_;
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DISALLOW_COPY_AND_ASSIGN(UploadList);
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
97a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#endif  // CHROME_BROWSER_UPLOAD_LIST_H_
98