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

Side by Side Diff: src/data_plan_provider.cc

Issue 3528016: Cashew: implement backend usage API (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/cashew.git
Patch Set: Fix code review nits and remove hardcoded usage URLs 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 | « src/data_plan_provider.h ('k') | src/default_policy.h » ('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) 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 #include "src/data_plan_provider.h"
6
7 #include <base/json/json_reader.h>
8 #include <base/scoped_ptr.h>
9 #include <base/values.h>
10 #include <glog/logging.h>
11
12 #include "src/libcurl_http_fetcher.h"
13
14 namespace cashew {
15
16 DataPlanProvider::DataPlanProvider(const std::string& carrier)
17 : carrier_(carrier), delegate_(NULL),
18 fetcher_(CHECK_NOTNULL(new(std::nothrow) LibcurlHttpFetcher())),
19 request_in_progress_(false) {
20 fetcher_->set_delegate(this);
21 }
22
23 DataPlanProvider::~DataPlanProvider() {
24 CancelPendingRequests();
25 }
26
27 const std::string& DataPlanProvider::GetCarrier() const {
28 return carrier_;
29 }
30
31 const std::string& DataPlanProvider::GetUsageUrl() const {
32 return usage_url_;
33 }
34
35 void DataPlanProvider::SetUsageUrl(const std::string& usage_url) {
36 DLOG(INFO) << carrier_ << ": SetUsageUrl: url = " << usage_url;
37 if (usage_url_.compare(usage_url)) {
38 usage_url_ = usage_url;
39 CancelPendingRequests();
40 }
41 }
42
43 void DataPlanProvider::SetDelegate(DataPlanProviderDelegate *delegate) {
44 DLOG(INFO) << carrier_ << ": SetDelegate";
45 delegate_ = delegate;
46 if (delegate_ == NULL) {
47 CancelPendingRequests();
48 }
49 }
50
51 bool DataPlanProvider::RequestUsageUpdate() {
52 if (usage_url_.empty()) {
53 DLOG(WARNING) << carrier_ << ": RequestUsageUpdate: no usage url";
54 return false;
55 }
56 if (delegate_ == NULL) {
57 DLOG(WARNING) << carrier_ << ": RequestUsageUpdate: no delegate";
58 return false;
59 }
60 if (request_in_progress_) {
61 DLOG(INFO) << carrier_
62 << ": RequestUsageUpdate: request already in progress";
63 // we'll satisfy this request with the result from the in-flight one
64 return true;
65 }
66 DCHECK(response_buffer_.empty());
67 DLOG(INFO) << carrier_ << ": RequestUsageUpdate: initiating request";
68 request_in_progress_ = true;
69 fetcher_->BeginTransfer(usage_url_);
70 return true;
71 }
72
73 // HttpFetcherDelegate methods
74
75 void DataPlanProvider::ReceivedBytes(HttpFetcher *fetcher, const char *bytes,
76 int length) {
77 DCHECK(fetcher != NULL);
78 DCHECK(bytes != NULL);
79 DCHECK_GE(length, 0);
80 if (fetcher != fetcher_) {
81 DLOG(WARNING) << carrier_ << ": ReceivedBytes: wrong fetcher";
82 return;
83 }
84 DCHECK(request_in_progress_);
85 DLOG(INFO) << carrier_ << ": ReceivedBytes: length = " << length;
86 response_buffer_.reserve(response_buffer_.size() + length);
87 response_buffer_.insert(response_buffer_.end(), bytes, bytes + length);
88 }
89
90 void DataPlanProvider::TransferComplete(HttpFetcher *fetcher,
91 bool successful) {
92 DCHECK(fetcher != NULL);
93 if (fetcher != fetcher_) {
94 DLOG(WARNING) << carrier_ << ": TransferComplete: wrong fetcher";
95 return;
96 }
97 DCHECK(request_in_progress_);
98 DCHECK(delegate_ != NULL);
99 DLOG(INFO) << carrier_ << ": TransferComplete: result = " << successful;
100 if (!successful) {
101 LOG(WARNING) << carrier_ << ": TransferComplete: failed: response code = "
102 << fetcher_->http_response_code();
103 response_buffer_.clear();
104 request_in_progress_ = false;
105 delegate_->OnRequestComplete(this, false, NULL);
106 return;
107 }
108 LOG(INFO) << carrier_ << ": TransferComplete: success: response code = "
109 << fetcher_->http_response_code();
110
111 // carrier usage API has (we hope) given us a JSON-encoded result
112 // log it and then parse it, converting it into a tree of Value nodes
113 // TODO(vlaviano): extend JSONReader to handle 64-bit ints
114 const std::string json_encoded_usage_update(response_buffer_.begin(),
115 response_buffer_.end());
116 response_buffer_.clear();
117 request_in_progress_ = false;
118
119 LOG(INFO) << carrier_ << ": TransferComplete: response:\n"
120 << json_encoded_usage_update;
121
122 int error_code;
123 std::string error_msg;
124 scoped_ptr<Value> parsed_usage_update(
125 base::JSONReader::ReadAndReturnError(json_encoded_usage_update, true,
126 &error_code, &error_msg));
127 if (parsed_usage_update == NULL) {
128 LOG(WARNING) << carrier_ << ": TransferComplete: could not parse json: "
129 << "error code " << error_code << ": " << error_msg;
130 delegate_->OnRequestComplete(this, false, NULL);
131 return;
132 }
133 DLOG(INFO) << carrier_ << ": TransferComplete: successfully parsed json";
134 delegate_->OnRequestComplete(this, true, parsed_usage_update.get());
135 }
136
137 void DataPlanProvider::CancelPendingRequests() {
138 if (request_in_progress_) {
139 fetcher_->TerminateTransfer();
140 response_buffer_.clear();
141 request_in_progress_ = false;
142 }
143 }
144
145 // private methods
146
147 } // namespace cashew
OLDNEW
« no previous file with comments | « src/data_plan_provider.h ('k') | src/default_policy.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698