blob: c0fe939185855f3e413354e624351636ac72e0d8 [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>
rsesek622175192016-03-28 15:41:389#include <utility>
[email protected]9e94ab772013-07-23 08:00:5710
11#include "base/bind.h"
thestig18dfb7a52014-08-26 10:44:0412#include "base/files/file_util.h"
sdefresne44eb1f22015-08-06 08:51:5513#include "base/location.h"
[email protected]9e94ab772013-07-23 08:00:5714#include "base/strings/string_number_conversions.h"
15#include "base/strings/string_split.h"
brettw83dc1612015-08-12 07:31:1816#include "base/strings/string_util.h"
sdefresne44eb1f22015-08-06 08:51:5517#include "base/thread_task_runner_handle.h"
18#include "base/threading/sequenced_worker_pool.h"
[email protected]9e94ab772013-07-23 08:00:5719
grunellb452aa32015-10-23 07:21:0920UploadList::UploadInfo::UploadInfo(const std::string& upload_id,
21 const base::Time& upload_time,
22 const std::string& local_id,
23 const base::Time& capture_time)
24 : upload_id(upload_id), upload_time(upload_time),
25 local_id(local_id), capture_time(capture_time) {}
[email protected]25021cfb2014-03-25 17:20:3526
grunellb452aa32015-10-23 07:21:0927UploadList::UploadInfo::UploadInfo(const std::string& upload_id,
28 const base::Time& upload_time)
29 : upload_id(upload_id), upload_time(upload_time) {}
[email protected]9e94ab772013-07-23 08:00:5730
31UploadList::UploadInfo::~UploadInfo() {}
32
sdefresne44eb1f22015-08-06 08:51:5533UploadList::UploadList(
34 Delegate* delegate,
35 const base::FilePath& upload_log_path,
36 const scoped_refptr<base::SequencedWorkerPool>& worker_pool)
[email protected]9e94ab772013-07-23 08:00:5737 : delegate_(delegate),
sdefresne44eb1f22015-08-06 08:51:5538 upload_log_path_(upload_log_path),
39 worker_pool_(worker_pool) {}
[email protected]9e94ab772013-07-23 08:00:5740
41UploadList::~UploadList() {}
42
43void UploadList::LoadUploadListAsynchronously() {
sdefresne44eb1f22015-08-06 08:51:5544 DCHECK(thread_checker_.CalledOnValidThread());
45 worker_pool_->PostTask(
[email protected]9e94ab772013-07-23 08:00:5746 FROM_HERE,
rsesek622175192016-03-28 15:41:3847 base::Bind(&UploadList::PerformLoadAndNotifyDelegate,
sdefresne44eb1f22015-08-06 08:51:5548 this, base::ThreadTaskRunnerHandle::Get()));
[email protected]9e94ab772013-07-23 08:00:5749}
50
51void UploadList::ClearDelegate() {
sdefresne44eb1f22015-08-06 08:51:5552 DCHECK(thread_checker_.CalledOnValidThread());
[email protected]9e94ab772013-07-23 08:00:5753 delegate_ = NULL;
54}
55
rsesek622175192016-03-28 15:41:3856void UploadList::PerformLoadAndNotifyDelegate(
sdefresne44eb1f22015-08-06 08:51:5557 const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
rsesek622175192016-03-28 15:41:3858 std::vector<UploadInfo> uploads;
59 LoadUploadList(&uploads);
sdefresne44eb1f22015-08-06 08:51:5560 task_runner->PostTask(
[email protected]9e94ab772013-07-23 08:00:5761 FROM_HERE,
rsesek622175192016-03-28 15:41:3862 base::Bind(&UploadList::SetUploadsAndNotifyDelegate, this,
63 std::move(uploads)));
[email protected]9e94ab772013-07-23 08:00:5764}
65
rsesek622175192016-03-28 15:41:3866void UploadList::LoadUploadList(std::vector<UploadInfo>* uploads) {
[email protected]9e94ab772013-07-23 08:00:5767 if (base::PathExists(upload_log_path_)) {
68 std::string contents;
[email protected]82f84b92013-08-30 18:23:5069 base::ReadFileToString(upload_log_path_, &contents);
brettw83dc1612015-08-12 07:31:1870 std::vector<std::string> log_entries = base::SplitString(
71 contents, base::kWhitespaceASCII, base::KEEP_WHITESPACE,
72 base::SPLIT_WANT_NONEMPTY);
rsesek622175192016-03-28 15:41:3873 ParseLogEntries(log_entries, uploads);
[email protected]9e94ab772013-07-23 08:00:5774 }
75}
76
[email protected]9e94ab772013-07-23 08:00:5777void UploadList::ParseLogEntries(
rsesek622175192016-03-28 15:41:3878 const std::vector<std::string>& log_entries,
79 std::vector<UploadInfo>* uploads) {
[email protected]9e94ab772013-07-23 08:00:5780 std::vector<std::string>::const_reverse_iterator i;
81 for (i = log_entries.rbegin(); i != log_entries.rend(); ++i) {
brettwc6f82b12015-07-21 21:37:3882 std::vector<std::string> components = base::SplitString(
83 *i, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
[email protected]9e94ab772013-07-23 08:00:5784 // Skip any blank (or corrupted) lines.
grunellb452aa32015-10-23 07:21:0985 if (components.size() < 2 || components.size() > 4)
[email protected]9e94ab772013-07-23 08:00:5786 continue;
[email protected]25021cfb2014-03-25 17:20:3587 base::Time upload_time;
[email protected]9e94ab772013-07-23 08:00:5788 double seconds_since_epoch;
[email protected]25021cfb2014-03-25 17:20:3589 if (!components[0].empty()) {
90 if (!base::StringToDouble(components[0], &seconds_since_epoch))
91 continue;
92 upload_time = base::Time::FromDoubleT(seconds_since_epoch);
93 }
94 UploadInfo info(components[1], upload_time);
grunellb452aa32015-10-23 07:21:0995
96 // Add local ID if present.
97 if (components.size() > 2)
[email protected]25021cfb2014-03-25 17:20:3598 info.local_id = components[2];
grunellb452aa32015-10-23 07:21:0999
100 // Add capture time if present.
101 if (components.size() > 3 &&
102 !components[3].empty() &&
103 base::StringToDouble(components[3], &seconds_since_epoch)) {
104 info.capture_time = base::Time::FromDoubleT(seconds_since_epoch);
105 }
106
rsesek622175192016-03-28 15:41:38107 uploads->push_back(info);
[email protected]9e94ab772013-07-23 08:00:57108 }
109}
110
rsesek622175192016-03-28 15:41:38111void UploadList::SetUploadsAndNotifyDelegate(std::vector<UploadInfo> uploads) {
sdefresne44eb1f22015-08-06 08:51:55112 DCHECK(thread_checker_.CalledOnValidThread());
rsesek622175192016-03-28 15:41:38113 uploads_ = std::move(uploads);
[email protected]9e94ab772013-07-23 08:00:57114 if (delegate_)
115 delegate_->OnUploadListAvailable();
116}
117
rsesek622175192016-03-28 15:41:38118void UploadList::GetUploads(size_t max_count,
[email protected]9e94ab772013-07-23 08:00:57119 std::vector<UploadInfo>* uploads) {
sdefresne44eb1f22015-08-06 08:51:55120 DCHECK(thread_checker_.CalledOnValidThread());
[email protected]9e94ab772013-07-23 08:00:57121 std::copy(uploads_.begin(),
rsesek622175192016-03-28 15:41:38122 uploads_.begin() + std::min(uploads_.size(), max_count),
[email protected]9e94ab772013-07-23 08:00:57123 std::back_inserter(*uploads));
124}