Index: chrome/browser/chromeos/cros/cros_network_functions.cc |
diff --git a/chrome/browser/chromeos/cros/cros_network_functions.cc b/chrome/browser/chromeos/cros/cros_network_functions.cc |
index c0b1b7682046ed4fffb18b3703a52ad6836f9b08..4ab9192cda5151bb8e85736ce010fc46e8e6b703 100644 |
--- a/chrome/browser/chromeos/cros/cros_network_functions.cc |
+++ b/chrome/browser/chromeos/cros/cros_network_functions.cc |
@@ -171,6 +171,107 @@ class CrosDataPlanUpdateWatcher : public CrosNetworkWatcher { |
DataPlanUpdateMonitor monitor_; |
}; |
+// Converts a string to a CellularDataPlanType. |
+CellularDataPlanType ParseCellularDataPlanType(const std::string& type) { |
+ if (type == cashew::kCellularDataPlanUnlimited) |
+ return CELLULAR_DATA_PLAN_UNLIMITED; |
+ if (type == cashew::kCellularDataPlanMeteredPaid) |
+ return CELLULAR_DATA_PLAN_METERED_PAID; |
+ if (type == cashew::kCellularDataPlanMeteredBase) |
+ return CELLULAR_DATA_PLAN_METERED_BASE; |
+ return CELLULAR_DATA_PLAN_UNKNOWN; |
+} |
+ |
+// Gets a string property from dictionary. |
+bool GetStringProperty(const base::DictionaryValue& dictionary, |
+ const std::string& key, |
+ std::string* out) { |
+ const bool result = dictionary.GetStringWithoutPathExpansion(key, out); |
+ LOG_IF(ERROR, !result) << "Cannnot get property " << key; |
stevenjb
2012/04/25 01:37:50
should just be a WARNING
hashimoto
2012/04/25 15:40:17
Done.
|
+ return result; |
+} |
+ |
+// Gets an int64 property from dictionary. |
+bool GetInt64Property(const base::DictionaryValue& dictionary, |
+ const std::string& key, |
+ int64* out) { |
+ // Int64 value is stored as a double because it cannot be fitted in int32. |
+ double value_double = 0; |
+ const bool result = dictionary.GetDoubleWithoutPathExpansion(key, |
+ &value_double); |
+ if (result) |
+ *out = value_double; |
+ else |
+ LOG(ERROR) << "Cannnot get property " << key; |
stevenjb
2012/04/25 01:37:50
WARNING
hashimoto
2012/04/25 15:40:17
Done.
|
+ return result; |
+} |
+ |
+// Gets a base::Time property from dictionary. |
+bool GetTimeProperty(const base::DictionaryValue& dictionary, |
+ const std::string& key, |
+ base::Time* out) { |
+ int64 value_int64 = 0; |
+ if (!GetInt64Property(dictionary, key, &value_int64)) |
+ return false; |
+ *out = base::Time::FromInternalValue(value_int64); |
+ return true; |
+} |
+ |
+// Class to watch data plan update without Libcros. |
+class DataPlanUpdateWatcher : public CrosNetworkWatcher { |
+ public: |
+ explicit DataPlanUpdateWatcher(const DataPlanUpdateWatcherCallback& callback) |
+ : callback_(callback) { |
+ DBusThreadManager::Get()->GetCashewClient()->SetDataPlansUpdateHandler( |
+ base::Bind(&DataPlanUpdateWatcher::OnDataPlansUpdate, |
+ base::Unretained(this))); |
+ } |
+ virtual ~DataPlanUpdateWatcher() { |
+ DBusThreadManager::Get()->GetCashewClient()->ResetDataPlansUpdateHandler(); |
+ } |
+ |
+ private: |
+ void OnDataPlansUpdate(const std::string& service, |
+ const base::ListValue& data_plans) { |
+ CellularDataPlanVector* data_plan_vector = new CellularDataPlanVector; |
+ for (size_t i = 0; i != data_plans.GetSize(); ++i) { |
+ base::DictionaryValue* data_plan = NULL; |
+ if (!data_plans.GetDictionary(i, &data_plan)) { |
+ LOG(ERROR) << "data_plans[" << i << "] is not a dictionary."; |
+ continue; |
+ } |
+ CellularDataPlan* plan = new CellularDataPlan; |
+ // Plan name. |
+ GetStringProperty(*data_plan, cashew::kCellularPlanNameProperty, |
+ &plan->plan_name); |
+ // Plan type. |
+ std::string plan_type_string; |
+ GetStringProperty(*data_plan, cashew::kCellularPlanTypeProperty, |
+ &plan_type_string); |
+ plan->plan_type = ParseCellularDataPlanType(plan_type_string); |
+ // Update time. |
+ GetTimeProperty(*data_plan, cashew::kCellularPlanUpdateTimeProperty, |
+ &plan->update_time); |
+ // Start time. |
+ GetTimeProperty(*data_plan, cashew::kCellularPlanStartProperty, |
+ &plan->plan_start_time); |
+ // End time. |
+ GetTimeProperty(*data_plan, cashew::kCellularPlanEndProperty, |
+ &plan->plan_end_time); |
+ // Data bytes. |
+ GetInt64Property(*data_plan, cashew::kCellularPlanDataBytesProperty, |
+ &plan->plan_data_bytes); |
+ // Bytes used. |
+ GetInt64Property(*data_plan, cashew::kCellularDataBytesUsedProperty, |
+ &plan->data_bytes_used); |
+ data_plan_vector->push_back(plan); |
+ } |
+ callback_.Run(service, data_plan_vector); |
+ } |
+ |
+ DataPlanUpdateWatcherCallback callback_; |
+}; |
+ |
// Class to watch sms with Libcros. |
class CrosSMSWatcher : public CrosNetworkWatcher { |
public: |
@@ -399,7 +500,10 @@ CrosNetworkWatcher* CrosMonitorNetworkDeviceProperties( |
CrosNetworkWatcher* CrosMonitorCellularDataPlan( |
const DataPlanUpdateWatcherCallback& callback) { |
- return new CrosDataPlanUpdateWatcher(callback); |
+ if (g_libcros_network_functions_enabled) |
+ return new CrosDataPlanUpdateWatcher(callback); |
+ else |
+ return new DataPlanUpdateWatcher(callback); |
} |
CrosNetworkWatcher* CrosMonitorSMS(const std::string& modem_device_path, |