shill: cellular: Support Cellular.ProviderRequiresRoaming property.

BUG=chromium-os:32872
TEST=unit test, tested on device through list-devices and different SIMs.
CQ-DEPEND=I0df0b718bdecc7225fff7e67589ac5d31d593d1b

Change-Id: Idc957e3deb94ad8fcd511c933cc2bb0fbe4f31d1
Reviewed-on: https://gerrit.chromium.org/gerrit/33774
Tested-by: Darin Petkov <petkov@chromium.org>
Reviewed-by: Ben Chan <benchan@chromium.org>
Commit-Ready: Darin Petkov <petkov@chromium.org>
diff --git a/cellular_capability_gsm.cc b/cellular_capability_gsm.cc
index d045269..e7b887b 100644
--- a/cellular_capability_gsm.cc
+++ b/cellular_capability_gsm.cc
@@ -57,6 +57,7 @@
       registration_state_(MM_MODEM_GSM_NETWORK_REG_STATUS_UNKNOWN),
       access_technology_(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN),
       home_provider_(NULL),
+      provider_requires_roaming_(false),
       get_imsi_retries_(0),
       get_imsi_retry_delay_milliseconds_(kGetIMSIRetryDelayMilliseconds),
       scanning_(false),
@@ -67,6 +68,8 @@
                              &selected_network_);
   store->RegisterConstStringmaps(flimflam::kFoundNetworksProperty,
                                  &found_networks_);
+  store->RegisterConstBool(shill::kProviderRequiresRoamingProperty,
+                           &provider_requires_roaming_);
   store->RegisterConstBool(flimflam::kScanningProperty, &scanning_);
   store->RegisterUint16(flimflam::kScanIntervalProperty, &scan_interval_);
   HelpRegisterDerivedKeyValueStore(
@@ -330,9 +333,7 @@
 }
 
 bool CellularCapabilityGSM::AllowRoaming() {
-  bool requires_roaming =
-      home_provider_ ? home_provider_->requires_roaming : false;
-  return requires_roaming || allow_roaming_property();
+  return provider_requires_roaming_ || allow_roaming_property();
 }
 
 // always called from an async context
@@ -481,6 +482,7 @@
     return;
   }
   home_provider_ = provider;
+  provider_requires_roaming_ = home_provider_->requires_roaming;
   Cellular::Operator oper;
   if (provider->networks && provider->networks[0]) {
     oper.SetCode(provider->networks[0]);
@@ -498,7 +500,8 @@
   }
   cellular()->set_home_provider(oper);
   SLOG(Cellular, 2) << "Home provider: " << oper.GetCode() << ", "
-                    << oper.GetName() << ", " << oper.GetCountry();
+                    << oper.GetName() << ", " << oper.GetCountry()
+                    << (provider_requires_roaming_ ? ", roaming required" : "");
   InitAPNList();
 }