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#include "chrome/browser/upload_list.h"
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <algorithm>
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <iterator>
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/bind.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/file_util.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/string_number_conversions.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/string_split.h"
14a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/browser/browser_thread.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
16a3f7b4e666c476898878fa745f637129375cd889Ben Murdochusing content::BrowserThread;
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
18a3f7b4e666c476898878fa745f637129375cd889Ben MurdochUploadList::UploadInfo::UploadInfo(const std::string& c, const base::Time& t)
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    : id(c), time(t) {}
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochUploadList::UploadInfo::~UploadInfo() {}
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochUploadList::UploadList(Delegate* delegate,
24a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                       const base::FilePath& upload_log_path)
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    : delegate_(delegate),
26a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      upload_log_path_(upload_log_path) {}
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochUploadList::~UploadList() {}
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
30a3f7b4e666c476898878fa745f637129375cd889Ben Murdochvoid UploadList::LoadUploadListAsynchronously() {
31a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
32a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  BrowserThread::PostBlockingPoolTask(
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      FROM_HERE,
34a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      base::Bind(&UploadList::LoadUploadListAndInformDelegateOfCompletion,
35a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                 this));
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid UploadList::ClearDelegate() {
39a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  delegate_ = NULL;
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid UploadList::LoadUploadListAndInformDelegateOfCompletion() {
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  LoadUploadList();
45a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  BrowserThread::PostTask(
46a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      BrowserThread::UI,
47a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      FROM_HERE,
48a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      base::Bind(&UploadList::InformDelegateOfCompletion, this));
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid UploadList::LoadUploadList() {
52a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  if (base::PathExists(upload_log_path_)) {
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::string contents;
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    base::ReadFileToString(upload_log_path_, &contents);
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::vector<std::string> log_entries;
56a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    base::SplitStringAlongWhitespace(contents, &log_entries);
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ClearUploads();
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ParseLogEntries(log_entries);
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid UploadList::AppendUploadInfo(const UploadInfo& info) {
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  uploads_.push_back(info);
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void UploadList::ClearUploads() {
671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  uploads_.clear();
681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid UploadList::ParseLogEntries(
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::vector<std::string>& log_entries) {
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector<std::string>::const_reverse_iterator i;
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (i = log_entries.rbegin(); i != log_entries.rend(); ++i) {
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::vector<std::string> components;
75a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    base::SplitString(*i, ',', &components);
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Skip any blank (or corrupted) lines.
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (components.size() != 2)
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      continue;
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    double seconds_since_epoch;
80a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    if (!base::StringToDouble(components[0], &seconds_since_epoch))
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      continue;
82a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    UploadInfo info(components[1],
83a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                    base::Time::FromDoubleT(seconds_since_epoch));
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    uploads_.push_back(info);
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid UploadList::InformDelegateOfCompletion() {
89a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (delegate_)
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    delegate_->OnUploadListAvailable();
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid UploadList::GetUploads(unsigned int max_count,
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                            std::vector<UploadInfo>* uploads) {
96a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::copy(uploads_.begin(),
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            uploads_.begin() + std::min<size_t>(uploads_.size(), max_count),
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            std::back_inserter(*uploads));
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
101