Index: net/base/upload_data.h |
diff --git a/net/base/upload_data.h b/net/base/upload_data.h |
index 3aab835b56e51e940fcee0c8cffc2999b27c136c..d01b435c517e96a28a0f88f839ccc5238d3bc971 100644 |
--- a/net/base/upload_data.h |
+++ b/net/base/upload_data.h |
@@ -9,6 +9,7 @@ |
#include "base/basictypes.h" |
#include "base/file_path.h" |
+#include "base/platform_file.h" |
#include "base/ref_counted.h" |
#include "testing/gtest/include/gtest/gtest_prod.h" |
@@ -26,7 +27,8 @@ class UploadData : public base::RefCounted<UploadData> { |
class Element { |
public: |
Element() : type_(TYPE_BYTES), file_range_offset_(0), |
- file_range_length_(kuint64max), |
+ file_range_length_(0), |
+ file_(base::kInvalidPlatformFileValue), |
override_content_length_(false) { |
} |
@@ -45,19 +47,42 @@ class UploadData : public base::RefCounted<UploadData> { |
SetToFilePathRange(path, 0, kuint64max); |
} |
- void SetToFilePathRange(const FilePath& path, |
- uint64 offset, uint64 length) { |
- type_ = TYPE_FILE; |
- file_path_ = path; |
- file_range_offset_ = offset; |
- file_range_length_ = length; |
- } |
+ void SetToFilePathRange(const FilePath& path, uint64 offset, uint64 length); |
// Returns the byte-length of the element. For files that do not exist, 0 |
// is returned. This is done for consistency with Mozilla. |
- uint64 GetContentLength() const; |
+ uint64 GetContentLength() const { |
+ if (override_content_length_) |
+ return content_length_; |
+ |
+ if (type_ == TYPE_BYTES) { |
+ return bytes_.size(); |
+ } else { |
+ return file_range_length_; |
+ } |
+ } |
+ |
+ // For a TYPE_FILE, return a handle to the file. The caller does not take |
+ // ownership and should not close the file handle. |
+ base::PlatformFile platform_file() const; |
+ |
+ // For a TYPE_FILE, this closes the file handle. It's a fatal error to call |
+ // platform_file() after this. |
+ void Close(); |
private: |
+ // type_ == TYPE_BYTES: |
+ // bytes_ is valid |
+ // type_ == TYPE_FILE: |
+ // file_path_ should always be valid. |
+ // |
+ // platform_file() may be invalid, in which case file_range_* are 0 and |
+ // file_ is invalid. This occurs when we cannot open the requested file. |
+ // |
+ // Else, then file_range_* are within range of the length of the file |
+ // that we found when opening the file. Also, the sum of offset and |
+ // length will not overflow a uint64. file_ will be handle to the file. |
+ |
// Allows tests to override the result of GetContentLength. |
void SetContentLength(uint64 content_length) { |
override_content_length_ = true; |
@@ -69,6 +94,7 @@ class UploadData : public base::RefCounted<UploadData> { |
FilePath file_path_; |
uint64 file_range_offset_; |
uint64 file_range_length_; |
+ base::PlatformFile file_; |
bool override_content_length_; |
uint64 content_length_; |
@@ -109,6 +135,9 @@ class UploadData : public base::RefCounted<UploadData> { |
elements_.swap(*elements); |
} |
+ // CloseFiles closes the file handles of all Elements of type TYPE_FILE. |
+ void CloseFiles(); |
+ |
// Identifies a particular upload instance, which is used by the cache to |
// formulate a cache key. This value should be unique across browser |
// sessions. A value of 0 is used to indicate an unspecified identifier. |