blob: fd156985aa7e1e68e6ef14bf47473827f77cd3d7 [file] [log] [blame]
// Copyright 2024 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 "quiche/quic/moqt/moqt_subscribe_windows.h"
#include <cstdint>
#include <limits>
#include <optional>
#include <vector>
#include "quiche/quic/core/quic_interval.h"
#include "quiche/quic/moqt/moqt_messages.h"
#include "quiche/quic/platform/api/quic_bug_tracker.h"
#include "quiche/common/platform/api/quiche_logging.h"
#include "quiche/web_transport/web_transport.h"
namespace moqt {
std::optional<webtransport::StreamId> SendStreamMap::GetStreamFor(
DataStreamIndex index) const {
auto it = send_streams_.find(index);
if (it == send_streams_.end()) {
return std::nullopt;
}
return it->second;
}
void SendStreamMap::AddStream(DataStreamIndex index,
webtransport::StreamId stream_id) {
auto [it, success] = send_streams_.emplace(index, stream_id);
QUIC_BUG_IF(quic_bug_moqt_draft_03_02, !success) << "Stream already added";
}
void SendStreamMap::RemoveStream(DataStreamIndex index) {
send_streams_.erase(index);
}
bool SubscribeWindow::TruncateStart(Location start) {
if (start < start_) {
return false;
}
start_ = start;
return true;
}
bool SubscribeWindow::TruncateEnd(uint64_t end_group) {
if (end_group > end_.group) {
return false;
}
end_ = Location(end_group, UINT64_MAX);
return true;
}
bool SubscribeWindow::TruncateEnd(Location largest_id) {
if (largest_id > end_) {
return false;
}
end_ = largest_id;
return true;
}
std::vector<webtransport::StreamId> SendStreamMap::GetAllStreams() const {
std::vector<webtransport::StreamId> ids;
for (const auto& [index, stream_id] : send_streams_) {
ids.push_back(stream_id);
}
return ids;
}
std::vector<webtransport::StreamId> SendStreamMap::GetStreamsForGroup(
uint64_t group_id) const {
const auto start_it = send_streams_.lower_bound(DataStreamIndex(group_id, 0));
const auto end_it = send_streams_.upper_bound(
DataStreamIndex(group_id, std::numeric_limits<uint64_t>::max()));
std::vector<webtransport::StreamId> ids;
for (auto it = start_it; it != end_it; ++it) {
ids.push_back(it->second);
}
return ids;
}
bool SubscribeWindow::GroupInWindow(uint64_t group) const {
const quic::QuicInterval<Location> group_window(
Location(group, 0),
Location(group, std::numeric_limits<uint64_t>::max()));
const quic::QuicInterval<Location> subscription_window(start_, end_);
return group_window.Intersects(subscription_window);
}
} // namespace moqt