blob: 1601e21b0d9a7e753951c811d487f6a87e811a94 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/download/internal/entry_utils.h"
#include <algorithm>
#include "components/download/internal/entry.h"
#include "components/download/public/download_metadata.h"
namespace download {
namespace util {
uint32_t GetNumberOfLiveEntriesForClient(DownloadClient client,
const std::vector<Entry*>& entries) {
uint32_t count = 0;
for (auto* entry : entries)
if (entry->client == client && entry->state != Entry::State::COMPLETE)
count++;
return count;
}
std::map<DownloadClient, std::vector<DownloadMetaData>>
MapEntriesToMetadataForClients(const std::set<DownloadClient>& clients,
const std::vector<Entry*>& entries) {
std::map<DownloadClient, std::vector<DownloadMetaData>> categorized;
for (auto* entry : entries) {
DownloadClient client = entry->client;
if (clients.find(client) == clients.end())
client = DownloadClient::INVALID;
categorized[client].push_back(BuildDownloadMetaData(entry));
}
return categorized;
}
Criteria GetSchedulingCriteria(const Model::EntryList& entries,
int optimal_battery_percentage) {
Criteria criteria(optimal_battery_percentage);
// The scheduling criteria can only become less strict, from requiring battery
// charging to not requiring charging, from requiring unmetered network to
// any network. Optimal battery level can only decrease.
for (auto* const entry : entries) {
DCHECK(entry);
const SchedulingParams& scheduling_params = entry->scheduling_params;
switch (scheduling_params.battery_requirements) {
case SchedulingParams::BatteryRequirements::BATTERY_INSENSITIVE:
criteria.requires_battery_charging = false;
criteria.optimal_battery_percentage =
std::min(criteria.optimal_battery_percentage,
DeviceStatus::kBatteryPercentageAlwaysStart);
break;
case SchedulingParams::BatteryRequirements::BATTERY_SENSITIVE:
criteria.requires_battery_charging = false;
criteria.optimal_battery_percentage = std::min(
criteria.optimal_battery_percentage, optimal_battery_percentage);
break;
case SchedulingParams::BatteryRequirements::BATTERY_CHARGING:
break;
default:
NOTREACHED();
}
if (scheduling_params.network_requirements ==
SchedulingParams::NetworkRequirements::NONE) {
criteria.requires_unmetered_network = false;
}
}
return criteria;
}
bool EntryBetterThan(const Entry& lhs, const Entry& rhs) {
if (lhs.scheduling_params.priority != rhs.scheduling_params.priority)
return lhs.scheduling_params.priority > rhs.scheduling_params.priority;
if (lhs.scheduling_params.cancel_time != rhs.scheduling_params.cancel_time) {
return lhs.scheduling_params.cancel_time <
rhs.scheduling_params.cancel_time;
}
return lhs.create_time < rhs.create_time;
}
DownloadMetaData BuildDownloadMetaData(Entry* entry) {
DCHECK(entry);
DownloadMetaData meta_data;
meta_data.guid = entry->guid;
if (entry->state == Entry::State::COMPLETE) {
meta_data.completion_info =
CompletionInfo(entry->target_file_path, entry->bytes_downloaded);
}
return meta_data;
}
} // namespace util
} // namespace download