shill: Propagate Cellular Activate call errors to the DBus caller.

BUG=chromium-os:19547
TEST=unit tests

Change-Id: I2a0f889f0863c299c3f3ac006a6df5a608407881
Reviewed-on: http://gerrit.chromium.org/gerrit/6616
Reviewed-by: Darin Petkov <petkov@chromium.org>
Tested-by: Darin Petkov <petkov@chromium.org>
diff --git a/cellular.cc b/cellular.cc
index 20cf129..0a2ea86 100644
--- a/cellular.cc
+++ b/cellular.cc
@@ -632,8 +632,22 @@
   }
 }
 
-void Cellular::Activate(const string &carrier) {
-  CHECK_EQ(kTypeCDMA, type_);
+void Cellular::Activate(const string &carrier, Error *error) {
+  if (type_ != kTypeCDMA) {
+    const string kMessage = "Unable to activate non-CDMA modem.";
+    LOG(ERROR) << kMessage;
+    CHECK(error);
+    error->Populate(Error::kInvalidArguments, kMessage);
+    return;
+  }
+  if (state_ != kStateEnabled &&
+      state_ != kStateRegistered) {
+    const string kMessage = "Unable to activate in " + GetStateString(state_);
+    LOG(ERROR) << kMessage;
+    CHECK(error);
+    error->Populate(Error::kInvalidArguments, kMessage);
+    return;
+  }
   // Defer connect because we may be in a dbus-c++ callback.
   dispatcher_->PostTask(
       task_factory_.NewRunnableMethod(&Cellular::ActivateTask, carrier));
@@ -641,7 +655,8 @@
 
 void Cellular::ActivateTask(const string &carrier) {
   VLOG(2) << __func__ << "(" << carrier << ")";
-  if (state_ != kStateEnabled && state_ != kStateRegistered) {
+  if (state_ != kStateEnabled &&
+      state_ != kStateRegistered) {
     LOG(ERROR) << "Unable to activate in " << GetStateString(state_);
     return;
   }