1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
|
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_CHROMEOS_MOBILE_CONFIG_H_
#define CHROME_BROWSER_CHROMEOS_MOBILE_CONFIG_H_
#include <map>
#include <string>
#include <vector>
#include "base/gtest_prod_util.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/singleton.h"
#include "base/time/time.h"
#include "chrome/browser/chromeos/customization/customization_document.h"
namespace base {
class DictionaryValue;
class FilePath;
}
namespace chromeos {
// Class that processes mobile (carrier) configuration.
// Confugration is defined as a JSON file - global and local one.
// First global configuration is loaded then local one if it exists.
// Notes on global/local configuration:
// 1. All global config data is inherited unless some carrier properties
// are overidden or carrier deals are explicitly marked as excluded.
// 2. Local config could mark that all carrier deals should be excluded or
// only specific carrier deals are excluded.
// 3. New ID mappings in local config are not supported.
// 4. If local config exists, at least trivial global config should exist too.
// 5. If any error occurs while parsing global/local config,
// MobileConfig::IsReady() will return false.
class MobileConfig : public CustomizationDocument {
public:
// Carrier deal.
class CarrierDeal {
public:
explicit CarrierDeal(const base::DictionaryValue* deal_dict);
~CarrierDeal();
// Returns string with the specified |locale| and |id|.
// If there's no version for |locale|, default one is returned.
// If there's no string with specified |id|, empty string is returned.
std::string GetLocalizedString(const std::string& locale,
const std::string& id) const;
const std::string& deal_id() const { return deal_id_; }
const std::vector<std::string>& locales() const { return locales_; }
const std::string& info_url() const { return info_url_; }
int notification_count() const { return notification_count_; }
base::Time expire_date() const { return expire_date_; }
private:
std::string deal_id_;
std::vector<std::string> locales_;
std::string info_url_;
int notification_count_;
base::Time expire_date_;
const base::DictionaryValue* localized_strings_;
DISALLOW_COPY_AND_ASSIGN(CarrierDeal);
};
// Carrier config.
class Carrier {
public:
Carrier(const base::DictionaryValue* carrier_dict,
const std::string& initial_locale);
~Carrier();
const std::vector<std::string>& external_ids() { return external_ids_; }
const std::string& top_up_url() const { return top_up_url_; }
bool show_portal_button() const { return show_portal_button_; }
// Returns "default" carrier deal i.e. first deal defined or NULL
// if there're no deals defined.
const CarrierDeal* GetDefaultDeal() const;
// Returns carrier deal by ID.
const CarrierDeal* GetDeal(const std::string& deal_id) const;
// Initializes carrier from supplied dictionary.
// Multiple calls supported (i.e. second call for local config).
void InitFromDictionary(const base::DictionaryValue* carrier_dict,
const std::string& initial_locale);
// Removes all carrier deals. Might be executed when local config is loaded.
void RemoveDeals();
private:
// Maps deal id to deal instance.
typedef std::map<std::string, CarrierDeal*> CarrierDeals;
// List of external IDs that should map to this carrier.
std::vector<std::string> external_ids_;
// Top-up URL. Used in network menu ("View account" link) +
// carrier name in network details (in settings) is a link.
std::string top_up_url_;
// If true, show a separate "View account" button on network details page
// even if device is activated and doesn't need new data plan.
// It's not shown when one of the "Buy plan" / "Activate" is shown.
// All "Buy plan" / "Activate" / "View account" buttons launch
// carrier portal (chrome://mobilesetup/ extension).
bool show_portal_button_;
CarrierDeals deals_;
DISALLOW_COPY_AND_ASSIGN(Carrier);
};
// Carrier config for a specific initial locale.
class LocaleConfig {
public:
explicit LocaleConfig(base::DictionaryValue* locale_dict);
~LocaleConfig();
const std::string& setup_url() const { return setup_url_; }
// Initializes local config carrier from supplied dictionary.
// Multiple calls supported (i.e. second call for local config).
void InitFromDictionary(base::DictionaryValue* locale_dict);
private:
// Carrier setup URL. Used in network menu ("Set-up Mobile Data" link).
// Displayed when SIM card is not installed on the device with a
// particular initial locale.
std::string setup_url_;
DISALLOW_COPY_AND_ASSIGN(LocaleConfig);
};
// External carrier ID (ex. "Verizon (us)") mapping to internal carrier ID.
typedef std::map<std::string, std::string> CarrierIdMap;
// Internal carrier ID mapping to Carrier config.
typedef std::map<std::string, Carrier*> Carriers;
static MobileConfig* GetInstance();
// Returns carrier by external ID or NULL if there's no such carrier.
const MobileConfig::Carrier* GetCarrier(const std::string& carrier_id) const;
// Returns locale specific config by initial locale or NULL
// if there's no such config defined.
const MobileConfig::LocaleConfig* GetLocaleConfig() const;
protected:
virtual bool LoadManifestFromString(const std::string& manifest) override;
private:
FRIEND_TEST_ALL_PREFIXES(MobileConfigTest, Basic);
FRIEND_TEST_ALL_PREFIXES(MobileConfigTest, BadManifest);
FRIEND_TEST_ALL_PREFIXES(MobileConfigTest, DealOtherLocale);
FRIEND_TEST_ALL_PREFIXES(MobileConfigTest, OldDeal);
FRIEND_TEST_ALL_PREFIXES(MobileConfigTest, LocalConfigNoDeals);
FRIEND_TEST_ALL_PREFIXES(MobileConfigTest, LocalConfig);
friend struct DefaultSingletonTraits<MobileConfig>;
// C-tor for singleton construction.
MobileConfig();
// C-tor for test construction.
MobileConfig(const std::string& config,
const std::string& initial_locale);
virtual ~MobileConfig();
// Loads carrier configuration.
void LoadConfig();
// Processes global/local config.
void ProcessConfig(const std::string& global_config,
const std::string& local_config);
// Executes on FILE thread and reads config files to string.
void ReadConfigInBackground(const base::FilePath& global_config_file,
const base::FilePath& local_config_file);
// Maps external carrier ID to internal carrier ID.
CarrierIdMap carrier_id_map_;
// Carrier configuration (including carrier deals).
Carriers carriers_;
// Initial locale specific config if defined.
scoped_ptr<LocaleConfig> locale_config_;
// Initial locale value.
std::string initial_locale_;
// Root value of the local config (if it exists).
// Global config is stored in root_ of the base class.
scoped_ptr<base::DictionaryValue> local_config_root_;
DISALLOW_COPY_AND_ASSIGN(MobileConfig);
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_MOBILE_CONFIG_H_
|