| 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 |