1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2012 The Android Open Source Project
3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License");
5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License.
6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at
7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//      http://www.apache.org/licenses/LICENSE-2.0
9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software
11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS,
12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and
14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License.
15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
163bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone
17c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/cellular_service.h"
183bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone
193bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone#include <string>
203bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone
21a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/stringprintf.h>
22289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#if defined(__ANDROID__)
23289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#include <dbus/service_constants.h>
24289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#else
253bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone#include <chromeos/dbus/service_constants.h>
26289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#endif  // __ANDROID__
273bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone
28b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov#include "shill/adaptor_interfaces.h"
29c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/cellular.h"
3030bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood#include "shill/property_accessor.h"
3130bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood#include "shill/store_interface.h"
323bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone
333bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masoneusing std::string;
343bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone
353bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masonenamespace shill {
36c5f56564e1594f218c44e9b77c4c6645cd9239e8Darin Petkov
37c9c31d8497c3f053c2160408cc386010fc125fadRebecca Silbersteinnamespace Logging {
38c9c31d8497c3f053c2160408cc386010fc125fadRebecca Silbersteinstatic auto kModuleLogScope = ScopeLogger::kCellular;
39f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartstatic string ObjectID(CellularService* c) { return c->GetRpcIdentifier(); }
40c9c31d8497c3f053c2160408cc386010fc125fadRebecca Silberstein}
41c9c31d8497c3f053c2160408cc386010fc125fadRebecca Silberstein
42a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal// statics
431582bddf620625f9e6f6c407a707d6a916387df1Christopher Wileyconst char CellularService::kAutoConnActivating[] = "activating";
44d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawalconst char CellularService::kAutoConnBadPPPCredentials[] =
45d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal    "bad PPP credentials";
4619f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chanconst char CellularService::kAutoConnDeviceDisabled[] = "device disabled";
47398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Leconst char CellularService::kAutoConnOutOfCredits[] = "device out of credits";
48398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Leconst char CellularService::kAutoConnOutOfCreditsDetectionInProgress[] =
49398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le    "device detecting out-of-credits";
50a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawalconst char CellularService::kStoragePPPUsername[] = "Cellular.PPP.Username";
51a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawalconst char CellularService::kStoragePPPPassword[] = "Cellular.PPP.Password";
5230bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood
53381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov// TODO(petkov): Add these to system_api/dbus/service_constants.h
54381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkovnamespace {
553ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawalconst char kCellularPPPUsernameProperty[] = "Cellular.PPP.Username";
563ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawalconst char kCellularPPPPasswordProperty[] = "Cellular.PPP.Password";
573ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawal}  // namespace
583ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawal
593ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawalnamespace {
603ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawalconst char kStorageAPN[] = "Cellular.APN";
613ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawalconst char kStorageLastGoodAPN[] = "Cellular.LastGoodAPN";
6219f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan}  // namespace
63381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov
64f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartstatic bool GetNonEmptyField(const Stringmap& stringmap,
65f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                             const string& fieldname,
66f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                             string* value) {
6730bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  Stringmap::const_iterator it = stringmap.find(fieldname);
6830bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  if (it != stringmap.end() && !it->second.empty()) {
6930bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood    *value = it->second;
7030bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood    return true;
7130bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  }
7230bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  return false;
7330bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood}
7430bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood
75f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul StewartCellularService::CellularService(ModemInfo* modem_info,
76f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                                 const CellularRefPtr& device)
770d36b4fb5424a4c6f890e65a62a3b29e26eddb7aPrathmesh Prabhu    : Service(modem_info->control_interface(), modem_info->dispatcher(),
780d36b4fb5424a4c6f890e65a62a3b29e26eddb7aPrathmesh Prabhu              modem_info->metrics(), modem_info->manager(),
793426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le              Technology::kCellular),
80398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le      weak_ptr_factory_(this),
8171f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le      activation_type_(kActivationTypeUnknown),
827cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le      cellular_(device),
83a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan      is_auto_connecting_(false) {
84cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal  SetConnectable(true);
85f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart  PropertyStore* store = this->mutable_store();
8671f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le  HelpRegisterDerivedString(kActivationTypeProperty,
8771f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le                            &CellularService::CalculateActivationType,
88ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan                            nullptr);
897ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan  store->RegisterConstString(kActivationStateProperty, &activation_state_);
907ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan  HelpRegisterDerivedStringmap(kCellularApnProperty,
9130bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood                               &CellularService::GetApn,
9230bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood                               &CellularService::SetApn);
937ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan  store->RegisterConstStringmap(kCellularLastGoodApnProperty,
9427c4aa55b33d3a3836cf70c8f7094bce1c5ead8cChris Masone                                &last_good_apn_info_);
957ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan  store->RegisterConstString(kNetworkTechnologyProperty, &network_technology_);
9643ce4d428d619bda64eea6d37534f02c179a1756Thieu Le  HelpRegisterDerivedBool(kOutOfCreditsProperty,
9743ce4d428d619bda64eea6d37534f02c179a1756Thieu Le                          &CellularService::IsOutOfCredits,
98ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan                          nullptr);
9992df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu  store->RegisterConstStringmap(kPaymentPortalProperty, &olp_);
1007ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan  store->RegisterConstString(kRoamingStateProperty, &roaming_state_);
101ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius  store->RegisterConstStringmap(kServingOperatorProperty, &serving_operator_);
1027ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan  store->RegisterConstString(kUsageURLProperty, &usage_url_);
1033ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawal  store->RegisterString(kCellularPPPUsernameProperty, &ppp_username_);
1043ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawal  store->RegisterWriteOnlyString(kCellularPPPPasswordProperty, &ppp_password_);
105ac635a8fb539fd44f3e24c33872b61fd064c0d60Darin Petkov
10695afcbb30725d13e05934f9489a3a3187f2287cePrathmesh Prabhu  set_friendly_name(cellular_->CreateDefaultFriendlyServiceName());
1077ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan  SetStorageIdentifier(string(kTypeCellular) + "_" +
108401a5b930545f17b8f6a7cc5851896bdbf1beb45Prathmesh Prabhu                       cellular_->address() + "_" + friendly_name());
10943ce4d428d619bda64eea6d37534f02c179a1756Thieu Le  // Assume we are not performing any out-of-credits detection.
11043ce4d428d619bda64eea6d37534f02c179a1756Thieu Le  // The capability can reinitialize with the appropriate type later.
11143ce4d428d619bda64eea6d37534f02c179a1756Thieu Le  InitOutOfCreditsDetection(OutOfCreditsDetector::OOCTypeNone);
1123bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone}
1133bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone
1143bd3c8c33917221d1074f1aa19272e45c0ce2793Chris MasoneCellularService::~CellularService() { }
1153bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone
116f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartbool CellularService::IsAutoConnectable(const char** reason) const {
11719f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan  if (!cellular_->running()) {
11819f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan    *reason = kAutoConnDeviceDisabled;
11919f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan    return false;
12019f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan  }
1211582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley  if (cellular_->IsActivating()) {
1221582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley    *reason = kAutoConnActivating;
1231582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley    return false;
1241582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley  }
125d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal  if (failure() == kFailurePPPAuth) {
126d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal    *reason = kAutoConnBadPPPCredentials;
127d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal    return false;
128d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal  }
12943ce4d428d619bda64eea6d37534f02c179a1756Thieu Le  if (out_of_credits_detector_->IsDetecting()) {
130398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le    *reason = kAutoConnOutOfCreditsDetectionInProgress;
131398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le    return false;
132398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le  }
13343ce4d428d619bda64eea6d37534f02c179a1756Thieu Le  if (out_of_credits_detector_->out_of_credits()) {
134398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le    *reason = kAutoConnOutOfCredits;
135398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le    return false;
136398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le  }
13719f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan  return Service::IsAutoConnectable(reason);
13819f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan}
13919f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan
14071f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Levoid CellularService::HelpRegisterDerivedString(
141f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart    const string& name,
142f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart    string(CellularService::*get)(Error* error),
143f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart    bool(CellularService::*set)(const string& value, Error* error)) {
14471f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le  mutable_store()->RegisterDerivedString(
14571f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le      name,
14671f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le      StringAccessor(
14771f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le          new CustomAccessor<CellularService, string>(this, get, set)));
14871f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le}
14971f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le
15030bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbroodvoid CellularService::HelpRegisterDerivedStringmap(
151f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart    const string& name,
152f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart    Stringmap(CellularService::*get)(Error* error),
153bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    bool(CellularService::*set)(
154f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart        const Stringmap& value, Error* error)) {
15530bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  mutable_store()->RegisterDerivedStringmap(
15630bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood      name,
15730bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood      StringmapAccessor(
15830bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood          new CustomAccessor<CellularService, Stringmap>(this, get, set)));
15930bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood}
16030bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood
16143ce4d428d619bda64eea6d37534f02c179a1756Thieu Levoid CellularService::HelpRegisterDerivedBool(
162f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart    const string& name,
163f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart    bool(CellularService::*get)(Error* error),
164f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart    bool(CellularService::*set)(const bool&, Error*)) {
16543ce4d428d619bda64eea6d37534f02c179a1756Thieu Le  mutable_store()->RegisterDerivedBool(
16643ce4d428d619bda64eea6d37534f02c179a1756Thieu Le    name,
16743ce4d428d619bda64eea6d37534f02c179a1756Thieu Le    BoolAccessor(new CustomAccessor<CellularService, bool>(this, get, set)));
16843ce4d428d619bda64eea6d37534f02c179a1756Thieu Le}
16943ce4d428d619bda64eea6d37534f02c179a1756Thieu Le
170f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul StewartStringmap* CellularService::GetUserSpecifiedApn() {
1717ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan  Stringmap::iterator it = apn_info_.find(kApnProperty);
17230bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  if (it == apn_info_.end() || it->second.empty())
173ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan    return nullptr;
17430bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  return &apn_info_;
17530bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood}
17630bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood
177f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul StewartStringmap* CellularService::GetLastGoodApn() {
1786db7b24348e69639e19cd6c408388b10d6ee54fePaul Stewart  Stringmap::iterator it = last_good_apn_info_.find(kApnProperty);
17930bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  if (it == last_good_apn_info_.end() || it->second.empty())
180ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan    return nullptr;
18130bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  return &last_good_apn_info_;
18230bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood}
18330bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood
184f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartstring CellularService::CalculateActivationType(Error* error) {
18571f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le  return GetActivationTypeString();
18671f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le}
18771f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le
188f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul StewartStringmap CellularService::GetApn(Error* /*error*/) {
18930bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  return apn_info_;
19030bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood}
19130bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood
192f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartbool CellularService::SetApn(const Stringmap& value, Error* error) {
19330bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  // Only copy in the fields we care about, and validate the contents.
194c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  // If the "apn" field is missing or empty, the APN is cleared.
19530bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  string str;
196bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  Stringmap new_apn_info;
1977ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan  if (GetNonEmptyField(value, kApnProperty, &str)) {
1987ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan    new_apn_info[kApnProperty] = str;
1997ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan    if (GetNonEmptyField(value, kApnUsernameProperty, &str))
2007ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan      new_apn_info[kApnUsernameProperty] = str;
2017ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan    if (GetNonEmptyField(value, kApnPasswordProperty, &str))
2027ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan      new_apn_info[kApnPasswordProperty] = str;
203bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
204bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  if (apn_info_ == new_apn_info) {
205bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return false;
206bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
207bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  apn_info_ = new_apn_info;
2087ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan  if (ContainsKey(apn_info_, kApnProperty)) {
209c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood    // Clear the last good APN, otherwise the one the user just
210c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood    // set won't be used, since LastGoodApn comes first in the
211c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood    // search order when trying to connect. Only do this if a
212c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood    // non-empty user APN has been supplied. If the user APN is
213c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood    // being cleared, leave LastGoodApn alone.
214c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood    ClearLastGoodApn();
21530bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  }
2167ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan  adaptor()->EmitStringmapChanged(kCellularApnProperty, apn_info_);
217bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  return true;
21830bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood}
21930bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood
220f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::SetLastGoodApn(const Stringmap& apn_info) {
22130bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  last_good_apn_info_ = apn_info;
2227ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan  adaptor()->EmitStringmapChanged(kCellularLastGoodApnProperty,
22330bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood                                  last_good_apn_info_);
22430bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood}
22530bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood
22630bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbroodvoid CellularService::ClearLastGoodApn() {
22730bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  last_good_apn_info_.clear();
2287ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan  adaptor()->EmitStringmapChanged(kCellularLastGoodApnProperty,
22930bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood                                  last_good_apn_info_);
23030bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood}
23130bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood
23299dc56dd45ec8429c3de57365658540820ceb000Thieu Levoid CellularService::OnAfterResume() {
23399dc56dd45ec8429c3de57365658540820ceb000Thieu Le  Service::OnAfterResume();
23499dc56dd45ec8429c3de57365658540820ceb000Thieu Le  resume_start_time_ = base::Time::Now();
23599dc56dd45ec8429c3de57365658540820ceb000Thieu Le}
23699dc56dd45ec8429c3de57365658540820ceb000Thieu Le
23743ce4d428d619bda64eea6d37534f02c179a1756Thieu Levoid CellularService::InitOutOfCreditsDetection(
23843ce4d428d619bda64eea6d37534f02c179a1756Thieu Le    OutOfCreditsDetector::OOCType ooc_type) {
23943ce4d428d619bda64eea6d37534f02c179a1756Thieu Le  out_of_credits_detector_.reset(
24043ce4d428d619bda64eea6d37534f02c179a1756Thieu Le      OutOfCreditsDetector::CreateDetector(ooc_type,
24143ce4d428d619bda64eea6d37534f02c179a1756Thieu Le                                           dispatcher(),
24243ce4d428d619bda64eea6d37534f02c179a1756Thieu Le                                           manager(),
24343ce4d428d619bda64eea6d37534f02c179a1756Thieu Le                                           metrics(),
24443ce4d428d619bda64eea6d37534f02c179a1756Thieu Le                                           this));
24543ce4d428d619bda64eea6d37534f02c179a1756Thieu Le}
24643ce4d428d619bda64eea6d37534f02c179a1756Thieu Le
247f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartbool CellularService::Load(StoreInterface* storage) {
24830bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  // Load properties common to all Services.
24930bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  if (!Service::Load(storage))
25030bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood    return false;
25130bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood
25230bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  const string id = GetStorageIdentifier();
25330bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  LoadApn(storage, id, kStorageAPN, &apn_info_);
25430bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  LoadApn(storage, id, kStorageLastGoodAPN, &last_good_apn_info_);
255a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal
256a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal  const string old_username = ppp_username_;
257a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal  const string old_password = ppp_password_;
2583ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawal  storage->GetString(id, kStoragePPPUsername, &ppp_username_);
2593ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawal  storage->GetString(id, kStoragePPPPassword, &ppp_password_);
260a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal  if (IsFailed() && failure() == kFailurePPPAuth &&
261a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal      (old_username != ppp_username_ || old_password != ppp_password_)) {
262a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal    SetState(kStateIdle);
263a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal  }
26430bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  return true;
26530bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood}
26630bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood
267f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::LoadApn(StoreInterface* storage,
268f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                              const string& storage_group,
269f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                              const string& keytag,
270f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                              Stringmap* apn_info) {
2717ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan  if (!LoadApnField(storage, storage_group, keytag, kApnProperty, apn_info))
27230bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood    return;
2737ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan  LoadApnField(storage, storage_group, keytag, kApnUsernameProperty, apn_info);
2747ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan  LoadApnField(storage, storage_group, keytag, kApnPasswordProperty, apn_info);
27530bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood}
27630bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood
277f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartbool CellularService::LoadApnField(StoreInterface* storage,
278f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                                   const string& storage_group,
279f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                                   const string& keytag,
280f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                                   const string& apntag,
281f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                                   Stringmap* apn_info) {
28230bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  string value;
28330bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  if (storage->GetString(storage_group, keytag + "." + apntag, &value) &&
28430bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood      !value.empty()) {
28530bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood    (*apn_info)[apntag] = value;
28630bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood    return true;
28730bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  }
28830bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  return false;
28930bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood}
29030bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood
291f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartbool CellularService::Save(StoreInterface* storage) {
29230bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  // Save properties common to all Services.
29330bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  if (!Service::Save(storage))
29430bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood    return false;
29530bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood
29630bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  const string id = GetStorageIdentifier();
29730bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  SaveApn(storage, id, GetUserSpecifiedApn(), kStorageAPN);
29830bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  SaveApn(storage, id, GetLastGoodApn(), kStorageLastGoodAPN);
2993ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawal  SaveString(storage, id, kStoragePPPUsername, ppp_username_, false, true);
3003ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawal  SaveString(storage, id, kStoragePPPPassword, ppp_password_, false, true);
30130bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  return true;
30230bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood}
30330bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood
304f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::SaveApn(StoreInterface* storage,
305f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                              const string& storage_group,
306f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                              const Stringmap* apn_info,
307f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                              const string& keytag) {
3087ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan  SaveApnField(storage, storage_group, apn_info, keytag, kApnProperty);
3097ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan  SaveApnField(storage, storage_group, apn_info, keytag, kApnUsernameProperty);
3107ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan  SaveApnField(storage, storage_group, apn_info, keytag, kApnPasswordProperty);
31130bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood}
31230bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood
313f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::SaveApnField(StoreInterface* storage,
314f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                                   const string& storage_group,
315f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                                   const Stringmap* apn_info,
316f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                                   const string& keytag,
317f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                                   const string& apntag) {
31830bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  const string key = keytag + "." + apntag;
31930bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  string str;
32030bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  if (apn_info && GetNonEmptyField(*apn_info, apntag, &str))
32130bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood    storage->SetString(storage_group, key, str);
32230bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood  else
32330bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood    storage->DeleteKey(storage_group, key);
32430bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood}
32530bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood
326f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartbool CellularService::IsOutOfCredits(Error* /*error*/) {
32743ce4d428d619bda64eea6d37534f02c179a1756Thieu Le  return out_of_credits_detector_->out_of_credits();
32843ce4d428d619bda64eea6d37534f02c179a1756Thieu Le}
32943ce4d428d619bda64eea6d37534f02c179a1756Thieu Le
33043ce4d428d619bda64eea6d37534f02c179a1756Thieu Levoid CellularService::set_out_of_credits_detector(
331f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart    OutOfCreditsDetector* detector) {
33243ce4d428d619bda64eea6d37534f02c179a1756Thieu Le  out_of_credits_detector_.reset(detector);
33343ce4d428d619bda64eea6d37534f02c179a1756Thieu Le}
33443ce4d428d619bda64eea6d37534f02c179a1756Thieu Le
33543ce4d428d619bda64eea6d37534f02c179a1756Thieu Levoid CellularService::SignalOutOfCreditsChanged(bool state) const {
33643ce4d428d619bda64eea6d37534f02c179a1756Thieu Le  adaptor()->EmitBoolChanged(kOutOfCreditsProperty, state);
33743ce4d428d619bda64eea6d37534f02c179a1756Thieu Le}
33843ce4d428d619bda64eea6d37534f02c179a1756Thieu Le
3397cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Levoid CellularService::AutoConnect() {
3407cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le  is_auto_connecting_ = true;
3417cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le  Service::AutoConnect();
3427cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le  is_auto_connecting_ = false;
3437cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le}
3447cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le
345f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::Connect(Error* error, const char* reason) {
346dc7b8447aa220fae51b73fd8610cbfed14ed57fcmukesh agrawal  Service::Connect(error, reason);
3474d6d941563c2c394e5e650d7ee2d24183fff87b3Darin Petkov  cellular_->Connect(error);
348398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le  if (error->IsFailure())
34943ce4d428d619bda64eea6d37534f02c179a1756Thieu Le    out_of_credits_detector_->ResetDetector();
350c5f56564e1594f218c44e9b77c4c6645cd9239e8Darin Petkov}
3513bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone
352f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::Disconnect(Error* error, const char* reason) {
3530d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  Service::Disconnect(error, reason);
3540d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  cellular_->Disconnect(error, reason);
355fb0625ef0cfd0ad36439138c04fec5ea963132d7Darin Petkov}
356fb0625ef0cfd0ad36439138c04fec5ea963132d7Darin Petkov
357f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::ActivateCellularModem(const string& carrier,
358f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                                            Error* error,
359f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                                            const ResultCallback& callback) {
3609a24553461df7036755060423f90804011612249Eric Shienbrood  cellular_->Activate(carrier, error, callback);
361c408e69059dc709408c1a51f4b757424d08b15f5Darin Petkov}
362c408e69059dc709408c1a51f4b757424d08b15f5Darin Petkov
363f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::CompleteCellularActivation(Error* error) {
364c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray  cellular_->CompleteActivation(error);
365c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray}
366c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray
367398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Levoid CellularService::SetState(ConnectState new_state) {
36843ce4d428d619bda64eea6d37534f02c179a1756Thieu Le  out_of_credits_detector_->NotifyServiceStateChanged(state(), new_state);
369398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le  Service::SetState(new_state);
370398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le}
371398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le
372f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::SetStorageIdentifier(const string& identifier) {
373c9c31d8497c3f053c2160408cc386010fc125fadRebecca Silberstein  SLOG(this, 3) << __func__ << ": " << identifier;
374313324136473f9120b1e485a408f51ae938dcb64Darin Petkov  storage_identifier_ = identifier;
375313324136473f9120b1e485a408f51ae938dcb64Darin Petkov  std::replace_if(storage_identifier_.begin(),
376313324136473f9120b1e485a408f51ae938dcb64Darin Petkov                  storage_identifier_.end(),
377313324136473f9120b1e485a408f51ae938dcb64Darin Petkov                  &Service::IllegalChar, '_');
378313324136473f9120b1e485a408f51ae938dcb64Darin Petkov}
379313324136473f9120b1e485a408f51ae938dcb64Darin Petkov
3806515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masonestring CellularService::GetStorageIdentifier() const {
381313324136473f9120b1e485a408f51ae938dcb64Darin Petkov  return storage_identifier_;
38234af218abe6a99144ffe01332ce36fbad94f2628Chris Masone}
38334af218abe6a99144ffe01332ce36fbad94f2628Chris Masone
384f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartstring CellularService::GetDeviceRpcId(Error* /*error*/) const {
38595207da4b896bd0a4186163f6f9ebda044a5a7b9Chris Masone  return cellular_->GetRpcIdentifier();
38695207da4b896bd0a4186163f6f9ebda044a5a7b9Chris Masone}
38795207da4b896bd0a4186163f6f9ebda044a5a7b9Chris Masone
38871f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Levoid CellularService::SetActivationType(ActivationType type) {
38971f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le  if (type == activation_type_) {
39071f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le    return;
39171f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le  }
39271f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le  activation_type_ = type;
39371f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le  adaptor()->EmitStringChanged(kActivationTypeProperty,
39471f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le                               GetActivationTypeString());
39571f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le}
39671f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le
39771f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Lestring CellularService::GetActivationTypeString() const {
39871f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le  switch (activation_type_) {
39971f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le    case kActivationTypeNonCellular:
40071f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le      return shill::kActivationTypeNonCellular;
40171f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le    case kActivationTypeOMADM:
40271f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le      return shill::kActivationTypeOMADM;
40371f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le    case kActivationTypeOTA:
40471f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le      return shill::kActivationTypeOTA;
40571f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le    case kActivationTypeOTASP:
40671f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le      return shill::kActivationTypeOTASP;
40771f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le    case kActivationTypeUnknown:
40871f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le      return "";
40971f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le    default:
41071f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le      NOTREACHED();
41171f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le      return "";  // Make compiler happy.
41271f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le  }
41371f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le}
41471f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le
415f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::SetActivationState(const string& state) {
416b9c9933d529e34ce784d4f322d9596cbd9e6ba1cDarin Petkov  if (state == activation_state_) {
417b9c9933d529e34ce784d4f322d9596cbd9e6ba1cDarin Petkov    return;
418b9c9933d529e34ce784d4f322d9596cbd9e6ba1cDarin Petkov  }
419b9c9933d529e34ce784d4f322d9596cbd9e6ba1cDarin Petkov  activation_state_ = state;
4207ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan  adaptor()->EmitStringChanged(kActivationStateProperty, state);
4217ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan  SetConnectableFull(state != kActivationStateNotActivated);
422b9c9933d529e34ce784d4f322d9596cbd9e6ba1cDarin Petkov}
423b9c9933d529e34ce784d4f322d9596cbd9e6ba1cDarin Petkov
424f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::SetOLP(const string& url,
425f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                             const string& method,
426f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                             const string& post_data) {
42792df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu  Stringmap olp;
42892df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu  olp[kPaymentPortalURL] = url;
42992df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu  olp[kPaymentPortalMethod] = method;
43092df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu  olp[kPaymentPortalPostData] = post_data;
43192df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu
43292df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu  if (olp_ == olp) {
433381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov    return;
434381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov  }
43592df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu  olp_ = olp;
43692df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu  adaptor()->EmitStringmapChanged(kPaymentPortalProperty, olp);
437381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov}
438381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov
439f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::SetUsageURL(const string& url) {
440381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov  if (url == usage_url_) {
441381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov    return;
442381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov  }
443381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov  usage_url_ = url;
4447ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan  adaptor()->EmitStringChanged(kUsageURLProperty, url);
445381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov}
446381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov
447f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::SetNetworkTechnology(const string& technology) {
448b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov  if (technology == network_technology_) {
449b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov    return;
450b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov  }
451b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov  network_technology_ = technology;
4527ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan  adaptor()->EmitStringChanged(kNetworkTechnologyProperty,
453b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov                               technology);
454b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov}
455b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov
456f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::SetRoamingState(const string& state) {
457b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov  if (state == roaming_state_) {
458b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov    return;
459b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov  }
460b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov  roaming_state_ = state;
4617ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan  adaptor()->EmitStringChanged(kRoamingStateProperty, state);
462b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov}
463b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov
464f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::set_serving_operator(const Stringmap& serving_operator) {
465ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius  if (serving_operator_ == serving_operator)
4669cb026860ded74991fa26700e07389c9d9e3c841Darin Petkov    return;
467ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius
468ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius  serving_operator_ = serving_operator;
469ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius  adaptor()->EmitStringmapChanged(kServingOperatorProperty, serving_operator_);
4703335b3773067671301a8a02a1f9eefd17a3ce607Darin Petkov}
4713335b3773067671301a8a02a1f9eefd17a3ce607Darin Petkov
4723bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone}  // namespace shill
473