// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ash/webui/projector_app/pending_screencast.h"
#include <string>
#include "base/files/file_path.h"
#include "base/time/time.h"
namespace ash {
namespace {
constexpr int64_t kPendingScreencastContainerDiffThresholdInBytes = 600 * 1024;
} // namespace
PendingScreencastContainer::PendingScreencastContainer() = default;
PendingScreencastContainer::PendingScreencastContainer(
const base::FilePath& container_dir)
: container_dir_(container_dir) {}
PendingScreencastContainer::PendingScreencastContainer(
const base::FilePath& container_dir,
const std::string& name,
int64_t total_size_in_bytes,
int64_t bytes_transferred)
: container_dir_(container_dir),
total_size_in_bytes_(total_size_in_bytes),
bytes_transferred_(bytes_transferred) {
pending_screencast_.name = name;
UpdatePendingScreencast();
}
PendingScreencastContainer::PendingScreencastContainer(
const PendingScreencastContainer& rhs) = default;
PendingScreencastContainer& PendingScreencastContainer::operator=(
const PendingScreencastContainer& rhs) = default;
PendingScreencastContainer::~PendingScreencastContainer() = default;
void PendingScreencastContainer::SetTotalSizeInBytes(int64_t size) {
total_size_in_bytes_ = size;
UpdatePendingScreencast();
}
void PendingScreencastContainer::SetTotalBytesTransferred(int64_t size) {
bytes_transferred_ = size;
UpdatePendingScreencast();
}
void PendingScreencastContainer::SetName(const std::string& name) {
pending_screencast_.name = name;
}
void PendingScreencastContainer::SetCreatedTime(base::Time created_time) {
pending_screencast_.created_time =
created_time.is_null()
? 0.0
: created_time.InMillisecondsFSinceUnixEpochIgnoringNull();
}
bool PendingScreencastContainer::operator==(
const PendingScreencastContainer& rhs) const {
// When the bytes of pending screencast didn't change a lot (less than
// kPendingScreencastContainerDiffThresholdInBytes), we consider this pending
// screencast doesn't change. It helps to reduce the frequency of updating the
// pending screencast list.
return container_dir_ == rhs.container_dir_ &&
pending_screencast_.name == rhs.pending_screencast_.name &&
std::abs(bytes_transferred_ - rhs.bytes_transferred_) <
kPendingScreencastContainerDiffThresholdInBytes &&
total_size_in_bytes_ == rhs.total_size_in_bytes_ &&
rhs.pending_screencast_.upload_failed ==
pending_screencast_.upload_failed;
}
void PendingScreencastContainer::UpdatePendingScreencast() {
if (total_size_in_bytes_ == 0) {
return;
}
pending_screencast_.upload_progress =
(bytes_transferred_ * 100) / total_size_in_bytes_;
}
// Operator < used for PendingScreencastSet.
bool PendingScreencastContainerSetComparator::operator()(
const PendingScreencastContainer& a,
const PendingScreencastContainer& b) const {
return a.container_dir() < b.container_dir() ||
a.bytes_transferred() < b.bytes_transferred();
}
} // namespace ash