OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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__ |
OLD | NEW |