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