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

Side by Side Diff: multi_http_fetcher.h

Issue 3620013: AU: Resume interrupted update attempts. (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/update_engine.git
Patch Set: fix setup download Created 10 years, 2 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 | « generate_delta_main.cc ('k') | omaha_response_handler_action.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef CHROMEOS_PLATFORM_UPDATE_ENGINE_MULTI_HTTP_FETCHER_H__ 5 #ifndef CHROMEOS_PLATFORM_UPDATE_ENGINE_MULTI_HTTP_FETCHER_H__
6 #define CHROMEOS_PLATFORM_UPDATE_ENGINE_MULTI_HTTP_FETCHER_H__ 6 #define CHROMEOS_PLATFORM_UPDATE_ENGINE_MULTI_HTTP_FETCHER_H__
7 7
8 #include <tr1/memory> 8 #include <tr1/memory>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 22 matching lines...) Expand all
33 void set_ranges(const RangesVect& ranges) { 33 void set_ranges(const RangesVect& ranges) {
34 ranges_ = ranges; 34 ranges_ = ranges;
35 fetchers_.resize(ranges_.size()); // Allocate the fetchers 35 fetchers_.resize(ranges_.size()); // Allocate the fetchers
36 for (typename std::vector<std::tr1::shared_ptr<BaseHttpFetcher> 36 for (typename std::vector<std::tr1::shared_ptr<BaseHttpFetcher>
37 >::iterator it = fetchers_.begin(), e = fetchers_.end(); 37 >::iterator it = fetchers_.begin(), e = fetchers_.end();
38 it != e; ++it) { 38 it != e; ++it) {
39 (*it) = std::tr1::shared_ptr<BaseHttpFetcher>(new BaseHttpFetcher); 39 (*it) = std::tr1::shared_ptr<BaseHttpFetcher>(new BaseHttpFetcher);
40 (*it)->set_delegate(this); 40 (*it)->set_delegate(this);
41 } 41 }
42 } 42 }
43 43
44 void SetOffset(off_t offset) {} // for now, doesn't support this 44 void SetOffset(off_t offset) {} // for now, doesn't support this
45 45
46 // Begins the transfer to the specified URL. 46 // Begins the transfer to the specified URL.
47 void BeginTransfer(const std::string& url) { 47 void BeginTransfer(const std::string& url) {
48 url_ = url; 48 url_ = url;
49 if (ranges_.empty()) { 49 if (ranges_.empty()) {
50 if (delegate_) 50 if (delegate_)
51 delegate_->TransferComplete(this, true); 51 delegate_->TransferComplete(this, true);
52 return; 52 return;
53 } 53 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 private: 93 private:
94 void SendTransferComplete(HttpFetcher* fetcher, bool successful) { 94 void SendTransferComplete(HttpFetcher* fetcher, bool successful) {
95 if (sent_transfer_complete_) 95 if (sent_transfer_complete_)
96 return; 96 return;
97 LOG(INFO) << "Sending transfer complete"; 97 LOG(INFO) << "Sending transfer complete";
98 sent_transfer_complete_ = true; 98 sent_transfer_complete_ = true;
99 http_response_code_ = fetcher->http_response_code(); 99 http_response_code_ = fetcher->http_response_code();
100 if (delegate_) 100 if (delegate_)
101 delegate_->TransferComplete(this, successful); 101 delegate_->TransferComplete(this, successful);
102 } 102 }
103 103
104 void StartTransfer() { 104 void StartTransfer() {
105 if (current_index_ >= ranges_.size()) { 105 if (current_index_ >= ranges_.size()) {
106 return; 106 return;
107 } 107 }
108 LOG(INFO) << "Starting a transfer"; 108 LOG(INFO) << "Starting a transfer @" << ranges_[current_index_].first << "("
109 << ranges_[current_index_].second << ")";
109 bytes_received_this_fetcher_ = 0; 110 bytes_received_this_fetcher_ = 0;
110 fetchers_[current_index_]->SetOffset(ranges_[current_index_].first); 111 fetchers_[current_index_]->SetOffset(ranges_[current_index_].first);
111 fetchers_[current_index_]->BeginTransfer(url_); 112 fetchers_[current_index_]->BeginTransfer(url_);
112 } 113 }
113 114
114 void ReceivedBytes(HttpFetcher* fetcher, 115 void ReceivedBytes(HttpFetcher* fetcher,
115 const char* bytes, 116 const char* bytes,
116 int length) { 117 int length) {
117 if (current_index_ >= ranges_.size()) 118 if (current_index_ >= ranges_.size())
118 return; 119 return;
119 if (fetcher != fetchers_[current_index_].get()) { 120 if (fetcher != fetchers_[current_index_].get()) {
120 LOG(WARNING) << "Received bytes from invalid fetcher"; 121 LOG(WARNING) << "Received bytes from invalid fetcher";
121 return; 122 return;
122 } 123 }
123 off_t next_size = length; 124 off_t next_size = length;
(...skipping 17 matching lines...) Expand all
141 } 142 }
142 } 143 }
143 } 144 }
144 145
145 void TransferComplete(HttpFetcher* fetcher, bool successful) { 146 void TransferComplete(HttpFetcher* fetcher, bool successful) {
146 LOG(INFO) << "Received transfer complete"; 147 LOG(INFO) << "Received transfer complete";
147 if (current_index_ >= ranges_.size()) { 148 if (current_index_ >= ranges_.size()) {
148 SendTransferComplete(fetcher, true); 149 SendTransferComplete(fetcher, true);
149 return; 150 return;
150 } 151 }
151 152
152 if (ranges_[current_index_].second < 0) { 153 if (ranges_[current_index_].second < 0) {
153 // We're done with the current operation 154 // We're done with the current operation
154 current_index_++; 155 current_index_++;
155 if (current_index_ >= ranges_.size() || !successful) { 156 if (current_index_ >= ranges_.size() || !successful) {
156 SendTransferComplete(fetcher, successful); 157 SendTransferComplete(fetcher, successful);
157 } else { 158 } else {
158 // Do the next transfer 159 // Do the next transfer
159 StartTransfer(); 160 StartTransfer();
160 } 161 }
161 return; 162 return;
162 } 163 }
163 164
164 if (bytes_received_this_fetcher_ < ranges_[current_index_].second) { 165 if (bytes_received_this_fetcher_ < ranges_[current_index_].second) {
165 LOG(WARNING) << "Received insufficient bytes from fetcher. " 166 LOG(WARNING) << "Received insufficient bytes from fetcher. "
166 << "Ending early"; 167 << "Ending early";
167 SendTransferComplete(fetcher, false); 168 SendTransferComplete(fetcher, false);
168 return; 169 return;
169 } else { 170 } else {
170 LOG(INFO) << "Got spurious TransferComplete. Ingoring."; 171 LOG(INFO) << "Got spurious TransferComplete. Ingoring.";
171 } 172 }
172 } 173 }
173 174
174 // If true, do not send any more data or TransferComplete to the delegate. 175 // If true, do not send any more data or TransferComplete to the delegate.
175 bool sent_transfer_complete_; 176 bool sent_transfer_complete_;
176 177
177 RangesVect ranges_; 178 RangesVect ranges_;
178 std::vector<std::tr1::shared_ptr<BaseHttpFetcher> > fetchers_; 179 std::vector<std::tr1::shared_ptr<BaseHttpFetcher> > fetchers_;
179 180
180 RangesVect::size_type current_index_; // index into ranges_, fetchers_ 181 RangesVect::size_type current_index_; // index into ranges_, fetchers_
181 off_t bytes_received_this_fetcher_; 182 off_t bytes_received_this_fetcher_;
182 183
183 private: 184 private:
184 DISALLOW_COPY_AND_ASSIGN(MultiHttpFetcher); 185 DISALLOW_COPY_AND_ASSIGN(MultiHttpFetcher);
185 }; 186 };
186 187
187 } // namespace chromeos_update_engine 188 } // namespace chromeos_update_engine
188 189
189 #endif // CHROMEOS_PLATFORM_UPDATE_ENGINE_MULTI_HTTP_FETCHER_H__ 190 #endif // CHROMEOS_PLATFORM_UPDATE_ENGINE_MULTI_HTTP_FETCHER_H__
OLDNEW
« no previous file with comments | « generate_delta_main.cc ('k') | omaha_response_handler_action.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698