OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include <algorithm> |
| 6 |
| 7 #include "net/http/http_byte_range.h" |
| 8 |
| 9 namespace { |
| 10 |
| 11 const int64 kPositionNotSpecified = -1; |
| 12 |
| 13 } // namespace |
| 14 |
| 15 namespace net { |
| 16 |
| 17 HttpByteRange::HttpByteRange() |
| 18 : first_byte_position_(kPositionNotSpecified), |
| 19 last_byte_position_(kPositionNotSpecified), |
| 20 suffix_length_(kPositionNotSpecified), |
| 21 has_computed_bounds_(false) { |
| 22 } |
| 23 |
| 24 bool HttpByteRange::IsSuffixByteRange() const { |
| 25 return suffix_length_ != kPositionNotSpecified; |
| 26 } |
| 27 |
| 28 bool HttpByteRange::HasFirstBytePosition() const { |
| 29 return first_byte_position_ != kPositionNotSpecified; |
| 30 } |
| 31 |
| 32 bool HttpByteRange::HasLastBytePosition() const { |
| 33 return last_byte_position_ != kPositionNotSpecified; |
| 34 } |
| 35 |
| 36 bool HttpByteRange::IsValid() const { |
| 37 if (suffix_length_ > 0) |
| 38 return true; |
| 39 return first_byte_position_ >= 0 && |
| 40 (last_byte_position_ == kPositionNotSpecified || |
| 41 last_byte_position_ >= first_byte_position_); |
| 42 } |
| 43 |
| 44 bool HttpByteRange::ComputeBounds(int64 size) { |
| 45 if (size < 0) |
| 46 return false; |
| 47 if (has_computed_bounds_) |
| 48 return false; |
| 49 has_computed_bounds_ = true; |
| 50 |
| 51 // Empty values. |
| 52 if (!HasFirstBytePosition() && |
| 53 !HasLastBytePosition() && |
| 54 !IsSuffixByteRange()) { |
| 55 first_byte_position_ = 0; |
| 56 last_byte_position_ = size - 1; |
| 57 return true; |
| 58 } |
| 59 if (!IsValid()) |
| 60 return false; |
| 61 if (IsSuffixByteRange()) { |
| 62 first_byte_position_ = size - std::min(size, suffix_length_); |
| 63 last_byte_position_ = size - 1; |
| 64 return true; |
| 65 } |
| 66 if (first_byte_position_ < size) { |
| 67 if (HasLastBytePosition()) |
| 68 last_byte_position_ = std::min(size - 1, last_byte_position_); |
| 69 else |
| 70 last_byte_position_ = size - 1; |
| 71 return true; |
| 72 } |
| 73 return false; |
| 74 } |
| 75 |
| 76 } // namespace net |
OLD | NEW |