| // 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_object.h" |
| |
| #include <cstdint> |
| |
| #include "absl/strings/string_view.h" |
| #include "absl/synchronization/mutex.h" |
| #include "quiche/common/platform/api/quiche_bug_tracker.h" |
| #include "quiche/common/quiche_cord_utils.h" |
| |
| namespace moqt { |
| |
| bool CachedObject::Append(uint64_t offset, absl::string_view payload) { |
| absl::MutexLock lock(mutex_); |
| uint64_t total_length = payload_received_locked(); |
| if (offset > total_length) { |
| QUICHE_BUG(cached_object_gap) << "Gap in bytes in CachedObject::Append"; |
| return false; |
| } |
| if (offset + payload.length() > metadata_.payload_length) { |
| // This object is larger than the declared size. |
| QUICHE_BUG(cached_object_too_large) |
| << "Object is larger than the declared size"; |
| return false; |
| } |
| if (offset + payload.length() <= total_length) { |
| return false; // No new data. |
| } |
| payload_.Append(payload.substr(total_length - offset)); |
| return true; |
| } |
| |
| PublishedObject CachedObject::ToPublishedObject(uint64_t offset) const { |
| PublishedObject result; |
| result.metadata = metadata(); |
| absl::MutexLock lock(mutex_); |
| uint64_t total_length = payload_received_locked(); |
| quiche::CordToMemSlicesTo(payload_.Subcord(offset, total_length - offset), |
| result.payload); |
| result.fin_after_this = fin_after_this_; |
| return result; |
| } |
| |
| bool CachedObject::OverlapIsEqual(uint64_t offset, |
| absl::string_view payload) const { |
| absl::MutexLock lock(mutex_); |
| uint64_t total_length = payload_received_locked(); |
| if (offset >= total_length) { |
| return true; |
| } |
| if (offset + payload.length() <= total_length) { |
| return payload_.Subcord(offset, payload.length()) == payload; |
| } |
| return payload_.Subcord(offset, total_length - offset) == |
| payload.substr(0, total_length - offset); |
| } |
| |
| } // namespace moqt |