shill: Move cellular network registration to capability delegates.

Refactor only, no functional changes. This change also allowed transferring
ownership of the remaining technology-specific proxies (Gsm.Network and Cdma) to
the respective capability delegates.

BUG=chromium-os:18735
TEST=unit tests

Change-Id: I8851cb29b0411168be55d13a2fdc2a2825ce8567
Reviewed-on: https://gerrit.chromium.org/gerrit/11696
Tested-by: Darin Petkov <petkov@chromium.org>
Reviewed-by: Jason Glasgow <jglasgow@chromium.org>
Commit-Ready: Darin Petkov <petkov@chromium.org>
diff --git a/cellular_capability_cdma.cc b/cellular_capability_cdma.cc
index 4cef643..5ff5a02 100644
--- a/cellular_capability_cdma.cc
+++ b/cellular_capability_cdma.cc
@@ -9,6 +9,7 @@
 #include <mm/mm-modem.h>
 
 #include "shill/cellular.h"
+#include "shill/cellular_service.h"
 #include "shill/proxy_factory.h"
 
 using std::string;
@@ -17,15 +18,14 @@
 
 CellularCapabilityCDMA::CellularCapabilityCDMA(Cellular *cellular)
     : CellularCapability(cellular),
-      task_factory_(this) {}
+      task_factory_(this),
+      registration_state_evdo_(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN),
+      registration_state_1x_(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN) {}
 
 void CellularCapabilityCDMA::InitProxies() {
   VLOG(2) << __func__;
-  // TODO(petkov): Move CDMA-specific proxy ownership from Cellular to this.
-  cellular()->set_modem_cdma_proxy(
-      proxy_factory()->CreateModemCDMAProxy(cellular(),
-                                            cellular()->dbus_path(),
-                                            cellular()->dbus_owner()));
+  proxy_.reset(proxy_factory()->CreateModemCDMAProxy(
+      this, cellular()->dbus_path(), cellular()->dbus_owner()));
 }
 
 void CellularCapabilityCDMA::Activate(const string &carrier, Error *error) {
@@ -52,7 +52,7 @@
     return;
   }
   // TODO(petkov): Switch to asynchronous calls (crosbug.com/17583).
-  uint32 status = cellular()->modem_cdma_proxy()->Activate(carrier);
+  uint32 status = proxy_->Activate(carrier);
   if (status == MM_MODEM_CDMA_ACTIVATION_ERROR_NO_ERROR) {
     cellular()->set_cdma_activation_state(
         MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATING);
@@ -64,27 +64,30 @@
   VLOG(2) << __func__;
   if (cellular()->meid().empty()) {
     // TODO(petkov): Switch to asynchronous calls (crosbug.com/17583).
-    cellular()->set_meid(cellular()->modem_cdma_proxy()->MEID());
+    cellular()->set_meid(proxy_->MEID());
     VLOG(2) << "MEID: " << cellular()->imei();
   }
 }
 
+void CellularCapabilityCDMA::GetProperties() {
+  VLOG(2) << __func__;
+  // No properties.
+}
+
 string CellularCapabilityCDMA::GetNetworkTechnologyString() const {
-  if (cellular()->cdma_registration_state_evdo() !=
-      MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN) {
+  if (registration_state_evdo_ != MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN) {
     return flimflam::kNetworkTechnologyEvdo;
   }
-  if (cellular()->cdma_registration_state_1x() !=
-      MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN) {
+  if (registration_state_1x_ != MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN) {
     return flimflam::kNetworkTechnology1Xrtt;
   }
   return "";
 }
 
 string CellularCapabilityCDMA::GetRoamingStateString() const {
-  uint32 state = cellular()->cdma_registration_state_evdo();
+  uint32 state = registration_state_evdo_;
   if (state == MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN) {
-    state = cellular()->cdma_registration_state_1x();
+    state = registration_state_1x_;
   }
   switch (state) {
     case MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN:
@@ -103,7 +106,53 @@
 void CellularCapabilityCDMA::GetSignalQuality() {
   VLOG(2) << __func__;
   // TODO(petkov): Switch to asynchronous calls (crosbug.com/17583).
-  uint32 strength = cellular()->modem_cdma_proxy()->GetSignalQuality();
+  uint32 strength = proxy_->GetSignalQuality();
+  cellular()->HandleNewSignalQuality(strength);
+}
+
+void CellularCapabilityCDMA::GetRegistrationState() {
+  VLOG(2) << __func__;
+  // TODO(petkov): Switch to asynchronous calls (crosbug.com/17583).
+  proxy_->GetRegistrationState(
+      &registration_state_1x_, &registration_state_evdo_);
+  VLOG(2) << "CDMA Registration: 1x(" << registration_state_1x_
+          << ") EVDO(" << registration_state_evdo_ << ")";
+  cellular()->HandleNewRegistrationState();
+}
+
+void CellularCapabilityCDMA::OnCDMAActivationStateChanged(
+    uint32 activation_state,
+    uint32 activation_error,
+    const DBusPropertiesMap &status_changes) {
+  VLOG(2) << __func__;
+  string mdn;
+  if (DBusProperties::GetString(status_changes, "mdn", &mdn)) {
+    cellular()->set_mdn(mdn);
+  }
+  string min;
+  if (DBusProperties::GetString(status_changes, "min", &min)) {
+    cellular()->set_min(min);
+  }
+  string payment_url;
+  if (DBusProperties::GetString(status_changes, "payment_url", &payment_url)) {
+    cellular()->set_cdma_payment_url(payment_url);
+    if (cellular()->service().get()) {
+      cellular()->service()->set_payment_url(payment_url);
+    }
+  }
+  cellular()->set_cdma_activation_state(activation_state);
+  cellular()->HandleNewCDMAActivationState(activation_error);
+}
+
+void CellularCapabilityCDMA::OnCDMARegistrationStateChanged(
+    uint32 state_1x, uint32 state_evdo) {
+  VLOG(2) << __func__;
+  registration_state_1x_ = state_1x;
+  registration_state_evdo_ = state_evdo;
+  cellular()->HandleNewRegistrationState();
+}
+
+void CellularCapabilityCDMA::OnCDMASignalQualityChanged(uint32 strength) {
   cellular()->HandleNewSignalQuality(strength);
 }