| OLD | NEW |
| (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, ¬ification_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 |
| OLD | NEW |