Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(127)

Unified Diff: net/base/upload_data.h

Issue 541022: Fix the case where the browser livelocks if we cannot open a file. (Closed)
Patch Set: Uploading checkpoint. This is known to cause all uploads on Windows to be zero bytes long. Created 10 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/base/file_stream_win.cc ('k') | net/base/upload_data.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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.
« no previous file with comments | « net/base/file_stream_win.cc ('k') | net/base/upload_data.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698