shill: Move CDMA activation to capability delegates.

BUG=chromium-os:18735
TEST=unit tests

Change-Id: If69af7576c939eed8397797de3a2a88f7fd079e6
Reviewed-on: https://gerrit.chromium.org/gerrit/11632
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 ba20d94..4cef643 100644
--- a/cellular_capability_cdma.cc
+++ b/cellular_capability_cdma.cc
@@ -16,7 +16,8 @@
 namespace shill {
 
 CellularCapabilityCDMA::CellularCapabilityCDMA(Cellular *cellular)
-    : CellularCapability(cellular) {}
+    : CellularCapability(cellular),
+      task_factory_(this) {}
 
 void CellularCapabilityCDMA::InitProxies() {
   VLOG(2) << __func__;
@@ -27,6 +28,38 @@
                                             cellular()->dbus_owner()));
 }
 
+void CellularCapabilityCDMA::Activate(const string &carrier, Error *error) {
+  VLOG(2) << __func__ << "(" << carrier << ")";
+  if (cellular()->state() != Cellular::kStateEnabled &&
+      cellular()->state() != Cellular::kStateRegistered) {
+    Error::PopulateAndLog(error, Error::kInvalidArguments,
+                          "Unable to activate in " +
+                          Cellular::GetStateString(cellular()->state()));
+    return;
+  }
+  // Defer because we may be in a dbus-c++ callback.
+  dispatcher()->PostTask(
+      task_factory_.NewRunnableMethod(
+          &CellularCapabilityCDMA::ActivateTask, carrier));
+}
+
+void CellularCapabilityCDMA::ActivateTask(const string &carrier) {
+  VLOG(2) << __func__ << "(" << carrier << ")";
+  if (cellular()->state() != Cellular::kStateEnabled &&
+      cellular()->state() != Cellular::kStateRegistered) {
+    LOG(ERROR) << "Unable to activate in "
+               << Cellular::GetStateString(cellular()->state());
+    return;
+  }
+  // TODO(petkov): Switch to asynchronous calls (crosbug.com/17583).
+  uint32 status = cellular()->modem_cdma_proxy()->Activate(carrier);
+  if (status == MM_MODEM_CDMA_ACTIVATION_ERROR_NO_ERROR) {
+    cellular()->set_cdma_activation_state(
+        MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATING);
+  }
+  cellular()->HandleNewCDMAActivationState(status);
+}
+
 void CellularCapabilityCDMA::GetIdentifiers() {
   VLOG(2) << __func__;
   if (cellular()->meid().empty()) {