| Index: net/base/upload_data.cc
|
| diff --git a/net/base/upload_data.cc b/net/base/upload_data.cc
|
| index 04968736f1eebb5f634f10ab0a25528e0d808601..a23b25ee97bafb4be96c740cec1ee664a22b9994 100644
|
| --- a/net/base/upload_data.cc
|
| +++ b/net/base/upload_data.cc
|
| @@ -5,6 +5,7 @@
|
| #include "net/base/upload_data.h"
|
|
|
| #include "base/file_util.h"
|
| +#include "base/platform_file.h"
|
| #include "base/logging.h"
|
|
|
| namespace net {
|
| @@ -17,28 +18,67 @@ uint64 UploadData::GetContentLength() const {
|
| return len;
|
| }
|
|
|
| -uint64 UploadData::Element::GetContentLength() const {
|
| - if (override_content_length_)
|
| - return content_length_;
|
| +void UploadData::CloseFiles() {
|
| + std::vector<Element>::iterator it = elements_.begin();
|
| + for (; it != elements_.end(); ++it) {
|
| + if (it->type() == TYPE_FILE)
|
| + it->Close();
|
| + }
|
| +}
|
| +
|
| +base::PlatformFile UploadData::Element::platform_file() const {
|
| + DCHECK(type_ == TYPE_FILE) << "platform_file on non-file Element";
|
| +
|
| + return file_;
|
| +}
|
| +
|
| +void UploadData::Element::Close() {
|
| + DCHECK(type_ == TYPE_FILE) << "Close on non-file Element";
|
| +
|
| + if (file_ != base::kInvalidPlatformFileValue)
|
| + base::ClosePlatformFile(file_);
|
| + file_ = base::kInvalidPlatformFileValue;
|
| +}
|
| +
|
| +void UploadData::Element::SetToFilePathRange(const FilePath& path,
|
| + uint64 offset,
|
| + uint64 length) {
|
| + type_ = TYPE_FILE;
|
| + file_range_offset_ = 0;
|
| + file_range_length_ = 0;
|
|
|
| - if (type_ == TYPE_BYTES)
|
| - return static_cast<uint64>(bytes_.size());
|
| + Close();
|
|
|
| - DCHECK(type_ == TYPE_FILE);
|
| + if (offset + length < offset) {
|
| + LOG(ERROR) << "Upload file offset and length overflow 64-bits. Ignoring.";
|
| + return;
|
| + }
|
|
|
| - // TODO(darin): This size calculation could be out of sync with the state of
|
| - // the file when we get around to reading it. We should probably find a way
|
| - // to lock the file or somehow protect against this error condition.
|
| + base::PlatformFile file = base::CreatePlatformFile(
|
| + path, base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ, NULL);
|
| + if (file == base::kInvalidPlatformFileValue) {
|
| + // This case occurs when the user selects a file that isn't readable.
|
| + file_path_= path;
|
| + return;
|
| + }
|
|
|
| - int64 length = 0;
|
| - if (!file_util::GetFileSize(file_path_, &length))
|
| - return 0;
|
| + uint64 file_size;
|
| + if (!base::GetPlatformFileSize(file, &file_size)) {
|
| + base::ClosePlatformFile(file);
|
| + return;
|
| + }
|
|
|
| - if (file_range_offset_ >= static_cast<uint64>(length))
|
| - return 0; // range is beyond eof
|
| + if (offset > file_size) {
|
| + base::ClosePlatformFile(file);
|
| + return;
|
| + }
|
| + if (offset + length > file_size)
|
| + length = file_size - offset;
|
|
|
| - // compensate for the offset and clip file_range_length_ to eof
|
| - return std::min(length - file_range_offset_, file_range_length_);
|
| + file_ = file;
|
| + file_path_ = path;
|
| + file_range_offset_ = offset;
|
| + file_range_length_ = length;
|
| }
|
|
|
| } // namespace net
|
|
|