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

Side by Side Diff: chrome/browser/chromeos/mobile_config.cc

Issue 7778043: [cros] Support global carrier config. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixes Created 9 years, 3 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
OLDNEW
(Empty)
1 // Copyright (c) 2011 The Chromium 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 "chrome/browser/chromeos/mobile_config.h"
6
7 #include <algorithm>
8
9 #include "base/file_path.h"
10 #include "base/file_util.h"
11 #include "base/json/json_reader.h"
12 #include "base/logging.h"
13 #include "base/stl_util.h"
14 #include "base/values.h"
15 #include "chrome/browser/browser_process.h"
16 #include "chrome/browser/chromeos/login/wizard_controller.h"
17 #include "content/browser/browser_thread.h"
18
19 namespace {
20
21 // Config attributes names.
22 const char kVersionAttr[] = "version";
23 const char kAcceptedConfigVersion[] = "1.0";
24 const char kDefaultAttr[] = "default";
25
26 // Carrier config attributes.
27 const char kCarriersAttr[] = "carriers";
28 const char kCarrierIdsAttr[] = "ids";
29 const char kCarrierIdAttr[] = "id";
30 const char kTopUpURLAttr[] = "top_up_url";
31 const char kDealsAttr[] = "deals";
32
33 // Carrier deal attributes.
34 const char kDealIdAttr[] = "deal_id";
35 const char kDealLocalesAttr[] = "locales";
36
37 const char kInfoURLAttr[] = "info_url";
38 const char kNotificationCountAttr[] = "notification_count";
39 const char kDealExpireDateAttr[] = "expire_date";
40 const char kLocalizedContentAttr[] = "localized_content";
41 const char kNotificationTextAttr[] = "notification_text";
42
43 // Location of the global carrier config.
44 const char kGlobalCarrierConfigPath[] =
45 "/usr/share/chromeos-assets/mobile/carrier_config.json";
46
47 } // anonymous namespace
48
49 DISABLE_RUNNABLE_METHOD_REFCOUNT(chromeos::MobileConfig);
50
51 namespace chromeos {
52
53 // MobileConfig::CarrierDeal implementation. -----------------------------------
54
55 MobileConfig::CarrierDeal::CarrierDeal(DictionaryValue* deal_dict)
56 : notification_count_(0),
57 localized_strings_(NULL) {
58 deal_dict->GetString(kDealIdAttr, &deal_id_);
59
60 // Extract list of deal locales.
61 ListValue* locale_list = NULL;
62 if (deal_dict->GetList(kDealLocalesAttr, &locale_list)) {
63 for (size_t i = 0; i < locale_list->GetSize(); ++i) {
64 std::string locale;
65 if (locale_list->GetString(i, &locale))
66 locales_.push_back(locale);
67 }
68 }
69
70 deal_dict->GetString(kInfoURLAttr, &info_url_);
71 deal_dict->GetInteger(kNotificationCountAttr, &notification_count_);
72 std::string date_string;
73 if (deal_dict->GetString(kDealExpireDateAttr, &date_string)) {
74 if (!base::Time::FromString(date_string.c_str(), &expire_date_))
75 LOG(ERROR) << "Error parsing deal_expire_date: " << date_string;
76 }
77 deal_dict->GetDictionary(kLocalizedContentAttr, &localized_strings_);
78 }
79
80 MobileConfig::CarrierDeal::~CarrierDeal() {
81 }
82
83 std::string MobileConfig::CarrierDeal::GetLocalizedString(
84 const std::string& locale, const std::string& id) const {
85 std::string result;
86 if (localized_strings_) {
87 DictionaryValue* locale_dict = NULL;
88 if (localized_strings_->GetDictionary(locale, &locale_dict) &&
89 locale_dict->GetString(id, &result)) {
90 return result;
91 } else if (localized_strings_->GetDictionary(kDefaultAttr, &locale_dict) &&
92 locale_dict->GetString(id, &result)) {
93 return result;
94 }
95 }
96 return result;
97 }
98
99 // MobileConfig::Carrier implementation. ---------------------------------------
100
101 MobileConfig::Carrier::Carrier(DictionaryValue* carrier_dict,
102 const std::string& initial_locale) {
103 carrier_dict->GetString(kTopUpURLAttr, &top_up_url_);
104
105 // Extract list of external IDs for this carrier.
106 ListValue* id_list = NULL;
107 if (carrier_dict->GetList(kCarrierIdsAttr, &id_list)) {
108 for (size_t i = 0; i < id_list->GetSize(); ++i) {
109 DictionaryValue* id_dict = NULL;
110 std::string external_id;
111 if (id_list->GetDictionary(i, &id_dict) &&
112 id_dict->GetString(kCarrierIdAttr, &external_id)) {
113 external_ids_.push_back(external_id);
114 }
115 }
116 }
117
118 // Extract list of deals for this carrier.
119 ListValue* deals_list = NULL;
120 if (carrier_dict->GetList(kDealsAttr, &deals_list)) {
121 for (size_t i = 0; i < deals_list->GetSize(); ++i) {
122 DictionaryValue* deal_dict = NULL;
123 if (deals_list->GetDictionary(i, &deal_dict)) {
124 scoped_ptr<CarrierDeal> deal(new CarrierDeal(deal_dict));
125 // Filter out deals by initial_locale right away.
126 std::vector<std::string>::const_iterator iter =
127 std::find(deal->locales().begin(),
128 deal->locales().end(),
129 initial_locale);
130 if (iter != deal->locales().end())
131 deals_[deal->deal_id()] = deal.release();
132 }
133 }
134 }
135 }
136
137 MobileConfig::Carrier::~Carrier() {
138 STLDeleteValues(&deals_);
139 }
140
141 const MobileConfig::CarrierDeal* MobileConfig::Carrier::GetDefaultDeal() const {
142 // TODO(nkostylev): Use carrier "default_deal_id" attribute.
143 CarrierDeals::const_iterator iter = deals_.begin();
144 if (iter != deals_.end())
145 return GetDeal((*iter).first);
146 else
147 return NULL;
148 }
149
150 const MobileConfig::CarrierDeal* MobileConfig::Carrier::GetDeal(
151 const std::string& deal_id) const {
152 CarrierDeals::const_iterator iter = deals_.find(deal_id);
153 if (iter != deals_.end()) {
154 CarrierDeal* deal = iter->second;
155 // Make sure that deal is still active,
156 // i.e. if deal expire date is defined, check it.
157 if (!deal->expire_date().is_null() &&
158 deal->expire_date() <= base::Time::Now()) {
159 return NULL;
160 }
161 return deal;
162 } else {
163 return NULL;
164 }
165 }
166
167 // MobileConfig implementation. -------------------------------
168
169 MobileConfig::MobileConfig()
170 : CustomizationDocument(kAcceptedConfigVersion),
171 initial_locale_(WizardController::GetInitialLocale()) {
172 LoadConfig();
173 }
174
175 MobileConfig::MobileConfig(const std::string& config,
176 const std::string& initial_locale)
177 : CustomizationDocument(kAcceptedConfigVersion),
178 initial_locale_(initial_locale) {
179 LoadManifestFromString(config);
180 }
181
182 MobileConfig::~MobileConfig() {
183 STLDeleteValues(&carriers_);
184 }
185
186 // static
187 MobileConfig* MobileConfig::GetInstance() {
188 return Singleton<MobileConfig,
189 DefaultSingletonTraits<MobileConfig> >::get();
190 }
191
192 void MobileConfig::LoadConfig() {
193 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
194 NewRunnableMethod(this,
195 &MobileConfig::ReadFileInBackground,
196 FilePath(kGlobalCarrierConfigPath)));
197 }
198
199 void MobileConfig::ReadFileInBackground(const FilePath& file) {
200 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
201 std::string config;
202 if (file_util::ReadFileToString(file, &config)) {
203 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
204 NewRunnableMethod(
205 this,
206 &MobileConfig::LoadManifestFromString,
207 config));
208 } else {
209 VLOG(1) << "Failed to load mobile config from: "
210 << file.value();
211 }
212 }
213
214 const MobileConfig::Carrier* MobileConfig::GetCarrier(
215 const std::string& carrier_id) const {
216 CarrierIdMap::const_iterator id_iter = carrier_id_map_.find(carrier_id);
217 std::string internal_id;
218 if (id_iter != carrier_id_map_.end())
219 internal_id = id_iter->second;
220 else
221 return NULL;
222 Carriers::const_iterator iter = carriers_. find(internal_id);
223 if (iter != carriers_.end())
224 return iter->second;
225 else
226 return NULL;
227 }
228
229 bool MobileConfig::LoadManifestFromString(const std::string& manifest) {
230 if (!CustomizationDocument::LoadManifestFromString(manifest))
231 return false;
232
233 // Other parts are optional.
234 DictionaryValue* carriers = NULL;
235 if (root_.get() && root_->GetDictionary(kCarriersAttr, &carriers)) {
236 for (DictionaryValue::key_iterator iter = carriers->begin_keys();
237 iter != carriers->end_keys(); ++iter) {
238 DictionaryValue* carrier_dict = NULL;
239 if (carriers->GetDictionary(*iter, &carrier_dict)) {
240 const std::string& internal_id = *iter;
241 Carrier* carrier = new Carrier(carrier_dict, initial_locale_);
242 if (!carrier->external_ids().empty()) {
243 // Map all external IDs to a single internal one.
244 for (std::vector<std::string>::const_iterator
245 i = carrier->external_ids().begin();
246 i != carrier->external_ids().end(); ++i) {
247 carrier_id_map_[*i] = internal_id;
248 }
249 } else {
250 // Trivial case - using same ID for external/internal one.
251 carrier_id_map_[internal_id] = internal_id;
252 }
253 carriers_[internal_id] = carrier;
254 }
255 }
256 }
257 return true;
258 }
259
260 } // namespace chromeos
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/mobile_config.h ('k') | chrome/browser/chromeos/mobile_config_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698