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