| Index: net/http/http_byte_range.cc
|
| ===================================================================
|
| --- net/http/http_byte_range.cc (revision 0)
|
| +++ net/http/http_byte_range.cc (revision 0)
|
| @@ -0,0 +1,76 @@
|
| +// Copyright (c) 2009 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 <algorithm>
|
| +
|
| +#include "net/http/http_byte_range.h"
|
| +
|
| +namespace {
|
| +
|
| +const int64 kPositionNotSpecified = -1;
|
| +
|
| +} // namespace
|
| +
|
| +namespace net {
|
| +
|
| +HttpByteRange::HttpByteRange()
|
| + : first_byte_position_(kPositionNotSpecified),
|
| + last_byte_position_(kPositionNotSpecified),
|
| + suffix_length_(kPositionNotSpecified),
|
| + has_computed_bounds_(false) {
|
| +}
|
| +
|
| +bool HttpByteRange::IsSuffixByteRange() const {
|
| + return suffix_length_ != kPositionNotSpecified;
|
| +}
|
| +
|
| +bool HttpByteRange::HasFirstBytePosition() const {
|
| + return first_byte_position_ != kPositionNotSpecified;
|
| +}
|
| +
|
| +bool HttpByteRange::HasLastBytePosition() const {
|
| + return last_byte_position_ != kPositionNotSpecified;
|
| +}
|
| +
|
| +bool HttpByteRange::IsValid() const {
|
| + if (suffix_length_ > 0)
|
| + return true;
|
| + return first_byte_position_ >= 0 &&
|
| + (last_byte_position_ == kPositionNotSpecified ||
|
| + last_byte_position_ >= first_byte_position_);
|
| +}
|
| +
|
| +bool HttpByteRange::ComputeBounds(int64 size) {
|
| + if (size < 0)
|
| + return false;
|
| + if (has_computed_bounds_)
|
| + return false;
|
| + has_computed_bounds_ = true;
|
| +
|
| + // Empty values.
|
| + if (!HasFirstBytePosition() &&
|
| + !HasLastBytePosition() &&
|
| + !IsSuffixByteRange()) {
|
| + first_byte_position_ = 0;
|
| + last_byte_position_ = size - 1;
|
| + return true;
|
| + }
|
| + if (!IsValid())
|
| + return false;
|
| + if (IsSuffixByteRange()) {
|
| + first_byte_position_ = size - std::min(size, suffix_length_);
|
| + last_byte_position_ = size - 1;
|
| + return true;
|
| + }
|
| + if (first_byte_position_ < size) {
|
| + if (HasLastBytePosition())
|
| + last_byte_position_ = std::min(size - 1, last_byte_position_);
|
| + else
|
| + last_byte_position_ = size - 1;
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +} // namespace net
|
|
|