blob: 893a7de8ac64a8f70cd06a5fd973cd528aac7cfd [file] [log] [blame]
[email protected]9e94ab772013-07-23 08:00:571// 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
sdefresne44eb1f22015-08-06 08:51:555#include "components/upload_list/upload_list.h"
[email protected]9e94ab772013-07-23 08:00:576
7#include <algorithm>
8#include <iterator>
9
10#include "base/bind.h"
thestig18dfb7a52014-08-26 10:44:0411#include "base/files/file_util.h"
sdefresne44eb1f22015-08-06 08:51:5512#include "base/location.h"
[email protected]9e94ab772013-07-23 08:00:5713#include "base/strings/string_number_conversions.h"
14#include "base/strings/string_split.h"
brettw83dc1612015-08-12 07:31:1815#include "base/strings/string_util.h"
sdefresne44eb1f22015-08-06 08:51:5516#include "base/thread_task_runner_handle.h"
17#include "base/threading/sequenced_worker_pool.h"
[email protected]9e94ab772013-07-23 08:00:5718
grunellb452aa32015-10-23 07:21:0919UploadList::UploadInfo::UploadInfo(const std::string& upload_id,
20 const base::Time& upload_time,
21 const std::string& local_id,
22 const base::Time& capture_time)
23 : upload_id(upload_id), upload_time(upload_time),
24 local_id(local_id), capture_time(capture_time) {}
[email protected]25021cfb2014-03-25 17:20:3525
grunellb452aa32015-10-23 07:21:0926UploadList::UploadInfo::UploadInfo(const std::string& upload_id,
27 const base::Time& upload_time)
28 : upload_id(upload_id), upload_time(upload_time) {}
[email protected]9e94ab772013-07-23 08:00:5729
30UploadList::UploadInfo::~UploadInfo() {}
31
sdefresne44eb1f22015-08-06 08:51:5532UploadList::UploadList(
33 Delegate* delegate,
34 const base::FilePath& upload_log_path,
35 const scoped_refptr<base::SequencedWorkerPool>& worker_pool)
[email protected]9e94ab772013-07-23 08:00:5736 : delegate_(delegate),
sdefresne44eb1f22015-08-06 08:51:5537 upload_log_path_(upload_log_path),
38 worker_pool_(worker_pool) {}
[email protected]9e94ab772013-07-23 08:00:5739
40UploadList::~UploadList() {}
41
42void UploadList::LoadUploadListAsynchronously() {
sdefresne44eb1f22015-08-06 08:51:5543 DCHECK(thread_checker_.CalledOnValidThread());
44 worker_pool_->PostTask(
[email protected]9e94ab772013-07-23 08:00:5745 FROM_HERE,
46 base::Bind(&UploadList::LoadUploadListAndInformDelegateOfCompletion,
sdefresne44eb1f22015-08-06 08:51:5547 this, base::ThreadTaskRunnerHandle::Get()));
[email protected]9e94ab772013-07-23 08:00:5748}
49
50void UploadList::ClearDelegate() {
sdefresne44eb1f22015-08-06 08:51:5551 DCHECK(thread_checker_.CalledOnValidThread());
[email protected]9e94ab772013-07-23 08:00:5752 delegate_ = NULL;
53}
54
sdefresne44eb1f22015-08-06 08:51:5555void UploadList::LoadUploadListAndInformDelegateOfCompletion(
56 const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
[email protected]9e94ab772013-07-23 08:00:5757 LoadUploadList();
sdefresne44eb1f22015-08-06 08:51:5558 task_runner->PostTask(
[email protected]9e94ab772013-07-23 08:00:5759 FROM_HERE,
60 base::Bind(&UploadList::InformDelegateOfCompletion, this));
61}
62
63void UploadList::LoadUploadList() {
64 if (base::PathExists(upload_log_path_)) {
65 std::string contents;
[email protected]82f84b92013-08-30 18:23:5066 base::ReadFileToString(upload_log_path_, &contents);
brettw83dc1612015-08-12 07:31:1867 std::vector<std::string> log_entries = base::SplitString(
68 contents, base::kWhitespaceASCII, base::KEEP_WHITESPACE,
69 base::SPLIT_WANT_NONEMPTY);
[email protected]1aa80102013-10-23 09:23:1570 ClearUploads();
[email protected]9e94ab772013-07-23 08:00:5771 ParseLogEntries(log_entries);
72 }
73}
74
75void UploadList::AppendUploadInfo(const UploadInfo& info) {
76 uploads_.push_back(info);
77}
78
[email protected]1aa80102013-10-23 09:23:1579void UploadList::ClearUploads() {
80 uploads_.clear();
81}
82
[email protected]9e94ab772013-07-23 08:00:5783void UploadList::ParseLogEntries(
84 const std::vector<std::string>& log_entries) {
85 std::vector<std::string>::const_reverse_iterator i;
86 for (i = log_entries.rbegin(); i != log_entries.rend(); ++i) {
brettwc6f82b12015-07-21 21:37:3887 std::vector<std::string> components = base::SplitString(
88 *i, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
[email protected]9e94ab772013-07-23 08:00:5789 // Skip any blank (or corrupted) lines.
grunellb452aa32015-10-23 07:21:0990 if (components.size() < 2 || components.size() > 4)
[email protected]9e94ab772013-07-23 08:00:5791 continue;
[email protected]25021cfb2014-03-25 17:20:3592 base::Time upload_time;
[email protected]9e94ab772013-07-23 08:00:5793 double seconds_since_epoch;
[email protected]25021cfb2014-03-25 17:20:3594 if (!components[0].empty()) {
95 if (!base::StringToDouble(components[0], &seconds_since_epoch))
96 continue;
97 upload_time = base::Time::FromDoubleT(seconds_since_epoch);
98 }
99 UploadInfo info(components[1], upload_time);
grunellb452aa32015-10-23 07:21:09100
101 // Add local ID if present.
102 if (components.size() > 2)
[email protected]25021cfb2014-03-25 17:20:35103 info.local_id = components[2];
grunellb452aa32015-10-23 07:21:09104
105 // Add capture time if present.
106 if (components.size() > 3 &&
107 !components[3].empty() &&
108 base::StringToDouble(components[3], &seconds_since_epoch)) {
109 info.capture_time = base::Time::FromDoubleT(seconds_since_epoch);
110 }
111
[email protected]9e94ab772013-07-23 08:00:57112 uploads_.push_back(info);
113 }
114}
115
116void UploadList::InformDelegateOfCompletion() {
sdefresne44eb1f22015-08-06 08:51:55117 DCHECK(thread_checker_.CalledOnValidThread());
[email protected]9e94ab772013-07-23 08:00:57118 if (delegate_)
119 delegate_->OnUploadListAvailable();
120}
121
122void UploadList::GetUploads(unsigned int max_count,
123 std::vector<UploadInfo>* uploads) {
sdefresne44eb1f22015-08-06 08:51:55124 DCHECK(thread_checker_.CalledOnValidThread());
[email protected]9e94ab772013-07-23 08:00:57125 std::copy(uploads_.begin(),
126 uploads_.begin() + std::min<size_t>(uploads_.size(), max_count),
127 std::back_inserter(*uploads));
128}