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