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

Side by Side Diff: webkit/glue/resource_request_body.cc

Issue 10834289: Split net::UploadData into two: for IPC and for upload handling (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase + moved ResolveBlobRef from webkit_blob to webkit_glue Created 8 years, 4 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « webkit/glue/resource_request_body.h ('k') | webkit/glue/resource_request_body_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2012 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 "webkit/glue/resource_request_body.h"
6
7 #include "base/logging.h"
8 #include "net/base/upload_data.h"
9 #include "webkit/blob/blob_storage_controller.h"
10
11 using webkit_blob::BlobData;
12 using webkit_blob::BlobStorageController;
13
14 namespace webkit_glue {
15
16 ResourceRequestBody::Element::Element()
17 : type_(TYPE_BYTES),
18 bytes_start_(NULL),
19 bytes_length_(0),
20 file_range_offset_(0),
21 file_range_length_(kuint64max) {
22 }
23
24 ResourceRequestBody::Element::~Element() {}
25
26 ResourceRequestBody::ResourceRequestBody() : identifier_(0) {}
27
28 void ResourceRequestBody::AppendBytes(const char* bytes, int bytes_len) {
29 if (bytes_len > 0) {
30 elements_.push_back(Element());
31 elements_.back().SetToBytes(bytes, bytes_len);
32 }
33 }
34
35 void ResourceRequestBody::AppendFileRange(
36 const FilePath& file_path,
37 uint64 offset, uint64 length,
38 const base::Time& expected_modification_time) {
39 elements_.push_back(Element());
40 elements_.back().SetToFilePathRange(file_path, offset, length,
41 expected_modification_time);
42 }
43
44 void ResourceRequestBody::AppendBlob(const GURL& blob_url) {
45 elements_.push_back(Element());
46 elements_.back().SetToBlobUrl(blob_url);
47 }
48
49 net::UploadData* ResourceRequestBody::ResolveElementsAndCreateUploadData(
50 BlobStorageController* blob_controller) {
51 net::UploadData* upload_data = new net::UploadData;
52 // We attach 'this' to UploadData so that we do not need to copy
53 // bytes for TYPE_BYTES.
54 upload_data->SetUserData(
55 this, new base::UserDataAdapter<ResourceRequestBody>(this));
56 std::vector<net::UploadElement>* elements =
57 upload_data->elements_mutable();
58 for (size_t i = 0; i < elements_.size(); ++i) {
59 const Element& element = elements_[i];
60 switch (element.type()) {
61 case TYPE_BYTES:
62 elements->push_back(net::UploadElement());
63 elements->back().SetToSharedBytes(element.bytes(),
64 element.bytes_length());
65 break;
66 case TYPE_FILE:
67 elements->push_back(net::UploadElement());
68 elements->back().SetToFilePathRange(
69 element.file_path(),
70 element.file_range_offset(),
71 element.file_range_length(),
72 element.expected_file_modification_time());
73 break;
74 case TYPE_BLOB:
75 ResolveBlobReference(blob_controller, element.blob_url(), elements);
76 break;
77 }
78 }
79 upload_data->set_identifier(identifier_);
80 return upload_data;
81 }
82
83 ResourceRequestBody::~ResourceRequestBody() {}
84
85 void ResourceRequestBody::ResolveBlobReference(
86 webkit_blob::BlobStorageController* blob_controller,
87 const GURL& blob_url, std::vector<net::UploadElement>* elements) {
88 DCHECK(blob_controller);
89 BlobData* blob_data = blob_controller->GetBlobDataFromUrl(blob_url);
90 DCHECK(blob_data);
91 if (!blob_data)
92 return;
93
94 // If there is no element in the referred blob data, just return true.
95 if (blob_data->items().empty())
96 return;
97
98 // Ensure the blob and any attached shareable files survive until
99 // upload completion.
100 SetUserData(blob_data, new base::UserDataAdapter<BlobData>(blob_data));
101
102 // Append the elements in the referred blob data.
103 for (size_t i = 0; i < blob_data->items().size(); ++i) {
104 elements->push_back(net::UploadElement());
105 net::UploadElement& element = elements->back();
106 const BlobData::Item& item = blob_data->items().at(i);
107 switch (item.type) {
108 case BlobData::TYPE_DATA:
109 element.SetToSharedBytes(
110 &item.data.at(0) + static_cast<int>(item.offset),
111 static_cast<int>(item.length));
112 break;
113 case BlobData::TYPE_FILE:
114 element.SetToFilePathRange(
115 item.file_path,
116 item.offset,
117 item.length,
118 item.expected_modification_time);
119 break;
120 default:
121 NOTREACHED();
122 break;
123 }
124 }
125 }
126
127 } // namespace webkit_glue
OLDNEW
« no previous file with comments | « webkit/glue/resource_request_body.h ('k') | webkit/glue/resource_request_body_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698