Home | History | Annotate | Download | only in browser
      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".
     23 class 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