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

Side by Side Diff: multi_range_http_fetcher.h

Issue 5835004: AU: MultiHttpFetcher cleanup/rewrite (Closed) Base URL: http://git.chromium.org/git/update_engine.git@master
Patch Set: Created 10 years 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
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #ifndef CHROMEOS_PLATFORM_UPDATE_ENGINE_MULTI_RANGE_HTTP_FETCHER_H__
6 #define CHROMEOS_PLATFORM_UPDATE_ENGINE_MULTI_RANGE_HTTP_FETCHER_H__
7
8 #include <deque>
9 #include <tr1/memory>
10 #include <utility>
11 #include <vector>
12
13 #include <base/scoped_ptr.h>
14
15 #include "update_engine/http_fetcher.h"
16 #include "update_engine/utils.h"
petkov 2010/12/16 18:30:57 do you need this include here?
adlr 2010/12/17 01:03:51 nope. cleaned up the headers
17
18 // This class is a simple wrapper around an HttpFetcher. The client
19 // specifies a vector of byte ranges. MultiRangeHTTPFetcher will fetch bytes
20 // from those offsets. Pass -1 as a length to specify unlimited length.
21 // It really only would make sense for the last range specified to have
22 // unlimited length, tho it is legal for other entries to have unlimited
23 // length.
24
25 // There are three states a MultiRangeHTTPFetcher object will be in:
26 // - Stopped (start state)
27 // - Downloading
28 // - Pending transfer ended
29 // Various functions below that might change state indicate possible
30 // state changes.
31
32 namespace chromeos_update_engine {
33
34 class MultiRangeHTTPFetcher : public HttpFetcher, public HttpFetcherDelegate {
35 public:
36 typedef std::vector<std::pair<off_t, off_t> > RangesVect;
37
38 // Takes ownership of the passed in fetcher.
39 explicit MultiRangeHTTPFetcher(HttpFetcher* base_fetcher)
40 : HttpFetcher(base_fetcher->proxy_resolver()),
41 base_fetcher_(base_fetcher),
42 base_fetcher_active_(false),
43 pending_transfer_ended_(false),
44 terminating_(false),
45 current_index_(0),
46 bytes_received_this_fetcher_(0) {}
47 ~MultiRangeHTTPFetcher() {}
48
49 void set_ranges(const RangesVect& ranges) {
petkov 2010/12/16 18:30:57 Fits on one line? Btw, have you considered provid
adlr 2010/12/17 01:03:51 interesting idea, done.
50 ranges_ = ranges;
51 }
52
53 void SetOffset(off_t offset) {} // for now, doesn't support this
petkov 2010/12/16 18:30:57 Per style, all inherited virtual methods should al
adlr 2010/12/17 01:03:51 Done.
54
55 // Begins the transfer to the specified URL.
56 // State change: Stopped -> Downloading
57 // (corner case: Stopped -> Stopped for an empty request)
58 void BeginTransfer(const std::string& url);
59
60 // Stage change: Downloading -> Pending transfer ended
petkov 2010/12/16 18:30:57 typo: Stage->State
adlr 2010/12/17 01:03:51 Done.
61 void TerminateTransfer();
62
63 void Pause() {
petkov 2010/12/16 18:30:57 Fits on one line?
adlr 2010/12/17 01:03:51 Done.
64 base_fetcher_->Pause();
65 }
66
67 void Unpause() {
petkov 2010/12/16 18:30:57 Fits on one line?
adlr 2010/12/17 01:03:51 Done.
68 base_fetcher_->Unpause();
69 }
70
71 // These functions are overloaded in LibcurlHttp fetcher for testing purposes.
72 void set_idle_seconds(int seconds) {
petkov 2010/12/16 18:30:57 Side note: It's kind of unfortunate that there's n
adlr 2010/12/17 01:03:51 I agree it's a bit annoying, but I like having the
73 base_fetcher_->set_idle_seconds(seconds);
74 }
75 void set_retry_seconds(int seconds) {
76 base_fetcher_->set_retry_seconds(seconds);
77 }
78 void SetConnectionAsExpensive(bool is_expensive) {
79 base_fetcher_->SetConnectionAsExpensive(is_expensive);
80 }
81 void SetBuildType(bool is_official) {
82 base_fetcher_->SetBuildType(is_official);
83 }
84 virtual void SetProxies(const std::deque<std::string>& proxies) {
petkov 2010/12/16 18:30:57 Why isn't SetProxies just set_proxies? Because it'
adlr 2010/12/17 01:03:51 Good catch. I don't know how big a deal it is, but
85 base_fetcher_->SetProxies(proxies);
86 }
87
88 private:
89 // Stage change: Stopped or Downloading -> Downloading
petkov 2010/12/16 18:30:57 State
adlr 2010/12/17 01:03:51 Done.
90 void StartTransfer();
91
92 // Stage change: Downloading -> Downloading
petkov 2010/12/16 18:30:57 State
adlr 2010/12/17 01:03:51 Done.
93 void ReceivedBytes(HttpFetcher* fetcher, const char* bytes, int length);
94
95 // Stage change: Pending transfer ended -> Stopped
petkov 2010/12/16 18:30:57 State
adlr 2010/12/17 01:03:51 Done.
96 void TransferEnded(HttpFetcher* fetcher, bool successful);
97 void TransferComplete(HttpFetcher* fetcher, bool successful) {
98 LOG(INFO) << "Received transfer complete.";
petkov 2010/12/16 18:30:57 I'd move to the .cc file.
adlr 2010/12/17 01:03:51 Done.
99 TransferEnded(fetcher, successful);
100 }
101 void TransferTerminated(HttpFetcher* fetcher) {
102 LOG(INFO) << "Received transfer terminated.";
petkov 2010/12/16 18:30:57 I'd move to the .cc file.
adlr 2010/12/17 01:03:51 Done.
103 TransferEnded(fetcher, false);
104 }
105
106 void Reset() {
107 base_fetcher_active_ = pending_transfer_ended_ = terminating_ = false;
petkov 2010/12/16 18:30:57 Move to the .cc files -- it's 3 lines of code :-)
adlr 2010/12/17 01:03:51 Done.
108 current_index_ = 0;
109 bytes_received_this_fetcher_ = 0;
110 }
111
112 scoped_ptr<HttpFetcher> base_fetcher_;
113
114 // If true, do not send any more data or TransferComplete to the delegate.
115 bool base_fetcher_active_;
116
117 // If true, the next fetcher needs to be started when TransferTerminated is
118 // received from the current fetcher.
119 bool pending_transfer_ended_;
120
121 // True if we are waiting for base fetcher to terminate b/c we are
122 // ourselves terminating.
123 bool terminating_;
124
125 RangesVect ranges_;
126
127 RangesVect::size_type current_index_; // index into ranges_
128 off_t bytes_received_this_fetcher_;
petkov 2010/12/16 18:30:57 It's more like bytes_received_this_range now.
adlr 2010/12/17 01:03:51 Done.
129
130 DISALLOW_COPY_AND_ASSIGN(MultiRangeHTTPFetcher);
131 };
132
133 } // namespace chromeos_update_engine
134
135 #endif // CHROMEOS_PLATFORM_UPDATE_ENGINE_MULTI_RANGE_HTTP_FETCHER_H__
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698